From de5ba556da80b0debe06e9e247fd48addde7ebd9 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 14 Nov 2023 10:16:55 +0200 Subject: [PATCH 01/44] rm unused prom receiver from example --- .gitignore | 1 + config/example-config.yaml | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 940c3e9..7a512b4 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ .vscode .DS_Store .idea +otel-collector diff --git a/config/example-config.yaml b/config/example-config.yaml index 0a05080..ee5cfb1 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -1,7 +1,6 @@ receivers: fluentforward: endpoint: 0.0.0.0:24224 - prometheus: otlp: protocols: grpc: @@ -10,7 +9,6 @@ receivers: protocols: grpc: endpoint: 'localhost:12345' - processors: batch: send_batch_size: 1000 @@ -66,14 +64,12 @@ exporters: endpoint: localhost:4317 tls: insecure: true - extensions: health_check: pprof: zpages: memory_ballast: size_mib: 1000 - service: extensions: [pprof, zpages, health_check] pipelines: @@ -97,4 +93,3 @@ service: processors: [memory_limiter, resourcedetection/system, metricstransform, batch] exporters: [qryn] - From 459ae05af0e0963a5cdb088f356f3092ea42ddcb Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sat, 25 Nov 2023 22:28:13 +0200 Subject: [PATCH 02/44] wip: add initial jfr-parser-less receiver --- cmd/otel-collector/components.go | 2 + config/example-config.yaml | 6 +- go.mod | 5 +- go.sum | 1 + receiver/pyroscopereceiver/README.md | 19 ++ receiver/pyroscopereceiver/compress.go | 88 +++++++ receiver/pyroscopereceiver/config.go | 28 +++ receiver/pyroscopereceiver/factory.go | 44 ++++ receiver/pyroscopereceiver/receiver.go | 216 ++++++++++++++++++ receiver/pyroscopereceiver/receiver_test.go | 183 +++++++++++++++ .../pyroscopereceiver/testdata/profile.jfr | Bin 0 -> 11008 bytes 11 files changed, 589 insertions(+), 3 deletions(-) create mode 100644 receiver/pyroscopereceiver/README.md create mode 100644 receiver/pyroscopereceiver/compress.go create mode 100644 receiver/pyroscopereceiver/config.go create mode 100644 receiver/pyroscopereceiver/factory.go create mode 100644 receiver/pyroscopereceiver/receiver.go create mode 100644 receiver/pyroscopereceiver/receiver_test.go create mode 100644 receiver/pyroscopereceiver/testdata/profile.jfr diff --git a/cmd/otel-collector/components.go b/cmd/otel-collector/components.go index 345aeb9..5969204 100644 --- a/cmd/otel-collector/components.go +++ b/cmd/otel-collector/components.go @@ -127,6 +127,7 @@ import ( "go.uber.org/multierr" "github.com/metrico/otel-collector/exporter/qrynexporter" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver" ) func components() (otelcol.Factories, error) { @@ -222,6 +223,7 @@ func components() (otelcol.Factories, error) { zipkinreceiver.NewFactory(), zookeeperreceiver.NewFactory(), lokireceiver.NewFactory(), + pyroscopereceiver.NewFactory(), } for _, rcv := range factories.Receivers { receivers = append(receivers, rcv) diff --git a/config/example-config.yaml b/config/example-config.yaml index ee5cfb1..22d0551 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -9,6 +9,7 @@ receivers: protocols: grpc: endpoint: 'localhost:12345' + pyroscopereceiver: processors: batch: send_batch_size: 1000 @@ -71,10 +72,13 @@ extensions: memory_ballast: size_mib: 1000 service: + # telemetry: + # logs: + # level: "debug" extensions: [pprof, zpages, health_check] pipelines: logs: - receivers: [fluentforward, otlp] + receivers: [fluentforward, otlp, pyroscopereceiver] processors: [memory_limiter, resourcedetection/system, batch] exporters: [qryn] traces: diff --git a/go.mod b/go.mod index b23b180..e44d0d3 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/healthcheckextension v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/extension/pprofextension v0.87.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/attributesprocessor v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/cumulativetodeltaprocessor v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatorateprocessor v0.87.0 @@ -128,7 +129,9 @@ require ( github.com/prometheus/prometheus v0.47.1 github.com/stretchr/testify v1.8.4 go.opentelemetry.io/collector/component v0.87.0 + go.opentelemetry.io/collector/config/confighttp v0.87.0 go.opentelemetry.io/collector/confmap v0.87.0 + go.opentelemetry.io/collector/consumer v0.87.0 go.opentelemetry.io/collector/exporter v0.87.0 go.opentelemetry.io/collector/exporter/loggingexporter v0.87.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.87.0 @@ -481,14 +484,12 @@ require ( go.opentelemetry.io/collector/config/configauth v0.87.0 // indirect go.opentelemetry.io/collector/config/configcompression v0.87.0 // indirect go.opentelemetry.io/collector/config/configgrpc v0.87.0 // indirect - go.opentelemetry.io/collector/config/confighttp v0.87.0 // indirect go.opentelemetry.io/collector/config/confignet v0.87.0 // indirect go.opentelemetry.io/collector/config/configopaque v0.87.0 // indirect go.opentelemetry.io/collector/config/configtelemetry v0.87.0 // indirect go.opentelemetry.io/collector/config/configtls v0.87.0 // indirect go.opentelemetry.io/collector/config/internal v0.87.0 // indirect go.opentelemetry.io/collector/connector v0.87.0 // indirect - go.opentelemetry.io/collector/consumer v0.87.0 // indirect go.opentelemetry.io/collector/extension/auth v0.87.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0-rcv0016 // indirect go.opentelemetry.io/collector/service v0.87.0 // indirect diff --git a/go.sum b/go.sum index 8601275..e188952 100644 --- a/go.sum +++ b/go.sum @@ -1035,6 +1035,7 @@ github.com/open-telemetry/opentelemetry-collector-contrib/pkg/experimentalmetric github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.87.0 h1:jtdLqdRyt29EUd6H6p431/XmGHwS6BHB5s/EqCfEWoc= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.87.0/go.mod h1:JUVS9CCWJyXSJn8cTmS2Dq3vC3jlhJozjg3SZdZ/4OY= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.87.0 h1:9RtkoPmUPRW1NrOawEiWsxOZ/dBlym5DzhLXjRpM9tM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.87.0/go.mod h1:xvO0/6zTw6UBl7g4hZpvapfvANNSnj6sQcSnF6jqSSg= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.87.0 h1:zA50pvJziZjWQiN9MZIkT6Ii3hMSaCKa6jvs1vCYT5g= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.87.0/go.mod h1:IjdtiiTTNlAkspcNyAjHysWAZs5U48alWGUodTkkxhI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.87.0 h1:JFPnEdsGaGhay69k7QJJuT7gq3XQn8fzYL1gm4Oqpj0= diff --git a/receiver/pyroscopereceiver/README.md b/receiver/pyroscopereceiver/README.md new file mode 100644 index 0000000..922dd97 --- /dev/null +++ b/receiver/pyroscopereceiver/README.md @@ -0,0 +1,19 @@ +# pyroscope receiver + +| Status | | +| ------------------------ |-----------------------| +| Stability | [alpha] | +| Supported pipeline types | logs | + +The pyroscope receiver implements the pyroscope ingest http api. + +## Getting Started + +Example: +```yaml +receivers: + pyroscopereceiver: + protocols: + http: + endpoint: 0.0.0.0:8062 +``` diff --git a/receiver/pyroscopereceiver/compress.go b/receiver/pyroscopereceiver/compress.go new file mode 100644 index 0000000..f914cc2 --- /dev/null +++ b/receiver/pyroscopereceiver/compress.go @@ -0,0 +1,88 @@ +package pyroscopereceiver + +import ( + "compress/gzip" + "fmt" + "io" + "mime/multipart" + "net/http" +) + +type decompressor struct { + conf *Config + decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) +} + +func newDecompressor(conf *Config) *decompressor { + return &decompressor{ + conf: conf, + decoders: map[string]func(r io.ReadCloser) (io.ReadCloser, error){ + "gzip": func(r io.ReadCloser) (io.ReadCloser, error) { + gr, err := gzip.NewReader(r) + if err != nil { + return nil, err + } + return gr, nil + }, + }, + } +} + +// Prepares the accepted request body for decompressed read +func (d *decompressor) decompress(req *http.Request) error { + // support gzip only + decoder := d.decoders["gzip"] + + // support only multipart/form-data + file, err := d.openMultipartJfr(req) + if err != nil { + return err + } + defer file.Close() + + // close old body + if err = req.Body.Close(); err != nil { + return err + } + + resetHeaders(req) + reader, err := decoder(file) + if err != nil { + return err + } + // new body should be closed by the server + req.Body = reader + return nil +} + +func (d *decompressor) openMultipartJfr(unparsed *http.Request) (multipart.File, error) { + if err := unparsed.ParseMultipartForm(d.conf.Protocols.Http.MaxRequestBodySize); err != nil { + return nil, fmt.Errorf("failed to parse multipart request: %w", err) + } + + part, ok := unparsed.MultipartForm.File["jfr"] + if !ok { + return nil, fmt.Errorf("required jfr part is missing") + } + if len(part) != 1 { + return nil, fmt.Errorf("invalid jfr part") + } + jfr := part[0] + if jfr.Filename != "jfr" { + return nil, fmt.Errorf("invalid jfr part file") + } + file, err := jfr.Open() + if err != nil { + return nil, fmt.Errorf("failed to open jfr file") + } + return file, nil +} + +func resetHeaders(req *http.Request) { + // reset content-type for the new binary jfr body + req.Header.Set("Content-Type", "application/octet-stream") + // multipart content-types cannot have encodings so no need to Del() Content-Encoding + // reset "Content-Length" to -1 as the size of the decompressed body is unknown + req.Header.Del("Content-Length") + req.ContentLength = -1 +} diff --git a/receiver/pyroscopereceiver/config.go b/receiver/pyroscopereceiver/config.go new file mode 100644 index 0000000..621048c --- /dev/null +++ b/receiver/pyroscopereceiver/config.go @@ -0,0 +1,28 @@ +package pyroscopereceiver + +import ( + "fmt" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" +) + +// Configures supported protocols +type Protocols struct { + Http *confighttp.HTTPServerSettings `mapstructure:"http"` +} + +var _ component.Config = (*Config)(nil) + +// Represents the receiver config settings within the collector's config.yaml +type Config struct { + Protocols Protocols `mapstructure:"protocols"` +} + +// Checks that the receiver configuration is valid +func (cfg *Config) Validate() error { + if cfg.Protocols.Http.MaxRequestBodySize < 1 { + return fmt.Errorf("max_request_body_size must be positive") + } + return nil +} diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go new file mode 100644 index 0000000..ea8ca61 --- /dev/null +++ b/receiver/pyroscopereceiver/factory.go @@ -0,0 +1,44 @@ +package pyroscopereceiver + +import ( + "context" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/receiver" +) + +const ( + typeStr = "pyroscopereceiver" + + defaultHttpAddr = "0.0.0.0:8062" + defaultMaxRequestBodySize = 5e6 +) + +func createDefaultConfig() component.Config { + return &Config{ + Protocols: Protocols{ + Http: &confighttp.HTTPServerSettings{ + Endpoint: defaultHttpAddr, + MaxRequestBodySize: defaultMaxRequestBodySize, + }, + }, + } +} + +func createLogsReceiver(_ context.Context, params receiver.CreateSettings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) { + if nil == consumer { + return nil, component.ErrNilNextConsumer + } + + return newPyroscopeReceiver(baseCfg.(*Config), consumer, ¶ms), nil +} + +// Creates a factory for the pyroscope receiver. +func NewFactory() receiver.Factory { + return receiver.NewFactory( + typeStr, + createDefaultConfig, + receiver.WithLogs(createLogsReceiver, component.StabilityLevelAlpha)) +} diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go new file mode 100644 index 0000000..9a05a42 --- /dev/null +++ b/receiver/pyroscopereceiver/receiver.go @@ -0,0 +1,216 @@ +package pyroscopereceiver + +import ( + "bytes" + "context" + "errors" + "fmt" + "io" + "log" + "net" + "net/http" + "net/url" + "strconv" + "strings" + "sync" + + promql_parser "github.com/prometheus/prometheus/promql/parser" + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/receiver" + "go.uber.org/zap" +) + +const ( + ingestPath = "/ingest" + + expectedDataSizeBytes = 15e3 + + nameLabel = "__name__" +) + +type pyroscopeReceiver struct { + conf *Config + next consumer.Logs + settings *receiver.CreateSettings + host component.Host + + httpMux *http.ServeMux + decompressor *decompressor + httpServer *http.Server + shutdownWg sync.WaitGroup +} + +func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *receiver.CreateSettings) *pyroscopeReceiver { + recv := &pyroscopeReceiver{ + conf: baseCfg, + next: consumer, + settings: params, + } + recv.decompressor = newDecompressor(recv.conf) + recv.httpMux = http.NewServeMux() + recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { + handleIngest(resp, req, recv) + }) + return recv +} + +func setAttrs(params *url.Values, rec *plog.LogRecord) error { + var ( + tmp []string + ok bool + vparams = *params + ) + + if tmp, ok = vparams["until"]; !ok { + return fmt.Errorf("required end time is missing") + } + end, err := strconv.ParseInt(tmp[0], 10, 64) + if err != nil { + return fmt.Errorf("failed to parse end time: %w", err) + } + rec.SetTimestamp(pcommon.Timestamp(end)) + + if tmp, ok = vparams["name"]; !ok { + return fmt.Errorf("required labels are missing") + } + i := strings.Index(tmp[0], "{") + length := len(tmp[0]) + if i < 0 { + i = length + } else { // optional labels + promql := tmp[0][i:length] + labels, err := promql_parser.ParseMetric(promql) + if err != nil { + return fmt.Errorf("failed to parse labels: %w", err) + } + for _, l := range labels { + rec.Attributes().PutStr(l.Name, l.Value) + } + } + // required app name + name := tmp[0][:i] + rec.Attributes().PutStr(nameLabel, name) + + if tmp, ok = vparams["from"]; !ok { + return fmt.Errorf("required end time is missing") + } + rec.Attributes().PutStr("start_time", tmp[0]) + return nil +} + +func (recv *pyroscopeReceiver) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { + var buf bytes.Buffer + // small extra space to try avoid realloc where expected size fits enough and +1 like limit + buf.Grow(expectedDataSizeBytes + bytes.MinRead + 1) + + // read max+1 to validate size via a single Read() + lr := io.LimitReader(r, recv.conf.Protocols.Http.MaxRequestBodySize+1) + + // doesnt return EOF + n, err := buf.ReadFrom(lr) + if err != nil { + return nil, err + } + if n < 1 { + return nil, fmt.Errorf("empty profile") + } + if n > recv.conf.Protocols.Http.MaxRequestBodySize { + return nil, fmt.Errorf("body size exceeds the limit %d bytes", recv.conf.Protocols.Http.MaxRequestBodySize) + } + return &buf, nil +} + +func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { + logs := plog.NewLogs() + rec := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + + params := req.URL.Query() + if err := setAttrs(¶ms, &rec); err != nil { + return &logs, err + } + + // support jfr only + if tmp, ok := params["format"]; !ok || tmp[0] != "jfr" { + return &logs, fmt.Errorf("unsupported format, supported: [jfr]") + } + + buf, err := recv.readBytes(req.Body) + if err != nil { + return &logs, fmt.Errorf("failed to read body: %w", err) + } + // TODO: avoid realloc of []byte in buf.Bytes() + rec.Body().SetEmptyBytes().FromRaw(buf.Bytes()) + + return &logs, nil +} + +func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { + if req.Method != http.MethodPost { + msg := fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost) + log.Printf("%s\n", msg) + writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) + return + } + + ctx := req.Context() + err := recv.decompressor.decompress(req) + if err != nil { + msg := err.Error() + log.Printf("%s\n", msg) + writeResponse(resp, "text/plain", http.StatusBadRequest, []byte(msg)) + return + } + logs, err := parse(req, recv) + if err != nil { + msg := err.Error() + log.Printf("%s\n", msg) + writeResponse(resp, "text/plain", http.StatusBadRequest, []byte(msg)) + return + } + + // delegate to next consumer in the pipeline + recv.next.ConsumeLogs(ctx, *logs) +} + +func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) error { + recv.host = host + var err error + + // TODO: rm redundant interceptors applied by ToServer() like decompressor + if recv.httpServer, err = recv.conf.Protocols.Http.ToServer(host, recv.settings.TelemetrySettings, recv.httpMux); err != nil { + return fmt.Errorf("failed to create http server: %w", err) + } + + recv.settings.Logger.Info("server listening on", zap.String("endpoint", recv.conf.Protocols.Http.Endpoint)) + var listener net.Listener + if listener, err = recv.conf.Protocols.Http.ToListener(); err != nil { + return fmt.Errorf("failed to create tcp listener: %w", err) + } + + // TODO: rate limit clients + recv.shutdownWg.Add(1) + go func() { + defer recv.shutdownWg.Done() + if err := recv.httpServer.Serve(listener); !errors.Is(err, http.ErrServerClosed) && err != nil { + host.ReportFatalError(err) + } + }() + return nil +} + +func (recv *pyroscopeReceiver) Shutdown(ctx context.Context) error { + if err := recv.httpServer.Shutdown(ctx); err != nil { + return fmt.Errorf("failed to shutdown: %w", err) + } + recv.shutdownWg.Wait() + return nil +} + +func writeResponse(w http.ResponseWriter, contentType string, statusCode int, msg []byte) { + w.Header().Set("Content-Type", contentType) + w.WriteHeader(statusCode) + _, _ = w.Write(msg) +} diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/receiver_test.go new file mode 100644 index 0000000..c24b262 --- /dev/null +++ b/receiver/pyroscopereceiver/receiver_test.go @@ -0,0 +1,183 @@ +package pyroscopereceiver + +import ( + "bytes" + "compress/gzip" + "context" + "fmt" + "mime/multipart" + "net" + "net/http" + "os" + "path/filepath" + "testing" + + "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/plogtest" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/config/confighttp" + "go.opentelemetry.io/collector/consumer/consumertest" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/collector/receiver/receivertest" +) + +func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { + addr := getAvailableLocalTcpPort(t) + config := &Config{ + Protocols: Protocols{ + Http: &confighttp.HTTPServerSettings{ + Endpoint: addr, + MaxRequestBodySize: defaultMaxRequestBodySize, + }, + }, + } + sink := new(consumertest.LogsSink) + sett := receivertest.NewNopCreateSettings() + recv := newPyroscopeReceiver(config, sink, &sett) + + require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) + t.Cleanup(func() { require.NoError(t, recv.Shutdown(context.Background())) }) + + return addr, sink +} + +func send(t *testing.T, addr string, urlParams map[string]string, jfr string) error { + data, err := os.ReadFile(jfr) + if err != nil { + return err + } + + body := new(bytes.Buffer) + + mw := multipart.NewWriter(body) + part, err := mw.CreateFormFile("jfr", "jfr") + if err != nil { + return fmt.Errorf("failed to create form file: %w", err) + } + gw := gzip.NewWriter(part) + if _, err := gw.Write(data); err != nil { + return err + } + gw.Close() + mw.Close() + + req, err := http.NewRequest("POST", addr, body) + if err != nil { + return err + } + req.Header.Add("Content-Type", mw.FormDataContentType()) + + q := req.URL.Query() + for k, v := range urlParams { + q.Add(k, v) + } + req.URL.RawQuery = q.Encode() + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return err + } + + resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + return fmt.Errorf("failed to upload profile; http status code: %d", resp.StatusCode) + } + return nil +} + +func TestPyroscopeIngest(t *testing.T) { + type test_t struct { + name string + urlParams map[string]string + jfr string + expected *plog.Logs + err error + } + tests := make([]test_t, 2) + + jfr := filepath.Join("testdata", "profile.jfr") + data, err := os.ReadFile(jfr) + assert.NoError(t, err, "failed to load expected jfr") + + tests[0] = test_t{ + name: "send labeled multipart form data gzipped jfr to http ingest endpoint", + urlParams: map[string]string{ + "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", + "from": "1700332322", + "until": "1700332329", + "format": "jfr", + }, + jfr: jfr, + expected: gen(&profile_t{ + timestamp: 1700332329, + attrs: map[string]any{ + "__name__": "com.example.App", + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + "start_time": "1700332322", + }, + body: &data, + }), + err: nil, + } + tests[1] = test_t{ + name: "send not labeled multipart form data gzipped jfr to http ingest endpoint", + urlParams: map[string]string{ + "name": "com.example.App", + "from": "1700332332", + "until": "1700332339", + "format": "jfr", + }, + jfr: jfr, + expected: gen(&profile_t{ + timestamp: 1700332339, + attrs: map[string]any{ + "__name__": "com.example.App", + "start_time": "1700332332", + }, + body: &data, + }), + err: nil, + } + + addr, sink := startHttpServer(t) + collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.NoError(t, send(t, collectorAddr, tt.urlParams, tt.jfr), "send shouldn't have been failed") + actual := sink.AllLogs() + assert.NoError(t, plogtest.CompareLogs(*tt.expected, actual[0])) + sink.Reset() + }) + } +} + +// Returns an available local tcp port. It doesnt bind the port, and there is a race condition as +// another process maybe bind the port before the test does +func getAvailableLocalTcpPort(t *testing.T) string { + l, err := net.Listen("tcp", "localhost:0") + require.NoError(t, err, "failed to bind a free local tcp port") + defer func() { + assert.NoError(t, l.Close()) + }() + return l.Addr().String() +} + +type profile_t struct { + timestamp int64 + body *[]byte + attrs map[string]any +} + +func gen(in *profile_t) *plog.Logs { + profiles := plog.NewLogs() + s := profiles.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() + rec := s.AppendEmpty() + _ = rec.Attributes().FromRaw(in.attrs) + rec.SetTimestamp(pcommon.Timestamp(in.timestamp)) + rec.Body().SetEmptyBytes().FromRaw(*in.body) + return &profiles +} diff --git a/receiver/pyroscopereceiver/testdata/profile.jfr b/receiver/pyroscopereceiver/testdata/profile.jfr new file mode 100644 index 0000000000000000000000000000000000000000..4a0397c15f07e84ed9f8afbf75ce5fc1d832747e GIT binary patch literal 11008 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 WhWC#!R`dGqvEdpf^^c8>jQtvlo*TRX literal 0 HcmV?d00001 From e9f38548bc0c34275b5c480207307cd5b8ecfb60 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 26 Nov 2023 19:08:28 +0200 Subject: [PATCH 03/44] wip: pipe batch processor to pyroscopereceiver --- config/example-config.yaml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/config/example-config.yaml b/config/example-config.yaml index 22d0551..fdf63e5 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -78,9 +78,13 @@ service: extensions: [pprof, zpages, health_check] pipelines: logs: - receivers: [fluentforward, otlp, pyroscopereceiver] + receivers: [fluentforward, otlp] processors: [memory_limiter, resourcedetection/system, batch] exporters: [qryn] + logs/profiles: + receivers: [pyroscopereceiver] + processors: [batch] + exporters: [qryn] traces: receivers: [otlp] processors: [resourcedetection/system, spanmetrics, batch] From a027ee4298306de34503b5fa20ede0107737c12f Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 27 Nov 2023 12:21:08 +0200 Subject: [PATCH 04/44] refactor compress to be decoupled from http --- receiver/pyroscopereceiver/compress.go | 82 ++++++--------- receiver/pyroscopereceiver/receiver.go | 136 +++++++++++++------------ 2 files changed, 103 insertions(+), 115 deletions(-) diff --git a/receiver/pyroscopereceiver/compress.go b/receiver/pyroscopereceiver/compress.go index f914cc2..912d625 100644 --- a/receiver/pyroscopereceiver/compress.go +++ b/receiver/pyroscopereceiver/compress.go @@ -1,21 +1,24 @@ package pyroscopereceiver import ( + "bytes" "compress/gzip" "fmt" "io" - "mime/multipart" - "net/http" +) + +const ( + expectedDataSizeBytes = 15e3 ) type decompressor struct { - conf *Config - decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) + maxDecompressedSizeBytes int64 + decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) } -func newDecompressor(conf *Config) *decompressor { +func newDecompressor(maxDecompressedSizeBytes int64) *decompressor { return &decompressor{ - conf: conf, + maxDecompressedSizeBytes: maxDecompressedSizeBytes, decoders: map[string]func(r io.ReadCloser) (io.ReadCloser, error){ "gzip": func(r io.ReadCloser) (io.ReadCloser, error) { gr, err := gzip.NewReader(r) @@ -28,61 +31,38 @@ func newDecompressor(conf *Config) *decompressor { } } -// Prepares the accepted request body for decompressed read -func (d *decompressor) decompress(req *http.Request) error { - // support gzip only - decoder := d.decoders["gzip"] +func (d *decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { + var buf bytes.Buffer + // small extra space to try avoid realloc where expected size fits enough and +1 like limit + buf.Grow(expectedDataSizeBytes + bytes.MinRead + 1) + + // read max+1 to validate size via a single Read() + lr := io.LimitReader(r, d.maxDecompressedSizeBytes+1) - // support only multipart/form-data - file, err := d.openMultipartJfr(req) + n, err := buf.ReadFrom(lr) if err != nil { - return err + return nil, err } - defer file.Close() - - // close old body - if err = req.Body.Close(); err != nil { - return err + if n < 1 { + return nil, fmt.Errorf("empty profile") } - - resetHeaders(req) - reader, err := decoder(file) - if err != nil { - return err + if n > d.maxDecompressedSizeBytes { + return nil, fmt.Errorf("body size exceeds the limit %d bytes", d.maxDecompressedSizeBytes) } - // new body should be closed by the server - req.Body = reader - return nil + return &buf, nil } -func (d *decompressor) openMultipartJfr(unparsed *http.Request) (multipart.File, error) { - if err := unparsed.ParseMultipartForm(d.conf.Protocols.Http.MaxRequestBodySize); err != nil { - return nil, fmt.Errorf("failed to parse multipart request: %w", err) - } - - part, ok := unparsed.MultipartForm.File["jfr"] +// Reads and decompresses the accepted reader, applying the configured decompressed size limit +func (d *decompressor) decompress(r io.ReadCloser, encoding string) (*bytes.Buffer, error) { + decoder, ok := d.decoders[encoding] if !ok { - return nil, fmt.Errorf("required jfr part is missing") - } - if len(part) != 1 { - return nil, fmt.Errorf("invalid jfr part") + return nil, fmt.Errorf("unsupported encoding") } - jfr := part[0] - if jfr.Filename != "jfr" { - return nil, fmt.Errorf("invalid jfr part file") - } - file, err := jfr.Open() + + dr, err := decoder(r) if err != nil { - return nil, fmt.Errorf("failed to open jfr file") + return nil, err } - return file, nil -} -func resetHeaders(req *http.Request) { - // reset content-type for the new binary jfr body - req.Header.Set("Content-Type", "application/octet-stream") - // multipart content-types cannot have encodings so no need to Del() Content-Encoding - // reset "Content-Length" to -1 as the size of the decompressed body is unknown - req.Header.Del("Content-Length") - req.ContentLength = -1 + return d.readBytes(dr) } diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 9a05a42..4c27f1f 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -1,12 +1,11 @@ package pyroscopereceiver import ( - "bytes" "context" "errors" "fmt" - "io" "log" + "mime/multipart" "net" "net/http" "net/url" @@ -25,10 +24,7 @@ import ( const ( ingestPath = "/ingest" - - expectedDataSizeBytes = 15e3 - - nameLabel = "__name__" + nameLabel = "__name__" ) type pyroscopeReceiver struct { @@ -49,7 +45,7 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei next: consumer, settings: params, } - recv.decompressor = newDecompressor(recv.conf) + recv.decompressor = newDecompressor(recv.conf.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { handleIngest(resp, req, recv) @@ -57,14 +53,79 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei return recv } +func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { + logs := plog.NewLogs() + rec := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() + + params := req.URL.Query() + if err := setAttrs(¶ms, &rec); err != nil { + return &logs, err + } + + // support jfr only + if tmp, ok := params["format"]; !ok || tmp[0] != "jfr" { + return &logs, fmt.Errorf("unsupported format, supported: [jfr]") + } + + // support only multipart/form-data + file, err := recv.openMultipartJfr(req) + if err != nil { + return &logs, err + } + defer file.Close() + + buf, err := recv.decompressor.decompress(file, "gzip") + if err != nil { + return &logs, fmt.Errorf("failed to decompress body: %w", err) + } + resetHeaders(req) + + // TODO: avoid realloc of []byte in buf.Bytes() + rec.Body().SetEmptyBytes().FromRaw(buf.Bytes()) + + return &logs, nil +} + +func (d *pyroscopeReceiver) openMultipartJfr(unparsed *http.Request) (multipart.File, error) { + if err := unparsed.ParseMultipartForm(d.conf.Protocols.Http.MaxRequestBodySize); err != nil { + return nil, fmt.Errorf("failed to parse multipart request: %w", err) + } + + part, ok := unparsed.MultipartForm.File["jfr"] + if !ok { + return nil, fmt.Errorf("required jfr part is missing") + } + if len(part) != 1 { + return nil, fmt.Errorf("invalid jfr part") + } + jfr := part[0] + if jfr.Filename != "jfr" { + return nil, fmt.Errorf("invalid jfr part file") + } + file, err := jfr.Open() + if err != nil { + return nil, fmt.Errorf("failed to open jfr file") + } + return file, nil +} + +func resetHeaders(req *http.Request) { + // reset content-type for the new binary jfr body + req.Header.Set("Content-Type", "application/octet-stream") + // multipart content-types cannot have encodings so no need to Del() Content-Encoding + // reset "Content-Length" to -1 as the size of the decompressed body is unknown + req.Header.Del("Content-Length") + req.ContentLength = -1 +} + func setAttrs(params *url.Values, rec *plog.LogRecord) error { var ( tmp []string ok bool - vparams = *params + paramsv = *params ) - if tmp, ok = vparams["until"]; !ok { + if tmp, ok = paramsv["until"]; !ok { return fmt.Errorf("required end time is missing") } end, err := strconv.ParseInt(tmp[0], 10, 64) @@ -73,7 +134,7 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { } rec.SetTimestamp(pcommon.Timestamp(end)) - if tmp, ok = vparams["name"]; !ok { + if tmp, ok = paramsv["name"]; !ok { return fmt.Errorf("required labels are missing") } i := strings.Index(tmp[0], "{") @@ -94,59 +155,13 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { name := tmp[0][:i] rec.Attributes().PutStr(nameLabel, name) - if tmp, ok = vparams["from"]; !ok { + if tmp, ok = paramsv["from"]; !ok { return fmt.Errorf("required end time is missing") } rec.Attributes().PutStr("start_time", tmp[0]) return nil } -func (recv *pyroscopeReceiver) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { - var buf bytes.Buffer - // small extra space to try avoid realloc where expected size fits enough and +1 like limit - buf.Grow(expectedDataSizeBytes + bytes.MinRead + 1) - - // read max+1 to validate size via a single Read() - lr := io.LimitReader(r, recv.conf.Protocols.Http.MaxRequestBodySize+1) - - // doesnt return EOF - n, err := buf.ReadFrom(lr) - if err != nil { - return nil, err - } - if n < 1 { - return nil, fmt.Errorf("empty profile") - } - if n > recv.conf.Protocols.Http.MaxRequestBodySize { - return nil, fmt.Errorf("body size exceeds the limit %d bytes", recv.conf.Protocols.Http.MaxRequestBodySize) - } - return &buf, nil -} - -func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { - logs := plog.NewLogs() - rec := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() - - params := req.URL.Query() - if err := setAttrs(¶ms, &rec); err != nil { - return &logs, err - } - - // support jfr only - if tmp, ok := params["format"]; !ok || tmp[0] != "jfr" { - return &logs, fmt.Errorf("unsupported format, supported: [jfr]") - } - - buf, err := recv.readBytes(req.Body) - if err != nil { - return &logs, fmt.Errorf("failed to read body: %w", err) - } - // TODO: avoid realloc of []byte in buf.Bytes() - rec.Body().SetEmptyBytes().FromRaw(buf.Bytes()) - - return &logs, nil -} - func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { if req.Method != http.MethodPost { msg := fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost) @@ -156,13 +171,6 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe } ctx := req.Context() - err := recv.decompressor.decompress(req) - if err != nil { - msg := err.Error() - log.Printf("%s\n", msg) - writeResponse(resp, "text/plain", http.StatusBadRequest, []byte(msg)) - return - } logs, err := parse(req, recv) if err != nil { msg := err.Error() From 78e160393dd40c7bd1a5e5bb2173dbcf2422d9fd Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 27 Nov 2023 12:52:53 +0200 Subject: [PATCH 05/44] use zap.Logger for logging --- receiver/pyroscopereceiver/receiver.go | 9 +++++---- receiver/pyroscopereceiver/receiver_test.go | 2 ++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 4c27f1f..433f344 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -4,7 +4,6 @@ import ( "context" "errors" "fmt" - "log" "mime/multipart" "net" "net/http" @@ -31,6 +30,7 @@ type pyroscopeReceiver struct { conf *Config next consumer.Logs settings *receiver.CreateSettings + logger *zap.Logger host component.Host httpMux *http.ServeMux @@ -44,6 +44,7 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei conf: baseCfg, next: consumer, settings: params, + logger: params.Logger, } recv.decompressor = newDecompressor(recv.conf.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() @@ -165,7 +166,7 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { if req.Method != http.MethodPost { msg := fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost) - log.Printf("%s\n", msg) + recv.logger.Error(msg) writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) return } @@ -174,7 +175,7 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe logs, err := parse(req, recv) if err != nil { msg := err.Error() - log.Printf("%s\n", msg) + recv.logger.Error(msg) writeResponse(resp, "text/plain", http.StatusBadRequest, []byte(msg)) return } @@ -192,7 +193,7 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err return fmt.Errorf("failed to create http server: %w", err) } - recv.settings.Logger.Info("server listening on", zap.String("endpoint", recv.conf.Protocols.Http.Endpoint)) + recv.logger.Info("server listening on", zap.String("endpoint", recv.conf.Protocols.Http.Endpoint)) var listener net.Listener if listener, err = recv.conf.Protocols.Http.ToListener(); err != nil { return fmt.Errorf("failed to create tcp listener: %w", err) diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/receiver_test.go index c24b262..7a5616d 100644 --- a/receiver/pyroscopereceiver/receiver_test.go +++ b/receiver/pyroscopereceiver/receiver_test.go @@ -21,6 +21,7 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/receiver/receivertest" + "go.uber.org/zap" ) func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { @@ -35,6 +36,7 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { } sink := new(consumertest.LogsSink) sett := receivertest.NewNopCreateSettings() + sett.Logger = zap.Must(zap.NewDevelopment()) recv := newPyroscopeReceiver(config, sink, &sett) require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) From 6df8abb94467d2c8f1ff727857d0b01dc9851eb7 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 27 Nov 2023 14:01:16 +0200 Subject: [PATCH 06/44] fix multipart form controlled parsing --- receiver/pyroscopereceiver/compress.go | 2 +- receiver/pyroscopereceiver/factory.go | 2 +- receiver/pyroscopereceiver/receiver.go | 21 ++++++++++++--------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/receiver/pyroscopereceiver/compress.go b/receiver/pyroscopereceiver/compress.go index 912d625..9180d7b 100644 --- a/receiver/pyroscopereceiver/compress.go +++ b/receiver/pyroscopereceiver/compress.go @@ -8,7 +8,7 @@ import ( ) const ( - expectedDataSizeBytes = 15e3 + expectedDataSizeBytes = 16e3 ) type decompressor struct { diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index ea8ca61..4d16adf 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -13,7 +13,7 @@ const ( typeStr = "pyroscopereceiver" defaultHttpAddr = "0.0.0.0:8062" - defaultMaxRequestBodySize = 5e6 + defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata ) func createDefaultConfig() component.Config { diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 433f344..7c75e62 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -24,6 +24,7 @@ import ( const ( ingestPath = "/ingest" nameLabel = "__name__" + jfrFormat = "jfr" ) type pyroscopeReceiver struct { @@ -91,23 +92,24 @@ func (d *pyroscopeReceiver) openMultipartJfr(unparsed *http.Request) (multipart. if err := unparsed.ParseMultipartForm(d.conf.Protocols.Http.MaxRequestBodySize); err != nil { return nil, fmt.Errorf("failed to parse multipart request: %w", err) } + multipartForm := unparsed.MultipartForm + defer func() { + _ = multipartForm.RemoveAll() + }() - part, ok := unparsed.MultipartForm.File["jfr"] + part, ok := multipartForm.File[jfrFormat] if !ok { return nil, fmt.Errorf("required jfr part is missing") } - if len(part) != 1 { - return nil, fmt.Errorf("invalid jfr part") - } - jfr := part[0] - if jfr.Filename != "jfr" { - return nil, fmt.Errorf("invalid jfr part file") + fh := part[0] + if fh.Filename != jfrFormat { + return nil, fmt.Errorf("jfr filename is not '%s'", jfrFormat) } - file, err := jfr.Open() + f, err := fh.Open() if err != nil { return nil, fmt.Errorf("failed to open jfr file") } - return file, nil + return f, nil } func resetHeaders(req *http.Request) { @@ -188,6 +190,7 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err recv.host = host var err error + // applies an interceptor that enforces the configured request body limit // TODO: rm redundant interceptors applied by ToServer() like decompressor if recv.httpServer, err = recv.conf.Protocols.Http.ToServer(host, recv.settings.TelemetrySettings, recv.httpMux); err != nil { return fmt.Errorf("failed to create http server: %w", err) From 88766adf7e87082963db810323630ecec68d55c1 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 27 Nov 2023 16:35:49 +0200 Subject: [PATCH 07/44] set timestamp to starttime and calc duration --- ...iver_test.go => pyroscopereceiver_test.go} | 10 +++++----- receiver/pyroscopereceiver/receiver.go | 20 ++++++++++++------- 2 files changed, 18 insertions(+), 12 deletions(-) rename receiver/pyroscopereceiver/{receiver_test.go => pyroscopereceiver_test.go} (96%) diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go similarity index 96% rename from receiver/pyroscopereceiver/receiver_test.go rename to receiver/pyroscopereceiver/pyroscopereceiver_test.go index 7a5616d..b5e7f7f 100644 --- a/receiver/pyroscopereceiver/receiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -113,12 +113,12 @@ func TestPyroscopeIngest(t *testing.T) { }, jfr: jfr, expected: gen(&profile_t{ - timestamp: 1700332329, + timestamp: 1700332322, attrs: map[string]any{ "__name__": "com.example.App", "dc": "us-east-1", "kubernetes_pod_name": "app-abcd1234", - "start_time": "1700332322", + "duration_ns": "7000000000", }, body: &data, }), @@ -134,10 +134,10 @@ func TestPyroscopeIngest(t *testing.T) { }, jfr: jfr, expected: gen(&profile_t{ - timestamp: 1700332339, + timestamp: 1700332332, attrs: map[string]any{ - "__name__": "com.example.App", - "start_time": "1700332332", + "__name__": "com.example.App", + "duration_ns": "7000000000", }, body: &data, }), diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 7c75e62..46844a5 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -82,6 +82,8 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { } resetHeaders(req) + // parse jfr + // TODO: avoid realloc of []byte in buf.Bytes() rec.Body().SetEmptyBytes().FromRaw(buf.Bytes()) @@ -128,14 +130,14 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { paramsv = *params ) - if tmp, ok = paramsv["until"]; !ok { - return fmt.Errorf("required end time is missing") + if tmp, ok = paramsv["from"]; !ok { + return fmt.Errorf("required start time is missing") } - end, err := strconv.ParseInt(tmp[0], 10, 64) + start, err := strconv.ParseInt(tmp[0], 10, 64) if err != nil { - return fmt.Errorf("failed to parse end time: %w", err) + return fmt.Errorf("failed to parse start time: %w", err) } - rec.SetTimestamp(pcommon.Timestamp(end)) + rec.SetTimestamp(pcommon.Timestamp(start)) if tmp, ok = paramsv["name"]; !ok { return fmt.Errorf("required labels are missing") @@ -158,10 +160,14 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { name := tmp[0][:i] rec.Attributes().PutStr(nameLabel, name) - if tmp, ok = paramsv["from"]; !ok { + if tmp, ok = paramsv["until"]; !ok { return fmt.Errorf("required end time is missing") } - rec.Attributes().PutStr("start_time", tmp[0]) + end, err := strconv.ParseInt(tmp[0], 10, 64) + if err != nil { + return fmt.Errorf("failed to parse end time: %w", err) + } + rec.Attributes().PutStr("duration_ns", fmt.Sprint((end-start)*1e9)) return nil } From df5d1e399dcc5438585e1750b22fb4665f18a557 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Wed, 29 Nov 2023 11:53:21 +0200 Subject: [PATCH 08/44] import _ go.uber.org/automaxprocs --- cmd/otel-collector/main.go | 1 + go.mod | 1 + go.sum | 3 +++ 3 files changed, 5 insertions(+) diff --git a/cmd/otel-collector/main.go b/cmd/otel-collector/main.go index 41de8df..b030c4c 100644 --- a/cmd/otel-collector/main.go +++ b/cmd/otel-collector/main.go @@ -6,6 +6,7 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/otelcol" + _ "go.uber.org/automaxprocs" ) func main() { diff --git a/go.mod b/go.mod index e44d0d3..f67f84d 100644 --- a/go.mod +++ b/go.mod @@ -514,6 +514,7 @@ require ( go.opentelemetry.io/otel/sdk/metric v1.19.0 // indirect go.opentelemetry.io/otel/trace v1.19.0 // indirect go.uber.org/atomic v1.11.0 // indirect + go.uber.org/automaxprocs v1.5.3 golang.org/x/crypto v0.14.0 // indirect golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect golang.org/x/mod v0.13.0 // indirect diff --git a/go.sum b/go.sum index e188952..e9b2690 100644 --- a/go.sum +++ b/go.sum @@ -1310,6 +1310,7 @@ github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndr github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -1645,6 +1646,8 @@ go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v8 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= +go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= +go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= From 25030f494effddfe2c2c127b70c710f78da9533f Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 4 Dec 2023 17:53:27 +0200 Subject: [PATCH 09/44] fix eager buffer allocation size --- receiver/pyroscopereceiver/compress.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/receiver/pyroscopereceiver/compress.go b/receiver/pyroscopereceiver/compress.go index 9180d7b..dc9cbce 100644 --- a/receiver/pyroscopereceiver/compress.go +++ b/receiver/pyroscopereceiver/compress.go @@ -7,10 +7,6 @@ import ( "io" ) -const ( - expectedDataSizeBytes = 16e3 -) - type decompressor struct { maxDecompressedSizeBytes int64 decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) @@ -32,9 +28,16 @@ func newDecompressor(maxDecompressedSizeBytes int64) *decompressor { } func (d *decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { - var buf bytes.Buffer + var ( + buf bytes.Buffer + expectedDataSizeBytes int64 = 10e3 + ) + + if d.maxDecompressedSizeBytes < expectedDataSizeBytes { + expectedDataSizeBytes = d.maxDecompressedSizeBytes + } // small extra space to try avoid realloc where expected size fits enough and +1 like limit - buf.Grow(expectedDataSizeBytes + bytes.MinRead + 1) + buf.Grow(int(expectedDataSizeBytes) + bytes.MinRead + 1) // read max+1 to validate size via a single Read() lr := io.LimitReader(r, d.maxDecompressedSizeBytes+1) From 9aac0c4dc69c275056d97b891bee167c39860560 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 4 Dec 2023 18:37:48 +0200 Subject: [PATCH 10/44] initial jfr-pprof parser --- go.mod | 2 + go.sum | 5 +- .../{ => compress}/compress.go | 39 +-- .../pyroscopereceiver/jfrparser/parser.go | 276 ++++++++++++++++++ receiver/pyroscopereceiver/profile/profile.go | 27 ++ receiver/pyroscopereceiver/receiver.go | 54 +++- 6 files changed, 374 insertions(+), 29 deletions(-) rename receiver/pyroscopereceiver/{ => compress}/compress.go (66%) create mode 100644 receiver/pyroscopereceiver/jfrparser/parser.go create mode 100644 receiver/pyroscopereceiver/profile/profile.go diff --git a/go.mod b/go.mod index f67f84d..5649898 100644 --- a/go.mod +++ b/go.mod @@ -14,6 +14,7 @@ exclude github.com/StackExchange/wmi v1.2.0 require ( github.com/ClickHouse/clickhouse-go/v2 v2.10.1 github.com/go-logfmt/logfmt v0.6.0 + github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.85.0 @@ -152,6 +153,7 @@ require ( go.uber.org/multierr v1.11.0 go.uber.org/zap v1.26.0 google.golang.org/protobuf v1.31.0 + github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8 ) require ( diff --git a/go.sum b/go.sum index e9b2690..3cf2f5d 100644 --- a/go.sum +++ b/go.sum @@ -590,7 +590,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 h1:t2sLhFuGXwoomaKLTuoxFfFqqlG1Gp2DpsupXq3UvZ0= +github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -620,6 +621,8 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosnmp/gosnmp v1.35.0 h1:EuWWNPxTCdAUx2/NbQcSa3WdNxjzpy4Phv57b4MWpJM= github.com/gosnmp/gosnmp v1.35.0/go.mod h1:2AvKZ3n9aEl5TJEo/fFmf/FGO4Nj4cVeEc5yuk88CYc= +github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8 h1:Cod+QZWJXGLoCfKfuH66J3iSQ/WWw+R03R6QCwm8IB8= +github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8/go.mod h1:M5u1ux34Qo47ZBWksbMYVk40s7dvU3WMVYpxweEu4R0= github.com/grafana/loki/pkg/push v0.0.0-20230321110627-5c3d204ebf5d h1:InEQBUAKYIHRlOVvxWxvpW5pziK53RdlhsuRJzBWUmE= github.com/grafana/loki/pkg/push v0.0.0-20230321110627-5c3d204ebf5d/go.mod h1:BjNgF1EfQglDCrCbF0qiQLqAoBKva0/es63lSKT2TXw= github.com/grafana/regexp v0.0.0-20221122212121-6b5c0a4cb7fd h1:PpuIBO5P3e9hpqBD0O/HjhShYuM6XE0i/lbE6J94kww= diff --git a/receiver/pyroscopereceiver/compress.go b/receiver/pyroscopereceiver/compress/compress.go similarity index 66% rename from receiver/pyroscopereceiver/compress.go rename to receiver/pyroscopereceiver/compress/compress.go index dc9cbce..fe46746 100644 --- a/receiver/pyroscopereceiver/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -1,4 +1,4 @@ -package pyroscopereceiver +package compress import ( "bytes" @@ -7,13 +7,13 @@ import ( "io" ) -type decompressor struct { +type Decompressor struct { maxDecompressedSizeBytes int64 decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) } -func newDecompressor(maxDecompressedSizeBytes int64) *decompressor { - return &decompressor{ +func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { + return &Decompressor{ maxDecompressedSizeBytes: maxDecompressedSizeBytes, decoders: map[string]func(r io.ReadCloser) (io.ReadCloser, error){ "gzip": func(r io.ReadCloser) (io.ReadCloser, error) { @@ -27,17 +27,8 @@ func newDecompressor(maxDecompressedSizeBytes int64) *decompressor { } } -func (d *decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { - var ( - buf bytes.Buffer - expectedDataSizeBytes int64 = 10e3 - ) - - if d.maxDecompressedSizeBytes < expectedDataSizeBytes { - expectedDataSizeBytes = d.maxDecompressedSizeBytes - } - // small extra space to try avoid realloc where expected size fits enough and +1 like limit - buf.Grow(int(expectedDataSizeBytes) + bytes.MinRead + 1) +func (d *Decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { + buf := PrepareBuffer(d.maxDecompressedSizeBytes) // read max+1 to validate size via a single Read() lr := io.LimitReader(r, d.maxDecompressedSizeBytes+1) @@ -52,11 +43,11 @@ func (d *decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { if n > d.maxDecompressedSizeBytes { return nil, fmt.Errorf("body size exceeds the limit %d bytes", d.maxDecompressedSizeBytes) } - return &buf, nil + return buf, nil } // Reads and decompresses the accepted reader, applying the configured decompressed size limit -func (d *decompressor) decompress(r io.ReadCloser, encoding string) (*bytes.Buffer, error) { +func (d *Decompressor) Decompress(r io.ReadCloser, encoding string) (*bytes.Buffer, error) { decoder, ok := d.decoders[encoding] if !ok { return nil, fmt.Errorf("unsupported encoding") @@ -69,3 +60,17 @@ func (d *decompressor) decompress(r io.ReadCloser, encoding string) (*bytes.Buff return d.readBytes(dr) } + +func PrepareBuffer(maxDecompressedSizeBytes int64) *bytes.Buffer { + var ( + buf bytes.Buffer + expectedDataSizeBytes int64 = 10e3 + ) + + if maxDecompressedSizeBytes < expectedDataSizeBytes { + expectedDataSizeBytes = maxDecompressedSizeBytes + } + // extra space to try avoid realloc where expected size fits enough + buf.Grow(int(expectedDataSizeBytes) + bytes.MinRead) + return &buf +} diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go new file mode 100644 index 0000000..79d76e2 --- /dev/null +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -0,0 +1,276 @@ +package jfrparser + +import ( + "bytes" + "fmt" + "io" + + pprof_proto "github.com/google/pprof/profile" + jfr_parser "github.com/grafana/jfr-parser/parser" + "github.com/grafana/jfr-parser/parser/types" + "github.com/grafana/jfr-parser/parser/types/def" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver/profile" +) + +type meta struct { + period int64 +} + +type parser struct { + md meta + pa *jfr_parser.Parser + maxDecompressedSizeBytes int64 + + sampleMap map[uint32]uint32 // + locationMap map[uint32]*pprof_proto.Location // +} + +const ( + sampleTypeCpu = 0 + sampleTypeWall = 1 + sampleTypeInNewTlab = 2 + sampleTypeOutsideTlab = 3 + sampleTypeLock = 4 + sampleTypeThreadPark = 5 + sampleTypeLiveObject = 6 +) + +var typetab = []profile.ProfileType{ + sampleTypeCpu: {Type: "process_cpu", PeriodType: "cpu", PeriodUnit: "nanoseconds", SampleType: []string{"cpu"}, SampleUnit: []string{"nanoseconds"}}, + sampleTypeWall: {Type: "wall", PeriodType: "wall", PeriodUnit: "nanoseconds", SampleType: []string{"wall"}, SampleUnit: []string{"nanoseconds"}}, + sampleTypeInNewTlab: {Type: "memory", PeriodType: "space", PeriodUnit: "bytes", SampleType: []string{"alloc_in_new_tlab_objects", "alloc_in_new_tlab_bytes"}, SampleUnit: []string{"count", "bytes"}}, + sampleTypeOutsideTlab: {Type: "memory", PeriodType: "space", PeriodUnit: "bytes", SampleType: []string{"alloc_outside_tlab_objects", "alloc_outside_tlab_bytes"}, SampleUnit: []string{"count", "bytes"}}, + sampleTypeLock: {Type: "mutex", PeriodType: "mutex", PeriodUnit: "count", SampleType: []string{"contentions", "delay"}, SampleUnit: []string{"count", "nanoseconds"}}, + sampleTypeThreadPark: {Type: "block", PeriodType: "block", PeriodUnit: "count", SampleType: []string{"contentions", "delay"}, SampleUnit: []string{"count", "nanoseconds"}}, + sampleTypeLiveObject: {Type: "memory", PeriodType: "objects", PeriodUnit: "count", SampleType: []string{"live"}, SampleUnit: []string{"count"}}, +} + +const ( + wall = "wall" + event = "event" +) + +// Creates a jfr parser that parse the accepted jfr buffer +func NewJfrParser(jfr *bytes.Buffer, md profile.Metadata, maxDecompressedSizeBytes int64) *parser { + var pe int64 + if md.SampleRateHertz == 0 { + pe = 0 + } else { + pe = 1e9 / int64(md.SampleRateHertz) + } + pa := jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}) + return &parser{ + md: meta{period: pe}, + pa: pa, + maxDecompressedSizeBytes: maxDecompressedSizeBytes, + sampleMap: make(map[uint32]uint32), + locationMap: make(map[uint32]*pprof_proto.Location), + } +} + +// Gets the type of the first data (non-settings) record, +// which is determines the profile type because a profile should bind to a single type. +// The caller should not call ParseEvent() to process the event, as it is being called internally. +func (p *parser) parseType() (def.TypeID, int, string, error) { + var event string + for { + t, err := p.pa.ParseEvent() + if err != nil { + if io.EOF == err { + return def.TypeID(0), -1, "", fmt.Errorf("found zero data (non-settings) records") + } + return def.TypeID(0), -1, "", fmt.Errorf("jfr-parser ParseEvent error while parsing type: %w", err) + } + + switch t { + case p.pa.TypeMap.T_EXECUTION_SAMPLE: + if wall == event { + return def.TypeID(0), sampleTypeWall, event, nil + } else { + return def.TypeID(0), sampleTypeCpu, event, nil + } + case p.pa.TypeMap.T_ALLOC_IN_NEW_TLAB: + return def.TypeID(0), sampleTypeInNewTlab, event, nil + case p.pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: + return def.TypeID(0), sampleTypeOutsideTlab, event, nil + case p.pa.TypeMap.T_MONITOR_ENTER: + return def.TypeID(0), sampleTypeLock, event, nil + case p.pa.TypeMap.T_THREAD_PARK: + return def.TypeID(0), sampleTypeThreadPark, event, nil + case p.pa.TypeMap.T_LIVE_OBJECT: + return def.TypeID(0), sampleTypeLiveObject, event, nil + case p.pa.TypeMap.T_ACTIVE_SETTING: + if p.pa.ActiveSetting.Name == event { + event = p.pa.ActiveSetting.Value + } + } + } +} + +func (p *parser) ParsePprof() (*profile.Profile, error) { + var ( + pprof = &pprof_proto.Profile{} + prof = &profile.Profile{ + PayloadType: profile.PayloadTypePprof, + } + event string + values = [2]int64{1, 0} + ) + + t, _type, event, err := p.parseType() + if err != nil { + return nil, err + } + prof.Type = typetab[_type] + + // add sample types and units to keep the pprof valid + for i, typ := range prof.Type.SampleType { + p.appendSampleType(pprof, typ, prof.Type.SampleUnit[i]) + } + + // first process the event that was parsed by parseType(), then proceed parsing + for { + switch t { + case p.pa.TypeMap.T_EXECUTION_SAMPLE: + values[0] *= int64(p.md.period) + ts := p.pa.GetThreadState(p.pa.ExecutionSample.State) + if ts != nil && ts.Name == "STATE_RUNNABLE" { + p.addStacktrace(pprof, sampleTypeCpu, p.pa.ExecutionSample.StackTrace, values[:1]) + } + // TODO: this code is from github/grafana/pyroscope, need to validate that the query simulator handles this branch as expected for wall + if wall == event { + p.addStacktrace(pprof, sampleTypeWall, p.pa.ExecutionSample.StackTrace, values[:1]) + } + case p.pa.TypeMap.T_ALLOC_IN_NEW_TLAB: + values[1] = int64(p.pa.ObjectAllocationInNewTLAB.TlabSize) + p.addStacktrace(pprof, sampleTypeInNewTlab, p.pa.ObjectAllocationInNewTLAB.StackTrace, values[:2]) + case p.pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: + values[1] = int64(p.pa.ObjectAllocationOutsideTLAB.AllocationSize) + p.addStacktrace(pprof, sampleTypeOutsideTlab, p.pa.ObjectAllocationOutsideTLAB.StackTrace, values[:2]) + case p.pa.TypeMap.T_MONITOR_ENTER: + values[1] = int64(p.pa.JavaMonitorEnter.Duration) + p.addStacktrace(pprof, sampleTypeLock, p.pa.JavaMonitorEnter.StackTrace, values[:2]) + case p.pa.TypeMap.T_THREAD_PARK: + values[1] = int64(p.pa.ThreadPark.Duration) + p.addStacktrace(pprof, sampleTypeThreadPark, p.pa.ThreadPark.StackTrace, values[:2]) + case p.pa.TypeMap.T_LIVE_OBJECT: + p.addStacktrace(pprof, sampleTypeLiveObject, p.pa.LiveObject.StackTrace, values[:1]) + case p.pa.TypeMap.T_ACTIVE_SETTING: + if p.pa.ActiveSetting.Name == event { + event = p.pa.ActiveSetting.Value + } + } + + t, err = p.pa.ParseEvent() + if err != nil { + if io.EOF == err { + break + } + return nil, fmt.Errorf("jfr-parser ParseEvent error: %w", err) + } + } + + // assuming jfr-pprof conversion should not expand memory footprint + prof.Payload = compress.PrepareBuffer(p.maxDecompressedSizeBytes) + pprof.WriteUncompressed(prof.Payload) + return prof, nil +} + +func nopSymbolProcessor(ref *types.SymbolList) {} + +func (p *parser) addStacktrace(prof *pprof_proto.Profile, int, ref types.StackTraceRef, values []int64) { + st := p.pa.GetStacktrace(ref) + if nil == st { + return + } + + addValues := func(dst []int64) { + for i, val := range values { // value order matters + dst[i] += val + } + } + + // sum values for a stacktrace that already exist + sample := p.getSample(prof, uint32(ref)) + if sample != nil { + addValues(sample.Value) + return + } + + // encode a new stacktrace in pprof + locations := make([]*pprof_proto.Location, 0, len(st.Frames)) + for i := 0; i < len(st.Frames); i++ { + f := st.Frames[i] + + // append location that already exists + loc, found := p.getLocation(uint32(f.Method)) + if found { + locations = append(locations, loc) + continue + } + + // append new location + m := p.pa.GetMethod(f.Method) + if m != nil { + cls := p.pa.GetClass(m.Type) + if cls != nil { + clsName := p.pa.GetSymbolString(cls.Name) + methodName := p.pa.GetSymbolString(m.Name) + loc = p.appendLocation(prof, clsName+"."+methodName, uint32(f.Method)) + locations = append(locations, loc) + } + } + } + + v := make([]int64, len(values)) + addValues(v) + p.appendSample(prof, locations, v, uint32(ref)) +} + +func (p *parser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) { + prof.SampleType = append(prof.SampleType, &pprof_proto.ValueType{ + Type: typ, + Unit: unit, + }) +} + +func (p *parser) getSample(prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { + idx, ok := p.sampleMap[externStacktraceRef] + if !ok { + return nil + } + return prof.Sample[idx] +} + +func (p *parser) appendSample(prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { + sample := &pprof_proto.Sample{ + Location: locations, + Value: values, + } + p.sampleMap[externStacktraceRef] = uint32(len(prof.Sample)) + prof.Sample = append(prof.Sample, sample) +} + +func (p *parser) getLocation(externFuncId uint32) (*pprof_proto.Location, bool) { + loc, ok := p.locationMap[externFuncId] + return loc, ok +} + +func (p *parser) appendLocation(prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { + // append new function of the new location + newFunc := &pprof_proto.Function{ + ID: uint64(len(prof.Function)) + 1, // starts with 1 not 0 + Name: frame, + } + prof.Function = append(prof.Function, newFunc) + + // append new location with a single line referencing the new function, ignoring inlining without a line number + newLoc := &pprof_proto.Location{ + ID: uint64(len(prof.Location)) + 1, // starts with 1 not 0 + Line: []pprof_proto.Line{{Function: newFunc}}, + } + prof.Location = append(prof.Location, newLoc) + p.locationMap[externFuncId] = newLoc + return newLoc +} diff --git a/receiver/pyroscopereceiver/profile/profile.go b/receiver/pyroscopereceiver/profile/profile.go new file mode 100644 index 0000000..9c077f2 --- /dev/null +++ b/receiver/pyroscopereceiver/profile/profile.go @@ -0,0 +1,27 @@ +package profile + +import ( + "bytes" +) + +const ( + PayloadTypePprof = 0 +) + +type Metadata struct { + SampleRateHertz uint64 +} + +type ProfileType struct { + Type string + PeriodType string + PeriodUnit string + SampleType []string + SampleUnit []string +} + +type Profile struct { + Type ProfileType + Payload *bytes.Buffer + PayloadType uint32 +} diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 46844a5..eb2297c 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -12,6 +12,10 @@ import ( "strings" "sync" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver/jfrparser" + "github.com/metrico/otel-collector/receiver/pyroscopereceiver/profile" + promql_parser "github.com/prometheus/prometheus/promql/parser" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" @@ -35,7 +39,7 @@ type pyroscopeReceiver struct { host component.Host httpMux *http.ServeMux - decompressor *decompressor + decompressor *compress.Decompressor httpServer *http.Server shutdownWg sync.WaitGroup } @@ -47,7 +51,7 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei settings: params, logger: params.Logger, } - recv.decompressor = newDecompressor(recv.conf.Protocols.Http.MaxRequestBodySize) + recv.decompressor = compress.NewDecompressor(recv.conf.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { handleIngest(resp, req, recv) @@ -56,16 +60,20 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei } func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { + var ( + tmp []string + ok bool + ) logs := plog.NewLogs() rec := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() params := req.URL.Query() - if err := setAttrs(¶ms, &rec); err != nil { + if err := setAttrsFromParams(¶ms, &rec); err != nil { return &logs, err } // support jfr only - if tmp, ok := params["format"]; !ok || tmp[0] != "jfr" { + if tmp, ok = params["format"]; !ok || tmp[0] != "jfr" { return &logs, fmt.Errorf("unsupported format, supported: [jfr]") } @@ -76,16 +84,30 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { } defer file.Close() - buf, err := recv.decompressor.decompress(file, "gzip") + buf, err := recv.decompressor.Decompress(file, "gzip") if err != nil { return &logs, fmt.Errorf("failed to decompress body: %w", err) } resetHeaders(req) - // parse jfr + md := profile.Metadata{SampleRateHertz: 0} + tmp, ok = params["sampleRate"] + if ok { + hz, err := strconv.ParseUint(tmp[0], 10, 64) + if err != nil { + return &logs, fmt.Errorf("failed to parse rate: %w", err) + } + md.SampleRateHertz = hz + } - // TODO: avoid realloc of []byte in buf.Bytes() - rec.Body().SetEmptyBytes().FromRaw(buf.Bytes()) + prof, err := jfrparser.NewJfrParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() + if err != nil { + return &logs, fmt.Errorf("failed to parse pprof: %w", err) + } + setAttrsFromProfile(prof, &rec) + + // TODO: consider to avoid copy in FromRaw() + rec.Body().SetEmptyBytes().FromRaw(prof.Payload.Bytes()) return &logs, nil } @@ -123,7 +145,7 @@ func resetHeaders(req *http.Request) { req.ContentLength = -1 } -func setAttrs(params *url.Values, rec *plog.LogRecord) error { +func setAttrsFromParams(params *url.Values, rec *plog.LogRecord) error { var ( tmp []string ok bool @@ -133,7 +155,7 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { if tmp, ok = paramsv["from"]; !ok { return fmt.Errorf("required start time is missing") } - start, err := strconv.ParseInt(tmp[0], 10, 64) + start, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { return fmt.Errorf("failed to parse start time: %w", err) } @@ -163,7 +185,7 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { if tmp, ok = paramsv["until"]; !ok { return fmt.Errorf("required end time is missing") } - end, err := strconv.ParseInt(tmp[0], 10, 64) + end, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { return fmt.Errorf("failed to parse end time: %w", err) } @@ -171,6 +193,15 @@ func setAttrs(params *url.Values, rec *plog.LogRecord) error { return nil } +func setAttrsFromProfile(prof *profile.Profile, rec *plog.LogRecord) { + rec.Attributes().PutStr("type", prof.Type.Type) + rec.Attributes().PutStr("sample_type", strings.Join(prof.Type.SampleType, ",")) + rec.Attributes().PutStr("sample_unit", strings.Join(prof.Type.SampleUnit, ",")) + rec.Attributes().PutStr("period_type", prof.Type.PeriodType) + rec.Attributes().PutStr("period_unit", prof.Type.PeriodUnit) + rec.Attributes().PutStr("payload_type", fmt.Sprint(prof.PayloadType)) +} + func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { if req.Method != http.MethodPost { msg := fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost) @@ -189,6 +220,7 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe } // delegate to next consumer in the pipeline + // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver recv.next.ConsumeLogs(ctx, *logs) } From 6fd034a65d3924ce72d16d7a1a5eb9d7f938a360 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 5 Dec 2023 13:20:50 +0200 Subject: [PATCH 11/44] wip: test ingest --- .../pyroscopereceiver/compress/compress.go | 10 +- .../pyroscopereceiver/jfrparser/parser.go | 18 +- .../pyroscopereceiver_test.go | 48 +-- .../cortex-dev-01__kafka-0__cpu__0.jfr | Bin 0 -> 148987 bytes .../cortex-dev-01__kafka-0__cpu__0.pb | 390 ++++++++++++++++++ .../pyroscopereceiver/testdata/profile.jfr | Bin 11008 -> 0 bytes 6 files changed, 421 insertions(+), 45 deletions(-) create mode 100644 receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.jfr create mode 100644 receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb delete mode 100644 receiver/pyroscopereceiver/testdata/profile.jfr diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index fe46746..67a7d70 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -63,14 +63,14 @@ func (d *Decompressor) Decompress(r io.ReadCloser, encoding string) (*bytes.Buff func PrepareBuffer(maxDecompressedSizeBytes int64) *bytes.Buffer { var ( - buf bytes.Buffer - expectedDataSizeBytes int64 = 10e3 + buf bytes.Buffer + expectedMinDataSizeBytes int64 = 10e3 ) - if maxDecompressedSizeBytes < expectedDataSizeBytes { - expectedDataSizeBytes = maxDecompressedSizeBytes + if maxDecompressedSizeBytes < expectedMinDataSizeBytes { + expectedMinDataSizeBytes = maxDecompressedSizeBytes } // extra space to try avoid realloc where expected size fits enough - buf.Grow(int(expectedDataSizeBytes) + bytes.MinRead) + buf.Grow(int(expectedMinDataSizeBytes) + bytes.MinRead) return &buf } diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index 79d76e2..c586ec4 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -13,12 +13,12 @@ import ( "github.com/metrico/otel-collector/receiver/pyroscopereceiver/profile" ) -type meta struct { +type metadata struct { period int64 } type parser struct { - md meta + md metadata pa *jfr_parser.Parser maxDecompressedSizeBytes int64 @@ -53,15 +53,15 @@ const ( // Creates a jfr parser that parse the accepted jfr buffer func NewJfrParser(jfr *bytes.Buffer, md profile.Metadata, maxDecompressedSizeBytes int64) *parser { - var pe int64 + var period int64 if md.SampleRateHertz == 0 { - pe = 0 + period = 1 } else { - pe = 1e9 / int64(md.SampleRateHertz) + period = 1e9 / int64(md.SampleRateHertz) } pa := jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}) return &parser{ - md: meta{period: pe}, + md: metadata{period: period}, pa: pa, maxDecompressedSizeBytes: maxDecompressedSizeBytes, sampleMap: make(map[uint32]uint32), @@ -69,7 +69,7 @@ func NewJfrParser(jfr *bytes.Buffer, md profile.Metadata, maxDecompressedSizeByt } } -// Gets the type of the first data (non-settings) record, +// Gets the type of the first data record (non-settings), // which is determines the profile type because a profile should bind to a single type. // The caller should not call ParseEvent() to process the event, as it is being called internally. func (p *parser) parseType() (def.TypeID, int, string, error) { @@ -78,7 +78,7 @@ func (p *parser) parseType() (def.TypeID, int, string, error) { t, err := p.pa.ParseEvent() if err != nil { if io.EOF == err { - return def.TypeID(0), -1, "", fmt.Errorf("found zero data (non-settings) records") + return def.TypeID(0), -1, "", fmt.Errorf("found no data records (non-settings)") } return def.TypeID(0), -1, "", fmt.Errorf("jfr-parser ParseEvent error while parsing type: %w", err) } @@ -133,7 +133,7 @@ func (p *parser) ParsePprof() (*profile.Profile, error) { for { switch t { case p.pa.TypeMap.T_EXECUTION_SAMPLE: - values[0] *= int64(p.md.period) + values[0] = 1 * int64(p.md.period) ts := p.pa.GetThreadState(p.pa.ExecutionSample.State) if ts != nil && ts.Name == "STATE_RUNNABLE" { p.addStacktrace(pprof, sampleTypeCpu, p.pa.ExecutionSample.StackTrace, values[:1]) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index b5e7f7f..953081e 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -99,19 +99,18 @@ func TestPyroscopeIngest(t *testing.T) { } tests := make([]test_t, 2) - jfr := filepath.Join("testdata", "profile.jfr") - data, err := os.ReadFile(jfr) - assert.NoError(t, err, "failed to load expected jfr") - + payload, err := os.ReadFile(filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.pb")) + assert.NoError(t, err, "failed to load expected pprof payload") tests[0] = test_t{ - name: "send labeled multipart form data gzipped jfr to http ingest endpoint", + name: "send labeled multipart form data gzipped cpu jfr to http ingest endpoint", urlParams: map[string]string{ - "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", - "from": "1700332322", - "until": "1700332329", - "format": "jfr", + "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", + "from": "1700332322", + "until": "1700332329", + "format": "jfr", + "sampleRate": "100", }, - jfr: jfr, + jfr: filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.jfr"), expected: gen(&profile_t{ timestamp: 1700332322, attrs: map[string]any{ @@ -119,27 +118,14 @@ func TestPyroscopeIngest(t *testing.T) { "dc": "us-east-1", "kubernetes_pod_name": "app-abcd1234", "duration_ns": "7000000000", + "type": "process_cpu", + "sample_type": "cpu", + "sample_unit": "nanoseconds", + "period_type": "cpu", + "period_unit": "nanoseconds", + "payload_type": "0", }, - body: &data, - }), - err: nil, - } - tests[1] = test_t{ - name: "send not labeled multipart form data gzipped jfr to http ingest endpoint", - urlParams: map[string]string{ - "name": "com.example.App", - "from": "1700332332", - "until": "1700332339", - "format": "jfr", - }, - jfr: jfr, - expected: gen(&profile_t{ - timestamp: 1700332332, - attrs: map[string]any{ - "__name__": "com.example.App", - "duration_ns": "7000000000", - }, - body: &data, + body: &payload, }), err: nil, } @@ -169,7 +155,7 @@ func getAvailableLocalTcpPort(t *testing.T) string { } type profile_t struct { - timestamp int64 + timestamp uint64 body *[]byte attrs map[string]any } diff --git a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.jfr b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.jfr new file mode 100644 index 0000000000000000000000000000000000000000..f4008267c7dc2f038eda25903e683ad68f118ce1 GIT binary patch literal 148987 zcmd?S2S8Ov_CJ1S=HC0@Qfx7rDv5D7CIQ8stY)LeMALMm*-hE~x(H825m+7?-Tmz@ z7Qo(n#g2;DP?`mMFQ6h~@4Ywd|IeArqY3)3Xa6R=_s;Zk=FFLM&Ybz;o9`8cE9O7m z=(hR8Cp$p-yxgy=|50|#yeI_lzm!PKP?RZEejMF&CMB45bVP4_v0-z=!W3oZgj1`o zg;!SY*0)=J`Z23cTp$7!{`UF@7t16t^bO>$Qy0y(3Dm32! zADc~-Zs*tDt6l35uV&T|Uu$5fPaCUH1ARJJg{W4wj^O@&qCz{LPCi}%K7nn#d;$Z5 zLVZF}xL5t0pTgPJG1wZ?qD!z<7`Z8^0B>RBDOc;{6VTBrO4_UZA<*XECeZ3fDQgRN zJLvIenXIfm*|*jXK_Ol0`}u`f(O{&lCEU$04||~2+TR-BCwR50xgGl4C)B5YhoFvu zp_HelaG?N??2w!`wD9j>wFUbGQkojVDF-ZNuU&?O`g91U6xD@uF3h}zvmdgf7Z~iE z5*zx2THBz(l)jp9vzPOYPb+JHaQ6wI*`N`mf&};W7A5NEgn7t7twocDUpLR2wz>a5 zt@+Z)0Ik7KEgCf!EOg4 z2;cTCLVSGDgle^fOLKxf%m5c_Cm=$Lwjov@8q#XQwGjn)WQRB-Z%C+YsDW%Dh@hU7 z{0dm&Q9n31z~Ahju*m85tSZU`hXl3u53q)KedFKBYBod&Z||D9qa$k&E)?&Poxp;L zu@O32zRmuj1)yaCf>-wz+Bfp2Q?u-ng==mdL2an;8YnHOjfXw25gHV1#}=0sLBTnw z8o@+bLVO4VyuGUncQeex9;lh!$vI|HEY_iF{T4^SU;pqM<8{mO}t)kNP$$Y2o2iqIO$ zFN-b6x4jizw=~cG;o@ht`G)uh(~1QN$pZ-A;EqC-RIg-HOc$CF*d}|9gmd<+1cjIc zsbRAp@-_>Nttv_&Fn?o%Z1zqYO`GQofJCgO&GYB4`mu0Fn!JH-&CN;3rk}2M&>TE- z4L9)})^=k{MEz6kJd(>B!Odn<;+4;UottnW+6oLvkC82iDi^=(}OeLaJ- zmz{?_vQ&u7i4n*tv$Rk;yL`(V0g=)v7eiH=3iCSw3Cz@gjT70tiukzWn#v`b8Hl_1u<`dE$ zyP!rCB>+1nK#w2fZwrx_ppK!!RR+>>CdlQx`rkFpUcka7SY|f~dkOiKU7|jNnO2neHV6bLC?tpWxdn$hu!%u$6;@`G!0)WT+Dohktj^tm{R2G$t-qQDYBn%C zv_sYuuGymnOht&B4Gckm)z1tRdiFQ1dTew+c@q;Gb+-C;q@~teCa30mi*nyuL)!-V z5g9krdSu6zv#%-OTPX z1&cgI$rVGC0^Q@)stdC?b2VoNySBqpGAjV7bI)5Jk#&ldq~7GjvRfiUj38T1K3D7- z*>T9F2iar_+Dr20C`qN6Jii$%EWz1W^&W&_J*{LiY>m*ouxVwT0F?Ajl_FsJ?A|LIkTREUm!OTEVnC zVeWnWz}MrXG=M7~>fEV6H+C=uKl*Z`AEzIExG`FW^x{Tu84}5jp7KXHHzMSZ9^43| zwB5P!K7DuNMtS-U<3<(DjqC0uyK<$RaJt9z%gnnflR@_x1v%+kazehNfV)gj%?U|E z8t#Yh%&2V^yHdvAVtRQq{~yA#W`lA02h@%gOs{R9Xu>7oR9&xO52#7-GNz~G4BB$pj>XJaf@+-P zuq{P39M$}R5Vg=cYUNf@r?48la&fI174o6}zKIndDQ-+JO~t=n(vxD6fVXB;GHT5e zhrx+wMgkgTk&Q}xUX4PASY^W zo~fHBXLxeX@XWCf57WyM=EN{#Hri;&HpV`yHqOk`##ypO({nl-o!!|PGJI-I_%s>r zQL-h?Z*B*s6zD({GbW+~CT34UBw=>vKXoYr>A2H)rjO2EaT8=&&Xja)Zs@q&&{4Ue zW3odrX2Y2=0#&-oF&l|+!tzMj{6f&&!HMNghMhDIlSSoOz-Zr)oE1M*#tzCEr@^uT zZHPH5lUlF-YZ%;=Say}h4OFAGwUJiYFbzt`O* zSkk^Nbd&VuzeX6Eq{@Nsn%$(%Mb7lU?V0~WnEp@WUv|p${~nDco$PtB$#JJV`xl@P zJejpvKP}Yc0~ItjmwY5Pp*G7d4``K)u=z)3;zoho-;W=P&wZl z&F#yug?)c%M#&0Y6Zx_G8$0#>Hk)`8bwbv!?BQSM2}fOD8jbC3Zeq6iiy~^mNm>8g zzHK$4MD^``Xh5y5XMAeMiqFiFp2v3ed;7FhHmBtSYRc~ncUKo?jw`|M8I=eYG|m;@ zrH~4ShpUT;dhbwI5JACj8gJQy-_8^Kn(?|l_>DZluNY-ftXx8`QtnblX**noV2j~w zhf64o3$CfkckS&8fw3-3l=jIltEuMoaltT>{FCm0{{2_kJvnak7;h5-92Eu?LqKkc zN_z-9vn6x_g^hYJUZn%6GUmYu-PcAZC}sSEQ5qz!wX9X+R5z3tXfIDU1H~2&!3#+@ zf@u+G59sPnrTKf9|`qCQM5weCR80i2580yj5r-Oe$7sS*u2uA{(@v}}%^S1}J z53o%A{`ZwVezXP!(ljWul8y)<8Q8`KiRJC*K?0>SV zZyW!UO0QO@YE`dlHR~9@kW*Sc2)7Vgy?X7Bt9g9gzzA;J#RiQ_fQM{vRmh53kpRku zG~Trgl5SHBl`adF;%-2744+_sUwe$dseSOs4x_}agF8~LE>;`;Y-#Q6i&XP!kM|IjZRHVNz$ z)ZS`q7!>H+F(d>e$XF~E z{$6<#xA$q?9#Ws6Ha0Im|B!lBK&ok+Id0G*xJ8M zwkn|>=(Y8eqH~&wsQ~1}x+6W8zZHeiAY%{%Lkr7{QEiFDB($ODgnC-* zlPcCw-zrGvX|^-x7pW?;vw3yt5Fiv$&+O&b)K`x}8k*h0_8~s4L#sf*4^++5(BTm~ zW5;;2%|w}k?Fjz5#E?!vhG45NB&MbU)QiZ0c=sz3ffZ06dNj|QFeYDNrVtH<+4tIf zi)3NGv{EGKg|xD&BG;MRU2|Il zW%CUdb-4=SGxB9EB}XD(wpvv>+Cr+xS>8W~`c%cQVZJlR`?f-IJ^2%aI?E{ae|p_>i7UYLq;^z34w+Rbg0YM}CSspvHTrk)xJ3*UD^IY5k1T)+*03Gn@ z-0BHuFuNohcv_#9Xh^kUwWd7`l6<`KP;??f-d@%4pFuNt;7&oApcnyqslYr>pScCfddd^&p(YZhR&?=s$w?J~qhboRUed+K_9lE)f_`1m`b65AZ)yW9nA&z_{Fph4Gs2u{OtZg zPmtLL3zHCk^yTsE&mQ|HD}Yww6PI9nf+C39c+%`XSmlpb21yKv1UgEFaI*F^t$I9( zeRqsB1mzqTK6Zr2%7ace{V4{6Xl82@64Wsm3k2qXWNlX*uGlO`WL>$T}W3Td~en=6J$X%<5B|V?zFH*3Qy^ zt=L#(uQm@eS4>2(mkNrLNur5OUeQ}64k2%#GtSxV@8sH4Qi9K|Hy$h7vWUG#?TVn}R#@cnf zz5qQ4a6B`~wtXKvFNrK3Gjm%Qnd8pEW9EiYcu)W&aF3Z?p3H+GhkfGwQjle}d0K;m zKxiIs4su&VhSQy_Pq(m+f&QI=kdHN0LAEyjke}ItI^y=`Rxt3!j!YqZ3M|JWQKvPkSW@Jl#F&#u=96B?b zHG^G%GPjML@DeNOzz~~xv!|z6l?JrN#F(;y+FsQiIw{*^o;T`mz$+s$57&C9L;A7_46bg z_l8uZ8a^@8`NjROlZrxWAadpSUM4Ro6x@8wqkG9wf%xMxkSNo^zq8fPgH*F0dDvhs z44hh)Fa4WRlkkA9##H)>(oJFGjT=l2gF-;P<-st2b#E1w-MqQPy=za;SDm{(eRc&- z4Ztrp4{9AMHRU-v8B=ePSI1~-%4g>*>`g4~A{CB8$=}h+4@;a+{g|z7UzD#dkB4T5 zF0#;E?>saYZHPi8&16!(x+*<1mt9L~=3J65r@Q1+b5xe%?T4s(ptH=(m$^(K`b$yk z@f4W*^OanZG-z_>(X$RHzyEw* zzSKF&Ni+qQdTchUU(=vq+qYOELa$!U6AIpV%J7dIZDzhPq+Uq1Fa1EeIn$HNhDFJ* z4f(Qp+7)_LOuGtCoQXSj_G}Z_k<@!w^1dH_=w%B6k-&~pCoC%K(7z5k zsDJA&RDIN`1u@j6v-IU?b|})o$y4^QISDem{92o@^&b>jI}kYAya8q)vY3N&5~-N5 zdGxh1UopRPpcpxh^O9ss=F`{Wd_`0!vIu)Gt|U|5s4V(&IIn+@tT$^hluHv*H95ld_7w zBw5bE$R8KlL*(UTIUA`bss4l8>C4fj(9XXDa9IxJ zj#DywCVdsmUeqXb$Q{J-XDEBrYWhmaHxotE0h|ZzlMr@J<_|khUk(j`DW{@Y#?@2V zgA1~Vl$dM9=z(ue3!)-#P!A67qc2B$;1`ga|Eif^emRPZu)HL{0y%|*-H?TZ-KH-` zmt(sCf7$*i7R{54yh&TgXm6{cFsw%5}SM zZd&)N)p7MIjp|&s-Lxsg*7Zi$Um0W!ZM?RwdmZ8d14k`|t{N@mDWl zZ}+n8hK8punt(u~-aqR8#i&=Wdt9Tk?M5eLotuHc50TR6%h-BRvv-$mcXiZ&sc|TC zN$?bzvd{W2%C?J}GJEe*1a8{2S(dr$o8hQv_?98-5xDpL>vg}`w7K4|XX})0cYV(J z4ck#>Q#6UnoE0<*jgRZsZ9h^b{ON4nI)6G_ui34&?$*r6ndk3?S6*anug~1Amj_*l zkB9&?%#W3@W-MNOvll_J>lh-_Vs|I>BQWc0L~fX~dGR2EhA(6Qhu%0p1N~iOZ0SSb zz4eQtM-UjlLjWAOY}%mF1kN}^v3C+KpBYQwh@BLh5$Znu#mu8<0$L(g^SN75ZG@m zN7lHLgJO~ioc1R~-rBZ##}a~8CsFTaUc9E6 zl_K|2r58_Kxv+~MYEcR6ip|T0-3+fBZyen$o8N2l#@peQQ;m^{)ZSb3r{26nvA4cN z+EoL`jl3@-4^RUKZoQb%H3E@~(g~afBHAqiS+j;xlcJ_vpVWiE@Y;xsUAAlh<|f`4 zF_4;c@#=;nJt=avDTeV5%|wERDqI>&H%vBCt0Gv4pip(z@F~f>dMk70P>YOIY$4 z%Da0aC64Xabun-v)mU?xz=JnpmW^@kn@y5{o5``vT9|8OVmbAna^jMX&15m0F^DUBIOq#c8CB-cpO4TH69eaNjMNUYj za(hfzd2|hdG&1hi{ijAPSx1S-1t2nG&fFA0sYYfPMW&rwc?{Gb)woVgSbXcylufb; zu~hE10o|`{rpP^5&sd`?cHRb3WAZSU?$)Gn>tnZ3?16U?88v$9$sGhuTuxcfuNks3 zoj`MTPTx7*bvI?bx`Se)GKUY}L$T&C&5t>ryqCZX46(a)%h-s;0OO4t6_K`o%9Ukz z!z-s5Cr(i#5+>b=1pSFKu18TLj%RI+#R`ZswwFU>`rX|zK>0W$eiEgPy?!7QSe<6f z-c4!mjNCT_^eE1_^(jTJ?6n>^9%t;&qOM=QIduWhIL){tXT4j@sy)LAJhzb=oPPS& zd?0F^v3DA^a82a>nLyMuBccu>`yM-e2Y8xhq}-yk{g0ep20V>3?)IQsw=5VpWE{nw zYK_R)Rkw!$FVl?p!<055Y|Z4!ls0h^HR8_QNsEA(X-396iXD0}EDK0OO2=^VHeC-Nqf6PvG@slsBUHim?kQaZD;D&RTeC8}KyE7;}sg zUmUjbdOU&CK{!fS_b=bQ6L=bD42U3b?1I4=iwUIVkHoiz_XJ{MXkrLuGBzC@x{PAa z)B_ZDzQ=t)h-?ffYDCyMkike})i21HF?8^rR7x2cO~sy#h)BXFgQOB`V-L?cu#;jZ zEuz?^)6S2`Bygo{;mF=+rh!NSQ+f z(02eqn?XU*{Ph`YL9P}WM)F3 zPGGkoO9sy*FiI}q;lp}P!{T3POaQil)-79p42yrEabPK-LClRr8uEq4>h}@3W@z*o z4DmwaS{T(ceD~_17*l(}o5u7%hQ+?nxO$snqq<%X$CxfOVrNrHgOBu#T2A1ouMoLy znA}Vvj5)h0?fBs-hp@aC8hzyAxjra-0ha7SIA(rs#<<~B?&aYd;)fB~eHP`+T)XKQ)>gW)u>m6YkJxbpiz(e$Jdx5Kzcwfg z98kJ(R?hpK-9uxi5E%V8M1~FTJsayI-8e9Y()JxTeE{fqx)HygaAZx)ru~@8bmN9Q zBKIEJorTqsZVVqttzWm{%u-BNx-mJG#%0p-aVen8>BfqERMOQedonRDXPvjqr`cJY z-1npe=TZx|^jURFLNQ0Fq?3EsYy>S%H*R;O-t;`ueG2Gny0P`oh@5}y&~!{rx-p;| zRkQT&%;{SQ>~or0*gs~=P*Bix<6d1vX6;^Y*|AqFIKm+T!Fqye|bV-@Z) z<`IK5_VBQnNd&DsNadcqpEd`xyvsN}gbF%7KejKH=q}@CV?;);J1{kxpa?lG7w1oo z$E5Evwt*`HZbk1nj0L;PxIKpk;`)tMy|7@B^&G`6z85|ML~)mqB^Ue2Et9)qx87x} zT1l~IqkD#9#oCMNmb`Qh_&qc#lSU%r@PJ;J=Uqm!2hzqxtvrKiHoJqxa5HY*1_EzN zN_~BOk8YUuUB(V@SMJt>>ypzp6WFyWvhKKcIw6gqwP$HIPKR$>i=7f<+MQZ_Yw@N` ztWb17qEp6@*kgSnDrXq0enn*1^bu#l^JEz5*rdP|%)8fhDuI0h0bTEX?iRY9VT9KO zbbNX2LeTIGV^AnEcAI+iAgFYPaT;ujyY+C7WqW|aV~y>92b7g|fzW%bkwFc(v-&d8 zgnp7HfW~d|cPI>npJ%3n&edThS zIcMTU3C544#D~xAxGTXKyD0I&OTGGlG-euR;*&=gkCdRNA%tzp?MRjnr_#Z5y{Ook_QpGo;-Kuqy(|#L7iixuS-Z4dp&Jm zcdXk?W0a&8x4I4-B*DQcR8abnmE$Ft2*wB;;-f=QM@VoRk)5pmX;UP$V;7aQv`>%u5{#7eD|T%>4m!v>xeOw^T|Bo*LR7B1byY@G zrUbjULFA&a9VaBTb`eE(n-g(Of)ZU;El%tN=iv6Bi zFm>BZ6IxBJ9XO#!f&^y~hNj$%UoD~8atGcYc{)vkarKb7AnQ6qz zHudbaaJvNO)Ij9oRi_S0=r~v+ckA#OW6w)a&S~ECK}-gy?Zr7`B}84t(j9boMh=Ko zk~%70g6o?h^6K=>t0c7fBBfn5^M0xXO|-jwb^ZYfQeQ#)1|2^u!RxySTr_#)EeS42 zBaAqBe?uhptV{#+!`-@c@?GL1GmTy?kTm+{yh#!=%T2g@WR3)5B%Qo^dBhS44v(gR zh>c&rL4uS2g{)(5-QFc38VGmmq_uO7NlN{)YHVK+* zW>fODeG-)x{F67XwJ;#dy_9o zaA71NTJ*{EdlEE9KQ6UrU!1BkjqK6ClQc?#W^d!poSP;=T1A-TVW(-E8ej~Ra;f9% z_D$GAd3VUwyJGj?*%DkAM_tIAvL;D_X34{c+*~U`>H-ivV%AOx?(+bYFmT^tI|N=S ztN%p_nX78bmgRRPC|6+rDOY-LrAp0JHD%9~krFi5P28BBQzbaDI+_rb*>iz}X3A6e zw&lqw5{#rX$dq0eHcM#WF>3CLA(Qq{JtN^mEMth&WST$hl!>^DtG?!JxM zFzO^_P3w7Xpai$~AuxLXgz*wIdwO+o>MRLfCSlU8(LE9+lqdxmJ;ubZk>J`>lGrRi zy6fm{9Kd!@=zkpwww;OXHK1VV${ z9UVVKLRUvqInha}^CT!&O~$Am%Oqs>JNn9^P4=8%cebC}EujJJka5+7aVI3S*%zhW zIk)AigiJ&_f1+zQuxgn`nq>78)-4<$!N>%{$qhqJj+Nl~yEH_TqDRk^VEkTMo9DNs z#!E1~8K4bUyRVjz-gAn657`eh2HDG<(7m@QkQo6 zek9HanTEMl$E{c}OoApl-dS*bk_69#cf_3C8#PygC*rBO{S!7Vk>G~)67Mtak;pgG zAf5{ZH-2u01ZiEPy~__Dli)BHM8?GoyCR|Siz#i~i8W!6^_W`?BxIMC4wm4xp)?Ky z*A68aK!0Q6eM&rXOG4PK@XATX2q|Z|-e*aF$ZwLeWeZ~`PCXBaO_DKWzZ}CWi-zL3 zk!1A17=nH8HamV0ftN25n6+wG3QiREyrUP+iN(P&$(RoY9n!Ul+max6Niqg*Ch+{2 z!E-^p?TOcI>9z)E3N!=KP^|iEN4MZikz^!G4zBn4ZufACNHT70qu33@drqB8;Lu^z zg%x2-mM$Q0;0kKw-srGPI5r^hDq2-564&3xu_4JAO_O;zd}$K+?j&O+@n{j-jt*Kz z(1j$ziLl=Dwqj_Kj6D?)nR2)f4OB1V(giB^>WF@cYbY`tVr+NorsYGrZzOQhUl18J zYu!lTL6Wg=H8pU2M9e508j_4iNVagyoN*-*$G>D_-xdNd9v`w8!jfd;9@re5F!m;s zuq4?SE@yAs@z{+R@?>MTocOqTmk(mdlZ_=(_Oqh*$f*MeoDfBMGY4m`9!_Awcxu%C zy*)SL0FrF1Y=p?TJ!y$JeHA&Ki_2#mZyS!23i**1s3 z0VJv0H0*H3e1ayfqQ3XPIhIah$wnVZs1BxYUydP7Hb%BU&UI7Hhha#QjmLYzWnQFm6#CB=`xYobhPasJ%E)CuAf1lnLE#;xv#Tn~z3}*|q@~ zo?t}urZycH-jo1S9!# zitKu64aOzWzShH5FU7bd8dGNwessGryGM8gz%(fpnsR&XG>lWCF?kV{bP?*|fdp

wPmC`rl_IVwvo{W!MBsu9 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 literal 0 HcmV?d00001 diff --git a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb new file mode 100644 index 0000000..42e1032 --- /dev/null +++ b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb @@ -0,0 +1,390 @@ + +( +$ +  !"#$ +%&'()*+,-./0123456"#$ +789:;< 56"#$ +=>?@ABCDEFGHIJ234KLM"#$ +NOPQRSTUV56"#$ +WXYZ[\]^_`6"#$ +abcdefg 56"#$ +hijklmnopqrsM"#$ +tuvwxyz{|}~€‚LM"#$B +>ƒ„…†‡ˆ‰Š‹ŒŽ‘’_“”•–—ABCDEFGHIJ234KLM"#$B +>˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +¨©ª«¬­®¯°±²³6"#$& +"´µ¶·¸¹º» !"#$ +NOP¼½¾¿À¾Á6"#$ +ÂÃÄÅÆÇÈÉ€‚LM"#$ +ÊËÌÍÎÏÐ#$< +8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +ÔÌÍÎÏÐ#$ +ÕÖ×ØÙÚÛÜÝÞ +ßs6"#$ +àáâãhijklmnopqrs6"#$" +äåæçèéêëìíîïðñ# +789:;<  !"#$ + +òóôõöX +T÷øùúûüýþÿ€_“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñO +K‘’“”•–“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ +¨©—˜ 56"#$! +™š›œâãhyz{|žîïðñ +Ÿ ¡¢£³6"#$+ +'Š‹ŒŽâãhyz{|êëìíîïðñH +D¤¥¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +A +=“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ +ª´µ«¬­®¯°ðñ7 +3±†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ +_M"#$, +(²³´µ¶·¸æçèéêëìíîïðñ +¹ºM"#$$ + »¼½¸¾èéêëìíîïðñ& +"»¼½¸æçèéêëìíîïðñ( +$¿ÀÁÂÃľèéêëìíîïðñ) +%ÅÆÇÈÉ”•–—ABCDEFGHIJ234KLM"#$, +(ÊËÌÍÎϽ¸¾èéêëìíîïðñ$ + Ðѽ¸¾èéêëìíîïðñ( +$™šÒÓÃľèéêëìíîïðñ +ÔÕÖ×ØÙÏÐ#$ + +ÚÛö" +ÓÃľèéêëìíîïðñ1 +-ÜÝÞß³´àáSTUVâãg 56"#$9 +5„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ + +Úäöòö; +7å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ< +8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ + +æÛö( +$ÝÞß³´µçèéêëìíîïðñ6 +2éêëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$, +(îïðñòѽ¸¾èéêëìíîïðñ( +$óôõö÷øùúûü + 56"#$E +Aýþÿ€å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ +‚âãhyz{|žîïðñ +µƒ„…†‡€‚LM"#$: +6ˆ‰Š‹ŒŽîïðñòѽ¸¾èéêëìíîïðñ8 +4žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$( +$ß³´µçèéêëìíîïðñ( +$ß»¼½¸æçèéêëìíîïðñ: +6‘¨©’“¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$, +(”•ÌÍÎϽ¸¾èéêëìíîïðñ" +ij–—ÄÅÆÇÈÉ€‚LM"#$' +#˜™š›œžŸ ¡¢£¤Ñ½¥¦$+ +'W§¨úûü +  !"#$ + +©M"#$ +¨©—˜ 56"#$ +ª«¬­®¯°±²³¾´¦$ +µ¶·¸¹º~€‚LM"#$8 +4»¼½¾¿ÀÁ¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +ÂÃÄÅÆǦ$) +%ÈÉÊËÌÍÎÏР¡¢£¤Ñ½¥¦$ +ijklmnopqrsM"#$' +#˜™š›œžŸ ¡¢£¤Ñ½¥¦$ +Ñ£¤Ñ½¥¦$ +hijklmnopqrsM"#$/ ++ƒ„…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$) +%ÕÖ×ØÌÍÎÏР¡¢£¤Ñ½¥¦$ +ÙÔËÌÍÎÏÐ#$ +ÚÛÜÝÞѽ¥¦$7 +3ßàáâãäåæç•–“”•–—ABCDEFGHIJ234KLM"#$% +!艊‹ŒŽîïðñòѽ¥¦$ +M"#$$ + ß³´µƒ„…†‡€‚LM"#$ +ª«¬­®¯°±²³¾´¦$! +×ØÎÏР¡¢£¤Ñ½¥¦$ +aéêëìíîï¦$ +ÂÃÄÅÆÇÈÉ€‚LM"#$/ ++ðñ…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$L +Hòóô‹Œõö÷øùúûüýþÿ +€ âãg 56"#$ +ËÌÍÎϽ¥¦$ +‚ƒ„…×ØÙÚÛÜÝÞ! +¨©—˜ †‡ˆ56"#$' +#‰Š‹Óª«¬­®¯°±²³¾´¦$( +$ŒGHI“”•–—ABCDEFGHIJ234KLM"#$ +ŽSTUV56"#$ +‘’¶·¸¹º~€‚LM"#$9 +5“”•ˆ–—óôõö÷øù˜™ü¹º»†‡ˆ56"#$% +!ßij–—ÄÅÆÇÈÉ€‚LM"#$" +ij–—ÄÅÆÇÈÉ€‚LM"#$ + šCD234LM"#$' +#›¦§“”•–—ABCDEFGHIJ234KLM"#$ + ÌÍÎÏÐ#$: +6œžŸ ¡¢£¤¥¦§_É”•–—ABCDEFGHIJ234KLM"#$: +6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +aéꩪ«¬~€‚LM"#$ +¨©ª«¬­®¯°±²³6"#$% +!•–“”•–—ABCDEFGHIJ234KLM"#$ +­ÌÍÎÏÐ#$ + aéêëì®#$% +!¯°±²³´STUV !"#$ +µ¶·¾¸¹_º»M"#$ +ÕÖ×ØÙÚÛÜÝÞ +¼âãhyz{|}~½STUV56"#$ +>?@¾¿56"#$ + +¾À³6"#$ +ÎÏÐ#$! +¨©ª«¬­ÁÂÃÄÅîï¦$ +W§ÆÇÈÉÊËѽ¥¦$( +$89:;<ÌÓª«¬­®¯°±²³¾´¦$ +ÍΦ$ +Ïл¼Ñ£¤Ñ½¥¦$ +¥¦$ +›œžŸ¡¢£¤Ñ½¥¦$ +ÒÓÔÕÖ×ØÙÚÛܦ$ + £¤Ñ½¥¦$) +%‰ŠÝš›œžŸ ¡¢£¤Ñ½¥¦$ +ÞßàáâãäåÙÚÛܦ$ + æçè½¥¦$ +ÔÕÖ×ØÙéêÙÚÛܦ$ + ëòѽ¥¦$ +ìéêÙÚÛܦ$ + ß»¼½¥¦$ +íëìíîï¦$ +OPîïðÌÍÎϽ¥¦$ +ñòóôõÚÛÜÝÞ +öò÷ôõÚÛÜÝÞ +øùúûÚÛÜÝÞ +ü”•ÌÍÎϽ¥¦$ +ý¡¢£¤Ñ½¥¦$! +þÿßàáâãäåÙÚÛܦ$% +!€Óª«¬­®¯°±²³¾´¦$) +%‚ƒ„Óª«Ô¬­®¯°±²³¾´¦$ + £¤Ñ½¥¦$ + ѽ¥¦$ +îïðñòѽ¥¦$ + л¼½¥¦$ +ÕÖ×ØÙéêÙÚÛܦ$# +„Óª«¬­®¯°±²³¾´¦$ + ѽ¥¦$ +ÊËÌÍÎϽ¥¦$ +…ÔÕÖ×ØÙÚÛܦ$# +„Óª«¬­®¯°±²³¾´¦$ +½¥¦$! +­†ÕÖ×ØÙéêÙÚÛܦ$+ +'‡ˆ‰Š‹ŒÞßàáâãäåÙÚÛܦ$# +„Óª«¬­®¯°±²³¾´¦$! +†ÕÖ×ØÙéêÙÚÛܦ$ +Ž²³¾´¦$% +!˜™š›œžŸ¡¢£¤Ñ½¥¦$ + ÙÚÛܦ$# +š›œžŸ ¡¢£¤Ñ½¥¦$' +#‰Š‹Óª«¬­®¯°±²³¾´¦$ + »¼½¥¦$ +‘’“”•–—ÙÚÛܦ$ +ˆ˜™šðÌÍÎϽ¥¦$% +!ˆ‰Š‹ŒŽîïðñòѽ¥¦$ +W§›œ°±²³¾´¦$) +%‰Š‹Óª«Ô¬­®¯°±²³¾´¦$ +ÎÏР¡¢£¤Ñ½¥¦$# +ËÌžŸ ¡¢éêÙÚÛܦ$ +‡ˆ‰Š‹£¤Ñ½¥¦$/ ++£ƒ„Óª«¤¥¦¬­®¯°±²³¾´¦$ +§¨þÿ€©ªñòѽ¥¦$# +‰Š«ŒŽîïðñòѽ¥¦$ +ü”•ÌÍÎϽ¥¦$ +ñò÷óôõÚÛÜÝÞ +öòôõÚÛÜÝÞ +¬úûÚÛÜÝÞ +ÚÛÜÝѽ¥¦$ +­®ò÷óôõÚÛÜÝÞ +¯óôõÚÛÜÝÞ +°øùúûÚÛÜÝÞ3 +/±²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$G +CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y +UÎÏÐÑÒÓÔÕÖ×ØÙÚ×ØÛÜÝÞßàáâ㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E +AÈÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y +UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$ = +9ÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 +-äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;ÈÇÆËÌÍ´µµµµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 +/æçè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 +-çè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;éûüýþêëìí´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I +EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$= +9îïðñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$G +CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 +/öôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y +UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5÷ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c +_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÆÇÈÉÆÇÈÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a +]ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?÷ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$; +7ÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5ùñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$; +7ÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$) +%úûüýþÿ€½¾¿ÀÁÀÂÀÃÄÅ$' +#‚ƒ„…†‡ˆ¿ÀÁÀÂÀÃÄÅ$1 +-ÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3÷ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$e +aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$e +aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q +MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 +/‰Š‹´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +G÷ÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$O +KÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$S +OÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$U +QÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$= +9ÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I +EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$O +KÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$[ +W÷ÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$S +O÷ÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$ +ŒØÙÚÛÜÝÞ> +:Ž‘Pî’“”•–·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q +MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=÷ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q +MÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c +_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 +/—˜™â㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$- +)˜µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I +EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c +_ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 +-äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$6 +2W§š›œž¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a +]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 +/Ÿ ¡´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 +-Ÿ ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a +]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I +EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? +;¢£¤¥¦§¨äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C +?÷ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 +5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$/ ++í´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$% +!©ª«¬­½¾¿ÀÁÀÂÀÃÄÅ$ +®ÕÖ×ØÙÚÛÜÝÞ +89:;<¯¹º»†‡ˆ56"#$) +%°±•–“”•–—ABCDEFGHIJ234KLM"#$( +$²³Þß³´µƒ„…†‡€‚LM"#$! +´µ¶·¸¹º¬~€‚LM"#$ +†‡€‚LM"#$D +@¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +ª´µ« !"#$# +´µ¶·¸¹º»†‡ˆ56"#$ +»¼½¾1234LM"#$ +¿Ž|ÀÁÂÃLM"#$" +OPÄÅƾÇÈ_É~€‚LM"#$: +6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ + _º»M"#$- +)ÊËÌÍâãhyz{Ζ—ABCDEFGHIJ234KLM"#$' +#ëìÏSTUVâãg 56"#$ +ÐÕÖ×ØÙÚÛÜÝÞ + 56"#$Ñö# +aéêëìÒ +€ 56"#$ +´µÓABCDEFGHIJ234KLM"#$óö2 +.ßÔÕÖ×غ¬~STUVâãg 56"#$ +´¬~€‚LM"#$4 +0êëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$8 +4æÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +ܼ½¾1234LM"#$ +ÝÞßàṺM"#$ +âëã 56"#$ +ääåæˆ56"#$@ +<™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ + +çM"#$# +=>?èéêëìíˆ56"#$> +:©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$B +>˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ + 123456"#$! +Ž´µÓABCDEFGHIJ234KLM"#$ +"#$5 +1ñ…†‡ˆ–ïðñò”•–—ABCDEFGHIJ234KLM"#$ +󃄅×ØÙÚÛÜÝÞ +¹º» !"#$" +OPÄÅƾÇÈ_É~€‚LM"#$8 +4ÛÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +ÊôÌÍÎÏÐ#$% +!Žõö´µ¶÷øùCD23456"#$5 +1ëìú—óôõö÷øù˜™ü¹º»†‡ˆ56"#$" +ß³´µƒ„…†‡€‚LM"#$2 +.ðñ…†‡óôõö÷øùúûü + 56"#$ +ûü¾¿56"#$ +6"#$ + ýþÿ_`6"#$ +]^_`6"#$' +#€‚STUVâãg 56"#$ +ƒ„ABCDEFGHIJ234KLM"#$+ +'…†‡ˆÈÉ”•–—ABCDEFGHIJ234KLM"#$ +‰ýþÿ + 56"#$ +ßáâãhijklmnopqrsM"#$( +$Š´µ¶·¸¹º» !"#$H +D‹ö÷øùÝÞßàáýþÿ +€ âãg 56"#$ +ŒM"#$- +)óôõö÷øù˜™ü¹º»†‡ˆ56"#$ + +M"#$ +Ž + 56"#$ +s6"#$/ ++úûü +€ âãg 56"#$ +Ú !"#$) +%´µ¶‘’“”•–¾—˜¾‚STUV56"#$ + 56"#$% +!™šyz{ΛœžŸg 56"#$ + ÁÂÃÄÅ¡¢¾£¤_M"#$ +¥¦„…×ØÙÚÛÜÝÞ +´µ¶·¸ 56"#$ +§¨¶·¸¹º~€‚LM"#$# +©ª«CD234 !"#$! +¬›œâãhyz{|}~€‚LM"#$""""""""""""""""" " " +" +" " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬******* * +*  * + *  * * ***************** *!* "*!#*"$*#%*$&*%'*&(*')*(**)+**+*+,*,-*-.*./*/0*00*11*22*33*44*55*66*77*88*99*::*;;*<<*==*>>*?>*@?*A@*BA*CB*DC*ED*FE*GF*HG*IH*JI*KJ*LK*ML*NM*ON*PO*QP*RQ*SR*TS*UT*VU*WV*XW*YX*ZY*[Z*\[*]\*^]*_^*`_*a`*ba*cb*dc*ed*fe*gf*hg*ih*ji*kj*lj*mk*nl*om*pn*qo*rp*sq*tr*us*vt*wu*xv*yw*zx*{y*|z*}{*~|*}*€~**‚€*ƒ*„‚*…ƒ*†„*‡…*ˆ†*‰‡*Šˆ*‹ˆ*Œ‰*Š*Ž‹*Œ**‘Ž*’*“*”‘*•’*–“*—”*˜•*™–*š—*›˜*œ™*š*žš*Ÿ›* œ*¡*¢*£ž*¤Ÿ*¥ *¦¡*§¢*¨£*©¤*ª¥*«¦*¬§*­¨*®©*¯ª*°«*±¬*²­*³®*´¯*µ°*¶±*·²*¸³*¹´*ºµ*»¶*¼·*½¸*¾¹*¿º*À»*Á¼*½*ý*ľ*Å¿*ÆÀ*ÇÁ*ÈÁ*ÉÁ*ÊÂ*ËÃ*ÌÄ*ÍÅ*ÎÆ*ÏÇ*ÐÈ*ÑÉ*ÒÊ*ÓË*ÔÌ*ÕÍ*ÖÎ*×Ï*ØÐ*ÙÑ*ÚÒ*ÛÓ*ÜÔ*ÝÕ*ÞÖ*ßr*à×*áØ*âÙ*ãÚ*äÛ*åÜ*æÝ*çÞ*èß*éà*êá*ëâ*ìã*íä*îå*ïæ*ðç*ñè*òé*óê*ôë*õì*öí*÷î*øï*ùð*úñ*ûò*üó*ýô*þõ*ÿö*€÷*ø*‚ù*ƒú*„û*…ü*†ý*‡þ*ˆÿ*‰€*Š*‹‚*Œƒ*„*Ž…*†*‡*‘ˆ*’‰*“Š*”‹*•Œ*–*—Ž*˜*™*š*›‘*œ‘*’*ž“*Ÿ”* ”*¡•*¢–*£—*¤˜*¥™*¦š*§›*¨œ*©–*ª*«ž*¬Ÿ*­ *®¡*¯¢*°£*±¤*²¥*³¦*´§*µ¨*¶©*·ª*¸«*¹¬*º­*»®*¼¯*½°*¾±*¿²*À³*Á´*µ*õ*Ķ*Å·*Ƹ*ǹ*Ⱥ*É»*ʼ*˽*̾*Í¿*ÎÀ*ÏÁ*ÐÂ*ÑÃ*ÒÄ*ÓÄ*ÔÅ*ÕÆ*ÖÇ*×È*ØÉ*ÙÊ*ÚË*ÛÌ*ÜÍ*ÝÎ*ÞÏ*ßÐ*àÑ*áÒ*âÓ*ãÔ*äÕ*åÖ*æ×*çØ*èÙ*éÚ*êÛ*ëÜ*ìÝ*íÞ*îß*ïà*ðá*ñâ*òã*óä*ôå*õæ*öç*÷è*øé*ùê*úë*ûì*üí*ýî*þï*ÿð*€ñ*ò*‚r*ƒó*„ô*…õ*†ö*‡÷*ˆø*‰ù*Šú*‹û*Œü*ü*Žý*¥*þ*‘ÿ*’€*“*”‚*•ƒ*–„*—„*˜…*™†*š‡*›‡*œˆ*‰*žŠ*Ÿ‹* Œ*¡*¢Ž*£*¤*¥‘*¦’*§“*¨”*©•*ª–*«—*¬˜*­™*®š*¯›*°œ*±*²ž*³Ÿ*´ *µr*¶¡*·¢*¸£*¹¤*º¥*»¦*¼§*½¨*¾©*¿ª*À«*Á¬*­*î*į*Å°*Ʊ*Dz*ȳ*É´*ʵ*˶*Ì·*͸*ι*Ϻ*л*Ѽ*Ò½*Ó–*Ô—*Õ¾*Ö¿*×À*ØÁ*ÙÂ*ÚÃ*ÛÄ*ÜÅ*ÝÆ*ÞÇ*ßÈ*àÉ*áÊ*âË*ã‡*ä‡*åÌ*æÍ*çÎ*èÏ*éÐ*êÑ*ëÒ*ìÓ*íÔ*îÕ*ïÖ*ð×*ñØ*òÙ*óÚ*ôÛ*õü*öÜ*÷Ý*øÞ*ùß*úà*ûá*üâ*ýã*þä*ÿå*€æ*ç*‚è*ƒé*„ê*…ë*†ì*‡í*ˆî*‰ï*Šð*‹ñ*Œò*ó*Žô*õ*ö*‘÷*’ø*“ù*”ú*•û*–ü*—ý*˜þ*™ÿ*š€*›*œ‚*ƒ*ž„*Ÿ…* †*¡‡*¢ˆ*£‰*¤Š*¥‹*¦Œ*§*¨Ž*©*ª*«‘*¬|*­’*®“*¯r*°”*±•*²–*³—*´˜*µ™*¶š*·›*¸œ*¹*ºž*»Ÿ*¼ *½¡*¾¢*¿£*À¤*Á¥*¦*ç*Ĩ*Ũ*Æ©*Ǫ*È«*ɬ*Ê­*Ë®*̯*Í°*α*ϲ*г*Ñ´*Òµ*Óµ*Ô¶*Õ·*Ö¸*×¹*غ*Ù»*Ú¼*Û½*ܾ*Ý¿*ÞÀ*ßÁ*àÂ*áÃ*âÄ*ãÅ*äÆ*åÇ*æÈ*çÉ*èÊ*éË*êÌ*ëÍ*ìÎ*íÏ*îÐ*ïÑ*ðÒ*ñÓ*òÔ*óÕ*ôÖ*õ×*öØ*÷Ù*øÚ*ùÛ*úÜ*ûÝ*üÞ*ýr*þ¥*ÿß*€à*á*‚â*ƒã*„ä*…å*†æ*‡ç*ˆè*‰è*Šé*‹é*Œê*ë*Žì*í*î*‘ï*’ð*“ñ*”ò*•ó*–ô*—ô*˜õ*™ö*š÷*›ø*œù*ú*žû*Ÿ­* ü*¡ý*¢þ*£ÿ*¤€*¥*¦‚*§ƒ*¨„*©…*ª†*«‡*¬ˆ*­‰*®Š*¯‹*°Œ*±*²Ž*³*´*µ‘*¶’*·“*¸”*¹•*º–*»—*¼—*½˜*¾™*¿š*À›*Áœ*Â*Þ*ÄŸ*Å *Æ¡*Ç¢*È£*ɤ*Ê¥*˦*̧*ͨ*Ω*Ϫ*Ы*Ѭ*Ò­*Ó®*Ô¯*Õ°*Ö±*ײ*س*Ù´*Úµ*Û¶*Ü·*Ý·*Þ¸*ß¹*àº*á»*â¼*ã½*äï*åð*æï*çð*è¾*é¿*êÀ*ëÁ*ìÂ*íÃ*îÄ*ïÅ*ðÅ*ñÆ*òÇ*óÇ*ôÈ*õð*öÉ*÷¥*øÊ*ùË*úÌ*ûÌ*üÍ*ýÍ*þÎ*ÿÏ*€Ð*Ñ*‚Ò*ƒÓ*„Ó*…Ô*†Õ*‡Ö*ˆ×*‰Ø*ŠÙ*‹Ú*ŒÛ*Ü*ŽÝ*Þ*ß*‘à*’á*“â*”ã*•ä*–å*—æ*˜ç*™è*šé*›ê*œë*ì*ží*Ÿî* ï*¡ð*¢ñ*£ò*¤ó*¥ô*¦õ*§ö*¨ö*©÷*ªø*«Í*¬Î*­ù*®ú*¯û*°ü*±ý*²þ*³ÿ*´€*µ*¶‚*·ƒ*¸„*¹…*º†*»r*¼‡*½ˆ*¾‰*¿Š*À‹*ÁŒ*Â*ÃŽ*Ä*Å*Æ‘*Ç’*È“*É”*Ê•*Ë–*Ì—*͘*Ι*Ïš*Л*Ñœ*Ò*Óž*ÔŸ*Õ *Ö¡*×¢*Ø£*Ù¤*Ú¥*Û¦*ܧ*ݨ*Þ¨*ß©*à©*áª*â«*ã¬*ä­*å®*æ¯*ç°*è±*é²*ê³*ë´*ìµ*í¶*î·*ï¸*ð¹*ñº*ò»*ó¼*ô½*õ¾*ö¿*÷À*øÁ*ùÂ*úÃ*ûÄ*üÅ*ýÆ*þÇ*ÿÇ*€È*É*‚Ê*ƒË*„Ì*…Í*†Î*‡Ï*ˆÐ*‰Ñ*ŠÒ*‹Ó*ŒÔ*Õ*ŽÖ*×*Ø*‘Ù*’Ú*“Û*”Ü*•Ý*–Þ*—ß*˜à*™á*šâ*›ã*œä*å*žæ*Ÿç* è*¡é*¢ê*£ë*¤ì*¥í*¦î*§ï*¨ð*©ñ*ªò*«ó*¬ô22cpu2 nanoseconds23java/util/concurrent/ConcurrentSkipListMap.findNear28java/util/concurrent/ConcurrentSkipListMap.findNearEntry25java/util/concurrent/ConcurrentSkipListMap.floorEntry2 kafka/log/LogSegments.floorEntry2"kafka/log/LogSegments.floorSegment2"kafka/log/LocalLog.$anonfun$read$22kafka/log/LocalLog.read2kafka/log/UnifiedLog.read2#kafka/cluster/Partition.readRecords2*kafka/cluster/Partition.readFromLocalLog$12/kafka/cluster/Partition.$anonfun$fetchRecords$12$kafka/cluster/Partition.fetchRecords2"kafka/server/ReplicaManager.read$127kafka/server/ReplicaManager.$anonfun$readFromLocalLog$72Akafka/server/ReplicaManager$$Lambda$1256.0x00000008015431d0.apply2/scala/collection/mutable/ResizableArray.foreach20scala/collection/mutable/ResizableArray.foreach$2,scala/collection/mutable/ArrayBuffer.foreach2,kafka/server/ReplicaManager.readFromLocalLog2$kafka/server/DelayedFetch.onComplete2+kafka/server/DelayedOperation.forceComplete2%kafka/server/DelayedFetch.tryComplete28kafka/server/DelayedOperation.$anonfun$safeTryComplete$12-kafka/server/DelayedOperation.safeTryComplete2Bkafka/server/DelayedOperationPurgatory$Watchers.tryCompleteWatched27kafka/server/DelayedOperationPurgatory.checkAndComplete24kafka/server/ReplicaManager.$anonfun$appendRecords$62Akafka/server/ReplicaManager$$Lambda$1425.0x000000080158b1d0.apply2+scala/collection/immutable/Map$Map1.foreach24kafka/server/ReplicaManager.$anonfun$appendRecords$52Hkafka/server/ReplicaManager$$Lambda$1397.0x0000000801585fc0.apply$mcV$sp2+kafka/server/ActionQueue.tryCompleteActions2.kafka/server/ReplicaManager.tryCompleteActions2kafka/server/KafkaApis.handle2$kafka/server/KafkaRequestHandler.run2java/lang/Thread.run2(scala/collection/AbstractIterable.2#scala/collection/AbstractSeq.2+scala/collection/mutable/AbstractSeq.2.scala/collection/mutable/AbstractBuffer.2+scala/collection/mutable/ArrayBuffer.20scala/collection/mutable/ArrayBuffer$.newBuilder2Bscala/collection/generic/GenericTraversableTemplate.genericBuilder2Cscala/collection/generic/GenericTraversableTemplate.genericBuilder$23scala/collection/AbstractTraversable.genericBuilder2Hscala/collection/generic/GenTraversableFactory$GenericCanBuildFrom.apply2*scala/collection/TraversableLike.builder$12$scala/collection/TraversableLike.map2%scala/collection/TraversableLike.map$2(scala/collection/AbstractTraversable.map2)kafka/server/ReplicaManager.fetchMessages2)kafka/server/KafkaApis.handleFetchRequest2java/lang/ref/Reference.clear2+java/lang/ThreadLocal$ThreadLocalMap.remove2java/lang/ThreadLocal.remove2Gjava/util/concurrent/locks/ReentrantReadWriteLock$Sync.tryReleaseShared2Cjava/util/concurrent/locks/AbstractQueuedSynchronizer.releaseShared2Ajava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.unlock26java/util/concurrent/ConcurrentHashMap.computeIfAbsent2kafka/utils/Pool.getAndMaybePut2(kafka/server/BrokerTopicStats.topicStats27kafka/server/ReplicaManager.$anonfun$appendToLocalLog$62Akafka/server/ReplicaManager$$Lambda$1372.0x000000080156e380.apply2/scala/collection/TraversableLike.$anonfun$map$12Escala/collection/TraversableLike$$Lambda$143.0x00000008011ad8d8.apply23scala/collection/mutable/HashMap.$anonfun$foreach$12Escala/collection/mutable/HashMap$$Lambda$182.0x00000008011e50b0.apply2/scala/collection/mutable/HashTable.foreachEntry20scala/collection/mutable/HashTable.foreachEntry$2-scala/collection/mutable/HashMap.foreachEntry2(scala/collection/mutable/HashMap.foreach2,kafka/server/ReplicaManager.appendToLocalLog2)kafka/server/ReplicaManager.appendRecords2+kafka/server/KafkaApis.handleProduceRequest2java/util/HashMap.resize2java/util/HashMap.putVal2java/util/HashMap.put25kafka/server/KafkaApis.$anonfun$handleFetchRequest$1522:scala/collection/convert/Wrappers$JMapWrapperLike.iterator2;scala/collection/convert/Wrappers$JMapWrapperLike.iterator$26scala/collection/convert/Wrappers$JMapWrapper.iterator2%scala/collection/IterableLike.foreach2&scala/collection/IterableLike.foreach$2)scala/collection/AbstractIterable.foreach2Cscala/collection/compat/MapExtensionMethods$.foreachEntry$extension2/kafka/network/RequestChannel.updateErrorMetrics2)kafka/network/RequestChannel.sendResponse2-kafka/server/KafkaApis.sendResponseCallback$226kafka/server/KafkaApis.$anonfun$handleProduceRequest$92>kafka/server/KafkaApis.$anonfun$handleProduceRequest$9$adapted2org/apache/kafka/common/record/DefaultRecord.readPartiallyFrom2@org/apache/kafka/common/record/DefaultRecordBatch$1.doReadRecord2Oorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.readNext2Eorg/apache/kafka/common/record/DefaultRecordBatch$RecordIterator.next2#java/util/Iterator.forEachRemaining2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$12>kafka/log/LogValidator$$$Lambda$1377.0x000000080156f840.accept2Bkafka/log/LogValidator$.validateMessagesAndAssignOffsetsCompressed28kafka/log/LogValidator$.validateMessagesAndAssignOffsets2"scala/runtime/BoxesRunTime.equals22!scala/runtime/BoxesRunTime.equals2-scala/collection/mutable/HashTable.elemEquals2.scala/collection/mutable/HashTable.elemEquals$2+scala/collection/mutable/HashMap.elemEquals2-scala/collection/mutable/HashTable.findEntry02,scala/collection/mutable/HashTable.findEntry2-scala/collection/mutable/HashTable.findEntry$2*scala/collection/mutable/HashMap.findEntry2$scala/collection/mutable/HashMap.get2"kafka/server/FetchSessionCache.get2$kafka/server/FetchManager.newContext2*java/util/concurrent/ConcurrentHashMap.get2kafka/utils/Pool.get2(kafka/server/ReplicaManager.getPartition2/kafka/server/ReplicaManager.getPartitionOrError23kafka/server/ReplicaManager.getPartitionOrException20kafka/server/DelayedFetch.$anonfun$tryComplete$128kafka/server/DelayedFetch.$anonfun$tryComplete$1$adapted2?kafka/server/DelayedFetch$$Lambda$1310.0x000000080155b328.apply2;org/apache/kafka/common/requests/FetchRequest.lambda$null$22Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1246.0x0000000801540648.accept2java/util/ArrayList.forEach2@org/apache/kafka/common/requests/FetchRequest.lambda$fetchData$32Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1245.0x0000000801540410.accept27org/apache/kafka/common/requests/FetchRequest.fetchData2kafka/cluster/Partition.appendRecordsToFollowerOrFutureReplica26kafka/server/ReplicaFetcherThread.processPartitionData2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$72Gkafka/server/AbstractFetcherThread$$Lambda$950.0x00000008014a1400.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$62Ikafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$6$adapted2Gkafka/server/AbstractFetcherThread$$Lambda$948.0x00000008014b7848.apply2Akafka/utils/Implicits$MapExtensionMethods$.$anonfun$forKeyValue$12Gkafka/server/AbstractFetcherThread$$Lambda$949.0x00000008014a1800.apply2Dscala/collection/compat/MapExtensionMethods$.$anonfun$foreachEntry$12Qscala/collection/compat/MapExtensionMethods$$$Lambda$621.0x00000008014070b8.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$52"kafka/log/LazyIndex.$anonfun$get$12kafka/log/LazyIndex.get2 kafka/log/LogSegment.offsetIndex2/kafka/log/LogSegment.canConvertToRelativeOffset2(kafka/log/LogSegment.ensureOffsetInRange2kafka/log/LogSegment.append2kafka/log/LocalLog.append2scala/Option.contains20kafka/server/ReplicaManager.hasConsistentTopicId2Ajava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1.next2>scala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.next2,kafka/server/RemoteLeaderEndPoint.buildFetch28kafka/server/AbstractFetcherThread.$anonfun$maybeFetch$12#kafka/server/EvictableKey.compareTo2java/util/TreeMap.getEntry2java/util/TreeMap.remove2$kafka/server/FetchSessionCache.touch2H./tmp/snappy-1.1.8-d1f9bd24-4cc8-4571-b71c-1698b83f1af1-libsnappyjava.so2,org/xerial/snappy/SnappyNative.rawUncompress2&org/xerial/snappy/Snappy.rawUncompress2#org/xerial/snappy/Snappy.uncompress20org/xerial/snappy/SnappyInputStream.hasNextChunk2.kafka/server/TopicPartitionOperationKey.equals2Bkafka/server/DelayedOperationPurgatory.$anonfun$checkAndComplete$12Ckafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$12Kkafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$1$adapted2@kafka/server/ReplicaManager$$Lambda$984.0x00000008014c61b0.apply28kafka/server/ReplicaManager.completeDelayedFetchRequests2>kafka/server/ReplicaFetcherThread.completeDelayedFetchRequests2)java/util/Collections$UnmodifiableMap.get2 .vtable stub26java/util/stream/ReduceOps$ReduceOp.evaluateSequential2*java/util/stream/AbstractPipeline.evaluate2*java/util/stream/ReferencePipeline.collect2Porg/apache/kafka/clients/ClusterConnectionStates.nodesWithConnectionSetupTimeout2@org/apache/kafka/clients/NetworkClient.handleTimedOutConnections2+org/apache/kafka/clients/NetworkClient.poll22org/apache/kafka/common/requests/RequestUtils.flag2Eorg/apache/kafka/common/requests/RequestUtils.hasTransactionalRecords25org/apache/kafka/common/metrics/Sensor.recordInternal2-org/apache/kafka/common/metrics/Sensor.record2-org/apache/kafka/common/network/Selector.poll2:org/apache/kafka/clients/NetworkClientUtils.sendAndReceive2Corg/apache/kafka/common/message/ApiMessageType.requestHeaderVersion2=org/apache/kafka/common/protocol/ApiKeys.requestHeaderVersion21org/apache/kafka/clients/ClientRequest.makeHeader2-org/apache/kafka/clients/NetworkClient.doSend2+org/apache/kafka/clients/NetworkClient.send2'libpthread-2.31.so.__pthread_mutex_lock2#libjvm.so.ObjectMonitor::ExitEpilog25libjvm.so.SharedRuntime::complete_monitor_unlocking_C2?kafka/message/BrokerCompressionCodec$.getTargetCompressionCodec2.kafka/log/UnifiedLog.analyzeAndValidateRecords2libc-2.31.so.epoll_wait2sun/nio/ch/EPoll.wait2%sun/nio/ch/EPollSelectorImpl.doSelect2'sun/nio/ch/SelectorImpl.lockAndDoSelect2sun/nio/ch/SelectorImpl.select2/org/apache/kafka/common/network/Selector.select2Worg/apache/kafka/common/network/Selector$SelectorMetrics.maybeRegisterConnectionMetrics2:org/apache/kafka/common/network/Selector.pollSelectionKeys2;org/apache/kafka/common/requests/FetchRequest$Builder.build2(libpthread-2.31.so.__pthread_cond_signal2jdk/internal/misc/Unsafe.unpark2-java/util/concurrent/locks/LockSupport.unpark2@java/util/concurrent/locks/AbstractQueuedSynchronizer.signalNext2=java/util/concurrent/locks/AbstractQueuedSynchronizer.release2/java/util/concurrent/locks/ReentrantLock.unlock29libjvm.so.G1BarrierSetRuntime::write_ref_array_post_entry2.jint_disjoint_arraycopy_avx32-java/util/stream/ReferencePipeline$3$1.accept29java/util/ArrayList$ArrayListSpliterator.forEachRemaining2*java/util/stream/AbstractPipeline.copyInto21java/util/stream/AbstractPipeline.wrapAndCopyInto2#java/util/stream/IntPipeline.reduce2 java/util/stream/IntPipeline.sum23kafka/cluster/DelayedOperations.checkAndCompleteAll22kafka/cluster/Partition.tryCompleteDelayedRequests2.checkcast_arraycopy_uninit2Fkafka/server/ReplicaFetcherThread$$Lambda$951.0x00000008014bc000.apply2"libjvm.so.G1BarrierSet::invalidate27org/apache/kafka/common/requests/FetchResponse.topicIds2;org/apache/kafka/clients/FetchSessionHandler.handleResponse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$32=kafka/log/LogValidator$$$Lambda$1384.0x000000080157d750.apply2scala/Option.orElse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$22>kafka/log/LogValidator$$$Lambda$1379.0x00000008015772a8.accept2kafka/cluster/Partition$$Lambda$1261.0x0000000801543d98.accept2java/util/Optional.ifPresent2java/lang/Long.getChars2&java/lang/AbstractStringBuilder.append2java/lang/StringBuilder.append2Akafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$32Ikafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$3$adapted2@org/apache/kafka/common/requests/ProduceResponse.lambda$toData$12Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1412.0x0000000801582dc0.accept2java/util/Map.forEach27org/apache/kafka/common/requests/ProduceResponse.toData27org/apache/kafka/common/requests/ProduceResponse.2libpthread-2.31.so.__libc_read2!sun/nio/ch/SocketDispatcher.read02 sun/nio/ch/SocketDispatcher.read2&sun/nio/ch/IOUtil.readIntoNativeBuffer2sun/nio/ch/IOUtil.read2!sun/nio/ch/SocketChannelImpl.read2*java/util/stream/AbstractPipeline.wrapSink2+org/xerial/snappy/Snappy.uncompressedLength2java/io/FilterInputStream.read2Zorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.ensureNoneRemaining2sun/nio/ch/EPoll.ctl2/sun/nio/ch/EPollSelectorImpl.processUpdateQueue2;scala/collection/immutable/Map$MapBuilderImpl.$plus$plus$eq2%sun/nio/ch/FileDispatcherImpl.writev02"sun/nio/ch/SocketDispatcher.writev2sun/nio/ch/IOUtil.write2"sun/nio/ch/SocketChannelImpl.write2%java/nio/channels/SocketChannel.write2=org/apache/kafka/common/network/PlaintextTransportLayer.write26org/apache/kafka/common/network/ByteBufferSend.writeTo27org/apache/kafka/common/record/MultiRecordsSend.writeTo23org/apache/kafka/common/network/NetworkSend.writeTo22org/apache/kafka/common/network/KafkaChannel.write2.org/apache/kafka/common/network/Selector.write25org/apache/kafka/common/network/Selector.attemptWrite2kafka/network/Processor.poll2kafka/network/Processor.run2java/util/HashMap.get2/org/apache/kafka/common/protocol/Errors.forCode2java/lang/String.equals2;com/yammer/metrics/stats/ExponentiallyDecayingSample.update2(com/yammer/metrics/core/Histogram.update2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$12Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$1$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1108.0x00000008014fef50.apply2'scala/collection/immutable/List.foreach29kafka/network/RequestChannel$Request.updateRequestMetrics2,kafka/network/Processor.updateRequestMetrics28kafka/network/Processor.$anonfun$processCompletedSends$12=kafka/network/Processor$$Lambda$988.0x00000008014c6c38.accept2-kafka/network/Processor.processCompletedSends26org/apache/kafka/common/protocol/SendBuilder.buildSend2>org/apache/kafka/common/protocol/SendBuilder.buildResponseSend28org/apache/kafka/common/requests/AbstractResponse.toSend2Aorg/apache/kafka/common/requests/RequestContext.buildResponseSend26kafka/network/RequestChannel$Request.buildResponseSend2.org/xerial/snappy/SnappyInputStream.readHeader2*org/xerial/snappy/SnappyInputStream.2;org/apache/kafka/common/compress/SnappyFactory.wrapForInput2=org/apache/kafka/common/record/CompressionType$3.wrapForInput2Corg/apache/kafka/common/record/DefaultRecordBatch.recordInputStream2Dorg/apache/kafka/common/record/DefaultRecordBatch.compressedIterator2Forg/apache/kafka/common/record/DefaultRecordBatch.skipKeyValueIterator2=java/util/concurrent/locks/AbstractQueuedSynchronizer.acquire22java/util/concurrent/locks/ReentrantLock$Sync.lock2-java/util/concurrent/locks/ReentrantLock.lock2,java/util/concurrent/ArrayBlockingQueue.size2$java/util/AbstractCollection.isEmpty2/kafka/network/Processor.configureNewConnections2libc-2.31.so.sendfile642&sun/nio/ch/FileChannelImpl.transferTo025sun/nio/ch/FileChannelImpl.transferToDirectlyInternal2-sun/nio/ch/FileChannelImpl.transferToDirectly2%sun/nio/ch/FileChannelImpl.transferTo2Dorg/apache/kafka/common/network/PlaintextTransportLayer.transferFrom22org/apache/kafka/common/record/FileRecords.writeTo29org/apache/kafka/common/record/DefaultRecordsSend.writeTo22org/apache/kafka/common/record/RecordsSend.writeTo2Horg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesSent2Hcom/yammer/metrics/stats/ExponentiallyDecayingSample.lockForRegularUsage2libc-2.31.so.__fxstat642#sun/nio/ch/FileDispatcherImpl.size02"sun/nio/ch/FileDispatcherImpl.size2sun/nio/ch/FileChannelImpl.size2!./lib/x86_64-linux-gnu/ld-2.31.so2%java/util/HashMap$HashIterator.2$java/util/HashMap$KeyIterator.2!java/util/HashMap$KeySet.iterator2java/util/HashSet.iterator2sun/nio/ch/Util$2.iterator2libpthread-2.31.so.__libc_write2$sun/nio/ch/FileDispatcherImpl.write02#sun/nio/ch/FileDispatcherImpl.write2'sun/nio/ch/IOUtil.writeFromNativeBuffer2 sun/nio/ch/FileChannelImpl.write29org/apache/kafka/common/record/MemoryRecords.writeFullyTo21org/apache/kafka/common/record/FileRecords.append2libnio.so.fdval2&org/apache/log4j/Logger.isTraceEnabled23org/slf4j/impl/Reload4jLoggerAdapter.isTraceEnabled2kafka/utils/Logging.trace2kafka/utils/Logging.trace$2kafka/network/Processor.trace2$kafka/network/Processor.sendResponse2+kafka/network/Processor.processNewResponses2Kjava/util/concurrent/locks/AbstractQueuedSynchronizer.hasQueuedPredecessors2Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync.readerShouldBlock2libpthread-2.31.so.pread2$sun/nio/ch/FileDispatcherImpl.pread02#sun/nio/ch/FileDispatcherImpl.pread2'sun/nio/ch/FileChannelImpl.readInternal2sun/nio/ch/FileChannelImpl.read2-org/apache/kafka/common/utils/Utils.readFully23org/apache/kafka/common/utils/Utils.readFullyOrFail2Zorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchWithSize2Xorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchHeader2Zorg/apache/kafka/common/record/DefaultRecordBatch$DefaultFileChannelRecordBatch.lastOffset2Borg/apache/kafka/common/record/FileRecords.searchForOffsetWithSize2$kafka/log/LogSegment.translateOffset2kafka/log/LogSegment.read2/kafka/cluster/Partition.$anonfun$fetchRecords$22#./lib/x86_64-linux-gnu/libc-2.31.so2(libjvm.so.Relocation::pd_address_in_code2#libjvm.so.oop_Relocation::oop_value2libjvm.so.nmethod::oops_do23libjvm.so.ClosureIsUnloadingBehaviour::is_unloading2>kafka/server/DelayedOperation.$anonfun$safeTryCompleteOrElse$123kafka/server/DelayedOperation.safeTryCompleteOrElse2;kafka/server/DelayedOperationPurgatory.tryCompleteElseWatch2-java/lang/ThreadLocal$ThreadLocalMap.getEntry2java/lang/ThreadLocal.get22com/yammer/metrics/stats/ThreadLocalRandom.current2Yscala/collection/mutable/HashTable.scala$collection$mutable$HashTable$$lastPopulatedIndex20scala/collection/mutable/HashMap$$anon$2.foreach2Mscala/collection/convert/DecorateAsJava$$Lambda$1281.0x00000008015566b0.apply21scala/collection/convert/Decorators$AsJava.asJava21kafka/server/KafkaApis$.sizeOfThrottledPartitions2Porg/apache/kafka/common/message/ProduceResponseData$TopicProduceResponse.addSize2;org/apache/kafka/common/message/ProduceResponseData.addSize2java/util/TreeMap.getLastEntry2java/util/TreeMap.lastEntry2>kafka/server/epoch/LeaderEpochFileCache.$anonfun$latestEntry$123kafka/server/epoch/LeaderEpochFileCache.latestEpoch2?kafka/server/epoch/LeaderEpochFileCache.$anonfun$endOffsetFor$120kafka/server/DelayedFetch.$anonfun$tryComplete$42@kafka/server/DelayedFetch$$Lambda$1311.0x000000080155b708.accept2Akafka/server/ReplicaManager$$Lambda$1405.0x00000008015835c0.apply2Bkafka/log/LogValidator$.getFirstBatchAndMaybeValidateNoMoreBatches2.updateBytesCRC32C2,java/lang/invoke/MethodHandle.asTypeUncached2$java/lang/invoke/MethodHandle.asType2*java/lang/invoke/Invokers.checkGenericType2*java/lang/invoke/Invokers$Holder.invoke_MT2@org/apache/kafka/common/utils/Crc32C$Java9ChecksumFactory.create2+org/apache/kafka/common/utils/Crc32C.create2,org/apache/kafka/common/utils/Crc32C.compute2Aorg/apache/kafka/common/record/DefaultRecordBatch.computeChecksum29org/apache/kafka/common/record/DefaultRecordBatch.isValid29kafka/log/UnifiedLog.$anonfun$analyzeAndValidateRecords$12:kafka/log/UnifiedLog$$Lambda$584.0x00000008013ed6b0.accept2Eorg/apache/kafka/common/record/DefaultRecord.skipLengthDelimitedField2"kafka/utils/Logging.isTraceEnabled2#kafka/utils/Logging.isTraceEnabled$2+kafka/network/RequestChannel.isTraceEnabled2 libjvm.so.AccessInternal::PostRuntimeDispatch, (AccessInternal::BarrierType)2, 548964ul>::oop_access_barrier2&kafka/server/KafkaRequestHandler.trace2Iorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeFromList2Norg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeElementAtSlot2Aorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.remove2>kafka/server/IncrementalFetchContext$PartitionIterator.hasNext2Bkafka/server/IncrementalFetchContext.updateAndGenerateResponseData2java/util/HashMap.compute2=org/apache/kafka/common/requests/ProduceRequest.lambda$null$12Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1421.0x000000080158a8f0.accept2Gorg/apache/kafka/common/requests/ProduceRequest.lambda$partitionSizes$22Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1419.0x000000080158a480.accept2>org/apache/kafka/common/requests/ProduceRequest.partitionSizes2Eorg/apache/kafka/common/requests/ProduceRequest.clearPartitionRecords2Ascala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.hasNext224org/apache/kafka/common/protocol/Readable.readString26org/apache/kafka/common/message/RequestHeaderData.read28org/apache/kafka/common/message/RequestHeaderData.24org/apache/kafka/common/requests/RequestHeader.parse2*kafka/network/Processor.parseRequestHeader2;kafka/network/Processor.$anonfun$processCompletedReceives$12=kafka/network/Processor$$Lambda$985.0x00000008014c6590.accept2,java/util/LinkedHashMap$LinkedValues.forEach20kafka/network/Processor.processCompletedReceives2.sun/nio/ch/Util.offerLastTemporaryDirectBuffer2Jorg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.27org/apache/kafka/common/message/ProduceRequestData.read29org/apache/kafka/common/message/ProduceRequestData.25org/apache/kafka/common/requests/ProduceRequest.parse2?org/apache/kafka/common/requests/AbstractRequest.doParseRequest2=org/apache/kafka/common/requests/AbstractRequest.parseRequest22java/util/HashMap.clear2java/util/HashSet.clear2sun/nio/ch/Util$2.clear2+java/util/concurrent/ArrayBlockingQueue.put2(kafka/network/RequestChannel.sendRequest2Lorg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesReceived2/java/util/concurrent/ArrayBlockingQueue.enqueue2+com/typesafe/scalalogging/Logger.underlying2java/util/HashSet.add2*sun/nio/ch/SelectorImpl.processReadyEvents2*sun/nio/ch/EPollSelectorImpl.processEvents2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate26libjvm.so.void G1CMTask::process_grey_task_entry2$libjvm.so.G1CMBitMapClosure::do_addr2#libjvm.so.G1CMTask::do_marking_step2)libjvm.so.G1CMConcurrentMarkingTask::work2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2%libjvm.so.G1CMTask::drain_local_queue2nlibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2Olibjvm.so.G1RebuildRemSetTask::G1RebuildRemSetHeapRegionClosure::do_heap_region2(libjvm.so.HeapRegionManager::par_iterate2#libjvm.so.G1RebuildRemSetTask::work2libc-2.31.so.epoll_ctl2>org/apache/kafka/common/utils/ImplicitLinkedHashCollection.add23java/util/concurrent/ConcurrentSkipListMap.doRemove21java/util/concurrent/ConcurrentSkipListMap.remove2.java/util/concurrent/ConcurrentSkipListMap.cpr20java/util/concurrent/ConcurrentSkipListMap.doPut26java/util/concurrent/ConcurrentSkipListMap.putIfAbsent2=org/apache/kafka/common/protocol/ByteBufferAccessor.readArray2libjvm.so.Unsafe_Unpark2java/util/Arrays.copyOf2java/util/ArrayList.grow2java/util/ArrayList.add2Horg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.read21libpthread-2.31.so.__pthread_mutex_unlock_usercnt2=kafka/network/Processor$$Lambda$1073.0x00000008014ec800.apply2.kafka/network/Processor.handleChannelMuteEvent2java/util/ArrayDeque.grow2java/util/ArrayDeque.addLast2(sun/nio/ch/EPollSelectorImpl.setEventOps2'sun/nio/ch/SelectionKeyImpl.interestOps2Iorg/apache/kafka/common/network/PlaintextTransportLayer.removeInterestOps21org/apache/kafka/common/network/KafkaChannel.mute2-org/apache/kafka/common/network/Selector.mute2sun/nio/ch/IOUtil.drain2sun/nio/ch/EventFD.reset2+sun/nio/ch/EPollSelectorImpl.clearInterrupt2.org/apache/kafka/common/protocol/ApiKeys.forId25org/apache/kafka/common/requests/RequestHeader.apiKey2#libjvm.so.pthread_mutex_trylock@plt2+java/util/concurrent/locks/LockSupport.park2Jjava/util/concurrent/locks/AbstractQueuedSynchronizer.acquireInterruptibly2?java/util/concurrent/locks/ReentrantLock$Sync.lockInterruptibly2:java/util/concurrent/locks/ReentrantLock.lockInterruptibly25java/util/concurrent/ConcurrentSkipListMap.addIndices2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$32Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$3$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1111.0x00000008014ff9d8.apply2#libjvm.so.ObjectSampler::is_created22libjvm.so.AllocTracer::send_allocation_in_new_tlab2java/nio/ByteBuffer.allocate25org/apache/kafka/common/network/NetworkReceive.2(sun/nio/ch/Util.getTemporaryDirectBuffer2#libjvm.so.oopDesc::size_given_klass2libc-2.31.so.getrusage2&libjvm.so.G1CMTask::regular_clock_call2&libjvm.so.G1CMTask::drain_global_stack2*libjvm.so.OtherRegionsTable::add_reference2java/util/regex/Matcher.search2java/util/regex/Matcher.find2"java/util/regex/Matcher.replaceAll22io/prometheus/jmx/JmxCollector$Receiver.recordBean2-io/prometheus/jmx/JmxScraper.processBeanValue2'io/prometheus/jmx/JmxScraper.scrapeBean2%io/prometheus/jmx/JmxScraper.doScrape2&io/prometheus/jmx/JmxCollector.collect2?io/prometheus/jmx/shaded/io/prometheus/client/Collector.collect2nio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement2jio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.nextElement2\io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeOpenMetrics1002Tio/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeFormat2Zio/prometheus/jmx/shaded/io/prometheus/client/exporter/HTTPServer$HTTPMetricHandler.handle2,com/sun/net/httpserver/Filter$Chain.doFilter2&sun/net/httpserver/AuthFilter.doFilter29sun/net/httpserver/ServerImpl$Exchange$LinkHandler.handle2*sun/net/httpserver/ServerImpl$Exchange.run21java/util/concurrent/ThreadPoolExecutor.runWorker22java/util/concurrent/ThreadPoolExecutor$Worker.run20java/util/regex/Pattern$CharPropertyGreedy.match2'java/util/regex/Pattern$GroupHead.match2#java/util/regex/Pattern$Slice.match2'java/util/regex/Pattern$GroupTail.match2*java/util/regex/Pattern$CharProperty.match2#java/util/regex/Pattern$Begin.match2java/util/regex/Matcher.match2java/util/regex/Matcher.matches27java/util/concurrent/ConcurrentSkipListMap$Iter.advance2=java/util/concurrent/ConcurrentSkipListMap$ValueIterator.next21java/util/concurrent/ConcurrentSkipListMap.toList29java/util/concurrent/ConcurrentSkipListMap$Values.toArray2(com/yammer/metrics/stats/Snapshot.2@com/yammer/metrics/stats/ExponentiallyDecayingSample.getSnapshot2-com/yammer/metrics/core/Histogram.getSnapshot2Dcom/yammer/metrics/reporting/JmxReporter$Histogram.get50thPercentile24jdk/internal/reflect/GeneratedMethodAccessor7.invoke28jdk/internal/reflect/DelegatingMethodAccessorImpl.invoke2java/lang/reflect/Method.invoke2"sun/reflect/misc/Trampoline.invoke24jdk/internal/reflect/GeneratedMethodAccessor2.invoke2"sun/reflect/misc/MethodUtil.invoke2:com/sun/jmx/mbeanserver/StandardMBeanIntrospector.invokeM221com/sun/jmx/mbeanserver/MBeanIntrospector.invokeM21com/sun/jmx/mbeanserver/PerInterface.getAttribute21com/sun/jmx/mbeanserver/MBeanSupport.getAttribute22com/sun/jmx/mbeanserver/MBeanSupport.getAttributes2Ccom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getAttributes24com/sun/jmx/mbeanserver/JmxMBeanServer.getAttributes2'io/prometheus/jmx/JmxCollector.safeName22libjvm.so.G1Policy::preventive_collection_required2)libjvm.so.TypeArrayKlass::allocate_common2"libjvm.so.OptoRuntime::new_array_C2&java/lang/AbstractStringBuilder.2java/lang/StringBuilder.2:jdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.dtoa2;jdk/internal/math/FloatingDecimal.getBinaryToASCIIConverter24jdk/internal/math/FloatingDecimal.toJavaFormatString2java/lang/Double.toString2java/lang/String.valueOf2%java/util/AbstractCollection.toString2-java/util/regex/Pattern$BmpCharProperty.match2Hjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.toJavaFormatString2"sun/nio/cs/StreamEncoder.implWrite2sun/nio/cs/StreamEncoder.write2 java/io/OutputStreamWriter.write2java/io/Writer.append2_io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeEscapedLabelValue2%./lib/x86_64-linux-gnu/libz.so.1.2.112(java/util/zip/Deflater.deflateBytesBytes2java/util/zip/Deflater.deflate2*java/util/zip/DeflaterOutputStream.deflate2(java/util/zip/DeflaterOutputStream.write2$java/util/zip/GZIPOutputStream.write2%java/io/ByteArrayOutputStream.writeTo2java/util/regex/Matcher.reset2java/util/regex/Matcher.2java/util/regex/Pattern.matcher2libjvm.so.nmethod::is_alive2java/lang/StringLatin1.hashCode2java/lang/String.hashCode2$javax/management/ObjectName.hashCode2,com/sun/jmx/mbeanserver/NamedObject.hashCode2java/util/HashMap.hash2#java/util/AbstractCollection.addAll2(com/sun/jmx/mbeanserver/Repository.query2Ecom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeansImpl2Acom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeans22com/sun/jmx/mbeanserver/JmxMBeanServer.queryMBeans27org/apache/kafka/common/metrics/KafkaMetric.metricValue2Corg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttribute2Dorg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttributes26com/sun/jmx/mbeanserver/Repository.retrieveNamedObject2+com/sun/jmx/mbeanserver/Repository.retrieve2>com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBean2Bcom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBeanInfo23com/sun/jmx/mbeanserver/JmxMBeanServer.getMBeanInfo2 java/lang/StringLatin1.newString2 java/lang/StringBuilder.toString2java/util/AbstractMap.toString2libjvm.so.CodeBlob::is_zombie2#libjvm.so.JavaThread::pd_last_frame22libjvm.so.OptoRuntime::is_deoptimized_caller_frame2)libjvm.so.OptoRuntime::new_array_nozero_C2java/lang/String.getBytes2+java/lang/AbstractStringBuilder.putStringAt2$java/lang/String.checkBoundsBeginEnd2java/lang/String.getChars2java/io/Writer.write2!libjvm.so.NativeCall::destination2+kafka/cluster/Partition.fetchOffsetSnapshot2*kafka/log/TimeIndex.$anonfun$maybeAppend$12kafka/log/TimeIndex.maybeAppend2java/util/stream/Sink.end2*java/util/stream/Sink$ChainedReference.end2=java/util/concurrent/locks/AbstractQueuedSynchronizer.enqueue2Njava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.doSignal2Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.signal21java/util/concurrent/LinkedBlockingDeque.linkLast20java/util/concurrent/LinkedBlockingDeque.putLast2,java/util/concurrent/LinkedBlockingDeque.put2'kafka/network/Processor.enqueueResponse2)scala/collection/mutable/Builder.sizeHint2*scala/collection/mutable/Builder.sizeHint$2,scala/collection/mutable/MapBuilder.sizeHint2org/apache/kafka/common/requests/ProduceResponse.lambda$null$22Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1417.0x000000080158a010.accept2Eorg/apache/kafka/common/requests/ProduceResponse.lambda$errorCounts$32Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1415.0x0000000801589ba0.accept22!java/lang/System.identityHashCode2kafka/log/LocalLog.trace27kafka/server/BrokerTopicMetrics.totalProduceRequestRate2sun/nio/ch/EventFD.set02sun/nio/ch/EventFD.set2#sun/nio/ch/EPollSelectorImpl.wakeup2/org/apache/kafka/common/network/Selector.wakeup2kafka/network/Processor.wakeup24java/lang/invoke/DirectMethodHandle.allocateInstance2Cjava/lang/invoke/LambdaForm$DMH.0x0000000801578c00.newInvokeSpecial2Djava/lang/invoke/LambdaForm$MH.0x000000080157a000.linkToTargetMethod24scala/collection/AbstractTraversable.sizeHintIfCheap2;org/apache/kafka/common/record/FileLogInputStream.nextBatch2;org/apache/kafka/common/record/RecordBatchIterator.makeNext2?org/apache/kafka/common/utils/AbstractIterator.maybeComputeNext2scala/Some.isEmpty2kafka/cluster/Partition.topicId2!kafka/utils/timer/TimingWheel.add2/kafka/utils/timer/SystemTimer.addTimerTaskEntry2!kafka/utils/timer/SystemTimer.add24org/apache/kafka/common/requests/ProduceRequest.data2Ckafka/server/DelayedOperationPurgatory.$anonfun$watchForOperation$128kafka/server/DelayedOperationPurgatory.watchForOperation2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$32Nkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$3$adapted2Lkafka/server/DelayedOperationPurgatory$$Lambda$1312.0x000000080155b940.apply2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$22Skafka/server/DelayedOperationPurgatory$$Lambda$1309.0x000000080155b038.apply$mcV$sp2'kafka/log/LogSegment.$anonfun$recover$22/kafka/log/LogSegment.$anonfun$recover$2$adapted29kafka/log/LogSegment$$Lambda$338.0x000000080129e3e0.apply2+kafka/log/UnifiedLog.maybeFlushMetadataFile2#libjvm.so.Assembler::locate_operand2.unknown2java/util/Objects.hashCode2/org/apache/kafka/common/TopicPartition.hashCode2+kafka/server/ReplicaManager.isAddingReplica24kafka/server/ReplicaManager.$anonfun$fetchMessages$22Akafka/server/ReplicaManager$$Lambda$1266.0x000000080154e0d0.apply2-kafka/server/epoch/LeaderEpochFileCache.trace2scala/Option.isDefined2scala/Option.nonEmpty2!kafka/server/CachedPartition.next2dorg/apache/kafka/common/utils/ImplicitLinkedHashCollection$ImplicitLinkedHashCollectionIterator.next28org/apache/kafka/common/requests/FetchResponse.toMessage21org/apache/kafka/common/requests/FetchResponse.of2'kafka/server/KafkaApis.createResponse$125java/util/Collections$UnmodifiableCollection.contains22org/apache/kafka/common/internals/Topic.isInternal2libjvm.so.ObjectMonitor::EnterI2libjvm.so.ObjectMonitor::enter2#libjvm.so.ObjectSynchronizer::enter23libjvm.so.SharedRuntime::complete_monitor_locking_C23org/apache/kafka/common/utils/AbstractIterator.next2-org/apache/kafka/common/TopicPartition.equals2sun/nio/ch/NativeThreadSet.add2'scala/collection/mutable/HashMap.result2,scala/collection/generic/GenMapFactory.apply2:java/util/concurrent/ConcurrentSkipListMap.findPredecessor2%scala/collection/AbstractIterator.map21scala/Predef$ArrowAssoc$.$minus$greater$extension2+kafka/server/ReplicaManager.onlinePartition2$kafka/server/ReplicaManager.localLog2(kafka/server/ReplicaManager.getLogConfig20kafka/server/KafkaApis.maybeConvertFetchedData$125kafka/server/KafkaApis.$anonfun$handleFetchRequest$222=kafka/server/KafkaApis$$Lambda$1287.0x00000008015576f8.accept25kafka/server/KafkaApis.$anonfun$handleFetchRequest$212=kafka/server/KafkaApis$$Lambda$1286.0x00000008015574c0.accept2:java/util/concurrent/ConcurrentHashMap$ValuesView.iterator2=scala/collection/convert/Wrappers$JCollectionWrapper.iterator2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$22Ckafka/cluster/Partition.$anonfun$updateFollowerFetchState$2$adapted2=kafka/cluster/Partition$$Lambda$1263.0x000000080154cc20.apply2scala/Option.exists2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$12,scala/collection/mutable/HashTable.addEntry026kafka/server/KafkaApis.$anonfun$handleProduceRequest$32=kafka/server/KafkaApis$$Lambda$1366.0x000000080156cca8.accept26kafka/server/KafkaApis.$anonfun$handleProduceRequest$22=kafka/server/KafkaApis$$Lambda$1364.0x000000080156c838.accept2)libjvm.so.G1CMIsAliveClosure::do_object_b25libjvm.so.IsCompiledMethodUnloadingOopClosure::do_oop2Horg/apache/kafka/common/protocol/types/RawTaggedFieldWriter.writeRawTags28org/apache/kafka/common/message/ResponseHeaderData.write2/kafka/server/LogReadResult.toFetchPartitionData2/kafka/server/DelayedFetch.$anonfun$onComplete$22?kafka/server/DelayedFetch$$Lambda$1381.0x000000080157c6e0.apply2java/util/HashMap$Node.getKeyp \ No newline at end of file diff --git a/receiver/pyroscopereceiver/testdata/profile.jfr b/receiver/pyroscopereceiver/testdata/profile.jfr deleted file mode 100644 index 4a0397c15f07e84ed9f8afbf75ce5fc1d832747e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11008 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 WhWC#!R`dGqvEdpf^^c8>jQtvlo*TRX From b3498cbdb670eec87d7fe882b332873d8a4c617f Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 5 Dec 2023 13:41:08 +0200 Subject: [PATCH 12/44] fix test --- go.mod | 2 +- .../pyroscopereceiver_test.go | 2 +- .../cortex-dev-01__kafka-0__cpu__0.pb | 739 +++++++++--------- 3 files changed, 368 insertions(+), 375 deletions(-) diff --git a/go.mod b/go.mod index 5649898..5848dd4 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/ClickHouse/clickhouse-go/v2 v2.10.1 github.com/go-logfmt/logfmt v0.6.0 github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 + github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/carbonexporter v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/fileexporter v0.87.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.85.0 @@ -153,7 +154,6 @@ require ( go.uber.org/multierr v1.11.0 go.uber.org/zap v1.26.0 google.golang.org/protobuf v1.31.0 - github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8 ) require ( diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 953081e..8f75a2e 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -97,7 +97,7 @@ func TestPyroscopeIngest(t *testing.T) { expected *plog.Logs err error } - tests := make([]test_t, 2) + tests := make([]test_t, 1) payload, err := os.ReadFile(filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.pb")) assert.NoError(t, err, "failed to load expected pprof payload") diff --git a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb index 42e1032..b447d3e 100644 --- a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb +++ b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb @@ -1,389 +1,382 @@ -( ++ $ -  !"#$ -%&'()*+,-./0123456"#$ -789:;< 56"#$ -=>?@ABCDEFGHIJ234KLM"#$ -NOPQRSTUV56"#$ -WXYZ[\]^_`6"#$ -abcdefg 56"#$ -hijklmnopqrsM"#$ -tuvwxyz{|}~€‚LM"#$B ->ƒ„…†‡ˆ‰Š‹ŒŽ‘’_“”•–—ABCDEFGHIJ234KLM"#$B ->˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -¨©ª«¬­®¯°±²³6"#$& -"´µ¶·¸¹º» !"#$ -NOP¼½¾¿À¾Á6"#$ -ÂÃÄÅÆÇÈÉ€‚LM"#$ -ÊËÌÍÎÏÐ#$< -8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -ÔÌÍÎÏÐ#$ -ÕÖ×ØÙÚÛÜÝÞ -ßs6"#$ -àáâãhijklmnopqrs6"#$" -äåæçèéêëìíîïðñ# -789:;<  !"#$ - -òóôõöX -T÷øùúûüýþÿ€_“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñO -K‘’“”•–“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ -¨©—˜ 56"#$! -™š›œâãhyz{|žîïðñ -Ÿ ¡¢£³6"#$+ -'Š‹ŒŽâãhyz{|êëìíîïðñH -D¤¥¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -A -=“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ -ª´µ«¬­®¯°ðñ7 -3±†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ -_M"#$, -(²³´µ¶·¸æçèéêëìíîïðñ -¹ºM"#$$ - »¼½¸¾èéêëìíîïðñ& -"»¼½¸æçèéêëìíîïðñ( -$¿ÀÁÂÃľèéêëìíîïðñ) -%ÅÆÇÈÉ”•–—ABCDEFGHIJ234KLM"#$, -(ÊËÌÍÎϽ¸¾èéêëìíîïðñ$ - Ðѽ¸¾èéêëìíîïðñ( -$™šÒÓÃľèéêëìíîïðñ -ÔÕÖ×ØÙÏÐ#$ - -ÚÛö" -ÓÃľèéêëìíîïðñ1 --ÜÝÞß³´àáSTUVâãg 56"#$9 -5„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ - -Úäöòö; -7å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ< -8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ - -æÛö( -$ÝÞß³´µçèéêëìíîïðñ6 -2éêëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$, -(îïðñòѽ¸¾èéêëìíîïðñ( +  !"#$€­â +%&'()*+,-./0123456"#$€­â +789:;< 56"#$€­â +=>?@ABCDEFGHIJ234KLM"#$€­â +NOPQRSTUV56"#$€­â +WXYZ[\]^_`6"#$€­â +abcdefg 56"#$€­â +hijklmnopqrsM"#$€­â +tuvwxyz{|}~€‚LM"#$€­âE +>ƒ„…†‡ˆ‰Š‹ŒŽ‘’_“”•–—ABCDEFGHIJ234KLM"#$€­âE +>˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ # +¨©ª«¬­®¯°±²³6"#$€­â) +"´µ¶·¸¹º» !"#$€­â +NOP¼½¾¿À¾Á6"#$€­â# +ÂÃÄÅÆÇÈÉ€‚LM"#$€­â +ÊËÌÍÎÏÐ#$€­â? +8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â +ÔÌÍÎÏÐ#$€­â +ÕÖ×ØÙÚÛÜÝÞ€­â +ßs6"#$€­â +àáâãhijklmnopqrs6"#$€­â% +äåæçèéêëìíîïðñ€­â& +789:;<  !"#$€­â +òóô€ŽÎ õö€­â[ +T÷øùúûüýþÿ€_“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­âR +K‘’“”•–“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â +¨©—˜ 56"#$€ÚÄ $ +™š›œâãhyz{|žîïðñ€­â +Ÿ ¡¢£³6"#$€­â. +'Š‹ŒŽâãhyz{|êëìíîïðñ€­âK +D¤¥¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€Â×/D +=“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â! +ª´µ«¬­®¯°ðñ€­â: +3±†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â +_M"#$€­â/ +(²³´µ¶·¸æçèéêëìíîïðñ€­â +¹ºM"#$€ÚÄ ' + »¼½¸¾èéêëìíîïðñ€­â) +"»¼½¸æçèéêëìíîïðñ€­â+ +$¿ÀÁÂÃľèéêëìíîïðñ€­â, +%ÅÆÇÈÉ”•–—ABCDEFGHIJ234KLM"#$€­â/ +(ÊËÌÍÎϽ¸¾èéêëìíîïðñ€´‰' + Ðѽ¸¾èéêëìíîïðñ€­â+ +$™šÒÓÃľèéêëìíîïðñ€­â +ÔÕÖ×ØÙÏÐ#$€­â +ÚÛö€­â% +ÓÃľèéêëìíîïðñ€­â4 +-ÜÝÞß³´àáSTUVâãg 56"#$€­â< +5„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â +Úäö€ÚÄ  òö€­â> +7å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â? +8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ  +æÛö€­â+ +$ÝÞß³´µçèéêëìíîïðñ€­â9 +2éêëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â/ +(îïðñòѽ¸¾èéêëìíîïðñ€­â+ $óôõö÷øùúûü - 56"#$E -Aýþÿ€å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ -‚âãhyz{|žîïðñ -µƒ„…†‡€‚LM"#$: -6ˆ‰Š‹ŒŽîïðñòѽ¸¾èéêëìíîïðñ8 -4žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$( -$ß³´µçèéêëìíîïðñ( -$ß»¼½¸æçèéêëìíîïðñ: -6‘¨©’“¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$, -(”•ÌÍÎϽ¸¾èéêëìíîïðñ" -ij–—ÄÅÆÇÈÉ€‚LM"#$' -#˜™š›œžŸ ¡¢£¤Ñ½¥¦$+ + 56"#$€­âH +Aýþÿ€å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â +‚âãhyz{|žîïðñ€­â +µƒ„…†‡€‚LM"#$€­â= +6ˆ‰Š‹ŒŽîïðñòѽ¸¾èéêëìíîïðñ€­â; +4žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â+ +$ß³´µçèéêëìíîïðñ€­â+ +$ß»¼½¸æçèéêëìíîïðñ€­â= +6‘¨©’“¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â/ +(”•ÌÍÎϽ¸¾èéêëìíîïðñ€­â% +ij–—ÄÅÆÇÈÉ€‚LM"#$€­â* +#˜™š›œžŸ ¡¢£¤Ñ½¥¦$€­â. 'W§¨úûü -  !"#$ - -©M"#$ -¨©—˜ 56"#$ -ª«¬­®¯°±²³¾´¦$ -µ¶·¸¹º~€‚LM"#$8 -4»¼½¾¿ÀÁ¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -ÂÃÄÅÆǦ$) -%ÈÉÊËÌÍÎÏР¡¢£¤Ñ½¥¦$ -ijklmnopqrsM"#$' -#˜™š›œžŸ ¡¢£¤Ñ½¥¦$ -Ñ£¤Ñ½¥¦$ -hijklmnopqrsM"#$/ -+ƒ„…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$) -%ÕÖ×ØÌÍÎÏР¡¢£¤Ñ½¥¦$ -ÙÔËÌÍÎÏÐ#$ -ÚÛÜÝÞѽ¥¦$7 -3ßàáâãäåæç•–“”•–—ABCDEFGHIJ234KLM"#$% -!艊‹ŒŽîïðñòѽ¥¦$ -M"#$$ - ß³´µƒ„…†‡€‚LM"#$ -ª«¬­®¯°±²³¾´¦$! -×ØÎÏР¡¢£¤Ñ½¥¦$ -aéêëìíîï¦$ -ÂÃÄÅÆÇÈÉ€‚LM"#$/ -+ðñ…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$L +  !"#$€­â +©M"#$€­â +¨©—˜ 56"#$€­â" +ª«¬­®¯°±²³¾´¦$€­â +µ¶·¸¹º~€‚LM"#$€ÚÄ ; +4»¼½¾¿ÀÁ¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â +ÂÃÄÅÆǦ$€­â, +%ÈÉÊËÌÍÎÏР¡¢£¤Ñ½¥¦$€­â +ijklmnopqrsM"#$€­â* +#˜™š›œžŸ ¡¢£¤Ñ½¥¦$€­â +Ñ£¤Ñ½¥¦$€­â +hijklmnopqrsM"#$€­â2 ++ƒ„…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$€­â, +%ÕÖ×ØÌÍÎÏР¡¢£¤Ñ½¥¦$€ÚÄ  +ÙÔËÌÍÎÏÐ#$€­â +ÚÛÜÝÞѽ¥¦$€­â: +3ßàáâãäåæç•–“”•–—ABCDEFGHIJ234KLM"#$€­â( +!艊‹ŒŽîïðñòѽ¥¦$€­â +M"#$€­â' + ß³´µƒ„…†‡€‚LM"#$€­â" +ª«¬­®¯°±²³¾´¦$€­â$ +×ØÎÏР¡¢£¤Ñ½¥¦$€­â +aéêëìíîï¦$€­â# +ÂÃÄÅÆÇÈÉ€‚LM"#$€­â2 ++ðñ…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$€­âO Hòóô‹Œõö÷øùúûüýþÿ -€ âãg 56"#$ -ËÌÍÎϽ¥¦$ -‚ƒ„…×ØÙÚÛÜÝÞ! -¨©—˜ †‡ˆ56"#$' -#‰Š‹Óª«¬­®¯°±²³¾´¦$( -$ŒGHI“”•–—ABCDEFGHIJ234KLM"#$ -ŽSTUV56"#$ -‘’¶·¸¹º~€‚LM"#$9 -5“”•ˆ–—óôõö÷øù˜™ü¹º»†‡ˆ56"#$% -!ßij–—ÄÅÆÇÈÉ€‚LM"#$" -ij–—ÄÅÆÇÈÉ€‚LM"#$ - šCD234LM"#$' -#›¦§“”•–—ABCDEFGHIJ234KLM"#$ - ÌÍÎÏÐ#$: -6œžŸ ¡¢£¤¥¦§_É”•–—ABCDEFGHIJ234KLM"#$: -6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -aéꩪ«¬~€‚LM"#$ -¨©ª«¬­®¯°±²³6"#$% -!•–“”•–—ABCDEFGHIJ234KLM"#$ -­ÌÍÎÏÐ#$ - aéêëì®#$% -!¯°±²³´STUV !"#$ -µ¶·¾¸¹_º»M"#$ -ÕÖ×ØÙÚÛÜÝÞ -¼âãhyz{|}~½STUV56"#$ ->?@¾¿56"#$ +€ âãg 56"#$€­â +ËÌÍÎϽ¥¦$€­â +‚ƒ„…×ØÙÚÛÜÝÞ€ÚÄ $ +¨©—˜ †‡ˆ56"#$€­â* +#‰Š‹Óª«¬­®¯°±²³¾´¦$€­â+ +$ŒGHI“”•–—ABCDEFGHIJ234KLM"#$€­â +ŽSTUV56"#$€­â" +‘’¶·¸¹º~€‚LM"#$€­â< +5“”•ˆ–—óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â( +!ßij–—ÄÅÆÇÈÉ€‚LM"#$€­â% +ij–—ÄÅÆÇÈÉ€‚LM"#$€­â + šCD234LM"#$€­â* +#›¦§“”•–—ABCDEFGHIJ234KLM"#$€­â + ÌÍÎÏÐ#$€­â= +6œžŸ ¡¢£¤¥¦§_É”•–—ABCDEFGHIJ234KLM"#$€ÚÄ = +6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â! +aéꩪ«¬~€‚LM"#$€­â# +¨©ª«¬­®¯°±²³6"#$€­â( +!•–“”•–—ABCDEFGHIJ234KLM"#$€­â +­ÌÍÎÏÐ#$€­â + aéêëì®#$€ÚÄ ( +!¯°±²³´STUV !"#$€­â +µ¶·¾¸¹_º»M"#$€­â +ÕÖ×ØÙÚÛÜÝÞ€´‰ +¼âãhyz{|}~½STUV56"#$€­â +>?@¾¿56"#$€ÚÄ  -¾À³6"#$ -ÎÏÐ#$! -¨©ª«¬­ÁÂÃÄÅîï¦$ -W§ÆÇÈÉÊËѽ¥¦$( -$89:;<ÌÓª«¬­®¯°±²³¾´¦$ -ÍΦ$ -Ïл¼Ñ£¤Ñ½¥¦$ -¥¦$ -›œžŸ¡¢£¤Ñ½¥¦$ -ÒÓÔÕÖ×ØÙÚÛܦ$ - £¤Ñ½¥¦$) -%‰ŠÝš›œžŸ ¡¢£¤Ñ½¥¦$ -ÞßàáâãäåÙÚÛܦ$ - æçè½¥¦$ -ÔÕÖ×ØÙéêÙÚÛܦ$ - ëòѽ¥¦$ -ìéêÙÚÛܦ$ - ß»¼½¥¦$ -íëìíîï¦$ -OPîïðÌÍÎϽ¥¦$ -ñòóôõÚÛÜÝÞ -öò÷ôõÚÛÜÝÞ -øùúûÚÛÜÝÞ -ü”•ÌÍÎϽ¥¦$ -ý¡¢£¤Ñ½¥¦$! -þÿßàáâãäåÙÚÛܦ$% -!€Óª«¬­®¯°±²³¾´¦$) -%‚ƒ„Óª«Ô¬­®¯°±²³¾´¦$ - £¤Ñ½¥¦$ - ѽ¥¦$ -îïðñòѽ¥¦$ - л¼½¥¦$ -ÕÖ×ØÙéêÙÚÛܦ$# -„Óª«¬­®¯°±²³¾´¦$ - ѽ¥¦$ -ÊËÌÍÎϽ¥¦$ -…ÔÕÖ×ØÙÚÛܦ$# -„Óª«¬­®¯°±²³¾´¦$ -½¥¦$! -­†ÕÖ×ØÙéêÙÚÛܦ$+ -'‡ˆ‰Š‹ŒÞßàáâãäåÙÚÛܦ$# -„Óª«¬­®¯°±²³¾´¦$! -†ÕÖ×ØÙéêÙÚÛܦ$ -Ž²³¾´¦$% -!˜™š›œžŸ¡¢£¤Ñ½¥¦$ - ÙÚÛܦ$# -š›œžŸ ¡¢£¤Ñ½¥¦$' -#‰Š‹Óª«¬­®¯°±²³¾´¦$ - »¼½¥¦$ -‘’“”•–—ÙÚÛܦ$ -ˆ˜™šðÌÍÎϽ¥¦$% -!ˆ‰Š‹ŒŽîïðñòѽ¥¦$ -W§›œ°±²³¾´¦$) -%‰Š‹Óª«Ô¬­®¯°±²³¾´¦$ -ÎÏР¡¢£¤Ñ½¥¦$# -ËÌžŸ ¡¢éêÙÚÛܦ$ -‡ˆ‰Š‹£¤Ñ½¥¦$/ -+£ƒ„Óª«¤¥¦¬­®¯°±²³¾´¦$ -§¨þÿ€©ªñòѽ¥¦$# -‰Š«ŒŽîïðñòѽ¥¦$ -ü”•ÌÍÎϽ¥¦$ -ñò÷óôõÚÛÜÝÞ -öòôõÚÛÜÝÞ -¬úûÚÛÜÝÞ -ÚÛÜÝѽ¥¦$ -­®ò÷óôõÚÛÜÝÞ -¯óôõÚÛÜÝÞ -°øùúûÚÛÜÝÞ3 -/±²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$G -CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y -UÎÏÐÑÒÓÔÕÖ×ØÙÚ×ØÛÜÝÞßàáâ㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E -AÈÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y -UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$ = -9ÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 --äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;ÈÇÆËÌÍ´µµµµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 -/æçè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 --çè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;éûüýþêëìí´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I -EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$= -9îïðñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$G -CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 -/öôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Y -UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5÷ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c -_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÆÇÈÉÆÇÈÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a -]ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$5 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?÷ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$; -7ÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5ùñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$; -7ÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$) -%úûüýþÿ€½¾¿ÀÁÀÂÀÃÄÅ$' -#‚ƒ„…†‡ˆ¿ÀÁÀÂÀÃÄÅ$1 --ÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3÷ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$e -aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$e -aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q -MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 -/‰Š‹´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -G÷ÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$O -KÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$S -OÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$U -QÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$= -9ÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I -EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$O -KÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$E -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$[ -W÷ÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$S -O÷ÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$ -ŒØÙÚÛÜÝÞ> -:Ž‘Pî’“”•–·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q -MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=÷ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$Q -MÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$7 -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c -_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 -/—˜™â㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$- -)˜µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I -EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$c -_ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 --äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$6 -2W§š›œž¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a -]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$3 -/Ÿ ¡´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$1 --Ÿ ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$a -]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$I -EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$? -;¢£¤¥¦§¨äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$C -?÷ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$A -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$K -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$9 -5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$/ -+í´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$% -!©ª«¬­½¾¿ÀÁÀÂÀÃÄÅ$ -®ÕÖ×ØÙÚÛÜÝÞ -89:;<¯¹º»†‡ˆ56"#$) -%°±•–“”•–—ABCDEFGHIJ234KLM"#$( -$²³Þß³´µƒ„…†‡€‚LM"#$! -´µ¶·¸¹º¬~€‚LM"#$ -†‡€‚LM"#$D -@¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -ª´µ« !"#$# -´µ¶·¸¹º»†‡ˆ56"#$ -»¼½¾1234LM"#$ -¿Ž|ÀÁÂÃLM"#$" -OPÄÅƾÇÈ_É~€‚LM"#$: -6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ - _º»M"#$- -)ÊËÌÍâãhyz{Ζ—ABCDEFGHIJ234KLM"#$' -#ëìÏSTUVâãg 56"#$ -ÐÕÖ×ØÙÚÛÜÝÞ - 56"#$Ñö# +¾À³6"#$€­â +ÎÏÐ#$€­â$ +¨©ª«¬­ÁÂÃÄÅîï¦$€­â +W§ÆÇÈÉÊËѽ¥¦$€­â+ +$89:;<ÌÓª«¬­®¯°±²³¾´¦$€­â +ÍΦ$€­â +Ïл¼Ñ£¤Ñ½¥¦$€­â +¥¦$€­â" +›œžŸ¡¢£¤Ñ½¥¦$€­â +ÒÓÔÕÖ×ØÙÚÛܦ$€­â + £¤Ñ½¥¦$€­â, +%‰ŠÝš›œžŸ ¡¢£¤Ñ½¥¦$€­â" +ÞßàáâãäåÙÚÛܦ$€­â + æçè½¥¦$€­â" +ÔÕÖ×ØÙéêÙÚÛܦ$€­â + ëòѽ¥¦$€ÚÄ  +ìéêÙÚÛܦ$€ÚÄ  + ß»¼½¥¦$€ÚÄ  +íëìíîï¦$€­â +OPîïðÌÍÎϽ¥¦$€­â +ñòóôõÚÛÜÝÞ€­â +öò÷ôõÚÛÜÝÞ€­â +øùúûÚÛÜÝÞ€­â +ü”•ÌÍÎϽ¥¦$€ÚÄ  +ý¡¢£¤Ñ½¥¦$€­â$ +þÿßàáâãäåÙÚÛܦ$€­â( +!€Óª«¬­®¯°±²³¾´¦$€­â, +%‚ƒ„Óª«Ô¬­®¯°±²³¾´¦$€­â + £¤Ñ½¥¦$€­â + ѽ¥¦$€­â +îïðñòѽ¥¦$€­â + л¼½¥¦$€­â +ÕÖ×ØÙéêÙÚÛܦ$€­â& +„Óª«¬­®¯°±²³¾´¦$€­â + ѽ¥¦$€­â +ÊËÌÍÎϽ¥¦$€­â +…ÔÕÖ×ØÙÚÛܦ$€­â& +„Óª«¬­®¯°±²³¾´¦$€­â +½¥¦$€­â$ +­†ÕÖ×ØÙéêÙÚÛܦ$€­â. +'‡ˆ‰Š‹ŒÞßàáâãäåÙÚÛܦ$€­â& +„Óª«¬­®¯°±²³¾´¦$€­â$ +†ÕÖ×ØÙéêÙÚÛܦ$€­â +Ž²³¾´¦$€ÚÄ ( +!˜™š›œžŸ¡¢£¤Ñ½¥¦$€­â + ÙÚÛܦ$€­â& +š›œžŸ ¡¢£¤Ñ½¥¦$€­â* +#‰Š‹Óª«¬­®¯°±²³¾´¦$€­â + »¼½¥¦$€­â" +‘’“”•–—ÙÚÛܦ$€­â +ˆ˜™šðÌÍÎϽ¥¦$€­â( +!ˆ‰Š‹ŒŽîïðñòѽ¥¦$€­â +W§›œ°±²³¾´¦$€­â, +%‰Š‹Óª«Ô¬­®¯°±²³¾´¦$€­â +ÎÏР¡¢£¤Ñ½¥¦$€­â& +ËÌžŸ ¡¢éêÙÚÛܦ$€­â +‡ˆ‰Š‹£¤Ñ½¥¦$€­â2 ++£ƒ„Óª«¤¥¦¬­®¯°±²³¾´¦$€­â" +§¨þÿ€©ªñòѽ¥¦$€­â& +‰Š«ŒŽîïðñòѽ¥¦$€­â +ü”•ÌÍÎϽ¥¦$€­â +ñò÷óôõÚÛÜÝÞ€­â +öòôõÚÛÜÝÞ€­â +¬úûÚÛÜÝÞ€­â +ÚÛÜÝѽ¥¦$€­â +­®ò÷óôõÚÛÜÝÞ€­â +¯óôõÚÛÜÝÞ€­â +°øùúûÚÛÜÝÞ€­â6 +/±²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âJ +CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ \ +UÎÏÐÑÒÓÔÕÖ×ØÙÚ×ØÛÜÝÞßàáâ㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ 8 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ D +=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€áëD +=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§B +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§F +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ H +AÈÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€áë\ +UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§< +5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€œœ9@ +9ÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âH +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 +-äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB +;ÈÇÆËÌÍ´µµµµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 +/æçè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 +-çè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ F +?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§B +;éûüýþêëìí´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL +EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â8 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰@ +9îïðñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âJ +CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 +/öôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â\ +UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§< +5÷ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf +_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÆÇÈÉÆÇÈÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰d +]ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â8 +1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ŽÎF +?÷ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â> +7ÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< +5ùñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰D +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ > +7ÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â, +%úûüýþÿ€½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ * +#‚ƒ„…†‡ˆ¿ÀÁÀÂÀÃÄÅ$€­â4 +-ÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF +?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰F +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : +3÷ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ h +aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=ÆÇÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âh +aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âH +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ T +MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰H +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 +/‰Š‹´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +G÷ÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âR +KÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âV +OÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ X +QÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< +5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§@ +9ÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL +EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ R +KÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ H +AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â^ +W÷ÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âV +O÷ÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â +ŒØÙÚÛÜÝÞ€­âA +:Ž‘Pî’“”•–·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âT +MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=÷ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ F +?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âT +MÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : +3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf +_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 +/—˜™â㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â0 +)˜µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB +;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL +EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< +5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf +_ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 +-äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF +?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â9 +2W§š›œž¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âd +]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 +/Ÿ ¡´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 +-Ÿ ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âd +]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL +EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB +;¢£¤¥¦§¨äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF +?÷ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD +=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN +GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< +5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â2 ++í´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â( +!©ª«¬­½¾¿ÀÁÀÂÀÃÄÅ$€­â +®ÕÖ×ØÙÚÛÜÝÞ€­â# +89:;<¯¹º»†‡ˆ56"#$€­â, +%°±•–“”•–—ABCDEFGHIJ234KLM"#$€­â+ +$²³Þß³´µƒ„…†‡€‚LM"#$€­â$ +´µ¶·¸¹º¬~€‚LM"#$€­â +†‡€‚LM"#$€­âG +@¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ  +ª´µ« !"#$€­â& +´µ¶·¸¹º»†‡ˆ56"#$€­â +»¼½¾1234LM"#$€­â +¿Ž|ÀÁÂÃLM"#$€­â% +OPÄÅƾÇÈ_É~€‚LM"#$€­â= +6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â + _º»M"#$€­â0 +)ÊËÌÍâãhyz{Ζ—ABCDEFGHIJ234KLM"#$€­â* +#ëìÏSTUVâãg 56"#$€­â +ÐÕÖ×ØÙÚÛÜÝÞ€­â + 56"#$€­â Ñö€­â& aéêëìÒ -€ 56"#$ -´µÓABCDEFGHIJ234KLM"#$óö2 -.ßÔÕÖ×غ¬~STUVâãg 56"#$ -´¬~€‚LM"#$4 -0êëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$8 -4æÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -ܼ½¾1234LM"#$ -ÝÞßàṺM"#$ -âëã 56"#$ -ääåæˆ56"#$@ -<™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ +€ 56"#$€­â +´µÓABCDEFGHIJ234KLM"#$€­â óö€­â5 +.ßÔÕÖ×غ¬~STUVâãg 56"#$€­â +´¬~€‚LM"#$€­â7 +0êëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â; +4æÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â +ܼ½¾1234LM"#$€­â +ÝÞßàṺM"#$€­â +âëã 56"#$€­â +ääåæˆ56"#$€­âC +<™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â +çM"#$€­â& +=>?èéêëìíˆ56"#$€­âA +:©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­âE +>˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€‡§ + 123456"#$€­â$ +Ž´µÓABCDEFGHIJ234KLM"#$€­â -çM"#$# -=>?èéêëìíˆ56"#$> -:©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$B ->˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ - 123456"#$! -Ž´µÓABCDEFGHIJ234KLM"#$ -"#$5 -1ñ…†‡ˆ–ïðñò”•–—ABCDEFGHIJ234KLM"#$ -󃄅×ØÙÚÛÜÝÞ -¹º» !"#$" -OPÄÅƾÇÈ_É~€‚LM"#$8 -4ÛÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$ -ÊôÌÍÎÏÐ#$% -!Žõö´µ¶÷øùCD23456"#$5 -1ëìú—óôõö÷øù˜™ü¹º»†‡ˆ56"#$" -ß³´µƒ„…†‡€‚LM"#$2 +"#$€ÚÄ 8 +1ñ…†‡ˆ–ïðñò”•–—ABCDEFGHIJ234KLM"#$€­â +󃄅×ØÙÚÛÜÝÞ€­â +¹º» !"#$€­â% +OPÄÅƾÇÈ_É~€‚LM"#$€­â; +4ÛÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â +ÊôÌÍÎÏÐ#$€­â( +!Žõö´µ¶÷øùCD23456"#$€­â8 +1ëìú—óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â% +ß³´µƒ„…†‡€‚LM"#$€­â5 .ðñ…†‡óôõö÷øùúûü - 56"#$ -ûü¾¿56"#$ -6"#$ - ýþÿ_`6"#$ -]^_`6"#$' -#€‚STUVâãg 56"#$ -ƒ„ABCDEFGHIJ234KLM"#$+ -'…†‡ˆÈÉ”•–—ABCDEFGHIJ234KLM"#$ + 56"#$€­â +ûü¾¿56"#$€­â +6"#$€­â + ýþÿ_`6"#$€ÚÄ  +]^_`6"#$€­â* +#€‚STUVâãg 56"#$€­â +ƒ„ABCDEFGHIJ234KLM"#$€­â. +'…†‡ˆÈÉ”•–—ABCDEFGHIJ234KLM"#$€­â" ‰ýþÿ - 56"#$ -ßáâãhijklmnopqrsM"#$( -$Š´µ¶·¸¹º» !"#$H + 56"#$€­â +ßáâãhijklmnopqrsM"#$€­â+ +$Š´µ¶·¸¹º» !"#$€­âK D‹ö÷øùÝÞßàáýþÿ -€ âãg 56"#$ -ŒM"#$- -)óôõö÷øù˜™ü¹º»†‡ˆ56"#$ - -M"#$ +€ âãg 56"#$€­â +ŒM"#$€­â0 +)óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â +M"#$€­â! Ž - 56"#$ -s6"#$/ + 56"#$€­â +s6"#$€­â2 +úûü -€ âãg 56"#$ -Ú !"#$) -%´µ¶‘’“”•–¾—˜¾‚STUV56"#$ - 56"#$% -!™šyz{ΛœžŸg 56"#$ - ÁÂÃÄÅ¡¢¾£¤_M"#$ -¥¦„…×ØÙÚÛÜÝÞ -´µ¶·¸ 56"#$ -§¨¶·¸¹º~€‚LM"#$# -©ª«CD234 !"#$! -¬›œâãhyz{|}~€‚LM"#$""""""""""""""""" " " +€ âãg 56"#$€­â" +Ú !"#$€­â, +%´µ¶‘’“”•–¾—˜¾‚STUV56"#$€­â + 56"#$€­â( +!™šyz{ΛœžŸg 56"#$€­â" + ÁÂÃÄÅ¡¢¾£¤_M"#$€­â +¥¦„…×ØÙÚÛÜÝÞ€­â +´µ¶·¸ 56"#$€­â" +§¨¶·¸¹º~€‚LM"#$€­â& +©ª«CD234 !"#$€­â$ +¬›œâãhyz{|}~€‚LM"#$€­â""""""""""""""""" " " " " " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬******* * *  * From 16169b74154120522d968a03e4c236063b178f61 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 5 Dec 2023 17:16:57 +0200 Subject: [PATCH 13/44] add automemlimit --- cmd/otel-collector/main.go | 4 +++- go.mod | 5 ++++- go.sum | 7 ++++++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/cmd/otel-collector/main.go b/cmd/otel-collector/main.go index b030c4c..6309255 100644 --- a/cmd/otel-collector/main.go +++ b/cmd/otel-collector/main.go @@ -6,7 +6,9 @@ import ( "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/otelcol" - _ "go.uber.org/automaxprocs" + + _ "github.com/KimMachineGun/automemlimit" // default == 0.9 * cgroup_memory_limit + _ "go.uber.org/automaxprocs" // default == cgroup_cpu_limit ) func main() { diff --git a/go.mod b/go.mod index 5848dd4..8fddf0e 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ exclude github.com/StackExchange/wmi v1.2.0 require ( github.com/ClickHouse/clickhouse-go/v2 v2.10.1 + github.com/KimMachineGun/automemlimit v0.4.0 github.com/go-logfmt/logfmt v0.6.0 github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 github.com/grafana/jfr-parser v0.7.2-0.20230831140626-08fa3a941bf8 @@ -156,6 +157,8 @@ require ( google.golang.org/protobuf v1.31.0 ) +require github.com/containerd/cgroups/v3 v3.0.1 // indirect + require ( cloud.google.com/go v0.110.7 // indirect cloud.google.com/go/compute v1.23.0 // indirect @@ -229,7 +232,7 @@ require ( github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/checkpoint-restore/go-criu/v5 v5.3.0 // indirect - github.com/cilium/ebpf v0.7.0 // indirect + github.com/cilium/ebpf v0.9.1 // indirect github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect diff --git a/go.sum b/go.sum index 3cf2f5d..1a79bc8 100644 --- a/go.sum +++ b/go.sum @@ -138,6 +138,8 @@ github.com/IBM/sarama v1.41.2 h1:ZDBZfGPHAD4uuAtSv4U22fRZBgst0eEwGFzLj0fb85c= github.com/IBM/sarama v1.41.2/go.mod h1:xdpu7sd6OE1uxNdjYTSKUfY8FaKkJES9/+EyjSgiGQk= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= +github.com/KimMachineGun/automemlimit v0.4.0 h1:qOjSDbAUENEL6fiKmRKuAVhPaLijpoEHFDTE+I+prp0= +github.com/KimMachineGun/automemlimit v0.4.0/go.mod h1:pJhTW/nWJMj6SnWSU2TEKSlCaM+1N5Mej+IfS/5/Ol0= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -283,8 +285,9 @@ github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAc github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0 h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= +github.com/cilium/ebpf v0.9.1/go.mod h1:+OhNOIXx/Fnu1IE8bJz2dzOA+VSfyTfdNUVdlQnxUFY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -302,6 +305,8 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 h1:/inchEIKaYC1Akx+H+gqO04wryn5h75LSazbRlnya1k= github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/containerd/cgroups/v3 v3.0.1 h1:4hfGvu8rfGIwVIDd+nLzn/B9ZXx4BcCjzt5ToenJRaE= +github.com/containerd/cgroups/v3 v3.0.1/go.mod h1:/vtwk1VXrtoa5AaZLkypuOJgA/6DyPMZHJPGQNtlHnw= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= github.com/containerd/containerd v1.7.6 h1:oNAVsnhPoy4BTPQivLgTzI9Oleml9l/+eYIDYXRCYo8= From c3c67ffe8ac6d5096783d743a80bddf4d90e717c Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sat, 9 Dec 2023 11:40:47 +0200 Subject: [PATCH 14/44] support multiple event types in single jfr --- .../pyroscopereceiver/jfrparser/parser.go | 235 ++++++++---------- receiver/pyroscopereceiver/receiver.go | 72 +++--- .../{profile => types}/profile.go | 2 +- 3 files changed, 153 insertions(+), 156 deletions(-) rename receiver/pyroscopereceiver/{profile => types}/profile.go (92%) diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index c586ec4..f4312a1 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -7,25 +7,14 @@ import ( pprof_proto "github.com/google/pprof/profile" jfr_parser "github.com/grafana/jfr-parser/parser" - "github.com/grafana/jfr-parser/parser/types" - "github.com/grafana/jfr-parser/parser/types/def" - "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" - "github.com/metrico/otel-collector/receiver/pyroscopereceiver/profile" + jfr_types "github.com/grafana/jfr-parser/parser/types" + profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" ) type metadata struct { period int64 } -type parser struct { - md metadata - pa *jfr_parser.Parser - maxDecompressedSizeBytes int64 - - sampleMap map[uint32]uint32 // - locationMap map[uint32]*pprof_proto.Location // -} - const ( sampleTypeCpu = 0 sampleTypeWall = 1 @@ -34,9 +23,27 @@ const ( sampleTypeLock = 4 sampleTypeThreadPark = 5 sampleTypeLiveObject = 6 + + sampleTypeCount = 7 ) -var typetab = []profile.ProfileType{ +type pprof struct { + prof *profile_types.Profile + _pprof *pprof_proto.Profile +} + +type parser struct { + md metadata + _pa *jfr_parser.Parser + maxDecompressedSizeBytes int64 + + // TODO: try lazy allocation instead of redundant array + proftab [sampleTypeCount]*pprof // + sampleMap map[uint32]uint32 // + locationMap map[uint32]*pprof_proto.Location // +} + +var typetab = []profile_types.ProfileType{ sampleTypeCpu: {Type: "process_cpu", PeriodType: "cpu", PeriodUnit: "nanoseconds", SampleType: []string{"cpu"}, SampleUnit: []string{"nanoseconds"}}, sampleTypeWall: {Type: "wall", PeriodType: "wall", PeriodUnit: "nanoseconds", SampleType: []string{"wall"}, SampleUnit: []string{"nanoseconds"}}, sampleTypeInNewTlab: {Type: "memory", PeriodType: "space", PeriodUnit: "bytes", SampleType: []string{"alloc_in_new_tlab_objects", "alloc_in_new_tlab_bytes"}, SampleUnit: []string{"count", "bytes"}}, @@ -52,135 +59,89 @@ const ( ) // Creates a jfr parser that parse the accepted jfr buffer -func NewJfrParser(jfr *bytes.Buffer, md profile.Metadata, maxDecompressedSizeBytes int64) *parser { +func NewJfrParser(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) *parser { var period int64 if md.SampleRateHertz == 0 { period = 1 } else { period = 1e9 / int64(md.SampleRateHertz) } - pa := jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}) return &parser{ md: metadata{period: period}, - pa: pa, + _pa: jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}), maxDecompressedSizeBytes: maxDecompressedSizeBytes, - sampleMap: make(map[uint32]uint32), - locationMap: make(map[uint32]*pprof_proto.Location), - } -} - -// Gets the type of the first data record (non-settings), -// which is determines the profile type because a profile should bind to a single type. -// The caller should not call ParseEvent() to process the event, as it is being called internally. -func (p *parser) parseType() (def.TypeID, int, string, error) { - var event string - for { - t, err := p.pa.ParseEvent() - if err != nil { - if io.EOF == err { - return def.TypeID(0), -1, "", fmt.Errorf("found no data records (non-settings)") - } - return def.TypeID(0), -1, "", fmt.Errorf("jfr-parser ParseEvent error while parsing type: %w", err) - } - switch t { - case p.pa.TypeMap.T_EXECUTION_SAMPLE: - if wall == event { - return def.TypeID(0), sampleTypeWall, event, nil - } else { - return def.TypeID(0), sampleTypeCpu, event, nil - } - case p.pa.TypeMap.T_ALLOC_IN_NEW_TLAB: - return def.TypeID(0), sampleTypeInNewTlab, event, nil - case p.pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: - return def.TypeID(0), sampleTypeOutsideTlab, event, nil - case p.pa.TypeMap.T_MONITOR_ENTER: - return def.TypeID(0), sampleTypeLock, event, nil - case p.pa.TypeMap.T_THREAD_PARK: - return def.TypeID(0), sampleTypeThreadPark, event, nil - case p.pa.TypeMap.T_LIVE_OBJECT: - return def.TypeID(0), sampleTypeLiveObject, event, nil - case p.pa.TypeMap.T_ACTIVE_SETTING: - if p.pa.ActiveSetting.Name == event { - event = p.pa.ActiveSetting.Value - } - } + sampleMap: make(map[uint32]uint32), + locationMap: make(map[uint32]*pprof_proto.Location), } } -func (p *parser) ParsePprof() (*profile.Profile, error) { +// Parses the jfr buffer into pprof +func (pa *parser) ParsePprof() ([]*profile_types.Profile, error) { var ( - pprof = &pprof_proto.Profile{} - prof = &profile.Profile{ - PayloadType: profile.PayloadTypePprof, - } event string values = [2]int64{1, 0} ) - t, _type, event, err := p.parseType() - if err != nil { - return nil, err - } - prof.Type = typetab[_type] - - // add sample types and units to keep the pprof valid - for i, typ := range prof.Type.SampleType { - p.appendSampleType(pprof, typ, prof.Type.SampleUnit[i]) - } - - // first process the event that was parsed by parseType(), then proceed parsing for { + t, err := pa._pa.ParseEvent() + if err != nil { + if io.EOF == err { + break + } + return nil, fmt.Errorf("jfr-parser ParseEvent error: %w", err) + } + switch t { - case p.pa.TypeMap.T_EXECUTION_SAMPLE: - values[0] = 1 * int64(p.md.period) - ts := p.pa.GetThreadState(p.pa.ExecutionSample.State) + case pa._pa.TypeMap.T_EXECUTION_SAMPLE: + values[0] = 1 * int64(pa.md.period) + ts := pa._pa.GetThreadState(pa._pa.ExecutionSample.State) if ts != nil && ts.Name == "STATE_RUNNABLE" { - p.addStacktrace(pprof, sampleTypeCpu, p.pa.ExecutionSample.StackTrace, values[:1]) + pa.addStacktrace(sampleTypeCpu, pa._pa.ExecutionSample.StackTrace, values[:1]) } // TODO: this code is from github/grafana/pyroscope, need to validate that the query simulator handles this branch as expected for wall if wall == event { - p.addStacktrace(pprof, sampleTypeWall, p.pa.ExecutionSample.StackTrace, values[:1]) + pa.addStacktrace(sampleTypeWall, pa._pa.ExecutionSample.StackTrace, values[:1]) } - case p.pa.TypeMap.T_ALLOC_IN_NEW_TLAB: - values[1] = int64(p.pa.ObjectAllocationInNewTLAB.TlabSize) - p.addStacktrace(pprof, sampleTypeInNewTlab, p.pa.ObjectAllocationInNewTLAB.StackTrace, values[:2]) - case p.pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: - values[1] = int64(p.pa.ObjectAllocationOutsideTLAB.AllocationSize) - p.addStacktrace(pprof, sampleTypeOutsideTlab, p.pa.ObjectAllocationOutsideTLAB.StackTrace, values[:2]) - case p.pa.TypeMap.T_MONITOR_ENTER: - values[1] = int64(p.pa.JavaMonitorEnter.Duration) - p.addStacktrace(pprof, sampleTypeLock, p.pa.JavaMonitorEnter.StackTrace, values[:2]) - case p.pa.TypeMap.T_THREAD_PARK: - values[1] = int64(p.pa.ThreadPark.Duration) - p.addStacktrace(pprof, sampleTypeThreadPark, p.pa.ThreadPark.StackTrace, values[:2]) - case p.pa.TypeMap.T_LIVE_OBJECT: - p.addStacktrace(pprof, sampleTypeLiveObject, p.pa.LiveObject.StackTrace, values[:1]) - case p.pa.TypeMap.T_ACTIVE_SETTING: - if p.pa.ActiveSetting.Name == event { - event = p.pa.ActiveSetting.Value + case pa._pa.TypeMap.T_ALLOC_IN_NEW_TLAB: + values[1] = int64(pa._pa.ObjectAllocationInNewTLAB.TlabSize) + pa.addStacktrace(sampleTypeInNewTlab, pa._pa.ObjectAllocationInNewTLAB.StackTrace, values[:2]) + case pa._pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: + values[1] = int64(pa._pa.ObjectAllocationOutsideTLAB.AllocationSize) + pa.addStacktrace(sampleTypeOutsideTlab, pa._pa.ObjectAllocationOutsideTLAB.StackTrace, values[:2]) + case pa._pa.TypeMap.T_MONITOR_ENTER: + values[1] = int64(pa._pa.JavaMonitorEnter.Duration) + pa.addStacktrace(sampleTypeLock, pa._pa.JavaMonitorEnter.StackTrace, values[:2]) + case pa._pa.TypeMap.T_THREAD_PARK: + values[1] = int64(pa._pa.ThreadPark.Duration) + pa.addStacktrace(sampleTypeThreadPark, pa._pa.ThreadPark.StackTrace, values[:2]) + case pa._pa.TypeMap.T_LIVE_OBJECT: + pa.addStacktrace(sampleTypeLiveObject, pa._pa.LiveObject.StackTrace, values[:1]) + case pa._pa.TypeMap.T_ACTIVE_SETTING: + if pa._pa.ActiveSetting.Name == event { + event = pa._pa.ActiveSetting.Value } } + } - t, err = p.pa.ParseEvent() - if err != nil { - if io.EOF == err { - break - } - return nil, fmt.Errorf("jfr-parser ParseEvent error: %w", err) + ps := make([]*profile_types.Profile, 0) + for _, pp := range pa.proftab { + if nil != pp { + // assuming jfr-pprof conversion should not expand memory footprint, transitively applying jfr limit on pprof + pp.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider different event types for example low probability live event as part of allco profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) + pp._pprof.WriteUncompressed(pp.prof.Payload) + ps = append(ps, pp.prof) } } - - // assuming jfr-pprof conversion should not expand memory footprint - prof.Payload = compress.PrepareBuffer(p.maxDecompressedSizeBytes) - pprof.WriteUncompressed(prof.Payload) - return prof, nil + return ps, nil } -func nopSymbolProcessor(ref *types.SymbolList) {} +func nopSymbolProcessor(ref *jfr_types.SymbolList) {} -func (p *parser) addStacktrace(prof *pprof_proto.Profile, int, ref types.StackTraceRef, values []int64) { - st := p.pa.GetStacktrace(ref) +func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, values []int64) { + p := pa.getProfile(sampleType) + + st := pa._pa.GetStacktrace(ref) if nil == st { return } @@ -192,7 +153,7 @@ func (p *parser) addStacktrace(prof *pprof_proto.Profile, int, ref types.StackTr } // sum values for a stacktrace that already exist - sample := p.getSample(prof, uint32(ref)) + sample := pa.getSample(p._pprof, uint32(ref)) if sample != nil { addValues(sample.Value) return @@ -204,20 +165,20 @@ func (p *parser) addStacktrace(prof *pprof_proto.Profile, int, ref types.StackTr f := st.Frames[i] // append location that already exists - loc, found := p.getLocation(uint32(f.Method)) + loc, found := pa.getLocation(uint32(f.Method)) if found { locations = append(locations, loc) continue } // append new location - m := p.pa.GetMethod(f.Method) + m := pa._pa.GetMethod(f.Method) if m != nil { - cls := p.pa.GetClass(m.Type) + cls := pa._pa.GetClass(m.Type) if cls != nil { - clsName := p.pa.GetSymbolString(cls.Name) - methodName := p.pa.GetSymbolString(m.Name) - loc = p.appendLocation(prof, clsName+"."+methodName, uint32(f.Method)) + clsName := pa._pa.GetSymbolString(cls.Name) + methodName := pa._pa.GetSymbolString(m.Name) + loc = pa.appendLocation(p._pprof, clsName+"."+methodName, uint32(f.Method)) locations = append(locations, loc) } } @@ -225,39 +186,59 @@ func (p *parser) addStacktrace(prof *pprof_proto.Profile, int, ref types.StackTr v := make([]int64, len(values)) addValues(v) - p.appendSample(prof, locations, v, uint32(ref)) + pa.appendSample(p._pprof, locations, v, uint32(ref)) +} + +func (pa *parser) getProfile(sampleType int) *pprof { + p := pa.proftab[sampleType] + if nil == p { + p = &pprof{ + prof: &profile_types.Profile{ + Type: &typetab[sampleType], + PayloadType: profile_types.PayloadTypePprof, + }, + _pprof: &pprof_proto.Profile{}, + } + pa.proftab[sampleType] = p + + // add sample types and units to keep the pprof valid for libraries + for i, typ := range p.prof.Type.SampleType { + pa.appendSampleType(p._pprof, typ, p.prof.Type.SampleUnit[i]) + } + } + return p } -func (p *parser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) { +func (pa *parser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) { prof.SampleType = append(prof.SampleType, &pprof_proto.ValueType{ Type: typ, Unit: unit, }) } -func (p *parser) getSample(prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { - idx, ok := p.sampleMap[externStacktraceRef] +func (pa *parser) getSample(prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { + idx, ok := pa.sampleMap[externStacktraceRef] if !ok { return nil } return prof.Sample[idx] } -func (p *parser) appendSample(prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { +func (pa *parser) appendSample(prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { sample := &pprof_proto.Sample{ Location: locations, Value: values, } - p.sampleMap[externStacktraceRef] = uint32(len(prof.Sample)) + pa.sampleMap[externStacktraceRef] = uint32(len(prof.Sample)) prof.Sample = append(prof.Sample, sample) } -func (p *parser) getLocation(externFuncId uint32) (*pprof_proto.Location, bool) { - loc, ok := p.locationMap[externFuncId] +func (pa *parser) getLocation(externFuncId uint32) (*pprof_proto.Location, bool) { + loc, ok := pa.locationMap[externFuncId] return loc, ok } -func (p *parser) appendLocation(prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { +func (pa *parser) appendLocation(prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { // append new function of the new location newFunc := &pprof_proto.Function{ ID: uint64(len(prof.Function)) + 1, // starts with 1 not 0 @@ -271,6 +252,6 @@ func (p *parser) appendLocation(prof *pprof_proto.Profile, frame string, externF Line: []pprof_proto.Line{{Function: newFunc}}, } prof.Location = append(prof.Location, newLoc) - p.locationMap[externFuncId] = newLoc + pa.locationMap[externFuncId] = newLoc return newLoc } diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index eb2297c..5b7648c 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -14,8 +14,9 @@ import ( "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" "github.com/metrico/otel-collector/receiver/pyroscopereceiver/jfrparser" - "github.com/metrico/otel-collector/receiver/pyroscopereceiver/profile" + profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" + "github.com/prometheus/prometheus/model/labels" promql_parser "github.com/prometheus/prometheus/promql/parser" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" @@ -59,24 +60,31 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei return recv } +type attrs struct { + start uint64 + end uint64 + name string + labels *labels.Labels +} + func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { var ( tmp []string ok bool ) logs := plog.NewLogs() - rec := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords().AppendEmpty() params := req.URL.Query() - if err := setAttrsFromParams(¶ms, &rec); err != nil { - return &logs, err - } - // support jfr only if tmp, ok = params["format"]; !ok || tmp[0] != "jfr" { return &logs, fmt.Errorf("unsupported format, supported: [jfr]") } + attrs, err := getAttrsFromParams(¶ms) + if err != nil { + return &logs, err + } + // support only multipart/form-data file, err := recv.openMultipartJfr(req) if err != nil { @@ -90,7 +98,7 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { } resetHeaders(req) - md := profile.Metadata{SampleRateHertz: 0} + md := profile_types.Metadata{SampleRateHertz: 0} tmp, ok = params["sampleRate"] if ok { hz, err := strconv.ParseUint(tmp[0], 10, 64) @@ -100,15 +108,24 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { md.SampleRateHertz = hz } - prof, err := jfrparser.NewJfrParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() + ps, err := jfrparser.NewJfrParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() if err != nil { return &logs, fmt.Errorf("failed to parse pprof: %w", err) } - setAttrsFromProfile(prof, &rec) - - // TODO: consider to avoid copy in FromRaw() - rec.Body().SetEmptyBytes().FromRaw(prof.Payload.Bytes()) + recs := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() + for _, pp := range ps { + rec := recs.AppendEmpty() + rec.SetTimestamp(pcommon.Timestamp(attrs.start)) + rec.Attributes().PutStr("duration_ns", fmt.Sprint((attrs.end-attrs.start)*1e9)) + rec.Attributes().PutStr(nameLabel, attrs.name) + for _, l := range *attrs.labels { + rec.Attributes().PutStr(l.Name, l.Value) + } + setAttrsFromProfile(pp, &rec) + // TODO: consider to avoid copy in FromRaw() + rec.Body().SetEmptyBytes().FromRaw(pp.Payload.Bytes()) + } return &logs, nil } @@ -145,24 +162,25 @@ func resetHeaders(req *http.Request) { req.ContentLength = -1 } -func setAttrsFromParams(params *url.Values, rec *plog.LogRecord) error { +func getAttrsFromParams(params *url.Values) (*attrs, error) { var ( tmp []string ok bool - paramsv = *params + paramsv = *params + att attrs = attrs{} ) if tmp, ok = paramsv["from"]; !ok { - return fmt.Errorf("required start time is missing") + return nil, fmt.Errorf("required start time is missing") } start, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return fmt.Errorf("failed to parse start time: %w", err) + return nil, fmt.Errorf("failed to parse start time: %w", err) } - rec.SetTimestamp(pcommon.Timestamp(start)) + att.start = start if tmp, ok = paramsv["name"]; !ok { - return fmt.Errorf("required labels are missing") + return nil, fmt.Errorf("required labels are missing") } i := strings.Index(tmp[0], "{") length := len(tmp[0]) @@ -172,28 +190,26 @@ func setAttrsFromParams(params *url.Values, rec *plog.LogRecord) error { promql := tmp[0][i:length] labels, err := promql_parser.ParseMetric(promql) if err != nil { - return fmt.Errorf("failed to parse labels: %w", err) - } - for _, l := range labels { - rec.Attributes().PutStr(l.Name, l.Value) + return nil, fmt.Errorf("failed to parse labels: %w", err) } + att.labels = &labels } // required app name name := tmp[0][:i] - rec.Attributes().PutStr(nameLabel, name) + att.name = name if tmp, ok = paramsv["until"]; !ok { - return fmt.Errorf("required end time is missing") + return nil, fmt.Errorf("required end time is missing") } end, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return fmt.Errorf("failed to parse end time: %w", err) + return nil, fmt.Errorf("failed to parse end time: %w", err) } - rec.Attributes().PutStr("duration_ns", fmt.Sprint((end-start)*1e9)) - return nil + att.end = end + return nil, nil } -func setAttrsFromProfile(prof *profile.Profile, rec *plog.LogRecord) { +func setAttrsFromProfile(prof *profile_types.Profile, rec *plog.LogRecord) { rec.Attributes().PutStr("type", prof.Type.Type) rec.Attributes().PutStr("sample_type", strings.Join(prof.Type.SampleType, ",")) rec.Attributes().PutStr("sample_unit", strings.Join(prof.Type.SampleUnit, ",")) diff --git a/receiver/pyroscopereceiver/profile/profile.go b/receiver/pyroscopereceiver/types/profile.go similarity index 92% rename from receiver/pyroscopereceiver/profile/profile.go rename to receiver/pyroscopereceiver/types/profile.go index 9c077f2..7aa4b0e 100644 --- a/receiver/pyroscopereceiver/profile/profile.go +++ b/receiver/pyroscopereceiver/types/profile.go @@ -21,7 +21,7 @@ type ProfileType struct { } type Profile struct { - Type ProfileType + Type *ProfileType Payload *bytes.Buffer PayloadType uint32 } From 46fab1e53d7cd267229fed9a153eb39a85eef719 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 09:21:52 +0200 Subject: [PATCH 15/44] fix return nil attrs --- receiver/pyroscopereceiver/jfrparser/parser.go | 13 +++++++++++-- receiver/pyroscopereceiver/receiver.go | 4 +--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index f4312a1..3cbd470 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -37,7 +37,6 @@ type parser struct { _pa *jfr_parser.Parser maxDecompressedSizeBytes int64 - // TODO: try lazy allocation instead of redundant array proftab [sampleTypeCount]*pprof // sampleMap map[uint32]uint32 // locationMap map[uint32]*pprof_proto.Location // @@ -128,7 +127,7 @@ func (pa *parser) ParsePprof() ([]*profile_types.Profile, error) { for _, pp := range pa.proftab { if nil != pp { // assuming jfr-pprof conversion should not expand memory footprint, transitively applying jfr limit on pprof - pp.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider different event types for example low probability live event as part of allco profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) + pp.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider event distribution for example low probability live event as part of alloc profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) pp._pprof.WriteUncompressed(pp.prof.Payload) ps = append(ps, pp.prof) } @@ -165,6 +164,16 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val f := st.Frames[i] // append location that already exists + // TODO: fix a bug where multiple f.Method vals are mapped to same func name but creates distinct pprof func, example: + // function { + // id: 119 + // name: 118 + // } + // function { + // id: 120 + // name: 118 + // } + // $ cat | protoc --decode=perftools.profiles.Profile $HOME/go/pkg/mod/github.com/google/pprof@/proto/profile.proto --proto_path $HOME/go/pkg/mod/github.com/google/pprof@/proto/ >> /tmp/pprof.txt loc, found := pa.getLocation(uint32(f.Method)) if found { locations = append(locations, loc) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 5b7648c..6432241 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -123,7 +123,6 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { rec.Attributes().PutStr(l.Name, l.Value) } setAttrsFromProfile(pp, &rec) - // TODO: consider to avoid copy in FromRaw() rec.Body().SetEmptyBytes().FromRaw(pp.Payload.Bytes()) } return &logs, nil @@ -206,7 +205,7 @@ func getAttrsFromParams(params *url.Values) (*attrs, error) { return nil, fmt.Errorf("failed to parse end time: %w", err) } att.end = end - return nil, nil + return &att, nil } func setAttrsFromProfile(prof *profile_types.Profile, rec *plog.LogRecord) { @@ -245,7 +244,6 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err var err error // applies an interceptor that enforces the configured request body limit - // TODO: rm redundant interceptors applied by ToServer() like decompressor if recv.httpServer, err = recv.conf.Protocols.Http.ToServer(host, recv.settings.TelemetrySettings, recv.httpMux); err != nil { return fmt.Errorf("failed to create http server: %w", err) } From dedec38b92ecb18430375722b5e3b444814bc1e8 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 10:31:36 +0200 Subject: [PATCH 16/44] partition global maps per type --- .../pyroscopereceiver/jfrparser/parser.go | 93 ++++++++++++------- 1 file changed, 59 insertions(+), 34 deletions(-) diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index 3cbd470..e3aa6de 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -37,9 +37,9 @@ type parser struct { _pa *jfr_parser.Parser maxDecompressedSizeBytes int64 - proftab [sampleTypeCount]*pprof // - sampleMap map[uint32]uint32 // - locationMap map[uint32]*pprof_proto.Location // + proftab [sampleTypeCount]*pprof // + samptab [sampleTypeCount]map[uint32]uint32 // + loctab [sampleTypeCount]map[uint32]*pprof_proto.Location // } var typetab = []profile_types.ProfileType{ @@ -69,9 +69,6 @@ func NewJfrParser(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedS md: metadata{period: period}, _pa: jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}), maxDecompressedSizeBytes: maxDecompressedSizeBytes, - - sampleMap: make(map[uint32]uint32), - locationMap: make(map[uint32]*pprof_proto.Location), } } @@ -139,6 +136,9 @@ func nopSymbolProcessor(ref *jfr_types.SymbolList) {} func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, values []int64) { p := pa.getProfile(sampleType) + if nil == p { + p = pa.addProfile(sampleType) + } st := pa._pa.GetStacktrace(ref) if nil == st { @@ -151,8 +151,9 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val } } + iref := uint32(ref) // sum values for a stacktrace that already exist - sample := pa.getSample(p._pprof, uint32(ref)) + sample := pa.getSample(sampleType, p._pprof, iref) if sample != nil { addValues(sample.Value) return @@ -162,6 +163,7 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val locations := make([]*pprof_proto.Location, 0, len(st.Frames)) for i := 0; i < len(st.Frames); i++ { f := st.Frames[i] + imethod := uint32(f.Method) // append location that already exists // TODO: fix a bug where multiple f.Method vals are mapped to same func name but creates distinct pprof func, example: @@ -174,8 +176,8 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val // name: 118 // } // $ cat | protoc --decode=perftools.profiles.Profile $HOME/go/pkg/mod/github.com/google/pprof@/proto/profile.proto --proto_path $HOME/go/pkg/mod/github.com/google/pprof@/proto/ >> /tmp/pprof.txt - loc, found := pa.getLocation(uint32(f.Method)) - if found { + loc := pa.getLocation(sampleType, imethod) + if loc != nil { locations = append(locations, loc) continue } @@ -187,7 +189,7 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val if cls != nil { clsName := pa._pa.GetSymbolString(cls.Name) methodName := pa._pa.GetSymbolString(m.Name) - loc = pa.appendLocation(p._pprof, clsName+"."+methodName, uint32(f.Method)) + loc = pa.appendLocation(sampleType, p._pprof, clsName+"."+methodName, imethod) locations = append(locations, loc) } } @@ -195,25 +197,26 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val v := make([]int64, len(values)) addValues(v) - pa.appendSample(p._pprof, locations, v, uint32(ref)) + pa.appendSample(sampleType, p._pprof, locations, v, iref) } func (pa *parser) getProfile(sampleType int) *pprof { - p := pa.proftab[sampleType] - if nil == p { - p = &pprof{ - prof: &profile_types.Profile{ - Type: &typetab[sampleType], - PayloadType: profile_types.PayloadTypePprof, - }, - _pprof: &pprof_proto.Profile{}, - } - pa.proftab[sampleType] = p + return pa.proftab[sampleType] +} - // add sample types and units to keep the pprof valid for libraries - for i, typ := range p.prof.Type.SampleType { - pa.appendSampleType(p._pprof, typ, p.prof.Type.SampleUnit[i]) - } +func (pa *parser) addProfile(sampleType int) *pprof { + p := &pprof{ + prof: &profile_types.Profile{ + Type: &typetab[sampleType], + PayloadType: profile_types.PayloadTypePprof, + }, + _pprof: &pprof_proto.Profile{}, + } + pa.proftab[sampleType] = p + + // add sample types and units to keep the pprof valid for libraries + for i, typ := range p.prof.Type.SampleType { + pa.appendSampleType(p._pprof, typ, p.prof.Type.SampleUnit[i]) } return p } @@ -225,29 +228,45 @@ func (pa *parser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) }) } -func (pa *parser) getSample(prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { - idx, ok := pa.sampleMap[externStacktraceRef] +func (pa *parser) getSample(sampleType int, prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { + m := pa.samptab[sampleType] + if nil == m { + return nil + } + idx, ok := m[externStacktraceRef] if !ok { return nil } return prof.Sample[idx] } -func (pa *parser) appendSample(prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { +func (pa *parser) appendSample(sampleType int, prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { sample := &pprof_proto.Sample{ Location: locations, Value: values, } - pa.sampleMap[externStacktraceRef] = uint32(len(prof.Sample)) + m := pa.samptab[sampleType] + if nil == m { + m = make(map[uint32]uint32) + pa.samptab[sampleType] = m + } + m[externStacktraceRef] = uint32(len(prof.Sample)) prof.Sample = append(prof.Sample, sample) } -func (pa *parser) getLocation(externFuncId uint32) (*pprof_proto.Location, bool) { - loc, ok := pa.locationMap[externFuncId] - return loc, ok +func (pa *parser) getLocation(sampleType int, externFuncId uint32) *pprof_proto.Location { + m := pa.loctab[sampleType] + if nil == m { + return nil + } + loc, ok := m[externFuncId] + if !ok { + return nil + } + return loc } -func (pa *parser) appendLocation(prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { +func (pa *parser) appendLocation(sampleType int, prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { // append new function of the new location newFunc := &pprof_proto.Function{ ID: uint64(len(prof.Function)) + 1, // starts with 1 not 0 @@ -260,7 +279,13 @@ func (pa *parser) appendLocation(prof *pprof_proto.Profile, frame string, extern ID: uint64(len(prof.Location)) + 1, // starts with 1 not 0 Line: []pprof_proto.Line{{Function: newFunc}}, } + prof.Location = append(prof.Location, newLoc) - pa.locationMap[externFuncId] = newLoc + m := pa.loctab[sampleType] + if nil == m { + m = make(map[uint32]*pprof_proto.Location) + pa.loctab[sampleType] = m + } + m[externFuncId] = newLoc return newLoc } From 3105547f1890d4c1376cabd5e24b21b5abaff057 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 10:45:11 +0200 Subject: [PATCH 17/44] fix receiver test --- .../pyroscopereceiver_test.go | 122 +- .../cortex-dev-01__kafka-0__cpu__0.pb | 775 +++++----- .../testdata/memory_alloc_live_example.jfr | Bin 0 -> 419286 bytes .../memory_example_alloc_in_new_tlab.pb | 1353 +++++++++++++++++ .../testdata/memory_example_live_object.pb | 1239 +++++++++++++++ 5 files changed, 3081 insertions(+), 408 deletions(-) create mode 100644 receiver/pyroscopereceiver/testdata/memory_alloc_live_example.jfr create mode 100644 receiver/pyroscopereceiver/testdata/memory_example_alloc_in_new_tlab.pb create mode 100644 receiver/pyroscopereceiver/testdata/memory_example_live_object.pb diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 8f75a2e..0548d5f 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -24,6 +24,31 @@ import ( "go.uber.org/zap" ) +type jfrtest_t struct { + name string + urlParams map[string]string + jfr string + expected *plog.Logs + err error +} + +func loadTestData(t *testing.T, fname string) *[]byte { + b, err := os.ReadFile(filepath.Join("testdata", fname)) + assert.NoError(t, err, "failed to load expected pprof payload") + return &b +} + +func run(t *testing.T, tests *[]jfrtest_t, collectorAddr string, sink *consumertest.LogsSink) { + for _, tt := range *tests { + t.Run(tt.name, func(t *testing.T) { + assert.NoError(t, send(t, collectorAddr, tt.urlParams, tt.jfr), "send shouldn't have been failed") + actual := sink.AllLogs() + assert.NoError(t, plogtest.CompareLogs(*tt.expected, actual[0])) + sink.Reset() + }) + } +} + func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { addr := getAvailableLocalTcpPort(t) config := &Config{ @@ -89,19 +114,10 @@ func send(t *testing.T, addr string, urlParams map[string]string, jfr string) er return nil } -func TestPyroscopeIngest(t *testing.T) { - type test_t struct { - name string - urlParams map[string]string - jfr string - expected *plog.Logs - err error - } - tests := make([]test_t, 1) - - payload, err := os.ReadFile(filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.pb")) - assert.NoError(t, err, "failed to load expected pprof payload") - tests[0] = test_t{ +func TestPyroscopeIngestJfrCpu(t *testing.T) { + tests := make([]jfrtest_t, 1) + pb := loadTestData(t, "cortex-dev-01__kafka-0__cpu__0.pb") + tests[0] = jfrtest_t{ name: "send labeled multipart form data gzipped cpu jfr to http ingest endpoint", urlParams: map[string]string{ "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", @@ -111,7 +127,7 @@ func TestPyroscopeIngest(t *testing.T) { "sampleRate": "100", }, jfr: filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.jfr"), - expected: gen(&profile_t{ + expected: gen([]*profile_t{{ timestamp: 1700332322, attrs: map[string]any{ "__name__": "com.example.App", @@ -125,22 +141,66 @@ func TestPyroscopeIngest(t *testing.T) { "period_unit": "nanoseconds", "payload_type": "0", }, - body: &payload, - }), + body: pb, + }}), err: nil, } - addr, sink := startHttpServer(t) collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) + run(t, &tests, collectorAddr, sink) +} - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - assert.NoError(t, send(t, collectorAddr, tt.urlParams, tt.jfr), "send shouldn't have been failed") - actual := sink.AllLogs() - assert.NoError(t, plogtest.CompareLogs(*tt.expected, actual[0])) - sink.Reset() - }) +func TestPyroscopeIngestJfrMemory(t *testing.T) { + tests := make([]jfrtest_t, 1) + allocInNewTlabPb := loadTestData(t, "memory_example_alloc_in_new_tlab.pb") + liveObjectPb := loadTestData(t, "memory_example_live_object.pb") + tests[0] = jfrtest_t{ + name: "send labeled multipart form data gzipped memoty jfr to http ingest endpoint", + urlParams: map[string]string{ + "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", + "from": "1700332322", + "until": "1700332329", + "format": "jfr", + }, + jfr: filepath.Join("testdata", "memory_alloc_live_example.jfr"), + expected: gen([]*profile_t{{ + timestamp: 1700332322, + attrs: map[string]any{ + "__name__": "com.example.App", + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + "duration_ns": "7000000000", + "type": "memory", + "sample_type": "alloc_in_new_tlab_objects,alloc_in_new_tlab_bytes", + "sample_unit": "count,bytes", + "period_type": "space", + "period_unit": "bytes", + "payload_type": "0", + }, + body: allocInNewTlabPb, + }, + { + timestamp: 1700332322, + attrs: map[string]any{ + "__name__": "com.example.App", + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + "duration_ns": "7000000000", + "type": "memory", + "sample_type": "live", + "sample_unit": "count", + "period_type": "objects", + "period_unit": "count", + "payload_type": "0", + }, + body: liveObjectPb, + }}), + err: nil, } + + addr, sink := startHttpServer(t) + collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) + run(t, &tests, collectorAddr, sink) } // Returns an available local tcp port. It doesnt bind the port, and there is a race condition as @@ -160,12 +220,14 @@ type profile_t struct { attrs map[string]any } -func gen(in *profile_t) *plog.Logs { +func gen(in []*profile_t) *plog.Logs { profiles := plog.NewLogs() - s := profiles.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() - rec := s.AppendEmpty() - _ = rec.Attributes().FromRaw(in.attrs) - rec.SetTimestamp(pcommon.Timestamp(in.timestamp)) - rec.Body().SetEmptyBytes().FromRaw(*in.body) + recs := profiles.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() + for _, p := range in { + rec := recs.AppendEmpty() + _ = rec.Attributes().FromRaw(p.attrs) + rec.SetTimestamp(pcommon.Timestamp(p.timestamp)) + rec.Body().SetEmptyBytes().FromRaw(*p.body) + } return &profiles } diff --git a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb index b447d3e..774a80f 100644 --- a/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb +++ b/receiver/pyroscopereceiver/testdata/cortex-dev-01__kafka-0__cpu__0.pb @@ -1,383 +1,402 @@ -+ -$ -  !"#$€­â -%&'()*+,-./0123456"#$€­â -789:;< 56"#$€­â -=>?@ABCDEFGHIJ234KLM"#$€­â -NOPQRSTUV56"#$€­â -WXYZ[\]^_`6"#$€­â -abcdefg 56"#$€­â -hijklmnopqrsM"#$€­â -tuvwxyz{|}~€‚LM"#$€­âE ->ƒ„…†‡ˆ‰Š‹ŒŽ‘’_“”•–—ABCDEFGHIJ234KLM"#$€­âE ->˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ # -¨©ª«¬­®¯°±²³6"#$€­â) -"´µ¶·¸¹º» !"#$€­â -NOP¼½¾¿À¾Á6"#$€­â# -ÂÃÄÅÆÇÈÉ€‚LM"#$€­â -ÊËÌÍÎÏÐ#$€­â? -8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â -ÔÌÍÎÏÐ#$€­â -ÕÖ×ØÙÚÛÜÝÞ€­â -ßs6"#$€­â -àáâãhijklmnopqrs6"#$€­â% -äåæçèéêëìíîïðñ€­â& -789:;<  !"#$€­â -òóô€ŽÎ õö€­â[ -T÷øùúûüýþÿ€_“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­âR -K‘’“”•–“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â -¨©—˜ 56"#$€ÚÄ $ -™š›œâãhyz{|žîïðñ€­â -Ÿ ¡¢£³6"#$€­â. -'Š‹ŒŽâãhyz{|êëìíîïðñ€­âK -D¤¥¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€Â×/D -=“”‚ƒ„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â! -ª´µ«¬­®¯°ðñ€­â: -3±†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â -_M"#$€­â/ -(²³´µ¶·¸æçèéêëìíîïðñ€­â -¹ºM"#$€ÚÄ ' - »¼½¸¾èéêëìíîïðñ€­â) -"»¼½¸æçèéêëìíîïðñ€­â+ -$¿ÀÁÂÃľèéêëìíîïðñ€­â, -%ÅÆÇÈÉ”•–—ABCDEFGHIJ234KLM"#$€­â/ -(ÊËÌÍÎϽ¸¾èéêëìíîïðñ€´‰' - Ðѽ¸¾èéêëìíîïðñ€­â+ -$™šÒÓÃľèéêëìíîïðñ€­â -ÔÕÖ×ØÙÏÐ#$€­â -ÚÛö€­â% -ÓÃľèéêëìíîïðñ€­â4 --ÜÝÞß³´àáSTUVâãg 56"#$€­â< -5„…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â -Úäö€ÚÄ  òö€­â> -7å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â? -8ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ  -æÛö€­â+ -$ÝÞß³´µçèéêëìíîïðñ€­â9 -2éêëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â/ -(îïðñòѽ¸¾èéêëìíîïðñ€­â+ -$óôõö÷øùúûü - 56"#$€­âH -Aýþÿ€å…†‡ˆ‰Š‹ŒŽâãhyz{|êëìíîïðñ€­â -‚âãhyz{|žîïðñ€­â -µƒ„…†‡€‚LM"#$€­â= -6ˆ‰Š‹ŒŽîïðñòѽ¸¾èéêëìíîïðñ€­â; -4žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â+ -$ß³´µçèéêëìíîïðñ€­â+ -$ß»¼½¸æçèéêëìíîïðñ€­â= -6‘¨©’“¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â/ -(”•ÌÍÎϽ¸¾èéêëìíîïðñ€­â% -ij–—ÄÅÆÇÈÉ€‚LM"#$€­â* -#˜™š›œžŸ ¡¢£¤Ñ½¥¦$€­â. -'W§¨úûü -  !"#$€­â -©M"#$€­â -¨©—˜ 56"#$€­â" -ª«¬­®¯°±²³¾´¦$€­â -µ¶·¸¹º~€‚LM"#$€ÚÄ ; -4»¼½¾¿ÀÁ¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â -ÂÃÄÅÆǦ$€­â, -%ÈÉÊËÌÍÎÏР¡¢£¤Ñ½¥¦$€­â -ijklmnopqrsM"#$€­â* -#˜™š›œžŸ ¡¢£¤Ñ½¥¦$€­â -Ñ£¤Ñ½¥¦$€­â -hijklmnopqrsM"#$€­â2 -+ƒ„…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$€­â, -%ÕÖ×ØÌÍÎÏР¡¢£¤Ñ½¥¦$€ÚÄ  -ÙÔËÌÍÎÏÐ#$€­â -ÚÛÜÝÞѽ¥¦$€­â: -3ßàáâãäåæç•–“”•–—ABCDEFGHIJ234KLM"#$€­â( -!艊‹ŒŽîïðñòѽ¥¦$€­â -M"#$€­â' - ß³´µƒ„…†‡€‚LM"#$€­â" -ª«¬­®¯°±²³¾´¦$€­â$ -×ØÎÏР¡¢£¤Ñ½¥¦$€­â -aéêëìíîï¦$€­â# -ÂÃÄÅÆÇÈÉ€‚LM"#$€­â2 -+ðñ…†‡ÒÓª«Ô¬­®¯°±²³¾´¦$€­âO -Hòóô‹Œõö÷øùúûüýþÿ -€ âãg 56"#$€­â -ËÌÍÎϽ¥¦$€­â -‚ƒ„…×ØÙÚÛÜÝÞ€ÚÄ $ -¨©—˜ †‡ˆ56"#$€­â* -#‰Š‹Óª«¬­®¯°±²³¾´¦$€­â+ -$ŒGHI“”•–—ABCDEFGHIJ234KLM"#$€­â -ŽSTUV56"#$€­â" -‘’¶·¸¹º~€‚LM"#$€­â< -5“”•ˆ–—óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â( -!ßij–—ÄÅÆÇÈÉ€‚LM"#$€­â% -ij–—ÄÅÆÇÈÉ€‚LM"#$€­â - šCD234LM"#$€­â* -#›¦§“”•–—ABCDEFGHIJ234KLM"#$€­â - ÌÍÎÏÐ#$€­â= -6œžŸ ¡¢£¤¥¦§_É”•–—ABCDEFGHIJ234KLM"#$€ÚÄ = -6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â! -aéꩪ«¬~€‚LM"#$€­â# -¨©ª«¬­®¯°±²³6"#$€­â( -!•–“”•–—ABCDEFGHIJ234KLM"#$€­â -­ÌÍÎÏÐ#$€­â - aéêëì®#$€ÚÄ ( -!¯°±²³´STUV !"#$€­â -µ¶·¾¸¹_º»M"#$€­â -ÕÖ×ØÙÚÛÜÝÞ€´‰ -¼âãhyz{|}~½STUV56"#$€­â ->?@¾¿56"#$€ÚÄ  +& + + €­â+ +$ !"#$%&'()*+,-./0123456789:;<=>?@€­â +ABCDEFGHIJKLMNO€­â +PQRSTU+,-./012NO€­â +VWXY €­â +Z[\]^/01_`abNO€­â +cdefghijklO€­â +mnopqrs+,-./012NO€­â +tuvwxyz{|}~€­â* +#€‚ƒ„…†‡ˆ‰Š‹ŒŽ€­â@ +9‘’“”•–—˜™š›œžk + €­â@ +9Ÿ ¡¢£¤¥¦§¨©ª«¬k­® + €ÚÄ # +¯°±²³´µ¶·¸¹ºO€­â) +"»¼½¾¿ÀÁÂ/0156789:;<=>?@€­â +Z[\ÃÄÅÆÇÅÈO€­â$ +ÉÊËÌÍÎÏЋŒŽ€­â +ÑÒÓÔÕÖ×€­â: +3ØÙÚ¥¦§¨©ª«¬k­® + €­â +ÛÓÔÕÖ×€­â +ÜÝÞßàáâãä倭â +æO€­â +çèéêtuvwxyz{|}~O€­â% +ëìíîïðñòóô›õö÷ø€­â& +PQRSTU+,-./0123456789:;<=>?@€­â +ùúû€ŽÎ üý€­â] +Vþÿ€‚ƒ„…†‡ˆk ‰Š‹ŒŽ›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­âR +K—˜™š› ‰Š‹ŒŽ›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â +¯°œ,-./012NO€ÚÄ ( +!žŸ ¡éêt…†‡ˆ¢£õö÷ø€­â +¤¥¦§¨ºO€­â2 ++‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­âF +?©ª«¬­®ØÙÚ¥¦§¨©ª«¬k­® + €Â×/F +? ‰Š‹ŒŽ›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â! +¯»¼°9±²³/01´µ÷ø€­â> +7¶Ž›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â +k€­â/ +(·¸¹º»¼½íîïðñòóô›õö÷ø€­â +¾¿€ÚÄ ' + ÀÁ½Ãïðñòóô›õö÷ø€­â) +"ÀÁ½íîïðñòóô›õö÷ø€­â+ +$ÄÅÆÇÈÉÃïðñòóô›õö÷ø€­â( +!ÊËÌÍÎ + €­â/ +(ÏÐÑÒÓÔ½Ãïðñòóô›õö÷ø€´‰' + ÕÖ½Ãïðñòóô›õö÷ø€­â+ +$žŸ×ØÈÉÃïðñòóô›õö÷ø€­â +ÙÚÖ×€­â +ÛÜý€­â% +ØÈÉÃïðñòóô›õö÷ø€­â4 +-ÝÞßูáâ_`ab3456789ãäs+,-./012NO€­â@ +9‹ŒŽ›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â +Ûåý€ÚÄ  ùý€­âB +;曌Ž›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â: +3ØÙÚ¥¦§¨©ª«¬k­® + €ÚÄ  +çÜý€­â+ +$Þßูºèéðñòóô›õö÷ø€­â4 +-êëìí¬k­® + €­â/ +(ïðñòóÖ½Ãïðñòóô›õö÷ø€­â+ +$ôõö÷øùúûüý()*+,-./012NO€­âL +Eþÿ€‚曌Ž›‘’“”•éêt…†‡ˆ–ñòóô›õö÷ø€­â" +ƒéêt…†‡ˆ¢£õö÷ø€­â +º„…†‡ˆ‹ŒŽ€­â= +6‰Š‹ŒŽïðñòóÖ½Ãïðñòóô›õö÷ø€­â6 +/¤¥¦§¨©ª«¬k­® + €­â+ +$‘ูºèéðñòóô›õö÷ø€­â+ +$æÀÁ½íîïðñòóô›õö÷ø€­â8 +1’­®“”¨©ª«¬k­® + €­â/ +(•–ÑÒÓÔ½Ãïðñòóô›õö÷ø€­â& +uv—˜ËÌÍÎÏЋŒŽ€­â* +#™š›œžŸ ¡¢£¤¥Ö¦§€­â. +'c¨©ûüý()*+,-./0123456789:;<=>?@€­â +ª€­â +¯°œ,-./012NO€­â" +«¬­®¯°±²³´Åµ§€­â" +¶·¸¹º»Š‹ŒŽ€ÚÄ 6 +/¼½¾¿ÀÁ«¬k­® + €­â +ÃÄÅÆÇȧ€­â, +%ÉÊËÌÍÎÏÐÑ¡¢£¤¥Ö¦§€­â +uvwxyz{|}~€­â* +#™š›œžŸ ¡¢£¤¥Ö¦§€­â +Ò¤¥Ö¦§€­â +tuvwxyz{|}~€­â2 ++‘’“ÓÔ«¬Õ­®¯°±²³´Åµ§€­â, +%Ö×ØÙÍÎÏÐÑ¡¢£¤¥Ö¦§€ÚÄ  +ÚÛÒÓÔÕÖ×€­â +ÛÜÝÞßÖ¦§€­â3 +,àáâãäåæçè + €­â( +!銋ŒŽïðñòóÖ¦§€­â +€­â( +!‘ูº„…†‡ˆ‹ŒŽ€­â" +«¬­®¯°±²³´Åµ§€­â$ +ØÙÏÐÑ¡¢£¤¥Ö¦§€­â +mêëìíîï𧀭â$ +ÉÊËÌÍÎÏЋŒŽ€­â2 ++ñò‘’“ÓÔ«¬Õ­®¯°±²³´Åµ§€­âO +HóôõŒö÷øùúûüýþÿ€%&'()+,-./0123456789ãäs+,-./012NO€­â +‚ÐÑÒÓÔ¦§€­â +ƒ„…†Þßàáâãäå€ÚÄ $ +¯°œ,-./012345‡ˆ‰NO€­â* +#Š‹ŒÔ«¬­®¯°±²³´Åµ§€­â& +Ž + €­â +‘_`abNO€­â$ +’“·¸¹º»Š‹ŒŽ€­â< +5”•–”—˜ôõö÷øùú™šýÀÁÂ/015‡ˆ‰NO€­â) +"æ?@€­â +¶·¸Å¹ºk»¼€­â +ÜÝÞßàáâãä倴‰% +½éêt…†‡ˆ‰Š¾_`abNO€­â +WXY¿À/01NO€ÚÄ  -¾À³6"#$€­â -ÎÏÐ#$€­â$ -¨©ª«¬­ÁÂÃÄÅîï¦$€­â -W§ÆÇÈÉÊËѽ¥¦$€­â+ -$89:;<ÌÓª«¬­®¯°±²³¾´¦$€­â -ÍΦ$€­â -Ïл¼Ñ£¤Ñ½¥¦$€­â -¥¦$€­â" -›œžŸ¡¢£¤Ñ½¥¦$€­â -ÒÓÔÕÖ×ØÙÚÛܦ$€­â - £¤Ñ½¥¦$€­â, -%‰ŠÝš›œžŸ ¡¢£¤Ñ½¥¦$€­â" -ÞßàáâãäåÙÚÛܦ$€­â - æçè½¥¦$€­â" -ÔÕÖ×ØÙéêÙÚÛܦ$€­â - ëòѽ¥¦$€ÚÄ  -ìéêÙÚÛܦ$€ÚÄ  - ß»¼½¥¦$€ÚÄ  -íëìíîï¦$€­â -OPîïðÌÍÎϽ¥¦$€­â -ñòóôõÚÛÜÝÞ€­â -öò÷ôõÚÛÜÝÞ€­â -øùúûÚÛÜÝÞ€­â -ü”•ÌÍÎϽ¥¦$€ÚÄ  -ý¡¢£¤Ñ½¥¦$€­â$ -þÿßàáâãäåÙÚÛܦ$€­â( -!€Óª«¬­®¯°±²³¾´¦$€­â, -%‚ƒ„Óª«Ô¬­®¯°±²³¾´¦$€­â - £¤Ñ½¥¦$€­â - ѽ¥¦$€­â -îïðñòѽ¥¦$€­â - л¼½¥¦$€­â -ÕÖ×ØÙéêÙÚÛܦ$€­â& -„Óª«¬­®¯°±²³¾´¦$€­â - ѽ¥¦$€­â -ÊËÌÍÎϽ¥¦$€­â -…ÔÕÖ×ØÙÚÛܦ$€­â& -„Óª«¬­®¯°±²³¾´¦$€­â -½¥¦$€­â$ -­†ÕÖ×ØÙéêÙÚÛܦ$€­â. -'‡ˆ‰Š‹ŒÞßàáâãäåÙÚÛܦ$€­â& -„Óª«¬­®¯°±²³¾´¦$€­â$ -†ÕÖ×ØÙéêÙÚÛܦ$€­â -Ž²³¾´¦$€ÚÄ ( -!˜™š›œžŸ¡¢£¤Ñ½¥¦$€­â - ÙÚÛܦ$€­â& -š›œžŸ ¡¢£¤Ñ½¥¦$€­â* -#‰Š‹Óª«¬­®¯°±²³¾´¦$€­â - »¼½¥¦$€­â" -‘’“”•–—ÙÚÛܦ$€­â -ˆ˜™šðÌÍÎϽ¥¦$€­â( -!ˆ‰Š‹ŒŽîïðñòѽ¥¦$€­â -W§›œ°±²³¾´¦$€­â, -%‰Š‹Óª«Ô¬­®¯°±²³¾´¦$€­â -ÎÏР¡¢£¤Ñ½¥¦$€­â& -ËÌžŸ ¡¢éêÙÚÛܦ$€­â -‡ˆ‰Š‹£¤Ñ½¥¦$€­â2 -+£ƒ„Óª«¤¥¦¬­®¯°±²³¾´¦$€­â" -§¨þÿ€©ªñòѽ¥¦$€­â& -‰Š«ŒŽîïðñòѽ¥¦$€­â -ü”•ÌÍÎϽ¥¦$€­â -ñò÷óôõÚÛÜÝÞ€­â -öòôõÚÛÜÝÞ€­â -¬úûÚÛÜÝÞ€­â -ÚÛÜÝѽ¥¦$€­â -­®ò÷óôõÚÛÜÝÞ€­â -¯óôõÚÛÜÝÞ€­â -°øùúûÚÛÜÝÞ€­â6 -/±²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âJ -CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ \ -UÎÏÐÑÒÓÔÕÖ×ØÙÚ×ØÛÜÝÞßàáâ㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ 8 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ D -=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€áëD -=ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§B -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§F -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ H -AÈÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€áë\ -UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§< -5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€œœ9@ -9ÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âH -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 --äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB -;ÈÇÆËÌÍ´µµµµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 -/æçè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 --çè´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ F -?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§B -;éûüýþêëìí´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL -EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â8 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰@ -9îïðñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âJ -CÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 -/öôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â\ -UÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§< -5÷ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf -_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÆÇÈÉÆÇÈÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰d -]ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â8 -1ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ŽÎF -?÷ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â> -7ÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< -5ùñòóôõ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰D -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ > -7ÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â, -%úûüýþÿ€½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ * -#‚ƒ„…†‡ˆ¿ÀÁÀÂÀÃÄÅ$€­â4 --ÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF -?ÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰F -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : -3÷ÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ h -aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=ÆÇÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âh -aÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âH -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ T -MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3ÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€´‰H -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 -/‰Š‹´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -G÷ÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âR -KÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âV -OÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ X -QÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< -5ÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€‡§@ -9ÈÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL -EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ R -KÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ H -AÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â^ -W÷ÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âV -O÷ÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â -ŒØÙÚÛÜÝÞ€­âA -:Ž‘Pî’“”•–·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âT -MÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=÷ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ F -?ÉÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=ÆÇÊÈÇÆËÌÍ´µµ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â: -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âT -MÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€ÚÄ : -3Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf -_ÈÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 -/—˜™â㶷¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â0 -)˜µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB -;ÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÈÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL -EÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< -5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âf -_ÉÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 --äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF -?ÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â9 -2W§š›œž¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âd -]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â6 -/Ÿ ¡´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â4 --Ÿ ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âd -]ÆÇøÉÆÇÈÉÆÇÈÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âL -EÉÆÇÈÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âB -;¢£¤¥¦§¨äå´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âF -?÷ÉÆÇÊÈÇÆËÌÍ´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âD -=ÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­âN -GÉÆÇÈÉÆÇÊÈÇÆ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â< -5÷Æ˱²³´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â2 -+í´µ¶·¸¹º»¼½¾¿ÀÁÀÂÀÃÄÅ$€­â( -!©ª«¬­½¾¿ÀÁÀÂÀÃÄÅ$€­â -®ÕÖ×ØÙÚÛÜÝÞ€­â# -89:;<¯¹º»†‡ˆ56"#$€­â, -%°±•–“”•–—ABCDEFGHIJ234KLM"#$€­â+ -$²³Þß³´µƒ„…†‡€‚LM"#$€­â$ -´µ¶·¸¹º¬~€‚LM"#$€­â -†‡€‚LM"#$€­âG -@¦§¨©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€ÚÄ  -ª´µ« !"#$€­â& -´µ¶·¸¹º»†‡ˆ56"#$€­â -»¼½¾1234LM"#$€­â -¿Ž|ÀÁÂÃLM"#$€­â% -OPÄÅƾÇÈ_É~€‚LM"#$€­â= -6¨žŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â - _º»M"#$€­â0 -)ÊËÌÍâãhyz{Ζ—ABCDEFGHIJ234KLM"#$€­â* -#ëìÏSTUVâãg 56"#$€­â -ÐÕÖ×ØÙÚÛÜÝÞ€­â - 56"#$€­â Ñö€­â& -aéêëìÒ -€ 56"#$€­â -´µÓABCDEFGHIJ234KLM"#$€­â óö€­â5 -.ßÔÕÖ×غ¬~STUVâãg 56"#$€­â -´¬~€‚LM"#$€­â7 -0êëìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â; -4æÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â -ܼ½¾1234LM"#$€­â -ÝÞßàṺM"#$€­â -âëã 56"#$€­â -ääåæˆ56"#$€­âC -<™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â -çM"#$€­â& -=>?èéêëìíˆ56"#$€­âA -:©ÑÒÓžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­âE ->˜™š›œžŸ ¡¢£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€‡§ - 123456"#$€­â$ -Ž´µÓABCDEFGHIJ234KLM"#$€­â +ÅÁºO€­â +ÕÖ×€­â$ +¯°±²³´ÂÃÄÅÆï𧀭â +c¨ÇÈÉÊËÌÖ¦§€­â+ +$QRSTUÍÔ«¬­®¯°±²³´Åµ§€­â +Îϧ€­â +ÐÑÀÁÒ¤¥Ö¦§€­â +¦§€­â" +œžŸ ¢£¤¥Ö¦§€­â +ÓÔÕÖ×ØÙÚÛÜݧ€­â + ¤¥Ö¦§€­â, +%Š‹Þ›œžŸ ¡¢£¤¥Ö¦§€­â" +ßàáâãäåæÚÛÜݧ€­â + çè馧€­â +ÙÚêëÚÛÜݧ€­â + ìóÖ¦§€ÚÄ  +íêëÚÛÜݧ€ÚÄ  + æÀÁ¦§€ÚÄ  +îìíîï𧀭â +[\ïðñÑÒÓÔ¦§€­â +òóôõöáâãä倭â +÷óøõöáâãä倭â +ùúûüáâãä倭â +ý•–ÑÒÓÔ¦§€ÚÄ  +þ¢£¤¥Ö¦§€­â$ +ÿ€àáâãäåæÚÛÜݧ€­â( +!‚Ô«¬­®¯°±²³´Åµ§€­â, +%ƒ„…Ô«¬Õ­®¯°±²³´Åµ§€­â + ¤¥Ö¦§€­â + Ö¦§€­â +ïðñòóÖ¦§€­â + ÑÀÁ¦§€­â +ÚêëÚÛÜݧ€­â& +…Ô«¬­®¯°±²³´Åµ§€­â + Ö¦§€­â +ÏÐÑÒÓÔ¦§€­â +†ÕÖ×ØÙÚÛÜݧ€­â& +…Ô«¬­®¯°±²³´Åµ§€­â +¦§€­â +®‡ÚêëÚÛÜݧ€­â. +'ˆ‰Š‹ŒßàáâãäåæÚÛÜݧ€­â& +…Ô«¬­®¯°±²³´Åµ§€­â +Ž‡ÚêëÚÛÜݧ€­â +›³´Åµ§€ÚÄ ( +!™š›œžŸ ¢£¤¥Ö¦§€­â + ÚÛÜݧ€­â& +›œžŸ ¡¢£¤¥Ö¦§€­â* +#Š‹ŒÔ«¬­®¯°±²³´Åµ§€­â + ÀÁ¦§€­â" +‘’“”•–—˜ÚÛÜݧ€­â +‰™š›ñÑÒÓÔ¦§€­â( +!‰Š‹ŒŽïðñòóÖ¦§€­â +c¨œ±²³´Åµ§€­â, +%Š‹ŒÔ«¬Õ­®¯°±²³´Åµ§€­â +ÏÐÑ¡¢£¤¥Ö¦§€­â& +žÒÓŸ ¡¢£êëÚÛÜݧ€­â +ˆ‰Š‹Œ¤¥Ö¦§€­â2 ++¤„…Ô«¬¥¦§›­®¯°±²³´Åµ§€­â" +¨©…†‡ª«òóÖ¦§€­â& +Š‹¬ŽïðñòóÖ¦§€­â +ý•–ÑÒÓÔ¦§€­â +òóøôõöáâãä倭â +÷óõöáâãä倭â +­ûüáâãä倭â +ÛÜÝÞÖ¦§€­â +®¯óøôõöáâãä倭â +°ôõöáâãä倭â +±ùúûüáâãä倭â6 +/²³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âJ +CÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ \ +UÏÐÑÒÓÔÕÖ×ØÙÚÛØÙÜÝÞßàáâãä·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ 8 +1ÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ D +=ÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€áëD +=ÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§B +;ÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§F +?ÊÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ H +AÉÊÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€áë\ +UÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§< +5ÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€œœ9@ +9ÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âH +AÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3Ç̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ : +3Ç̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â4 +-å浶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âF +?ÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âB +;ÉÈÇÌÍ嶶¶¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â6 +/çè鵶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â4 +-è鵶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ F +?ÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âB +;ÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§B +;ꂃ„…ëìí·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âL +EÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â8 +1ÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€´‰@ +9ïðñòóôõöµ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âJ +CÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â6 +/÷õöµ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â\ +UÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3ÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§< +5øÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âf +_ÉÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÇÈÉÊÇÈÉËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€´‰d +]ÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â8 +1ÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ŽÎF +?øÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â> +7ÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â< +5úòóôõöµ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3ÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€´‰D +=ÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ > +7ÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â, +%ûüýþÿ€¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ * +#‚ƒ„…†‡ˆ‰ÀÁÂÁÃÁÄÅÆ€­â4 +-Íε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âF +?ÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€´‰F +?ÊÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=ÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ : +3øÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ h +aÉÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=ÇÈÉËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âh +aÉÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âH +AÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ T +MÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=ÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âF +?ÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3ÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€´‰H +AÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â6 +/Š‹Œµ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GøÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âR +KÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âV +OÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ X +QÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â< +5ÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€‡§@ +9ÉËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âL +EÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ R +KÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3Ç̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ H +AÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â^ +WøÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âV +OøÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â +ßàáâãä倭âA +:Ž‘’\ï“”•–—¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âT +MÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=øÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ F +?ÊÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=ÇÈËÉÈÇÌÍ嶶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â: +3Ç̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âT +MÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€ÚÄ : +3Ç̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âf +_ÉÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â6 +/˜™šãä·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â0 +)Ÿ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âB +;ÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÉÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âL +EÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â< +5øÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âf +_ÊÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â4 +-å浶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âF +?ÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â9 +2c¨›œžŸ·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âd +]ÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â6 +/ ¡¢µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â4 +- ¡µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âd +]ÇÈùÊÇÈÉÊÇÈÉÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âL +EÊÇÈÉÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âB +;£¤¥¦§¨©å浶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âF +?øÊÇÈËÉÈÇÌÍε¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âD +=ÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­âN +GÊÇÈÉÊÇÈËÉÈÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â< +5øÇ̲³´µ¶·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â2 ++·¸¹º»¼½¾¿ÀÁÂÁÃÁÄÅÆ€­â( +!ª«¬­®¾¿ÀÁÂÁÃÁÄÅÆ€­â +¯ÜÝÞßàáâãä倭â# +QRSTU°ÀÁÂ/015‡ˆ‰NO€­â% +±² + €­â, +%³´ßูº„…†‡ˆ‹ŒŽ€­â& +µ¶·¸¹º»­Š‹ŒŽ€­â +‡ˆ‹ŒŽ€­âB +;«¬­®ØÙÚ¥¦§¨©ª«¬k­® + €ÚÄ  +¯»¼°9:;<=>?@€­â& +»¼½¾¿ÀÁÂ/015‡ˆ‰NO€­â +¼½¾¿M€­â +À”•<ˆÁÂÃÄ€­â' + [\ÅÆÇÅÈÉkÊŠ‹ŒŽ€­â8 +1©¤¥¦§¨©ª«¬k­® + €­â + k»¼€­â1 +*ËÌÍÎéêt…†‡Ï €­â* +#ìíÐ_`ab3456789ãäs+,-./012NO€­â +ÑÜÝÞßàáâãä倭â + +,-./012NO€­â Òý€­â& +mêëìíÓ%&'()+,-./012NO€­â +»¼Ô €­â úý€­â6 +/àÕÖ×ØÙ»­Š_`ab3456789ãäs+,-./012NO€­â +»­Š‹ŒŽ€­â2 ++ëìí¬k­® + €­â6 +/çÚÛÜí¬k­® + €­â +ݽ¾¿M€­â +Þßàá∾¿€­â +ãìä,-./012NO€­â +ååæç‰NO€­â> +7 ¡¢£¤¥¦§¨©ª«¬k­® + €­â +耭â& +VWXéêëìí/01î‰NO€­â< +5®ØÙÚ¥¦§¨©ª«¬k­® + €­â@ +9Ÿ ¡¢£¤¥¦§¨©ª«¬k­® + €‡§ + MNO€­â$ +Ž»¼Ô €­â -"#$€ÚÄ 8 -1ñ…†‡ˆ–ïðñò”•–—ABCDEFGHIJ234KLM"#$€­â -󃄅×ØÙÚÛÜÝÞ€­â -¹º» !"#$€­â% -OPÄÅƾÇÈ_É~€‚LM"#$€­â; -4ÛÙÚÛìí£¤¥_¦§“”•–—ABCDEFGHIJ234KLM"#$€­â -ÊôÌÍÎÏÐ#$€­â( -!Žõö´µ¶÷øùCD23456"#$€­â8 -1ëìú—óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â% -ß³´µƒ„…†‡€‚LM"#$€­â5 -.ðñ…†‡óôõö÷øùúûü - 56"#$€­â -ûü¾¿56"#$€­â -6"#$€­â - ýþÿ_`6"#$€ÚÄ  -]^_`6"#$€­â* -#€‚STUVâãg 56"#$€­â -ƒ„ABCDEFGHIJ234KLM"#$€­â. -'…†‡ˆÈÉ”•–—ABCDEFGHIJ234KLM"#$€­â" -‰ýþÿ - 56"#$€­â -ßáâãhijklmnopqrsM"#$€­â+ -$Š´µ¶·¸¹º» !"#$€­âK -D‹ö÷øùÝÞßàáýþÿ -€ âãg 56"#$€­â -ŒM"#$€­â0 -)óôõö÷øù˜™ü¹º»†‡ˆ56"#$€­â -M"#$€­â! -Ž - 56"#$€­â -s6"#$€­â2 -+úûü -€ âãg 56"#$€­â" -Ú !"#$€­â, -%´µ¶‘’“”•–¾—˜¾‚STUV56"#$€­â - 56"#$€­â( -!™šyz{ΛœžŸg 56"#$€­â" - ÁÂÃÄÅ¡¢¾£¤_M"#$€­â -¥¦„…×ØÙÚÛÜÝÞ€­â -´µ¶·¸ 56"#$€­â" -§¨¶·¸¹º~€‚LM"#$€­â& -©ª«CD234 !"#$€­â$ -¬›œâãhyz{|}~€‚LM"#$€­â""""""""""""""""" " " +€ÚÄ 4 +-ò‘’“”—ðñò›ó + €­â +ô„…†Þßàáâãä倭â +ÀÁÂ/0156789:;<=>?@€­â' + [\ÅÆÇÅÈÉkÊŠ‹ŒŽ€­â6 +/ÜÚÛÜí¬k­® + €­â +ÑõÓÔÕÖ×€­â( +!Žö÷»¼½øùú/01NO€­â8 +1ìíû˜ôõö÷øùú™šýÀÁÂ/015‡ˆ‰NO€­â& +渹º„…†‡ˆ‹ŒŽ€­â5 +.ñò‘’“ôõö÷øùúûüý()*+,-./012NO€­â +üý¿À/01NO€­â +O€­â + þÿ€klO€ÚÄ  +ijklO€­â* +#‚ƒ_`ab3456789ãäs+,-./012NO€­â +„… €­â* +#†‡ˆ‰ÍÎ + €­â" +Šþÿ€%&'()*+,-./012NO€­â +æèéêtuvwxyz{|}~€­â+ +$‹»¼½¾¿ÀÁÂ/0156789:;<=>?@€­âK +DŒ÷øùúÞßàáâˆþÿ€%&'()+,-./0123456789ãäs+,-./012NO€­â +Ž€­â0 +)ôõö÷øùú™šýÀÁÂ/015‡ˆ‰NO€­â +Ž€­â! + !"#$%&'()*+,-./012NO€­â +O€­â2 ++ûüý()+,-./0123456789ãäs+,-./012NO€­â" +Û‘-./0123456789:;<=>?@€­â, +%»¼½’“”•–—Ř™Åƒ_`abNO€­â +*+,-./012NO€­â+ +$š›…†‡ÏœžŸ s+,-./012NO€­â" +¡ÂÃÄÅÆ¢£Å¤¥k€­â +¦§…†Þßàáâãä倭â +»¼½¾¿,-./012NO€­â$ +¨©·¸¹º»Š‹ŒŽ€­â& +ª«¬/013456789:;<=>?@€­â+ +$­ ¡éêt…†‡ˆ‰Š‹ŒŽ€­â""""""""""""""""" " " " -" " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬******* * +" " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­******* * *  * - *  * * ***************** *!* "*!#*"$*#%*$&*%'*&(*')*(**)+**+*+,*,-*-.*./*/0*00*11*22*33*44*55*66*77*88*99*::*;;*<<*==*>>*?>*@?*A@*BA*CB*DC*ED*FE*GF*HG*IH*JI*KJ*LK*ML*NM*ON*PO*QP*RQ*SR*TS*UT*VU*WV*XW*YX*ZY*[Z*\[*]\*^]*_^*`_*a`*ba*cb*dc*ed*fe*gf*hg*ih*ji*kj*lj*mk*nl*om*pn*qo*rp*sq*tr*us*vt*wu*xv*yw*zx*{y*|z*}{*~|*}*€~**‚€*ƒ*„‚*…ƒ*†„*‡…*ˆ†*‰‡*Šˆ*‹ˆ*Œ‰*Š*Ž‹*Œ**‘Ž*’*“*”‘*•’*–“*—”*˜•*™–*š—*›˜*œ™*š*žš*Ÿ›* œ*¡*¢*£ž*¤Ÿ*¥ *¦¡*§¢*¨£*©¤*ª¥*«¦*¬§*­¨*®©*¯ª*°«*±¬*²­*³®*´¯*µ°*¶±*·²*¸³*¹´*ºµ*»¶*¼·*½¸*¾¹*¿º*À»*Á¼*½*ý*ľ*Å¿*ÆÀ*ÇÁ*ÈÁ*ÉÁ*ÊÂ*ËÃ*ÌÄ*ÍÅ*ÎÆ*ÏÇ*ÐÈ*ÑÉ*ÒÊ*ÓË*ÔÌ*ÕÍ*ÖÎ*×Ï*ØÐ*ÙÑ*ÚÒ*ÛÓ*ÜÔ*ÝÕ*ÞÖ*ßr*à×*áØ*âÙ*ãÚ*äÛ*åÜ*æÝ*çÞ*èß*éà*êá*ëâ*ìã*íä*îå*ïæ*ðç*ñè*òé*óê*ôë*õì*öí*÷î*øï*ùð*úñ*ûò*üó*ýô*þõ*ÿö*€÷*ø*‚ù*ƒú*„û*…ü*†ý*‡þ*ˆÿ*‰€*Š*‹‚*Œƒ*„*Ž…*†*‡*‘ˆ*’‰*“Š*”‹*•Œ*–*—Ž*˜*™*š*›‘*œ‘*’*ž“*Ÿ”* ”*¡•*¢–*£—*¤˜*¥™*¦š*§›*¨œ*©–*ª*«ž*¬Ÿ*­ *®¡*¯¢*°£*±¤*²¥*³¦*´§*µ¨*¶©*·ª*¸«*¹¬*º­*»®*¼¯*½°*¾±*¿²*À³*Á´*µ*õ*Ķ*Å·*Ƹ*ǹ*Ⱥ*É»*ʼ*˽*̾*Í¿*ÎÀ*ÏÁ*ÐÂ*ÑÃ*ÒÄ*ÓÄ*ÔÅ*ÕÆ*ÖÇ*×È*ØÉ*ÙÊ*ÚË*ÛÌ*ÜÍ*ÝÎ*ÞÏ*ßÐ*àÑ*áÒ*âÓ*ãÔ*äÕ*åÖ*æ×*çØ*èÙ*éÚ*êÛ*ëÜ*ìÝ*íÞ*îß*ïà*ðá*ñâ*òã*óä*ôå*õæ*öç*÷è*øé*ùê*úë*ûì*üí*ýî*þï*ÿð*€ñ*ò*‚r*ƒó*„ô*…õ*†ö*‡÷*ˆø*‰ù*Šú*‹û*Œü*ü*Žý*¥*þ*‘ÿ*’€*“*”‚*•ƒ*–„*—„*˜…*™†*š‡*›‡*œˆ*‰*žŠ*Ÿ‹* Œ*¡*¢Ž*£*¤*¥‘*¦’*§“*¨”*©•*ª–*«—*¬˜*­™*®š*¯›*°œ*±*²ž*³Ÿ*´ *µr*¶¡*·¢*¸£*¹¤*º¥*»¦*¼§*½¨*¾©*¿ª*À«*Á¬*­*î*į*Å°*Ʊ*Dz*ȳ*É´*ʵ*˶*Ì·*͸*ι*Ϻ*л*Ѽ*Ò½*Ó–*Ô—*Õ¾*Ö¿*×À*ØÁ*ÙÂ*ÚÃ*ÛÄ*ÜÅ*ÝÆ*ÞÇ*ßÈ*àÉ*áÊ*âË*ã‡*ä‡*åÌ*æÍ*çÎ*èÏ*éÐ*êÑ*ëÒ*ìÓ*íÔ*îÕ*ïÖ*ð×*ñØ*òÙ*óÚ*ôÛ*õü*öÜ*÷Ý*øÞ*ùß*úà*ûá*üâ*ýã*þä*ÿå*€æ*ç*‚è*ƒé*„ê*…ë*†ì*‡í*ˆî*‰ï*Šð*‹ñ*Œò*ó*Žô*õ*ö*‘÷*’ø*“ù*”ú*•û*–ü*—ý*˜þ*™ÿ*š€*›*œ‚*ƒ*ž„*Ÿ…* †*¡‡*¢ˆ*£‰*¤Š*¥‹*¦Œ*§*¨Ž*©*ª*«‘*¬|*­’*®“*¯r*°”*±•*²–*³—*´˜*µ™*¶š*·›*¸œ*¹*ºž*»Ÿ*¼ *½¡*¾¢*¿£*À¤*Á¥*¦*ç*Ĩ*Ũ*Æ©*Ǫ*È«*ɬ*Ê­*Ë®*̯*Í°*α*ϲ*г*Ñ´*Òµ*Óµ*Ô¶*Õ·*Ö¸*×¹*غ*Ù»*Ú¼*Û½*ܾ*Ý¿*ÞÀ*ßÁ*àÂ*áÃ*âÄ*ãÅ*äÆ*åÇ*æÈ*çÉ*èÊ*éË*êÌ*ëÍ*ìÎ*íÏ*îÐ*ïÑ*ðÒ*ñÓ*òÔ*óÕ*ôÖ*õ×*öØ*÷Ù*øÚ*ùÛ*úÜ*ûÝ*üÞ*ýr*þ¥*ÿß*€à*á*‚â*ƒã*„ä*…å*†æ*‡ç*ˆè*‰è*Šé*‹é*Œê*ë*Žì*í*î*‘ï*’ð*“ñ*”ò*•ó*–ô*—ô*˜õ*™ö*š÷*›ø*œù*ú*žû*Ÿ­* ü*¡ý*¢þ*£ÿ*¤€*¥*¦‚*§ƒ*¨„*©…*ª†*«‡*¬ˆ*­‰*®Š*¯‹*°Œ*±*²Ž*³*´*µ‘*¶’*·“*¸”*¹•*º–*»—*¼—*½˜*¾™*¿š*À›*Áœ*Â*Þ*ÄŸ*Å *Æ¡*Ç¢*È£*ɤ*Ê¥*˦*̧*ͨ*Ω*Ϫ*Ы*Ѭ*Ò­*Ó®*Ô¯*Õ°*Ö±*ײ*س*Ù´*Úµ*Û¶*Ü·*Ý·*Þ¸*ß¹*àº*á»*â¼*ã½*äï*åð*æï*çð*è¾*é¿*êÀ*ëÁ*ìÂ*íÃ*îÄ*ïÅ*ðÅ*ñÆ*òÇ*óÇ*ôÈ*õð*öÉ*÷¥*øÊ*ùË*úÌ*ûÌ*üÍ*ýÍ*þÎ*ÿÏ*€Ð*Ñ*‚Ò*ƒÓ*„Ó*…Ô*†Õ*‡Ö*ˆ×*‰Ø*ŠÙ*‹Ú*ŒÛ*Ü*ŽÝ*Þ*ß*‘à*’á*“â*”ã*•ä*–å*—æ*˜ç*™è*šé*›ê*œë*ì*ží*Ÿî* ï*¡ð*¢ñ*£ò*¤ó*¥ô*¦õ*§ö*¨ö*©÷*ªø*«Í*¬Î*­ù*®ú*¯û*°ü*±ý*²þ*³ÿ*´€*µ*¶‚*·ƒ*¸„*¹…*º†*»r*¼‡*½ˆ*¾‰*¿Š*À‹*ÁŒ*Â*ÃŽ*Ä*Å*Æ‘*Ç’*È“*É”*Ê•*Ë–*Ì—*͘*Ι*Ïš*Л*Ñœ*Ò*Óž*ÔŸ*Õ *Ö¡*×¢*Ø£*Ù¤*Ú¥*Û¦*ܧ*ݨ*Þ¨*ß©*à©*áª*â«*ã¬*ä­*å®*æ¯*ç°*è±*é²*ê³*ë´*ìµ*í¶*î·*ï¸*ð¹*ñº*ò»*ó¼*ô½*õ¾*ö¿*÷À*øÁ*ùÂ*úÃ*ûÄ*üÅ*ýÆ*þÇ*ÿÇ*€È*É*‚Ê*ƒË*„Ì*…Í*†Î*‡Ï*ˆÐ*‰Ñ*ŠÒ*‹Ó*ŒÔ*Õ*ŽÖ*×*Ø*‘Ù*’Ú*“Û*”Ü*•Ý*–Þ*—ß*˜à*™á*šâ*›ã*œä*å*žæ*Ÿç* è*¡é*¢ê*£ë*¤ì*¥í*¦î*§ï*¨ð*©ñ*ªò*«ó*¬ô22cpu2 nanoseconds23java/util/concurrent/ConcurrentSkipListMap.findNear28java/util/concurrent/ConcurrentSkipListMap.findNearEntry25java/util/concurrent/ConcurrentSkipListMap.floorEntry2 kafka/log/LogSegments.floorEntry2"kafka/log/LogSegments.floorSegment2"kafka/log/LocalLog.$anonfun$read$22kafka/log/LocalLog.read2kafka/log/UnifiedLog.read2#kafka/cluster/Partition.readRecords2*kafka/cluster/Partition.readFromLocalLog$12/kafka/cluster/Partition.$anonfun$fetchRecords$12$kafka/cluster/Partition.fetchRecords2"kafka/server/ReplicaManager.read$127kafka/server/ReplicaManager.$anonfun$readFromLocalLog$72Akafka/server/ReplicaManager$$Lambda$1256.0x00000008015431d0.apply2/scala/collection/mutable/ResizableArray.foreach20scala/collection/mutable/ResizableArray.foreach$2,scala/collection/mutable/ArrayBuffer.foreach2,kafka/server/ReplicaManager.readFromLocalLog2$kafka/server/DelayedFetch.onComplete2+kafka/server/DelayedOperation.forceComplete2%kafka/server/DelayedFetch.tryComplete28kafka/server/DelayedOperation.$anonfun$safeTryComplete$12-kafka/server/DelayedOperation.safeTryComplete2Bkafka/server/DelayedOperationPurgatory$Watchers.tryCompleteWatched27kafka/server/DelayedOperationPurgatory.checkAndComplete24kafka/server/ReplicaManager.$anonfun$appendRecords$62Akafka/server/ReplicaManager$$Lambda$1425.0x000000080158b1d0.apply2+scala/collection/immutable/Map$Map1.foreach24kafka/server/ReplicaManager.$anonfun$appendRecords$52Hkafka/server/ReplicaManager$$Lambda$1397.0x0000000801585fc0.apply$mcV$sp2+kafka/server/ActionQueue.tryCompleteActions2.kafka/server/ReplicaManager.tryCompleteActions2kafka/server/KafkaApis.handle2$kafka/server/KafkaRequestHandler.run2java/lang/Thread.run2(scala/collection/AbstractIterable.2#scala/collection/AbstractSeq.2+scala/collection/mutable/AbstractSeq.2.scala/collection/mutable/AbstractBuffer.2+scala/collection/mutable/ArrayBuffer.20scala/collection/mutable/ArrayBuffer$.newBuilder2Bscala/collection/generic/GenericTraversableTemplate.genericBuilder2Cscala/collection/generic/GenericTraversableTemplate.genericBuilder$23scala/collection/AbstractTraversable.genericBuilder2Hscala/collection/generic/GenTraversableFactory$GenericCanBuildFrom.apply2*scala/collection/TraversableLike.builder$12$scala/collection/TraversableLike.map2%scala/collection/TraversableLike.map$2(scala/collection/AbstractTraversable.map2)kafka/server/ReplicaManager.fetchMessages2)kafka/server/KafkaApis.handleFetchRequest2java/lang/ref/Reference.clear2+java/lang/ThreadLocal$ThreadLocalMap.remove2java/lang/ThreadLocal.remove2Gjava/util/concurrent/locks/ReentrantReadWriteLock$Sync.tryReleaseShared2Cjava/util/concurrent/locks/AbstractQueuedSynchronizer.releaseShared2Ajava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.unlock26java/util/concurrent/ConcurrentHashMap.computeIfAbsent2kafka/utils/Pool.getAndMaybePut2(kafka/server/BrokerTopicStats.topicStats27kafka/server/ReplicaManager.$anonfun$appendToLocalLog$62Akafka/server/ReplicaManager$$Lambda$1372.0x000000080156e380.apply2/scala/collection/TraversableLike.$anonfun$map$12Escala/collection/TraversableLike$$Lambda$143.0x00000008011ad8d8.apply23scala/collection/mutable/HashMap.$anonfun$foreach$12Escala/collection/mutable/HashMap$$Lambda$182.0x00000008011e50b0.apply2/scala/collection/mutable/HashTable.foreachEntry20scala/collection/mutable/HashTable.foreachEntry$2-scala/collection/mutable/HashMap.foreachEntry2(scala/collection/mutable/HashMap.foreach2,kafka/server/ReplicaManager.appendToLocalLog2)kafka/server/ReplicaManager.appendRecords2+kafka/server/KafkaApis.handleProduceRequest2java/util/HashMap.resize2java/util/HashMap.putVal2java/util/HashMap.put25kafka/server/KafkaApis.$anonfun$handleFetchRequest$1522:scala/collection/convert/Wrappers$JMapWrapperLike.iterator2;scala/collection/convert/Wrappers$JMapWrapperLike.iterator$26scala/collection/convert/Wrappers$JMapWrapper.iterator2%scala/collection/IterableLike.foreach2&scala/collection/IterableLike.foreach$2)scala/collection/AbstractIterable.foreach2Cscala/collection/compat/MapExtensionMethods$.foreachEntry$extension2/kafka/network/RequestChannel.updateErrorMetrics2)kafka/network/RequestChannel.sendResponse2-kafka/server/KafkaApis.sendResponseCallback$226kafka/server/KafkaApis.$anonfun$handleProduceRequest$92>kafka/server/KafkaApis.$anonfun$handleProduceRequest$9$adapted2org/apache/kafka/common/record/DefaultRecord.readPartiallyFrom2@org/apache/kafka/common/record/DefaultRecordBatch$1.doReadRecord2Oorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.readNext2Eorg/apache/kafka/common/record/DefaultRecordBatch$RecordIterator.next2#java/util/Iterator.forEachRemaining2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$12>kafka/log/LogValidator$$$Lambda$1377.0x000000080156f840.accept2Bkafka/log/LogValidator$.validateMessagesAndAssignOffsetsCompressed28kafka/log/LogValidator$.validateMessagesAndAssignOffsets2"scala/runtime/BoxesRunTime.equals22!scala/runtime/BoxesRunTime.equals2-scala/collection/mutable/HashTable.elemEquals2.scala/collection/mutable/HashTable.elemEquals$2+scala/collection/mutable/HashMap.elemEquals2-scala/collection/mutable/HashTable.findEntry02,scala/collection/mutable/HashTable.findEntry2-scala/collection/mutable/HashTable.findEntry$2*scala/collection/mutable/HashMap.findEntry2$scala/collection/mutable/HashMap.get2"kafka/server/FetchSessionCache.get2$kafka/server/FetchManager.newContext2*java/util/concurrent/ConcurrentHashMap.get2kafka/utils/Pool.get2(kafka/server/ReplicaManager.getPartition2/kafka/server/ReplicaManager.getPartitionOrError23kafka/server/ReplicaManager.getPartitionOrException20kafka/server/DelayedFetch.$anonfun$tryComplete$128kafka/server/DelayedFetch.$anonfun$tryComplete$1$adapted2?kafka/server/DelayedFetch$$Lambda$1310.0x000000080155b328.apply2;org/apache/kafka/common/requests/FetchRequest.lambda$null$22Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1246.0x0000000801540648.accept2java/util/ArrayList.forEach2@org/apache/kafka/common/requests/FetchRequest.lambda$fetchData$32Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1245.0x0000000801540410.accept27org/apache/kafka/common/requests/FetchRequest.fetchData2kafka/cluster/Partition.appendRecordsToFollowerOrFutureReplica26kafka/server/ReplicaFetcherThread.processPartitionData2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$72Gkafka/server/AbstractFetcherThread$$Lambda$950.0x00000008014a1400.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$62Ikafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$6$adapted2Gkafka/server/AbstractFetcherThread$$Lambda$948.0x00000008014b7848.apply2Akafka/utils/Implicits$MapExtensionMethods$.$anonfun$forKeyValue$12Gkafka/server/AbstractFetcherThread$$Lambda$949.0x00000008014a1800.apply2Dscala/collection/compat/MapExtensionMethods$.$anonfun$foreachEntry$12Qscala/collection/compat/MapExtensionMethods$$$Lambda$621.0x00000008014070b8.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$52"kafka/log/LazyIndex.$anonfun$get$12kafka/log/LazyIndex.get2 kafka/log/LogSegment.offsetIndex2/kafka/log/LogSegment.canConvertToRelativeOffset2(kafka/log/LogSegment.ensureOffsetInRange2kafka/log/LogSegment.append2kafka/log/LocalLog.append2scala/Option.contains20kafka/server/ReplicaManager.hasConsistentTopicId2Ajava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1.next2>scala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.next2,kafka/server/RemoteLeaderEndPoint.buildFetch28kafka/server/AbstractFetcherThread.$anonfun$maybeFetch$12#kafka/server/EvictableKey.compareTo2java/util/TreeMap.getEntry2java/util/TreeMap.remove2$kafka/server/FetchSessionCache.touch2H./tmp/snappy-1.1.8-d1f9bd24-4cc8-4571-b71c-1698b83f1af1-libsnappyjava.so2,org/xerial/snappy/SnappyNative.rawUncompress2&org/xerial/snappy/Snappy.rawUncompress2#org/xerial/snappy/Snappy.uncompress20org/xerial/snappy/SnappyInputStream.hasNextChunk2.kafka/server/TopicPartitionOperationKey.equals2Bkafka/server/DelayedOperationPurgatory.$anonfun$checkAndComplete$12Ckafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$12Kkafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$1$adapted2@kafka/server/ReplicaManager$$Lambda$984.0x00000008014c61b0.apply28kafka/server/ReplicaManager.completeDelayedFetchRequests2>kafka/server/ReplicaFetcherThread.completeDelayedFetchRequests2)java/util/Collections$UnmodifiableMap.get2 .vtable stub26java/util/stream/ReduceOps$ReduceOp.evaluateSequential2*java/util/stream/AbstractPipeline.evaluate2*java/util/stream/ReferencePipeline.collect2Porg/apache/kafka/clients/ClusterConnectionStates.nodesWithConnectionSetupTimeout2@org/apache/kafka/clients/NetworkClient.handleTimedOutConnections2+org/apache/kafka/clients/NetworkClient.poll22org/apache/kafka/common/requests/RequestUtils.flag2Eorg/apache/kafka/common/requests/RequestUtils.hasTransactionalRecords25org/apache/kafka/common/metrics/Sensor.recordInternal2-org/apache/kafka/common/metrics/Sensor.record2-org/apache/kafka/common/network/Selector.poll2:org/apache/kafka/clients/NetworkClientUtils.sendAndReceive2Corg/apache/kafka/common/message/ApiMessageType.requestHeaderVersion2=org/apache/kafka/common/protocol/ApiKeys.requestHeaderVersion21org/apache/kafka/clients/ClientRequest.makeHeader2-org/apache/kafka/clients/NetworkClient.doSend2+org/apache/kafka/clients/NetworkClient.send2'libpthread-2.31.so.__pthread_mutex_lock2#libjvm.so.ObjectMonitor::ExitEpilog25libjvm.so.SharedRuntime::complete_monitor_unlocking_C2?kafka/message/BrokerCompressionCodec$.getTargetCompressionCodec2.kafka/log/UnifiedLog.analyzeAndValidateRecords2libc-2.31.so.epoll_wait2sun/nio/ch/EPoll.wait2%sun/nio/ch/EPollSelectorImpl.doSelect2'sun/nio/ch/SelectorImpl.lockAndDoSelect2sun/nio/ch/SelectorImpl.select2/org/apache/kafka/common/network/Selector.select2Worg/apache/kafka/common/network/Selector$SelectorMetrics.maybeRegisterConnectionMetrics2:org/apache/kafka/common/network/Selector.pollSelectionKeys2;org/apache/kafka/common/requests/FetchRequest$Builder.build2(libpthread-2.31.so.__pthread_cond_signal2jdk/internal/misc/Unsafe.unpark2-java/util/concurrent/locks/LockSupport.unpark2@java/util/concurrent/locks/AbstractQueuedSynchronizer.signalNext2=java/util/concurrent/locks/AbstractQueuedSynchronizer.release2/java/util/concurrent/locks/ReentrantLock.unlock29libjvm.so.G1BarrierSetRuntime::write_ref_array_post_entry2.jint_disjoint_arraycopy_avx32-java/util/stream/ReferencePipeline$3$1.accept29java/util/ArrayList$ArrayListSpliterator.forEachRemaining2*java/util/stream/AbstractPipeline.copyInto21java/util/stream/AbstractPipeline.wrapAndCopyInto2#java/util/stream/IntPipeline.reduce2 java/util/stream/IntPipeline.sum23kafka/cluster/DelayedOperations.checkAndCompleteAll22kafka/cluster/Partition.tryCompleteDelayedRequests2.checkcast_arraycopy_uninit2Fkafka/server/ReplicaFetcherThread$$Lambda$951.0x00000008014bc000.apply2"libjvm.so.G1BarrierSet::invalidate27org/apache/kafka/common/requests/FetchResponse.topicIds2;org/apache/kafka/clients/FetchSessionHandler.handleResponse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$32=kafka/log/LogValidator$$$Lambda$1384.0x000000080157d750.apply2scala/Option.orElse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$22>kafka/log/LogValidator$$$Lambda$1379.0x00000008015772a8.accept2kafka/cluster/Partition$$Lambda$1261.0x0000000801543d98.accept2java/util/Optional.ifPresent2java/lang/Long.getChars2&java/lang/AbstractStringBuilder.append2java/lang/StringBuilder.append2Akafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$32Ikafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$3$adapted2@org/apache/kafka/common/requests/ProduceResponse.lambda$toData$12Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1412.0x0000000801582dc0.accept2java/util/Map.forEach27org/apache/kafka/common/requests/ProduceResponse.toData27org/apache/kafka/common/requests/ProduceResponse.2libpthread-2.31.so.__libc_read2!sun/nio/ch/SocketDispatcher.read02 sun/nio/ch/SocketDispatcher.read2&sun/nio/ch/IOUtil.readIntoNativeBuffer2sun/nio/ch/IOUtil.read2!sun/nio/ch/SocketChannelImpl.read2*java/util/stream/AbstractPipeline.wrapSink2+org/xerial/snappy/Snappy.uncompressedLength2java/io/FilterInputStream.read2Zorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.ensureNoneRemaining2sun/nio/ch/EPoll.ctl2/sun/nio/ch/EPollSelectorImpl.processUpdateQueue2;scala/collection/immutable/Map$MapBuilderImpl.$plus$plus$eq2%sun/nio/ch/FileDispatcherImpl.writev02"sun/nio/ch/SocketDispatcher.writev2sun/nio/ch/IOUtil.write2"sun/nio/ch/SocketChannelImpl.write2%java/nio/channels/SocketChannel.write2=org/apache/kafka/common/network/PlaintextTransportLayer.write26org/apache/kafka/common/network/ByteBufferSend.writeTo27org/apache/kafka/common/record/MultiRecordsSend.writeTo23org/apache/kafka/common/network/NetworkSend.writeTo22org/apache/kafka/common/network/KafkaChannel.write2.org/apache/kafka/common/network/Selector.write25org/apache/kafka/common/network/Selector.attemptWrite2kafka/network/Processor.poll2kafka/network/Processor.run2java/util/HashMap.get2/org/apache/kafka/common/protocol/Errors.forCode2java/lang/String.equals2;com/yammer/metrics/stats/ExponentiallyDecayingSample.update2(com/yammer/metrics/core/Histogram.update2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$12Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$1$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1108.0x00000008014fef50.apply2'scala/collection/immutable/List.foreach29kafka/network/RequestChannel$Request.updateRequestMetrics2,kafka/network/Processor.updateRequestMetrics28kafka/network/Processor.$anonfun$processCompletedSends$12=kafka/network/Processor$$Lambda$988.0x00000008014c6c38.accept2-kafka/network/Processor.processCompletedSends26org/apache/kafka/common/protocol/SendBuilder.buildSend2>org/apache/kafka/common/protocol/SendBuilder.buildResponseSend28org/apache/kafka/common/requests/AbstractResponse.toSend2Aorg/apache/kafka/common/requests/RequestContext.buildResponseSend26kafka/network/RequestChannel$Request.buildResponseSend2.org/xerial/snappy/SnappyInputStream.readHeader2*org/xerial/snappy/SnappyInputStream.2;org/apache/kafka/common/compress/SnappyFactory.wrapForInput2=org/apache/kafka/common/record/CompressionType$3.wrapForInput2Corg/apache/kafka/common/record/DefaultRecordBatch.recordInputStream2Dorg/apache/kafka/common/record/DefaultRecordBatch.compressedIterator2Forg/apache/kafka/common/record/DefaultRecordBatch.skipKeyValueIterator2=java/util/concurrent/locks/AbstractQueuedSynchronizer.acquire22java/util/concurrent/locks/ReentrantLock$Sync.lock2-java/util/concurrent/locks/ReentrantLock.lock2,java/util/concurrent/ArrayBlockingQueue.size2$java/util/AbstractCollection.isEmpty2/kafka/network/Processor.configureNewConnections2libc-2.31.so.sendfile642&sun/nio/ch/FileChannelImpl.transferTo025sun/nio/ch/FileChannelImpl.transferToDirectlyInternal2-sun/nio/ch/FileChannelImpl.transferToDirectly2%sun/nio/ch/FileChannelImpl.transferTo2Dorg/apache/kafka/common/network/PlaintextTransportLayer.transferFrom22org/apache/kafka/common/record/FileRecords.writeTo29org/apache/kafka/common/record/DefaultRecordsSend.writeTo22org/apache/kafka/common/record/RecordsSend.writeTo2Horg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesSent2Hcom/yammer/metrics/stats/ExponentiallyDecayingSample.lockForRegularUsage2libc-2.31.so.__fxstat642#sun/nio/ch/FileDispatcherImpl.size02"sun/nio/ch/FileDispatcherImpl.size2sun/nio/ch/FileChannelImpl.size2!./lib/x86_64-linux-gnu/ld-2.31.so2%java/util/HashMap$HashIterator.2$java/util/HashMap$KeyIterator.2!java/util/HashMap$KeySet.iterator2java/util/HashSet.iterator2sun/nio/ch/Util$2.iterator2libpthread-2.31.so.__libc_write2$sun/nio/ch/FileDispatcherImpl.write02#sun/nio/ch/FileDispatcherImpl.write2'sun/nio/ch/IOUtil.writeFromNativeBuffer2 sun/nio/ch/FileChannelImpl.write29org/apache/kafka/common/record/MemoryRecords.writeFullyTo21org/apache/kafka/common/record/FileRecords.append2libnio.so.fdval2&org/apache/log4j/Logger.isTraceEnabled23org/slf4j/impl/Reload4jLoggerAdapter.isTraceEnabled2kafka/utils/Logging.trace2kafka/utils/Logging.trace$2kafka/network/Processor.trace2$kafka/network/Processor.sendResponse2+kafka/network/Processor.processNewResponses2Kjava/util/concurrent/locks/AbstractQueuedSynchronizer.hasQueuedPredecessors2Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync.readerShouldBlock2libpthread-2.31.so.pread2$sun/nio/ch/FileDispatcherImpl.pread02#sun/nio/ch/FileDispatcherImpl.pread2'sun/nio/ch/FileChannelImpl.readInternal2sun/nio/ch/FileChannelImpl.read2-org/apache/kafka/common/utils/Utils.readFully23org/apache/kafka/common/utils/Utils.readFullyOrFail2Zorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchWithSize2Xorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchHeader2Zorg/apache/kafka/common/record/DefaultRecordBatch$DefaultFileChannelRecordBatch.lastOffset2Borg/apache/kafka/common/record/FileRecords.searchForOffsetWithSize2$kafka/log/LogSegment.translateOffset2kafka/log/LogSegment.read2/kafka/cluster/Partition.$anonfun$fetchRecords$22#./lib/x86_64-linux-gnu/libc-2.31.so2(libjvm.so.Relocation::pd_address_in_code2#libjvm.so.oop_Relocation::oop_value2libjvm.so.nmethod::oops_do23libjvm.so.ClosureIsUnloadingBehaviour::is_unloading2>kafka/server/DelayedOperation.$anonfun$safeTryCompleteOrElse$123kafka/server/DelayedOperation.safeTryCompleteOrElse2;kafka/server/DelayedOperationPurgatory.tryCompleteElseWatch2-java/lang/ThreadLocal$ThreadLocalMap.getEntry2java/lang/ThreadLocal.get22com/yammer/metrics/stats/ThreadLocalRandom.current2Yscala/collection/mutable/HashTable.scala$collection$mutable$HashTable$$lastPopulatedIndex20scala/collection/mutable/HashMap$$anon$2.foreach2Mscala/collection/convert/DecorateAsJava$$Lambda$1281.0x00000008015566b0.apply21scala/collection/convert/Decorators$AsJava.asJava21kafka/server/KafkaApis$.sizeOfThrottledPartitions2Porg/apache/kafka/common/message/ProduceResponseData$TopicProduceResponse.addSize2;org/apache/kafka/common/message/ProduceResponseData.addSize2java/util/TreeMap.getLastEntry2java/util/TreeMap.lastEntry2>kafka/server/epoch/LeaderEpochFileCache.$anonfun$latestEntry$123kafka/server/epoch/LeaderEpochFileCache.latestEpoch2?kafka/server/epoch/LeaderEpochFileCache.$anonfun$endOffsetFor$120kafka/server/DelayedFetch.$anonfun$tryComplete$42@kafka/server/DelayedFetch$$Lambda$1311.0x000000080155b708.accept2Akafka/server/ReplicaManager$$Lambda$1405.0x00000008015835c0.apply2Bkafka/log/LogValidator$.getFirstBatchAndMaybeValidateNoMoreBatches2.updateBytesCRC32C2,java/lang/invoke/MethodHandle.asTypeUncached2$java/lang/invoke/MethodHandle.asType2*java/lang/invoke/Invokers.checkGenericType2*java/lang/invoke/Invokers$Holder.invoke_MT2@org/apache/kafka/common/utils/Crc32C$Java9ChecksumFactory.create2+org/apache/kafka/common/utils/Crc32C.create2,org/apache/kafka/common/utils/Crc32C.compute2Aorg/apache/kafka/common/record/DefaultRecordBatch.computeChecksum29org/apache/kafka/common/record/DefaultRecordBatch.isValid29kafka/log/UnifiedLog.$anonfun$analyzeAndValidateRecords$12:kafka/log/UnifiedLog$$Lambda$584.0x00000008013ed6b0.accept2Eorg/apache/kafka/common/record/DefaultRecord.skipLengthDelimitedField2"kafka/utils/Logging.isTraceEnabled2#kafka/utils/Logging.isTraceEnabled$2+kafka/network/RequestChannel.isTraceEnabled2 libjvm.so.AccessInternal::PostRuntimeDispatch, (AccessInternal::BarrierType)2, 548964ul>::oop_access_barrier2&kafka/server/KafkaRequestHandler.trace2Iorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeFromList2Norg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeElementAtSlot2Aorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.remove2>kafka/server/IncrementalFetchContext$PartitionIterator.hasNext2Bkafka/server/IncrementalFetchContext.updateAndGenerateResponseData2java/util/HashMap.compute2=org/apache/kafka/common/requests/ProduceRequest.lambda$null$12Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1421.0x000000080158a8f0.accept2Gorg/apache/kafka/common/requests/ProduceRequest.lambda$partitionSizes$22Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1419.0x000000080158a480.accept2>org/apache/kafka/common/requests/ProduceRequest.partitionSizes2Eorg/apache/kafka/common/requests/ProduceRequest.clearPartitionRecords2Ascala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.hasNext224org/apache/kafka/common/protocol/Readable.readString26org/apache/kafka/common/message/RequestHeaderData.read28org/apache/kafka/common/message/RequestHeaderData.24org/apache/kafka/common/requests/RequestHeader.parse2*kafka/network/Processor.parseRequestHeader2;kafka/network/Processor.$anonfun$processCompletedReceives$12=kafka/network/Processor$$Lambda$985.0x00000008014c6590.accept2,java/util/LinkedHashMap$LinkedValues.forEach20kafka/network/Processor.processCompletedReceives2.sun/nio/ch/Util.offerLastTemporaryDirectBuffer2Jorg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.27org/apache/kafka/common/message/ProduceRequestData.read29org/apache/kafka/common/message/ProduceRequestData.25org/apache/kafka/common/requests/ProduceRequest.parse2?org/apache/kafka/common/requests/AbstractRequest.doParseRequest2=org/apache/kafka/common/requests/AbstractRequest.parseRequest22java/util/HashMap.clear2java/util/HashSet.clear2sun/nio/ch/Util$2.clear2+java/util/concurrent/ArrayBlockingQueue.put2(kafka/network/RequestChannel.sendRequest2Lorg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesReceived2/java/util/concurrent/ArrayBlockingQueue.enqueue2+com/typesafe/scalalogging/Logger.underlying2java/util/HashSet.add2*sun/nio/ch/SelectorImpl.processReadyEvents2*sun/nio/ch/EPollSelectorImpl.processEvents2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate26libjvm.so.void G1CMTask::process_grey_task_entry2$libjvm.so.G1CMBitMapClosure::do_addr2#libjvm.so.G1CMTask::do_marking_step2)libjvm.so.G1CMConcurrentMarkingTask::work2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2%libjvm.so.G1CMTask::drain_local_queue2nlibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2Olibjvm.so.G1RebuildRemSetTask::G1RebuildRemSetHeapRegionClosure::do_heap_region2(libjvm.so.HeapRegionManager::par_iterate2#libjvm.so.G1RebuildRemSetTask::work2libc-2.31.so.epoll_ctl2>org/apache/kafka/common/utils/ImplicitLinkedHashCollection.add23java/util/concurrent/ConcurrentSkipListMap.doRemove21java/util/concurrent/ConcurrentSkipListMap.remove2.java/util/concurrent/ConcurrentSkipListMap.cpr20java/util/concurrent/ConcurrentSkipListMap.doPut26java/util/concurrent/ConcurrentSkipListMap.putIfAbsent2=org/apache/kafka/common/protocol/ByteBufferAccessor.readArray2libjvm.so.Unsafe_Unpark2java/util/Arrays.copyOf2java/util/ArrayList.grow2java/util/ArrayList.add2Horg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.read21libpthread-2.31.so.__pthread_mutex_unlock_usercnt2=kafka/network/Processor$$Lambda$1073.0x00000008014ec800.apply2.kafka/network/Processor.handleChannelMuteEvent2java/util/ArrayDeque.grow2java/util/ArrayDeque.addLast2(sun/nio/ch/EPollSelectorImpl.setEventOps2'sun/nio/ch/SelectionKeyImpl.interestOps2Iorg/apache/kafka/common/network/PlaintextTransportLayer.removeInterestOps21org/apache/kafka/common/network/KafkaChannel.mute2-org/apache/kafka/common/network/Selector.mute2sun/nio/ch/IOUtil.drain2sun/nio/ch/EventFD.reset2+sun/nio/ch/EPollSelectorImpl.clearInterrupt2.org/apache/kafka/common/protocol/ApiKeys.forId25org/apache/kafka/common/requests/RequestHeader.apiKey2#libjvm.so.pthread_mutex_trylock@plt2+java/util/concurrent/locks/LockSupport.park2Jjava/util/concurrent/locks/AbstractQueuedSynchronizer.acquireInterruptibly2?java/util/concurrent/locks/ReentrantLock$Sync.lockInterruptibly2:java/util/concurrent/locks/ReentrantLock.lockInterruptibly25java/util/concurrent/ConcurrentSkipListMap.addIndices2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$32Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$3$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1111.0x00000008014ff9d8.apply2#libjvm.so.ObjectSampler::is_created22libjvm.so.AllocTracer::send_allocation_in_new_tlab2java/nio/ByteBuffer.allocate25org/apache/kafka/common/network/NetworkReceive.2(sun/nio/ch/Util.getTemporaryDirectBuffer2#libjvm.so.oopDesc::size_given_klass2libc-2.31.so.getrusage2&libjvm.so.G1CMTask::regular_clock_call2&libjvm.so.G1CMTask::drain_global_stack2*libjvm.so.OtherRegionsTable::add_reference2java/util/regex/Matcher.search2java/util/regex/Matcher.find2"java/util/regex/Matcher.replaceAll22io/prometheus/jmx/JmxCollector$Receiver.recordBean2-io/prometheus/jmx/JmxScraper.processBeanValue2'io/prometheus/jmx/JmxScraper.scrapeBean2%io/prometheus/jmx/JmxScraper.doScrape2&io/prometheus/jmx/JmxCollector.collect2?io/prometheus/jmx/shaded/io/prometheus/client/Collector.collect2nio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement2jio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.nextElement2\io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeOpenMetrics1002Tio/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeFormat2Zio/prometheus/jmx/shaded/io/prometheus/client/exporter/HTTPServer$HTTPMetricHandler.handle2,com/sun/net/httpserver/Filter$Chain.doFilter2&sun/net/httpserver/AuthFilter.doFilter29sun/net/httpserver/ServerImpl$Exchange$LinkHandler.handle2*sun/net/httpserver/ServerImpl$Exchange.run21java/util/concurrent/ThreadPoolExecutor.runWorker22java/util/concurrent/ThreadPoolExecutor$Worker.run20java/util/regex/Pattern$CharPropertyGreedy.match2'java/util/regex/Pattern$GroupHead.match2#java/util/regex/Pattern$Slice.match2'java/util/regex/Pattern$GroupTail.match2*java/util/regex/Pattern$CharProperty.match2#java/util/regex/Pattern$Begin.match2java/util/regex/Matcher.match2java/util/regex/Matcher.matches27java/util/concurrent/ConcurrentSkipListMap$Iter.advance2=java/util/concurrent/ConcurrentSkipListMap$ValueIterator.next21java/util/concurrent/ConcurrentSkipListMap.toList29java/util/concurrent/ConcurrentSkipListMap$Values.toArray2(com/yammer/metrics/stats/Snapshot.2@com/yammer/metrics/stats/ExponentiallyDecayingSample.getSnapshot2-com/yammer/metrics/core/Histogram.getSnapshot2Dcom/yammer/metrics/reporting/JmxReporter$Histogram.get50thPercentile24jdk/internal/reflect/GeneratedMethodAccessor7.invoke28jdk/internal/reflect/DelegatingMethodAccessorImpl.invoke2java/lang/reflect/Method.invoke2"sun/reflect/misc/Trampoline.invoke24jdk/internal/reflect/GeneratedMethodAccessor2.invoke2"sun/reflect/misc/MethodUtil.invoke2:com/sun/jmx/mbeanserver/StandardMBeanIntrospector.invokeM221com/sun/jmx/mbeanserver/MBeanIntrospector.invokeM21com/sun/jmx/mbeanserver/PerInterface.getAttribute21com/sun/jmx/mbeanserver/MBeanSupport.getAttribute22com/sun/jmx/mbeanserver/MBeanSupport.getAttributes2Ccom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getAttributes24com/sun/jmx/mbeanserver/JmxMBeanServer.getAttributes2'io/prometheus/jmx/JmxCollector.safeName22libjvm.so.G1Policy::preventive_collection_required2)libjvm.so.TypeArrayKlass::allocate_common2"libjvm.so.OptoRuntime::new_array_C2&java/lang/AbstractStringBuilder.2java/lang/StringBuilder.2:jdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.dtoa2;jdk/internal/math/FloatingDecimal.getBinaryToASCIIConverter24jdk/internal/math/FloatingDecimal.toJavaFormatString2java/lang/Double.toString2java/lang/String.valueOf2%java/util/AbstractCollection.toString2-java/util/regex/Pattern$BmpCharProperty.match2Hjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.toJavaFormatString2"sun/nio/cs/StreamEncoder.implWrite2sun/nio/cs/StreamEncoder.write2 java/io/OutputStreamWriter.write2java/io/Writer.append2_io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeEscapedLabelValue2%./lib/x86_64-linux-gnu/libz.so.1.2.112(java/util/zip/Deflater.deflateBytesBytes2java/util/zip/Deflater.deflate2*java/util/zip/DeflaterOutputStream.deflate2(java/util/zip/DeflaterOutputStream.write2$java/util/zip/GZIPOutputStream.write2%java/io/ByteArrayOutputStream.writeTo2java/util/regex/Matcher.reset2java/util/regex/Matcher.2java/util/regex/Pattern.matcher2libjvm.so.nmethod::is_alive2java/lang/StringLatin1.hashCode2java/lang/String.hashCode2$javax/management/ObjectName.hashCode2,com/sun/jmx/mbeanserver/NamedObject.hashCode2java/util/HashMap.hash2#java/util/AbstractCollection.addAll2(com/sun/jmx/mbeanserver/Repository.query2Ecom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeansImpl2Acom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeans22com/sun/jmx/mbeanserver/JmxMBeanServer.queryMBeans27org/apache/kafka/common/metrics/KafkaMetric.metricValue2Corg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttribute2Dorg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttributes26com/sun/jmx/mbeanserver/Repository.retrieveNamedObject2+com/sun/jmx/mbeanserver/Repository.retrieve2>com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBean2Bcom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBeanInfo23com/sun/jmx/mbeanserver/JmxMBeanServer.getMBeanInfo2 java/lang/StringLatin1.newString2 java/lang/StringBuilder.toString2java/util/AbstractMap.toString2libjvm.so.CodeBlob::is_zombie2#libjvm.so.JavaThread::pd_last_frame22libjvm.so.OptoRuntime::is_deoptimized_caller_frame2)libjvm.so.OptoRuntime::new_array_nozero_C2java/lang/String.getBytes2+java/lang/AbstractStringBuilder.putStringAt2$java/lang/String.checkBoundsBeginEnd2java/lang/String.getChars2java/io/Writer.write2!libjvm.so.NativeCall::destination2+kafka/cluster/Partition.fetchOffsetSnapshot2*kafka/log/TimeIndex.$anonfun$maybeAppend$12kafka/log/TimeIndex.maybeAppend2java/util/stream/Sink.end2*java/util/stream/Sink$ChainedReference.end2=java/util/concurrent/locks/AbstractQueuedSynchronizer.enqueue2Njava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.doSignal2Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.signal21java/util/concurrent/LinkedBlockingDeque.linkLast20java/util/concurrent/LinkedBlockingDeque.putLast2,java/util/concurrent/LinkedBlockingDeque.put2'kafka/network/Processor.enqueueResponse2)scala/collection/mutable/Builder.sizeHint2*scala/collection/mutable/Builder.sizeHint$2,scala/collection/mutable/MapBuilder.sizeHint2org/apache/kafka/common/requests/ProduceResponse.lambda$null$22Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1417.0x000000080158a010.accept2Eorg/apache/kafka/common/requests/ProduceResponse.lambda$errorCounts$32Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1415.0x0000000801589ba0.accept22!java/lang/System.identityHashCode2kafka/log/LocalLog.trace27kafka/server/BrokerTopicMetrics.totalProduceRequestRate2sun/nio/ch/EventFD.set02sun/nio/ch/EventFD.set2#sun/nio/ch/EPollSelectorImpl.wakeup2/org/apache/kafka/common/network/Selector.wakeup2kafka/network/Processor.wakeup24java/lang/invoke/DirectMethodHandle.allocateInstance2Cjava/lang/invoke/LambdaForm$DMH.0x0000000801578c00.newInvokeSpecial2Djava/lang/invoke/LambdaForm$MH.0x000000080157a000.linkToTargetMethod24scala/collection/AbstractTraversable.sizeHintIfCheap2;org/apache/kafka/common/record/FileLogInputStream.nextBatch2;org/apache/kafka/common/record/RecordBatchIterator.makeNext2?org/apache/kafka/common/utils/AbstractIterator.maybeComputeNext2scala/Some.isEmpty2kafka/cluster/Partition.topicId2!kafka/utils/timer/TimingWheel.add2/kafka/utils/timer/SystemTimer.addTimerTaskEntry2!kafka/utils/timer/SystemTimer.add24org/apache/kafka/common/requests/ProduceRequest.data2Ckafka/server/DelayedOperationPurgatory.$anonfun$watchForOperation$128kafka/server/DelayedOperationPurgatory.watchForOperation2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$32Nkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$3$adapted2Lkafka/server/DelayedOperationPurgatory$$Lambda$1312.0x000000080155b940.apply2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$22Skafka/server/DelayedOperationPurgatory$$Lambda$1309.0x000000080155b038.apply$mcV$sp2'kafka/log/LogSegment.$anonfun$recover$22/kafka/log/LogSegment.$anonfun$recover$2$adapted29kafka/log/LogSegment$$Lambda$338.0x000000080129e3e0.apply2+kafka/log/UnifiedLog.maybeFlushMetadataFile2#libjvm.so.Assembler::locate_operand2.unknown2java/util/Objects.hashCode2/org/apache/kafka/common/TopicPartition.hashCode2+kafka/server/ReplicaManager.isAddingReplica24kafka/server/ReplicaManager.$anonfun$fetchMessages$22Akafka/server/ReplicaManager$$Lambda$1266.0x000000080154e0d0.apply2-kafka/server/epoch/LeaderEpochFileCache.trace2scala/Option.isDefined2scala/Option.nonEmpty2!kafka/server/CachedPartition.next2dorg/apache/kafka/common/utils/ImplicitLinkedHashCollection$ImplicitLinkedHashCollectionIterator.next28org/apache/kafka/common/requests/FetchResponse.toMessage21org/apache/kafka/common/requests/FetchResponse.of2'kafka/server/KafkaApis.createResponse$125java/util/Collections$UnmodifiableCollection.contains22org/apache/kafka/common/internals/Topic.isInternal2libjvm.so.ObjectMonitor::EnterI2libjvm.so.ObjectMonitor::enter2#libjvm.so.ObjectSynchronizer::enter23libjvm.so.SharedRuntime::complete_monitor_locking_C23org/apache/kafka/common/utils/AbstractIterator.next2-org/apache/kafka/common/TopicPartition.equals2sun/nio/ch/NativeThreadSet.add2'scala/collection/mutable/HashMap.result2,scala/collection/generic/GenMapFactory.apply2:java/util/concurrent/ConcurrentSkipListMap.findPredecessor2%scala/collection/AbstractIterator.map21scala/Predef$ArrowAssoc$.$minus$greater$extension2+kafka/server/ReplicaManager.onlinePartition2$kafka/server/ReplicaManager.localLog2(kafka/server/ReplicaManager.getLogConfig20kafka/server/KafkaApis.maybeConvertFetchedData$125kafka/server/KafkaApis.$anonfun$handleFetchRequest$222=kafka/server/KafkaApis$$Lambda$1287.0x00000008015576f8.accept25kafka/server/KafkaApis.$anonfun$handleFetchRequest$212=kafka/server/KafkaApis$$Lambda$1286.0x00000008015574c0.accept2:java/util/concurrent/ConcurrentHashMap$ValuesView.iterator2=scala/collection/convert/Wrappers$JCollectionWrapper.iterator2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$22Ckafka/cluster/Partition.$anonfun$updateFollowerFetchState$2$adapted2=kafka/cluster/Partition$$Lambda$1263.0x000000080154cc20.apply2scala/Option.exists2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$12,scala/collection/mutable/HashTable.addEntry026kafka/server/KafkaApis.$anonfun$handleProduceRequest$32=kafka/server/KafkaApis$$Lambda$1366.0x000000080156cca8.accept26kafka/server/KafkaApis.$anonfun$handleProduceRequest$22=kafka/server/KafkaApis$$Lambda$1364.0x000000080156c838.accept2)libjvm.so.G1CMIsAliveClosure::do_object_b25libjvm.so.IsCompiledMethodUnloadingOopClosure::do_oop2Horg/apache/kafka/common/protocol/types/RawTaggedFieldWriter.writeRawTags28org/apache/kafka/common/message/ResponseHeaderData.write2/kafka/server/LogReadResult.toFetchPartitionData2/kafka/server/DelayedFetch.$anonfun$onComplete$22?kafka/server/DelayedFetch$$Lambda$1381.0x000000080157c6e0.apply2java/util/HashMap$Node.getKeyp \ No newline at end of file + *  * * ***************** *!* "*!#*"$*#%*$&*%'*&(*')*(**)+**,*+-*,.*-/*.0*/1*02*13*24*35*46*57*68*79*8:*9;*:<*;=*<>*=?*>@*?A*@B*AC*BD*CE*DF*EG*FG*GH*HI*IJ*JK*KL*LL*MM*NN*OO*PP*QQ*RR*SS*TT*UU*VV*WW*XW*YX*ZY*[Z*\[*]\*^]*_^*`_*a`*ba*cb*dc*ed*fe*gf*hg*ih*ji*kj*lk*ml*nm*on*po*qp*rq*sr*ts*ut*vu*wv*xv*yw*zx*{y*|z*}{*~|*}*€~**‚€*ƒ*„‚*…ƒ*†„*‡…*ˆ†*‰‡*Šˆ*‹‰*ŒŠ*‹*ŽŒ**Ž*‘*’*“‘*”’*•“*–”*—”*˜•*™–*š—*›˜*œ™*š*ž›*Ÿœ* *¡ž*¢Ÿ*£ *¤¡*¥¡*¦¢*§£*¨¤*©¤*ª¥*«¦*¬§*­¨*®©*¯ª*°«*±¬*²­*³®*´¯*µ°*¶±*·²*¸³*¹´*ºµ*»¶*¼·*½¸*¾¹*¿º*À»*Á¼*½*þ*Ä¿*ÅÀ*ÆÁ*ÇÂ*ÈÃ*ÉÄ*ÊÄ*ËÅ*ÌÆ*ÍÇ*ÎÈ*ÏÈ*ÐÈ*ÑÉ*ÒÊ*ÓË*ÔÌ*ÕÍ*ÖÎ*×Ï*ØÐ*ÙÑ*ÚÒ*ÛÓ*ÜÔ*ÝÕ*ÞÖ*ß×*àØ*áÙ*âÚ*ãÛ*äÜ*åÝ*æ~*çÞ*èß*éà*êá*ëâ*ìã*íä*îå*ïæ*ðç*ñè*òé*óê*ôë*õì*öí*÷î*øï*ùð*úñ*ûò*üó*ýô*þõ*ÿö*€÷*ø*‚ù*ƒú*„û*…ü*†ý*‡þ*ˆÿ*‰€*Š*‹‚*Œƒ*„*Ž…*†*‡*‘ˆ*’‰*“Š*”‹*•Œ*–*—Ž*˜*™*š‘*›’*œ“*”*ž•*Ÿ•* –*¡–*¢—*£˜*¤™*¥™*¦š*§›*¨œ*©*ªž*«Ÿ*¬ *­¡*®*¯¢*°£*±¤*²¥*³¦*´§*µ¨*¶©*·ª*¸«*¹¬*º­*»®*¼¯*½°*¾±*¿²*À³*Á´*µ*ö*Ä·*Ÿ*ƹ*Ǻ*Ⱥ*É»*ʼ*˽*̾*Í¿*ÎÀ*ÏÁ*ÐÂ*ÑÃ*ÒÄ*ÓÅ*ÔÆ*ÕÇ*ÖÈ*×É*ØÉ*ÙÊ*ÚË*ÛÌ*ÜÍ*ÝÎ*ÞÏ*ßÐ*àÑ*áÒ*âÓ*ãÔ*äÕ*åÖ*æ×*çØ*èÙ*éÚ*êÛ*ëÜ*ìÝ*íÞ*îß*ïà*ðá*ñâ*òã*óä*ôå*õæ*öç*÷è*øé*ùê*úë*ûì*üí*ýî*þï*ÿð*€ñ*ò*‚ó*ƒ~*„ô*…õ*†ö*‡÷*ˆø*‰ù*Šú*‹û*Œü*ý*Žý*þ*ª*‘ÿ*’€*“*”‚*•ƒ*–„*—…*˜…*™†*š‡*›ˆ*œˆ*‰*žŠ*Ÿ‹* Œ*¡*¢Ž*£*¤*¥‘*¦’*§“*¨”*©•*ª–*«—*¬˜*­™*®š*¯›*°œ*±*²ž*³Ÿ*´ *µ¡*¶~*·¢*¸£*¹¤*º¥*»¦*¼§*½¨*¾©*¿ª*À«*Á¬*­*î*į*Å°*Ʊ*Dz*ȳ*É´*ʵ*˶*Ì·*͸*ι*Ϻ*л*Ѽ*Ò½*Ó¾*Ô—*Õ˜*Ö¿*×À*ØÁ*ÙÂ*ÚÃ*ÛÄ*ÜÅ*ÝÆ*ÞÇ*ßÈ*àÉ*áÊ*âË*ãÌ*äˆ*åˆ*æÍ*çÎ*èÏ*éÐ*êÑ*ëÒ*ìÓ*íÔ*îÕ*ïÖ*ð×*ñØ*òÙ*óÚ*ôÛ*õÜ*öý*÷Ý*øÞ*ùß*úà*ûá*üâ*ýã*þä*ÿå*€æ*ç*‚è*ƒé*„ê*…ë*†ì*‡í*ˆî*‰ï*Šð*‹ñ*Œò*ó*Žô*õ*ö*‘÷*’ø*“ù*”ú*•û*–ü*—ý*˜þ*™ÿ*š€*›*œ‚*ƒ*ž„*Ÿ…* †*¡‡*¢ˆ*£‰*¤Š*¥‹*¦Œ*§*¨Ž*©*ª*«‘*¬’*­ˆ*®“*¯”*°~*±•*²–*³—*´˜*µ™*¶š*·›*¸œ*¹*ºž*»Ÿ*¼ *½¡*¾¢*¿£*À¤*Á¥*¦*ç*Ĩ*Å©*Æ©*Ǫ*È«*ɬ*Ê­*Ë®*̯*Í°*α*ϲ*г*Ñ´*Òµ*Ó¶*Ô¶*Õ·*Ö¸*×¹*غ*Ù»*Ú¼*Û½*ܾ*Ý¿*ÞÀ*ßÁ*àÂ*áÃ*âÄ*ãÅ*äÆ*åÇ*æÈ*çÉ*èÊ*éË*êÌ*ëÍ*ìÎ*íÏ*îÐ*ïÑ*ðÒ*ñÓ*òÔ*óÕ*ôÖ*õ×*öØ*÷Ù*øÚ*ùÛ*úÜ*ûÝ*üÞ*ýß*þ~*ÿª*€à*á*‚â*ƒã*„ä*…å*†æ*‡ç*ˆè*‰é*Šé*‹ê*Œê*ë*Žì*í*î*‘ï*’ð*“ñ*”ò*•ó*–ô*—õ*˜õ*™ö*š÷*›ø*œù*ú*žû*Ÿü* ®*¡ý*¢þ*£ÿ*¤€*¥*¦‚*§ƒ*¨„*©…*ª†*«‡*¬ˆ*­‰*®Š*¯‹*°Œ*±*²Ž*³*´*µ‘*¶’*·“*¸”*¹•*º–*»—*¼˜*½˜*¾™*¿š*À›*Áœ*Â*Þ*ÄŸ*Å *Æ¡*Ç¢*È£*ɤ*Ê¥*˦*̧*ͨ*Ω*Ϫ*Ы*Ѭ*Ò­*Ó®*Ô¯*Õ°*Ö±*ײ*س*Ù´*Úµ*Û¶*Ü·*ݸ*Þ¸*ß¹*àº*á»*â¼*ã½*ä¾*åð*æñ*çð*èñ*é¿*êÀ*ëÁ*ìÂ*íÃ*îÄ*ïÅ*ðÆ*ñÆ*òÇ*óÈ*ôÈ*õÉ*öñ*÷Ê*øª*ùË*úÌ*ûÍ*üÍ*ýÎ*þÎ*ÿÏ*€Ð*Ñ*‚Ò*ƒÓ*„Ô*…Ô*†Õ*‡Ö*ˆ×*‰Ø*ŠÙ*‹Ú*ŒÛ*Ü*ŽÝ*Þ*ß*‘à*’á*“â*”ã*•ä*–å*—æ*˜ç*™è*šé*›ê*œë*ì*ží*Ÿî* ï*¡ð*¢ñ*£ò*¤ó*¥ô*¦õ*§ö*¨÷*©÷*ªø*«ù*¬Î*­Ï*®ú*¯û*°ü*±ý*²þ*³ÿ*´€*µ*¶‚*·ƒ*¸„*¹…*º†*»‡*¼~*½ˆ*¾‰*¿Š*À‹*ÁŒ*Â*ÃŽ*Ä*Å*Æ‘*Ç’*È“*É”*Ê•*Ë–*Ì—*͘*Ι*Ïš*Л*Ñœ*Ò*Óž*ÔŸ*Õ *Ö¡*×¢*Ø£*Ù¤*Ú¥*Û¦*ܧ*ݨ*Þ©*ß©*àª*áª*â«*ã¬*ä­*å®*æ¯*ç°*è±*é²*ê³*ë´*ìµ*í¶*î·*ï¸*ð¹*ñº*ò»*ó¼*ô½*õ¾*ö¿*÷À*øÁ*ùÂ*úÃ*ûÄ*üÅ*ýÆ*þÇ*ÿÈ*€È*É*‚Ê*ƒË*„Ì*…Í*†Î*‡Ï*ˆÐ*‰Ñ*ŠÒ*‹Ó*ŒÔ*Õ*ŽÖ*×*Ø*‘Ù*’Ú*“Û*”Ü*•Ý*–Þ*—ß*˜à*™á*šâ*›ã*œä*å*žæ*Ÿç* è*¡é*¢ê*£ë*¤ì*¥í*¦î*§ï*¨ð*©ñ*ªò*«ó*¬ô*­õ22cpu2 nanoseconds2-java/util/concurrent/locks/LockSupport.unpark2@java/util/concurrent/locks/AbstractQueuedSynchronizer.signalNext2=java/util/concurrent/locks/AbstractQueuedSynchronizer.release2/java/util/concurrent/locks/ReentrantLock.unlock2kafka/log/OffsetIndex.append2kafka/log/LogSegment.append2kafka/log/LocalLog.append2&kafka/log/UnifiedLog.$anonfun$append$22kafka/log/UnifiedLog.append2#kafka/log/UnifiedLog.appendAsLeader28kafka/cluster/Partition.$anonfun$appendRecordsToLeader$12-kafka/cluster/Partition.appendRecordsToLeader27kafka/server/ReplicaManager.$anonfun$appendToLocalLog$62Akafka/server/ReplicaManager$$Lambda$1372.0x000000080156e380.apply2/scala/collection/TraversableLike.$anonfun$map$12Escala/collection/TraversableLike$$Lambda$143.0x00000008011ad8d8.apply23scala/collection/mutable/HashMap.$anonfun$foreach$12Escala/collection/mutable/HashMap$$Lambda$182.0x00000008011e50b0.apply2/scala/collection/mutable/HashTable.foreachEntry20scala/collection/mutable/HashTable.foreachEntry$2-scala/collection/mutable/HashMap.foreachEntry2(scala/collection/mutable/HashMap.foreach2$scala/collection/TraversableLike.map2%scala/collection/TraversableLike.map$2(scala/collection/AbstractTraversable.map2,kafka/server/ReplicaManager.appendToLocalLog2)kafka/server/ReplicaManager.appendRecords2+kafka/server/KafkaApis.handleProduceRequest2kafka/server/KafkaApis.handle2$kafka/server/KafkaRequestHandler.run2java/lang/Thread.run23java/util/concurrent/ConcurrentSkipListMap.findNear28java/util/concurrent/ConcurrentSkipListMap.findNearEntry25java/util/concurrent/ConcurrentSkipListMap.floorEntry2 kafka/log/LogSegments.floorEntry2"kafka/log/LogSegments.floorSegment2"kafka/log/LocalLog.$anonfun$read$22kafka/log/LocalLog.read2kafka/log/UnifiedLog.read2#kafka/cluster/Partition.readRecords2*kafka/cluster/Partition.readFromLocalLog$12/kafka/cluster/Partition.$anonfun$fetchRecords$12$kafka/cluster/Partition.fetchRecords2"kafka/server/ReplicaManager.read$127kafka/server/ReplicaManager.$anonfun$readFromLocalLog$72Akafka/server/ReplicaManager$$Lambda$1256.0x00000008015431d0.apply2/scala/collection/mutable/ResizableArray.foreach20scala/collection/mutable/ResizableArray.foreach$2,scala/collection/mutable/ArrayBuffer.foreach2,kafka/server/ReplicaManager.readFromLocalLog2$kafka/server/DelayedFetch.onComplete2+kafka/server/DelayedOperation.forceComplete2%kafka/server/DelayedFetch.tryComplete28kafka/server/DelayedOperation.$anonfun$safeTryComplete$12-kafka/server/DelayedOperation.safeTryComplete2Bkafka/server/DelayedOperationPurgatory$Watchers.tryCompleteWatched27kafka/server/DelayedOperationPurgatory.checkAndComplete24kafka/server/ReplicaManager.$anonfun$appendRecords$62Akafka/server/ReplicaManager$$Lambda$1425.0x000000080158b1d0.apply2+scala/collection/immutable/Map$Map1.foreach24kafka/server/ReplicaManager.$anonfun$appendRecords$52Hkafka/server/ReplicaManager$$Lambda$1397.0x0000000801585fc0.apply$mcV$sp2+kafka/server/ActionQueue.tryCompleteActions2.kafka/server/ReplicaManager.tryCompleteActions2(scala/collection/AbstractIterable.2#scala/collection/AbstractSeq.2+scala/collection/mutable/AbstractSeq.2.scala/collection/mutable/AbstractBuffer.2+scala/collection/mutable/ArrayBuffer.20scala/collection/mutable/ArrayBuffer$.newBuilder2Bscala/collection/generic/GenericTraversableTemplate.genericBuilder2Cscala/collection/generic/GenericTraversableTemplate.genericBuilder$23scala/collection/AbstractTraversable.genericBuilder2Hscala/collection/generic/GenTraversableFactory$GenericCanBuildFrom.apply2*scala/collection/TraversableLike.builder$12)kafka/server/ReplicaManager.fetchMessages2)kafka/server/KafkaApis.handleFetchRequest2java/lang/ref/Reference.clear2+java/lang/ThreadLocal$ThreadLocalMap.remove2java/lang/ThreadLocal.remove2Gjava/util/concurrent/locks/ReentrantReadWriteLock$Sync.tryReleaseShared2Cjava/util/concurrent/locks/AbstractQueuedSynchronizer.releaseShared2Ajava/util/concurrent/locks/ReentrantReadWriteLock$ReadLock.unlock26java/util/concurrent/ConcurrentHashMap.computeIfAbsent2kafka/utils/Pool.getAndMaybePut2(kafka/server/BrokerTopicStats.topicStats2java/util/HashMap.resize2java/util/HashMap.putVal2java/util/HashMap.put25kafka/server/KafkaApis.$anonfun$handleFetchRequest$1522:scala/collection/convert/Wrappers$JMapWrapperLike.iterator2;scala/collection/convert/Wrappers$JMapWrapperLike.iterator$26scala/collection/convert/Wrappers$JMapWrapper.iterator2%scala/collection/IterableLike.foreach2&scala/collection/IterableLike.foreach$2)scala/collection/AbstractIterable.foreach2Cscala/collection/compat/MapExtensionMethods$.foreachEntry$extension2/kafka/network/RequestChannel.updateErrorMetrics2)kafka/network/RequestChannel.sendResponse2-kafka/server/KafkaApis.sendResponseCallback$226kafka/server/KafkaApis.$anonfun$handleProduceRequest$92>kafka/server/KafkaApis.$anonfun$handleProduceRequest$9$adapted2org/apache/kafka/common/record/DefaultRecord.readPartiallyFrom2@org/apache/kafka/common/record/DefaultRecordBatch$1.doReadRecord2Oorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.readNext2Eorg/apache/kafka/common/record/DefaultRecordBatch$RecordIterator.next2#java/util/Iterator.forEachRemaining2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$12>kafka/log/LogValidator$$$Lambda$1377.0x000000080156f840.accept2Bkafka/log/LogValidator$.validateMessagesAndAssignOffsetsCompressed28kafka/log/LogValidator$.validateMessagesAndAssignOffsets2"scala/runtime/BoxesRunTime.equals22!scala/runtime/BoxesRunTime.equals2-scala/collection/mutable/HashTable.elemEquals2.scala/collection/mutable/HashTable.elemEquals$2+scala/collection/mutable/HashMap.elemEquals2-scala/collection/mutable/HashTable.findEntry02,scala/collection/mutable/HashTable.findEntry2-scala/collection/mutable/HashTable.findEntry$2*scala/collection/mutable/HashMap.findEntry2$scala/collection/mutable/HashMap.get2"kafka/server/FetchSessionCache.get2$kafka/server/FetchManager.newContext2*java/util/concurrent/ConcurrentHashMap.get2kafka/utils/Pool.get2(kafka/server/ReplicaManager.getPartition2/kafka/server/ReplicaManager.getPartitionOrError23kafka/server/ReplicaManager.getPartitionOrException20kafka/server/DelayedFetch.$anonfun$tryComplete$128kafka/server/DelayedFetch.$anonfun$tryComplete$1$adapted2?kafka/server/DelayedFetch$$Lambda$1310.0x000000080155b328.apply2;org/apache/kafka/common/requests/FetchRequest.lambda$null$22Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1246.0x0000000801540648.accept2java/util/ArrayList.forEach2@org/apache/kafka/common/requests/FetchRequest.lambda$fetchData$32Torg/apache/kafka/common/requests/FetchRequest$$Lambda$1245.0x0000000801540410.accept27org/apache/kafka/common/requests/FetchRequest.fetchData2kafka/cluster/Partition.appendRecordsToFollowerOrFutureReplica26kafka/server/ReplicaFetcherThread.processPartitionData2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$72Gkafka/server/AbstractFetcherThread$$Lambda$950.0x00000008014a1400.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$62Ikafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$6$adapted2Gkafka/server/AbstractFetcherThread$$Lambda$948.0x00000008014b7848.apply2Akafka/utils/Implicits$MapExtensionMethods$.$anonfun$forKeyValue$12Gkafka/server/AbstractFetcherThread$$Lambda$949.0x00000008014a1800.apply2Dscala/collection/compat/MapExtensionMethods$.$anonfun$foreachEntry$12Qscala/collection/compat/MapExtensionMethods$$$Lambda$621.0x00000008014070b8.apply2Akafka/server/AbstractFetcherThread.$anonfun$processFetchRequest$52"kafka/log/LazyIndex.$anonfun$get$12kafka/log/LazyIndex.get2 kafka/log/LogSegment.offsetIndex2/kafka/log/LogSegment.canConvertToRelativeOffset2(kafka/log/LogSegment.ensureOffsetInRange2scala/Option.contains20kafka/server/ReplicaManager.hasConsistentTopicId2Ajava/util/Collections$UnmodifiableMap$UnmodifiableEntrySet$1.next2>scala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.next2,kafka/server/RemoteLeaderEndPoint.buildFetch28kafka/server/AbstractFetcherThread.$anonfun$maybeFetch$12#kafka/server/EvictableKey.compareTo2java/util/TreeMap.getEntry2java/util/TreeMap.remove2$kafka/server/FetchSessionCache.touch2H./tmp/snappy-1.1.8-d1f9bd24-4cc8-4571-b71c-1698b83f1af1-libsnappyjava.so2,org/xerial/snappy/SnappyNative.rawUncompress2&org/xerial/snappy/Snappy.rawUncompress2#org/xerial/snappy/Snappy.uncompress20org/xerial/snappy/SnappyInputStream.hasNextChunk2.kafka/server/TopicPartitionOperationKey.equals2Bkafka/server/DelayedOperationPurgatory.$anonfun$checkAndComplete$12Ckafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$12Kkafka/server/ReplicaManager.$anonfun$completeDelayedFetchRequests$1$adapted2@kafka/server/ReplicaManager$$Lambda$984.0x00000008014c61b0.apply28kafka/server/ReplicaManager.completeDelayedFetchRequests2>kafka/server/ReplicaFetcherThread.completeDelayedFetchRequests2)java/util/Collections$UnmodifiableMap.get2 .vtable stub26java/util/stream/ReduceOps$ReduceOp.evaluateSequential2*java/util/stream/AbstractPipeline.evaluate2*java/util/stream/ReferencePipeline.collect2Porg/apache/kafka/clients/ClusterConnectionStates.nodesWithConnectionSetupTimeout2@org/apache/kafka/clients/NetworkClient.handleTimedOutConnections2+org/apache/kafka/clients/NetworkClient.poll22org/apache/kafka/common/requests/RequestUtils.flag2Eorg/apache/kafka/common/requests/RequestUtils.hasTransactionalRecords25org/apache/kafka/common/metrics/Sensor.recordInternal2-org/apache/kafka/common/metrics/Sensor.record2-org/apache/kafka/common/network/Selector.poll2:org/apache/kafka/clients/NetworkClientUtils.sendAndReceive2Corg/apache/kafka/common/message/ApiMessageType.requestHeaderVersion2=org/apache/kafka/common/protocol/ApiKeys.requestHeaderVersion21org/apache/kafka/clients/ClientRequest.makeHeader2-org/apache/kafka/clients/NetworkClient.doSend2+org/apache/kafka/clients/NetworkClient.send2'libpthread-2.31.so.__pthread_mutex_lock2#libjvm.so.ObjectMonitor::ExitEpilog25libjvm.so.SharedRuntime::complete_monitor_unlocking_C2?kafka/message/BrokerCompressionCodec$.getTargetCompressionCodec2.kafka/log/UnifiedLog.analyzeAndValidateRecords2libc-2.31.so.epoll_wait2sun/nio/ch/EPoll.wait2%sun/nio/ch/EPollSelectorImpl.doSelect2'sun/nio/ch/SelectorImpl.lockAndDoSelect2sun/nio/ch/SelectorImpl.select2/org/apache/kafka/common/network/Selector.select2Worg/apache/kafka/common/network/Selector$SelectorMetrics.maybeRegisterConnectionMetrics2:org/apache/kafka/common/network/Selector.pollSelectionKeys2;org/apache/kafka/common/requests/FetchRequest$Builder.build2(libpthread-2.31.so.__pthread_cond_signal2jdk/internal/misc/Unsafe.unpark29libjvm.so.G1BarrierSetRuntime::write_ref_array_post_entry2.jint_disjoint_arraycopy_avx32-java/util/stream/ReferencePipeline$3$1.accept29java/util/ArrayList$ArrayListSpliterator.forEachRemaining2*java/util/stream/AbstractPipeline.copyInto21java/util/stream/AbstractPipeline.wrapAndCopyInto2#java/util/stream/IntPipeline.reduce2 java/util/stream/IntPipeline.sum23kafka/cluster/DelayedOperations.checkAndCompleteAll22kafka/cluster/Partition.tryCompleteDelayedRequests2.checkcast_arraycopy_uninit2Fkafka/server/ReplicaFetcherThread$$Lambda$951.0x00000008014bc000.apply2"libjvm.so.G1BarrierSet::invalidate27org/apache/kafka/common/requests/FetchResponse.topicIds2;org/apache/kafka/clients/FetchSessionHandler.handleResponse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$32=kafka/log/LogValidator$$$Lambda$1384.0x000000080157d750.apply2scala/Option.orElse2Mkafka/log/LogValidator$.$anonfun$validateMessagesAndAssignOffsetsCompressed$22>kafka/log/LogValidator$$$Lambda$1379.0x00000008015772a8.accept2kafka/cluster/Partition$$Lambda$1261.0x0000000801543d98.accept2java/util/Optional.ifPresent2java/lang/Long.getChars2&java/lang/AbstractStringBuilder.append2java/lang/StringBuilder.append2Akafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$32Ikafka/server/ReplicaFetcherThread.$anonfun$processPartitionData$3$adapted2@org/apache/kafka/common/requests/ProduceResponse.lambda$toData$12Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1412.0x0000000801582dc0.accept2java/util/Map.forEach27org/apache/kafka/common/requests/ProduceResponse.toData27org/apache/kafka/common/requests/ProduceResponse.2libpthread-2.31.so.__libc_read2!sun/nio/ch/SocketDispatcher.read02 sun/nio/ch/SocketDispatcher.read2&sun/nio/ch/IOUtil.readIntoNativeBuffer2sun/nio/ch/IOUtil.read2!sun/nio/ch/SocketChannelImpl.read2*java/util/stream/AbstractPipeline.wrapSink2+org/xerial/snappy/Snappy.uncompressedLength2java/io/FilterInputStream.read2Zorg/apache/kafka/common/record/DefaultRecordBatch$StreamRecordIterator.ensureNoneRemaining2sun/nio/ch/EPoll.ctl2/sun/nio/ch/EPollSelectorImpl.processUpdateQueue2;scala/collection/immutable/Map$MapBuilderImpl.$plus$plus$eq2%sun/nio/ch/FileDispatcherImpl.writev02"sun/nio/ch/SocketDispatcher.writev2sun/nio/ch/IOUtil.write2"sun/nio/ch/SocketChannelImpl.write2%java/nio/channels/SocketChannel.write2=org/apache/kafka/common/network/PlaintextTransportLayer.write26org/apache/kafka/common/network/ByteBufferSend.writeTo27org/apache/kafka/common/record/MultiRecordsSend.writeTo23org/apache/kafka/common/network/NetworkSend.writeTo22org/apache/kafka/common/network/KafkaChannel.write2.org/apache/kafka/common/network/Selector.write25org/apache/kafka/common/network/Selector.attemptWrite2kafka/network/Processor.poll2kafka/network/Processor.run2java/util/HashMap.get2/org/apache/kafka/common/protocol/Errors.forCode2java/lang/String.equals2;com/yammer/metrics/stats/ExponentiallyDecayingSample.update2(com/yammer/metrics/core/Histogram.update2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$12Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$1$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1108.0x00000008014fef50.apply2'scala/collection/immutable/List.foreach29kafka/network/RequestChannel$Request.updateRequestMetrics2,kafka/network/Processor.updateRequestMetrics28kafka/network/Processor.$anonfun$processCompletedSends$12=kafka/network/Processor$$Lambda$988.0x00000008014c6c38.accept2-kafka/network/Processor.processCompletedSends26org/apache/kafka/common/protocol/SendBuilder.buildSend2>org/apache/kafka/common/protocol/SendBuilder.buildResponseSend28org/apache/kafka/common/requests/AbstractResponse.toSend2Aorg/apache/kafka/common/requests/RequestContext.buildResponseSend26kafka/network/RequestChannel$Request.buildResponseSend2.org/xerial/snappy/SnappyInputStream.readHeader2*org/xerial/snappy/SnappyInputStream.2;org/apache/kafka/common/compress/SnappyFactory.wrapForInput2=org/apache/kafka/common/record/CompressionType$3.wrapForInput2Corg/apache/kafka/common/record/DefaultRecordBatch.recordInputStream2Dorg/apache/kafka/common/record/DefaultRecordBatch.compressedIterator2Forg/apache/kafka/common/record/DefaultRecordBatch.skipKeyValueIterator2=java/util/concurrent/locks/AbstractQueuedSynchronizer.acquire22java/util/concurrent/locks/ReentrantLock$Sync.lock2-java/util/concurrent/locks/ReentrantLock.lock2,java/util/concurrent/ArrayBlockingQueue.size2$java/util/AbstractCollection.isEmpty2/kafka/network/Processor.configureNewConnections2libc-2.31.so.sendfile642&sun/nio/ch/FileChannelImpl.transferTo025sun/nio/ch/FileChannelImpl.transferToDirectlyInternal2-sun/nio/ch/FileChannelImpl.transferToDirectly2%sun/nio/ch/FileChannelImpl.transferTo2Dorg/apache/kafka/common/network/PlaintextTransportLayer.transferFrom22org/apache/kafka/common/record/FileRecords.writeTo29org/apache/kafka/common/record/DefaultRecordsSend.writeTo22org/apache/kafka/common/record/RecordsSend.writeTo2Horg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesSent2Hcom/yammer/metrics/stats/ExponentiallyDecayingSample.lockForRegularUsage2libc-2.31.so.__fxstat642#sun/nio/ch/FileDispatcherImpl.size02"sun/nio/ch/FileDispatcherImpl.size2sun/nio/ch/FileChannelImpl.size2!./lib/x86_64-linux-gnu/ld-2.31.so2%java/util/HashMap$HashIterator.2$java/util/HashMap$KeyIterator.2!java/util/HashMap$KeySet.iterator2java/util/HashSet.iterator2sun/nio/ch/Util$2.iterator2libpthread-2.31.so.__libc_write2$sun/nio/ch/FileDispatcherImpl.write02#sun/nio/ch/FileDispatcherImpl.write2'sun/nio/ch/IOUtil.writeFromNativeBuffer2 sun/nio/ch/FileChannelImpl.write29org/apache/kafka/common/record/MemoryRecords.writeFullyTo21org/apache/kafka/common/record/FileRecords.append2libnio.so.fdval2&org/apache/log4j/Logger.isTraceEnabled23org/slf4j/impl/Reload4jLoggerAdapter.isTraceEnabled2kafka/utils/Logging.trace2kafka/utils/Logging.trace$2kafka/network/Processor.trace2$kafka/network/Processor.sendResponse2+kafka/network/Processor.processNewResponses2Kjava/util/concurrent/locks/AbstractQueuedSynchronizer.hasQueuedPredecessors2Ljava/util/concurrent/locks/ReentrantReadWriteLock$FairSync.readerShouldBlock2libpthread-2.31.so.pread2$sun/nio/ch/FileDispatcherImpl.pread02#sun/nio/ch/FileDispatcherImpl.pread2'sun/nio/ch/FileChannelImpl.readInternal2sun/nio/ch/FileChannelImpl.read2-org/apache/kafka/common/utils/Utils.readFully23org/apache/kafka/common/utils/Utils.readFullyOrFail2Zorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchWithSize2Xorg/apache/kafka/common/record/FileLogInputStream$FileChannelRecordBatch.loadBatchHeader2Zorg/apache/kafka/common/record/DefaultRecordBatch$DefaultFileChannelRecordBatch.lastOffset2Borg/apache/kafka/common/record/FileRecords.searchForOffsetWithSize2$kafka/log/LogSegment.translateOffset2kafka/log/LogSegment.read2/kafka/cluster/Partition.$anonfun$fetchRecords$22#./lib/x86_64-linux-gnu/libc-2.31.so2(libjvm.so.Relocation::pd_address_in_code2#libjvm.so.oop_Relocation::oop_value2libjvm.so.nmethod::oops_do23libjvm.so.ClosureIsUnloadingBehaviour::is_unloading2>kafka/server/DelayedOperation.$anonfun$safeTryCompleteOrElse$123kafka/server/DelayedOperation.safeTryCompleteOrElse2;kafka/server/DelayedOperationPurgatory.tryCompleteElseWatch2-java/lang/ThreadLocal$ThreadLocalMap.getEntry2java/lang/ThreadLocal.get22com/yammer/metrics/stats/ThreadLocalRandom.current2Yscala/collection/mutable/HashTable.scala$collection$mutable$HashTable$$lastPopulatedIndex20scala/collection/mutable/HashMap$$anon$2.foreach2Mscala/collection/convert/DecorateAsJava$$Lambda$1281.0x00000008015566b0.apply21scala/collection/convert/Decorators$AsJava.asJava21kafka/server/KafkaApis$.sizeOfThrottledPartitions2Porg/apache/kafka/common/message/ProduceResponseData$TopicProduceResponse.addSize2;org/apache/kafka/common/message/ProduceResponseData.addSize2java/util/TreeMap.getLastEntry2java/util/TreeMap.lastEntry2>kafka/server/epoch/LeaderEpochFileCache.$anonfun$latestEntry$123kafka/server/epoch/LeaderEpochFileCache.latestEpoch2?kafka/server/epoch/LeaderEpochFileCache.$anonfun$endOffsetFor$120kafka/server/DelayedFetch.$anonfun$tryComplete$42@kafka/server/DelayedFetch$$Lambda$1311.0x000000080155b708.accept2Akafka/server/ReplicaManager$$Lambda$1405.0x00000008015835c0.apply2Bkafka/log/LogValidator$.getFirstBatchAndMaybeValidateNoMoreBatches2.updateBytesCRC32C2,java/lang/invoke/MethodHandle.asTypeUncached2$java/lang/invoke/MethodHandle.asType2*java/lang/invoke/Invokers.checkGenericType2*java/lang/invoke/Invokers$Holder.invoke_MT2@org/apache/kafka/common/utils/Crc32C$Java9ChecksumFactory.create2+org/apache/kafka/common/utils/Crc32C.create2,org/apache/kafka/common/utils/Crc32C.compute2Aorg/apache/kafka/common/record/DefaultRecordBatch.computeChecksum29org/apache/kafka/common/record/DefaultRecordBatch.isValid29kafka/log/UnifiedLog.$anonfun$analyzeAndValidateRecords$12:kafka/log/UnifiedLog$$Lambda$584.0x00000008013ed6b0.accept2Eorg/apache/kafka/common/record/DefaultRecord.skipLengthDelimitedField2"kafka/utils/Logging.isTraceEnabled2#kafka/utils/Logging.isTraceEnabled$2+kafka/network/RequestChannel.isTraceEnabled2 libjvm.so.AccessInternal::PostRuntimeDispatch, (AccessInternal::BarrierType)2, 548964ul>::oop_access_barrier2&kafka/server/KafkaRequestHandler.trace2Iorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeFromList2Norg/apache/kafka/common/utils/ImplicitLinkedHashCollection.removeElementAtSlot2Aorg/apache/kafka/common/utils/ImplicitLinkedHashCollection.remove2>kafka/server/IncrementalFetchContext$PartitionIterator.hasNext2Bkafka/server/IncrementalFetchContext.updateAndGenerateResponseData2java/util/HashMap.compute2=org/apache/kafka/common/requests/ProduceRequest.lambda$null$12Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1421.0x000000080158a8f0.accept2Gorg/apache/kafka/common/requests/ProduceRequest.lambda$partitionSizes$22Vorg/apache/kafka/common/requests/ProduceRequest$$Lambda$1419.0x000000080158a480.accept2>org/apache/kafka/common/requests/ProduceRequest.partitionSizes2Eorg/apache/kafka/common/requests/ProduceRequest.clearPartitionRecords2Ascala/collection/convert/Wrappers$JMapWrapperLike$$anon$5.hasNext224org/apache/kafka/common/protocol/Readable.readString26org/apache/kafka/common/message/RequestHeaderData.read28org/apache/kafka/common/message/RequestHeaderData.24org/apache/kafka/common/requests/RequestHeader.parse2*kafka/network/Processor.parseRequestHeader2;kafka/network/Processor.$anonfun$processCompletedReceives$12=kafka/network/Processor$$Lambda$985.0x00000008014c6590.accept2,java/util/LinkedHashMap$LinkedValues.forEach20kafka/network/Processor.processCompletedReceives2.sun/nio/ch/Util.offerLastTemporaryDirectBuffer2Jorg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.27org/apache/kafka/common/message/ProduceRequestData.read29org/apache/kafka/common/message/ProduceRequestData.25org/apache/kafka/common/requests/ProduceRequest.parse2?org/apache/kafka/common/requests/AbstractRequest.doParseRequest2=org/apache/kafka/common/requests/AbstractRequest.parseRequest22java/util/HashMap.clear2java/util/HashSet.clear2sun/nio/ch/Util$2.clear2+java/util/concurrent/ArrayBlockingQueue.put2(kafka/network/RequestChannel.sendRequest2Lorg/apache/kafka/common/network/Selector$SelectorMetrics.recordBytesReceived2/java/util/concurrent/ArrayBlockingQueue.enqueue2+com/typesafe/scalalogging/Logger.underlying2java/util/HashSet.add2*sun/nio/ch/SelectorImpl.processReadyEvents2*sun/nio/ch/EPollSelectorImpl.processEvents2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate26libjvm.so.void G1CMTask::process_grey_task_entry2$libjvm.so.G1CMBitMapClosure::do_addr2#libjvm.so.G1CMTask::do_marking_step2)libjvm.so.G1CMConcurrentMarkingTask::work2flibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2%libjvm.so.G1CMTask::drain_local_queue2nlibjvm.so.void OopOopIterateDispatch::Table::oop_oop_iterate2Olibjvm.so.G1RebuildRemSetTask::G1RebuildRemSetHeapRegionClosure::do_heap_region2(libjvm.so.HeapRegionManager::par_iterate2#libjvm.so.G1RebuildRemSetTask::work2libc-2.31.so.epoll_ctl2>org/apache/kafka/common/utils/ImplicitLinkedHashCollection.add23java/util/concurrent/ConcurrentSkipListMap.doRemove21java/util/concurrent/ConcurrentSkipListMap.remove2.java/util/concurrent/ConcurrentSkipListMap.cpr20java/util/concurrent/ConcurrentSkipListMap.doPut26java/util/concurrent/ConcurrentSkipListMap.putIfAbsent2=org/apache/kafka/common/protocol/ByteBufferAccessor.readArray2libjvm.so.Unsafe_Unpark2java/util/Arrays.copyOf2java/util/ArrayList.grow2java/util/ArrayList.add2Horg/apache/kafka/common/message/ProduceRequestData$TopicProduceData.read21libpthread-2.31.so.__pthread_mutex_unlock_usercnt2=kafka/network/Processor$$Lambda$1073.0x00000008014ec800.apply2.kafka/network/Processor.handleChannelMuteEvent2java/util/ArrayDeque.grow2java/util/ArrayDeque.addLast2(sun/nio/ch/EPollSelectorImpl.setEventOps2'sun/nio/ch/SelectionKeyImpl.interestOps2Iorg/apache/kafka/common/network/PlaintextTransportLayer.removeInterestOps21org/apache/kafka/common/network/KafkaChannel.mute2-org/apache/kafka/common/network/Selector.mute2sun/nio/ch/IOUtil.drain2sun/nio/ch/EventFD.reset2+sun/nio/ch/EPollSelectorImpl.clearInterrupt2.org/apache/kafka/common/protocol/ApiKeys.forId25org/apache/kafka/common/requests/RequestHeader.apiKey2#libjvm.so.pthread_mutex_trylock@plt2+java/util/concurrent/locks/LockSupport.park2Jjava/util/concurrent/locks/AbstractQueuedSynchronizer.acquireInterruptibly2?java/util/concurrent/locks/ReentrantLock$Sync.lockInterruptibly2:java/util/concurrent/locks/ReentrantLock.lockInterruptibly25java/util/concurrent/ConcurrentSkipListMap.addIndices2Dkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$32Lkafka/network/RequestChannel$Request.$anonfun$updateRequestMetrics$3$adapted2Jkafka/network/RequestChannel$Request$$Lambda$1111.0x00000008014ff9d8.apply2#libjvm.so.ObjectSampler::is_created22libjvm.so.AllocTracer::send_allocation_in_new_tlab2java/nio/ByteBuffer.allocate25org/apache/kafka/common/network/NetworkReceive.2(sun/nio/ch/Util.getTemporaryDirectBuffer2#libjvm.so.oopDesc::size_given_klass2libc-2.31.so.getrusage2&libjvm.so.G1CMTask::regular_clock_call2&libjvm.so.G1CMTask::drain_global_stack2*libjvm.so.OtherRegionsTable::add_reference2java/util/regex/Matcher.search2java/util/regex/Matcher.find2"java/util/regex/Matcher.replaceAll22io/prometheus/jmx/JmxCollector$Receiver.recordBean2-io/prometheus/jmx/JmxScraper.processBeanValue2'io/prometheus/jmx/JmxScraper.scrapeBean2%io/prometheus/jmx/JmxScraper.doScrape2&io/prometheus/jmx/JmxCollector.collect2?io/prometheus/jmx/shaded/io/prometheus/client/Collector.collect2nio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.findNextElement2jio/prometheus/jmx/shaded/io/prometheus/client/CollectorRegistry$MetricFamilySamplesEnumeration.nextElement2\io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeOpenMetrics1002Tio/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeFormat2Zio/prometheus/jmx/shaded/io/prometheus/client/exporter/HTTPServer$HTTPMetricHandler.handle2,com/sun/net/httpserver/Filter$Chain.doFilter2&sun/net/httpserver/AuthFilter.doFilter29sun/net/httpserver/ServerImpl$Exchange$LinkHandler.handle2*sun/net/httpserver/ServerImpl$Exchange.run21java/util/concurrent/ThreadPoolExecutor.runWorker22java/util/concurrent/ThreadPoolExecutor$Worker.run20java/util/regex/Pattern$CharPropertyGreedy.match2'java/util/regex/Pattern$GroupHead.match2#java/util/regex/Pattern$Slice.match2'java/util/regex/Pattern$GroupTail.match2*java/util/regex/Pattern$CharProperty.match2#java/util/regex/Pattern$Begin.match2java/util/regex/Matcher.match2java/util/regex/Matcher.matches27java/util/concurrent/ConcurrentSkipListMap$Iter.advance2=java/util/concurrent/ConcurrentSkipListMap$ValueIterator.next21java/util/concurrent/ConcurrentSkipListMap.toList29java/util/concurrent/ConcurrentSkipListMap$Values.toArray2(com/yammer/metrics/stats/Snapshot.2@com/yammer/metrics/stats/ExponentiallyDecayingSample.getSnapshot2-com/yammer/metrics/core/Histogram.getSnapshot2Dcom/yammer/metrics/reporting/JmxReporter$Histogram.get50thPercentile24jdk/internal/reflect/GeneratedMethodAccessor7.invoke28jdk/internal/reflect/DelegatingMethodAccessorImpl.invoke2java/lang/reflect/Method.invoke2"sun/reflect/misc/Trampoline.invoke24jdk/internal/reflect/GeneratedMethodAccessor2.invoke2"sun/reflect/misc/MethodUtil.invoke2:com/sun/jmx/mbeanserver/StandardMBeanIntrospector.invokeM221com/sun/jmx/mbeanserver/MBeanIntrospector.invokeM21com/sun/jmx/mbeanserver/PerInterface.getAttribute21com/sun/jmx/mbeanserver/MBeanSupport.getAttribute22com/sun/jmx/mbeanserver/MBeanSupport.getAttributes2Ccom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getAttributes24com/sun/jmx/mbeanserver/JmxMBeanServer.getAttributes2'io/prometheus/jmx/JmxCollector.safeName22libjvm.so.G1Policy::preventive_collection_required2)libjvm.so.TypeArrayKlass::allocate_common2"libjvm.so.OptoRuntime::new_array_C2&java/lang/AbstractStringBuilder.2java/lang/StringBuilder.2:jdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.dtoa2;jdk/internal/math/FloatingDecimal.getBinaryToASCIIConverter24jdk/internal/math/FloatingDecimal.toJavaFormatString2java/lang/Double.toString2java/lang/String.valueOf2%java/util/AbstractCollection.toString2-java/util/regex/Pattern$BmpCharProperty.match2Hjdk/internal/math/FloatingDecimal$BinaryToASCIIBuffer.toJavaFormatString2"sun/nio/cs/StreamEncoder.implWrite2sun/nio/cs/StreamEncoder.write2 java/io/OutputStreamWriter.write2java/io/Writer.append2_io/prometheus/jmx/shaded/io/prometheus/client/exporter/common/TextFormat.writeEscapedLabelValue2%./lib/x86_64-linux-gnu/libz.so.1.2.112(java/util/zip/Deflater.deflateBytesBytes2java/util/zip/Deflater.deflate2*java/util/zip/DeflaterOutputStream.deflate2(java/util/zip/DeflaterOutputStream.write2$java/util/zip/GZIPOutputStream.write2%java/io/ByteArrayOutputStream.writeTo2java/util/regex/Matcher.reset2java/util/regex/Matcher.2java/util/regex/Pattern.matcher2libjvm.so.nmethod::is_alive2java/lang/StringLatin1.hashCode2java/lang/String.hashCode2$javax/management/ObjectName.hashCode2,com/sun/jmx/mbeanserver/NamedObject.hashCode2java/util/HashMap.hash2#java/util/AbstractCollection.addAll2(com/sun/jmx/mbeanserver/Repository.query2Ecom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeansImpl2Acom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.queryMBeans22com/sun/jmx/mbeanserver/JmxMBeanServer.queryMBeans27org/apache/kafka/common/metrics/KafkaMetric.metricValue2Corg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttribute2Dorg/apache/kafka/common/metrics/JmxReporter$KafkaMbean.getAttributes26com/sun/jmx/mbeanserver/Repository.retrieveNamedObject2+com/sun/jmx/mbeanserver/Repository.retrieve2>com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBean2Bcom/sun/jmx/interceptor/DefaultMBeanServerInterceptor.getMBeanInfo23com/sun/jmx/mbeanserver/JmxMBeanServer.getMBeanInfo2 java/lang/StringLatin1.newString2 java/lang/StringBuilder.toString2java/util/AbstractMap.toString2libjvm.so.CodeBlob::is_zombie2#libjvm.so.JavaThread::pd_last_frame22libjvm.so.OptoRuntime::is_deoptimized_caller_frame2)libjvm.so.OptoRuntime::new_array_nozero_C2java/lang/String.getBytes2+java/lang/AbstractStringBuilder.putStringAt2$java/lang/String.checkBoundsBeginEnd2java/lang/String.getChars2java/io/Writer.write2!libjvm.so.NativeCall::destination2+kafka/cluster/Partition.fetchOffsetSnapshot2*kafka/log/TimeIndex.$anonfun$maybeAppend$12kafka/log/TimeIndex.maybeAppend2java/util/stream/Sink.end2*java/util/stream/Sink$ChainedReference.end2=java/util/concurrent/locks/AbstractQueuedSynchronizer.enqueue2Njava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.doSignal2Ljava/util/concurrent/locks/AbstractQueuedSynchronizer$ConditionObject.signal21java/util/concurrent/LinkedBlockingDeque.linkLast20java/util/concurrent/LinkedBlockingDeque.putLast2,java/util/concurrent/LinkedBlockingDeque.put2'kafka/network/Processor.enqueueResponse2)scala/collection/mutable/Builder.sizeHint2*scala/collection/mutable/Builder.sizeHint$2,scala/collection/mutable/MapBuilder.sizeHint2org/apache/kafka/common/requests/ProduceResponse.lambda$null$22Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1417.0x000000080158a010.accept2Eorg/apache/kafka/common/requests/ProduceResponse.lambda$errorCounts$32Worg/apache/kafka/common/requests/ProduceResponse$$Lambda$1415.0x0000000801589ba0.accept22!java/lang/System.identityHashCode2kafka/log/LocalLog.trace27kafka/server/BrokerTopicMetrics.totalProduceRequestRate2sun/nio/ch/EventFD.set02sun/nio/ch/EventFD.set2#sun/nio/ch/EPollSelectorImpl.wakeup2/org/apache/kafka/common/network/Selector.wakeup2kafka/network/Processor.wakeup24java/lang/invoke/DirectMethodHandle.allocateInstance2Cjava/lang/invoke/LambdaForm$DMH.0x0000000801578c00.newInvokeSpecial2Djava/lang/invoke/LambdaForm$MH.0x000000080157a000.linkToTargetMethod24scala/collection/AbstractTraversable.sizeHintIfCheap2;org/apache/kafka/common/record/FileLogInputStream.nextBatch2;org/apache/kafka/common/record/RecordBatchIterator.makeNext2?org/apache/kafka/common/utils/AbstractIterator.maybeComputeNext2scala/Some.isEmpty2kafka/cluster/Partition.topicId2!kafka/utils/timer/TimingWheel.add2/kafka/utils/timer/SystemTimer.addTimerTaskEntry2!kafka/utils/timer/SystemTimer.add24org/apache/kafka/common/requests/ProduceRequest.data2Ckafka/server/DelayedOperationPurgatory.$anonfun$watchForOperation$128kafka/server/DelayedOperationPurgatory.watchForOperation2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$32Nkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$3$adapted2Lkafka/server/DelayedOperationPurgatory$$Lambda$1312.0x000000080155b940.apply2Fkafka/server/DelayedOperationPurgatory.$anonfun$tryCompleteElseWatch$22Skafka/server/DelayedOperationPurgatory$$Lambda$1309.0x000000080155b038.apply$mcV$sp2'kafka/log/LogSegment.$anonfun$recover$22/kafka/log/LogSegment.$anonfun$recover$2$adapted29kafka/log/LogSegment$$Lambda$338.0x000000080129e3e0.apply2+kafka/log/UnifiedLog.maybeFlushMetadataFile2#libjvm.so.Assembler::locate_operand2.unknown2java/util/Objects.hashCode2/org/apache/kafka/common/TopicPartition.hashCode2+kafka/server/ReplicaManager.isAddingReplica24kafka/server/ReplicaManager.$anonfun$fetchMessages$22Akafka/server/ReplicaManager$$Lambda$1266.0x000000080154e0d0.apply2-kafka/server/epoch/LeaderEpochFileCache.trace2scala/Option.isDefined2scala/Option.nonEmpty2!kafka/server/CachedPartition.next2dorg/apache/kafka/common/utils/ImplicitLinkedHashCollection$ImplicitLinkedHashCollectionIterator.next28org/apache/kafka/common/requests/FetchResponse.toMessage21org/apache/kafka/common/requests/FetchResponse.of2'kafka/server/KafkaApis.createResponse$125java/util/Collections$UnmodifiableCollection.contains22org/apache/kafka/common/internals/Topic.isInternal2libjvm.so.ObjectMonitor::EnterI2libjvm.so.ObjectMonitor::enter2#libjvm.so.ObjectSynchronizer::enter23libjvm.so.SharedRuntime::complete_monitor_locking_C23org/apache/kafka/common/utils/AbstractIterator.next2-org/apache/kafka/common/TopicPartition.equals2sun/nio/ch/NativeThreadSet.add2'scala/collection/mutable/HashMap.result2,scala/collection/generic/GenMapFactory.apply2:java/util/concurrent/ConcurrentSkipListMap.findPredecessor2%scala/collection/AbstractIterator.map21scala/Predef$ArrowAssoc$.$minus$greater$extension2+kafka/server/ReplicaManager.onlinePartition2$kafka/server/ReplicaManager.localLog2(kafka/server/ReplicaManager.getLogConfig20kafka/server/KafkaApis.maybeConvertFetchedData$125kafka/server/KafkaApis.$anonfun$handleFetchRequest$222=kafka/server/KafkaApis$$Lambda$1287.0x00000008015576f8.accept25kafka/server/KafkaApis.$anonfun$handleFetchRequest$212=kafka/server/KafkaApis$$Lambda$1286.0x00000008015574c0.accept2:java/util/concurrent/ConcurrentHashMap$ValuesView.iterator2=scala/collection/convert/Wrappers$JCollectionWrapper.iterator2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$22Ckafka/cluster/Partition.$anonfun$updateFollowerFetchState$2$adapted2=kafka/cluster/Partition$$Lambda$1263.0x000000080154cc20.apply2scala/Option.exists2;kafka/cluster/Partition.$anonfun$updateFollowerFetchState$12,scala/collection/mutable/HashTable.addEntry026kafka/server/KafkaApis.$anonfun$handleProduceRequest$32=kafka/server/KafkaApis$$Lambda$1366.0x000000080156cca8.accept26kafka/server/KafkaApis.$anonfun$handleProduceRequest$22=kafka/server/KafkaApis$$Lambda$1364.0x000000080156c838.accept2)libjvm.so.G1CMIsAliveClosure::do_object_b25libjvm.so.IsCompiledMethodUnloadingOopClosure::do_oop2Horg/apache/kafka/common/protocol/types/RawTaggedFieldWriter.writeRawTags28org/apache/kafka/common/message/ResponseHeaderData.write2/kafka/server/LogReadResult.toFetchPartitionData2/kafka/server/DelayedFetch.$anonfun$onComplete$22?kafka/server/DelayedFetch$$Lambda$1381.0x000000080157c6e0.apply2java/util/HashMap$Node.getKeyp \ No newline at end of file diff --git a/receiver/pyroscopereceiver/testdata/memory_alloc_live_example.jfr b/receiver/pyroscopereceiver/testdata/memory_alloc_live_example.jfr new file mode 100644 index 0000000000000000000000000000000000000000..0df2561cfacfba57466c7f007bbf17e36817dd6d GIT binary patch literal 419286 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%0AFLTLRK9=!<5 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⩔#pz89XJbcDC#qOJe$7;psE8J8p{{4G>2%^9 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 !"#€€@( +DEFGHIJKLMNOPQRSTUVWXYZ[\]^!"_#€€ÀF +=`abcdefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#/€€à e +]‹ŒŽ‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ - +%./01Ÿ ¡¢£¤¥¦§TUVWXYZ[\]^!"_#€€ F +=`ab¨©ghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#7€€à n +eª«¬­®¯Ž‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_# €€ t +l°±²³´vwµ¶·¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€@ +ÊËÌÍÎÏÐÑÒ#€€@* +!ÓÔFGHIJKLMNOPQRSTUVWXYZ[\]^!"_#€€à. +%ÕÖ×DEFGHIJKLMNOPQRSTUVWXYZ[\]^!"_#€€ * +!./01ØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€À+ +#ÜÝÞFGHIJKLMNOPQRSTUVWXYZ[\]^!"_#€€@t +l°±²³´vwµ¶·¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€`n +eª«¬­®¯Ž‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_# €€€R +Jßàáâãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@F +>éêëìíîïðñòstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ % +óôõö÷øùúûüýÐÑÒ#€€ h +`þÿ€¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ M +Dª«‚ƒ„efghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ÀL +D…†‡ˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€@S +Jª«‚ƒ„–—cdefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€€ +˜™šýÐÑÒ#€€ * +!./01ØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€€q +h›œžŸ ¡¢º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ r +j¥¦45™š§<=¨©ª«º¬½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ Q +I­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ ] +UÃÄÅÆǼÈɯ°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ h +`ÊËÌÍÎÏн£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ‹ +‚›œžŸ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ * +!ÝÔFGHIJKLMNOPQRSTUVWXYZ[\]^!"_# €€€' +ÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€@d +\.ßàáâã‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ Z +Räåæçèéêëãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ & +ìíî復§TUVWXYZ[\]^!"_#€€€b +ZðÚÛܽ£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ L +Dñ†òˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€ _ +W<=>óôõöK÷øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ z +r€‚ƒ„…†‡ˆ‰Š‹¡¢£ŒŽ¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ” +ŠžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€€O +Fª«‚ƒ„efghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€À, +#ìíØÙÚÛ¥¦§TUVWXYZ[\]^!"_# €€ o +gí¡¢£ŒŽ‘’“”¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ f +]ª«¬­®¯•’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_# €€€p +hžŸ ¡¢Ÿ ¡¢º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€`j +b–ÝÞ¸¹º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ K +C—˜™šb¨©ghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ * +!./01ØÙÚÛ¥¦§TUVWXYZ[\]^!"_# €€ k +c›œžÓŸ¡¢ž ¡¢£¤¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ r +jª«¬­®¯°±²³´µ¶·­®¯°¸¹º»¼æçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@d +\½¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ e +]¾¿ÀÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ % +.ßÄÅ¥¦§TUVWXYZ[\]^!"_#€€ S +KÆ(ÇÈÉÊËÌÍÎìíîïðñòstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ D +œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€  +奦§TUVWXYZ[\]^!"_#€€ j +b°±²æçèé¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ v +n°±²êëìíîïðñòóô½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ N +Fõàáâö÷çèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ J +B./01ø÷çèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@) +!ùÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ 1 +)úûüýþÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ 4 +,ÿÝÞ€‚KÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ l +dƒ„…<=¨©ª«º¬½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ G +?†‡ˆ‰fghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@1 +)Š‹ŒŽ‘’“”•–—˜™š›œš#€€ T +Lßàáâãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@o +gžŸ ¡¢£¤¥½¦§¨©ª«¤¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€@1 +)¬­®¯þÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ › +’›œžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ d +\°ÝÞé¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ) +!±…²³´µ¶·¸¹º»¼½¾!"#€€ / +'¿ÀÁÂÃÄÅÆÇÈ·¸¹º»¼½¾!"#€€ % +²³´ÉÊ˸¹º»¼½¾!"#€€ # +±…̶˸¹º»¼½¾!"#€€ - +%./ÍÎÏг´µ¶Ë¸¹º»¼½¾!"#€€@% +²³´µ¶Ë¸¹º»¼½¾!"#€€ ' +ìíѵ¶Ë¸¹º»¼½¾!"#€€ % +./01Ÿ Ò˸¹º»¼½¾!"#€€ % +ìí Ò˸¹º»¼½¾!"#€€ ' +./ÓÔŸ Ò˸¹º»¼½¾!"#€€ $ +.ßÕֶ˸¹º»¼½¾!"#€€ # +±…̶˸¹º»¼½¾!"#€€ / +'×ØÙÚÛ²³´µ¶Ë¸¹º»¼½¾!"#€€ % +²³´µ¶Ë¸¹º»¼½¾!"#€€ ' +./ÓÔŸ Ò˸¹º»¼½¾!"#€€ # +±…̶˸¹º»¼½¾!"#€€@! +…̶˸¹º»¼½¾!"#€€ % +./01Ÿ Ò˸¹º»¼½¾!"#€€ # +ÜÝÈÞ߸¹º»¼½¾!"#€€ 1 +)¿ÀÁÂÃÄÅÆÇÈÞ߸¹º»¼½¾!"#€€ ‹ +‚žŸ ¡¢Ÿ ¡¢ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ € +x°±²àáâãäåååæçè<=>éÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ g +_23456789:;<=>?@ABê¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ $ +ðÚÛÜë…†‡ˆ‰Š]^!"_#€€ „ +|–ÝÞ¸¹ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ; +3ìíìpqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ t +líª«¬­®¯°±²³´µ¶·­®¯°¸¹º»¼æçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ • +ŒžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€@i +`žŸ ¡¢º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€À¾ +µîÖ×ïðñòóôõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ï +Æìß©ª«¬­®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`h +`–ÝÞ¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ · +®·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`½ +³ÝÖ׺ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€– +åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@  +—ïÝÞðvwµñßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¶ +­òóóôõöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`· +­òóóôõöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€U +M‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ³ +©°±²³´vwµ¶·¸¹º»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Î +ÅžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`Ï +Æ÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ‘½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Ö +Í”•9:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ç +Þ–—˜™š›œžŸŸ ¡¢£¤¥Û¦®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ L +Dñ†‡ˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€  +y§¨©ª«‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ø +®¯°±²³´µ¶¶¶¶¶¶·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +„ÀÁÂËÌÍÃĺÑÒÓÔ¡¢Ÿ ¡¢Ÿ ¡¢º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ª +¡ÀÁÂËÌÍÃĺ¬½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¨ +ŸíÅÆÇÈÉÊËÌåæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ v +mÍÎÏÐÑ•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ “ +Š›œžŸ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ÿ +õòóôÒÓÔÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¢ +™Øæçèé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`Ý +ÔŸËÌÍÃÄ…<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ F +>ìíìÙÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ ¥ +œåæ¡¢ž íîßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Z +Räåïðñòóôõö÷øùõöúûüýþÿ€‚ƒ„…†‡ˆ‰]ëì—˜™š›œš#€€@œ +“ŠÖ×åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Æ +½žŸ ¡¢Ÿ ¡¢ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ K +B‹ŒŽÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€€– +åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ê +á‘’“”•–—K˜™š›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ @ +7œžŸ ¡¢¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€œ +“èé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ª +¡£ÝÞ¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Ù +Б’õöÓÔ™š›Ö×ØÙ©ª«“¬­®¯Û“¬°±²„678Ö×…†‡ˆ‰Š‹Œ­®¯Û“êëìí³´µ¶·¸VWXYZ[\]ÁÂÃÄÅƹº»]¼½¾§¿ÀÁÂÃÄÃÅÆÇÈÉÊËÌ͉Š]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉÎÏÐÑÒÓÔÕÑÒÖ×ØÙÚÛÜݘ™šŸ˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ õ +ìÞßàáâãåæçäåæçèéš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@À +·žŸËÌÍÃÄ…<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`œ +“ŠÖ×åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ß +Ö½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ò +éÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ì +ãêëõöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Ä +»ìíîÿ€¸¹ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ÿ +öêëõïðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +øÿ€‚ƒÉÊËÌÍÎìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ý +ô„……̆‡ˆ‰ŠìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ú +Ñ‹ŒŽÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@” +‹ÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@á +Ø‘à›œžŸ ¡¢£¤¥Û¦®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ý +ô’“”•–—˜™š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`E +=¤¥¦§¨žŸ ¡¢¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¡ +˜ÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ± +¨©ª½«¬ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +ë…†‡ˆ‰Š]^!"_#€€ ç +Þ­®‰Š‹¡¢£¯°±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ F +=ÿ€œžŸ ¡¢¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ … +üìíº»¼”•–—˜™š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@… +üÕÖ×Ö×õïðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ý +ô½¾¿ðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Ÿ +•”•ÀÁÂÃÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ « +¢ÄÝÞÅÆÇÈž íîßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`« +¢ÉÝÞÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ v +n°±²³´vwµ¶·¸¹º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ Ö +Í›œžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¬ +£ÀÁÂËÌÍÃĺ»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ = +5ÊËÌÍÞßàáâãäåæçèéêëì—˜™š›œš#€€`´ +«óóôõöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ å +Ü–—˜™š›œžŸ ¡¢£¤¥Û¦®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ½ +´ÎÏз¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ÿ +ö‘’õïðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ m +eÑÝÞÒÓÔÕ›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ² +©‘’õöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¶ +­ÖÖ×<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ œ +“×¼½¾¿ÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¸ +¯ØÝÞÙÚÛK«¬ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ‘ +ˆòóôÒÓÔÕÖ×Ö×õïðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@À +·½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ € +÷ÖÖ×<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¢ +™ìÜÝÞßàáâãüáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`U +MÍäåæçèéêëìíîïðñòóôàáâãäåæçèéêëì—˜™š›œš#€€ Æ +½ÀÁÂËÌÍÃĺÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ) +!íØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ ‘ +ˆ›œžŸ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ i +aõö÷øùú¦§¨©ª«¤¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ^ +Vèé¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ) +!ûü¡¢£¤¥¦§TUVWXYZ[\]^!"_#€€ † +~›œžŸ ¡¢ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€@; +3ýþÿ +  !"#€€ W +O€ ÑÒÓÃÄÅÆÇÈÉ‚ ƒ „ … † Á‡ ˆ ‰ Š ‹  !"#€€ e +]ž Œ ¬½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ) +! Ž òóô ‘ ’ “ ” • – —  !"#€€ c +['(ÇŽ‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ 3 ++˜ ¬­®¯þÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ K +C—˜™šbcdefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ 3 ++ûü™ üýþÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ h +`–ÝÞ¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€`5 +-½‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€ a +YíÅš › œ ž ”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ M +E¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ D +<…Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ EFGHIJKLMNOPQRSTUVWXYZ[\]^!"_#€€ r +jžŸ ¡¢Ÿ ¡¢º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€`o +gž ­ ® ¯ ° ± ² ¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ : +2ûü³ ´ µ ½€¶ · KÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ e +]…²³´µ‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ q +i¸ ¹ º » ½¼ ¾¿ÀÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ s +k./01Ÿ ¡¢£ŒŽ‘’“”¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ v +n°±²³´vwµ¶·¸¹º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ T +L½ ßàáâãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€`. +&.¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï #€€ 8 +0.Ð Ñ Ò Æ Ç È É Ê Ó Ô Õ Ò Æ Ç È É Ê Ö × Ì Í Î Ï #€€ 4 +,.ßØ Ù Ú ¿ À Á Â Ã Ä Å Æ Ç È É Ê Û Ì Í Î Ï #€€ / +'Ü Ý Þ ß à á â ã Ò Æ Ç È É Ê Û Ì Í Î Ï #€€ ) +!ä Â Ã Ä Å Æ Ç È É Ê å æ Ì Í Î Ï #€€ & +.Ð Ñ Ò Æ Ç È É Ê å æ Ì Í Î Ï #€€ I +AÜ Ý Þ ß à á â ã Ò Æ Ç È É Ê ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ > +6.Ð Ñ Ò Æ Ç È É Ê ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ ` +X.ßØ Ù Ú ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ó Ô Õ Ò Æ Ç È É Ê ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ F +>.Ð Ñ Ò Æ Ç È É Ê ð ñ ò ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ F +>.ô Æ Ç È É Ê õ ö ÷ ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ [ +S±…ú û ü ý þ ÿ € + + +‚ +ƒ +„ +… +† +‡ +ˆ +‰ +Š +ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ ^ +V‹ +(ÇŒ +ü ý þ ÿ € + +‚ + +Ž + + +‘ +’ +“ +” +ˆ +‰ +Š +ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ m +eä Â Ã Ä Å Æ Ç È É Ê Ó Ô Õ Ò Æ Ç È É Ê Ó Ô Õ Ò Æ Ç È É Ê • +ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ R +J.¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê – +• +ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ T +L.ßØ Ù Ú ¿ À Á Â Ã Ä Å Æ Ç È É Ê ø ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ I +A./01— +˜ +Ò Æ Ç È É Ê ™ +š +ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ X +P.ßØ Ù Ú ¿ À Á Â Ã Ä Å Æ Ç È É Ê › +™ +š +ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ K +CìíÅœ +Ç +Ç È É Ê ž +Ÿ +š +ù ó ç è é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ ? +7Á Â Ã Ä Å Æ Ç È É Ê   +é ê ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ L +D.¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ¡ +¢ +£ +¤ +¥ +ì ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ J +B.¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ¦ +§ +¨ +¥ +ì ë ì í ì î ì ï ì å æ Ì Í Î Ï #€€ o +g© +ª +« +¬ +­ +456789:;<=>óô® +¯ +K° +øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ' +ìí± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ + €€àZ +R”•ÀÁÂý +¾ +êëìíî¿ +À +Á +VWmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ f +^ +à +²³´µ¶·­®¯°¸¹º»¼æçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@J +BÄ +‡ˆ‰Šìíîïðñòstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ o +g›œž ­ ® »¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ $ +ûü± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€ ' +./01Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€€/ +'./01ýþÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ ™ +›œžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ) +!½ÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ $ +.ßÄÅÆ +´ +µ +¶ +· +¸ +¹ +º +» +¼ + €€àl +d×ØÙÇ +È +©ª«º¬½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ` +XÉ +Ê +¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ` +X›º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ u +m./01Ë +Ì +è¡¢£ŒŽ‘’“”¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ R +JÍ +Î +ÉÉÊËÌÍÎìíîïðñòstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€  +ùOPQRSTUVWXYZ[\]^!"_#€€ j +bžŸ ¡¢º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ U +MÏ +Ð +Ñ +Ò +ËÌÍÃÄ…<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ u +mÓ +Ô +Õ +Ö +× +Ø +Ù +Ú +÷øùú¦§¨©ª«¤¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€  +›¥¦§TUVWXYZ[\]^!"_#€€ r +jÛ +Ö×Ü +Ý +Þ +ïðñòóô½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ K +C—˜™šbcdefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ n +fð©ß +à +á +â +]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ K +C—˜™šb¨©ghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ „ +|€‚ã +ä +å +vwµ¶·æ +ç +è +žŸ ¡¢º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ v +n°±²³´vwµ¶·¸¹º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ t +l°±²³´vwµ¶·¸¹º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ R +Jßàáâãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ u +m./01é +ê +ë +ì +í +î +ï +ð +³´µ‘’“”•–—˜45™š›<=>œžmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€@x +p€‚ã +ä +å +vwµ¶·¸¹º»¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ a +Y¤¥¦ñ +ò +ó +œô +õ +¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ v +n›œžŸ ¡¢Ÿ ¡¢º»¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ T +Lö +ßàáâãäåæçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ a +Y‚ƒ„§¨©ª«¤¥¦§¨ü©þÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ b +Z©ª«º¬½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ [ +S÷ +ø +ÆǼÈɯ°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ m +eù +Ö×ú +Ö×û +ü +ý +þ +ÿ +€ ‚ ƒ „ … † ‡ ˆ ³´µ¶·¸¹º»¼½¾¿ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ O +G.ßàáâツefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ M +E‰ —˜™šb¨©ghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ L +Dìíø÷çèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ 5 +-Š ‹ ¬­®¯þÞØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ – +Œ ÝÞÖ×…†ý +þ + Ž ‘ ’ “ ” À¸ ¹ º » ½¼ ¾¿ÀÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ~ +v°±²àáâãäååæçè<=>éÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ½ +´• Ïз¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@³ +ª– — ˜ Ù š ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ß +ÖžŸËÌÍÃÄ…<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`ª +¡‹‹ŒŽÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ÿ +ö› ½¾¿ðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ § +ÀÁÂËÌÍÃÄåæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€À +·”•œ ž ÒÓŸ êëì힟Ÿïðñòóô½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ „ +úûüº»¼”•–—˜™š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€$ +  Ö׃„…†‡ˆ‰Š]^!"_#€€ ƒ +úØ¡ ¢ è£ ¤ ¥ ¦ § “êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ç +Þ./01Ë +Ì +è¡¢£¨ °±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¢ +™© ª « ¬ ­ ® ¯ ‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ä +Û° Ö×óô± ² K³ ´ µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ‡ +þìß©ª› ½¾¿ðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ _ +W.ßØ Ù Ú ¿ À Á Â Ã Ä ¶ · ¸ ¹ º ÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ ² +©°±²³´vwµ¶·¸¹º»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ì +ã» ¼ õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ n +f¬­®¯°±²³´µ¶·­®¯°¸¹º»¼æçèghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ § +ž½ ¾ õöÕÖ×ØÙÚÛÜ£ ¿ À Á è ¿ ¡ ¢ è£ ¤ ¥ ¦ § “êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ù +ðÍÃ Ä Å Æ Ç š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ô +ËðÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ B +:ÔÈ É ÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ š +‘ðvwµñßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`‹ +‚žŸ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ E +=Ê Ë Ì Í Î žŸ ¡¢¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ß +Ö–’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ³ +ªÏ Ð Ñ ÀÁÂÃÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ì +ãóôõöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Í +Ä‘’õöÓÔ6789:;Ö×ØÙÚÛÜùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ C +;Ò Ó Ô Õ Ö × Ø Þßàáâãäåæçèéêëì—˜™š›œš#€€  +„°±²àáâãäåæçè<=>éÁÂì +­ +456789:;<=>óôõöK÷øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ † +ýÙ )*+,-Ú Û Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@‚ +ù”•ÀÁÂÙ š ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑÂÃÄÅÆë ì Kí î ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ñ +螟ï ð ý +þ + Ž ‘ ñ þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ± +¨ìíî™ š ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Á +¸Œ ÝÞÖ×ØÙÚÛÜùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¼ +³÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Z +RìíÅò ó ô õ ö ÷ · ¸ ¹ º ÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ ƒ +ú¿ ¡ ¢ è£ ¤ ¥ ¦ § “êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`Ü +Ò÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€· +®”•9:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@¬ +£ø ù ú „¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@¦ +°±²æçèé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +‡• Ïз÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ° +§÷ø456789:;<=>ùúûû ü ý „678Ö×…†‡ˆ‰Š‹Œþ ÷ø456789:;<=>ùúÿ € ‚ ½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +øõÕÖ¼”•–—˜™š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¡ +˜›œž îßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ | +t°±²àáâãäåæçè<=>éÁÂÀ‚ƒ„øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ¶ +­°±²êëì힟Ÿïðñòóô½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@¬ +£ƒ „ ƒ„… úûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ d +\Øæçèé¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ 5 +-ÿ€‚† ÀÁÂØÙÚÛ¥¦§TUVWXYZ[\]^!"_#€€ ƒ +ú‡ ˆ ‰ Ý Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ þ +õÆ(ÇÈÉÊËÌÍÎìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ œ +“›º¬½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +“èé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€€¦ +°±²æçèé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¦ +°±²æçèé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¾ +µŠ ‹ ¸¹ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ × +ÎŒ ´ µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ y +qŽ ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ² +©óôõöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@À +·žŸ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ƒ +úòóóôõïðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@¾ +µŠ ‹ ¸¹ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ó +Êì ‘ ’ ½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ˆ +ÿŸËÌÍÃÄ…<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ E +=ÿ€œžŸ ¡¢¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Š +“ Ö׉Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ É +À” • – ¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +¹— — — — ˜ ™ žŸ© +ª +« +š › œ „… úûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¸ +¯ ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ e +]ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ ¡¢¤˜™š¦˜™§¨”•–—˜™š›œš#€€ ¶ +­· ¸ ¹ º » ¼ ½ ¾ ¿ À Á  ýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¦ +°±²æçèé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ü +óóôÒÓÔÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ç +¾òóôÒÓÔÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ‘½’÷ø456789:;<=>ùúûû ü ý „678Ö×…†‡ˆ‰Š‹Œþ ÷ø456789:;<=>ùúÿ € ‚ ½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Q +IÃ Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Ñ Ò Ó Õ Ö × Ø Ù Ú ëì—˜™š›œš#€€ ² +©<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ž +•Û Ü Ý Þ ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ’ +‰ÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@µ +¬ðÚÛÜùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ª +¡ìíÅß à ©ª«º¬½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ’ +‰Œ ÝÞÖ×ØÙ©á â ã ª«‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Í +Ľ ¾ õöÓÔ6789:;Ö×ØÙÚÛÜùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ä +»òóôÒÓÔÕÖ×Ö×õöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +¹ŠÖ×åæ¡¢žŸ ¡¢ÕÖ×ä å ý +þ +ÿ +æ ç è îßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ M +Eé ê ë ì í î ï ð ì ñ ò ó ô õ ö ÷ ø ù ú û ü ý Ø Ù Ú ëì—˜™š›œš#€€ ë +âåååæçþ æçèéš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ [ +Sÿ € ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ Ì Í Î Ï Ð Ñ Ò Ó Ô Ñ Ò Ó Õ Ö × Ø Ù Ú ëì—˜™š›œš#€€ Æ +½ûü Ž ‘ ’ “ ” • – » ¼ ½ ¾ ¿ À Á  ýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ È +¿žŸ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Õ +Ì— ½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ‘½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¥ +œÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@¢ +™òóôÒÓÔÕÖ×Ö×õöÓÔ678Ö×ØÙÚÛ˜ ÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ß +Öæçèéš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@Ð +ÇžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ºÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@I +A™ È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Ñ Ò Ó Õ Ö × Ø Ù Ú ëì—˜™š›œš#€€ ´ +«óóôõöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ +yš ã +ä +å +vwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ó +êæç› œ ž ´µ¶¶¶¶¶¶·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¬ +£ø ù ú „¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€`J +BŸ   ŽÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ o +g¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ± ² ³ ´ µ ¶ ¡¢¤˜™š¦˜™§¨”•–—˜™š›œš#€€ ç +Þ./ÓÔŸ ¡¢£¯°±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¢ +™¹ ÈÉÊËÌåæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ó +êº » ½¼ ½ ¾ ¿ À Á ½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ´ +«òóóôõöÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¬ +£Ø à „¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ý +ôÄ Å Æ Ç Ä +‡ˆ‰ŠìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ” +‹òóóôõöÓÔ678Ö×ØÙÚÛ˜ ÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@« +¢ŠÖ×åæ¡¢ž íîßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ˆ +ÿ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Y +QÈ É Ê Ë Ì Í é ê ë ì í î ï ð ì ñ ò ó ô õ ö ÷ ø ù ú û ü ý Ø Ù Ú ëì—˜™š›œš#€€ ü +óóôÒÓÔÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ J +B‹ŒŽÚÛÜkÝÞßàáâãäåæçèéêëì—˜™š›œš#€€ ‡ +þìß©ª› ½¾¿ðñòóôõö÷øùú½ûüýþ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ e +]ìÎ ©ªÏ Ð Ñ Ò Ó Ô ° ± ² ³ ´ µ ¶ · ¸ ± ² ³ ´ µ ¶ ¡¢¤˜™š¦˜™§¨”•–—˜™š›œš#€€ - +%Õ ÝÞÖ ü × Ø Ù Ú ëì—˜™š›œš#€€ ª +¡£ÝÞ¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ — +ŽòóóôõöÕÖ×ØÙÚÛÜ£ ¤ ¥ ¦ § “êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ª +¡‹‹ŒŽÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ E +=Ø Ù ° ± ² ³ ´ µ ¶ ¡¢¤˜™š¦˜™§¨”•–—˜™š›œš#€€ I +AÚ Û Ü Ý ï ð ì ñ ò ó ô õ ö ÷ ø ù ú û ü ý Ø Ù Ú ëì—˜™š›œš#€€ ' +./01Þ ± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ + €€àï +æ×ØÙÚÛÓ +Ô +Õ +Ö +× +ñ þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ´ +«°±²êëì힟ïðñòóô½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ + +"ìíß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€ÀO +G'(Çà á ™šbcdefghijklmnopqrstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ + +"./01Å +ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€ÀN +F±…†‡ˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€ X +Pâ ã ä å æ ç è é ê ˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€ Ý +Ô./01ë š›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ × +ί°±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ á +Øûü¡¢£¨ °±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ’ +‰ßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ÷ +îì í î ï ð š›œžŸ ¡¢£žš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ õ +ì» ¼ õöÓÔ™š›Ö×ØÙ©ë š›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ÿ +–óôõö÷øùûüñ ò ó ô õ ö ÷ ‰ Ý Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ž +•èé¼½¾¿ÀZ[\]ÁÂÃø Ž © ª « Ž‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ) +!°±²HIJKLMNOPQRSTUVWXYZ[\]^!"_#€€ ^ +V² ¼½£¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ q +ií ¡¢£ŒŽ‘’“”¤¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ + +"./01ù ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€À+ +"./01ù ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ + €€€- +$ìíù ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ + €€ : +2ú û ä å æ ç ü Ó +Ô +ý þ ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€ : +2íÿ €’ “ ý þ ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€  +¹”•9:;Ö×ØÙÚÛÜùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@š +‘– — ˜ ÃÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ š +‘žŸ‚‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€@ë +âìíÅÓ +Ô +Õ +Ö +× +ñ þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¬ +£›œžŸ ¡¢º»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¤ +›÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ‘½’÷ø456789:;<=>ùúûû ü ý „678Ö×…†‡ˆ‰Š‹Œþ ÷ø456789:;<=>ùúÿ € ‚ ½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ æ +ÝÕÖ×Ö×õöÓÔ6789:;Ö×ØÙÚÛÜùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ‘½’÷ø456789:;<=>ùúûüýþ½ÿ÷ø456789:;<=>ùú€‚ƒ„678Ö×…†‡ˆ‰Š‹Œ÷ø456789:;<=>ùúŽ“êëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ þ +õƒÎϽÐÑÂÃÄÅÆë ì Kí î ÀÀÁ456789:;<=>ËÌÄÅÍ„…½†‡ÂÃÄÅƈ‰KŠ‹ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ J +BŒÌÍÎìíîïðñòstuvwxyzk{|}~€‚ƒ„…†‡ˆ‰Š]^!"_#€€ ± +¨”•ÀÁÂÃÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ã +Úìí¡¢£¯°±²³´µ¶·¸¹®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¤ +›¤¥¦§¨¡¢åæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ µ +¬ÀÁÂËÌÍÃÄåæ¡¢ž íîßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ · +®”•ÀÁÂÙ š ÀÀÁÂÃÄÅÆÇÈKÉÊ456789:;<=>ËÌÄÅÍÎϽÐÑêëìíÒÓÔÕÖ×ØÙÚÒÓÔÕÖ×îïÛÜ®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ Ô +Ë›œžŸ ¡¢Ÿ ¡¢Ÿ ¡¢ÑÒÓÔ¡¢ÕÖ×ØÙÚÛܼ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ß +ÖŽ‘š›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¢ +™’ÝÞïðñ½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ É +À½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ \ +T² ¼½¾¿ÀZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ ‰ +€“ô õ ö ÷ ‰ Ý Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¦ +–ÝÞ¸¹º»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€  +¹óôÒÓÔÕÖ×Ö×õöÕÖ×ØÙÚÛÜé¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ å +ÜÓ +Ô +Õ +Ö +× +ñ þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ¦ +ÀÁÂËÌÍÃÄåæ¡¢žŸ ¡¢çèéêëvwµìíî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ 2 +*æ ç ü Ó +Ô +ý þ ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€@S +K€ ÑÒÓÃÄÅƹº»]¼½¾§¿ÀÁÂÃÄÃÅÆÇÈÉÊËÌ͉Š]^!"_#€€ ‡ +Ó +Ô +Õ +Ö +× +”ÊËÌ•íî“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ® +¥žŸ ¡¢Ÿ ¡¢º»¼½Þßàáâãäü‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ k +cŸËÌÍÃÄ…<=>óôõöK÷øùúûüýþÿVWXYZ[\]ÁÂÃÄÅÆÇÈÉ[\]ÁÂÃÄÅÆÇÈÉ[\]^!"_#€€ B +:–ÝÞ—˜™š45™š§<=¨ý þ ß Å +± +² +³ +´ +µ +¶ +· +¸ +¹ +º +» +¼ +€€ í +äåååæçäåæçèéš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ P +H°±²›œˆ‰MŠ‹ŒŽOP‘K’OP“”•IJKLMNOPQRSTUVWXYZ[\]^!"_#€€ ñ +èž— — — — ˜ ™ Ÿ© +ª + éš›¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ‰ +€ó ô õ ö ÷ ‰ Ý Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ã +Úí¡¢¡þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ é +àíÅÓ +Ô +Õ +Ö +× +ñ þ·¶¸¹º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ ‚ +ù¢%Ú Û Ü Ý Þ Ý ß à Ý á â Ý ã ä Ý å æ Ý ç è é ê Ý µ º»¼½¾°¿®¯°±²³°´µ¶kõö÷øùúûüýþÿ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œ—˜™šž—˜™šŸ˜™š ¡˜™š¢£¤¥˜™š¦˜™§¨”•–—˜™š›œš#€€ """"""""""""""""" " " +" +" " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ +"€ +" +" +"‚ +"‚ +"ƒ +"ƒ +"„ +"„ +"… +"… +"† +"† +"‡ +"‡ +"ˆ +"ˆ +"‰ +"‰ +"Š +"Š +"‹ +"‹ +"Œ +"Œ +" +" +"Ž +"Ž +" +" +" +" +"‘ +"‘ +"’ +"’ +"“ +"“ +"” +"” +"• +"• +"– +"– +"— +"— +"˜ +"˜ +"™ +"™ +"š +"š +"› +"› +"œ +"œ +" +" +"ž +"ž +"Ÿ +"Ÿ +"  +"  +"¡ +"¡ +"¢ +"¢ +"£ +"£ +"¤ +"¤ +"¥ +"¥ +"¦ +"¦ +"§ +"§ +"¨ +"¨ +"© +"© +"ª +"ª +"« +"« +"¬ +"¬ +"­ +"­ +"® +"® +"¯ +"¯ +"° +"° +"± +"± +"² +"² +"³ +"³ +"´ +"´ +"µ +"µ +"¶ +"¶ +"· +"· +"¸ +"¸ +"¹ +"¹ +"º +"º +"» +"» +"¼ +"¼ +"½ +"½ +"¾ +"¾ +"¿ +"¿ +"À +"À +"Á +"Á +" +" +"à +"à +"Ä +"Ä +"Å +"Å +"Æ +"Æ +"Ç +"Ç +"È +"È +"É +"É +"Ê +"Ê +"Ë +"Ë +"Ì +"Ì +"Í +"Í +"Î +"Î +"Ï +"Ï +"Ð +"Ð +"Ñ +"Ñ +"Ò +"Ò +"Ó +"Ó +"Ô +"Ô +"Õ +"Õ +"Ö +"Ö +"× +"× +"Ø +"Ø +"Ù +"Ù +"Ú +"Ú +"Û +"Û +"Ü +"Ü +"Ý +"Ý +"Þ +"Þ +"ß +"ß +"à +"à +"á +"á +"â +"â +"ã +"ã +"ä +"ä +"å +"å +"æ +"æ +"ç +"ç +"è +"è +"é +"é +"ê +"ê +"ë +"ë +"ì +"ì +"í +"í +"î +"î +"ï +"ï +"ð +"ð +"ñ +"ñ +"ò +"ò +"ó +"ó +"ô +"ô +"õ +"õ +"ö +"ö +"÷ +"÷ +"ø +"ø +"ù +"ù +"ú +"ú +"û +"û +"ü +"ü +"ý +"ý +"þ +"þ +"ÿ +"ÿ +"€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢****** * +* *  * + * * * **************** *!*"* #*!$*"%*#&*$'*%(*&)*'**(+*),**-*+.*,/*-/*.0*/1*02*13*24*35*46*57*68*79*8:*9;*:<*;=*<>*=?*>@*?A*@B*AC*BD*CE*DF*EG*FH*GI*HJ*IK*JL*KM*LN*MO*NP*OQ*PR*QP*RS*ST*TU*UV*VW*WX*XY*YZ*Z[*[\*\]*]^*^_*_`*`a*ab*bc*cd*de*ef*fg*gh*hi*ij*jk*kl*lm*mn*no*op*pq*qr*rs*st*tu*uu*vv*ww*xx*yy*zz*{{*||*}}*~~**€€**‚‚*ƒƒ*„„*……*††*‡‡*ˆˆ*‰‰*ŠŠ*‹‹*ŒŒ**ŽŽ***‘‘*’’*““*””*•”*–•*—–*˜—*™˜*š™*›š*œ›*œ*ž*Ÿž* Ÿ*¡ *¢¡*£C*¤¢*¥£*¦¤*§¥*¨¦*©§*ª¨*«©*¬ª*­«*®¬*¯­*°®*±¯*²¯*³°*´°*µ±*¶²*·³*¸´*¹µ*º¶*»·*¼¸*½¹*¾º*¿»*À»*Á¼*½*þ*Ä¿*ÅÀ*ÆÁ*ÇÂ*ÈÃ*ÉÄ*ÊÅ*ËÆ*ÌÇ*ÍÈ*ÎÉ*ÏÊ*ÐË*ÑË*ÒÌ*ÓÍ*ÔÎ*ÕÏ*ÖÐ*×Ñ*ØÒ*ÙÓ*ÚÔ*ÛÕ*ÜÖ*ÝÐ*ÞÑ*ß×*àØ*áÙ*âÚ*ãÛ*äÜ*åÝ*æÞ*çß*èà*éá*êâ*ëâ*ìã*íã*îä*ïå*ðæ*ñç*òè*óé*ôé*õê*öë*÷ë*øë*ùì*úí*ûî*üï*ýð*þñ*ÿò*€ó*ô*‚õ*ƒõ*„ö*…÷*†ø*‡ù*ˆú*‰û*Šü*‹ý*Œþ*ÿ*Ž€*€**‘‚*’ƒ*“ƒ*”„*•…*–†*—‡*˜ˆ*™‰*šŠ*›‹*œŒ**žŽ*Ÿ* *¡‘*¢‘*£’*¤“*¥”*¦•*§–*¨—*©˜*ª™*«š*¬›*­œ*®*¯ž*°Ÿ*± *²¡*³¢*´£*µ£*¶¤*·¤*¸¥*¹¦*º§*»¨*¼©*½ª*¾«*¿¬*À­*Á®*®*ï*ÄÐ*ÅÑ*Æ°*Ç°*Ȫ*ɱ*ʲ*˳*Ì´*͵*ζ*Ï·*и*ѹ*Òº*Ó»*Ô¼*Õ½*Ö¾*׿*ØÀ*ÙÀ*ÚÁ*ÛÂ*ÜÃ*ÝÄ*ÞÅ*ßÆ*àÇ*áÈ*âÉ*ãÊ*äË*åË*æÌ*çÍ*èÎ*éÏ*êÐ*ëÑ*ìÒ*íÓ*îÔ*ïÕ*ðÖ*ñ×*òØ*óÙ*ôÚ*õÛ*öÜ*÷Ý*øÞ*ùß*úà*ûá*üâ*ýã*þä*ÿä*€å*æ*‚ç*ƒè*„é*…ê*†ë*‡ì*ˆí*‰î*Šï*‹ð*Œñ*ò*ŽC*ó*ô*‘õ*’ö*“÷*”ø*•ù*–ú*—û*˜ü*™ý*šý*›þ*œÿ*€*ž*Ÿ‚* Ž*¡ƒ*¢„*£…*¤†*¥‡*¦ˆ*§‰*¨Š*©‹*ªŒ*«*¬Ž*­*®*¯‘*°’*±“*²“*³”*´•*µ–*¶—*·˜*¸™*¹š*º›*»œ*¼*½ž*¾Ÿ*¿ *À¡*Á¢*£*ä*ÄÇ*ÅÈ*Æ¥*Ǧ*ȧ*ɨ*Ê©*Ë©*̪*Í«*ά*Ï­*Ю*ѯ*Ò°*Ó±*Ô²*Õ³*Ö´*×µ*ض*Ù·*Ú¸*Û¹*ܺ*Ý»*Þ¼*ß½*à¾*á¿*â¿*ãÀ*äÁ*åÂ*æÃ*çÄ*èÅ*éÆ*êÇ*ëÇ*ìÈ*íÉ*îÊ*ïË*ðÌ*ñÍ*òÎ*óÏ*ôÐ*õÑ*öÒ*÷Ó*øÔ*ùÕ*úÖ*û×*üØ*ýÙ*þÚ*ÿÛ*€Ü*Ý*‚Þ*ƒß*„ß*…à*†á*‡â*ˆã*‰ä*Šå*‹æ*Œç*è*Žé*é*ê*‘ë*’ì*“í*”î*•ï*–ð*—ñ*˜ò*™ó*šô*›õ*œö*÷*žø*Ÿù* ú*¡û*¢ü*£ý*¤þ*¥ÿ*¦€*§*¨‚*©ƒ*ª„*«…*¬†*­‡*®ˆ*¯‰*°Š*±‹*²Œ*³*´*µŽ*¶*·*¸‘*¹’*º“*»”*¼•*½–*¾—*¿0*À˜*Á™*™*Ú*Ä›*Åœ*Æ*Ç*Èž*ÉŽ*ÊŸ*Ë *Ì¡*Í2*Î3*Ï3*Т*Ñ£*Ò¤*Ó2*Ô3*ÕÇ*ÖÈ*×0*Ø¥*Ù¥*Ú¦*Û¦*ܧ*ݨ*Þ©*ߪ*à«*á¬*â­*ã®*ä¯*å°*æ±*ç²*è³*é´*êµ*ë…*ì¶*í·*î¸*ï¹*ðº*ñ»*ò¼*ó½*ô¾*õ¿*öÀ*÷Á*øÂ*ùÃ*úÄ*ûÅ*üÆ*ýÇ*þÈ*ÿÉ*€Ê*Ë*‚Ì*ƒÍ*„Î*…Ï*†Ð*‡Ñ*ˆÒ*‰Ó*ŠÓ*‹Ô*ŒÕ*Ö*Ž×*Ø*Ù*‘Ú*’Û*“Ü*”Ý*•Þ*–Þ*—ß*˜à*™à*šá*›â*œâ*ã*žã*Ÿä* å*¡æ*¢ç*£è*¤é*¥ê*¦ë*§ì*¨í*©¾*ª¿*«î*¬ï*­ð*®ñ*¯ò*°ó*±ô*²õ*³ö*´÷*µø*¶ù*·ú*¸û*¹ü*ºý*»þ*¼ÿ*½€*¾*¿‚*Àƒ*Á„*Â…*Æ*ć*ň*Ɖ*ÇŠ*È‹*ÉŒ*Ê*ËŽ*Ì*Í*Α*Ï’*Г*Ñ”*Ò•*Ó–*Ô—*Õ˜*Ö™*ך*Ø›*Ù›*Úœ*Û*Üž*ÝŸ*Þ *ß¡*à¡*á¢*â£*ã¤*ä¥*å¦*æ§*ç¨*è©*éª*ê«*ë¬*ì­*í­*î®*ï¯*ð°*ñ±*ò²*ó³*ô´*õµ*öµ*÷¶*ø·*ù¸*ú¹*ûº*ü»*ý¼*þ½*ÿ¾*€¿*À*‚Á*ƒÂ*„Ã*…Ä*†Ä*‡Å*ˆÆ*‰Ç*ŠÈ*‹É*ŒÊ*Ë*ŽÌ*Í*Î*‘Ï*’Ð*“Ñ*”Ò*•Ò*–Ó*—Ô*˜Õ*™Ö*š×*›Ø*œÙ*Ú*žÛ*ŸÜ* Ý*¡Þ*¢ß*£à*¤á*¥â*¦ã*§ä*¨å*©æ*ªç*«è*¬é*­ê*®ë*¯ì*°í*±î*²ï*³ð*´ñ*µò*¶ó*·ô*¸õ*¹ö*º÷*»ø*¼ù*½ú*¾û*¿ü*Àý*Áþ*Âÿ*À*Ä€*Ŷ*Æ*Ç‚*È‚*Ƀ*Ê„*Ë…*̆*͇*Έ*ψ*Ј*щ*Ò´*ÓŠ*Ô‹*ÕŒ*Ö*׎*Ø*Ù*Ú‘*Û’*Ü“*Ý”*Þ•*ß•*à–*á—*â˜*ã™*äš*å›*æœ*ç*èž*éŸ*ê *ë¡*ì¢*í£*î¤*ïÌ*ðÍ*ñ¥*ò¦*ó§*ô¨*õ©*öª*÷«*ø¬*ù­*úª*û®*ü¯*ý°*þ°*ÿ±*€²*³*‚´*ƒµ*„µ*…¶*†¶*‡·*ˆ¸*‰¹*Šº*‹»*Œ»*¼*Ž½*¾*¿*‘À*’Á*“Â*”Â*•Ã*–Ä*—Å*˜Æ*™Ç*šÈ*›É*œÊ*Ë*žÌ*ŸÍ* Î*¡Ï*¢Ð*£Ñ*¤Ò*¥Ó*¦Ô*§Õ*¨Ö*©×*ªØ*«Ù*¬Ú*­Û*®Ü*¯Ý*°Þ*±ß*²à*³á*´â*µâ*¶ã*·ä*¸å*¹æ*ºç*»è*¼é*½ê*¾ë*¿ì*Àí*Áî*Âï*Ãð*Äñ*Åò*Æó*Çô*Èõ*Éö*Ê÷*Ëø*Ìù*Íú*Îû*Ïü*Ðý*Ñþ*Òÿ*Ó€*Ô*Õ‚*Öƒ*ׄ*Ø…*Ù†*Ú‡*Ûˆ*܉*ÝŠ*Þ‹*ߌ*à*áŽ*â*ã*ä‘*å’*æ“*ç”*è•*é–*ê—*ë˜*ì™*íš*î›*ïµ*ðœ*ñœ*ò*óž*ôŸ*õ *öž*÷Ÿ*ø *ù¡*ú¢*û£*ü¤*ý¥*þ¦*ÿ§*€¿*¿*‚¨*ƒ©*„ª*…«*†å*‡¬*ˆ­*‰®*Š¯*‹°*Œ±*²*Ž²*³*´*‘µ*’¶*“·*”¸*•¹*–º*—»*˜¼*™½*š¾*›¿*œÀ*Á*žÂ*ŸÃ* Ä*¡Å*¢Æ*£Ç*¤È*¥É*¦Ê*§Ë*¨Ì*©Í*ªÍ*«Î*¬Ï*­Ð*®Ñ*¯Ò*°Ó*±Ô*²Õ*³Ö*´×*µØ*¶Ù*·Ú*¸Û*¹Ü*ºÝ*»Ý*¼Þ*½ß*¾ß*¿à*Àá*Áâ*Âã*Ãä*Äå*Åæ*Æç*Çè*Èé*Éê*Êë*Ëì*Ìì*Íì*Îí*Ïî*Ðï*Ñð*Òñ*Óò*Ôó*Õô*Öõ*×ö*Ø÷*Ùø*Úù*Ûú*Üû*Ýü*Þü*ßý*àþ*áÿ*â€*ã*ä‚*åƒ*æ„*ç…*è†*é‡*êˆ*ëˆ*ì‰*íŠ*îŠ*ïŠ*ð‹*ñŒ*ò*óŽ*ô*õ*ö‘*÷’*ø“*ù”*ú•*û–*ü—*ý˜*þ™*ÿš*€ ›* œ*‚ *ƒ ž*„ Ÿ*…  *† ¡*‡ ¢*ˆ £*‰ ¤*Š ¥*‹ ¦*Œ §* ¨*Ž ¨* ©* ž*‘ Ÿ*’ ©*“ ª*” ª*• «*– ¬*— ­*˜ ®*™ ¯*š °*› ±*œ ²* ³*ž ´*Ÿ µ*  ¶*¡ ·*¢ ¸*£ ¹*¤ º*¥ »*¦ ¼*§ ½*¨ ¾*© ¿*ª À*« À*¬ Á*­ Â*® Ã*¯ Ä*° Å*± Æ*² Ç*³ È*´ É*µ Ê*¶ Ë*· Ì*¸ Í*¹ Î*º Ï*» Ð*¼ Ñ*½ 0*¾ Ò*¿ Ó*À Ô*Á Õ* Ö*à ×*Ä Ø*Å Ù*Æ Ú*Ç Û*È Ü*É Ý*Ê Þ*Ë ß*Ì à*Í á*Î â*Ï ã*Ð ä*Ñ å*Ò æ*Ó ç*Ô è*Õ é*Ö ê*× ë*Ø ì*Ù í*Ú î*Û ï*Ü ð*Ý ñ*Þ ñ*ß ò*à ó*á ô*â õ*ã ö*ä ÷*å ø*æ ù*ç ú*è û*é ü*ê ý*ë þ*ì ÿ*í € *î  *ï ‚ *ð ƒ *ñ „ *ò … *ó † *ô ‡ *õ ˆ *ö ‰ *÷ Š *ø ‹ *ù Œ *ú  *û  *ü Ž *ý  *þ  *ÿ ‘ *€ +’ * +“ *‚ +” *ƒ +• *„ +– *… +— *† +˜ *‡ +™ *ˆ +š *‰ +› *Š +› *‹ +œ *Œ + * +ž *Ž +Ÿ * +  * +¡ *‘ +¢ *’ +£ *“ +¤ *” +¥ *• +¦ *– +§ *— +¨ *˜ +© *™ +ª *š +« *› +¬ *œ +­ * +Û*ž +® *Ÿ +¯ *  +° *¡ +± *¢ +² *£ +³ *¤ +´ *¥ +µ *¦ +¶ *§ +· *¨ +¸ *© +¹ *ª +¹ *« +º *¬ +» *­ +¼ *® +½ *¯ +¾ *° +¿ *± +À *² +Á *³ +Á *´ + *µ +à *¶ +Ä *· +Å *¸ +Æ *¹ +Ç *º +È *» +É *¼ +Ê *½ +Ë *¾ +Ì *¿ +å*À +Í *Á +Î * +Ï *à +Ð *Ä +Ñ *Å +Ò *Æ +Ó *Ç +¦*È +Ô *É +Õ *Ê +Õ *Ë +Ö *Ì +× *Í +Ø *Î +Ù *Ï +Ú *Ð +Û *Ñ +Û *Ò +Ü *Ó +Ý *Ô +Ý *Õ +Þ *Ö +ß *× +à *Ø +á *Ù +â *Ú +ã *Û +ä *Ü +å *Ý +æ *Þ +ç *ß +è *à +é *á +ê *â +ë *ã +ì *ä +í *å +î *æ +ï *ç +ð *è +ñ *é +3*ê +2*ë +3*ì +3*í +ò *î +ó *ï +ô *ð +ó *ñ +õ *ò +ö *ó +÷ *ô +ÿ*õ +ø *ö +ù *÷ +ú *ø +û *ù +ü *ú +ý *û +þ *ü +þ *ý +ÿ *þ +€ +*ÿ + +*€ ‚ +* ƒ +*‚ „ +*ƒ … +*„ † +*… ‡ +*† ˆ +*‡ ‰ +*ˆ Š +*‰ ‹ +*Š Œ +*‹  +*Œ Ž +*  +*Ž  +* ‘ +* ’ +*‘ “ +*’ ” +*“ • +*” – +*• — +*– ˜ +*— Ð*˜ Ñ*™ ™ +*š š +*› › +*œ œ +*  +*ž ž +*Ÿ Ÿ +*    +*¡ ¡ +*¢ ¢ +*£ £ +*¤ ¤ +*¥ ¥ +*¦ ¦ +*§ § +*¨ ¨ +*© © +*ª ª +*« « +*¬ ¬ +*­ ­ +*® « +*¯ ® +*° ¯ +*± ° +*² ± +*³ ² +*´ ³ +*µ ´ +*¶ µ +*· ¶ +*¸ · +*¹ ¸ +*º ¹ +*» º +*¼ » +*½ ¼ +*¾ ½ +*¿ ¾ +*À ¿ +*Á À +* Á +*à  +*Ä  +*Å à +*Æ Ä +*Ç Å +*È Æ +*É å*Ê Ç +*Ë È +*Ì É +*Í Ê +*Î Ë +*Ï Ì +*Ð Í +*Ñ Î +*Ò Ï +*Ó Ð +*Ô Ð +*Õ Ð +*Ö Ñ +*× Ò +*Ø Ó +*Ù Ô +*Ú Õ +*Û Ö +*Ü × +*Ý Ø +*Þ Ù +*ß Ú +*à Û +*á Ü +*â Ý +*ã Þ +*ä ß +*å à +*æ á +*ç â +*è ã +*é ä +*ê å +*ë æ +*ì ç +*í è +*î é +*ï ê +*ð ë +*ñ ì +*ò í +*ó î +*ô ï +*õ ï +*ö ð +*÷ ñ +*ø ò +*ù ò +*ú ó +*û ô +*ü õ +*ý ö +*þ ÷ +*ÿ ø +*€ ù +* ú +*‚ û +*ƒ ü +*„ ý +*… þ +*† ÿ +*‡ € *ˆ  *‰ ‚ *Š ƒ *‹ „ *Œ … * … *Ž † * ‡ * ˆ *‘ ‰ *’ Š *“ ‹ *” Œ *•  *– Ž *—  *˜  *™  *š ‘ *› ’ *œ “ * ” *ž • *Ÿ – *  — *¡ ˜ *¢ ™ *£ š *¤ › *¥ œ *¦  *§ ž *¨ Ÿ *©   *ª ¡ *« ¢ *¬ £ *­ ¤ *® ¥ *¯ ¦ *° § *± ¨ *² © *³ ª *´ « *µ ¬ *¶ ­ *· ® *¸ ¯ *¹ ° *º ± *» ² *¼ ³ *½ ´ *¾ µ *¿ ¶ *À · *Á ¸ * ¹ *à º *Ä » *Å » *Æ ¼ *Ç ½ *È ¾ *É ¿ *Ê À *Ë Á *Ì  *Í à *Î Ä *Ï Å *Ð Æ *Ñ Ç *Ò È *Ó É *Ô Ê *Õ Ë *Ö Ì *× Í *Ø Î *Ù Ï *Ú Ð *Û Ñ *Ü Ò *Ý Ó *Þ Ô *ß Õ *à Ö *á × *â Ø *ã Ù *ä Ú *å Ú *æ Û *ç Ü *è Ý *é Þ *ê ß *ë à *ì á *í â *î ã *ï ä *ð å *ñ æ *ò æ *ó ç *ô è *õ é *ö ê *÷ ë *ø ì *ù ì *ú í *û î *ü ï *ý ð *þ ñ *ÿ ò *€ ó * ô *‚ õ *ƒ ö *„ ÷ *… ø *† ù *‡ ú *ˆ û *‰ ü *Š ý *‹ þ *Œ ÿ * € *Ž € *  * ‚ *‘ ƒ *’  *“ ‚ *” ƒ *• „ *– … *— † *˜ ‡ *™ ˆ *š ‰ *› Š *œ ‹ * ‹ *ž Œ *Ÿ  *   *¡ Ž *¢  *£  *¤ ‘ *¥ ’ *¦ “ *§ ” *¨ • *© – *ª — *« ˜ *¬ ™ *­ ™ *® š *¯ › *° œ *±  *² ž *³ Ÿ *´   *µ   *¶ ¡ *· ¢ *¸ £ *¹ ¤ *º ¥ *» ¦ *¼ § *½ ¨ *¾ © *¿ ª *À « *Á ¬ * ­ *à ® *Ä ¯ *Å ° *Æ ± *Ç ² *È ³ *É ´ *Ê µ *Ë ¶ *Ì · *Í ¸ *Î ¹ *Ï ¿*Ð º *Ñ » *Ò ¼ *Ó ½ *Ô ¾ *Õ ¿ *Ö À *× Á *Ø  *Ù à *Ú Ä *Û Å *Ü Æ *Ý Æ *Þ Ç *ß È *à É *á É *â Ê *ã Ë *ä Ì *å Í *æ Î *ç Ï *è Î *é Ð *ê Ñ *ë Ò *ì Ó *í Ô *î Õ *ï Õ *ð Ö *ñ × *ò Ø *ó Ù *ô Ú *õ Û *ö Ü *÷ Ý *ø Þ *ù ß *ú à *û á *ü Î *ý â *þ â *ÿ ã *€ä *ä *‚å *ƒæ *„ç *…è *†é *‡ê *ˆë *‰ì *Ší *‹î *Œï *ð *Žñ *ò *ó *‘ô *’õ *“ö *”÷ *•ø *–ù *—ú *˜û *™ü *šý *›þ *œÿ *€ *ž *Ÿ‚ * ƒ *¡„ *¢… 22alloc_in_new_tlab_objects2count2alloc_in_new_tlab_bytes2bytes2/scala/collection/immutable/VectorBuilder.result2+scala/collection/TraversableLike.filterImpl2,scala/collection/TraversableLike.filterImpl$2/scala/collection/AbstractTraversable.filterImpl2'scala/collection/TraversableLike.filter2(scala/collection/TraversableLike.filter$2+scala/collection/AbstractTraversable.filter2Mcom/wixpress/framework/aspects/response/AggregatedResponseAspects.mergeRemote2Ocom/wixpress/framework/aspects/response/AtomicResponseAspects.$anonfun$append$12[com/wixpress/framework/aspects/response/AtomicResponseAspects$$Lambda$2425/1711342280.apply28java/util/concurrent/atomic/AtomicReference.updateAndGet2Dcom/wixpress/framework/aspects/response/AtomicResponseAspects.append2`com/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.$anonfun$onClose$22hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.$anonfun$onClose$2$adapted2jcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener$$Lambda$846/1409886222.apply2scala/Option.foreach2Ucom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.onClose23io/grpc/PartialForwardingClientCallListener.onClose2,io/grpc/ForwardingClientCallListener.onClose2Oio/grpc/ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose2?com/wixpress/grpc/ClientDetailsReporter$$anon$1$$anon$2.onClose2Gcom/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1$$anon$2.onClose2?com/wixpress/grpc/ClientMetricsReporter$$anon$1$$anon$2.onClose2Cio/grpc/census/CensusStatsModule$StatsClientInterceptor$1$1.onClose2Gio/grpc/census/CensusTracingModule$TracingClientInterceptor$1$1.onClose2-io/grpc/internal/ClientCallImpl.closeObserver2*io/grpc/internal/ClientCallImpl.access$3002Rio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal2Sio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext2$io/grpc/internal/ContextRunnable.run2(io/grpc/internal/SerializingExecutor.run21java/util/concurrent/ThreadPoolExecutor.runWorker22java/util/concurrent/ThreadPoolExecutor$Worker.run2java/lang/Thread.run20io/opencensus/implcore/stats/StatsManager.record22io/opencensus/implcore/stats/MeasureMapImpl.record2;io/grpc/census/CensusStatsModule$ClientCallTracer.callEnded2java/util/HashMap.resize2java/util/HashMap.putVal2java/util/HashMap.putMapEntries2java/util/HashMap.2-io/opencensus/implcore/tags/TagMapImpl.23io/opencensus/implcore/tags/TagMapBuilderImpl.build2java/util/Arrays.copyOf26java/lang/AbstractStringBuilder.ensureCapacityInternal2&java/lang/AbstractStringBuilder.append2java/lang/StringBuilder.append2Rcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.$anonfun$name$12_com/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter$$Lambda$842/2093743533.apply2/scala/collection/TraversableLike.$anonfun$map$12=scala/collection/TraversableLike$$Lambda$142/1105090408.apply2!scala/collection/Iterator.foreach2"scala/collection/Iterator.foreach$2)scala/collection/AbstractIterator.foreach2%scala/collection/IterableLike.foreach2&scala/collection/IterableLike.foreach$2)scala/collection/AbstractIterable.foreach2$scala/collection/TraversableLike.map2%scala/collection/TraversableLike.map$2(scala/collection/AbstractTraversable.map2Gcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.name2Icom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.handle2Lcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.addMetric2>com/wixpress/grpc/MetricsNotifierOperations.registerRpcSuccess2com/wixpress/common/devices/overrides/Overrides.getOverrideFor25com/wixpress/common/devices/FileOverrides.overrideFor2;com/wixpress/common/devices/FileOverrides.$anonfun$detect$42Gcom/wixpress/common/devices/FileOverrides$$Lambda$2300/2051733197.apply2scala/Option.flatMap20com/wixpress/common/devices/FileOverrides.detect24com/wixpress/common/devices/ReportingDetector.detect2;com/wixpress/monitoring/panorama/parse/DetectorProxy.detect2+com/wixpress/common/devices/Detector.detect2,com/wixpress/common/devices/Detector.detect$2Acom/wixpress/monitoring/panorama/v1/LogController.$anonfun$_uaF$22Ncom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2294/427257097.apply2)scala/concurrent/Future$.$anonfun$apply$125scala/concurrent/Future$$$Lambda$608/1190608890.apply2!scala/util/Success.$anonfun$map$12scala/util/Success.map2&scala/concurrent/Future.$anonfun$map$124scala/concurrent/Future$$Lambda$578/1947034456.apply2+scala/concurrent/impl/Promise.liftedTree1$122scala/concurrent/impl/Promise.$anonfun$transform$12:scala/concurrent/impl/Promise$$Lambda$579/1792749190.apply2*scala/concurrent/impl/CallbackRunnable.run2Icom/codahale/metrics/InstrumentedExecutorService$InstrumentedRunnable.run2Gcom/codahale/metrics/InstrumentedThreadFactory$InstrumentedRunnable.run28org/jose4j/json/internal/json_simple/parser/Yylex.2=org/jose4j/json/internal/json_simple/parser/JSONParser.2"org/jose4j/json/JsonUtil.parseJson2'org/jose4j/jwx/Headers.setEncodedHeader20org/jose4j/jwx/JsonWebStructure.setEncodedHeader22org/jose4j/jwt/JwtClaims.parse2Qorg/jose4j/base64url/internal/apache/commons/codec/binary/BaseNCodec.resizeBuffer2Uorg/jose4j/base64url/internal/apache/commons/codec/binary/BaseNCodec.ensureBufferSize2Gorg/jose4j/base64url/internal/apache/commons/codec/binary/Base64.encode2Korg/jose4j/base64url/internal/apache/commons/codec/binary/BaseNCodec.encode2Sorg/jose4j/base64url/internal/apache/commons/codec/binary/BaseNCodec.encodeToString2.org/jose4j/base64url/Base64Url.base64UrlEncode2"java/lang/StringLatin1.toLowerCase2java/lang/String.toLowerCase2ncom/wixpress/framework/aspects/HttpAspectsTransport$$anon$1$$anonfun$$nestedInanonfun$toLookup$1$1.applyOrElse21scala/collection/AbstractTraversable.collectFirst2Ocom/wixpress/framework/aspects/HttpAspectsTransport$$anon$1.$anonfun$toLookup$12Wcom/wixpress/framework/aspects/HttpAspectsTransport$$anon$1$$Lambda$1073/79486225.apply2=com/wixpress/framework/aspects/AspectFilter.$anonfun$filter$32Hcom/wixpress/framework/aspects/AspectFilter$$Lambda$1909/674309234.apply2)scala/collection/immutable/Stream.flatMap2:scala/collection/immutable/Stream$StreamWithFilter.flatMap22com/wixpress/framework/aspects/AspectFilter.filter28com/wixpress/framework/aspects/HttpAspectsTransport.read2Bcom/wixpress/grpc/MetricsNotifierOperations.registerAutomationCall27com/wixpress/grpc/rest/middlewares/Report$$anon$1.apply28com/google/common/util/concurrent/DirectExecutor.execute22scala/concurrent/impl/ExecutionContextImpl.execute27scala/concurrent/impl/CallbackRunnable.executeWithValue2Cscala/concurrent/impl/Promise$DefaultPromise.$anonfun$tryComplete$12Kscala/concurrent/impl/Promise$DefaultPromise.$anonfun$tryComplete$1$adapted28scala/concurrent/impl/Promise$DefaultPromise.tryComplete2!scala/concurrent/Promise.complete2"scala/concurrent/Promise.complete$25scala/concurrent/impl/Promise$DefaultPromise.complete2Jio/opencensus/trace/export/SampledSpanStore$LatencyBucketBoundaries.values2eio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.getLatencyBucket2hio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.considerForSampling2`io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.access$11002Uio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.considerForSampling2Eio/opencensus/implcore/trace/StartEndHandlerImpl$SpanEndEvent.process2Mio/opencensus/impl/internal/DisruptorEventQueue$DisruptorEventHandler.onEvent2*com/lmax/disruptor/BatchEventProcessor.run2java/util/ArrayList.spliterator2java/util/Collection.stream29java/util/stream/MatchOps$$Lambda$333/27818833.get$Lambda27java/lang/invoke/DirectMethodHandle$Holder.invokeStatic23java/lang/invoke/Invokers$Holder.linkToTargetMethod2Bcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$_logF$32Jcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$_logF$3$adapted2Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$3151/1348736112.apply2'scala/collection/immutable/List.foreach2Vcom/wixpress/common/devices/overrides/DeviceOverride$$Lambda$2306/804483753.get$Lambda2java/math/BigInteger.oddModPow2java/math/BigInteger.modPow2sun/security/rsa/RSACore.crypt2sun/security/rsa/RSACore.rsa2*sun/security/rsa/RSASignature.engineVerify2-java/security/Signature$Delegate.engineVerify2java/security/Signature.verify25org/jose4j/jws/BaseSignatureAlgorithm.verifySignature2/org/jose4j/jws/JsonWebSignature.verifySignature22org/jose4j/jwt/consumer/JwtConsumer.processContext2Dcom/wix/core/services/identification2/IdentityResponse$.messageReads2scalapb/json4s/Parser.fromJson2Acom/wixpress/grpc/jackson/ProtobufMessageDeserializer.deserialize2com/wixpress/grpc/MetricsNotifierOperations$.restCallerDetails2Fcom/wixpress/grpc/MetricsNotifierOperations.registerRestCallerArtifact2Bcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$32Ncom/wixpress/framework/aspects/RequestParameters$$$Lambda$2106/342212121.apply2/scala/collection/mutable/ArrayOps$ofRef.foreach2+scala/collection/mutable/ArrayOps$ofRef.map2Bcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$22Jcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$2$adapted2Ocom/wixpress/framework/aspects/RequestParameters$$$Lambda$1904/1039138940.apply27com/wixpress/framework/aspects/RequestParameters$.apply2>com/fasterxml/jackson/databind/util/TokenBuffer$Segment.26com/fasterxml/jackson/databind/util/TokenBuffer.27com/fasterxml/jackson/databind/ObjectMapper.valueToTree2)org/json4s/jackson/JsonMethods.asJsonNode2*org/json4s/jackson/JsonMethods.asJsonNode$2*org/json4s/jackson/JsonMethods$.asJsonNode2‡com/wixpress/grpc/jackson/ProtobufMessageObjectMapperModule.com$wixpress$grpc$jackson$ProtobufMessageObjectMapperModule$$$anonfun$new$12Pcom/wixpress/grpc/jackson/ProtobufMessageObjectMapperModule$$anonfun$1.serialize2Vcom/wixpress/framework/oxm/jackson/modules/OptionSerializerCopiedFromJackson.serialize2Fcom/fasterxml/jackson/databind/ser/BeanPropertyWriter.serializeAsField2Pcom/wixpress/framework/oxm/jackson/modules/OptionPropertyWriter.serializeAsField2Icom/fasterxml/jackson/databind/ser/std/BeanSerializerBase.serializeFields2;com/fasterxml/jackson/databind/ser/BeanSerializer.serialize2Gcom/fasterxml/jackson/databind/ser/DefaultSerializerProvider._serialize2Kcom/fasterxml/jackson/databind/ser/DefaultSerializerProvider.serializeValue2>com/fasterxml/jackson/databind/ObjectWriter$Prefetch.serialize2@com/fasterxml/jackson/databind/ObjectWriter._configAndWriteValue2>com/fasterxml/jackson/databind/ObjectWriter.writeValueAsString2Ocom/wixpress/monitoring/panorama/ser/PanoramaLogMessageJsonSerializer.serialize2Dorg/json4s/jackson/JValueSerializer$$Lambda$964/836954698.get$Lambda2-org/json4s/jackson/JValueSerializer.serialize26com/fasterxml/jackson/databind/ObjectMapper.writeValue2+scala/collection/immutable/List$.newBuilder2Bscala/collection/generic/GenericTraversableTemplate.genericBuilder2Cscala/collection/generic/GenericTraversableTemplate.genericBuilder$23scala/collection/AbstractTraversable.genericBuilder2;scala/collection/generic/GenericTraversableTemplate.flatten22java/lang/Exception.2-java/security/GeneralSecurityException.2'javax/crypto/BadPaddingException.2$sun/security/rsa/RSAPadding.unpadV152!sun/security/rsa/RSAPadding.unpad2java/util/Arrays.copyOfRange2 java/lang/StringLatin1.newString2java/lang/StringLatin1.strip2java/lang/String.strip2*scala/collection/immutable/Map$.newBuilder2java/lang/Integer.valueOf2+org/udger/parser/UdgerParser.clientDetector2Hcom/wixpress/framework/aspects/response/AggregatedResponseAspects.aspect2Acom/wixpress/framework/aspects/response/AtomicResponseAspects.get2?com/wixpress/grpc/rest/ResponseAspects$.$anonfun$petriCookies$22Ecom/wixpress/grpc/rest/ResponseAspects$$$Lambda$2002/1128976738.apply24com/wixpress/grpc/rest/ResponseAspects$.petriCookies21com/wixpress/grpc/rest/ResponseAspects$.mandatory2\com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$responseAspects$12dcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$responseAspects$1$adapted2_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1936/1321531833.apply29com/wixpress/grpc/rest/backends/CallScopeBackend$.segment2”com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.com$wixpress$grpc$rest$backends$CallScopeBackend$CallScopeHandler$$responseAspects2Ocom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$anon$1.apply2'scala/collection/LinearSeqLike.iterator2(scala/collection/LinearSeqLike.iterator$2(scala/collection/immutable/List.iterator2)scala/collection/IterableLike.copyToArray2*scala/collection/IterableLike.copyToArray$2-scala/collection/AbstractIterable.copyToArray2,scala/collection/TraversableOnce.copyToArray2-scala/collection/TraversableOnce.copyToArray$20scala/collection/AbstractTraversable.copyToArray2(scala/collection/TraversableOnce.toArray2)scala/collection/TraversableOnce.toArray$2,scala/collection/AbstractTraversable.toArray2Dcom/wixpress/framework/monitoring/metering/MetricsObserver.addMetric2Ecom/wixpress/framework/monitoring/metering/MetricsObserver.addMetric$21org/jose4j/jws/JsonWebSignature.setEncodedPayload2 java/lang/StringBuilder.toString2Mcom/wixpress/grpc/MetricsNotifierOperations.$anonfun$registerCallerArtifact$22Ucom/wixpress/grpc/MetricsNotifierOperations.$anonfun$registerCallerArtifact$2$adapted2Hcom/wixpress/grpc/MetricsNotifierOperations$$Lambda$2065/969108339.apply2Bcom/wixpress/grpc/MetricsNotifierOperations.registerCallerArtifact2%org/jose4j/base64url/Base64Url.encode2Ncom/wixpress/framework/aspects/AspectFilter$$Lambda$1910/1522445774.get$Lambda27org/jose4j/json/internal/json_simple/parser/Yylex.yylex2@org/jose4j/json/internal/json_simple/parser/JSONParser.nextToken22(sun/security/provider/SHA2$SHA256.2?jdk/internal/reflect/GeneratedConstructorAccessor14.newInstance2Bjdk/internal/reflect/DelegatingConstructorAccessorImpl.newInstance2)java/lang/reflect/Constructor.newInstance2&java/security/Provider.newInstanceUtil2*java/security/Provider$Service.newInstance2(sun/security/jca/GetInstance.getInstance2java/security/Security.getImpl2'java/security/MessageDigest.getInstance2$sun/security/rsa/RSASignature.22sun/security/rsa/RSASignature$SHA256withRSA.2?jdk/internal/reflect/GeneratedConstructorAccessor19.newInstance2,java/security/Signature$Delegate.newInstance2/java/security/Signature$Delegate.chooseProvider21java/security/Signature$Delegate.engineInitVerify2"java/security/Signature.initVerify23org/jose4j/jws/BaseSignatureAlgorithm.initForVerify2scala/Option.map2Acom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$decoder$32Lcom/wixpress/petri/asp/PetriExperimentsAspect$$$Lambda$1998/2096636247.apply2scala/Option.orElse2Acom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$decoder$12Icom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$decoder$1$adapted2Mcom/wixpress/petri/asp/PetriExperimentsAspect$$$Lambda$1990/1246723879.decode2java/util/LinkedHashMap.newNode2java/util/HashMap.put26com/fasterxml/jackson/databind/node/ObjectNode.replace2Ocom/fasterxml/jackson/databind/deser/std/BaseNodeDeserializer.deserializeObject2Icom/fasterxml/jackson/databind/deser/std/JsonNodeDeserializer.deserialize26com/fasterxml/jackson/databind/ObjectMapper._readValue24com/fasterxml/jackson/databind/ObjectMapper.readTree25com/fasterxml/jackson/core/JsonParser.readValueAsTree2com/codahale/metrics/Timer.time2Lcom/codahale/metrics/InstrumentedExecutorService$InstrumentedRunnable.28com/codahale/metrics/InstrumentedExecutorService.execute2:scala/concurrent/impl/ExecutionContextImpl$$anon$4.execute29com/wixpress/framework/loom/LoomExecutors$$anon$4.execute25com/fasterxml/jackson/core/JsonFactory._createContext26com/fasterxml/jackson/core/JsonFactory.createGenerator2%sun/security/util/DerInputStream.init2'sun/security/util/DerInputStream.2-sun/security/rsa/RSASignature.decodeSignature2java/io/InputStream.readNBytes2+sun/security/util/IOUtils.readExactlyNBytes2sun/security/util/DerValue.init2!sun/security/util/DerValue.2+sun/security/util/DerInputStream.readVector2,sun/security/util/DerInputStream.getSequence2!java/lang/StringCoding.decodeUTF82java/lang/StringCoding.decode2java/lang/String.2$org/jose4j/lang/StringUtil.newString2(org/jose4j/lang/StringUtil.newStringUtf82acom/wixpress/monitoring/panorama/v1/LogController.emitPanoramaLogLineWrittenIntoBufferTotalMetric2?com/wixpress/framework/aspects/AspectFilter.$anonfun$toLookup$22Hcom/wixpress/framework/aspects/AspectFilter$$Lambda$1075/342997389.apply2#scala/collection/immutable/List.map24com/wixpress/framework/aspects/AspectFilter.toLookup2bcom/wixpress/framework/aspects/HttpAspectsTransport$$anonfun$$nestedInanonfun$read$1$1.applyOrElse20scala/PartialFunction.$anonfun$runWith$1$adapted22scala/PartialFunction$$Lambda$538/1967118241.apply2+scala/collection/immutable/Map$Map2.foreach2(scala/collection/TraversableLike.collect2)scala/collection/TraversableLike.collect$2,scala/collection/AbstractTraversable.collect2Ccom/wixpress/framework/aspects/HttpAspectsTransport.$anonfun$read$12Pcom/wixpress/framework/aspects/HttpAspectsTransport$$Lambda$1914/584965740.apply2'scala/collection/immutable/List.flatMap2"java/lang/StringCoding.encodeASCII2(org/jose4j/lang/StringUtil.getBytesAscii24org/jose4j/jws/JsonWebSignature.getSigningInputBytes2*org/jose4j/jwx/CompactSerializer.serialize2scala/Option$.apply2java/lang/Integer.toString2java/time/LocalTime.toString2 java/time/LocalDateTime.toString2 java/time/ZonedDateTime.toString2;com/wixpress/monitoring/time/Time$.zonedDateTimeNowToString2Pcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3198/2071923867.get$Lambda25com/wixpress/monitoring/panorama/v1/Converter.version2=com/wixpress/monitoring/panorama/v1/Converter.$anonfun$from$42Jcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3184/595334145.apply2scala/Array$$anon$11.apply2*scala/collection/TraversableLike.builder$12%org/jose4j/base64url/Base64Url.2org/jose4j/jwx/Headers.2&org/jose4j/jwx/JsonWebStructure.2&org/jose4j/jws/JsonWebSignature.26java/nio/channels/spi/AbstractSelectableChannel.2&java/nio/channels/SocketChannel.2#sun/nio/ch/SocketChannelImpl.2)sun/nio/ch/ServerSocketChannelImpl.accept2(io/netty/util/internal/SocketUtils$5.run2+java/security/AccessController.doPrivileged2)io/netty/util/internal/SocketUtils.accept2Aio/netty/channel/socket/nio/NioServerSocketChannel.doReadMessages2Dio/netty/channel/nio/AbstractNioMessageChannel$NioMessageUnsafe.read24io/netty/channel/nio/NioEventLoop.processSelectedKey2>io/netty/channel/nio/NioEventLoop.processSelectedKeysOptimized25io/netty/channel/nio/NioEventLoop.processSelectedKeys2%io/netty/channel/nio/NioEventLoop.run28io/netty/util/concurrent/SingleThreadEventExecutor$4.run2.io/netty/util/internal/ThreadExecutorMap$2.run24io/netty/util/concurrent/FastThreadLocalRunnable.run28com/wixpress/grpc/EventLoopGroups$.$anonfun$markThread$12=com/wixpress/grpc/EventLoopGroups$$$Lambda$396/2003311844.run2java/math/BigInteger.leftShift2/scala/collection/immutable/VectorBuilder.2-scala/collection/immutable/Vector$.newBuilder2scala/collection/SetLike.toSeq2scala/collection/SetLike.toSeq$2"scala/collection/AbstractSet.toSeq2Kcom/wixpress/framework/tracking/consent/CookieDomains$.resolveCookieDomains2Ccom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$62Mcom/wixpress/framework/tracking/consent/Policies$$Lambda$2042/386554115.apply28com/wixpress/framework/tracking/consent/Policies.resolve2Qcom/wixpress/framework/tracking/consent/TrackingConsentLaboratory$.extractConsent2Pcom/wixpress/framework/tracking/consent/TrackingConsentLaboratory.extractConsent2Lcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$.resolveRequestContext$12Fcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$.$anonfun$apply$122Rcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$$$Lambda$1054/1238145834.apply2%java/time/LocalDateTime.ofEpochSecond2java/time/ZonedDateTime.create2!java/time/ZonedDateTime.ofInstant2java/time/ZonedDateTime.now2Ncom/wixpress/framework/aspects/AspectFilter$$Lambda$1077/1427396510.get$Lambda2java/util/regex/Matcher.2java/util/Formatter.parse2java/util/Formatter.format2java/lang/String.format22com/wixpress/framework/statsd/reporter/StatsD.send2Hcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportHistogram2?com/wixpress/framework/statsd/reporter/WixStatsDReporter.report2-com/codahale/metrics/ScheduledReporter.report25com/codahale/metrics/ScheduledReporter.lambda$start$02Acom/codahale/metrics/ScheduledReporter$$Lambda$1828/746676188.run23java/util/concurrent/Executors$RunnableAdapter.call2+java/util/concurrent/FutureTask.runAndReset2Hjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask.run24scala/collection/mutable/ArrayBuilder$ofLong.mkArray23scala/collection/mutable/ArrayBuilder$ofLong.result2(scala/collection/TraversableLike.flatMap2)scala/collection/TraversableLike.flatMap$2/scala/collection/mutable/ArrayOps$ofRef.flatMap2Zcom/wixpress/framework/metrics/graphite/core/SlidingTimeWindowUniformReservoir.getSnapshot2*com/codahale/metrics/Histogram.getSnapshot2Ecom/wixpress/framework/statsd/reporter/WixStatsDReporter.formatNumber2Fcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportMetered26com/wixpress/framework/statsd/reporter/StatsD.sanitize2%java/util/Formatter$FixedString.print2java/util/Formatter.toString2?com/wixpress/framework/statsd/reporter/WixStatsDReporter.prefix2java/util/ArrayList.grow2java/util/ArrayList.add2,com/codahale/metrics/WeightedSnapshot.2?com/codahale/metrics/ExponentiallyDecayingReservoir.getSnapshot2&com/codahale/metrics/Timer.getSnapshot2Dcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportTimer2Ocom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$usersExperimentLogMap$12Wcom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$usersExperimentLogMap$1$adapted2Lcom/wixpress/petri/asp/PetriExperimentsAspect$$$Lambda$1993/1046699873.apply28scala/collection/MapLike$FilteredKeys.$anonfun$foreach$12Bscala/collection/MapLike$FilteredKeys$$Lambda$1995/489511575.apply24scala/collection/immutable/NewRedBlackTree$._foreach23scala/collection/immutable/NewRedBlackTree$.foreach2*scala/collection/immutable/TreeMap.foreach2-scala/collection/MapLike$FilteredKeys.foreach2Dcom/wixpress/petri/asp/PetriExperimentsAspect$.usersExperimentLogMap2mcom/wixpress/grpc/rest/middlewares/Report.com$wixpress$grpc$rest$middlewares$Report$$reportSuccessAndExpire$12java/lang/String.substring2'sun/security/provider/DigestBase.29scala/concurrent/Future$$Lambda$576/1062005554.get$Lambda2scala/concurrent/Future.flatMap2 scala/concurrent/Future.flatMap$2io/netty/channel/AbstractChannelHandlerContext.fireChannelRead2>com/wixpress/grpc/IncorrectArtifactCalledDetector.channelRead02;com/wixpress/grpc/StartRest$DecodeErrorHandler.channelRead02:io/netty/handler/codec/MessageToMessageDecoder.channelRead29io/netty/channel/ChannelInboundHandlerAdapter.channelRead28com/wixpress/grpc/accesslog/AccessLogHandler.channelRead2]io/netty/channel/CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead2;io/netty/handler/codec/ByteToMessageDecoder.fireChannelRead27io/netty/handler/codec/ByteToMessageDecoder.channelRead29io/netty/channel/CombinedChannelDuplexHandler.channelRead2?io/netty/channel/DefaultChannelPipeline$HeadContext.channelRead27io/netty/channel/DefaultChannelPipeline.fireChannelRead2>io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe.read2Acom/google/protobuf/ByteString$LiteralByteString.toStringInternal2'com/google/protobuf/ByteString.toString2+com/google/protobuf/ByteString.toStringUtf82Acom/wixpress/monitoring/panorama/v1/LogController.$anonfun$_log$12Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2134/1685508225.apply29com/wixpress/common/concurrent/future/package$.safeFuture26com/wixpress/monitoring/panorama/v1/LogController._log2Dcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$bulkLog$12Mcom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2130/42863488.apply29com/wixpress/monitoring/panorama/v1/LogController.bulkLog2acom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog.$anonfun$wrappedBulkLog$22dcom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog$$Lambda$2128/122972379.apply27scala/collection/immutable/HashMap$HashTrieMap.iterator2'scala/collection/MapLike$$anon$1.2%scala/collection/MapLike.keysIterator2&scala/collection/MapLike.keysIterator$2)scala/collection/AbstractMap.keysIterator2/scala/collection/MapLike$DefaultKeySet.iterator2$scala/collection/IterableLike.forall2%scala/collection/IterableLike.forall$2(scala/collection/AbstractIterable.forall29com/google/protobuf/struct/Value$.$anonfun$messageReads$12?com/google/protobuf/struct/Value$$$Lambda$2236/1748307622.apply2.scalapb/descriptors/Reads$.$anonfun$optional$126scalapb/descriptors/Reads$$$Lambda$976/732611751.apply2scalapb/descriptors/PValue.as2scalapb/descriptors/PValue.as$2scalapb/descriptors/PMessage.as2Gcom/google/protobuf/struct/Struct$FieldsEntry$.$anonfun$messageReads$122Lcom/google/protobuf/struct/Struct$FieldsEntry$$$Lambda$2234/1194292910.apply2Fcom/google/protobuf/struct/Struct$FieldsEntry$.$anonfun$messageReads$72Kcom/google/protobuf/struct/Struct$FieldsEntry$$$Lambda$2180/279903710.apply23scalapb/descriptors/ReadsCompat.$anonfun$repeated$12;scalapb/descriptors/ReadsCompat$$Lambda$980/274827125.apply2 scalapb/descriptors/PRepeated.as2:com/google/protobuf/struct/Struct$.$anonfun$messageReads$42>com/google/protobuf/struct/Struct$$$Lambda$2179/90585130.apply2:com/google/protobuf/struct/Struct$.$anonfun$messageReads$12@com/google/protobuf/struct/Struct$$$Lambda$2169/2094936604.apply2Ecom/fasterxml/jackson/databind/deser/SettableBeanProperty.deserialize2Scom/fasterxml/jackson/databind/deser/BeanDeserializer._deserializeWithErrorWrapping2Tcom/fasterxml/jackson/databind/deser/BeanDeserializer._deserializeUsingPropertyBased2^com/fasterxml/jackson/databind/deser/BeanDeserializerBase.deserializeFromObjectUsingNonDefault2Kcom/fasterxml/jackson/databind/deser/BeanDeserializer.deserializeFromObject2Acom/fasterxml/jackson/databind/deser/BeanDeserializer.deserialize2Kcom/fasterxml/jackson/databind/deser/std/CollectionDeserializer.deserialize2dcom/fasterxml/jackson/module/scala/deser/GenericFactoryDeserializerResolver$Deserializer.deserialize2Dcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$bulkLog$22Ncom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2133/474553095.apply2Dscala/collection/immutable/Stream$$Lambda$1913/1299101325.get$Lambda2?com/wixpress/framework/config/ConfiguratorAspectsTransport.read22com/wixpress/grpc/rest/HttpCallScopeProducer.apply2Lcom/wixpress/grpc/rest/backends/CallScopeBackend$.$anonfun$buildInputParse$12Ncom/wixpress/grpc/rest/backends/CallScopeBackend$$$Lambda$1818/933489703.apply2Rcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$apply$72_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1876/1563411370.apply20scala/collection/immutable/Stream.$anonfun$map$12>scala/collection/immutable/Stream$$Lambda$1119/490879749.apply29scala/collection/immutable/StreamIterator.$anonfun$next$12Fscala/collection/immutable/StreamIterator$$Lambda$254/1657697023.apply2?scala/collection/immutable/StreamIterator$LazyCell.v$lzycompute24scala/collection/immutable/StreamIterator$LazyCell.v21scala/collection/immutable/StreamIterator.hasNext28com/wixpress/grpc/rest/backends/CsrfFilter$Params$.apply20com/wixpress/grpc/rest/backends/CsrfFilter.check2Kscala/collection/immutable/StreamIterator$$Lambda$254/1657697023.get$Lambda2.scala/collection/immutable/StreamIterator.next2Bcom/wixpress/grpc/rest/HttpCallScopeProducer.timeBudgetHeaderValue2Ascala/collection/immutable/HashMap$HashMapBuilder.makeMutableTrie28scala/collection/immutable/HashMap$HashMapBuilder.addOne2:scala/collection/immutable/HashMap$HashMapBuilder.$plus$eq26scala/collection/immutable/Map$MapBuilderImpl.$plus$eq2.scalapb/GeneratedMessage.$anonfun$toPMessage$126scalapb/GeneratedMessage$$Lambda$1731/1112156613.apply2#scalapb/GeneratedMessage.toPMessage2$scalapb/GeneratedMessage.toPMessage$2+com/google/protobuf/struct/Value.toPMessage2Acom/google/protobuf/struct/Struct$FieldsEntry.$anonfun$getField$22Icom/google/protobuf/struct/Struct$FieldsEntry.$anonfun$getField$2$adapted2Jcom/google/protobuf/struct/Struct$FieldsEntry$$Lambda$2183/984164171.apply26com/google/protobuf/struct/Struct$FieldsEntry.getField28com/google/protobuf/struct/Struct$FieldsEntry.toPMessage25com/google/protobuf/struct/Struct.$anonfun$getField$12=com/google/protobuf/struct/Struct.$anonfun$getField$1$adapted2?com/google/protobuf/struct/Struct$$Lambda$2176/1293617360.apply2'scala/collection/Iterator$$anon$10.next26scala/collection/immutable/VectorBuilder.$plus$plus$eq2#scala/collection/TraversableOnce.to2$scala/collection/TraversableOnce.to$2$scala/collection/AbstractIterator.to2)scala/collection/TraversableOnce.toVector2*scala/collection/TraversableOnce.toVector$2*scala/collection/AbstractIterator.toVector2*com/google/protobuf/struct/Struct.getField2,com/google/protobuf/struct/Struct.toPMessage24com/google/protobuf/struct/Value.$anonfun$getField$62com/google/protobuf/struct/Struct$$Lambda$2187/678869738.apply23scala/collection/immutable/HashMap$HashMap1.foreach26scala/collection/immutable/HashMap$HashTrieMap.foreach2:com/google/protobuf/struct/Struct.__computeSerializedValue20com/google/protobuf/struct/Struct.serializedSize2:com/wixpress/monitoring/panorama/v1/LogController.validate2Lcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$validateBulkLog$12Tcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$validateBulkLog$1$adapted2Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2186/1330773715.apply2Acom/wixpress/monitoring/panorama/v1/LogController.validateBulkLog2;com/wixpress/framework/tracing/TracingContext.withOTContext226scala/collection/immutable/Stream$StreamBuilder.2-scala/collection/immutable/Stream$.newBuilder2Hscala/collection/generic/GenTraversableFactory$GenericCanBuildFrom.apply2;io/netty/handler/codec/http/cookie/CookieDecoder.initCookie2=io/netty/handler/codec/http/cookie/ServerCookieDecoder.decode2=com/wixpress/grpc/rest/backends/CsrfFilter$CookieToken$.apply27com/wixpress/grpc/rest/backends/CsrfFilter$Token$.apply2Ccom/wixpress/grpc/rest/backends/CsrfFilter$Params$.$anonfun$apply$42Ncom/wixpress/grpc/rest/backends/CsrfFilter$Params$$$Lambda$2083/99749969.apply2Cio/netty/util/internal/PlatformDependent.allocateUninitializedArray2$io/netty/buffer/ByteBufUtil.getBytes2Acom/wixpress/grpc/StartRest$HttpServerAdapter.restExposureRequest2:scala/collection/generic/Growable.$anonfun$$plus$plus$eq$12>scala/collection/generic/Growable$$Lambda$139/1989332276.apply2+scala/collection/immutable/Map$Map4.foreach2?scala/collection/immutable/HashMap$HashMapBuilder.$plus$plus$eq2Escala/collection/immutable/Map$MapBuilderImpl.convertToHashMapBuilder21scala/Predef$ArrowAssoc$.$minus$greater$extension2java/lang/Class.resolveName2#java/lang/Class.getResourceAsStream2Ccom/wixpress/grpc/IncorrectArtifactCalledDetector$.$anonfun$apply$12Pcom/wixpress/grpc/IncorrectArtifactCalledDetector$$$Lambda$1853/1615967848.apply28com/wixpress/grpc/IncorrectArtifactCalledDetector$.apply2/com/wixpress/grpc/StartRest$$anon$1.initChannel2/io/netty/channel/ChannelInitializer.initChannel20io/netty/channel/ChannelInitializer.handlerAdded2?io/netty/channel/AbstractChannelHandlerContext.callHandlerAdded29io/netty/channel/DefaultChannelPipeline.callHandlerAdded022io/netty/channel/DefaultChannelPipeline.access$1002Gio/netty/channel/DefaultChannelPipeline$PendingHandlerAddedTask.execute2Fio/netty/channel/DefaultChannelPipeline.callHandlerAddedForAllHandlers2Bio/netty/channel/DefaultChannelPipeline.invokeHandlerAddedIfNeeded29io/netty/channel/AbstractChannel$AbstractUnsafe.register02:io/netty/channel/AbstractChannel$AbstractUnsafe.access$20025io/netty/channel/AbstractChannel$AbstractUnsafe$1.run2:io/netty/util/concurrent/AbstractEventExecutor.safeExecute2>io/netty/util/concurrent/SingleThreadEventExecutor.runAllTasks2Hcom/wixpress/framework/passthrough/PassThroughValuesFilter.filterHeaders2>com/wixpress/grpc/rest/HttpCallScopeProducer.passThroughValues2java/io/IOException.2/java/nio/channels/ClosedChannelException.25io/netty/channel/AbstractChannel$AbstractUnsafe.close29io/netty/channel/DefaultChannelPipeline$HeadContext.close2:io/netty/channel/AbstractChannelHandlerContext.invokeClose24io/netty/channel/AbstractChannelHandlerContext.close2Sio/netty/channel/CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.close24io/netty/channel/ChannelOutboundHandlerAdapter.close23io/netty/channel/CombinedChannelDuplexHandler.close2-io/netty/channel/DefaultChannelPipeline.close2&io/netty/channel/AbstractChannel.close2:io/netty/channel/ChannelFutureListener$1.operationComplete27io/netty/util/concurrent/DefaultPromise.notifyListener02:io/netty/util/concurrent/DefaultPromise.notifyListenersNow27io/netty/util/concurrent/DefaultPromise.notifyListeners23io/netty/util/concurrent/DefaultPromise.addListener22io/netty/channel/DefaultChannelPromise.addListener29com/wixpress/grpc/StartRest$HttpServerAdapter.respondWith2Ecom/wixpress/grpc/StartRest$HttpServerAdapter.$anonfun$channelRead0$12Mcom/wixpress/grpc/StartRest$HttpServerAdapter.$anonfun$channelRead0$1$adapted2Jcom/wixpress/grpc/StartRest$HttpServerAdapter$$Lambda$2070/469164790.apply2Cscala/collection/immutable/Stream$$Lambda$1119/490879749.get$Lambda2"java/io/BufferedInputStream.23sun/net/www/protocol/file/FileURLConnection.connect2:sun/net/www/protocol/file/FileURLConnection.getInputStream2java/net/URL.openStream2)java/lang/ClassLoader.getResourceAsStream20scala/collection/immutable/Map$EmptyMap$.updated2.scala/collection/immutable/Map$EmptyMap$.$plus2Pcom/wixpress/framework/tracing/DistributedTraceContext$TraceContextMapSetter.set2Gio/opentelemetry/api/trace/propagation/W3CTraceContextPropagator.inject2Ucom/wixpress/framework/tracing/DistributedTraceContext$.$anonfun$fromTracingContext$12Tcom/wixpress/framework/tracing/DistributedTraceContext$$$Lambda$805/1456337864.apply2Jcom/wixpress/framework/tracing/DistributedTraceContext$.fromTracingContext2Rcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.addTraceContext2Hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.start2"io/grpc/stub/ClientCalls.startCall2=io/netty/util/internal/AppendableCharSequence.subStringUnsafe29io/netty/handler/codec/http/HttpObjectDecoder.splitHeader29io/netty/handler/codec/http/HttpObjectDecoder.readHeaders24io/netty/handler/codec/http/HttpObjectDecoder.decode2Kio/netty/handler/codec/http/HttpServerCodec$HttpServerRequestDecoder.decode2Jio/netty/handler/codec/ByteToMessageDecoder.decodeRemovalReentryProtection26io/netty/handler/codec/ByteToMessageDecoder.callDecode2:scala/collection/Iterator$$Lambda$495/495984416.get$Lambda2"scala/collection/Iterator.toStream2#scala/collection/Iterator.toStream$2*scala/collection/AbstractIterator.toStream2-scala/collection/Iterator.$anonfun$toStream$125scala/collection/Iterator$$Lambda$495/495984416.apply2,scala/collection/generic/GenMapFactory.apply2java/util/concurrent/CompletableFuture$UniWhenComplete.tryFire25java/util/concurrent/CompletableFuture$Completion.run2Lorg/asynchttpclient/netty/NettyResponseFuture$$Lambda$1074/928025503.execute2:java/util/concurrent/CompletableFuture$UniCompletion.claim23java/util/concurrent/CompletableFuture.postComplete2/java/util/concurrent/CompletableFuture.complete29org/asynchttpclient/netty/NettyResponseFuture.loadContent22org/asynchttpclient/netty/NettyResponseFuture.done2Eorg/asynchttpclient/netty/handler/AsyncHttpClientHandler.finishUpdate29org/asynchttpclient/netty/handler/HttpHandler.handleChunk28org/asynchttpclient/netty/handler/HttpHandler.handleRead2Dorg/asynchttpclient/netty/handler/AsyncHttpClientHandler.channelRead2Bcom/wix/api/RequestContext$AspectsEntry$.$anonfun$keyValueMapper$22Dcom/wix/api/RequestContext$AspectsEntry$$$Lambda$812/892477382.apply2!scalapb/TypeMapper$$anon$1.toBase2>com/wix/api/RequestContext.$anonfun$__computeSerializedValue$12Fcom/wix/api/RequestContext.$anonfun$__computeSerializedValue$1$adapted27com/wix/api/RequestContext$$Lambda$810/1222466248.apply23com/wix/api/RequestContext.__computeSerializedValue2)com/wix/api/RequestContext.serializedSize2$scalapb/GeneratedMessage.toByteArray2%scalapb/GeneratedMessage.toByteArray$2&com/wix/api/RequestContext.toByteArray2Tcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.addRequestContext2+scala/collection/immutable/Map$Map3.updated2)scala/collection/immutable/Map$Map3.$plus20scala/collection/immutable/HashMap$HashMap1.get023scala/collection/immutable/HashMap$HashTrieMap.get02&scala/collection/immutable/HashMap.get2$com/wix/api/RequestContext.mergeFrom2scalapb/LiteParser$.parseFrom2+scalapb/GeneratedMessageCompanion.parseFrom2,scalapb/GeneratedMessageCompanion.parseFrom$2%com/wix/api/RequestContext$.parseFrom2Bcom/wixpress/grpc/Interceptors$.$anonfun$maybeRequestAspectsFrom$122;io/grpc/netty/GrpcHttp2OutboundHeaders.clientRequestHeaders2(io/grpc/netty/Utils.convertClientHeaders29io/grpc/netty/NettyClientStream$Sink.writeHeadersInternal21io/grpc/netty/NettyClientStream$Sink.writeHeaders2+io/grpc/internal/AbstractClientStream.start2-io/grpc/internal/ForwardingClientStream.start2@io/grpc/internal/InternalSubchannel$CallTracingTransport$1.start2-io/grpc/internal/ClientCallImpl.startInternal2%io/grpc/internal/ClientCallImpl.start2Cio/grpc/census/CensusTracingModule$TracingClientInterceptor$1.start2?io/grpc/census/CensusStatsModule$StatsClientInterceptor$1.start2"io/grpc/ForwardingClientCall.start2[io/grpc/stub/MetadataUtils$HeaderAttachingClientInterceptor$HeaderAttachingClientCall.start25com/wixpress/grpc/ClientMetricsReporter$$anon$1.start2=com/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1.start25com/wixpress/grpc/ClientDetailsReporter$$anon$1.start2@com/wixpress/grpc/ClientRequestSizeMetricsReporter$$anon$1.start24io/netty/util/internal/AppendableCharSequence.append2Bio/netty/handler/codec/http/HttpObjectDecoder$HeaderParser.process2/io/netty/buffer/AbstractByteBuf.forEachByteAsc02+io/netty/buffer/AbstractByteBuf.forEachByte2@io/netty/handler/codec/http/HttpObjectDecoder$HeaderParser.parse28com/google/protobuf/struct/Value$Kind$StringValue$.apply29com/google/protobuf/struct/Value$.$anonfun$messageReads$82?com/google/protobuf/struct/Value$$$Lambda$2258/1383381276.apply2#java/lang/reflect/Array.newInstance2/scala/reflect/ClassTag$GenericClassTag.newArray2fcom/wixpress/monitoring/panorama/v1/LogController.emitPanoramaHttpRequestLogLineTotalPerArtifactMetric2Acom/wixpress/monitoring/panorama/v1/LogController.$anonfun$rate$12Icom/wixpress/monitoring/panorama/v1/LogController.$anonfun$rate$1$adapted2Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2303/2119068677.apply23scala/collection/mutable/HashMap.$anonfun$foreach$12=scala/collection/mutable/HashMap$$Lambda$150/1365711624.apply2/scala/collection/mutable/HashTable.foreachEntry20scala/collection/mutable/HashTable.foreachEntry$2-scala/collection/mutable/HashMap.foreachEntry2(scala/collection/mutable/HashMap.foreach26com/wixpress/monitoring/panorama/v1/LogController.rate2(com/google/common/io/BaseEncoding.encode22io/grpc/internal/TransportFrameUtil.toHttp2Headers21com/wix/api/RequestContext$AspectsEntry.mergeFrom2scalapb/LiteParser$.readMessage2"scala/collection/IterableLike.find2#scala/collection/IterableLike.find$2&scala/collection/AbstractIterable.find20scalapb/descriptors/Descriptor.findFieldByNumber2]com/wixpress/framework/passthrough/PassThroughValuesFilter$$Lambda$1928/1407686499.get$Lambda2ˆcom/wixpress/framework/passthrough/PassThroughValuesFilter.com$wixpress$framework$passthrough$PassThroughValuesFilter$$headerNameAllowed2Scom/wixpress/framework/passthrough/PassThroughValuesFilter.$anonfun$filterHeaders$12[com/wixpress/framework/passthrough/PassThroughValuesFilter.$anonfun$filterHeaders$1$adapted2Wcom/wixpress/framework/passthrough/PassThroughValuesFilter$$Lambda$1927/205448287.apply2Dcom/google/protobuf/struct/Value$$$Lambda$2258/1383381276.get$Lambda22io/netty/channel/DefaultChannelPipeline.newContext2/io/netty/channel/DefaultChannelPipeline.addLast24scala/collection/immutable/TrieIterator.initPosStack2.scala/collection/immutable/TrieIterator.2=scala/collection/immutable/HashMap$HashTrieMap$$anon$7.2:scala/collection/SeqLike$$Lambda$494/1692066743.get$Lambda2!scala/collection/SeqLike.contains2"scala/collection/SeqLike.contains$2-scala/collection/immutable/StringOps.contains2Jcom/wixpress/grpc/IncorrectArtifactCalledDetector$.makeArtifactIdCanonical2Bscala/collection/TraversableLike$$Lambda$142/1105090408.get$Lambda20scala/collection/immutable/Map$Map2.keysIterator2;scalapb/descriptors/Reads$$$Lambda$976/732611751.get$Lambda2#scalapb/descriptors/Reads$.optional29com/google/protobuf/struct/Value$.$anonfun$messageReads$92>com/google/protobuf/struct/Value$$$Lambda$2264/973257206.apply2=com/google/protobuf/ByteString$ArraysByteArrayCopier.copyFrom2'com/google/protobuf/ByteString.copyFrom27com/wixpress/grpc/rest/backends/ScalaPB$.rawHttpRequest220io/netty/buffer/UnpooledUnsafeHeapByteBuf.2Uio/netty/buffer/UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.26io/netty/buffer/UnpooledByteBufAllocator.newHeapBuffer23io/netty/buffer/AbstractByteBufAllocator.heapBuffer2io/netty/buffer/Unpooled.buffer2>io/netty/handler/codec/http2/DefaultHttp2HeadersEncoder.2;io/netty/handler/codec/http2/DefaultHttp2FrameWriter.2+io/grpc/netty/NettyServerHandler.newHandler20io/grpc/netty/NettyServerTransport.createHandler2(io/grpc/netty/NettyServerTransport.start2'io/grpc/netty/NettyServer$1.initChannel2%scala/collection/immutable/Stream.zip2Gcom/wixpress/framework/tracking/consent/Domain$.isSubdomainOf$extension2Ccom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$52Kcom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$5$adapted2Mcom/wixpress/framework/tracking/consent/Policies$$Lambda$2039/117119175.apply2*scala/collection/immutable/Set$Set2.exists2&java/lang/AbstractStringBuilder.2java/lang/StringBuilder.2Bscala/collection/TraversableLike$$Lambda$140/2080125222.get$Lambda27java/lang/invoke/LambdaForm$DMH/1990098664.invokeStatic2com/google/common/util/concurrent/Futures$CallbackListener.run2@com/google/common/util/concurrent/AbstractFuture.executeListener29com/google/common/util/concurrent/AbstractFuture.complete24com/google/common/util/concurrent/AbstractFuture.set2'io/grpc/stub/ClientCalls$GrpcFuture.set24io/grpc/stub/ClientCalls$UnaryStreamToFuture.onClose2+scala/collection/immutable/Stream.partition2Icom/wixpress/ratelimiter/contract/ReportUsageIfEligibleResponse.mergeFrom2Jcom/wixpress/ratelimiter/contract/ReportUsageIfEligibleResponse$.parseFrom2scalapb/grpc/Marshaller.parse2&io/grpc/MethodDescriptor.parseResponse2Wio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal2Xio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext2java/time/LocalDate.ofEpochDay2java/time/LocalDate.toString25scala/collection/immutable/StringOps$.slice$extension2*scala/collection/immutable/StringOps.slice2)scala/collection/IndexedSeqOptimized.take2*scala/collection/IndexedSeqOptimized.take$2)scala/collection/immutable/StringOps.take2=com/wixpress/common/devices/overrides/Trigger.lambda$create$12Icom/wixpress/common/devices/overrides/Trigger$$Lambda$388/1636824514.test25com/wixpress/common/devices/overrides/Trigger.matches2Ecom/wixpress/common/devices/overrides/DeviceOverride.lambda$matches$02Pcom/wixpress/common/devices/overrides/DeviceOverride$$Lambda$2306/804483753.test2+java/util/stream/MatchOps$1MatchSink.accept23java/util/ArrayList$ArrayListSpliterator.tryAdvance24java/util/stream/ReferencePipeline.forEachWithCancel24java/util/stream/AbstractPipeline.copyIntoWithCancel2*java/util/stream/AbstractPipeline.copyInto21java/util/stream/AbstractPipeline.wrapAndCopyInto24java/util/stream/MatchOps$MatchOp.evaluateSequential2*java/util/stream/AbstractPipeline.evaluate2Fscala/collection/immutable/Stream$StreamWithFilter.filtered$lzycompute2;scala/collection/immutable/Stream$StreamWithFilter.filtered2Hscala/collection/immutable/Stream$StreamWithFilter.$anonfun$withFilter$22Oscala/collection/immutable/Stream$StreamWithFilter$$Lambda$1908/933794650.apply29scala/collection/immutable/Stream$StreamWithFilter.2=scala/collection/immutable/Stream$StreamWithFilter.withFilter2@com/wixpress/monitoring/panorama/v1/Converter.$anonfun$version$12Hcom/wixpress/monitoring/panorama/v1/Converter.$anonfun$version$1$adapted2Kcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3198/2071923867.apply2>com/wixpress/monitoring/panorama/v1/Converter.$anonfun$from$122Jcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3267/511098654.apply2Acom/wixpress/framework/util/cookies/CookieDomainResolver$.resolve2Icom/wixpress/framework/util/cookies/CookieDomainResolver$.getCookieDomain2Kcom/wixpress/framework/aspects/CookieDomainAspect$$anon$1.$anonfun$decode$12Vcom/wixpress/framework/aspects/CookieDomainAspect$$anon$1$$Lambda$1999/463025593.apply2@com/wixpress/framework/aspects/CookieDomainAspect$$anon$1.decode2(java/util/zip/ZipFile$Source.getEntryPos2java/util/zip/ZipFile.getEntry2 java/util/zip/ZipFile$1.getEntry2java/util/jar/JarFile.getEntry02java/util/jar/JarFile.getEntry2!java/util/jar/JarFile.getJarEntry26jdk/internal/loader/URLClassPath$JarLoader.getResource2,jdk/internal/loader/URLClassPath.getResource2Ajdk/internal/loader/BuiltinClassLoader.findClassOnClassPathOrNull26jdk/internal/loader/BuiltinClassLoader.loadClassOrNull20jdk/internal/loader/BuiltinClassLoader.loadClass29jdk/internal/loader/ClassLoaders$AppClassLoader.loadClass2java/lang/ClassLoader.loadClass2:io/pyroscope/okhttp3/MultipartBody$Builder.addFormDataPart227java/util/zip/ZipFile$ZipFileInflaterInputStream.2$java/util/zip/ZipFile.getInputStream2$java/util/jar/JarFile.getInputStream2;jdk/internal/loader/URLClassPath$JarLoader$2.getInputStream2.jdk/internal/loader/Resource.cachedInputStream2*jdk/internal/loader/Resource.getByteBuffer2'java/util/jar/JarFile.getVersionedEntry2Xio/pyroscope/okhttp3/internal/connection/RealCall.getResponseWithInterceptorChain$okhttp29io/pyroscope/okhttp3/internal/connection/RealCall.execute2Fio/pyroscope/okhttp3/internal/connection/ExchangeFinder.findConnection2Mio/pyroscope/okhttp3/internal/connection/ExchangeFinder.findHealthyConnection2io/pyroscope/okhttp3/internal/cache/CacheInterceptor.intercept2>io/pyroscope/okhttp3/internal/http/BridgeInterceptor.intercept2Hio/pyroscope/okhttp3/internal/http/RetryAndFollowUpInterceptor.intercept2%io/pyroscope/okio/Okio__OkioKt.buffer2io/pyroscope/okio/Okio.buffer2Eio/pyroscope/okhttp3/internal/connection/RealConnection.connectSocket2?io/pyroscope/okhttp3/internal/connection/RealConnection.connect2java/lang/String.concat22io/pyroscope/okhttp3/internal/Util.hasIntersection20io/pyroscope/okhttp3/ConnectionSpec.isCompatible2Uio/pyroscope/okhttp3/internal/connection/ConnectionSpecSelector.configureSecureSocket2Bio/pyroscope/okhttp3/internal/connection/RealConnection.connectTls2Iio/pyroscope/okhttp3/internal/connection/RealConnection.establishProtocol2java/util/regex/Pattern.split23sun/security/util/AlgorithmDecomposer.decomposeImpl2/sun/security/util/AlgorithmDecomposer.decompose21sun/security/ssl/SSLAlgorithmDecomposer.decompose2=sun/security/util/AbstractAlgorithmConstraints.checkAlgorithm26sun/security/util/DisabledAlgorithmConstraints.permits20sun/security/ssl/SSLAlgorithmConstraints.permits2'sun/security/ssl/NamedGroup.isPermitted2Gsun/security/ssl/SupportedGroupsExtension$SupportedGroups.isActivatable2/sun/security/ssl/HandshakeContext.isActivatable27sun/security/ssl/HandshakeContext.getActiveCipherSuites2(sun/security/ssl/HandshakeContext.2.sun/security/ssl/ClientHandshakeContext.2+sun/security/ssl/TransportContext.kickstart2-sun/security/ssl/SSLSocketImpl.startHandshake2java/util/HashMap.newNode2java/util/HashSet.add2,sun/security/ssl/SignatureScheme.isPermitted27sun/security/ssl/SignatureScheme.getSupportedAlgorithms2Psun/security/ssl/SignatureAlgorithmsExtension$CHSignatureSchemesProducer.produce2%sun/security/ssl/SSLExtension.produce2&sun/security/ssl/SSLExtensions.produce2Asun/security/ssl/ClientHello$ClientHelloKickstartProducer.produce2'sun/security/ssl/SSLHandshake.kickstart21sun/security/ssl/ClientHandshakeContext.kickstart2,io/pyroscope/okhttp3/Handshake$Companion.get2%io/pyroscope/okhttp3/Handshake.2$sun/net/util/URLUtil.urlNoFragString2java/security/CodeSource.2Bio/pyroscope/okhttp3/internal/http2/Http2Connection$Builder.2Bio/pyroscope/okhttp3/internal/connection/RealConnection.startHttp229io/pyroscope/okhttp3/internal/http2/PushObserver.27jdk/internal/loader/BuiltinClassLoader.findLoadedModule2:io/pyroscope/okhttp3/internal/http2/Http2Connection.2Aio/pyroscope/okhttp3/internal/http2/Http2Connection$Builder.build2Gio/pyroscope/okhttp3/internal/connection/RealConnection.newCodec$okhttp23io/pyroscope/okhttp3/internal/http2/Header.2Qio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec$Companion.http2HeadersList2Jio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec.writeRequestHeaders2Eio/pyroscope/okhttp3/internal/connection/Exchange.writeRequestHeaders2Bio/pyroscope/okhttp3/internal/http/CallServerInterceptor.intercept2Uio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec$Companion.readHttp2HeadersList2Jio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec.readResponseHeaders2Eio/pyroscope/okhttp3/internal/connection/Exchange.readResponseHeaders2-scala/collection/immutable/TreeMap.$plus$plus28com/wixpress/framework/aspects/CaseInsensitiveMap$.apply2Scom/wixpress/framework/aspects/response/AggregatedResponseAspects.$anonfun$aspect$22^com/wixpress/framework/aspects/response/AggregatedResponseAspects$$Lambda$2004/657901361.apply2Gcom/wixpress/grpc/rest/ResponseAspects$.$anonfun$wixNewSessionCookies$12Dcom/wixpress/grpc/rest/ResponseAspects$$$Lambda$2007/622161988.apply22>com/fasterxml/jackson/databind/node/JsonNodeFactory.objectNode2.scala/collection/mutable/ResizableArray.$init$2+scala/collection/mutable/ArrayBuffer.2/scala/collection/mutable/IndexedSeq$.newBuilder2java/lang/String.split2+scala/collection/immutable/StringLike.split2,scala/collection/immutable/StringLike.split$2*scala/collection/immutable/StringOps.split25com/wixpress/framework/tracking/consent/Domain$.apply2Dcom/wixpress/framework/tracking/consent/Policies.domain$lzycompute$129com/wixpress/framework/tracking/consent/Policies.domain$127scala/PartialFunction$$Lambda$538/1967118241.get$Lambda2scala/PartialFunction.runWith2scala/PartialFunction.runWith$2-scala/runtime/AbstractPartialFunction.runWith2Gcom/wixpress/grpc/rest/tracing/RestRequestSpanBuilder.addResponseStatus2;com/wixpress/grpc/rest/middlewares/Tracing.$anonfun$apply$22Ccom/wixpress/grpc/rest/middlewares/Tracing.$anonfun$apply$2$adapted2Hcom/wixpress/grpc/rest/middlewares/Tracing$$Lambda$2068/1495106548.apply2(scala/collection/IterableLike.toIterator2)scala/collection/IterableLike.toIterator$2,scala/collection/AbstractIterable.toIterator2=com/wixpress/framework/aspects/AspectFilter.$anonfun$filter$22Ecom/wixpress/framework/aspects/AspectFilter.$anonfun$filter$2$adapted2Icom/wixpress/framework/aspects/AspectFilter$$Lambda$1907/2077742605.apply23java/util/Formatter$FormatSpecifier.appendJustified2)java/util/Formatter$FormatSpecifier.print2/java/util/Formatter$FormatSpecifier.printString2&scala/collection/IterableLike.toStream2'scala/collection/IterableLike.toStream$20scala/collection/mutable/ArrayOps$ofRef.toStream2.com/wixpress/grpc/rest/CookieCutter$.cookiesOf2&java/math/MutableBigInteger.toIntArray2Icom/fasterxml/jackson/core/json/JsonWriteContext.createChildObjectContext2@com/fasterxml/jackson/databind/util/TokenBuffer.writeStartObject2Gscala/collection/MapLike$MappedValues$$Lambda$146/1539038539.get$Lambda2-scala/collection/MapLike$MappedValues.foreach21scala/collection/mutable/ListBuffer.$plus$plus$eq2#scala/collection/TraversableLike.to2$scala/collection/TraversableLike.to$2'scala/collection/AbstractTraversable.to2'scala/collection/TraversableOnce.toList2(scala/collection/TraversableOnce.toList$2+scala/collection/AbstractTraversable.toList2)scalapb/json4s/StructFormat$.structWriter26scalapb/json4s/JsonFormat$.$anonfun$DefaultRegistry$1127scalapb/json4s/JsonFormat$$$Lambda$192/1725266971.apply27scalapb/json4s/FormatRegistry.$anonfun$registerWriter$129scalapb/json4s/FormatRegistry$$Lambda$129/854989361.apply2scalapb/json4s/Printer.toJson28org/jose4j/json/internal/json_simple/parser/Yylex.yytext2java/time/LocalTime.create2java/time/LocalTime.ofNanoOfDay2Cscala/collection/generic/Growable$$Lambda$139/1989332276.get$Lambda2*scala/collection/mutable/ArrayOps$ofRef.to2-scala/collection/TraversableOnce.toIndexedSeq2.scala/collection/TraversableOnce.toIndexedSeq$24scala/collection/mutable/ArrayOps$ofRef.toIndexedSeq2scala/Array$.unapplySeq2Hcom/wixpress/framework/util/cookies/CookieDomainResolver$.stagingDomains2Lcom/wixpress/framework/util/cookies/CookieDomainResolver$.$anonfun$resolve$12Vcom/wixpress/framework/util/cookies/CookieDomainResolver$$$Lambda$2329/673584814.apply26scala/collection/immutable/TrieIterator.initArrayStack2@scalapb/descriptors/Descriptor$$Lambda$174/1617937669.get$Lambda29com/google/protobuf/struct/Value$.$anonfun$messageReads$62>com/google/protobuf/struct/Value$$$Lambda$2252/296218631.apply2jdk/internal/loader/BuiltinClassLoader.findResourceOnClassPath23jdk/internal/loader/BuiltinClassLoader.findResource2!java/lang/ClassLoader.getResource2+scala/collection/immutable/Map$Map2.updated2)scala/collection/immutable/Map$Map2.$plus2+scala/collection/immutable/Map$Map1.updated2)scala/collection/immutable/Map$Map1.$plus2.scalapb/json4s/StructFormat$.structValueParser27scalapb/json4s/StructFormat$.$anonfun$listValueParser$12:scalapb/json4s/StructFormat$$$Lambda$2185/2141798273.apply2,scalapb/json4s/StructFormat$.listValueParser2 io/netty/util/AsciiString.2io/netty/util/AsciiString.of2,io/grpc/netty/NettyClientStream.setAuthority24io/grpc/internal/ForwardingClientStream.setAuthority23com/fasterxml/jackson/core/JsonFactory.createParser24io/netty/handler/codec/DefaultHeaders.newHeaderEntry2*io/netty/handler/codec/DefaultHeaders.add02)io/netty/handler/codec/DefaultHeaders.add2/io/netty/handler/codec/DefaultHeaders.addObject22io/netty/handler/codec/http/DefaultHttpHeaders.add2scala/collection/Iterator.find2scala/collection/Iterator.find$2&scala/collection/AbstractIterator.find24io/netty/util/internal/AppendableCharSequence.24io/netty/handler/codec/http/HttpObjectDecoder.25io/netty/handler/codec/http/HttpRequestDecoder.2Kio/netty/handler/codec/http/HttpServerCodec$HttpServerRequestDecoder.22io/netty/handler/codec/http/HttpServerCodec.2java/util/HashMap.entrySet28io/grpc/census/CensusStatsModule$ClientCallTracer.24io/grpc/census/CensusStatsModule.newClientCallTracer2Eio/grpc/census/CensusStatsModule$StatsClientInterceptor.interceptCall25io/grpc/ClientInterceptors$InterceptorChannel.newCall2Iio/grpc/stub/MetadataUtils$HeaderAttachingClientInterceptor.interceptCall26com/wixpress/grpc/ClientMetricsReporter$$anon$1.25com/wixpress/grpc/ClientMetricsReporter.interceptCall2>com/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1.2=com/wixpress/grpc/ClientMetricsNewRelicReporter.interceptCall26com/wixpress/grpc/ClientDetailsReporter$$anon$1.26com/wixpress/grpc/ClientDetailsReporter$.interceptCall2Acom/wixpress/grpc/ClientRequestSizeMetricsReporter$$anon$1.2@com/wixpress/grpc/ClientRequestSizeMetricsReporter.interceptCall2+io/grpc/internal/ManagedChannelImpl.newCall21io/grpc/internal/ForwardingManagedChannel.newCall2Icom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.2Hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor.interceptCall2:com/google/protobuf/struct/Value$.$anonfun$messageReads$132>com/google/protobuf/struct/Value$$$Lambda$2284/398363668.apply2:com/google/protobuf/struct/Value$.$anonfun$messageReads$122=com/google/protobuf/struct/Value$$$Lambda$2269/59754955.apply21scala/collection/immutable/IndexedSeq$.newBuilder2(scala/LowPriorityImplicits$$anon$4.apply2Ccom/wixpress/grpc/MetricsNotifierOperations.extractClassMethodNames2"java/net/URLStreamHandler.parseURL2*sun/net/www/protocol/file/Handler.parseURL2java/net/URL.27jdk/internal/loader/URLClassPath$FileLoader.getResource28jdk/internal/loader/URLClassPath$FileLoader.findResource2com/google/protobuf/struct/Value$$Lambda$2215/1061001646.apply2/com/wixpress/grpc/AspectsCache.cache$lzycompute2$com/wixpress/grpc/AspectsCache.cache2Ncom/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper.isWarmUpRequest2?com/fasterxml/jackson/core/io/SegmentedStringWriter.getAndClear2&java/util/Collections.unmodifiableList2+io/grpc/CallOptions.withStreamTracerFactory2Iio/grpc/census/CensusTracingModule$TracingClientInterceptor.interceptCall2scala/Option.toList2scala/Option$.option2Iterable2$io/grpc/ClientInterceptors.intercept27scala/concurrent/impl/Promise$DefaultPromise.onComplete27sun/security/provider/NativePRNG$RandomIO.implNextBytes20sun/security/provider/NativePRNG.engineNextBytes2$java/security/SecureRandom.nextBytes2java/util/UUID.randomUUID2dcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1876/1563411370.get$Lambda2[com/wixpress/monitoring/panorama/bp/AsyncRateLimiterGrpc$$Lambda$2221/1689630732.get$Lambda26java/lang/invoke/LambdaForm$DMH/959918415.invokeStatic2io/netty/handler/codec/http2/DefaultHttp2FrameReader.readFrame2>io/netty/handler/codec/http2/Http2InboundFrameLogger.readFrame2Fio/netty/handler/codec/http2/DefaultHttp2ConnectionDecoder.decodeFrame2Gio/netty/handler/codec/http2/Http2ConnectionHandler$FrameDecoder.decode2:io/netty/handler/codec/http2/Http2ConnectionHandler.decode2-scala/collection/immutable/Vector.appendFront2-scala/collection/immutable/Vector.$plus$colon2Hcom/wixpress/framework/aspects/response/AggregatedResponseAspects.2Fcom/wixpress/framework/aspects/response/AggregatedResponseAspects.copy2Lcom/wixpress/framework/aspects/response/AggregatedResponseAspects.withAspect2Rcom/wixpress/framework/aspects/response/AtomicResponseAspects.$anonfun$mergeWith$12Zcom/wixpress/framework/aspects/response/AtomicResponseAspects$$Lambda$2112/757697389.apply2Gcom/wixpress/framework/aspects/response/AtomicResponseAspects.mergeWith2Tcom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.$anonfun$addXSeenByAspect$12\com/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.$anonfun$addXSeenByAspect$1$adapted2Ucom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator$$Lambda$2109/332657697.apply2Icom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.addXSeenByAspect2#java/nio/DirectByteBuffer.duplicate2>io/netty/buffer/PooledUnsafeDirectByteBuf.newInternalNioBuffer20io/netty/buffer/PooledByteBuf._internalNioBuffer28io/netty/buffer/PooledByteBuf.duplicateInternalNioBuffer2'io/netty/buffer/PooledByteBuf.nioBuffer27io/netty/buffer/AbstractUnpooledSlicedByteBuf.nioBuffer28io/netty/buffer/AbstractDerivedByteBuf.internalNioBuffer21io/netty/channel/ChannelOutboundBuffer.nioBuffers24io/netty/channel/socket/nio/NioSocketChannel.doWrite26io/netty/channel/AbstractChannel$AbstractUnsafe.flush02@io/netty/channel/nio/AbstractNioChannel$AbstractNioUnsafe.flush025io/netty/channel/AbstractChannel$AbstractUnsafe.flush29io/netty/channel/DefaultChannelPipeline$HeadContext.flush2;io/netty/channel/AbstractChannelHandlerContext.invokeFlush02:io/netty/channel/AbstractChannelHandlerContext.invokeFlush24io/netty/channel/AbstractChannelHandlerContext.flush29io/netty/handler/codec/http2/Http2ConnectionHandler.flush2-io/netty/channel/DefaultChannelPipeline.flush2&io/netty/channel/AbstractChannel.flush2/com/wixpress/grpc/ChannelWithErrorLogging.flush2io/grpc/netty/WriteQueue.flush2#io/grpc/netty/WriteQueue.access$0002io/grpc/netty/WriteQueue$1.run2*scala/collection/TraversableLike.grouper$22(scala/collection/TraversableLike.groupBy2)scala/collection/TraversableLike.groupBy$2,scala/collection/AbstractTraversable.groupBy22Hcom/wixpress/framework/tracing/ServerOperations$TracedRestRequest.2Jcom/wixpress/grpc/rest/tracing/RestRequestSpanBuilder.buildTracedOperation2;scala/collection/immutable/Set$SetBuilderImpl.$plus$plus$eq2&scala/collection/TraversableOnce.toSet2'scala/collection/TraversableOnce.toSet$2*scala/collection/AbstractTraversable.toSet2Iio/netty/handler/codec/http2/DefaultHttp2FrameWriter.writeHeadersInternal2Aio/netty/handler/codec/http2/DefaultHttp2FrameWriter.writeHeaders2Bio/netty/handler/codec/http2/Http2OutboundFrameLogger.writeHeaders2Dio/netty/handler/codec/http2/DecoratingHttp2FrameWriter.writeHeaders2Eio/grpc/netty/NettyClientHandler$PingCountingFrameWriter.writeHeaders2Fio/netty/handler/codec/http2/DefaultHttp2ConnectionEncoder.sendHeaders2Hio/netty/handler/codec/http2/DefaultHttp2ConnectionEncoder.writeHeaders02Gio/netty/handler/codec/http2/DefaultHttp2ConnectionEncoder.writeHeaders2@io/netty/handler/codec/http2/StreamBufferingEncoder.writeHeaders23io/grpc/netty/NettyClientHandler.createStreamTraced2-io/grpc/netty/NettyClientHandler.createStream2&io/grpc/netty/NettyClientHandler.write2;io/netty/channel/AbstractChannelHandlerContext.invokeWrite02:io/netty/channel/AbstractChannelHandlerContext.invokeWrite24io/netty/channel/AbstractChannelHandlerContext.write2-io/netty/channel/DefaultChannelPipeline.write2&io/netty/channel/AbstractChannel.write2/com/wixpress/grpc/ChannelWithErrorLogging.write22io/grpc/netty/WriteQueue$AbstractQueuedCommand.run2"com/wix/api/RequestContext.writeTo2&io/netty/util/Recycler$Stack.newHandle2io/netty/util/Recycler.get28io/netty/util/internal/ObjectPool$RecyclerObjectPool.get2:io/netty/buffer/PoolThreadCache$MemoryRegionCache.newEntry25io/netty/buffer/PoolThreadCache$MemoryRegionCache.add2#io/netty/buffer/PoolThreadCache.add2io/netty/buffer/PoolArena.free2(io/netty/buffer/PooledByteBuf.deallocate2=io/netty/buffer/AbstractReferenceCountedByteBuf.handleRelease27io/netty/buffer/AbstractReferenceCountedByteBuf.release2(io/netty/util/ReferenceCountUtil.release2,io/netty/util/ReferenceCountUtil.safeRelease2-io/netty/channel/ChannelOutboundBuffer.remove22io/netty/channel/ChannelOutboundBuffer.removeBytes2-scala/collection/mutable/StringBuilder.2)scala/collection/TraversableOnce.mkString2*scala/collection/TraversableOnce.mkString$2-scala/collection/AbstractTraversable.mkString2;com/wixpress/grpc/xseenby/XSeenByAspect$.$anonfun$encoder$12Gcom/wixpress/grpc/xseenby/XSeenByAspect$$$Lambda$2017/1787608332.encode2"scalapb/descriptors/PString$.apply2'scala/collection/AbstractIterator.toMap2java/nio/DirectByteBuffer.slice2*scala/collection/immutable/Stream.iterator2Jcom/wixpress/ratelimiter/contract/ReportUsageIfEligibleRequest.toByteArray2scalapb/grpc/Marshaller.stream2&io/grpc/MethodDescriptor.streamRequest2java/io/FileInputStream.2/io/grpc/internal/ReflectionLongAdderCounter.add2+io/grpc/internal/CallTracer.reportCallEnded2Cio/grpc/internal/InternalSubchannel$CallTracingTransport$1$1.closed2Bio/grpc/internal/AbstractClientStream$TransportState.closeListener2?io/grpc/internal/AbstractClientStream$TransportState.access$4002:io/grpc/internal/AbstractClientStream$TransportState$1.run2Cio/grpc/internal/AbstractClientStream$TransportState.deframerClosed2?io/grpc/internal/Http2ClientStreamTransportState.deframerClosed2&io/grpc/internal/MessageDeframer.close22io/grpc/internal/MessageDeframer.closeWhenComplete22Hcom/wixpress/framework/aspects/RequestIdAspect$.$anonfun$strictDecoder$22Kcom/wixpress/framework/aspects/RequestIdAspect$$$Lambda$824/292188150.apply2Hcom/wixpress/framework/aspects/RequestIdAspect$.$anonfun$strictDecoder$12Mcom/wixpress/framework/aspects/RequestIdAspect$$$Lambda$801/1971147338.decode24com/wixpress/grpc/Interceptors$.requestIdFromAspects2Bcom/wixpress/grpc/Interceptors$.aspectsWithRequestIdHeaderFallback2Bcom/wixpress/grpc/Interceptors$.$anonfun$maybeRequestAspectsFrom$322?com/fasterxml/jackson/databind/node/TreeTraversingParser.2-io/netty/handler/codec/http2/HpackEncoder.add26io/netty/handler/codec/http2/HpackEncoder.encodeHeader2Nio/netty/handler/codec/http2/HpackEncoder.encodeHeadersIgnoreMaxHeaderListSize2Oio/netty/handler/codec/http2/HpackEncoder.encodeHeadersEnforceMaxHeaderListSize27io/netty/handler/codec/http2/HpackEncoder.encodeHeaders2Eio/netty/handler/codec/http2/DefaultHttp2HeadersEncoder.encodeHeaders2"java/lang/StringCoding.decodeASCII2$io/grpc/Metadata$AsciiKey.parseBytes2io/grpc/Metadata.valueAsT2io/grpc/Metadata.get2Kio/grpc/internal/AbstractClientStream$TransportState.inboundHeadersReceived2Iio/grpc/internal/Http2ClientStreamTransportState.transportHeadersReceived2Kcom/wixpress/grpc/ChannelWithErrorLogging$$Lambda$838/1022675162.get$Lambda2;com/wixpress/grpc/ChannelWithErrorLogging.withErrorListener2&io/grpc/netty/SendGrpcFrameCommand.run2%io/netty/buffer/AbstractByteBuf.slice2)io/netty/buffer/AbstractByteBuf.readSlice2Mio/netty/handler/codec/http2/WeightedFairQueueByteDistributor$1.onStreamAdded2Mio/netty/handler/codec/http2/DefaultHttp2Connection$DefaultEndpoint.addStream2Pio/netty/handler/codec/http2/DefaultHttp2Connection$DefaultEndpoint.createStream2+ch/qos/logback/core/pattern/Converter.write26ch/qos/logback/core/pattern/CompositeConverter.convert22.org/udger/parser/UdgerParser.getRegexFromCache2-org/udger/parser/UdgerParser.fetchDeviceBrand2Fcom/wixpress/framework/tracing/RpcClientOperations$RpcOperation.2@io/netty/util/concurrent/AbstractScheduledEventExecutor.schedule22;io/opencensus/implcore/trace/RecordEventsSpanImpl.startSpan2>io/opencensus/implcore/trace/SpanBuilderImpl.startSpanInternal26io/opencensus/implcore/trace/SpanBuilderImpl.startSpan2:io/grpc/census/CensusTracingModule$ClientCallTracer.26io/grpc/census/CensusTracingModule.newClientCallTracer2Bscala/concurrent/impl/Promise$DefaultPromise.dispatchOrAddCallback2Lch/qos/logback/core/pattern/color/ForegroundCompositeConverterBase.transform2'java/util/regex/Pattern$BitClass.2java/util/regex/Pattern.clazz2Acom/wixpress/framework/logging/StacktraceLogHighlighter.transform2/scala/collection/mutable/StringBuilder.toString20scala/collection/mutable/ArrayOps$ofRef.mkString2com/google/protobuf/struct/Value$$$Lambda$2285/911432546.apply2:com/google/protobuf/struct/Value$.$anonfun$messageReads$142?com/google/protobuf/struct/Value$$$Lambda$2272/1656914594.apply2Vcom/fasterxml/jackson/databind/deser/DefaultDeserializationContext$Impl.createInstance2Hcom/fasterxml/jackson/databind/ObjectMapper.createDeserializationContext2+scala/collection/immutable/Map$Map3.foreach2‹com/wixpress/framework/tracing/builders/OpenTelemetrySpanBuilder$.com$wixpress$framework$tracing$builders$OpenTelemetrySpanBuilder$$addTags2Wcom/wixpress/framework/tracing/builders/OpenTelemetrySpanBuilder.startOpenTelemetrySpan2Fcom/wixpress/framework/tracing/builders/OpenTelemetrySpanBuilder.start2Ascala/collection/TraversableLike$$Lambda$537/992302041.get$Lambda2,io/opencensus/trace/TraceId.generateRandomId2;com/wixpress/grpc/rest/backends/CsrfFilter$HostToken$.apply2%scala/collection/immutable/Stream.map2hcom/wixpress/framework/logging/StacktraceLogHighlighter$FrameworkLine$$$Lambda$261/1972038480.get$Lambda2Ncom/wixpress/framework/logging/StacktraceLogHighlighter$FrameworkLine$.unapply2Ecom/wixpress/framework/logging/StacktraceLogHighlighter.lineColouring2Lcom/wixpress/framework/logging/StacktraceLogHighlighter.$anonfun$transform$12Rcom/wixpress/framework/logging/StacktraceLogHighlighter$$Lambda$258/75636181.apply2'org/udger/parser/WordDetector.findWords2'org/udger/parser/UdgerParser.osDetector2?scala/collection/immutable/NewRedBlackTree$Tree.mutableWithLeft2Dscala/collection/immutable/NewRedBlackTree$Helper.mutableBalanceLeft2+scala/collection/immutable/Map$Map1.foreach2&com/wixpress/grpc/CallScope.withAspect2Ycom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.addMetricWithQuantiles2=io/opencensus/implcore/stats/MeasureMapInternal$Builder.buildp \ No newline at end of file diff --git a/receiver/pyroscopereceiver/testdata/memory_example_live_object.pb b/receiver/pyroscopereceiver/testdata/memory_example_live_object.pb new file mode 100644 index 0000000..f660fcc --- /dev/null +++ b/receiver/pyroscopereceiver/testdata/memory_example_live_object.pb @@ -0,0 +1,1239 @@ + + + + 3 +/ !"#$%& +  +'()*+,- + , +(./0123456789:;<=>?@ABC& + D +@DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeY +Ufghijklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zdec +_—˜™š›œhijklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde + +'./01žŸ ¡¢£¤¥¦§¨©WXYZde +ª«¬­®¯°N +J±²³´µ¶·¸¹º€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeZ +V»¼½¾¿ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde/_ +[ÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZded +`—˜ãäåæç辿ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde9 +5éêëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde9 +5îïëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde? +;ðñòîïëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde@ +<óôõNOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde\ +X—˜ãäåæÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde/ ++./01ö÷øùúû¡¢£¤¥¦§¨©WXYZdeV +R»¼½üýÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde7c +_—˜™š›œhijklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde D +@DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde; +7þÿ€ëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde! +‚ƒ„…†‡ˆ‰Š­®¯°` +\‹ŒŽ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde +•–—˜™š®¯°_ +[›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯ °±²³´µžŸ ¡¢£¤¥¦§¨©WXYZdeS +O¶·£¤¥¦§¨©ª«¬­®¯ °±²³´µžŸ ¡¢£¤¥¦§¨©WXYZde+ +'./01žŸ ¡¢£¤¥¦§¨©WXYZdeL +H¸¹45tuº<=»¼½¾P¿STUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde9 +5ÀêëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde K +GÁÂÃÄÅÆÇÈPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdef +bÁÂÃÄÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeF +B×ØÙÚÛÜÝSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde) +%ÞžŸ ¡¢£¤¥¦§¨©WXYZdeJ +FÄÅÆÇÈÅÆÇÈPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde€ +|ßàáâãäåæçèéêëìâãäåíîïðñ’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde< +8òNOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeY +UóôõöÍ÷ÇÈÄøùúûüýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeN +J…†øùú‡ˆ‰Š‹Œ"ÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde+ +'./01žŸ ¡¢£¤¥¦§¨©WXYZde ^ +Z.Ž‘’lmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde- +)“…†žŸ ¡¢£¤¥¦§¨©WXYZde X +T”•–—˜™š›œžŸøùú‡ˆ‰TUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde` +\—˜™š›œ mnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde C +?¡ÿ€NOPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde_ +[¢È£ÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeh +d¤¥¦§¨©ª«‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde' +#“…¬­¡¢£¤¥¦§¨©WXYZdem +iÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeN +J<=>®¯°±×²³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeZ +V¸¹º»½üýÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde@ +<¼ÔÕÖSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde^ +Z—˜ãäåæ½ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeS +O¾¿ÀÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeD +@DEFÄÅÆÇRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde! +È¡¢£¤¥¦§¨©WXYZde& +".ŽÉÊ¡¢£¤¥¦§¨©WXYZde[ +WË(ÌÍÎÏÐÑÒÓ´µ¶·¸¹º€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zdef +bÔÕÖ×ØÙÚ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde^ +ZÛÜÚ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde +ÝÞßàá]^_`abcXYZde` +\ÄÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdei +e“âãäåæ盜hijklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde1 +-èé³´µžŸ ¡¢£¤¥¦§¨©WXYZdeT +P¼½üýÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde\ +Xê‘ëì“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeV +RíîïðÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde] +Yñòóôõö÷øòùúûüýþüýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde7 +3ÿÿ€€‚×ÞžŸ ¡¢£¤¥¦§¨©WXYZde+ +'ƒÞžŸ ¡¢£¤¥¦§¨©WXYZdeb +^„‹ŒŽ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeX +T./01…ì“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde3 +/†‡ˆ‰ŠÞžŸ ¡¢£¤¥¦§¨©WXYZdeH +D‹Œ<=»¼½¾P¿STUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde3 +/Ž‘ŠÞžŸ ¡¢£¤¥¦§¨©WXYZde- +)’“”•–—˜™š›œžŸ ¡¢£¤¢Q +MDEF¥¦§¨©ª«¬­®¯SÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde! +°±²³´µ¶·¸¹º»¼A +=½ÿ€ÇRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde +.Ž¾¿Àµ¶·¸¹º»¼ +ÁÇÂÀµ¶·¸¹º»¼# +./ÃÄö÷ŵ¶·¸¹º»¼! +./01ö÷ŵ¶·¸¹º»¼! +“…†÷ŵ¶·¸¹º»¼B +>ÄÅÆÇÈPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde +ÁÇÂÀµ¶·¸¹º»¼^ +Z¡ÿ€NOPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeF +B23456789:;<=>?@ABÆUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeg +cÄÅÆÇÈÅÆÇÈËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde# +“…†ÇÈÀµ¶·¸¹º»¼k +gDEFÉÊËÌÍÎÎÎÏÐÑ<=>ÒÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde! +./01ö÷ŵ¶·¸¹º»¼ +ÇÂÀµ¶·¸¹º»¼+ +'ÓÔÕÖ×ØÙÚÛÜݶ·¸¹º»¼! +°±²ÈÀµ¶·¸¹º»¼+ +'Þßàáâ°±²ÈÀµ¶·¸¹º»¼# +./ÃÄö÷ŵ¶·¸¹º»¼- +)ÓÔÕÖ×ØÙÚÛÜã䶷¸¹º»¼C +?“…å}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zdev +rÁÂÃÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde) +%./æçèé±²ÈÀµ¶·¸¹º»¼ +ÁÇÂÀµ¶·¸¹º»¼% +!ÁÇ°±²ÈÀݶ·¸¹º»¼ +êëÜã䶷¸¹º»¼‚ +~ìßàáâãäåæçèéêëìâãäåíîïðñ’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde +¼ÔÕÖí‘’“”•–Zdep +lÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde! +°±²ÈÀµ¶·¸¹º»¼A +=îïðñòóôõö÷øùúûüýúûþÿœžŸ ¡¢£¤¢® +©€€‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢â +Ý£¤¥¦§¨©ª«¬­®¯°±² ³´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢£ +ž…ÑÒÓÔÕÖ×ØÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢È +ÃÄÅÆÇÈÅÆÇÈÅÆÇÈËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ì +Çãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúûüýòþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢} +y‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢C +?“…å‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢+ +'…†žŸ ¡¢£¤¥¦§¨©WXYZde¯ +ª¤¥ò¦§À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ä +ߣ¤¥¦§¨©ª«¬¬­®¯°±² ³´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‘ +ŒÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢° +«º€€‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¬ +§»¼‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +í‘’“”•–Zdeò +í½¾¿ÀÁÂÎÏÐÃÄÅÆÇÈÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢n +jÁÂÃÄÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeµ +°ÓÔÕÖ×ØÙÚÛ¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢³ +®Üñò<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ž +™“ÝÞßàáâã䇈‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢µ +°åñòPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢G +CDEFGHIJKLMNOPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeè +㻼æçèéê×ëìÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ï +ÊÁÂÃÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ü +÷»¼‚íîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢q +mÿ€‚ƒ—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢– +‘ÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢V +R¤¥„…†‡ˆ‰Š‹ŒŽŠ‹‘’“”•–—˜™š›œžZ¢£Ÿ ¡¢£¤¢¥ + Ÿÿ€ ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢— +’¥ñòÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢· +²¦ÿ€§¨©×¦§À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢A +=ª«¬­®óôõö÷øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +Ÿ¯°±ØÙÚ²³P¿S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢° +«º€€‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢G +C´µ¶·¸¹‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢_ +[¢ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde› +–ºÿ€»IJK¼…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢þ +ùª«¬½¾ÎÏÐÑÒÓ´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢› +–¿ÀÁÂÃı²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢9 +5ÅÆÇÈ•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢— +’¥ñòÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¿ +º¯°±ØÙÚ²³PËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ž +‰º€ÉÊËÌÐÑÍ΂íîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ä +ßÏОŸøùúÑÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‚ +ýÌÐÑÍ΂íîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¡ +œÙÚÇÈÄøÜÝ…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢œ +—ÞÄÅÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢º +µßñòàáâãäå½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢× +ÒæçèéÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ÿ +šª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢» +¶êëìôõNOPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢» +¶íîïÓÔÕÖ×ØÙÚÛ¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ú +ÕòØÙÚ²³<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ï +êÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢; +7­®óôõö÷øùúûüýúûþÿœžŸ ¡¢£¤¢  +›DEFGHIJKLMNOPQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢@ +<¡ÿ€NOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeC +?Ž³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeÓ +οÀ9:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢À +»ÄÅÆÇÈÅÆÇÈËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢´ +¯»¼‚ƒÊËtuvÐÑÒÓðñòÿóôõö ÿó÷øùð678ÐÑñòóôõö÷øôõö ÿ²³´µúûüýþÿ¦§¨©WXYZ[\]^_`€‚Zƒ„…£†‡ˆ‰Š‹]ŒŽ‘’“”•–Z[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abc•–—˜™š›œ˜™žŸ ¡¢£¤úûüžúûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢û +öº€ÉÊËÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢e +a¯°±ØÙÚ²³PËÌÍÎÇÈÅÆÇÈÅÆÇÈPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde½ +¸ñòØÙÚ²³<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢é +䥦‚ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ü +×òþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‘ +Œ§±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Þ +Ù¨©¿¨©ª«¬­®¯°±² ³´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ü +÷¥¦‚íîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ú +õª«¬­®¯°±²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +Ÿ¯°±ØÙÚ²³PQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‘ +ŒÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ô +ï¼½¾¿ÀÁÂÃÄÅþþþþþþýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ì +Ç“âÆÇÈÉÊ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ú +õËÌÌÑÍÎÏÐÑ´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ú +õÒÓÔîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢½ +¸òëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ý +øÜñò<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢i +eÕÿ€Ö×ØÙš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‚ +ý“…†ÚÛܬ­®¯°±²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢§ +¢Ýÿ€ÞßàáÄøÜÝ…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢© +¤âÿ€¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢™ +”ãØÙÚÛ±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Q +Mÿäåæçèéêëìíîïðñòóô—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢% +!õöðñò÷øùúûüýþÿ : +6ÆÇRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeW +S€ ‚ ƒ „ … ùúûüýþüýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeZ +V'(Ìijklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde5 +1† †‡ˆ‰ŠÞžŸ ¡¢£¤¥¦§¨©WXYZde^ +Z¸¹º»½¾¿ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zdeb +^ÁÂÃÄÅÆÇÈËÌÍÎÇÈÏÐÑÒÓÔÕÖRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde+ +'‡ ˆ øùúû¡¢£¤¥¦§¨©WXYZde7 +3‰ Š ‹  !"#$%& + k +gÁÂÃÄÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeK +GŒ ßàá]^_`abcŽ ‘ ’ [“ ” • – — #$%& + C +?Äø˜ ¿SÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeE +AòÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeb +^™ ‹ŒŽ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde@ +<¡ÿ€NOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde^ +ZÇ°±²Èklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeG +CDEFGHIJKLMNOPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde= +9‡ ˆ š › œ ò€ ž ×ÞžŸ ¡¢£¤¥¦§¨©WXYZde_ +[Ÿ   ¡ ¢ ò£ ¾¿ÀÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde5 +1‡ ˆ ¤ ‘ŠÞžŸ ¡¢£¤¥¦§¨©WXYZdeU +QÇ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ïëìíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeL +HÄø³ ´ µ ¶ · ¸ RSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde^ +Z…ѹ º » ¼ ½ opqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeM +IÄÅÆÇÈÅÆÇÈPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeO +K£¤¥¦§¨©ª«¬­®¯ °±²³´µžŸ ¡¢£¤¥¦§¨©WXYZdeR +N./01ö÷øùú‡ˆ‰Š‹Œ"ÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde" +./01¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê c +_Ë Ì Í Î Ï Ð Ñ Ò ‚ ƒ „ … ùúûüýþüýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeW +SÁÇÓ Ô Õ Ö × Ø Ù Ú Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ i +eö ÷ ø ù ú û ü ý þ ÿ € + +‚ +ƒ +û ü ý þ ÿ € + +‚ +ƒ +û ü ý þ ÿ „ +ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ T +P.Ž… +† +‡ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ ‹ +Œ + +å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ  +.ŽÉÊŽ +Â Ã Ä Å Æ Ç È É Ê  G +C“…Ñ +ü +ü ý þ ÿ ‘ +’ + +å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ 1 +-./01‘ŠÞžŸ ¡¢£¤¥¦§¨©WXYZde! +ó¡¢£¤¥¦§¨©WXYZde: +6.“ +” +ƒ +û ü ý þ ÿ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ 0 +,.Ž… +† +‡ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ • +ò ó ô õ B +>.– +û ü ý þ ÿ — +˜ +™ +ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ " +“…†¿ À Á Â Ã Ä Å Æ Ç È É Ê   +‡ ˆ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Z +Vš +› +œ + +ØÙÚ²³<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde^ +Zž +Ÿ +  +¡ +¢ +456789:;<=>®¯£ +¤ +×¥ +³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeF +B.¦ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ § +¨ +© +ª +ì ë ì í ì î ì ï ì ð ñ ò ó ô õ " +.“ +” +ƒ +û ü ý þ ÿ ð ñ ò ó ô õ * +&.¦ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ « +ò ó ô õ s +oÁÂÃÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdet +p¬ +­ +çèéêëìâãäåíîïðñ’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeB +>.“ +” +ƒ +û ü ý þ ÿ ® +¯ +° +æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ = +9± +² +RSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeK +GÁÂÃÄø³ ´ QRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeN +J.¦ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ ³ +„ +ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ ; +7Š +÷ ø ù ú û ü ý þ ÿ ´ +é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ E +A./01µ +¶ +ƒ +û ü ý þ ÿ Œ + +å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ H +DÞßà· +¸ +¼½¾P¿STUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde: +6óPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeE +A¹ +º +» +¼ +½ +¾ +¿ +À +ƒ +û ü ý þ ÿ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ d +`¿ÀÁÂÃÄÁ + +²³´µ¶à +Ä +Å +¦§z{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeT +P./01Æ +Ç +Æøùú‡ˆ‰Š‹Œ"ÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeZ +VÈ +(ÌÉ +Õ Ö × Ø Ù Ú Û Ê +Ë +Ì +Í +Î +Ï +Ð +Ñ +á â ã ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ + +'òÞžŸ ¡¢£¤¥¦§¨©WXYZdeZ +VÒ +Ó +ÎÎÏÐÑÒÓ´µ¶·¸¹º€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeH +D.¦ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ Ô +Õ +Ö +× +ª +ì ë ì í ì î ì ï ì ð ñ ò ó ô õ % +!ƒÒÓàá⤥¦§¨©WXYZdeR +NØ +ÎÏÐÑ´µ¶·¸¹º€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde% +!ö ÷ ø ù ú û ü ý þ ÿ ð ñ ò ó ô õ P +L.Ž… +† +‡ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ ä å æ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ E +AÄÅÆÇÈPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde+ +'¹ +º +» +¼ +½ +¾ +¿ +À +ƒ +û ü ý þ ÿ • +ò ó ô õ \ +X.Ž… +† +‡ +ˆ +‰ +Š +÷ ø ù ú û ü ý þ ÿ € + +‚ +ƒ +û ü ý þ ÿ ç è é ê ë ì í ì î ì ï ì ð ñ ò ó ô õ 4 +0.“ +” +ƒ +û ü ý þ ÿ € + +‚ +ƒ +û ü ý þ ÿ Ù +Ú +ò ó ô õ O +KŽúûüýþüýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde_ +[.Ž‘’åæÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeZ +V“…†…ì“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde` +\‹ŒŽ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeG +CDEFGHIJKLMNOPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZden +j./01Û +Ü +Ý +Þ +ß +à +á +â +±²Èklmnopqrs45tuv<=>wxyz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeO +K ¡¢ã +ä +å +ôæ +ç +ýþÿ€‚ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeZ +V¸¹º»½üýÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zdeƒ +è +ÿ€ÐÑñòé +ê +ë +ì +í +î +ï +ð +ñ +ò +ÀŸ   ¡ ¢ ò£ ¾¿ÀÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde7 +3ó +ô +†‡ˆ‰ŠÞžŸ ¡¢£¤¥¦§¨©WXYZdei +eDEFÉÊËÌÍÎÎÏÐÑ<=>ÒÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeb +^õ +‹ŒŽ‘’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeF +B¼ðö +÷ +ø +ù +Z[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde\ +Xú +¸¹º»½üýÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeN +J”•–û +ü +ý +IJKLMNOPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeD +@DEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde^ +Z¸¹º»½¾¿ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde] +Yþ +ÿ +žŸ ¡¢£¤¥¦§¨©ª«¬­®¯ °±²³´µžŸ ¡¢£¤¥¦§¨©WXYZdeP +L€ ñò ‚ ƒ ª«¬­®¯SÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde> +:¼½¾P¿STUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeP +LÁÂÃÄÅÆÇÈÅÆÇÈPQRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde\ +X”•–û +ü +ý +IJKLM„ … † ÄÅÆÇÈPQRSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeo +k‡ ñòˆ Ðщ Š é +ê +‹ Œ Ž ‘ ’ “ ” §¨©ª«¬­®¯ °±²³´µžŸ ¡¢£¤¥¦§¨©WXYZdeé +䀂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +˜DEFÄÅÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +ŸææçèéÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢A +=• – — ˜ ™ óôõö÷øùúûüýúûþÿœžŸ ¡¢£¤¢– +‘óP¿S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¡ +œ¯°±ØÙÚ²³ÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢7 +3ª«¬½š ³´µžŸ ¡¢£¤¥¦§¨©WXYZde± +¬› œ Äž Ÿ À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢§ +¢  ¡ ¢ ð ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢» +¶£ îïÓÔÕÖ×ØÙÚÛ¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢– +‘ÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢? +;¤ ¥ ¦ § ¨ © ª •–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢û +öË(ÌÍÎÏÐÑÒÓ´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +˜DEFÄÅÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢µ +°« ¬ NOPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ô +Ï­ ® ¯ ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¯ +ªêëìž Ÿ À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +˜DEFÄÅÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ê +Å»¼‚ƒÊË6789:;ÐÑÒÓÔÕÖåæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢g +cDEFÉÊËÌÍÎÏÐÑ<=>ÒÁÂÃŒŽ³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde¨ +£± ² ³ ÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ñ +̼ÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ü +×£þãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢´ +¯¿À9:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ž +™´ µ ¶ · ¸ ¹ º ÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢± +¬» ¼ ½ ÁÂÃĨ©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢€ +û‡ ˆ ÚÛܬ­®¯°±²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +¾ ñò‘’“”•–ZdeÜ +×ñòØÙÚ²³<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢  +›DEFGHIJKLMNOPQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¹ +´ãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢þ +ù꾿ܬ­®¯°±²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¾ +¹è +ÿ€ÐÑÒÓÔÕÖåæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ø +Óãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢é +ä¿ À ‚ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢€ +ûÁ Â Ã Ä Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +˜ÁÂÃÄøÝ…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢? +;èÓ Ô ’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢ä +ß./01Æ +Ç +ÆøùúÕ ÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢» +¶¿ÀÖ × Ø Ö×Ù ¥¦§¨«¬¬ª«¬­®¯S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢x +tDEFÉÊËÌÍÎÏÐÑ<=>ÒÁÂá +¢ +456789:;<=>®¯°±×²³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZdeW +S“…ÑÚ Û Ü Ý Þ ß à á â ã ¹‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢ü +÷ä ÒÓÔîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ö +ñÿå æ ç è é ²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢e +aÄÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde• +»IJK¼…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢® +©DEF¥¦§¨«¬¬ª«¬­®¯S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢€ +ûÞê ë Æì í î ï ð ÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ƒ +þñ )*+,-ò ó Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢â +Ýô ñò®¯õ ö ×÷ ¯ ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢„ +ÿ“âÆÇä ÒÓÔîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‚ +ý¿ÀÁÂÃÄž Ÿ À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹ª«¬­®ø ù ×ú û À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢­ +¨ãä456789:;<=>åæçü ý þ ð678ÐÑñòóôõö÷øÿ ãä456789:;<=>åæ€ ‚ ƒ òþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢î +éñò„ … é +ê +ë +ì +í +î +ï +† üýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢| +xáâãäåæçèéêëìâãäåíîïðñ’“”ÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–Zde€ +û‡ ê ë Æì í î ï ð ÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢\ +X.Ž… +† +‡ +ˆ +‰ +Š +÷ ø ù ˆ à á â ã ¹‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢ +ˆ£ îïÓùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +Ÿ‰ Š ‚ƒÏÐÑÒÓÔÕÖì ‡ ‹ Œ Æ ‡ ê ë Æì í î ï ð ÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢@ +<ÞÄÅÆÇRSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeŽ +‰è +ÿ€ÐÑÒÓðŽ Ž‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +Ÿ“…Ñ‘ ’ ¼½¾P¿S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ü +×ÅÆÇÈÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢” +º€€‚ƒÏÐÑÒÓÔÕÖì í î ï ð ÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢† +“ ñò‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢® +©º€€‚ƒÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢u +q” ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¾ +¹º€ÉÊËÌÐÑÍ΂ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ê +ʼn Š ‚ƒÊË6789:;ÐÑÒÓÔÕÖåæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ä +ß./ÃÄö÷øùúÑÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ù +ô€ÉÊËÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ä +¿º€ÉÊËÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúûüýòþãä456789:;<=>åæçü ý þ ð678ÐÑñòóôõö÷øÿ ãä456789:;<=>åæ€ ‚ ƒ òþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢k +g• – — ˜ ™ š › œ ž Ÿ   ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ö÷øúûüýúûþÿœžŸ ¡¢£¤¢G +C³ ´ ¶·¸¹‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢G +C´µ¶·¸¹‘’“†”•–—˜™š›œžŸ ¡¢£Ÿ ¡¢£¤¢Ð +Ë“µ ¶ · ¸ ÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢µ +°« ¬ NOPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢§ +¢Þ¹ º ð ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ð +ë» ¼ ò½ ¾ ¿ À Á  òùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢E +AÃ Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù ¢£Ÿ ¡¢£¤¢… +€ùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢W +SÚ Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð í î ï ñ ò ó × Ø Ù ¢£Ÿ ¡¢£¤¢A +=ô õ ö ­ ® ¯ ° ± ² ö÷øúûüýúûþÿœžŸ ¡¢£¤¢ +˜DEFÄÅÆÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¹ +´ÄÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢| +x÷ û +ü +ý +IJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢) +%ø ÿ€ù Õ ú × Ø Ù ¢£Ÿ ¡¢£¤¢¬ +§€‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢… +€òØÙÚ²³<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Á +¼ÄÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¤ +ŸææçèéÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ò +Íû òþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúûüýòþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¥ + Ÿÿ€ ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢‘ +Œº€€‚ƒÊË678ÐÑÒÓÔÕü ¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¾ +¹¥ñòÙÚÇÈÄÅÆÇÈÏÐÑý þ é +ê +‹ ÿ € Ý…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢® +©€€‚ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ú +õ‚ ƒ „ … Ø +ÎÏÐÑ´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢™ +”† ‡ ˆ ‰ S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢a +]Š ‹ Œ Ž ‘ ’ “ ” • – — ˜ ™ š › ö ­ ® ¯ ° ± ² ö÷øúûüýúûþÿœžŸ ¡¢£¤¢I +Eœ ž É Ÿ   Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù ¢£Ÿ ¡¢£¤¢Ÿ +šº€ÉÊËÌÐÑÍ΂ƒÊË678ÐÑÒÓÔÕü ¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢U +Q¡ ¢ £ ¤ ¥ ¦ œ ž É Ÿ   Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö × Ø Ù ¢£Ÿ ¡¢£¤¢€ +ûº€€‚íîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢è +ãÎÎÎÏЧ ÅÆÇÈÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢M +I¨ © ª « ¬ ­ ® ¯ ° è é ê ë ì í î ï ð í î ï ñ ò ó × Ø Ù ¢£Ÿ ¡¢£¤¢£ +ž¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +Š±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢± +¬± PËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢² +­¼ÔÕÖåæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢É +ÄÄÅÆÇÈÅÆÇÈÅÆÇÈPËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢A +=ª«¬­®óôõö÷øùúûüýúûþÿœžŸ ¡¢£¤¢§ +¢  ¡ ¢ ð ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¾ +¹² ² ² ² ³ ´ «¬ž +Ÿ +  +µ ¶ · ³ ÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢§ +¢¥ñòÙÚÇÈÄøÜÝ…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Â +½‡ ˆ ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È "É ÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢E +AÊ ­ ® ¯ ° è é ê ë ì í î ï ð í î ï ñ ò ó × Ø Ù ¢£Ÿ ¡¢£¤¢ +˜Ë ÔÕÖ×ØÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ù +ô€ÉÊËÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¯ +ª<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢„ +ÿ“âÆÇä ÒÓÔîïðñòóôõö÷øòùúûüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢a +]“Ì ÆÇÍ Î Ï Ð Ñ Ò ¤ ¥ ¦ § ¨ © ª « ¬ ­ ® ¯ ° ± ² ö÷øúûüýúûþÿœžŸ ¡¢£¤¢ð +ëÅÆÓ Ô Õ Ö ÄÅþþþþþþýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢² +­× Ø Ù Ú Â Ã Ä Å Æ Ç È "É ÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Æ +ÁÛ Ü Ý Ò´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¡ +œ¯°±ØÙÚ²³ÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢& +"./01Þ ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê  ( +$“…†Þ ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê  ¿ +º¿À9:;ÐÑÒÓÔÕÖåæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢` +\DEFà á ÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeî +éâ ã ² ² ² ² ³ ´ ä ž +Ÿ +å ÈÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢† +æ ç è é ê Ã Ä Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢6 +2…†ë º » ì ½ ¾ í î ï ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ± +¬¯°±ØÙÚ²³ÙÚÇÈÄøÜÝ…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢œ +—‚ƒ„…†‡‰Šð ñ ò ç è é ê Ã Ä Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¼ +·€ÉÊËÌÐÑÍ΂ƒÏÐÑÒÓÔÕÖÇRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢† +ò ç è é ê Ã Ä Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢& +"./01¾ ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Þ +Ù‡ ˆ øùúÕ ÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ÿ +š ¡¢£¤ÇÈÙÚÇÈÄÅÆÇÈÛÜÝÞßIJKàáâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢4 +0DEFíÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeæ +á…ÑË Ì Í Î Ï † üýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ƒ +Ë Ì Í Î Ï ó Ö×Øô áâ•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢è +ã“…ÑË Ì Í Î Ï † üýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢a +]ÁÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZde8 +4¸ RSTUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZde. +*õ ö ÷ Ë Ì î ï ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê ô +ïø ù ú û ü ²³´µ¶·¸¹º»¶ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢& +"./01Þ ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê þ +ùý ¶·ò¸¹ª«¬­®ø ù ×ú û À¨©456789:;<=>³´¬­µþ ÿ ò€ª«¬­®‚ƒ×„…À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢6 +2†‡ˆ‰õ ö ÷ Ë Ì î ï ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê â +ÝË Ì Í Î Ï † üýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Æ +ÁÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ÿ +úŠò ó Å Ä Æ Ä Ç È Ä É Ê Ä Ë Ì Ä Í Î Ä Ï Ð Ñ Ò Ä ° ÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¯ +ª¿ÀÁÂÃĨ©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢µ +°¿ÀÁÂÃÄž Ÿ À¨©ª«¬­®¯°×±²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢& +"“…†ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê " +./01‹¿ À Á Â Ã Ä Å Æ Ç È É Ê  ¤ +ŸÁÂÃÄÅÆÇÈPQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¬ +§DEF¥¦§¨«¬ª«¬­®¯S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢b +^'(ÌŒº»½¾¿ÀÁÂÃÄņÆz{|}~€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeR +NŽÑÒÓ´µ¶·¸¹º€‚IJƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–ZdeP +L…†÷øùú‡ˆ‰Š‹Œ"ÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeà +Û…†øùüýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ú +Õ./01‘ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ì +çÞßàáâË Ì Í Î Ï † üýþËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢— +’ñò’óôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ï +ê¿ À ‚ƒÊËtuvÐÑÒÓð‘ÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¡ +œãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúûüýòþãä456789:;<=>åæçü ý þ ð678ÐÑñòóôõö÷øÿ ãä456789:;<=>åæ€ ‚ ƒ òþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢; +7¸ RSÉÊUVWXYZ[\]^_`abcXYZ[\]^_`abcXYZ[\]^_`abcXYZdeã +ÞÌÐÑÍ΂ƒÊË6789:;ÐÑÒÓÔÕÖåæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúûüýòþãä456789:;<=>åæçèéêòëãä456789:;<=>åæìíîïð678ÐÑñòóôõö÷øùãä456789:;<=>åæúÿ²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Î +ÉÁÂÃÄÅÆÇÈÅÆÇÈÅÆÇÈËÌÍÎÇÈÏÐÑÒÓÔÕÖRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢— +’› œ ı²456789:;<=>³´¬­µ¶·ò¸¹²³´µ€‚ƒ„…†‡ˆ€‚ƒ„…¶·‰Š´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ +˜“ÿ€ª«¬S„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ô +ÏÑÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢à +Û“…†øùúÑÒÓÔÕÖ×ØÙÚÛ´µ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Ž +‰…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢’ +ÆÇRSTUVWXYZ[\]”” ´ µ ¶ ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢¦ +¡ÄÅÆÇÈÅÆÇÈPQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢J +FŒ ßàá]^_`€‚Zƒ„…£†‡ˆ‰Š‹]ŒŽ‘’“”•–Zdek +g•–ˆ‰õ ö —˜™ÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÒÓÙÚÛÐÜÝ×ÞÌßÒÓàá⤥¦§¨©WXYZdeÜ +ך›œÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢Z +VòØÙÚ²³<=>®¯°±×²³´µ¶·ƒ„¦§¨©WXYZ[\]^_`abcXYZ[\]^_`abcXYZde< +8žÿ€Ÿ ¡¢45tuº<=»î ï ß ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê œ +—¡ÿ€NOPQRS„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢ê +åÎÎÎÏÐÃÄÅÆÇÈÉÊËÌÍÎÏÐѶҴµ¶·¸¹¶º»¼†½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏЋŒŽ‘’“”•–—˜™úûüš›™úûüœ™úûüžúûüŸ úûü¡¢øùúûüýúûþÿœžŸ ¡¢£¤¢""""""""""""""""" " " +" +" " " " " " """"""""""""""""""""""""""""""""""""" " "!"!"""""#"#"$"$"%"%"&"&"'"'"("(")")"*"*"+"+",","-"-"."."/"/"0"0"1"1"2"2"3"3"4"4"5"5"6"6"7"7"8"8"9"9":":";";"<"<"="=">">"?"?"@"@"A"A"B"B"C"C"D"D"E"E"F"F"G"G"H"H"I"I"J"J"K"K"L"L"M"M"N"N"O"O"P"P"Q"Q"R"R"S"S"T"T"U"U"V"V"W"W"X"X"Y"Y"Z"Z"["["\"\"]"]"^"^"_"_"`"`"a"a"b"b"c"c"d"d"e"e"f"f"g"g"h"h"i"i"j"j"k"k"l"l"m"m"n"n"o"o"p"p"q"q"r"r"s"s"t"t"u"u"v"v"w"w"x"x"y"y"z"z"{"{"|"|"}"}"~"~"""€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢"£"£"¤"¤"¥"¥"¦"¦"§"§"¨"¨"©"©"ª"ª"«"«"¬"¬"­"­"®"®"¯"¯"°"°"±"±"²"²"³"³"´"´"µ"µ"¶"¶"·"·"¸"¸"¹"¹"º"º"»"»"¼"¼"½"½"¾"¾"¿"¿"À"À"Á"Á"Â"Â"Ã"Ã"Ä"Ä"Å"Å"Æ"Æ"Ç"Ç"È"È"É"É"Ê"Ê"Ë"Ë"Ì"Ì"Í"Í"Î"Î"Ï"Ï"Ð"Ð"Ñ"Ñ"Ò"Ò"Ó"Ó"Ô"Ô"Õ"Õ"Ö"Ö"×"×"Ø"Ø"Ù"Ù"Ú"Ú"Û"Û"Ü"Ü"Ý"Ý"Þ"Þ"ß"ß"à"à"á"á"â"â"ã"ã"ä"ä"å"å"æ"æ"ç"ç"è"è"é"é"ê"ê"ë"ë"ì"ì"í"í"î"î"ï"ï"ð"ð"ñ"ñ"ò"ò"ó"ó"ô"ô"õ"õ"ö"ö"÷"÷"ø"ø"ù"ù"ú"ú"û"û"ü"ü"ý"ý"þ"þ"ÿ"ÿ"€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ +"€ +" +" +"‚ +"‚ +"ƒ +"ƒ +"„ +"„ +"… +"… +"† +"† +"‡ +"‡ +"ˆ +"ˆ +"‰ +"‰ +"Š +"Š +"‹ +"‹ +"Œ +"Œ +" +" +"Ž +"Ž +" +" +" +" +"‘ +"‘ +"’ +"’ +"“ +"“ +"” +"” +"• +"• +"– +"– +"— +"— +"˜ +"˜ +"™ +"™ +"š +"š +"› +"› +"œ +"œ +" +" +"ž +"ž +"Ÿ +"Ÿ +"  +"  +"¡ +"¡ +"¢ +"¢ +"£ +"£ +"¤ +"¤ +"¥ +"¥ +"¦ +"¦ +"§ +"§ +"¨ +"¨ +"© +"© +"ª +"ª +"« +"« +"¬ +"¬ +"­ +"­ +"® +"® +"¯ +"¯ +"° +"° +"± +"± +"² +"² +"³ +"³ +"´ +"´ +"µ +"µ +"¶ +"¶ +"· +"· +"¸ +"¸ +"¹ +"¹ +"º +"º +"» +"» +"¼ +"¼ +"½ +"½ +"¾ +"¾ +"¿ +"¿ +"À +"À +"Á +"Á +" +" +"à +"à +"Ä +"Ä +"Å +"Å +"Æ +"Æ +"Ç +"Ç +"È +"È +"É +"É +"Ê +"Ê +"Ë +"Ë +"Ì +"Ì +"Í +"Í +"Î +"Î +"Ï +"Ï +"Ð +"Ð +"Ñ +"Ñ +"Ò +"Ò +"Ó +"Ó +"Ô +"Ô +"Õ +"Õ +"Ö +"Ö +"× +"× +"Ø +"Ø +"Ù +"Ù +"Ú +"Ú +"Û +"Û +"Ü +"Ü +"Ý +"Ý +"Þ +"Þ +"ß +"ß +"à +"à +"á +"á +"â +"â +"ã +"ã +"ä +"ä +"å +"å +"æ +"æ +"ç +"ç +"è +"è +"é +"é +"ê +"ê +"ë +"ë +"ì +"ì +"í +"í +"î +"î +"ï +"ï +"ð +"ð +"ñ +"ñ +"ò +"ò +"ó +"ó +"ô +"ô +"õ +"õ +"ö +"ö +"÷ +"÷ +"ø +"ø +"ù +"ù +"ú +"ú +"û +"û +"ü +"ü +"ý +"ý +"þ +"þ +"ÿ +"ÿ +"€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€ "€ " " "‚ "‚ "ƒ "ƒ "„ "„ "… "… "† "† "‡ "‡ "ˆ "ˆ "‰ "‰ "Š "Š "‹ "‹ "Œ "Œ " " "Ž "Ž " " " " "‘ "‘ "’ "’ "“ "“ "” "” "• "• "– "– "— "— "˜ "˜ "™ "™ "š "š "› "› "œ "œ " " "ž "ž "Ÿ "Ÿ "  "  "¡ "¡ "¢ "¢ "£ "£ "¤ "¤ "¥ "¥ "¦ "¦ "§ "§ "¨ "¨ "© "© "ª "ª "« "« "¬ "¬ "­ "­ "® "® "¯ "¯ "° "° "± "± "² "² "³ "³ "´ "´ "µ "µ "¶ "¶ "· "· "¸ "¸ "¹ "¹ "º "º "» "» "¼ "¼ "½ "½ "¾ "¾ "¿ "¿ "À "À "Á "Á " " "à "à "Ä "Ä "Å "Å "Æ "Æ "Ç "Ç "È "È "É "É "Ê "Ê "Ë "Ë "Ì "Ì "Í "Í "Î "Î "Ï "Ï "Ð "Ð "Ñ "Ñ "Ò "Ò "Ó "Ó "Ô "Ô "Õ "Õ "Ö "Ö "× "× "Ø "Ø "Ù "Ù "Ú "Ú "Û "Û "Ü "Ü "Ý "Ý "Þ "Þ "ß "ß "à "à "á "á "â "â "ã "ã "ä "ä "å "å "æ "æ "ç "ç "è "è "é "é "ê "ê "ë "ë "ì "ì "í "í "î "î "ï "ï "ð "ð "ñ "ñ "ò "ò "ó "ó "ô "ô "õ "õ "ö "ö "÷ "÷ "ø "ø "ù "ù "ú "ú "û "û "ü "ü "ý "ý "þ "þ "ÿ "ÿ "€"€"""‚"‚"ƒ"ƒ"„"„"…"…"†"†"‡"‡"ˆ"ˆ"‰"‰"Š"Š"‹"‹"Œ"Œ"""Ž"Ž"""""‘"‘"’"’"“"“"”"”"•"•"–"–"—"—"˜"˜"™"™"š"š"›"›"œ"œ"""ž"ž"Ÿ"Ÿ" " "¡"¡"¢"¢******* * +*  * + *  * * ****************** * !*!"*"#*#$*$%*%&*&'*'(*()*)***+*+,*,-*--*..*//*00*11*22*33*44*55*66*77*88*99*::*;;*<<*==*>>*??*@@*AA*BB*CC*DD*EE*FE*GF*HF*IG*JH*KI*LJ*MK*NL*OM*PN*QO*RP*SQ*TR*US*VS*WT*XU*YV*ZW*[X*\Y*]Z*^[*_\*`]*a^*b_*c`*da*eb*fc*gd*he*if*jg*kh*li*mj*nk*ol*pl*qm*rn*so*tp*uq*vr*ws*xt*yu*zv*{w*|x*}y*~z*{*€|*}*‚}*ƒ~*„*…€*†*‡‚*ˆƒ*‰„*Š…*‹†*Œ‡*ˆ*Ž‰*Š*‹*‘Œ*’*“Ž*”*•*–‘*—’*˜“*™”*š•*›–*œ—*˜*ž™*Ÿš* ›*¡œ*¢*£ž*¤Ÿ*¥ *¦¡*§¢*¨£*©¤*ª¥*«¦*¬§*­¨*®©*¯©*°ª*±«*²¬*³¬*´­*µ­*¶®*·¯*¸°*¹±*º²*»³*¼´*½µ*¾¶*¿·*À¸*Á¹*º*û*ļ*Ž*ƾ*Ç¿*ÈÀ*ÉÁ*ÊÂ*ËÃ*ÌÄ*ÍÅ*ÎÆ*ÏÇ*ÐÈ*ÑÉ*ÒÊ*ÓË*ÔÉ*ÕÌ*ÖÍ*×Î*ØÏ*ÙÏ*ÚÐ*ÛÑ*ÜÒ*ÝÓ*ÞÔ*ßÕ*àÕ*áÖ*â×*ãØ*äÙ*åÙ*æÚ*çÛ*èÜ*éÝ*êÞ*ëß*ìà*íá*îâ*ïã*ðä*ñå*òæ*óç*ôè*õé*öê*÷ë*øì*ùí*úA*ûî*üï*ýð*þñ*ÿå*€æ*ò*‚ò*ƒó*„ô*…ô*†ô*‡õ*ˆö*‰÷*Šø*‹ù*Œú*û*Žü*ý*þ*‘ÿ*’€*“*”‚*•ƒ*–„*—…*˜†*™‡*šˆ*›‰*œå*æ*žŠ*ŸŠ* ‹*¡Œ*¢*£Ž*¤*¥*¦‘*§’*¨“*©“*ª”*«”*¬•*­–*®—*¯˜*°Œ*±™*²š*³›*´œ*µœ*¶*·ž*¸Ÿ*¹ *º¡*»¢*¼£*½¤*¾¥*¿¦*À§*Á¨*©*ê*Ä«*Ŭ*Æ­*Ç®*È®*ɯ*Ê°*˱*̲*ͳ*δ*ϵ*ж*Ñ·*Ò¸*Ó¸*Ô¹*Õº*Ö»*×¼*ؽ*Ù¾*Ú¿*ÛÀ*ÜÁ*ÝÂ*ÞÃ*ßÄ*àÅ*áÆ*âÇ*ãÈ*äÉ*åÊ*æË*çË*èÌ*éÍ*êÎ*ëÏ*ìÐ*íÑ*îÒ*ïÓ*ðÔ*ñÕ*òÖ*ó×*ôØ*õÙ*öÚ*÷Û*ø«*ùÜ*úÝ*ûÞ*üß*ýà*þá*ÿâ*€ã*ä*‚å*ƒæ*„æ*…ç*†è*‡é*ˆê*‰A*Šë*‹ì*Œí*î*Žï*ð*ñ*‘ò*’ó*“ô*”õ*•ö*–÷*—ø*˜ù*™ú*šû*›ü*œý*þ*žÿ*Ÿ€* *¡‚*¢ƒ*£„*¤…*¥…*¦†*§‡*¨ˆ*©‰*ªŠ*«‹*¬Œ*­*®Ž*¯*°*±‘*²’*³“*´”*µ•*¶–*·—*¸˜*¹™*ºš*»š*¼›*½œ*¾*¿ž*ÀŸ*Á *¡*â*Ä£*Ť*Æ¥*Ǧ*ȧ*Éð*Êñ*˨*Ì©*ͪ*Ϋ*Ϭ*Ь*Ñ­*Ò®*Ó¯*Ô°*Õ±*Ö²*׳*Ø´*Ùµ*Ú¶*Û·*ܸ*ݹ*Þº*ß»*à¼*á½*â¾*ã¿*äÀ*åÀ*æÁ*çÂ*èÃ*éÄ*êÅ*ëÆ*ìÇ*íÈ*îÉ*ïÊ*ðË*ñÌ*òÍ*óÎ*ôÏ*õÐ*öÑ*÷Ò*øÓ*ùÔ*úÕ*ûÖ*ü×*ýØ*þÙ*ÿÚ*€Û*Ü*‚Ý*ƒÞ*„ß*…à*†á*‡â*ˆã*‰ä*Šå*‹æ*Œæ*ç*Žè*é*ê*‘ë*’ì*“í*”î*•ï*–ð*—ð*˜ñ*™ò*šó*›ô*œõ*ö*ž÷*Ÿø* ù*¡ú*¢û*£ü*¤ý*¥þ*¦þ*§ÿ*¨€*©*ª‚*«ƒ*¬„*­…*®†*¯‡*°ˆ*±‰*²‰*³Š*´‹*µŒ*¶*·Ž*¸*¹*º‘*»’*¼“*½”*¾ð*¿ñ*À•*Á–*—*Ã0*Ä1*Ř*Æ™*Çš*ÈŠ*É›*Êœ*Ë*Ìž*ÍŸ*Π*Ï¡*Т*Ñ£*Ò¤*Ó.*Ô¥*Õ¦*Ö¦*ק*ب*Ù©*Úª*Ûª*Ü«*ݬ*Þ.*ß­*à­*á®*â®*ã¯*ä°*å±*æ0*ç1*è1*é²*ê³*ë´*ìµ*íŒ*î¶*ï·*ð¸*ñ¹*òº*ó»*ô¼*õ½*ö¾*÷¿*øÀ*ùÁ*úÂ*ûÂ*üÃ*ýÄ*þÅ*ÿÆ*€Ç*È*‚É*ƒÉ*„Ê*…Ë*†Ë*‡Ì*ˆÍ*‰Î*ŠÏ*‹Ð*ŒÐ*Ñ*ŽÒ*Ó*Ô*‘Õ*’Ö*“×*”Ø*•Ù*–Ú*—Û*˜Û*™Ü*šÝ*›Ý*œÞ*Þ*žß*Ÿà* á*¡â*¢ã*£ä*¤å*¥æ*¦ç*§è*¨é*©ê*ªë*«ì*¬í*­î*®ï*¯ð*°ñ*±ò*²ó*³ô*´õ*µö*¶÷*·ø*¸ù*¹ú*ºû*»ü*¼ý*½þ*¾ÿ*¿€*À*Á‚*ƒ*Ä*Ä…*ņ*Ƈ*Lj*ȉ*ÉŠ*Ê‹*ËŒ*Ì*ÍŽ*Î*Ï*Б*ѱ*Ò’*Ó“*Ô“*Õ”*Ö•*×–*Ø—*Ù˜*Ú™*Ûš*Ü›*Ýœ*Þ*ßž*àŸ*áŸ*â *ã¡*ä¢*å£*æ¤*ç¥*è¦*é§*ê¨*ë©*ìª*í«*î¬*ï­*ð®*ñ¯*ò¯*ó°*ô±*õ²*ö³*÷´*øµ*ù¶*ú·*û¸*ü¹*ýº*þ»*ÿ¼*€½*¾*‚¿*ƒÀ*„Á*…Â*†Ã*‡Ã*ˆÄ*‰Å*ŠÆ*‹Ç*ŒÈ*É*ŽÊ*Ë*Ì*‘Í*’Î*“Ï*”Ð*•Ñ*–Ñ*—Ò*˜Ó*™Ô*šÕ*›Ö*œ×*Ø*žÙ*ŸÚ* Û*¡Ü*¢Ý*£Þ*¤ß*¥ß*¦à*§á*¨â*©ã*ªä*«å*¬æ*­ç*®è*¯é*°ê*±ë*²ì*³í*´î*µï*¶ð*·ñ*¸ò*¹ó*ºô*»õ*¼ö*½÷*¾ø*¿ù*Àú*Áû*Âü*Ãý*Äþ*Åÿ*Æ€*Ç*È‚*Ƀ*Ê„*Ë…*̆*͇*Έ*ω*Њ*Ñ‹*ÒŒ*Ó*ÔŽ*Õ*Ö*ב*Ø’*Ù“*Ú”*Û•*Ü–*Ý—*Þ˜*ߘ*à™*áš*â›*ãœ*ä*åž*æŸ*çŸ*è *é¡*ê¢*ë£*ì¤*íÉ*î¥*ï¥*ð¦*ñ§*ò¨*ó©*ô§*õ¨*ö©*÷ª*ø«*ù¬*ú­*û®*ü¯*ý°*þ±*ÿ²*€³*³*‚³*ƒ´*„†*…‡*†µ*‡¶*ˆ·*‰¸*Š¹*‹º*Œ»*¼*Ž½*º*¾*‘¿*’À*“À*”Á*•Â*–Ã*—Ä*˜Å*™Å*šÆ*›Æ*œÇ*È*žÉ*ŸÊ* Ë*¡Ì*¢Í*£Î*¤Ï*¥Ð*¦Ñ*§Ò*¨Ó*©Ô*ªÕ*«À*¬À*­Ö*®×*¯Ø*°Ù*±Ú*²Û*³Û*´Ü*µÜ*¶Ý*·Þ*¸ß*¹à*ºá*»â*¼ã*½ä*¾å*¿æ*Àæ*Áç*Âè*Ãé*Äê*Åë*Æì*Çì*Èì*ÉÈ*Êí*Ëî*Ìï*Íð*Îñ*Ïò*Ðó*Ñô*Òõ*Óö*Ô÷*Õø*Öù*×ú*Øû*Ùü*Úý*Ûþ*Üÿ*Ý€*Þ*ß‚*àƒ*á„*â…*ã†*ä‡*åˆ*æ‰*çŠ*è‹*é‹*êŒ*ë*ìŽ*í*î*ï‘*ð’*ñ“*ò”*ó•*ô–*õ—*ö˜*÷™*øš*ù›*úœ*û*ü*ýž*þŸ*ÿ *€¡*¢*‚£*ƒ¤*„¥*…¦*†§*‡¨*ˆ©*‰ª*Š«*‹¬*Œ­*®*Ž¯*°*±*‘²*’³*“´*”µ*•¶*–·*—¸*˜¹*™º*š»*›¼*œ½*¾*ž¿*ŸÀ* Á*¡Â*¢Ã*£Ä*¤Å*¥Æ*¦Ç*§È*¨É*©Ê*ªË*«Ì*¬Í*­Î*®Ï*¯Ð*°Ñ*±Ò*²Ó*³Ô*´Õ*µÖ*¶×*·Ø*¸Ù*¹Ú*ºÛ*»Ü*¼Ý*½Þ*¾ß*¿à*Àá*Áâ*Âã*Ãä*Äå*Åæ*Æ¿*ÇÀ*Èç*Éè*Êé*Ëê*Ìë*ͯ*Îì*Ïí*Ðî*Ñï*Òð*Óð*Ôñ*Õò*Öó*×ô*Øõ*Ùö*Ú÷*Û÷*Üø*Ýù*Þú*ßû*àü*áý*âþ*ãÿ*ä€*å*æ‚*çƒ*è„*é…*ê†*ë†*ì‡*íˆ*îˆ*ïˆ*ð‰*ñŠ*ò‹*óŒ*ô*õŽ*öŽ*÷*ø§*ù¨*ú*û*ü*ý‘*þ’*ÿ“*€ ”* •*‚ –*ƒ —*„ ˜*… ™*† š*‡ ›*ˆ œ*‰ *Š ž*‹ Ÿ*Œ  * ¡*Ž ¢* £* ¤*‘ ¥*’ ¦*“ §*” ¨*• ©*– ª*— «*˜ ¬*™ .*š ­*› ®*œ ¯* °*ž ±*Ÿ ²*  ³*¡ ´*¢ µ*£ ¶*¤ ·*¥ ¸*¦ ¹*§ º*¨ »*© ¼*ª ½*« ¾*¬ ¿*­ À*® Á*¯ Â*° Ã*± Ã*² Ä*³ Å*´ Æ*µ Ç*¶ È*· É*¸ Ê*¹ Ë*º Ì*» Í*¼ Î*½ Ï*¾ Ð*¿ Ñ*À Ò*Á Ò* Ó*à Ô*Ä Õ*Å Ö*Æ ×*Ç Ø*È Ù*É Ú*Ê Û*Ë Ü*Ì Ü*Í Ý*Î Þ*Ï ß*Ð à*Ñ á*Ò â*Ó ã*Ô ã*Õ ä*Ö å*× æ*Ø ç*Ù è*Ú é*Û ê*Ü ë*Ý ì*Þ í*ß î*à ï*á ð*â ñ*ã ñ*ä ò*å ó*æ ô*ç õ*è ö*é ÷*ê ø*ë ù*ì ú*í û*î ü*ï ý*ð þ*ñ ÿ*ò € *ó  *ô ‚ *õ ƒ *ö „ *÷ … *ø † *ù ‡ *ú ˆ *û ‰ *ü Š *ý ‹ *þ Œ *ÿ  *€ +Ž * + *‚ + *ƒ +‘ *„ +’ *… +“ *† +” *‡ +• *ˆ +– *‰ +— *Š +˜ *‹ +™ *Œ +š * +› *Ž +œ * + * +Š *‘ +ž *’ +Ÿ *“ +  *” +¡ *• +¢ *– +£ *— +¤ *˜ +¥ *™ +¦ *š +§ *› +¨ *œ +¨ * +© *ž +ª *Ÿ +ª *  +« *¡ +¬ *¢ +­ *£ +® *¤ +¯ *¥ +° *¦ +± *§ +² *¨ +³ *© +´ *ª +µ *« +¶ *¬ +· *­ +¸ *® +¹ *¯ +º *° +» *± +¼ *² +¼ *³ +½ *´ +¾ *µ +¿ *¶ +À *· +®*¸ +Á *¹ + *º +à *» +à *¼ +Ä *½ +Å *¾ +Æ *¿ +Ç *À +È *Á +É * +Ê *à +¯*Ä +Ë *Å +Ì *Æ +Í *Ç +Î *È +Ï *É +Ð *Ê +Ñ *Ë +Ò *Ì +Ó *Í +Ô *Î +Õ *Ï +Ö *Ð +× *Ñ +Ø *Ò +Ù *Ó +Ú *Ô +Û *Õ +Ü *Ö +Ý *× +Þ *Ø +ß *Ù +à *Ú +á *Û +1*Ü +0*Ý +1*Þ +1*ß +â *à +ã *á +ä *â +ã *ã +å *ä +æ *å +ç *æ +Ø*ç +è *è +é *é +ê *ê +ë *ë +ì *ì +í *í +î *î +ï *ï +ð *ð +ñ *ñ +ò *ò +ó *ó +ô *ô +õ *õ +ö *ö +÷ *÷ +ø *ø +ù *ù +ú *ú +û *û +ü *ü +ý *ý +þ *þ +ÿ *ÿ +€ +*€  +* ‚ +*‚ ƒ +*ƒ „ +*„ … +*… † +*† ‡ +*‡ ˆ +*ˆ ‰ +*‰ Š +*Š Š +*‹ ‹ +*Œ Œ +*  +*Ž Ž +*  +*  +*‘ ‘ +*’ ’ +*“ “ +*” ” +*• • +*– – +*— — +*˜ ˜ +*™ ™ +*š š +*› › +*œ å* æ*ž œ +*Ÿ  +*  ž +*¡ ž +*¢ Ÿ +*£   +*¤ ¡ +*¥ ¢ +*¦ ¢ +*§ ¢ +*¨ £ +*© ¤ +*ª ¥ +*« ¦ +*¬ § +*­ ¨ +*® ¨ +*¯ © +*° ª +*± « +*² ¬ +*³ ­ +*´ ® +*µ ¯ +*¶ ° +*· ± +*¸ ² +*¹ ° +*º ³ +*» ´ +*¼ µ +*½ ¶ +*¾ · +*¿ ¸ +*À ¹ +*Á º +* » +*à ¼ +*Ä ½ +*Å ¾ +*Æ ¿ +*Ç À +*È Á +*É  +*Ê à +*Ë Ä +*Ì Å +*Í Æ +*Î Ç +*Ï È +*Ð É +*Ñ Ê +*Ò Ë +*Ó Ì +*Ô ¯*Õ Í +*Ö Î +*× Ï +*Ø Ð +*Ù Ñ +*Ú Ò +*Û Ó +*Ü Ô +*Ý Ô +*Þ Õ +*ß Ö +*à × +*á Ø +*â Ù +*ã Ú +*ä Û +*å Ü +*æ Ü +*ç Ý +*è Þ +*é ß +*ê à +*ë á +*ì â +*í ã +*î ä +*ï å +*ð æ +*ñ ç +*ò è +*ó é +*ô ê +*õ ë +*ö ì +*÷ í +*ø î +*ù ï +*ú ð +*û ñ +*ü ò +*ý ó +*þ ô +*ÿ õ +*€ ö +* ÷ +*‚ ø +*ƒ ù +*„ ú +*… û +*† ü +*‡ ý +*ˆ þ +*‰ ÿ +*Š € *‹  *Œ ‚ * ƒ *Ž „ * … * † *‘ ‡ *’ ˆ *“ ‰ *” Š *• ‹ *– Œ *—  *˜ Ž *™  *š  *› ‘ *œ ’ * “ *ž ” *Ÿ • *  – *¡ – *¢ — *£ ˜ *¤ ™ *¥ š *¦ › *§ œ *¨  *©  *ª ž *« Ÿ *¬   *­ ¡ *® ¢ *¯ £ *° ¤ *± ¥ *² ¦ *³ § *´ § *µ ¨ *¶ © *· ª *¸ « *¹ ¬ *º ­ *» ® *¼ ¯ *½ ° *¾ ± *¿ ² *À ³ *Á ´ * µ *à ¶ *Ä · *Å ¸ *Æ ¸ *Ç ¹ *È º *É » *Ê ¼ *Ë ¼ *Ì ½ *Í ¾ *Î ¿ *Ï À *Ð Á *Ñ  *Ò  *Ó à *Ô Ä *Õ Å *Ö Æ *× Ç *Ø È *Ù É *Ú Ê *Û Ë *Ü Ì *Ý Í *Þ Î *ß Ï *à Ð *á Ñ *â Ò *ã Ó *ä Ô *å Õ *æ Ö *ç × *è Ø *é Ù *ê Ú *ë Û *ì Ü *í Ý *î Þ *ï ß *ð à *ñ á *ò â *ó ã *ô ä *õ å *ö æ *÷ ç *ø è *ù é *ú ê *û ë *ü ì *ý í *þ í *ÿ î *€ ï * ð *‚ ñ *ƒ ò *„ ó *… ô *† õ *‡ ö *ˆ ÷ *‰ ø *Š ù *‹ ú *Œ û * ü *Ž ý * þ * ÿ *‘ € *’  *“ ‚ *” ƒ *• „ *– … *— † *˜ ‡ *™ ˆ *š ‰ *› Š *œ ‹ * Œ *ž  *Ÿ Ž *   *¡  *¢ ‘ *£ ’ *¤ “ *¥ ” *¦ • *§ – *¨ — *© ˜ *ª ˜ *« ™ *¬ š *­ › *® œ *¯  *° ž *± Ÿ *²   *³ ¡ *´ ¡ *µ ¢ *¶ £ *· ¤ *¸ ¥ *¹ ¥ *º ¦ *» § *¼ ¨ *½ ¦ *¾ § *¿ ¨ *À © *Á ª * « *à ¬ *Ä ­ *Å ® *Æ ¯ *Ç ° *È ± *É ² *Ê ³ *Ë ´ *Ì µ *Í À*Î ¶ *Ï · *Ð ¸ *Ñ ¹ *Ò º *Ó » *Ô ¼ *Õ ¼ *Ö ½ *× ¾ *Ø ¿ *Ù À *Ú Á *Û  *Ü à *Ý Ä *Þ Å *ß Æ *à Ç *á È *â É *ã Ê *ä Ë *å Ì *æ Í *ç Î *è Ï *é Ð *ê Ñ *ë Ò *ì Ó *í Ó *î Ô *ï Ô *ð Õ *ñ Ö *ò × *ó Ø *ô Ù *õ Ú *ö Û *÷ Ú *ø Ü *ù Ý *ú Þ *û Þ *ü ß *ý à *þ á *ÿ â *€ã *ä *‚å *ƒæ *„ç *…è *†é *‡ê *ˆë *‰ì *Ší *‹î *Œï *ï *Žð *ñ *ò *‘ó *’ô *“õ *”ö *•÷ *–ø *—Ú *˜ù *™ú *šû *›ü *œý *þ *žÿ *Ÿ€ *  *¡‚ *¢ƒ 22live2count20io/opencensus/implcore/stats/StatsManager.record22io/opencensus/implcore/stats/MeasureMapImpl.record2;io/grpc/census/CensusStatsModule$ClientCallTracer.callEnded2Cio/grpc/census/CensusStatsModule$StatsClientInterceptor$1$1.onClose23io/grpc/PartialForwardingClientCallListener.onClose2,io/grpc/ForwardingClientCallListener.onClose2Oio/grpc/ForwardingClientCallListener$SimpleForwardingClientCallListener.onClose2Gio/grpc/census/CensusTracingModule$TracingClientInterceptor$1$1.onClose2-io/grpc/internal/ClientCallImpl.closeObserver2*io/grpc/internal/ClientCallImpl.access$3002Rio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInternal2Sio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1StreamClosed.runInContext2$io/grpc/internal/ContextRunnable.run2(io/grpc/internal/SerializingExecutor.run21java/util/concurrent/ThreadPoolExecutor.runWorker22java/util/concurrent/ThreadPoolExecutor$Worker.run2java/lang/Thread.run2/scala/collection/immutable/VectorBuilder.result2+scala/collection/TraversableLike.filterImpl2,scala/collection/TraversableLike.filterImpl$2/scala/collection/AbstractTraversable.filterImpl2'scala/collection/TraversableLike.filter2(scala/collection/TraversableLike.filter$2+scala/collection/AbstractTraversable.filter2Mcom/wixpress/framework/aspects/response/AggregatedResponseAspects.mergeRemote2Ocom/wixpress/framework/aspects/response/AtomicResponseAspects.$anonfun$append$12[com/wixpress/framework/aspects/response/AtomicResponseAspects$$Lambda$2425/1711342280.apply28java/util/concurrent/atomic/AtomicReference.updateAndGet2Dcom/wixpress/framework/aspects/response/AtomicResponseAspects.append2`com/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.$anonfun$onClose$22hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.$anonfun$onClose$2$adapted2jcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener$$Lambda$846/1409886222.apply2scala/Option.foreach2Ucom/wixpress/grpc/Interceptors$WixContextClientInterceptor$WixContextListener.onClose2?com/wixpress/grpc/ClientDetailsReporter$$anon$1$$anon$2.onClose2Gcom/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1$$anon$2.onClose2?com/wixpress/grpc/ClientMetricsReporter$$anon$1$$anon$2.onClose2java/util/HashMap.resize2java/util/HashMap.putVal2java/util/HashMap.putMapEntries2java/util/HashMap.2-io/opencensus/implcore/tags/TagMapImpl.23io/opencensus/implcore/tags/TagMapBuilderImpl.build2java/util/Arrays.copyOf26java/lang/AbstractStringBuilder.ensureCapacityInternal2&java/lang/AbstractStringBuilder.append2java/lang/StringBuilder.append2Rcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.$anonfun$name$12_com/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter$$Lambda$842/2093743533.apply2/scala/collection/TraversableLike.$anonfun$map$12=scala/collection/TraversableLike$$Lambda$142/1105090408.apply2!scala/collection/Iterator.foreach2"scala/collection/Iterator.foreach$2)scala/collection/AbstractIterator.foreach2%scala/collection/IterableLike.foreach2&scala/collection/IterableLike.foreach$2)scala/collection/AbstractIterable.foreach2$scala/collection/TraversableLike.map2%scala/collection/TraversableLike.map$2(scala/collection/AbstractTraversable.map2Gcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.name2Icom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.handle2Lcom/wixpress/framework/metrics/graphite/core/MetricRegistryAdapter.addMetric2>com/wixpress/grpc/MetricsNotifierOperations.registerRpcSuccess22=org/jose4j/json/internal/json_simple/parser/JSONParser.2"org/jose4j/json/JsonUtil.parseJson2'org/jose4j/jwx/Headers.setEncodedHeader20org/jose4j/jwx/JsonWebStructure.setEncodedHeader2com/wixpress/common/devices/overrides/Overrides.getOverrideFor25com/wixpress/common/devices/FileOverrides.overrideFor2!java/util/stream/MatchOps.makeRef2+java/util/stream/ReferencePipeline.allMatch29java/util/stream/MatchOps$$Lambda$333/27818833.get$Lambda27java/lang/invoke/DirectMethodHandle$Holder.invokeStatic23java/lang/invoke/Invokers$Holder.linkToTargetMethod2'scala/collection/immutable/Map$Map4.get2?com/wixpress/framework/aspects/AspectFilter.$anonfun$toLookup$32Icom/wixpress/framework/aspects/AspectFilter$$Lambda$1077/1427396510.apply2*com/codahale/metrics/MetricRegistry.append2(com/codahale/metrics/MetricRegistry.name2Xcom/wixpress/framework/metrics/graphite/core/package$MetricNameOps$.renderWith$extension2Zcom/wixpress/framework/metrics/graphite/core/package$MetricNameOps$.asMetricName$extension2ncom/wixpress/monitoring/panorama/v1/LogController.emitPanoramaEstimatedBitsWrittenIntoBufferJvmSizeBytesMetric2org/jose4j/jwt/JwtClaims.2org/jose4j/jwt/JwtClaims.parse2Vcom/wixpress/common/devices/overrides/DeviceOverride$$Lambda$2306/804483753.get$Lambda2java/math/BigDecimal.valueOf2#java/math/BigDecimal.divideAndRound2java/math/BigDecimal.divide2'io/opencensus/common/Timestamp.floorDiv2'io/opencensus/common/Timestamp.floorMod2)io/opencensus/common/Timestamp.fromMillis2-io/opencensus/implcore/common/MillisClock.now2java/math/BigInteger.oddModPow2java/math/BigInteger.modPow2sun/security/rsa/RSACore.crypt2sun/security/rsa/RSACore.rsa2*sun/security/rsa/RSASignature.engineVerify2-java/security/Signature$Delegate.engineVerify2java/security/Signature.verify25org/jose4j/jws/BaseSignatureAlgorithm.verifySignature2/org/jose4j/jws/JsonWebSignature.verifySignature22org/jose4j/jwt/consumer/JwtConsumer.processContext2Jio/opencensus/trace/export/SampledSpanStore$LatencyBucketBoundaries.values2eio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.getLatencyBucket2hio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.considerForSampling2`io/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl$PerSpanNameSamples.access$11002Uio/opencensus/implcore/trace/export/InProcessSampledSpanStoreImpl.considerForSampling2Eio/opencensus/implcore/trace/StartEndHandlerImpl$SpanEndEvent.process2Dorg/json4s/jackson/JValueSerializer$$Lambda$964/836954698.get$Lambda2-org/json4s/jackson/JValueSerializer.serialize2Gcom/fasterxml/jackson/databind/ser/DefaultSerializerProvider._serialize2Kcom/fasterxml/jackson/databind/ser/DefaultSerializerProvider.serializeValue26com/fasterxml/jackson/databind/ObjectMapper.writeValue27com/fasterxml/jackson/databind/ObjectMapper.valueToTree2)org/json4s/jackson/JsonMethods.asJsonNode2*org/json4s/jackson/JsonMethods.asJsonNode$2*org/json4s/jackson/JsonMethods$.asJsonNode2‡com/wixpress/grpc/jackson/ProtobufMessageObjectMapperModule.com$wixpress$grpc$jackson$ProtobufMessageObjectMapperModule$$$anonfun$new$12Pcom/wixpress/grpc/jackson/ProtobufMessageObjectMapperModule$$anonfun$1.serialize2Vcom/wixpress/framework/oxm/jackson/modules/OptionSerializerCopiedFromJackson.serialize2Fcom/fasterxml/jackson/databind/ser/BeanPropertyWriter.serializeAsField2Pcom/wixpress/framework/oxm/jackson/modules/OptionPropertyWriter.serializeAsField2Icom/fasterxml/jackson/databind/ser/std/BeanSerializerBase.serializeFields2;com/fasterxml/jackson/databind/ser/BeanSerializer.serialize2>com/fasterxml/jackson/databind/ObjectWriter$Prefetch.serialize2@com/fasterxml/jackson/databind/ObjectWriter._configAndWriteValue2>com/fasterxml/jackson/databind/ObjectWriter.writeValueAsString2Ocom/wixpress/monitoring/panorama/ser/PanoramaLogMessageJsonSerializer.serialize2>com/fasterxml/jackson/databind/util/TokenBuffer$Segment.26com/fasterxml/jackson/databind/util/TokenBuffer.2Bcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$32Ncom/wixpress/framework/aspects/RequestParameters$$$Lambda$2106/342212121.apply2/scala/collection/mutable/ArrayOps$ofRef.foreach2+scala/collection/mutable/ArrayOps$ofRef.map2Bcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$22Jcom/wixpress/framework/aspects/RequestParameters$.$anonfun$apply$2$adapted2Ocom/wixpress/framework/aspects/RequestParameters$$$Lambda$1904/1039138940.apply27com/wixpress/framework/aspects/RequestParameters$.apply2%java/util/stream/StreamSupport.stream2Bscala/collection/immutable/Stream$$Lambda$499/129958347.get$Lambda26java/lang/invoke/LambdaForm$DMH/492079624.invokeStatic2;java/lang/invoke/LambdaForm$MH/125881207.linkToTargetMethod2,scala/collection/immutable/Stream.filterImpl2:scala/collection/immutable/Stream$.$anonfun$filteredTail$12=scala/collection/immutable/Stream$$Lambda$499/129958347.apply2+scala/collection/immutable/Stream$Cons.tail2>com/wixpress/grpc/MetricsNotifierOperations$.restCallerDetails2Fcom/wixpress/grpc/MetricsNotifierOperations.registerRestCallerArtifact24scala/collection/immutable/Stream.$anonfun$flatMap$12?scala/collection/immutable/Stream$$Lambda$1912/1818037696.apply23scala/collection/immutable/Stream.$anonfun$append$12?scala/collection/immutable/Stream$$Lambda$1913/1299101325.apply2(scala/collection/generic/Growable.loop$12/scala/collection/generic/Growable.$plus$plus$eq20scala/collection/generic/Growable.$plus$plus$eq$2;scala/collection/immutable/Map$MapBuilderImpl.$plus$plus$eq2&scala/collection/TraversableOnce.toMap2'scala/collection/TraversableOnce.toMap$2*scala/collection/AbstractTraversable.toMap2+scala/collection/immutable/List$.newBuilder2Bscala/collection/generic/GenericTraversableTemplate.genericBuilder2Cscala/collection/generic/GenericTraversableTemplate.genericBuilder$23scala/collection/AbstractTraversable.genericBuilder2;scala/collection/generic/GenericTraversableTemplate.flatten22(sun/security/provider/SHA2$SHA256.2?jdk/internal/reflect/GeneratedConstructorAccessor14.newInstance2Bjdk/internal/reflect/DelegatingConstructorAccessorImpl.newInstance2)java/lang/reflect/Constructor.newInstance2&java/security/Provider.newInstanceUtil2*java/security/Provider$Service.newInstance2(sun/security/jca/GetInstance.getInstance2java/security/Security.getImpl2'java/security/MessageDigest.getInstance2$sun/security/rsa/RSASignature.22sun/security/rsa/RSASignature$SHA256withRSA.2?jdk/internal/reflect/GeneratedConstructorAccessor19.newInstance2,java/security/Signature$Delegate.newInstance2/java/security/Signature$Delegate.chooseProvider21java/security/Signature$Delegate.engineInitVerify2"java/security/Signature.initVerify23org/jose4j/jws/BaseSignatureAlgorithm.initForVerify2scala/Option.map2scala/runtime/ObjectRef.create2)scala/collection/immutable/Stream.flatten24scala/collection/immutable/Stream.$anonfun$flatten$12?scala/collection/immutable/Stream$$Lambda$2354/1829345349.apply2=scala/collection/immutable/Stream$$Lambda$497/269853881.apply2*scala/collection/TraversableLike.filterNot2+scala/collection/TraversableLike.filterNot$2.scala/collection/AbstractTraversable.filterNot2Kcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$RawCookieCutterImpl.cut2Acom/wixpress/grpc/rest/CookieCutter$.$anonfun$rawCutterToCutter$12Bcom/wixpress/grpc/rest/CookieCutter$$$Lambda$1055/1890792022.apply2Wcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$cutCookies$12_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$2025/1333478295.apply29com/wixpress/grpc/rest/backends/CallScopeBackend$.segment2com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.com$wixpress$grpc$rest$backends$CallScopeBackend$CallScopeHandler$$cutCookies2Ocom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$anon$1.apply2 java/lang/StringLatin1.newString2 java/lang/StringBuilder.toString2Dcom/wixpress/framework/monitoring/metering/MetricsObserver.addMetric2Ecom/wixpress/framework/monitoring/metering/MetricsObserver.addMetric$2Mcom/wixpress/grpc/MetricsNotifierOperations.$anonfun$registerCallerArtifact$22Ucom/wixpress/grpc/MetricsNotifierOperations.$anonfun$registerCallerArtifact$2$adapted2Hcom/wixpress/grpc/MetricsNotifierOperations$$Lambda$2065/969108339.apply2Bcom/wixpress/grpc/MetricsNotifierOperations.registerCallerArtifact2!java/lang/StringCoding.encodeUTF82java/lang/StringCoding.encode2java/lang/String.getBytes2,org/jose4j/lang/StringUtil.getBytesUnchecked2'org/jose4j/lang/StringUtil.getBytesUtf82java/util/Arrays.copyOfRange2'scala/collection/LinearSeqLike.iterator2(scala/collection/LinearSeqLike.iterator$2(scala/collection/immutable/List.iterator2)scala/collection/IterableLike.copyToArray2*scala/collection/IterableLike.copyToArray$2-scala/collection/AbstractIterable.copyToArray2,scala/collection/TraversableOnce.copyToArray2-scala/collection/TraversableOnce.copyToArray$20scala/collection/AbstractTraversable.copyToArray2(scala/collection/TraversableOnce.toArray2)scala/collection/TraversableOnce.toArray$2,scala/collection/AbstractTraversable.toArray2%org/jose4j/base64url/Base64Url.encode2Ncom/wixpress/framework/aspects/AspectFilter$$Lambda$1910/1522445774.get$Lambda2java/lang/Integer.valueOf2+org/udger/parser/UdgerParser.clientDetector2$java/lang/Throwable.fillInStackTrace2java/lang/Throwable.2java/lang/Exception.2-java/security/GeneralSecurityException.2'javax/crypto/BadPaddingException.2$sun/security/rsa/RSAPadding.unpadV152!sun/security/rsa/RSAPadding.unpad2java/lang/StringLatin1.strip2java/lang/String.strip2Hcom/wixpress/framework/aspects/response/AggregatedResponseAspects.aspect2Acom/wixpress/framework/aspects/response/AtomicResponseAspects.get2?com/wixpress/grpc/rest/ResponseAspects$.$anonfun$petriCookies$22Ecom/wixpress/grpc/rest/ResponseAspects$$$Lambda$2002/1128976738.apply24com/wixpress/grpc/rest/ResponseAspects$.petriCookies21com/wixpress/grpc/rest/ResponseAspects$.mandatory2\com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$responseAspects$12dcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$responseAspects$1$adapted2_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1936/1321531833.apply2”com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.com$wixpress$grpc$rest$backends$CallScopeBackend$CallScopeHandler$$responseAspects27org/jose4j/json/internal/json_simple/parser/Yylex.yylex2@org/jose4j/json/internal/json_simple/parser/JSONParser.nextToken22+sun/security/util/DerInputStream.readVector2,sun/security/util/DerInputStream.getSequence2-sun/security/rsa/RSASignature.decodeSignature2%sun/security/util/DerInputStream.init2'sun/security/util/DerInputStream.2com/codahale/metrics/Timer.time2Lcom/codahale/metrics/InstrumentedExecutorService$InstrumentedRunnable.28com/codahale/metrics/InstrumentedExecutorService.execute2:scala/concurrent/impl/ExecutionContextImpl$$anon$4.execute29com/wixpress/framework/loom/LoomExecutors$$anon$4.execute2!java/lang/StringCoding.decodeUTF82java/lang/StringCoding.decode2java/lang/String.2$org/jose4j/lang/StringUtil.newString2(org/jose4j/lang/StringUtil.newStringUtf825com/fasterxml/jackson/core/JsonFactory._createContext26com/fasterxml/jackson/core/JsonFactory.createGenerator2"java/lang/StringCoding.encodeASCII2(org/jose4j/lang/StringUtil.getBytesAscii24org/jose4j/jws/JsonWebSignature.getSigningInputBytes2%org/jose4j/base64url/Base64Url.2org/jose4j/jwx/Headers.2&org/jose4j/jwx/JsonWebStructure.2&org/jose4j/jws/JsonWebSignature.2/scala/collection/immutable/VectorBuilder.2-scala/collection/immutable/Vector$.newBuilder2scala/collection/SetLike.toSeq2scala/collection/SetLike.toSeq$2"scala/collection/AbstractSet.toSeq2Kcom/wixpress/framework/tracking/consent/CookieDomains$.resolveCookieDomains2Ccom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$62Mcom/wixpress/framework/tracking/consent/Policies$$Lambda$2042/386554115.apply28com/wixpress/framework/tracking/consent/Policies.resolve2Qcom/wixpress/framework/tracking/consent/TrackingConsentLaboratory$.extractConsent2Pcom/wixpress/framework/tracking/consent/TrackingConsentLaboratory.extractConsent2Lcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$.resolveRequestContext$12Fcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$.$anonfun$apply$122Rcom/wixpress/grpc/rest/cookiecutter/RawCookieCutter$$$Lambda$1054/1238145834.apply2Pcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3198/2071923867.get$Lambda25com/wixpress/monitoring/panorama/v1/Converter.version2=com/wixpress/monitoring/panorama/v1/Converter.$anonfun$from$42Jcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3184/595334145.apply2scala/Option$.apply2java/math/BigInteger.leftShift2*org/jose4j/jwx/CompactSerializer.serialize2%java/time/LocalDateTime.ofEpochSecond2java/time/ZonedDateTime.create2!java/time/ZonedDateTime.ofInstant2java/time/ZonedDateTime.now2;com/wixpress/monitoring/time/Time$.zonedDateTimeNowToString2scala/Array$$anon$11.apply2*scala/collection/TraversableLike.builder$12java/lang/Integer.toString2java/time/LocalTime.toString2 java/time/LocalDateTime.toString2 java/time/ZonedDateTime.toString26java/nio/channels/spi/AbstractSelectableChannel.2&java/nio/channels/SocketChannel.2#sun/nio/ch/SocketChannelImpl.2)sun/nio/ch/ServerSocketChannelImpl.accept2(io/netty/util/internal/SocketUtils$5.run2+java/security/AccessController.doPrivileged2)io/netty/util/internal/SocketUtils.accept2Aio/netty/channel/socket/nio/NioServerSocketChannel.doReadMessages2Dio/netty/channel/nio/AbstractNioMessageChannel$NioMessageUnsafe.read24io/netty/channel/nio/NioEventLoop.processSelectedKey2>io/netty/channel/nio/NioEventLoop.processSelectedKeysOptimized25io/netty/channel/nio/NioEventLoop.processSelectedKeys2%io/netty/channel/nio/NioEventLoop.run28io/netty/util/concurrent/SingleThreadEventExecutor$4.run2.io/netty/util/internal/ThreadExecutorMap$2.run24io/netty/util/concurrent/FastThreadLocalRunnable.run28com/wixpress/grpc/EventLoopGroups$.$anonfun$markThread$12=com/wixpress/grpc/EventLoopGroups$$$Lambda$396/2003311844.run2bcom/wixpress/framework/aspects/HttpAspectsTransport$$anonfun$$nestedInanonfun$read$1$1.applyOrElse20scala/PartialFunction.$anonfun$runWith$1$adapted22scala/PartialFunction$$Lambda$538/1967118241.apply2+scala/collection/immutable/Map$Map2.foreach2(scala/collection/TraversableLike.collect2)scala/collection/TraversableLike.collect$2,scala/collection/AbstractTraversable.collect2Ccom/wixpress/framework/aspects/HttpAspectsTransport.$anonfun$read$12Pcom/wixpress/framework/aspects/HttpAspectsTransport$$Lambda$1914/584965740.apply2'scala/collection/immutable/List.flatMap2java/util/Formatter.parse2java/util/Formatter.format2java/lang/String.format2Ecom/wixpress/framework/statsd/reporter/WixStatsDReporter.formatNumber2Fcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportMetered2?com/wixpress/framework/statsd/reporter/WixStatsDReporter.report2-com/codahale/metrics/ScheduledReporter.report25com/codahale/metrics/ScheduledReporter.lambda$start$02Acom/codahale/metrics/ScheduledReporter$$Lambda$1828/746676188.run23java/util/concurrent/Executors$RunnableAdapter.call2+java/util/concurrent/FutureTask.runAndReset2Hjava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask.run2Ncom/wixpress/framework/aspects/AspectFilter$$Lambda$1077/1427396510.get$Lambda22com/wixpress/framework/statsd/reporter/StatsD.send2java/util/regex/Matcher.26com/wixpress/framework/statsd/reporter/StatsD.sanitize2?com/wixpress/framework/statsd/reporter/WixStatsDReporter.prefix2mcom/wixpress/grpc/rest/middlewares/Report.com$wixpress$grpc$rest$middlewares$Report$$reportSuccessAndExpire$12java/util/Formatter.toString2Ocom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$usersExperimentLogMap$12Wcom/wixpress/petri/asp/PetriExperimentsAspect$.$anonfun$usersExperimentLogMap$1$adapted2Lcom/wixpress/petri/asp/PetriExperimentsAspect$$$Lambda$1993/1046699873.apply28scala/collection/MapLike$FilteredKeys.$anonfun$foreach$12Bscala/collection/MapLike$FilteredKeys$$Lambda$1995/489511575.apply24scala/collection/immutable/NewRedBlackTree$._foreach23scala/collection/immutable/NewRedBlackTree$.foreach2*scala/collection/immutable/TreeMap.foreach2-scala/collection/MapLike$FilteredKeys.foreach2Dcom/wixpress/petri/asp/PetriExperimentsAspect$.usersExperimentLogMap24scala/collection/mutable/ArrayBuilder$ofLong.mkArray23scala/collection/mutable/ArrayBuilder$ofLong.result2(scala/collection/TraversableLike.flatMap2)scala/collection/TraversableLike.flatMap$2/scala/collection/mutable/ArrayOps$ofRef.flatMap2Zcom/wixpress/framework/metrics/graphite/core/SlidingTimeWindowUniformReservoir.getSnapshot2*com/codahale/metrics/Histogram.getSnapshot2Hcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportHistogram2java/util/ArrayList.grow2java/util/ArrayList.add2&com/codahale/metrics/Timer.getSnapshot2Dcom/wixpress/framework/statsd/reporter/WixStatsDReporter.reportTimer2java/lang/String.substring2%java/util/Formatter$FixedString.print2,com/codahale/metrics/WeightedSnapshot.2?com/codahale/metrics/ExponentiallyDecayingReservoir.getSnapshot2'sun/security/provider/DigestBase.24io/netty/util/internal/AppendableCharSequence.append2Bio/netty/handler/codec/http/HttpObjectDecoder$HeaderParser.process2/io/netty/buffer/AbstractByteBuf.forEachByteAsc02+io/netty/buffer/AbstractByteBuf.forEachByte2@io/netty/handler/codec/http/HttpObjectDecoder$HeaderParser.parse29io/netty/handler/codec/http/HttpObjectDecoder.readHeaders24io/netty/handler/codec/http/HttpObjectDecoder.decode2Kio/netty/handler/codec/http/HttpServerCodec$HttpServerRequestDecoder.decode2Jio/netty/handler/codec/ByteToMessageDecoder.decodeRemovalReentryProtection26io/netty/handler/codec/ByteToMessageDecoder.callDecode27io/netty/handler/codec/ByteToMessageDecoder.channelRead29io/netty/channel/CombinedChannelDuplexHandler.channelRead2@io/netty/channel/AbstractChannelHandlerContext.invokeChannelRead2>io/netty/channel/AbstractChannelHandlerContext.fireChannelRead2?io/netty/channel/DefaultChannelPipeline$HeadContext.channelRead27io/netty/channel/DefaultChannelPipeline.fireChannelRead2>io/netty/channel/nio/AbstractNioByteChannel$NioByteUnsafe.read28scala/collection/immutable/HashMap$HashMapBuilder.addOne2:scala/collection/immutable/HashMap$HashMapBuilder.$plus$eq26scala/collection/immutable/Map$MapBuilderImpl.$plus$eq2?com/wixpress/framework/config/ConfiguratorAspectsTransport.read22com/wixpress/grpc/rest/HttpCallScopeProducer.apply2Lcom/wixpress/grpc/rest/backends/CallScopeBackend$.$anonfun$buildInputParse$12Ncom/wixpress/grpc/rest/backends/CallScopeBackend$$$Lambda$1818/933489703.apply2Rcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$apply$72_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1876/1563411370.apply2Gcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.apply2com/wixpress/grpc/IncorrectArtifactCalledDetector.channelRead02;com/wixpress/grpc/StartRest$DecodeErrorHandler.channelRead02:io/netty/handler/codec/MessageToMessageDecoder.channelRead29io/netty/channel/ChannelInboundHandlerAdapter.channelRead28com/wixpress/grpc/accesslog/AccessLogHandler.channelRead2]io/netty/channel/CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead2;io/netty/handler/codec/ByteToMessageDecoder.fireChannelRead2=com/google/protobuf/struct/Value$Kind$StringValue.stringValue29com/google/protobuf/struct/Value.__computeSerializedValue2/com/google/protobuf/struct/Value.serializedSize2Fcom/google/protobuf/struct/Struct$FieldsEntry.__computeSerializedValue2com/google/protobuf/struct/Struct$$Lambda$2187/678869738.apply23scala/collection/immutable/HashMap$HashMap1.foreach26scala/collection/immutable/HashMap$HashTrieMap.foreach2:com/google/protobuf/struct/Struct.__computeSerializedValue20com/google/protobuf/struct/Struct.serializedSize2:com/wixpress/monitoring/panorama/v1/LogController.validate2Lcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$validateBulkLog$12Tcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$validateBulkLog$1$adapted2Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2186/1330773715.apply2Acom/wixpress/monitoring/panorama/v1/LogController.validateBulkLog2Acom/wixpress/monitoring/panorama/v1/LogController.$anonfun$_log$12Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2134/1685508225.apply29com/wixpress/common/concurrent/future/package$.safeFuture26com/wixpress/monitoring/panorama/v1/LogController._log2Dcom/wixpress/monitoring/panorama/v1/LogController.$anonfun$bulkLog$12Mcom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2130/42863488.apply29com/wixpress/monitoring/panorama/v1/LogController.bulkLog2acom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog.$anonfun$wrappedBulkLog$22dcom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog$$Lambda$2128/122972379.apply24com/wixpress/grpc/util/GenericWrapperUtil$.safeUnary2acom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog.$anonfun$wrappedBulkLog$12dcom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog$$Lambda$1507/559179052.apply2Scom/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper.$anonfun$wrapUnary$52\com/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper$$Lambda$2126/1674811468.apply2Ocom/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper.accordingToState2Scom/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper.$anonfun$wrapUnary$22\com/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper$$Lambda$1486/1910326820.apply2Mcom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.$anonfun$wrapUnary$22Ucom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator$$Lambda$1488/591902639.apply2=com/wixpress/grpc/CallScopeEnrichWrapper.$anonfun$wrapUnary$32Ecom/wixpress/grpc/CallScopeEnrichWrapper$$Lambda$1505/456911980.apply2Mcom/wixpress/framework/errors/ErrorMappingGenericWrapper.$anonfun$wrapUnary$22Vcom/wixpress/framework/errors/ErrorMappingGenericWrapper$$Lambda$1506/1408739590.apply2Ocom/wixpress/monitoring/panorama/v1/LogWithCallScopeInternal$WrappedLog.bulkLog2Kcom/wixpress/monitoring/panorama/v1/LogWithCallScope$Log.$anonfun$methods$22Ucom/wixpress/monitoring/panorama/v1/LogWithCallScope$Log$$Lambda$1771/668568559.apply2Rcom/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler.$anonfun$apply$82_com/wixpress/grpc/rest/backends/CallScopeBackend$CallScopeHandler$$Lambda$1931/1978359808.apply2:com/wixpress/grpc/rest/backends/CallScopeBackend$.handling2;io/netty/handler/codec/http/cookie/CookieDecoder.initCookie2=io/netty/handler/codec/http/cookie/ServerCookieDecoder.decode2=com/wixpress/grpc/rest/backends/CsrfFilter$CookieToken$.apply27com/wixpress/grpc/rest/backends/CsrfFilter$Token$.apply2Ccom/wixpress/grpc/rest/backends/CsrfFilter$Params$.$anonfun$apply$42Ncom/wixpress/grpc/rest/backends/CsrfFilter$Params$$$Lambda$2083/99749969.apply20scala/collection/immutable/Stream.$anonfun$map$12>scala/collection/immutable/Stream$$Lambda$1119/490879749.apply29scala/collection/immutable/StreamIterator.$anonfun$next$12Fscala/collection/immutable/StreamIterator$$Lambda$254/1657697023.apply2?scala/collection/immutable/StreamIterator$LazyCell.v$lzycompute24scala/collection/immutable/StreamIterator$LazyCell.v21scala/collection/immutable/StreamIterator.hasNext28com/wixpress/grpc/rest/backends/CsrfFilter$Params$.apply20com/wixpress/grpc/rest/backends/CsrfFilter.check2.scalapb/GeneratedMessage.$anonfun$toPMessage$126scalapb/GeneratedMessage$$Lambda$1731/1112156613.apply2#scalapb/GeneratedMessage.toPMessage2$scalapb/GeneratedMessage.toPMessage$2+com/google/protobuf/struct/Value.toPMessage2Acom/google/protobuf/struct/Struct$FieldsEntry.$anonfun$getField$22Icom/google/protobuf/struct/Struct$FieldsEntry.$anonfun$getField$2$adapted2Jcom/google/protobuf/struct/Struct$FieldsEntry$$Lambda$2183/984164171.apply26com/google/protobuf/struct/Struct$FieldsEntry.getField28com/google/protobuf/struct/Struct$FieldsEntry.toPMessage25com/google/protobuf/struct/Struct.$anonfun$getField$12=com/google/protobuf/struct/Struct.$anonfun$getField$1$adapted2?com/google/protobuf/struct/Struct$$Lambda$2176/1293617360.apply2'scala/collection/Iterator$$anon$10.next26scala/collection/immutable/VectorBuilder.$plus$plus$eq2#scala/collection/TraversableOnce.to2$scala/collection/TraversableOnce.to$2$scala/collection/AbstractIterator.to2)scala/collection/TraversableOnce.toVector2*scala/collection/TraversableOnce.toVector$2*scala/collection/AbstractIterator.toVector2*com/google/protobuf/struct/Struct.getField2,com/google/protobuf/struct/Struct.toPMessage24com/google/protobuf/struct/Value.$anonfun$getField$62io/netty/util/concurrent/SingleThreadEventExecutor.runAllTasks28com/google/protobuf/struct/Value$Kind$StringValue$.apply29com/google/protobuf/struct/Value$.$anonfun$messageReads$82?com/google/protobuf/struct/Value$$$Lambda$2258/1383381276.apply29com/google/protobuf/struct/Value$.$anonfun$messageReads$12?com/google/protobuf/struct/Value$$$Lambda$2236/1748307622.apply2.scalapb/descriptors/Reads$.$anonfun$optional$126scalapb/descriptors/Reads$$$Lambda$976/732611751.apply2scalapb/descriptors/PValue.as2scalapb/descriptors/PValue.as$2scalapb/descriptors/PMessage.as2Gcom/google/protobuf/struct/Struct$FieldsEntry$.$anonfun$messageReads$122Lcom/google/protobuf/struct/Struct$FieldsEntry$$$Lambda$2234/1194292910.apply2Fcom/google/protobuf/struct/Struct$FieldsEntry$.$anonfun$messageReads$72Kcom/google/protobuf/struct/Struct$FieldsEntry$$$Lambda$2180/279903710.apply23scalapb/descriptors/ReadsCompat.$anonfun$repeated$12;scalapb/descriptors/ReadsCompat$$Lambda$980/274827125.apply2 scalapb/descriptors/PRepeated.as2:com/google/protobuf/struct/Struct$.$anonfun$messageReads$42>com/google/protobuf/struct/Struct$$$Lambda$2179/90585130.apply2:com/google/protobuf/struct/Struct$.$anonfun$messageReads$12@com/google/protobuf/struct/Struct$$$Lambda$2169/2094936604.apply2Ascala/collection/immutable/HashMap$HashMapBuilder.makeMutableTrie20scala/collection/immutable/Map$EmptyMap$.updated2.scala/collection/immutable/Map$EmptyMap$.$plus2Bcom/wix/api/RequestContext$AspectsEntry$.$anonfun$keyValueMapper$22Dcom/wix/api/RequestContext$AspectsEntry$$$Lambda$812/892477382.apply2!scalapb/TypeMapper$$anon$1.toBase2>com/wix/api/RequestContext.$anonfun$__computeSerializedValue$12Fcom/wix/api/RequestContext.$anonfun$__computeSerializedValue$1$adapted27com/wix/api/RequestContext$$Lambda$810/1222466248.apply23com/wix/api/RequestContext.__computeSerializedValue2)com/wix/api/RequestContext.serializedSize2$scalapb/GeneratedMessage.toByteArray2%scalapb/GeneratedMessage.toByteArray$2&com/wix/api/RequestContext.toByteArray2Tcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.addRequestContext2Hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.start2"io/grpc/stub/ClientCalls.startCall2.io/grpc/stub/ClientCalls.asyncUnaryRequestCall2(io/grpc/stub/ClientCalls.futureUnaryCall24com/wixpress/grpc/GrpcClientWithCallScope$.unaryCall2Xcom/wixpress/ratelimiter/contract/RateLimiterWithCallScope$$anon$2.reportUsageIfEligible2Tcom/wixpress/monitoring/panorama/bp/RateLimiterGrpcClientProxy.reportUsageIfEligible2Qcom/wixpress/monitoring/panorama/bp/AsyncRateLimiterGrpc.$anonfun$rateLimitByIp$12Vcom/wixpress/monitoring/panorama/bp/AsyncRateLimiterGrpc$$Lambda$2221/1689630732.apply2Fcom/wixpress/monitoring/panorama/bp/AsyncRateLimiterGrpc.rateLimitByIp27scala/collection/immutable/HashMap$HashTrieMap.iterator2'scala/collection/MapLike$$anon$1.2%scala/collection/MapLike.keysIterator2&scala/collection/MapLike.keysIterator$2)scala/collection/AbstractMap.keysIterator2/scala/collection/MapLike$DefaultKeySet.iterator2$scala/collection/IterableLike.forall2%scala/collection/IterableLike.forall$2(scala/collection/AbstractIterable.forall2Bscala/collection/TraversableLike$$Lambda$142/1105090408.get$Lambda2=com/google/protobuf/ByteString$ArraysByteArrayCopier.copyFrom2'com/google/protobuf/ByteString.copyFrom27com/wixpress/grpc/rest/backends/ScalaPB$.rawHttpRequest22/java/nio/channels/ClosedChannelException.25io/netty/channel/AbstractChannel$AbstractUnsafe.close29io/netty/channel/DefaultChannelPipeline$HeadContext.close2:io/netty/channel/AbstractChannelHandlerContext.invokeClose24io/netty/channel/AbstractChannelHandlerContext.close2Sio/netty/channel/CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.close24io/netty/channel/ChannelOutboundHandlerAdapter.close23io/netty/channel/CombinedChannelDuplexHandler.close2-io/netty/channel/DefaultChannelPipeline.close2&io/netty/channel/AbstractChannel.close2:io/netty/channel/ChannelFutureListener$1.operationComplete27io/netty/util/concurrent/DefaultPromise.notifyListener02:io/netty/util/concurrent/DefaultPromise.notifyListenersNow27io/netty/util/concurrent/DefaultPromise.notifyListeners23io/netty/util/concurrent/DefaultPromise.addListener22io/netty/channel/DefaultChannelPromise.addListener29com/wixpress/grpc/StartRest$HttpServerAdapter.respondWith2Ecom/wixpress/grpc/StartRest$HttpServerAdapter.$anonfun$channelRead0$12Mcom/wixpress/grpc/StartRest$HttpServerAdapter.$anonfun$channelRead0$1$adapted2Jcom/wixpress/grpc/StartRest$HttpServerAdapter$$Lambda$2070/469164790.apply2:scala/collection/Iterator$$Lambda$495/495984416.get$Lambda2"scala/collection/Iterator.toStream2#scala/collection/Iterator.toStream$2*scala/collection/AbstractIterator.toStream2-scala/collection/Iterator.$anonfun$toStream$125scala/collection/Iterator$$Lambda$495/495984416.apply2Cscala/collection/immutable/Stream$$Lambda$1119/490879749.get$Lambda2;scalapb/descriptors/Reads$$$Lambda$976/732611751.get$Lambda2#scalapb/descriptors/Reads$.optional29com/google/protobuf/struct/Value$.$anonfun$messageReads$92>com/google/protobuf/struct/Value$$$Lambda$2264/973257206.apply2java/lang/StringUTF16.compress2=io/netty/util/internal/AppendableCharSequence.subStringUnsafe29io/netty/handler/codec/http/HttpObjectDecoder.splitHeader2+scala/collection/mutable/LazyBuilder.26scala/collection/immutable/Stream$StreamBuilder.2-scala/collection/immutable/Stream$.newBuilder2Hscala/collection/generic/GenTraversableFactory$GenericCanBuildFrom.apply2"java/io/BufferedInputStream.23sun/net/www/protocol/file/FileURLConnection.connect2:sun/net/www/protocol/file/FileURLConnection.getInputStream2java/net/URL.openStream2)java/lang/ClassLoader.getResourceAsStream2Kscala/collection/immutable/StreamIterator$$Lambda$254/1657697023.get$Lambda2.scala/collection/immutable/StreamIterator.next2Bcom/wixpress/grpc/rest/HttpCallScopeProducer.timeBudgetHeaderValue2;com/fasterxml/jackson/core/util/TextBuffer.contentsAsString2=com/fasterxml/jackson/core/json/ReaderBasedJsonParser.getText2*scala/collection/immutable/Vector.iterator2"scala/collection/IterableLike.find2#scala/collection/IterableLike.find$2&scala/collection/AbstractIterable.find20scalapb/descriptors/Descriptor.findFieldByNumber22io/netty/channel/DefaultChannelPipeline.newContext2/io/netty/channel/DefaultChannelPipeline.addLast2:scala/collection/generic/Growable.$anonfun$$plus$plus$eq$12>scala/collection/generic/Growable$$Lambda$139/1989332276.apply2+scala/collection/immutable/Map$Map4.foreach2?scala/collection/immutable/HashMap$HashMapBuilder.$plus$plus$eq2Escala/collection/immutable/Map$MapBuilderImpl.convertToHashMapBuilder2#java/lang/reflect/Array.newInstance2/scala/reflect/ClassTag$GenericClassTag.newArray2fcom/wixpress/monitoring/panorama/v1/LogController.emitPanoramaHttpRequestLogLineTotalPerArtifactMetric2Acom/wixpress/monitoring/panorama/v1/LogController.$anonfun$rate$12Icom/wixpress/monitoring/panorama/v1/LogController.$anonfun$rate$1$adapted2Ocom/wixpress/monitoring/panorama/v1/LogController$$Lambda$2303/2119068677.apply23scala/collection/mutable/HashMap.$anonfun$foreach$12=scala/collection/mutable/HashMap$$Lambda$150/1365711624.apply2/scala/collection/mutable/HashTable.foreachEntry20scala/collection/mutable/HashTable.foreachEntry$2-scala/collection/mutable/HashMap.foreachEntry2(scala/collection/mutable/HashMap.foreach26com/wixpress/monitoring/panorama/v1/LogController.rate2Hcom/wixpress/framework/passthrough/PassThroughValuesFilter.filterHeaders2>com/wixpress/grpc/rest/HttpCallScopeProducer.passThroughValues21scala/Predef$ArrowAssoc$.$minus$greater$extension29scala/concurrent/Future$$Lambda$576/1062005554.get$Lambda2scala/concurrent/Future.flatMap2 scala/concurrent/Future.flatMap$22=scala/collection/immutable/HashMap$HashTrieMap$$anon$7.2,scala/collection/generic/GenMapFactory.apply2java/util/concurrent/CompletableFuture$UniWhenComplete.tryFire25java/util/concurrent/CompletableFuture$Completion.run2Lorg/asynchttpclient/netty/NettyResponseFuture$$Lambda$1074/928025503.execute2:java/util/concurrent/CompletableFuture$UniCompletion.claim23java/util/concurrent/CompletableFuture.postComplete2/java/util/concurrent/CompletableFuture.complete29org/asynchttpclient/netty/NettyResponseFuture.loadContent22org/asynchttpclient/netty/NettyResponseFuture.done2Eorg/asynchttpclient/netty/handler/AsyncHttpClientHandler.finishUpdate29org/asynchttpclient/netty/handler/HttpHandler.handleChunk28org/asynchttpclient/netty/handler/HttpHandler.handleRead2Dorg/asynchttpclient/netty/handler/AsyncHttpClientHandler.channelRead2+scala/collection/immutable/Map$Map3.updated2)scala/collection/immutable/Map$Map3.$plus2'scala/collection/immutable/Map$Map2.get2Hcom/google/protobuf/struct/Struct$FieldsEntry$.$anonfun$keyValueMapper$22Lcom/google/protobuf/struct/Struct$FieldsEntry$$$Lambda$2153/1110642561.apply2-io/grpc/netty/GrpcHttp2OutboundHeaders.2;io/grpc/netty/GrpcHttp2OutboundHeaders.clientRequestHeaders2(io/grpc/netty/Utils.convertClientHeaders29io/grpc/netty/NettyClientStream$Sink.writeHeadersInternal21io/grpc/netty/NettyClientStream$Sink.writeHeaders2+io/grpc/internal/AbstractClientStream.start2-io/grpc/internal/ForwardingClientStream.start2@io/grpc/internal/InternalSubchannel$CallTracingTransport$1.start2-io/grpc/internal/ClientCallImpl.startInternal2%io/grpc/internal/ClientCallImpl.start2Cio/grpc/census/CensusTracingModule$TracingClientInterceptor$1.start2?io/grpc/census/CensusStatsModule$StatsClientInterceptor$1.start2"io/grpc/ForwardingClientCall.start2[io/grpc/stub/MetadataUtils$HeaderAttachingClientInterceptor$HeaderAttachingClientCall.start25com/wixpress/grpc/ClientMetricsReporter$$anon$1.start2=com/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1.start25com/wixpress/grpc/ClientDetailsReporter$$anon$1.start2@com/wixpress/grpc/ClientRequestSizeMetricsReporter$$anon$1.start2-com/google/common/io/ByteStreams.createBuffer2%com/google/common/io/ByteStreams.copy22io/grpc/internal/MessageFramer.writeToOutputStream2;io/grpc/internal/MessageFramer.writeKnownLengthUncompressed20io/grpc/internal/MessageFramer.writeUncompressed2+io/grpc/internal/MessageFramer.writePayload2,io/grpc/internal/AbstractStream.writeMessage24io/grpc/internal/ForwardingClientStream.writeMessage23io/grpc/internal/ClientCallImpl.sendMessageInternal2+io/grpc/internal/ClientCallImpl.sendMessage2Acom/google/protobuf/ByteString$LiteralByteString.toStringInternal2'com/google/protobuf/ByteString.toString2+com/google/protobuf/ByteString.toStringUtf82,scala/collection/mutable/ListBuffer.$plus$eq21org/json4s/jackson/JValueDeserializer.deserialize27com/fasterxml/jackson/databind/ObjectMapper.treeToValue2+org/json4s/jackson/JsonMethods.fromJsonNode2,org/json4s/jackson/JsonMethods.fromJsonNode$2,org/json4s/jackson/JsonMethods$.fromJsonNode21com/wix/api/RequestContext$AspectsEntry.mergeFrom2scalapb/LiteParser$.readMessage2:scala/collection/SeqLike$$Lambda$494/1692066743.get$Lambda2!scala/collection/SeqLike.contains2"scala/collection/SeqLike.contains$2-scala/collection/immutable/StringOps.contains2Jcom/wixpress/grpc/IncorrectArtifactCalledDetector$.makeArtifactIdCanonical2(com/google/common/io/BaseEncoding.encode22io/grpc/internal/TransportFrameUtil.toHttp2Headers2]com/wixpress/framework/passthrough/PassThroughValuesFilter$$Lambda$1928/1407686499.get$Lambda2ˆcom/wixpress/framework/passthrough/PassThroughValuesFilter.com$wixpress$framework$passthrough$PassThroughValuesFilter$$headerNameAllowed2Scom/wixpress/framework/passthrough/PassThroughValuesFilter.$anonfun$filterHeaders$12[com/wixpress/framework/passthrough/PassThroughValuesFilter.$anonfun$filterHeaders$1$adapted2Wcom/wixpress/framework/passthrough/PassThroughValuesFilter$$Lambda$1927/205448287.apply2Dcom/google/protobuf/struct/Value$$$Lambda$2258/1383381276.get$Lambda20scala/collection/immutable/Map$Map2.keysIterator27io/netty/buffer/UnpooledUnsafeHeapByteBuf.allocateArray2\io/netty/buffer/UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.allocateArray2*io/netty/buffer/UnpooledHeapByteBuf.20io/netty/buffer/UnpooledUnsafeHeapByteBuf.2Uio/netty/buffer/UnpooledByteBufAllocator$InstrumentedUnpooledUnsafeHeapByteBuf.26io/netty/buffer/UnpooledByteBufAllocator.newHeapBuffer23io/netty/buffer/AbstractByteBufAllocator.heapBuffer2io/netty/buffer/Unpooled.buffer2>io/netty/handler/codec/http2/DefaultHttp2HeadersEncoder.2;io/netty/handler/codec/http2/DefaultHttp2FrameWriter.2+io/grpc/netty/NettyServerHandler.newHandler20io/grpc/netty/NettyServerTransport.createHandler2(io/grpc/netty/NettyServerTransport.start2'io/grpc/netty/NettyServer$1.initChannel2Icom/wixpress/ratelimiter/contract/ReportUsageIfEligibleResponse.mergeFrom2Jcom/wixpress/ratelimiter/contract/ReportUsageIfEligibleResponse$.parseFrom2scalapb/grpc/Marshaller.parse2&io/grpc/MethodDescriptor.parseResponse2Wio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInternal2Xio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl$1MessagesAvailable.runInContext2%scala/collection/immutable/Stream.zip2Gcom/wixpress/framework/tracking/consent/Domain$.isSubdomainOf$extension2Ccom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$52Kcom/wixpress/framework/tracking/consent/Policies.$anonfun$resolve$5$adapted2Mcom/wixpress/framework/tracking/consent/Policies$$Lambda$2039/117119175.apply2*scala/collection/immutable/Set$Set2.exists2java/time/LocalDate.ofEpochDay2&java/lang/AbstractStringBuilder.2java/lang/StringBuilder.2Bscala/collection/TraversableLike$$Lambda$140/2080125222.get$Lambda27java/lang/invoke/LambdaForm$DMH/1990098664.invokeStatic2com/google/common/util/concurrent/Futures$CallbackListener.run2@com/google/common/util/concurrent/AbstractFuture.executeListener29com/google/common/util/concurrent/AbstractFuture.complete24com/google/common/util/concurrent/AbstractFuture.set2'io/grpc/stub/ClientCalls$GrpcFuture.set24io/grpc/stub/ClientCalls$UnaryStreamToFuture.onClose2+scala/collection/immutable/Stream.partition2@com/wixpress/monitoring/panorama/v1/Converter.$anonfun$version$12Hcom/wixpress/monitoring/panorama/v1/Converter.$anonfun$version$1$adapted2Kcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3198/2071923867.apply2>com/wixpress/monitoring/panorama/v1/Converter.$anonfun$from$122Jcom/wixpress/monitoring/panorama/v1/Converter$$Lambda$3267/511098654.apply2Acom/wixpress/framework/util/cookies/CookieDomainResolver$.resolve2Icom/wixpress/framework/util/cookies/CookieDomainResolver$.getCookieDomain2Kcom/wixpress/framework/aspects/CookieDomainAspect$$anon$1.$anonfun$decode$12Vcom/wixpress/framework/aspects/CookieDomainAspect$$anon$1$$Lambda$1999/463025593.apply2@com/wixpress/framework/aspects/CookieDomainAspect$$anon$1.decode2java/time/LocalDate.toString2=com/wixpress/common/devices/overrides/Trigger.lambda$create$12Icom/wixpress/common/devices/overrides/Trigger$$Lambda$388/1636824514.test25com/wixpress/common/devices/overrides/Trigger.matches2Ecom/wixpress/common/devices/overrides/DeviceOverride.lambda$matches$02Pcom/wixpress/common/devices/overrides/DeviceOverride$$Lambda$2306/804483753.test2+java/util/stream/MatchOps$1MatchSink.accept23java/util/ArrayList$ArrayListSpliterator.tryAdvance24java/util/stream/ReferencePipeline.forEachWithCancel24java/util/stream/AbstractPipeline.copyIntoWithCancel2*java/util/stream/AbstractPipeline.copyInto21java/util/stream/AbstractPipeline.wrapAndCopyInto24java/util/stream/MatchOps$MatchOp.evaluateSequential2*java/util/stream/AbstractPipeline.evaluate2Fscala/collection/immutable/Stream$StreamWithFilter.filtered$lzycompute2;scala/collection/immutable/Stream$StreamWithFilter.filtered2Hscala/collection/immutable/Stream$StreamWithFilter.$anonfun$withFilter$22Oscala/collection/immutable/Stream$StreamWithFilter$$Lambda$1908/933794650.apply29scala/collection/immutable/Stream$StreamWithFilter.2=scala/collection/immutable/Stream$StreamWithFilter.withFilter25scala/collection/immutable/StringOps$.slice$extension2*scala/collection/immutable/StringOps.slice2)scala/collection/IndexedSeqOptimized.take2*scala/collection/IndexedSeqOptimized.take$2)scala/collection/immutable/StringOps.take25ch/qos/logback/core/pattern/FormattingConverter.write2Cch/qos/logback/core/pattern/PatternLayoutBase.writeLoopOnConverters2-ch/qos/logback/classic/PatternLayout.doLayout2:ch/qos/logback/core/encoder/LayoutWrappingEncoder.doEncode21ch/qos/logback/core/OutputStreamAppender.writeOut2)ch/qos/logback/core/FileAppender.writeOut22ch/qos/logback/core/OutputStreamAppender.subAppend29ch/qos/logback/core/rolling/RollingFileAppender.subAppend2/ch/qos/logback/core/OutputStreamAppender.append27ch/qos/logback/core/UnsynchronizedAppenderBase.doAppend2Dch/qos/logback/core/spi/AppenderAttachableImpl.appendLoopOnAppenders20ch/qos/logback/core/AsyncAppenderBase$Worker.run2java/lang/String.split2+scala/collection/immutable/StringLike.split2,scala/collection/immutable/StringLike.split$2*scala/collection/immutable/StringOps.split25com/wixpress/framework/tracking/consent/Domain$.apply2Dcom/wixpress/framework/tracking/consent/Policies.domain$lzycompute$129com/wixpress/framework/tracking/consent/Policies.domain$12java/util/regex/Pattern.split23sun/security/util/AlgorithmDecomposer.decomposeImpl2/sun/security/util/AlgorithmDecomposer.decompose21sun/security/ssl/SSLAlgorithmDecomposer.decompose2=sun/security/util/AbstractAlgorithmConstraints.checkAlgorithm26sun/security/util/DisabledAlgorithmConstraints.permits20sun/security/ssl/SSLAlgorithmConstraints.permits2'sun/security/ssl/NamedGroup.isPermitted2Gsun/security/ssl/SupportedGroupsExtension$SupportedGroups.isActivatable2/sun/security/ssl/HandshakeContext.isActivatable27sun/security/ssl/HandshakeContext.getActiveCipherSuites2(sun/security/ssl/HandshakeContext.2.sun/security/ssl/ClientHandshakeContext.2+sun/security/ssl/TransportContext.kickstart2-sun/security/ssl/SSLSocketImpl.startHandshake2Bio/pyroscope/okhttp3/internal/connection/RealConnection.connectTls2Iio/pyroscope/okhttp3/internal/connection/RealConnection.establishProtocol2?io/pyroscope/okhttp3/internal/connection/RealConnection.connect2Fio/pyroscope/okhttp3/internal/connection/ExchangeFinder.findConnection2Mio/pyroscope/okhttp3/internal/connection/ExchangeFinder.findHealthyConnection2io/pyroscope/okhttp3/internal/cache/CacheInterceptor.intercept2>io/pyroscope/okhttp3/internal/http/BridgeInterceptor.intercept2Hio/pyroscope/okhttp3/internal/http/RetryAndFollowUpInterceptor.intercept2Xio/pyroscope/okhttp3/internal/connection/RealCall.getResponseWithInterceptorChain$okhttp29io/pyroscope/okhttp3/internal/connection/RealCall.execute22Bio/pyroscope/okhttp3/internal/http2/Http2Connection$Builder.2Bio/pyroscope/okhttp3/internal/connection/RealConnection.startHttp22@ch/qos/logback/core/encoder/LayoutWrappingEncoder.convertToBytes27jdk/internal/loader/BuiltinClassLoader.findLoadedModule2:io/pyroscope/okhttp3/internal/http2/Http2Connection.2Aio/pyroscope/okhttp3/internal/http2/Http2Connection$Builder.build2%jdk/internal/loader/Resource.getBytes25jdk/internal/loader/URLClassPath$JarLoader$2.getBytes2)io/pyroscope/okhttp3/OkHttpClient.newCall2java/lang/String.concat22io/pyroscope/okhttp3/internal/Util.hasIntersection20io/pyroscope/okhttp3/ConnectionSpec.isCompatible2Uio/pyroscope/okhttp3/internal/connection/ConnectionSpecSelector.configureSecureSocket2.scala/collection/mutable/ResizableArray.$init$2+scala/collection/mutable/ArrayBuffer.2/scala/collection/mutable/IndexedSeq$.newBuilder2-scala/collection/immutable/TreeMap.$plus$plus28com/wixpress/framework/aspects/CaseInsensitiveMap$.apply2Scom/wixpress/framework/aspects/response/AggregatedResponseAspects.$anonfun$aspect$22^com/wixpress/framework/aspects/response/AggregatedResponseAspects$$Lambda$2004/657901361.apply2Gcom/wixpress/grpc/rest/ResponseAspects$.$anonfun$wixNewSessionCookies$12Dcom/wixpress/grpc/rest/ResponseAspects$$$Lambda$2007/622161988.apply22Gio/pyroscope/okhttp3/internal/connection/RealConnection.newCodec$okhttp2$sun/net/util/URLUtil.urlNoFragString2java/security/CodeSource.2?com/wixpress/framework/aspects/JettyCookieParser.addCookieField2(java/util/zip/InflaterInputStream.27java/util/zip/ZipFile$ZipFileInflaterInputStream.2$java/util/zip/ZipFile.getInputStream2$java/util/jar/JarFile.getInputStream2;jdk/internal/loader/URLClassPath$JarLoader$2.getInputStream2.jdk/internal/loader/Resource.cachedInputStream2*jdk/internal/loader/Resource.getByteBuffer2Qcom/wix/core/services/identification2/IdentificationData$.$anonfun$messageReads$12Wcom/wix/core/services/identification2/IdentificationData$$$Lambda$2494/1430842561.apply2Acom/wix/identification/utils/jwt/JwtRSAHandler$.$anonfun$verify$12Kcom/wix/identification/utils/jwt/JwtRSAHandler$$$Lambda$2598/44174232.apply2Ycom/wixpress/framework/metrics/graphite/core/package$MetricNameOps$.$anonfun$renderWith$12`com/wixpress/framework/metrics/graphite/core/package$MetricNameOps$$$Lambda$282/1831717330.apply2java/util/HashMap.newNode2java/util/HashSet.add2,sun/security/ssl/SignatureScheme.isPermitted27sun/security/ssl/SignatureScheme.getSupportedAlgorithms2Psun/security/ssl/SignatureAlgorithmsExtension$CHSignatureSchemesProducer.produce2%sun/security/ssl/SSLExtension.produce2&sun/security/ssl/SSLExtensions.produce2Asun/security/ssl/ClientHello$ClientHelloKickstartProducer.produce2'sun/security/ssl/SSLHandshake.kickstart21sun/security/ssl/ClientHandshakeContext.kickstart25com/fasterxml/jackson/databind/node/ObjectNode.2>com/fasterxml/jackson/databind/node/JsonNodeFactory.objectNode23io/pyroscope/okhttp3/internal/http2/Header.2Qio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec$Companion.http2HeadersList2Jio/pyroscope/okhttp3/internal/http2/Http2ExchangeCodec.writeRequestHeaders2Eio/pyroscope/okhttp3/internal/connection/Exchange.writeRequestHeaders28com/fasterxml/jackson/databind/ObjectMapper.treeAsTokens21io/pyroscope/okhttp3/internal/Util.toImmutableMap2*io/pyroscope/okhttp3/Request$Builder.build23java/util/Formatter$FormatSpecifier.appendJustified2)java/util/Formatter$FormatSpecifier.print2/java/util/Formatter$FormatSpecifier.printString2&scala/collection/IterableLike.toStream2'scala/collection/IterableLike.toStream$20scala/collection/mutable/ArrayOps$ofRef.toStream2.com/wixpress/grpc/rest/CookieCutter$.cookiesOf2Cscala/collection/generic/Growable$$Lambda$139/1989332276.get$Lambda2#scala/collection/TraversableLike.to2$scala/collection/TraversableLike.to$2*scala/collection/mutable/ArrayOps$ofRef.to2-scala/collection/TraversableOnce.toIndexedSeq2.scala/collection/TraversableOnce.toIndexedSeq$24scala/collection/mutable/ArrayOps$ofRef.toIndexedSeq2scala/Array$.unapplySeq2Hcom/wixpress/framework/util/cookies/CookieDomainResolver$.stagingDomains2Lcom/wixpress/framework/util/cookies/CookieDomainResolver$.$anonfun$resolve$12Vcom/wixpress/framework/util/cookies/CookieDomainResolver$$$Lambda$2329/673584814.apply2java/time/LocalTime.create2java/time/LocalTime.ofNanoOfDay2&java/math/MutableBigInteger.toIntArray2Gcom/wixpress/grpc/rest/tracing/RestRequestSpanBuilder.addResponseStatus2;com/wixpress/grpc/rest/middlewares/Tracing.$anonfun$apply$22Ccom/wixpress/grpc/rest/middlewares/Tracing.$anonfun$apply$2$adapted2Hcom/wixpress/grpc/rest/middlewares/Tracing$$Lambda$2068/1495106548.apply28org/jose4j/json/internal/json_simple/parser/Yylex.yytext2(scala/collection/IterableLike.toIterator2)scala/collection/IterableLike.toIterator$2,scala/collection/AbstractIterable.toIterator2Icom/fasterxml/jackson/core/json/JsonWriteContext.createChildObjectContext2@com/fasterxml/jackson/databind/util/TokenBuffer.writeStartObject27scala/PartialFunction$$Lambda$538/1967118241.get$Lambda2scala/PartialFunction.runWith2scala/PartialFunction.runWith$2-scala/runtime/AbstractPartialFunction.runWith2=com/wixpress/framework/aspects/AspectFilter.$anonfun$filter$22Ecom/wixpress/framework/aspects/AspectFilter.$anonfun$filter$2$adapted2Icom/wixpress/framework/aspects/AspectFilter$$Lambda$1907/2077742605.apply2Gscala/collection/MapLike$MappedValues$$Lambda$146/1539038539.get$Lambda2-scala/collection/MapLike$MappedValues.foreach21scala/collection/mutable/ListBuffer.$plus$plus$eq2'scala/collection/AbstractTraversable.to2'scala/collection/TraversableOnce.toList2(scala/collection/TraversableOnce.toList$2+scala/collection/AbstractTraversable.toList2)scalapb/json4s/StructFormat$.structWriter26scalapb/json4s/JsonFormat$.$anonfun$DefaultRegistry$1127scalapb/json4s/JsonFormat$$$Lambda$192/1725266971.apply27scalapb/json4s/FormatRegistry.$anonfun$registerWriter$129scalapb/json4s/FormatRegistry$$Lambda$129/854989361.apply2scalapb/json4s/Printer.toJson24io/netty/handler/codec/DefaultHeaders.newHeaderEntry2*io/netty/handler/codec/DefaultHeaders.add02)io/netty/handler/codec/DefaultHeaders.add2/io/netty/handler/codec/DefaultHeaders.addObject22io/netty/handler/codec/http/DefaultHttpHeaders.add2?com/fasterxml/jackson/core/io/SegmentedStringWriter.getAndClear2@scalapb/descriptors/Descriptor$$Lambda$174/1617937669.get$Lambda29com/google/protobuf/struct/Value$.$anonfun$messageReads$62>com/google/protobuf/struct/Value$$$Lambda$2252/296218631.apply224io/netty/handler/codec/http/HttpObjectDecoder.25io/netty/handler/codec/http/HttpRequestDecoder.2Kio/netty/handler/codec/http/HttpServerCodec$HttpServerRequestDecoder.22io/netty/handler/codec/http/HttpServerCodec.2scala/Option.toList2scala/Option$.option2Iterable2$io/grpc/ClientInterceptors.intercept29com/wixpress/grpc/GrpcClientWithCallScope$.prepareChannel2:com/wixpress/grpc/GrpcClientWithCallScope$.buildClientCall2/com/wixpress/grpc/AspectsCache.cache$lzycompute2$com/wixpress/grpc/AspectsCache.cache2Ncom/wixpress/framework/loom/warmup/WarmUpCircuitBreakerWrapper.isWarmUpRequest2'scala/concurrent/impl/Promise.transform2(scala/concurrent/impl/Promise.transform$26scala/concurrent/impl/Promise$DefaultPromise.transform2!scala/concurrent/Future.transform2"scala/concurrent/Future.transform$24com/wixpress/framework/errors/ErrorMapper$.mapFuture2scala/collection/Iterator.find2scala/collection/Iterator.find$2&scala/collection/AbstractIterator.find2?com/wixpress/grpc/AspectsCache$$Lambda$793/971695536.get$Lambda2+scala/collection/immutable/Map$Map2.updated2)scala/collection/immutable/Map$Map2.$plus2&java/util/Collections.unmodifiableList2+io/grpc/CallOptions.withStreamTracerFactory2Iio/grpc/census/CensusTracingModule$TracingClientInterceptor.interceptCall25io/grpc/ClientInterceptors$InterceptorChannel.newCall2Eio/grpc/census/CensusStatsModule$StatsClientInterceptor.interceptCall2Iio/grpc/stub/MetadataUtils$HeaderAttachingClientInterceptor.interceptCall26com/wixpress/grpc/ClientMetricsReporter$$anon$1.25com/wixpress/grpc/ClientMetricsReporter.interceptCall2>com/wixpress/grpc/ClientMetricsNewRelicReporter$$anon$1.2=com/wixpress/grpc/ClientMetricsNewRelicReporter.interceptCall26com/wixpress/grpc/ClientDetailsReporter$$anon$1.26com/wixpress/grpc/ClientDetailsReporter$.interceptCall2Acom/wixpress/grpc/ClientRequestSizeMetricsReporter$$anon$1.2@com/wixpress/grpc/ClientRequestSizeMetricsReporter.interceptCall2+io/grpc/internal/ManagedChannelImpl.newCall21io/grpc/internal/ForwardingManagedChannel.newCall2Icom/wixpress/grpc/Interceptors$WixContextClientInterceptor$$anon$1.2Hcom/wixpress/grpc/Interceptors$WixContextClientInterceptor.interceptCall23com/fasterxml/jackson/core/JsonFactory.createParser2_com/wixpress/monitoring/panorama/v1/LogController.emitPanoramaHttpRequestTotalPerArtifactMetric2$scala/collection/IterableLike.exists2%scala/collection/IterableLike.exists$2(scala/collection/AbstractIterable.exists2%scala/collection/AbstractSeq.contains2"java/net/URLStreamHandler.parseURL2*sun/net/www/protocol/file/Handler.parseURL2java/net/URL.27jdk/internal/loader/URLClassPath$FileLoader.getResource28jdk/internal/loader/URLClassPath$FileLoader.findResource2-jdk/internal/loader/URLClassPath.findResource2>jdk/internal/loader/BuiltinClassLoader.findResourceOnClassPath23jdk/internal/loader/BuiltinClassLoader.findResource2!java/lang/ClassLoader.getResource22io/netty/util/AsciiString.of2,io/grpc/netty/NettyClientStream.setAuthority24io/grpc/internal/ForwardingClientStream.setAuthority24scalapb/json4s/StructFormat$.$anonfun$structParser$129scalapb/json4s/StructFormat$$$Lambda$2175/596021038.apply2)scalapb/json4s/StructFormat$.structParser26scalapb/json4s/JsonFormat$.$anonfun$DefaultRegistry$1226scalapb/json4s/JsonFormat$$$Lambda$193/659115590.apply27scalapb/json4s/FormatRegistry.$anonfun$registerWriter$22:scalapb/json4s/FormatRegistry$$Lambda$130/1369468094.apply2java/util/HashMap.entrySet28io/grpc/census/CensusStatsModule$ClientCallTracer.24io/grpc/census/CensusStatsModule.newClientCallTracer2ccom/wixpress/framework/aspects/response/AggregatedResponseAspects$$Lambda$2003/263504534.get$Lambda2Ncom/wixpress/grpc/InvalidatedAspectTransport$.$anonfun$addInvalidatedAspects$12Jcom/wixpress/grpc/InvalidatedAspectTransport$$$Lambda$781/1759975376.apply2Ccom/wixpress/grpc/InvalidatedAspectTransport$.addInvalidatedAspects2:com/google/protobuf/struct/Value$.$anonfun$messageReads$132>com/google/protobuf/struct/Value$$$Lambda$2284/398363668.apply2:com/google/protobuf/struct/Value$.$anonfun$messageReads$122=com/google/protobuf/struct/Value$$$Lambda$2269/59754955.apply28com/google/protobuf/struct/ListValue.$anonfun$getField$12@com/google/protobuf/struct/ListValue.$anonfun$getField$1$adapted2Bcom/google/protobuf/struct/ListValue$$Lambda$2232/1656067055.apply2-com/google/protobuf/struct/ListValue.getField2/com/google/protobuf/struct/ListValue.toPMessage24com/google/protobuf/struct/Value.$anonfun$getField$82com/google/protobuf/struct/Value$$Lambda$2215/1061001646.apply21scala/collection/immutable/IndexedSeq$.newBuilder2(scala/LowPriorityImplicits$$anon$4.apply2Ccom/wixpress/grpc/MetricsNotifierOperations.extractClassMethodNames2.scalapb/json4s/StructFormat$.structValueParser27jdk/internal/loader/URLClassPath$JarLoader.findResource2+scala/collection/immutable/Map$Map1.updated2)scala/collection/immutable/Map$Map1.$plus27scalapb/json4s/StructFormat$.$anonfun$listValueParser$12:scalapb/json4s/StructFormat$$$Lambda$2185/2141798273.apply2,scalapb/json4s/StructFormat$.listValueParser23com/wixpress/framework/tracing/RootOperation.2Hcom/wixpress/framework/tracing/ServerOperations$TracedRestRequest.2Jcom/wixpress/grpc/rest/tracing/RestRequestSpanBuilder.buildTracedOperation2io/netty/handler/codec/http2/DefaultHttp2FrameReader.readFrame2>io/netty/handler/codec/http2/Http2InboundFrameLogger.readFrame2Fio/netty/handler/codec/http2/DefaultHttp2ConnectionDecoder.decodeFrame2Gio/netty/handler/codec/http2/Http2ConnectionHandler$FrameDecoder.decode2:io/netty/handler/codec/http2/Http2ConnectionHandler.decode2java/io/FileInputStream.27sun/security/provider/NativePRNG$RandomIO.implNextBytes20sun/security/provider/NativePRNG.engineNextBytes2$java/security/SecureRandom.nextBytes2java/util/UUID.randomUUID2Lcom/wixpress/grpc/StartRest$HttpServerAdapter.$anonfun$restExposureRequest$12Jcom/wixpress/grpc/StartRest$HttpServerAdapter$$Lambda$1857/210310287.apply2Hcom/wixpress/framework/aspects/RequestIdAspect$.$anonfun$strictDecoder$22Kcom/wixpress/framework/aspects/RequestIdAspect$$$Lambda$824/292188150.apply2Hcom/wixpress/framework/aspects/RequestIdAspect$.$anonfun$strictDecoder$12Mcom/wixpress/framework/aspects/RequestIdAspect$$$Lambda$801/1971147338.decode24com/wixpress/grpc/Interceptors$.requestIdFromAspects2Bcom/wixpress/grpc/Interceptors$.aspectsWithRequestIdHeaderFallback2Bcom/wixpress/grpc/Interceptors$.$anonfun$maybeRequestAspectsFrom$322?com/fasterxml/jackson/databind/node/TreeTraversingParser.2*scala/collection/TraversableLike.grouper$22(scala/collection/TraversableLike.groupBy2)scala/collection/TraversableLike.groupBy$2,scala/collection/AbstractTraversable.groupBy20java/util/concurrent/ConcurrentLinkedQueue.offer2.java/util/concurrent/ConcurrentLinkedQueue.add2,io/grpc/internal/SerializingExecutor.execute2Jio/grpc/internal/ClientCallImpl$ClientStreamListenerImpl.messagesAvailable2Aio/grpc/internal/ForwardingClientStreamListener.messagesAvailable2@io/grpc/internal/AbstractStream$TransportState.messagesAvailable2,io/grpc/internal/MessageDeframer.processBody2(io/grpc/internal/MessageDeframer.deliver2(io/grpc/internal/MessageDeframer.deframe26io/grpc/internal/AbstractStream$TransportState.deframe2Hio/grpc/internal/AbstractClientStream$TransportState.inboundDataReceived2Fio/grpc/internal/Http2ClientStreamTransportState.transportDataReceived2Dio/grpc/netty/NettyClientStream$TransportState.transportDataReceived2+io/grpc/netty/NettyClientHandler.onDataRead2,io/grpc/netty/NettyClientHandler.access$110029io/grpc/netty/NettyClientHandler$FrameListener.onDataRead2Wio/netty/handler/codec/http2/DefaultHttp2ConnectionDecoder$FrameReadListener.onDataRead2Aio/netty/handler/codec/http2/Http2InboundFrameLogger$1.onDataRead2Iio/netty/handler/codec/http2/DefaultHttp2FrameWriter.writeHeadersInternal2Aio/netty/handler/codec/http2/DefaultHttp2FrameWriter.writeHeaders2Bio/netty/handler/codec/http2/Http2OutboundFrameLogger.writeHeaders2Eio/grpc/netty/NettyClientHandler$PingCountingFrameWriter.writeHeaders2Fio/netty/handler/codec/http2/DefaultHttp2ConnectionEncoder.sendHeaders2-io/netty/handler/codec/http2/HpackEncoder.add26io/netty/handler/codec/http2/HpackEncoder.encodeHeader2Nio/netty/handler/codec/http2/HpackEncoder.encodeHeadersIgnoreMaxHeaderListSize2Oio/netty/handler/codec/http2/HpackEncoder.encodeHeadersEnforceMaxHeaderListSize27io/netty/handler/codec/http2/HpackEncoder.encodeHeaders2Eio/netty/handler/codec/http2/DefaultHttp2HeadersEncoder.encodeHeaders2"com/wix/api/RequestContext.writeTo2#java/nio/DirectByteBuffer.duplicate2>io/netty/buffer/PooledUnsafeDirectByteBuf.newInternalNioBuffer20io/netty/buffer/PooledByteBuf._internalNioBuffer28io/netty/buffer/PooledByteBuf.duplicateInternalNioBuffer2'io/netty/buffer/PooledByteBuf.nioBuffer27io/netty/buffer/AbstractUnpooledSlicedByteBuf.nioBuffer28io/netty/buffer/AbstractDerivedByteBuf.internalNioBuffer21io/netty/channel/ChannelOutboundBuffer.nioBuffers2(scala/collection/immutable/List.toStream2?scala/collection/immutable/NewRedBlackTree$MapHelper.mutableUpd2.scala/collection/immutable/TreeMap$Adder.apply29com/wixpress/framework/aspects/CaseInsensitiveMap$.concat25com/wixpress/grpc/CallScope.queryAspectMap$lzycompute2*com/wixpress/grpc/CallScope.queryAspectMap2-scala/collection/mutable/StringBuilder.2)scala/collection/TraversableOnce.mkString2*scala/collection/TraversableOnce.mkString$2-scala/collection/AbstractTraversable.mkString2;com/wixpress/grpc/xseenby/XSeenByAspect$.$anonfun$encoder$12Gcom/wixpress/grpc/xseenby/XSeenByAspect$$$Lambda$2017/1787608332.encode2Lcom/wixpress/framework/aspects/response/AggregatedResponseAspects.withAspect2Rcom/wixpress/framework/aspects/response/AtomicResponseAspects.$anonfun$mergeWith$12Zcom/wixpress/framework/aspects/response/AtomicResponseAspects$$Lambda$2112/757697389.apply2Gcom/wixpress/framework/aspects/response/AtomicResponseAspects.mergeWith2Tcom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.$anonfun$addXSeenByAspect$12\com/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.$anonfun$addXSeenByAspect$1$adapted2Ucom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator$$Lambda$2109/332657697.apply2Icom/wixpress/grpc/xseenby/XSeenByResponseAspectPopulator.addXSeenByAspect2java/nio/DirectByteBuffer.slice2java/util/TreeSet.2"java/lang/StringCoding.decodeASCII2$io/grpc/Metadata$AsciiKey.parseBytes2io/grpc/Metadata.valueAsT2io/grpc/Metadata.get2Kio/grpc/internal/AbstractClientStream$TransportState.inboundHeadersReceived2Iio/grpc/internal/Http2ClientStreamTransportState.transportHeadersReceived2Jcom/wixpress/ratelimiter/contract/ReportUsageIfEligibleRequest.toByteArray2scalapb/grpc/Marshaller.stream2&io/grpc/MethodDescriptor.streamRequest2-scala/collection/immutable/Vector.appendFront2-scala/collection/immutable/Vector.$plus$colon2Hcom/wixpress/framework/aspects/response/AggregatedResponseAspects.2Fcom/wixpress/framework/aspects/response/AggregatedResponseAspects.copy2[com/wixpress/monitoring/panorama/bp/AsyncRateLimiterGrpc$$Lambda$2221/1689630732.get$Lambda26java/lang/invoke/LambdaForm$DMH/959918415.invokeStatic2io/opencensus/implcore/trace/SpanBuilderImpl.startSpanInternal26io/opencensus/implcore/trace/SpanBuilderImpl.startSpan2:io/grpc/census/CensusTracingModule$ClientCallTracer.26io/grpc/census/CensusTracingModule.newClientCallTracer2/scala/collection/mutable/StringBuilder.toString20scala/collection/mutable/ArrayOps$ofRef.mkString2Acom/wixpress/framework/logging/StacktraceLogHighlighter.transform26io/opencensus/implcore/internal/TimestampConverter.now28io/opencensus/implcore/trace/RecordEventsSpanImpl.2;io/opencensus/implcore/trace/RecordEventsSpanImpl.startSpan2;com/wixpress/grpc/rest/backends/CsrfFilter$HostToken$.apply2%scala/collection/immutable/Stream.map2java/util/regex/Pattern.compile2java/util/regex/Pattern.2@io/netty/util/concurrent/AbstractScheduledEventExecutor.schedule2com/google/protobuf/struct/Value$$$Lambda$2285/911432546.apply2:com/google/protobuf/struct/Value$.$anonfun$messageReads$142?com/google/protobuf/struct/Value$$$Lambda$2272/1656914594.apply2'java/util/regex/Pattern$BitClass.2java/util/regex/Pattern.clazz2 java/util/regex/Pattern.sequence2java/util/regex/Pattern.expr2=io/opencensus/implcore/stats/MeasureMapInternal$Builder.build2+ch/qos/logback/core/pattern/Converter.write22 Date: Sun, 10 Dec 2023 15:12:51 +0200 Subject: [PATCH 18/44] style + val/ref pass fixes --- receiver/pyroscopereceiver/config.go | 4 +- receiver/pyroscopereceiver/factory.go | 8 +- .../pyroscopereceiver/jfrparser/parser.go | 182 +++++++++--------- .../pyroscopereceiver_test.go | 66 +++---- receiver/pyroscopereceiver/receiver.go | 120 ++++++------ receiver/pyroscopereceiver/types/profile.go | 4 +- 6 files changed, 190 insertions(+), 194 deletions(-) diff --git a/receiver/pyroscopereceiver/config.go b/receiver/pyroscopereceiver/config.go index 621048c..1263a73 100644 --- a/receiver/pyroscopereceiver/config.go +++ b/receiver/pyroscopereceiver/config.go @@ -20,8 +20,8 @@ type Config struct { } // Checks that the receiver configuration is valid -func (cfg *Config) Validate() error { - if cfg.Protocols.Http.MaxRequestBodySize < 1 { +func (conf *Config) Validate() error { + if conf.Protocols.Http.MaxRequestBodySize < 1 { return fmt.Errorf("max_request_body_size must be positive") } return nil diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index 4d16adf..35accd1 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -10,7 +10,7 @@ import ( ) const ( - typeStr = "pyroscopereceiver" + typ = "pyroscopereceiver" defaultHttpAddr = "0.0.0.0:8062" defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata @@ -27,18 +27,18 @@ func createDefaultConfig() component.Config { } } -func createLogsReceiver(_ context.Context, params receiver.CreateSettings, baseCfg component.Config, consumer consumer.Logs) (receiver.Logs, error) { +func createLogsReceiver(_ context.Context, params receiver.CreateSettings, conf component.Config, consumer consumer.Logs) (receiver.Logs, error) { if nil == consumer { return nil, component.ErrNilNextConsumer } - return newPyroscopeReceiver(baseCfg.(*Config), consumer, ¶ms), nil + return newPyroscopeReceiver(conf.(*Config), consumer, ¶ms), nil } // Creates a factory for the pyroscope receiver. func NewFactory() receiver.Factory { return receiver.NewFactory( - typeStr, + typ, createDefaultConfig, receiver.WithLogs(createLogsReceiver, component.StabilityLevelAlpha)) } diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index e3aa6de..e9ae2a7 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -11,10 +11,6 @@ import ( profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" ) -type metadata struct { - period int64 -} - const ( sampleTypeCpu = 0 sampleTypeWall = 1 @@ -25,19 +21,26 @@ const ( sampleTypeLiveObject = 6 sampleTypeCount = 7 + + wall = "wall" + event = "event" ) -type pprof struct { - prof *profile_types.Profile - _pprof *pprof_proto.Profile +type metadata struct { + period int64 +} + +type profileWrapper struct { + pprof *pprof_proto.Profile + prof profile_types.ProfileIR } -type parser struct { +type jfrPprofParser struct { md metadata - _pa *jfr_parser.Parser + jfrParser *jfr_parser.Parser maxDecompressedSizeBytes int64 - proftab [sampleTypeCount]*pprof // + proftab [sampleTypeCount]*profileWrapper // samptab [sampleTypeCount]map[uint32]uint32 // loctab [sampleTypeCount]map[uint32]*pprof_proto.Location // } @@ -52,35 +55,30 @@ var typetab = []profile_types.ProfileType{ sampleTypeLiveObject: {Type: "memory", PeriodType: "objects", PeriodUnit: "count", SampleType: []string{"live"}, SampleUnit: []string{"count"}}, } -const ( - wall = "wall" - event = "event" -) - // Creates a jfr parser that parse the accepted jfr buffer -func NewJfrParser(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) *parser { +func NewJfrPprofParser(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) *jfrPprofParser { var period int64 if md.SampleRateHertz == 0 { period = 1 } else { period = 1e9 / int64(md.SampleRateHertz) } - return &parser{ + return &jfrPprofParser{ md: metadata{period: period}, - _pa: jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}), + jfrParser: jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}), maxDecompressedSizeBytes: maxDecompressedSizeBytes, } } // Parses the jfr buffer into pprof -func (pa *parser) ParsePprof() ([]*profile_types.Profile, error) { +func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { var ( event string values = [2]int64{1, 0} ) for { - t, err := pa._pa.ParseEvent() + t, err := pa.jfrParser.ParseEvent() if err != nil { if io.EOF == err { break @@ -89,44 +87,44 @@ func (pa *parser) ParsePprof() ([]*profile_types.Profile, error) { } switch t { - case pa._pa.TypeMap.T_EXECUTION_SAMPLE: + case pa.jfrParser.TypeMap.T_EXECUTION_SAMPLE: values[0] = 1 * int64(pa.md.period) - ts := pa._pa.GetThreadState(pa._pa.ExecutionSample.State) + ts := pa.jfrParser.GetThreadState(pa.jfrParser.ExecutionSample.State) if ts != nil && ts.Name == "STATE_RUNNABLE" { - pa.addStacktrace(sampleTypeCpu, pa._pa.ExecutionSample.StackTrace, values[:1]) + pa.addStacktrace(sampleTypeCpu, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } // TODO: this code is from github/grafana/pyroscope, need to validate that the query simulator handles this branch as expected for wall if wall == event { - pa.addStacktrace(sampleTypeWall, pa._pa.ExecutionSample.StackTrace, values[:1]) + pa.addStacktrace(sampleTypeWall, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } - case pa._pa.TypeMap.T_ALLOC_IN_NEW_TLAB: - values[1] = int64(pa._pa.ObjectAllocationInNewTLAB.TlabSize) - pa.addStacktrace(sampleTypeInNewTlab, pa._pa.ObjectAllocationInNewTLAB.StackTrace, values[:2]) - case pa._pa.TypeMap.T_ALLOC_OUTSIDE_TLAB: - values[1] = int64(pa._pa.ObjectAllocationOutsideTLAB.AllocationSize) - pa.addStacktrace(sampleTypeOutsideTlab, pa._pa.ObjectAllocationOutsideTLAB.StackTrace, values[:2]) - case pa._pa.TypeMap.T_MONITOR_ENTER: - values[1] = int64(pa._pa.JavaMonitorEnter.Duration) - pa.addStacktrace(sampleTypeLock, pa._pa.JavaMonitorEnter.StackTrace, values[:2]) - case pa._pa.TypeMap.T_THREAD_PARK: - values[1] = int64(pa._pa.ThreadPark.Duration) - pa.addStacktrace(sampleTypeThreadPark, pa._pa.ThreadPark.StackTrace, values[:2]) - case pa._pa.TypeMap.T_LIVE_OBJECT: - pa.addStacktrace(sampleTypeLiveObject, pa._pa.LiveObject.StackTrace, values[:1]) - case pa._pa.TypeMap.T_ACTIVE_SETTING: - if pa._pa.ActiveSetting.Name == event { - event = pa._pa.ActiveSetting.Value + case pa.jfrParser.TypeMap.T_ALLOC_IN_NEW_TLAB: + values[1] = int64(pa.jfrParser.ObjectAllocationInNewTLAB.TlabSize) + pa.addStacktrace(sampleTypeInNewTlab, pa.jfrParser.ObjectAllocationInNewTLAB.StackTrace, values[:2]) + case pa.jfrParser.TypeMap.T_ALLOC_OUTSIDE_TLAB: + values[1] = int64(pa.jfrParser.ObjectAllocationOutsideTLAB.AllocationSize) + pa.addStacktrace(sampleTypeOutsideTlab, pa.jfrParser.ObjectAllocationOutsideTLAB.StackTrace, values[:2]) + case pa.jfrParser.TypeMap.T_MONITOR_ENTER: + values[1] = int64(pa.jfrParser.JavaMonitorEnter.Duration) + pa.addStacktrace(sampleTypeLock, pa.jfrParser.JavaMonitorEnter.StackTrace, values[:2]) + case pa.jfrParser.TypeMap.T_THREAD_PARK: + values[1] = int64(pa.jfrParser.ThreadPark.Duration) + pa.addStacktrace(sampleTypeThreadPark, pa.jfrParser.ThreadPark.StackTrace, values[:2]) + case pa.jfrParser.TypeMap.T_LIVE_OBJECT: + pa.addStacktrace(sampleTypeLiveObject, pa.jfrParser.LiveObject.StackTrace, values[:1]) + case pa.jfrParser.TypeMap.T_ACTIVE_SETTING: + if pa.jfrParser.ActiveSetting.Name == event { + event = pa.jfrParser.ActiveSetting.Value } } } - ps := make([]*profile_types.Profile, 0) - for _, pp := range pa.proftab { - if nil != pp { + ps := make([]profile_types.ProfileIR, 0) + for _, pr := range pa.proftab { + if nil != pr { // assuming jfr-pprof conversion should not expand memory footprint, transitively applying jfr limit on pprof - pp.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider event distribution for example low probability live event as part of alloc profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) - pp._pprof.WriteUncompressed(pp.prof.Payload) - ps = append(ps, pp.prof) + pr.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider event distribution for example low probability live event as part of alloc profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) + pr.pprof.WriteUncompressed(pr.prof.Payload) + ps = append(ps, pr.prof) } } return ps, nil @@ -134,13 +132,13 @@ func (pa *parser) ParsePprof() ([]*profile_types.Profile, error) { func nopSymbolProcessor(ref *jfr_types.SymbolList) {} -func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, values []int64) { - p := pa.getProfile(sampleType) - if nil == p { - p = pa.addProfile(sampleType) +func (pa *jfrPprofParser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, values []int64) { + pr := pa.getProfile(sampleType) + if nil == pr { + pr = pa.addProfile(sampleType) } - st := pa._pa.GetStacktrace(ref) + st := pa.jfrParser.GetStacktrace(ref) if nil == st { return } @@ -153,14 +151,14 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val iref := uint32(ref) // sum values for a stacktrace that already exist - sample := pa.getSample(sampleType, p._pprof, iref) + sample := pa.getSample(sampleType, pr.pprof, iref) if sample != nil { addValues(sample.Value) return } // encode a new stacktrace in pprof - locations := make([]*pprof_proto.Location, 0, len(st.Frames)) + ls := make([]*pprof_proto.Location, 0, len(st.Frames)) for i := 0; i < len(st.Frames); i++ { f := st.Frames[i] imethod := uint32(f.Method) @@ -176,71 +174,71 @@ func (pa *parser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, val // name: 118 // } // $ cat | protoc --decode=perftools.profiles.Profile $HOME/go/pkg/mod/github.com/google/pprof@/proto/profile.proto --proto_path $HOME/go/pkg/mod/github.com/google/pprof@/proto/ >> /tmp/pprof.txt - loc := pa.getLocation(sampleType, imethod) - if loc != nil { - locations = append(locations, loc) + l := pa.getLocation(sampleType, imethod) + if l != nil { + ls = append(ls, l) continue } // append new location - m := pa._pa.GetMethod(f.Method) + m := pa.jfrParser.GetMethod(f.Method) if m != nil { - cls := pa._pa.GetClass(m.Type) + cls := pa.jfrParser.GetClass(m.Type) if cls != nil { - clsName := pa._pa.GetSymbolString(cls.Name) - methodName := pa._pa.GetSymbolString(m.Name) - loc = pa.appendLocation(sampleType, p._pprof, clsName+"."+methodName, imethod) - locations = append(locations, loc) + clsName := pa.jfrParser.GetSymbolString(cls.Name) + methodName := pa.jfrParser.GetSymbolString(m.Name) + l = pa.appendLocation(sampleType, pr.pprof, clsName+"."+methodName, imethod) + ls = append(ls, l) } } } - v := make([]int64, len(values)) - addValues(v) - pa.appendSample(sampleType, p._pprof, locations, v, iref) + newv := make([]int64, len(values)) + addValues(newv) + pa.appendSample(sampleType, pr.pprof, ls, newv, iref) } -func (pa *parser) getProfile(sampleType int) *pprof { +func (pa *jfrPprofParser) getProfile(sampleType int) *profileWrapper { return pa.proftab[sampleType] } -func (pa *parser) addProfile(sampleType int) *pprof { - p := &pprof{ - prof: &profile_types.Profile{ - Type: &typetab[sampleType], +func (pa *jfrPprofParser) addProfile(sampleType int) *profileWrapper { + pw := &profileWrapper{ + prof: profile_types.ProfileIR{ + Type: typetab[sampleType], PayloadType: profile_types.PayloadTypePprof, }, - _pprof: &pprof_proto.Profile{}, + pprof: &pprof_proto.Profile{}, } - pa.proftab[sampleType] = p + pa.proftab[sampleType] = pw // add sample types and units to keep the pprof valid for libraries - for i, typ := range p.prof.Type.SampleType { - pa.appendSampleType(p._pprof, typ, p.prof.Type.SampleUnit[i]) + for i, t := range pw.prof.Type.SampleType { + pa.appendSampleType(pw.pprof, t, pw.prof.Type.SampleUnit[i]) } - return p + return pw } -func (pa *parser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) { +func (pa *jfrPprofParser) appendSampleType(prof *pprof_proto.Profile, typ, unit string) { prof.SampleType = append(prof.SampleType, &pprof_proto.ValueType{ Type: typ, Unit: unit, }) } -func (pa *parser) getSample(sampleType int, prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { +func (pa *jfrPprofParser) getSample(sampleType int, prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { m := pa.samptab[sampleType] if nil == m { return nil } - idx, ok := m[externStacktraceRef] + i, ok := m[externStacktraceRef] if !ok { return nil } - return prof.Sample[idx] + return prof.Sample[i] } -func (pa *parser) appendSample(sampleType int, prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { +func (pa *jfrPprofParser) appendSample(sampleType int, prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { sample := &pprof_proto.Sample{ Location: locations, Value: values, @@ -254,38 +252,38 @@ func (pa *parser) appendSample(sampleType int, prof *pprof_proto.Profile, locati prof.Sample = append(prof.Sample, sample) } -func (pa *parser) getLocation(sampleType int, externFuncId uint32) *pprof_proto.Location { +func (pa *jfrPprofParser) getLocation(sampleType int, externFuncId uint32) *pprof_proto.Location { m := pa.loctab[sampleType] if nil == m { return nil } - loc, ok := m[externFuncId] + l, ok := m[externFuncId] if !ok { return nil } - return loc + return l } -func (pa *parser) appendLocation(sampleType int, prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { +func (pa *jfrPprofParser) appendLocation(sampleType int, prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { // append new function of the new location - newFunc := &pprof_proto.Function{ + newf := &pprof_proto.Function{ ID: uint64(len(prof.Function)) + 1, // starts with 1 not 0 Name: frame, } - prof.Function = append(prof.Function, newFunc) + prof.Function = append(prof.Function, newf) // append new location with a single line referencing the new function, ignoring inlining without a line number - newLoc := &pprof_proto.Location{ + newl := &pprof_proto.Location{ ID: uint64(len(prof.Location)) + 1, // starts with 1 not 0 - Line: []pprof_proto.Line{{Function: newFunc}}, + Line: []pprof_proto.Line{{Function: newf}}, } - prof.Location = append(prof.Location, newLoc) + prof.Location = append(prof.Location, newl) m := pa.loctab[sampleType] if nil == m { m = make(map[uint32]*pprof_proto.Location) pa.loctab[sampleType] = m } - m[externFuncId] = newLoc - return newLoc + m[externFuncId] = newl + return newl } diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 0548d5f..41e1d13 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -24,26 +24,32 @@ import ( "go.uber.org/zap" ) -type jfrtest_t struct { +type jfrTest struct { name string urlParams map[string]string jfr string - expected *plog.Logs + expected plog.Logs err error } -func loadTestData(t *testing.T, fname string) *[]byte { - b, err := os.ReadFile(filepath.Join("testdata", fname)) +type profileLog struct { + timestamp uint64 + body []byte + attrs map[string]any +} + +func loadTestData(t *testing.T, filename string) []byte { + b, err := os.ReadFile(filepath.Join("testdata", filename)) assert.NoError(t, err, "failed to load expected pprof payload") - return &b + return b } -func run(t *testing.T, tests *[]jfrtest_t, collectorAddr string, sink *consumertest.LogsSink) { - for _, tt := range *tests { +func run(t *testing.T, tests []jfrTest, collectorAddr string, sink *consumertest.LogsSink) { + for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.NoError(t, send(t, collectorAddr, tt.urlParams, tt.jfr), "send shouldn't have been failed") actual := sink.AllLogs() - assert.NoError(t, plogtest.CompareLogs(*tt.expected, actual[0])) + assert.NoError(t, plogtest.CompareLogs(tt.expected, actual[0])) sink.Reset() }) } @@ -51,7 +57,7 @@ func run(t *testing.T, tests *[]jfrtest_t, collectorAddr string, sink *consumert func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { addr := getAvailableLocalTcpPort(t) - config := &Config{ + conf := &Config{ Protocols: Protocols{ Http: &confighttp.HTTPServerSettings{ Endpoint: addr, @@ -62,7 +68,7 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { sink := new(consumertest.LogsSink) sett := receivertest.NewNopCreateSettings() sett.Logger = zap.Must(zap.NewDevelopment()) - recv := newPyroscopeReceiver(config, sink, &sett) + recv := newPyroscopeReceiver(conf, sink, &sett) require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) t.Cleanup(func() { require.NoError(t, recv.Shutdown(context.Background())) }) @@ -115,9 +121,9 @@ func send(t *testing.T, addr string, urlParams map[string]string, jfr string) er } func TestPyroscopeIngestJfrCpu(t *testing.T) { - tests := make([]jfrtest_t, 1) + tests := make([]jfrTest, 1) pb := loadTestData(t, "cortex-dev-01__kafka-0__cpu__0.pb") - tests[0] = jfrtest_t{ + tests[0] = jfrTest{ name: "send labeled multipart form data gzipped cpu jfr to http ingest endpoint", urlParams: map[string]string{ "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", @@ -127,7 +133,7 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { "sampleRate": "100", }, jfr: filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.jfr"), - expected: gen([]*profile_t{{ + expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ "__name__": "com.example.App", @@ -147,14 +153,14 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { } addr, sink := startHttpServer(t) collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) - run(t, &tests, collectorAddr, sink) + run(t, tests, collectorAddr, sink) } func TestPyroscopeIngestJfrMemory(t *testing.T) { - tests := make([]jfrtest_t, 1) + tests := make([]jfrTest, 1) allocInNewTlabPb := loadTestData(t, "memory_example_alloc_in_new_tlab.pb") liveObjectPb := loadTestData(t, "memory_example_live_object.pb") - tests[0] = jfrtest_t{ + tests[0] = jfrTest{ name: "send labeled multipart form data gzipped memoty jfr to http ingest endpoint", urlParams: map[string]string{ "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", @@ -163,7 +169,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { "format": "jfr", }, jfr: filepath.Join("testdata", "memory_alloc_live_example.jfr"), - expected: gen([]*profile_t{{ + expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ "__name__": "com.example.App", @@ -200,7 +206,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { addr, sink := startHttpServer(t) collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) - run(t, &tests, collectorAddr, sink) + run(t, tests, collectorAddr, sink) } // Returns an available local tcp port. It doesnt bind the port, and there is a race condition as @@ -214,20 +220,14 @@ func getAvailableLocalTcpPort(t *testing.T) string { return l.Addr().String() } -type profile_t struct { - timestamp uint64 - body *[]byte - attrs map[string]any -} - -func gen(in []*profile_t) *plog.Logs { - profiles := plog.NewLogs() - recs := profiles.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() - for _, p := range in { - rec := recs.AppendEmpty() - _ = rec.Attributes().FromRaw(p.attrs) - rec.SetTimestamp(pcommon.Timestamp(p.timestamp)) - rec.Body().SetEmptyBytes().FromRaw(*p.body) +func gen(pl []profileLog) plog.Logs { + newpl := plog.NewLogs() + rs := newpl.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() + for _, l := range pl { + r := rs.AppendEmpty() + _ = r.Attributes().FromRaw(l.attrs) + r.SetTimestamp(pcommon.Timestamp(l.timestamp)) + r.Body().SetEmptyBytes().FromRaw(l.body) } - return &profiles + return newpl } diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 6432241..10bbc97 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -15,7 +15,6 @@ import ( "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" "github.com/metrico/otel-collector/receiver/pyroscopereceiver/jfrparser" profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" - "github.com/prometheus/prometheus/model/labels" promql_parser "github.com/prometheus/prometheus/promql/parser" "go.opentelemetry.io/collector/component" @@ -45,9 +44,16 @@ type pyroscopeReceiver struct { shutdownWg sync.WaitGroup } -func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *receiver.CreateSettings) *pyroscopeReceiver { +type attrs struct { + start uint64 + end uint64 + name string + labels labels.Labels +} + +func newPyroscopeReceiver(conf *Config, consumer consumer.Logs, params *receiver.CreateSettings) *pyroscopeReceiver { recv := &pyroscopeReceiver{ - conf: baseCfg, + conf: conf, next: consumer, settings: params, logger: params.Logger, @@ -60,14 +66,7 @@ func newPyroscopeReceiver(baseCfg *Config, consumer consumer.Logs, params *recei return recv } -type attrs struct { - start uint64 - end uint64 - name string - labels *labels.Labels -} - -func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { +func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { var ( tmp []string ok bool @@ -77,24 +76,24 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { params := req.URL.Query() // support jfr only if tmp, ok = params["format"]; !ok || tmp[0] != "jfr" { - return &logs, fmt.Errorf("unsupported format, supported: [jfr]") + return logs, fmt.Errorf("unsupported format, supported: [jfr]") } - attrs, err := getAttrsFromParams(¶ms) + att, err := getAttrsFromParams(¶ms) if err != nil { - return &logs, err + return logs, err } // support only multipart/form-data - file, err := recv.openMultipartJfr(req) + f, err := recv.openMultipartJfr(req) if err != nil { - return &logs, err + return logs, err } - defer file.Close() + defer f.Close() - buf, err := recv.decompressor.Decompress(file, "gzip") + buf, err := recv.decompressor.Decompress(f, "gzip") if err != nil { - return &logs, fmt.Errorf("failed to decompress body: %w", err) + return logs, fmt.Errorf("failed to decompress body: %w", err) } resetHeaders(req) @@ -103,41 +102,41 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (*plog.Logs, error) { if ok { hz, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return &logs, fmt.Errorf("failed to parse rate: %w", err) + return logs, fmt.Errorf("failed to parse rate: %w", err) } md.SampleRateHertz = hz } - ps, err := jfrparser.NewJfrParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() + ps, err := jfrparser.NewJfrPprofParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() if err != nil { - return &logs, fmt.Errorf("failed to parse pprof: %w", err) + return logs, fmt.Errorf("failed to parse pprof: %w", err) } - recs := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() - for _, pp := range ps { - rec := recs.AppendEmpty() - rec.SetTimestamp(pcommon.Timestamp(attrs.start)) - rec.Attributes().PutStr("duration_ns", fmt.Sprint((attrs.end-attrs.start)*1e9)) - rec.Attributes().PutStr(nameLabel, attrs.name) - for _, l := range *attrs.labels { - rec.Attributes().PutStr(l.Name, l.Value) + rs := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() + for _, pr := range ps { + r := rs.AppendEmpty() + r.SetTimestamp(pcommon.Timestamp(att.start)) + r.Attributes().PutStr("duration_ns", fmt.Sprint((att.end-att.start)*1e9)) + r.Attributes().PutStr(nameLabel, att.name) + for _, l := range att.labels { + r.Attributes().PutStr(l.Name, l.Value) } - setAttrsFromProfile(pp, &rec) - rec.Body().SetEmptyBytes().FromRaw(pp.Payload.Bytes()) + setAttrsFromProfile(pr, r) + r.Body().SetEmptyBytes().FromRaw(pr.Payload.Bytes()) } - return &logs, nil + return logs, nil } -func (d *pyroscopeReceiver) openMultipartJfr(unparsed *http.Request) (multipart.File, error) { - if err := unparsed.ParseMultipartForm(d.conf.Protocols.Http.MaxRequestBodySize); err != nil { +func (recv *pyroscopeReceiver) openMultipartJfr(req *http.Request) (multipart.File, error) { + if err := req.ParseMultipartForm(recv.conf.Protocols.Http.MaxRequestBodySize); err != nil { return nil, fmt.Errorf("failed to parse multipart request: %w", err) } - multipartForm := unparsed.MultipartForm + mf := req.MultipartForm defer func() { - _ = multipartForm.RemoveAll() + _ = mf.RemoveAll() }() - part, ok := multipartForm.File[jfrFormat] + part, ok := mf.File[jfrFormat] if !ok { return nil, fmt.Errorf("required jfr part is missing") } @@ -161,25 +160,25 @@ func resetHeaders(req *http.Request) { req.ContentLength = -1 } -func getAttrsFromParams(params *url.Values) (*attrs, error) { +func getAttrsFromParams(params *url.Values) (attrs, error) { var ( - tmp []string - ok bool - paramsv = *params - att attrs = attrs{} + tmp []string + ok bool + pv = *params + att attrs = attrs{} ) - if tmp, ok = paramsv["from"]; !ok { - return nil, fmt.Errorf("required start time is missing") + if tmp, ok = pv["from"]; !ok { + return att, fmt.Errorf("required start time is missing") } start, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return nil, fmt.Errorf("failed to parse start time: %w", err) + return att, fmt.Errorf("failed to parse start time: %w", err) } att.start = start - if tmp, ok = paramsv["name"]; !ok { - return nil, fmt.Errorf("required labels are missing") + if tmp, ok = pv["name"]; !ok { + return att, fmt.Errorf("required labels are missing") } i := strings.Index(tmp[0], "{") length := len(tmp[0]) @@ -189,26 +188,25 @@ func getAttrsFromParams(params *url.Values) (*attrs, error) { promql := tmp[0][i:length] labels, err := promql_parser.ParseMetric(promql) if err != nil { - return nil, fmt.Errorf("failed to parse labels: %w", err) + return att, fmt.Errorf("failed to parse labels: %w", err) } - att.labels = &labels + att.labels = labels } // required app name - name := tmp[0][:i] - att.name = name + att.name = tmp[0][:i] - if tmp, ok = paramsv["until"]; !ok { - return nil, fmt.Errorf("required end time is missing") + if tmp, ok = pv["until"]; !ok { + return att, fmt.Errorf("required end time is missing") } end, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return nil, fmt.Errorf("failed to parse end time: %w", err) + return att, fmt.Errorf("failed to parse end time: %w", err) } att.end = end - return &att, nil + return att, nil } -func setAttrsFromProfile(prof *profile_types.Profile, rec *plog.LogRecord) { +func setAttrsFromProfile(prof profile_types.ProfileIR, rec plog.LogRecord) { rec.Attributes().PutStr("type", prof.Type.Type) rec.Attributes().PutStr("sample_type", strings.Join(prof.Type.SampleType, ",")) rec.Attributes().PutStr("sample_unit", strings.Join(prof.Type.SampleUnit, ",")) @@ -236,7 +234,7 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe // delegate to next consumer in the pipeline // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver - recv.next.ConsumeLogs(ctx, *logs) + recv.next.ConsumeLogs(ctx, logs) } func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) error { @@ -249,8 +247,8 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err } recv.logger.Info("server listening on", zap.String("endpoint", recv.conf.Protocols.Http.Endpoint)) - var listener net.Listener - if listener, err = recv.conf.Protocols.Http.ToListener(); err != nil { + var l net.Listener + if l, err = recv.conf.Protocols.Http.ToListener(); err != nil { return fmt.Errorf("failed to create tcp listener: %w", err) } @@ -258,7 +256,7 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err recv.shutdownWg.Add(1) go func() { defer recv.shutdownWg.Done() - if err := recv.httpServer.Serve(listener); !errors.Is(err, http.ErrServerClosed) && err != nil { + if err := recv.httpServer.Serve(l); !errors.Is(err, http.ErrServerClosed) && err != nil { host.ReportFatalError(err) } }() diff --git a/receiver/pyroscopereceiver/types/profile.go b/receiver/pyroscopereceiver/types/profile.go index 7aa4b0e..1c40cb7 100644 --- a/receiver/pyroscopereceiver/types/profile.go +++ b/receiver/pyroscopereceiver/types/profile.go @@ -20,8 +20,8 @@ type ProfileType struct { SampleUnit []string } -type Profile struct { - Type *ProfileType +type ProfileIR struct { + Type ProfileType Payload *bytes.Buffer PayloadType uint32 } From e6cf23d566a07ce655f9a56fd1705c1be986cd8b Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 18:33:03 +0200 Subject: [PATCH 19/44] rename format string --- receiver/pyroscopereceiver/receiver.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 10bbc97..7e5e900 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -28,7 +28,7 @@ import ( const ( ingestPath = "/ingest" nameLabel = "__name__" - jfrFormat = "jfr" + formatJfr = "jfr" ) type pyroscopeReceiver struct { @@ -136,13 +136,13 @@ func (recv *pyroscopeReceiver) openMultipartJfr(req *http.Request) (multipart.Fi _ = mf.RemoveAll() }() - part, ok := mf.File[jfrFormat] + part, ok := mf.File[formatJfr] if !ok { return nil, fmt.Errorf("required jfr part is missing") } fh := part[0] - if fh.Filename != jfrFormat { - return nil, fmt.Errorf("jfr filename is not '%s'", jfrFormat) + if fh.Filename != formatJfr { + return nil, fmt.Errorf("jfr filename is not '%s'", formatJfr) } f, err := fh.Open() if err != nil { From 108b3404f3528d02b146ac9296111fd161443b5a Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 19:12:57 +0200 Subject: [PATCH 20/44] add basic api doc --- receiver/pyroscopereceiver/compress/compress.go | 3 +++ receiver/pyroscopereceiver/receiver.go | 2 ++ receiver/pyroscopereceiver/types/profile.go | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index 67a7d70..e722e0b 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -7,11 +7,13 @@ import ( "io" ) +// Decompresses supported formats while applying limits to avoid compression bomb type Decompressor struct { maxDecompressedSizeBytes int64 decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) } +// Creates new decompressor that can decompress a stream of supported formats func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { return &Decompressor{ maxDecompressedSizeBytes: maxDecompressedSizeBytes, @@ -61,6 +63,7 @@ func (d *Decompressor) Decompress(r io.ReadCloser, encoding string) (*bytes.Buff return d.readBytes(dr) } +// Pre-allocates a buffer based on heuristics to minimize resize func PrepareBuffer(maxDecompressedSizeBytes int64) *bytes.Buffer { var ( buf bytes.Buffer diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 7e5e900..9ca5274 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -237,6 +237,7 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe recv.next.ConsumeLogs(ctx, logs) } +// Starts a http server that receives profiles of supported protocols func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) error { recv.host = host var err error @@ -263,6 +264,7 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err return nil } +// Shuts down the receiver, by shutting down the server func (recv *pyroscopeReceiver) Shutdown(ctx context.Context) error { if err := recv.httpServer.Shutdown(ctx); err != nil { return fmt.Errorf("failed to shutdown: %w", err) diff --git a/receiver/pyroscopereceiver/types/profile.go b/receiver/pyroscopereceiver/types/profile.go index 1c40cb7..8cc1d0d 100644 --- a/receiver/pyroscopereceiver/types/profile.go +++ b/receiver/pyroscopereceiver/types/profile.go @@ -4,14 +4,17 @@ import ( "bytes" ) +// Enumeration of low-level payload type that are supported by the pipeline const ( PayloadTypePprof = 0 ) +// Auxiliary profile meta data type Metadata struct { SampleRateHertz uint64 } +// Represents the high-level type of a profile type ProfileType struct { Type string PeriodType string @@ -20,6 +23,7 @@ type ProfileType struct { SampleUnit []string } +// Parser IR for profile processing type ProfileIR struct { Type ProfileType Payload *bytes.Buffer From 2e0857132d610d39aea3908e09aa8cd9195a271f Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 21:22:13 +0200 Subject: [PATCH 21/44] small rename --- receiver/pyroscopereceiver/pyroscopereceiver_test.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 41e1d13..3dc2eaf 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -158,8 +158,8 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { func TestPyroscopeIngestJfrMemory(t *testing.T) { tests := make([]jfrTest, 1) - allocInNewTlabPb := loadTestData(t, "memory_example_alloc_in_new_tlab.pb") - liveObjectPb := loadTestData(t, "memory_example_live_object.pb") + pbAllocInNewTlab := loadTestData(t, "memory_example_alloc_in_new_tlab.pb") + pbLiveObject := loadTestData(t, "memory_example_live_object.pb") tests[0] = jfrTest{ name: "send labeled multipart form data gzipped memoty jfr to http ingest endpoint", urlParams: map[string]string{ @@ -183,7 +183,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { "period_unit": "bytes", "payload_type": "0", }, - body: allocInNewTlabPb, + body: pbAllocInNewTlab, }, { timestamp: 1700332322, @@ -199,7 +199,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { "period_unit": "count", "payload_type": "0", }, - body: liveObjectPb, + body: pbLiveObject, }}), err: nil, } @@ -209,6 +209,8 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { run(t, tests, collectorAddr, sink) } +// TODO: add block, lock, wall test cases + // Returns an available local tcp port. It doesnt bind the port, and there is a race condition as // another process maybe bind the port before the test does func getAvailableLocalTcpPort(t *testing.T) string { From ca7bd1a8f1b3173f63746af8c72d6f1f9fcd36aa Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 10 Dec 2023 22:28:08 +0200 Subject: [PATCH 22/44] go mod tidy --- go.mod | 8 ++++---- go.sum | 8 ++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index 8783ea9..1ae9e66 100644 --- a/go.mod +++ b/go.mod @@ -132,10 +132,10 @@ require ( github.com/prometheus/common v0.45.0 github.com/prometheus/prometheus v0.47.2 github.com/stretchr/testify v1.8.4 - go.opentelemetry.io/collector/config/confighttp v0.89.0 - go.opentelemetry.io/collector/consumer v0.89.0 go.opentelemetry.io/collector/component v0.89.0 + go.opentelemetry.io/collector/config/confighttp v0.89.0 go.opentelemetry.io/collector/confmap v0.89.0 + go.opentelemetry.io/collector/consumer v0.89.0 go.opentelemetry.io/collector/exporter v0.89.0 go.opentelemetry.io/collector/exporter/loggingexporter v0.89.0 go.opentelemetry.io/collector/exporter/otlpexporter v0.89.0 @@ -158,12 +158,13 @@ require ( google.golang.org/protobuf v1.31.0 ) -require github.com/containerd/cgroups/v3 v3.0.1 // indirect +require github.com/containerd/cgroups/v3 v3.0.2 // indirect require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.85.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerthrifthttpexporter v0.85.0 github.com/open-telemetry/opentelemetry-collector-contrib/exporter/parquetexporter v0.87.0 + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.89.0 github.com/open-telemetry/opentelemetry-collector-contrib/receiver/lokireceiver v0.89.0 go.opentelemetry.io/collector/connector v0.89.0 go.opentelemetry.io/collector/connector/forwardconnector v0.89.0 @@ -261,7 +262,6 @@ require ( github.com/cloudfoundry-incubator/uaago v0.0.0-20190307164349-8136b7bbe76e // indirect github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe // indirect github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4 // indirect - github.com/containerd/cgroups/v3 v3.0.2 // indirect github.com/containerd/console v1.0.3 // indirect github.com/containerd/ttrpc v1.2.2 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect diff --git a/go.sum b/go.sum index cd0e8d0..7f706e9 100644 --- a/go.sum +++ b/go.sum @@ -302,7 +302,6 @@ github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAc github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575 h1:kHaBemcxl8o/pQ5VM1c8PVE1PubbNx3mjUr09OqWGCs= github.com/cihub/seelog v0.0.0-20170130134532-f561c5e57575/go.mod h1:9d6lWj8KzO/fd/NrVaLscBKmPigpZpn5YawRPw+e3Yo= github.com/cilium/ebpf v0.9.1 h1:64sn2K3UKw8NbP/blsixRpF3nXuyhz/VjRlRzvlBRu4= @@ -602,12 +601,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 h1:t2sLhFuGXwoomaKLTuoxFfFqqlG1Gp2DpsupXq3UvZ0= github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= @@ -1067,6 +1062,7 @@ github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.89.0 h1: github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.89.0 h1:E3uMN6efnooLi5/jz0hYlsvczaYg/XT7lNrv2/QjUa0= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.89.0/go.mod h1:TCT9B0MM0XsMdvJ9Hif1tZ/3rUkJH7nJ77mpvj6Wkh8= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.89.0 h1:haMoD8AR60bbBBc/z7J1jUqv0xaZ/TjTI5Frz+Rm8oc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.89.0/go.mod h1:GSXiM7Mt/QZiwayIaVwEFrCXYHeII6fNU+14JkmvrPI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.89.0 h1:6gs+KOZ77UhSJnNjpacptiMuvVqfmgYw/f24uqLFxzM= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.89.0/go.mod h1:oyLPe07YKGU38ANwNCisNyad2/xBUNslHuziYHE00v4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/resourcetotelemetry v0.89.0 h1:qPwyUva7Vjnp7WJAA8vOw7SEfGdKW2w5sKlCondKl68= @@ -1345,9 +1341,9 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= From 1cd762192aa5783b30813c28a35b60d507087d3f Mon Sep 17 00:00:00 2001 From: tomershafir Date: Wed, 13 Dec 2023 14:26:57 +0200 Subject: [PATCH 23/44] improve enums + handle next consumer error --- .../pyroscopereceiver/compress/compress.go | 22 ++++++---- .../pyroscopereceiver/jfrparser/parser.go | 41 +++++++++---------- receiver/pyroscopereceiver/receiver.go | 10 ++++- 3 files changed, 42 insertions(+), 31 deletions(-) diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index e722e0b..db56e41 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -7,18 +7,24 @@ import ( "io" ) -// Decompresses supported formats while applying limits to avoid compression bomb +type codec uint8 + +const ( + Gzip codec = iota +) + +// Decodes compressed streams type Decompressor struct { maxDecompressedSizeBytes int64 - decoders map[string]func(body io.ReadCloser) (io.ReadCloser, error) + decoders map[codec]func(body io.ReadCloser) (io.ReadCloser, error) } -// Creates new decompressor that can decompress a stream of supported formats +// Creates a new decompressor func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { return &Decompressor{ maxDecompressedSizeBytes: maxDecompressedSizeBytes, - decoders: map[string]func(r io.ReadCloser) (io.ReadCloser, error){ - "gzip": func(r io.ReadCloser) (io.ReadCloser, error) { + decoders: map[codec]func(r io.ReadCloser) (io.ReadCloser, error){ + Gzip: func(r io.ReadCloser) (io.ReadCloser, error) { gr, err := gzip.NewReader(r) if err != nil { return nil, err @@ -48,9 +54,9 @@ func (d *Decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { return buf, nil } -// Reads and decompresses the accepted reader, applying the configured decompressed size limit -func (d *Decompressor) Decompress(r io.ReadCloser, encoding string) (*bytes.Buffer, error) { - decoder, ok := d.decoders[encoding] +// Decodes the accepted reader, applying the configured size limit to avoid oom by compression bomb +func (d *Decompressor) Decompress(r io.ReadCloser, c codec) (*bytes.Buffer, error) { + decoder, ok := d.decoders[c] if !ok { return nil, fmt.Errorf("unsupported encoding") } diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index e9ae2a7..e60b4f8 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -11,19 +11,18 @@ import ( profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" ) +type sampleType uint8 + const ( - sampleTypeCpu = 0 - sampleTypeWall = 1 - sampleTypeInNewTlab = 2 - sampleTypeOutsideTlab = 3 - sampleTypeLock = 4 - sampleTypeThreadPark = 5 - sampleTypeLiveObject = 6 - - sampleTypeCount = 7 - - wall = "wall" - event = "event" + sampleTypeCpu sampleType = iota + sampleTypeWall + sampleTypeInNewTlab + sampleTypeOutsideTlab + sampleTypeLock + sampleTypeThreadPark + sampleTypeLiveObject + + sampleTypeCount ) type metadata struct { @@ -94,7 +93,7 @@ func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { pa.addStacktrace(sampleTypeCpu, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } // TODO: this code is from github/grafana/pyroscope, need to validate that the query simulator handles this branch as expected for wall - if wall == event { + if event == "wall" { pa.addStacktrace(sampleTypeWall, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } case pa.jfrParser.TypeMap.T_ALLOC_IN_NEW_TLAB: @@ -112,7 +111,7 @@ func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { case pa.jfrParser.TypeMap.T_LIVE_OBJECT: pa.addStacktrace(sampleTypeLiveObject, pa.jfrParser.LiveObject.StackTrace, values[:1]) case pa.jfrParser.TypeMap.T_ACTIVE_SETTING: - if pa.jfrParser.ActiveSetting.Name == event { + if pa.jfrParser.ActiveSetting.Name == "event" { event = pa.jfrParser.ActiveSetting.Value } } @@ -132,7 +131,7 @@ func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { func nopSymbolProcessor(ref *jfr_types.SymbolList) {} -func (pa *jfrPprofParser) addStacktrace(sampleType int, ref jfr_types.StackTraceRef, values []int64) { +func (pa *jfrPprofParser) addStacktrace(sampleType sampleType, ref jfr_types.StackTraceRef, values []int64) { pr := pa.getProfile(sampleType) if nil == pr { pr = pa.addProfile(sampleType) @@ -198,11 +197,11 @@ func (pa *jfrPprofParser) addStacktrace(sampleType int, ref jfr_types.StackTrace pa.appendSample(sampleType, pr.pprof, ls, newv, iref) } -func (pa *jfrPprofParser) getProfile(sampleType int) *profileWrapper { +func (pa *jfrPprofParser) getProfile(sampleType sampleType) *profileWrapper { return pa.proftab[sampleType] } -func (pa *jfrPprofParser) addProfile(sampleType int) *profileWrapper { +func (pa *jfrPprofParser) addProfile(sampleType sampleType) *profileWrapper { pw := &profileWrapper{ prof: profile_types.ProfileIR{ Type: typetab[sampleType], @@ -226,7 +225,7 @@ func (pa *jfrPprofParser) appendSampleType(prof *pprof_proto.Profile, typ, unit }) } -func (pa *jfrPprofParser) getSample(sampleType int, prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { +func (pa *jfrPprofParser) getSample(sampleType sampleType, prof *pprof_proto.Profile, externStacktraceRef uint32) *pprof_proto.Sample { m := pa.samptab[sampleType] if nil == m { return nil @@ -238,7 +237,7 @@ func (pa *jfrPprofParser) getSample(sampleType int, prof *pprof_proto.Profile, e return prof.Sample[i] } -func (pa *jfrPprofParser) appendSample(sampleType int, prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { +func (pa *jfrPprofParser) appendSample(sampleType sampleType, prof *pprof_proto.Profile, locations []*pprof_proto.Location, values []int64, externStacktraceRef uint32) { sample := &pprof_proto.Sample{ Location: locations, Value: values, @@ -252,7 +251,7 @@ func (pa *jfrPprofParser) appendSample(sampleType int, prof *pprof_proto.Profile prof.Sample = append(prof.Sample, sample) } -func (pa *jfrPprofParser) getLocation(sampleType int, externFuncId uint32) *pprof_proto.Location { +func (pa *jfrPprofParser) getLocation(sampleType sampleType, externFuncId uint32) *pprof_proto.Location { m := pa.loctab[sampleType] if nil == m { return nil @@ -264,7 +263,7 @@ func (pa *jfrPprofParser) getLocation(sampleType int, externFuncId uint32) *ppro return l } -func (pa *jfrPprofParser) appendLocation(sampleType int, prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { +func (pa *jfrPprofParser) appendLocation(sampleType sampleType, prof *pprof_proto.Profile, frame string, externFuncId uint32) *pprof_proto.Location { // append new function of the new location newf := &pprof_proto.Function{ ID: uint64(len(prof.Function)) + 1, // starts with 1 not 0 diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 9ca5274..db36b3e 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -91,7 +91,7 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { } defer f.Close() - buf, err := recv.decompressor.Decompress(f, "gzip") + buf, err := recv.decompressor.Decompress(f, compress.Gzip) if err != nil { return logs, fmt.Errorf("failed to decompress body: %w", err) } @@ -234,7 +234,13 @@ func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeRe // delegate to next consumer in the pipeline // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver - recv.next.ConsumeLogs(ctx, logs) + err = recv.next.ConsumeLogs(ctx, logs) + if err != nil { + msg := err.Error() + recv.logger.Error(msg) + writeResponse(resp, "text/plain", http.StatusInternalServerError, []byte(msg)) + return + } } // Starts a http server that receives profiles of supported protocols From b248d43f4c4632ad2d836c7d62e87c113b8098cf Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sat, 16 Dec 2023 15:46:35 +0200 Subject: [PATCH 24/44] enhance receiver --- receiver/pyroscopereceiver/config.go | 10 +-- receiver/pyroscopereceiver/factory.go | 8 +-- .../pyroscopereceiver/jfrparser/parser.go | 35 ++++------ .../pyroscopereceiver_test.go | 20 ++---- receiver/pyroscopereceiver/receiver.go | 69 ++++++++++--------- receiver/pyroscopereceiver/types/profile.go | 2 +- 6 files changed, 69 insertions(+), 75 deletions(-) diff --git a/receiver/pyroscopereceiver/config.go b/receiver/pyroscopereceiver/config.go index 1263a73..f0130bf 100644 --- a/receiver/pyroscopereceiver/config.go +++ b/receiver/pyroscopereceiver/config.go @@ -12,16 +12,16 @@ type Protocols struct { Http *confighttp.HTTPServerSettings `mapstructure:"http"` } -var _ component.Config = (*Config)(nil) - -// Represents the receiver config settings within the collector's config.yaml +// Represents the receiver config within the collector's config.yaml type Config struct { Protocols Protocols `mapstructure:"protocols"` } +var _ component.Config = (*Config)(nil) + // Checks that the receiver configuration is valid -func (conf *Config) Validate() error { - if conf.Protocols.Http.MaxRequestBodySize < 1 { +func (cfg *Config) Validate() error { + if cfg.Protocols.Http.MaxRequestBodySize < 1 { return fmt.Errorf("max_request_body_size must be positive") } return nil diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index 35accd1..bb5ac42 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -10,7 +10,7 @@ import ( ) const ( - typ = "pyroscopereceiver" + typeStr = "pyroscopereceiver" defaultHttpAddr = "0.0.0.0:8062" defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata @@ -27,18 +27,18 @@ func createDefaultConfig() component.Config { } } -func createLogsReceiver(_ context.Context, params receiver.CreateSettings, conf component.Config, consumer consumer.Logs) (receiver.Logs, error) { +func createLogsReceiver(_ context.Context, set receiver.CreateSettings, cfg component.Config, consumer consumer.Logs) (receiver.Logs, error) { if nil == consumer { return nil, component.ErrNilNextConsumer } - return newPyroscopeReceiver(conf.(*Config), consumer, ¶ms), nil + return newPyroscopeReceiver(cfg.(*Config), consumer, &set), nil } // Creates a factory for the pyroscope receiver. func NewFactory() receiver.Factory { return receiver.NewFactory( - typ, + typeStr, createDefaultConfig, receiver.WithLogs(createLogsReceiver, component.StabilityLevelAlpha)) } diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index e60b4f8..1c63f0e 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -25,19 +25,13 @@ const ( sampleTypeCount ) -type metadata struct { - period int64 -} - type profileWrapper struct { pprof *pprof_proto.Profile prof profile_types.ProfileIR } type jfrPprofParser struct { - md metadata - jfrParser *jfr_parser.Parser - maxDecompressedSizeBytes int64 + jfrParser *jfr_parser.Parser proftab [sampleTypeCount]*profileWrapper // samptab [sampleTypeCount]map[uint32]uint32 // @@ -55,27 +49,26 @@ var typetab = []profile_types.ProfileType{ } // Creates a jfr parser that parse the accepted jfr buffer -func NewJfrPprofParser(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) *jfrPprofParser { - var period int64 - if md.SampleRateHertz == 0 { - period = 1 - } else { - period = 1e9 / int64(md.SampleRateHertz) - } - return &jfrPprofParser{ - md: metadata{period: period}, - jfrParser: jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}), - maxDecompressedSizeBytes: maxDecompressedSizeBytes, - } +func NewJfrPprofParser() *jfrPprofParser { + return &jfrPprofParser{} } // Parses the jfr buffer into pprof -func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { +func (pa *jfrPprofParser) Parse(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) ([]profile_types.ProfileIR, error) { var ( + period int64 event string values = [2]int64{1, 0} ) + pa.jfrParser = jfr_parser.NewParser(jfr.Bytes(), jfr_parser.Options{SymbolProcessor: nopSymbolProcessor}) + + if md.SampleRateHertz == 0 { + period = 1 + } else { + period = 1e9 / int64(md.SampleRateHertz) + } + for { t, err := pa.jfrParser.ParseEvent() if err != nil { @@ -87,7 +80,7 @@ func (pa *jfrPprofParser) ParsePprof() ([]profile_types.ProfileIR, error) { switch t { case pa.jfrParser.TypeMap.T_EXECUTION_SAMPLE: - values[0] = 1 * int64(pa.md.period) + values[0] = 1 * int64(period) ts := pa.jfrParser.GetThreadState(pa.jfrParser.ExecutionSample.State) if ts != nil && ts.Name == "STATE_RUNNABLE" { pa.addStacktrace(sampleTypeCpu, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 3dc2eaf..075ddec 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -57,7 +57,7 @@ func run(t *testing.T, tests []jfrTest, collectorAddr string, sink *consumertest func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { addr := getAvailableLocalTcpPort(t) - conf := &Config{ + cfg := &Config{ Protocols: Protocols{ Http: &confighttp.HTTPServerSettings{ Endpoint: addr, @@ -66,9 +66,9 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { }, } sink := new(consumertest.LogsSink) - sett := receivertest.NewNopCreateSettings() - sett.Logger = zap.Must(zap.NewDevelopment()) - recv := newPyroscopeReceiver(conf, sink, &sett) + set := receivertest.NewNopCreateSettings() + set.Logger = zap.Must(zap.NewDevelopment()) + recv := newPyroscopeReceiver(cfg, sink, &set) require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) t.Cleanup(func() { require.NoError(t, recv.Shutdown(context.Background())) }) @@ -136,13 +136,11 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ - "__name__": "com.example.App", + "service_name": "com.example.App", "dc": "us-east-1", "kubernetes_pod_name": "app-abcd1234", "duration_ns": "7000000000", "type": "process_cpu", - "sample_type": "cpu", - "sample_unit": "nanoseconds", "period_type": "cpu", "period_unit": "nanoseconds", "payload_type": "0", @@ -172,13 +170,11 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ - "__name__": "com.example.App", + "service_name": "com.example.App", "dc": "us-east-1", "kubernetes_pod_name": "app-abcd1234", "duration_ns": "7000000000", "type": "memory", - "sample_type": "alloc_in_new_tlab_objects,alloc_in_new_tlab_bytes", - "sample_unit": "count,bytes", "period_type": "space", "period_unit": "bytes", "payload_type": "0", @@ -188,13 +184,11 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { { timestamp: 1700332322, attrs: map[string]any{ - "__name__": "com.example.App", + "service_name": "com.example.App", "dc": "us-east-1", "kubernetes_pod_name": "app-abcd1234", "duration_ns": "7000000000", "type": "memory", - "sample_type": "live", - "sample_unit": "count", "period_type": "objects", "period_unit": "count", "payload_type": "0", diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index db36b3e..7674805 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -1,6 +1,7 @@ package pyroscopereceiver import ( + "bytes" "context" "errors" "fmt" @@ -27,16 +28,15 @@ import ( const ( ingestPath = "/ingest" - nameLabel = "__name__" formatJfr = "jfr" ) type pyroscopeReceiver struct { - conf *Config - next consumer.Logs - settings *receiver.CreateSettings - logger *zap.Logger - host component.Host + cfg *Config + next consumer.Logs + set *receiver.CreateSettings + logger *zap.Logger + host component.Host httpMux *http.ServeMux decompressor *compress.Decompressor @@ -44,6 +44,11 @@ type pyroscopeReceiver struct { shutdownWg sync.WaitGroup } +type parser interface { + // Parses the given input buffer into the collector's profile IR + Parse(buf *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) ([]profile_types.ProfileIR, error) +} + type attrs struct { start uint64 end uint64 @@ -51,14 +56,14 @@ type attrs struct { labels labels.Labels } -func newPyroscopeReceiver(conf *Config, consumer consumer.Logs, params *receiver.CreateSettings) *pyroscopeReceiver { +func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.CreateSettings) *pyroscopeReceiver { recv := &pyroscopeReceiver{ - conf: conf, - next: consumer, - settings: params, - logger: params.Logger, + cfg: cfg, + next: consumer, + set: set, + logger: set.Logger, } - recv.decompressor = compress.NewDecompressor(recv.conf.Protocols.Http.MaxRequestBodySize) + recv.decompressor = compress.NewDecompressor(recv.cfg.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { handleIngest(resp, req, recv) @@ -70,12 +75,14 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { var ( tmp []string ok bool + pa parser ) logs := plog.NewLogs() params := req.URL.Query() - // support jfr only - if tmp, ok = params["format"]; !ok || tmp[0] != "jfr" { + if tmp, ok = params["format"]; ok && tmp[0] == "jfr" { + pa = jfrparser.NewJfrPprofParser() + } else { return logs, fmt.Errorf("unsupported format, supported: [jfr]") } @@ -107,7 +114,7 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { md.SampleRateHertz = hz } - ps, err := jfrparser.NewJfrPprofParser(buf, md, recv.conf.Protocols.Http.MaxRequestBodySize).ParsePprof() + ps, err := pa.Parse(buf, md, recv.cfg.Protocols.Http.MaxRequestBodySize) if err != nil { return logs, fmt.Errorf("failed to parse pprof: %w", err) } @@ -116,19 +123,21 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { for _, pr := range ps { r := rs.AppendEmpty() r.SetTimestamp(pcommon.Timestamp(att.start)) - r.Attributes().PutStr("duration_ns", fmt.Sprint((att.end-att.start)*1e9)) - r.Attributes().PutStr(nameLabel, att.name) + m := r.Attributes() + m.PutStr("duration_ns", fmt.Sprint((att.end-att.start)*1e9)) + m.PutStr("service_name", att.name) + tm := m.PutEmptyMap("tags") for _, l := range att.labels { - r.Attributes().PutStr(l.Name, l.Value) + tm.PutStr(l.Name, l.Value) } - setAttrsFromProfile(pr, r) + setAttrsFromProfile(pr, m) r.Body().SetEmptyBytes().FromRaw(pr.Payload.Bytes()) } return logs, nil } func (recv *pyroscopeReceiver) openMultipartJfr(req *http.Request) (multipart.File, error) { - if err := req.ParseMultipartForm(recv.conf.Protocols.Http.MaxRequestBodySize); err != nil { + if err := req.ParseMultipartForm(recv.cfg.Protocols.Http.MaxRequestBodySize); err != nil { return nil, fmt.Errorf("failed to parse multipart request: %w", err) } mf := req.MultipartForm @@ -206,13 +215,11 @@ func getAttrsFromParams(params *url.Values) (attrs, error) { return att, nil } -func setAttrsFromProfile(prof profile_types.ProfileIR, rec plog.LogRecord) { - rec.Attributes().PutStr("type", prof.Type.Type) - rec.Attributes().PutStr("sample_type", strings.Join(prof.Type.SampleType, ",")) - rec.Attributes().PutStr("sample_unit", strings.Join(prof.Type.SampleUnit, ",")) - rec.Attributes().PutStr("period_type", prof.Type.PeriodType) - rec.Attributes().PutStr("period_unit", prof.Type.PeriodUnit) - rec.Attributes().PutStr("payload_type", fmt.Sprint(prof.PayloadType)) +func setAttrsFromProfile(prof profile_types.ProfileIR, m pcommon.Map) { + m.PutStr("type", prof.Type.Type) + m.PutStr("period_type", prof.Type.PeriodType) + m.PutStr("period_unit", prof.Type.PeriodUnit) + m.PutStr("payload_type", fmt.Sprint(prof.PayloadType)) } func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { @@ -249,17 +256,17 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err var err error // applies an interceptor that enforces the configured request body limit - if recv.httpServer, err = recv.conf.Protocols.Http.ToServer(host, recv.settings.TelemetrySettings, recv.httpMux); err != nil { + if recv.httpServer, err = recv.cfg.Protocols.Http.ToServer(host, recv.set.TelemetrySettings, recv.httpMux); err != nil { return fmt.Errorf("failed to create http server: %w", err) } - recv.logger.Info("server listening on", zap.String("endpoint", recv.conf.Protocols.Http.Endpoint)) + recv.logger.Info("server listening on", zap.String("endpoint", recv.cfg.Protocols.Http.Endpoint)) var l net.Listener - if l, err = recv.conf.Protocols.Http.ToListener(); err != nil { + if l, err = recv.cfg.Protocols.Http.ToListener(); err != nil { return fmt.Errorf("failed to create tcp listener: %w", err) } - // TODO: rate limit clients + // TODO: rate limit clients and add timeout recv.shutdownWg.Add(1) go func() { defer recv.shutdownWg.Done() diff --git a/receiver/pyroscopereceiver/types/profile.go b/receiver/pyroscopereceiver/types/profile.go index 8cc1d0d..bb2628c 100644 --- a/receiver/pyroscopereceiver/types/profile.go +++ b/receiver/pyroscopereceiver/types/profile.go @@ -9,7 +9,7 @@ const ( PayloadTypePprof = 0 ) -// Auxiliary profile meta data +// Auxiliary profile metadata type Metadata struct { SampleRateHertz uint64 } From fb64b94008f5e4a2b6176cc9ee2704cc2a4676fd Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 17 Dec 2023 22:03:04 +0200 Subject: [PATCH 25/44] wip: initial ch profile exporter --- .../ch/access_native_columnar.go | 138 ++++++++++++++++++ exporter/clickhouseprofileexporter/config.go | 39 +++++ .../clickhouseprofileexporter/exporter.go | 64 ++++++++ exporter/clickhouseprofileexporter/factory.go | 52 +++++++ 4 files changed, 293 insertions(+) create mode 100644 exporter/clickhouseprofileexporter/ch/access_native_columnar.go create mode 100644 exporter/clickhouseprofileexporter/config.go create mode 100644 exporter/clickhouseprofileexporter/exporter.go create mode 100644 exporter/clickhouseprofileexporter/factory.go diff --git a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go new file mode 100644 index 0000000..ff2ab7a --- /dev/null +++ b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go @@ -0,0 +1,138 @@ +package ch + +import ( + "context" + "fmt" + + "github.com/ClickHouse/clickhouse-go/v2" + "github.com/ClickHouse/clickhouse-go/v2/lib/driver" + "go.opentelemetry.io/collector/pdata/pcommon" + "go.opentelemetry.io/collector/pdata/plog" +) + +// schema reference: https://github.com/metrico/qryn/blob/master/lib/db/maintain/scripts.js +type clickhouseAccessNativeColumnar struct { + conn driver.Conn +} + +type kv struct { + k string + v string +} + +// Connects to clickhouse and checks the connection's health, returning a new native client +func NewClickhouseAccessNativeColumnar(opts *clickhouse.Options) (*clickhouseAccessNativeColumnar, error) { + c, err := clickhouse.Open(opts) + if err != nil { + return nil, fmt.Errorf("failed to connect to clickhouse: %w", err) + } + if err = c.Ping(context.Background()); err != nil { + return nil, fmt.Errorf("failed to ping clickhouse server: %w", err) + } + return &clickhouseAccessNativeColumnar{ + conn: c, + }, nil +} + +// Inserts a profile batch into the clickhouse server using columnar native protocol +func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { + b, err := ch.conn.PrepareBatch(context.Background(), "INSERT INTO profiles_input") + if err != nil { + return fmt.Errorf("failed to prepare batch: %w", err) + } + + rs := ls.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords() + sz := rs.Len() + + // send efficient native columnar protocol + timestamp_ns := make([]uint64, sz) + profile_id := make([]string, sz) + typ := make([]string, sz) + service_name := make([]string, sz) + period_type := make([]string, sz) + period_unit := make([]string, sz) + tags := make([][]kv, sz) + duration_ns := make([]uint64, sz) + payload_type := make([]string, sz) + payload := make([][]byte, sz) + + var ( + r plog.LogRecord + m pcommon.Map + tmp pcommon.Value + tm map[string]any + ) + for i := 0; i < rs.Len(); i++ { + r = rs.At(i) + m = r.Attributes() + + timestamp_ns = append(timestamp_ns, uint64(r.Timestamp())) + + profile_id = append(profile_id, "") + + tmp, _ = m.Get("type") + typ = append(typ, tmp.AsString()) + + tmp, _ = m.Get("service_name") + service_name = append(service_name, tmp.AsString()) + + tmp, _ = m.Get("period_type") + period_type = append(period_type, tmp.AsString()) + + tmp, _ = m.Get("period_unit") + period_unit = append(period_unit, tmp.AsString()) + + tmp, _ = m.Get("tags") + tm = tmp.Map().AsRaw() + tag := make([]kv, len(tm)) + for k, v := range tm { + tag = append(tag, kv{k, v.(string)}) + } + tags = append(tags, tag) + + tmp, _ = m.Get("duration_ns") + duration_ns = append(duration_ns, uint64(tmp.Int())) + + tmp, _ = m.Get("payload_type") + payload_type = append(payload_type, tmp.AsString()) + + payload = append(payload, r.Body().Bytes().AsRaw()) + } + + if err := b.Column(0).Append(timestamp_ns); err != nil { + return err + } + if err := b.Column(1).Append(profile_id); err != nil { + return err + } + if err := b.Column(2).Append(typ); err != nil { + return err + } + if err := b.Column(3).Append(service_name); err != nil { + return err + } + if err := b.Column(4).Append(period_type); err != nil { + return err + } + if err := b.Column(5).Append(period_unit); err != nil { + return err + } + if err := b.Column(6).Append(tags); err != nil { + return err + } + if err := b.Column(7).Append(duration_ns); err != nil { + return err + } + if err := b.Column(8).Append(payload_type); err != nil { + return err + } + if err := b.Column(9).Append(payload); err != nil { + return err + } + return b.Send() +} + +// Closes the clickhouse connection pool +func (ch *clickhouseAccessNativeColumnar) Shutdown() error { + return ch.conn.Close() +} diff --git a/exporter/clickhouseprofileexporter/config.go b/exporter/clickhouseprofileexporter/config.go new file mode 100644 index 0000000..e331614 --- /dev/null +++ b/exporter/clickhouseprofileexporter/config.go @@ -0,0 +1,39 @@ +package clickhouseprofileexporter + +import ( + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/exporter/exporterhelper" +) + +// Represents the receiver config within the collector's config.yaml +type Config struct { + exporterhelper.TimeoutSettings `mapstructure:",squash"` + exporterhelper.RetrySettings `mapstructure:"retry_on_failure"` + QueueSettings `mapstructure:"sending_queue"` + + ClusteredClickhouse bool `mapstructure:"clustered_clickhouse"` + // DSN is the ClickHouse server Data Source Name. + // For tcp protocol reference: [ClickHouse/clickhouse-go#dsn](https://github.com/ClickHouse/clickhouse-go#dsn). + // For http protocol reference: [mailru/go-clickhouse/#dsn](https://github.com/mailru/go-clickhouse/#dsn). + Dsn string `mapstructure:"dsn"` +} + +type QueueSettings struct { + // Length of the sending queue + QueueSize int `mapstructure:"queue_size"` +} + +var _ component.Config = (*Config)(nil) + +// Checks that the receiver configuration is valid +func (cfg *Config) Validate() error { + return nil +} + +func (cfg *Config) enforceQueueSettings() exporterhelper.QueueSettings { + return exporterhelper.QueueSettings{ + Enabled: true, + NumConsumers: 1, + QueueSize: cfg.QueueSettings.QueueSize, + } +} diff --git a/exporter/clickhouseprofileexporter/exporter.go b/exporter/clickhouseprofileexporter/exporter.go new file mode 100644 index 0000000..6d83da3 --- /dev/null +++ b/exporter/clickhouseprofileexporter/exporter.go @@ -0,0 +1,64 @@ +package clickhouseprofileexporter + +import ( + "context" + "fmt" + + "github.com/ClickHouse/clickhouse-go/v2" + "github.com/metrico/otel-collector/exporter/clickhouseprofileexporter/ch" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/pdata/plog" + "go.uber.org/zap" +) + +type clickhouseProfileExporter struct { + cfg *Config + set *exporter.CreateSettings + logger *zap.Logger + + ch clickhouseAccess +} + +type clickhouseAccess interface { + // Inserts a profile batch into the clickhouse server + InsertBatch(profiles plog.Logs) error + + // Shuts down the clickhouse connection + Shutdown() error +} + +func newClickhouseProfileExporter(ctx context.Context, set *exporter.CreateSettings, cfg *Config) (*clickhouseProfileExporter, error) { + opts, err := clickhouse.ParseDSN(cfg.Dsn) + if err != nil { + return nil, fmt.Errorf("failed to parse clickhouse dsn: %w", err) + } + ch, err := ch.NewClickhouseAccessNativeColumnar(opts) + if err != nil { + return nil, fmt.Errorf("failed to init native ch storage: %w", err) + } + return &clickhouseProfileExporter{ + cfg: cfg, + set: set, + logger: set.Logger, + ch: ch, + }, nil +} + +// Sends the profiles to clickhouse server using the configured connection +func (exp *clickhouseProfileExporter) send(ctx context.Context, logs plog.Logs) error { + if err := exp.ch.InsertBatch(logs); err != nil { + msg := fmt.Sprintf("failed to insert batch: [%s]", err.Error()) + exp.logger.Error(msg) + return err + } + exp.logger.Info("inserted batch", zap.Int("size", logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().Len())) + return nil +} + +// Shuts down the exporter, by shutting down the ch connection pull +func (exp *clickhouseProfileExporter) Shutdown(ctx context.Context) error { + if err := exp.ch.Shutdown(); err != nil { + return fmt.Errorf("failed to shutdown: %w", err) + } + return nil +} diff --git a/exporter/clickhouseprofileexporter/factory.go b/exporter/clickhouseprofileexporter/factory.go new file mode 100644 index 0000000..fc87563 --- /dev/null +++ b/exporter/clickhouseprofileexporter/factory.go @@ -0,0 +1,52 @@ +package clickhouseprofileexporter + +import ( + "context" + "fmt" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/exporter" + "go.opentelemetry.io/collector/exporter/exporterhelper" +) + +const ( + typeStr = "qryn" + + defaultDsn = "tcp://127.0.0.1:9000/cloki" +) + +func createDefaultConfig() component.Config { + return &Config{ + TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), + QueueSettings: QueueSettings{QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize}, + RetrySettings: exporterhelper.NewDefaultRetrySettings(), + Dsn: defaultDsn, + } +} + +func createLogsExporter(ctx context.Context, set exporter.CreateSettings, cfg component.Config) (exporter.Logs, error) { + c := cfg.(*Config) + exp, err := newClickhouseProfileExporter(ctx, &set, cfg.(*Config)) + if err != nil { + return nil, fmt.Errorf("cannot init clickhouse profile exporter: %w", err) + } + return exporterhelper.NewLogsExporter( + ctx, + set, + cfg, + exp.send, + exporterhelper.WithShutdown(exp.Shutdown), + exporterhelper.WithQueue(c.enforceQueueSettings()), + exporterhelper.WithTimeout(c.TimeoutSettings), + exporterhelper.WithRetry(c.RetrySettings), + ) +} + +// Creates a factory for the clickhouse profile exporter. +func NewFactory() exporter.Factory { + return exporter.NewFactory( + typeStr, + createDefaultConfig, + exporter.WithLogs(createLogsExporter, component.StabilityLevelAlpha), + ) +} From cf5083a2a16f0e1c25275bdc27f8d470501e523b Mon Sep 17 00:00:00 2001 From: tomershafir Date: Wed, 20 Dec 2023 12:15:32 +0200 Subject: [PATCH 26/44] todo tc based ch profile exporter it --- .../clickhouseprofileexporter_test.go | 69 +++++++++++++ .../testdata/init_db.sh | 97 +++++++++++++++++++ go.mod | 19 ++-- go.sum | 33 ++++--- .../pyroscopereceiver_test.go | 15 ++- 5 files changed, 200 insertions(+), 33 deletions(-) create mode 100644 exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go create mode 100644 exporter/clickhouseprofileexporter/testdata/init_db.sh diff --git a/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go b/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go new file mode 100644 index 0000000..5c99524 --- /dev/null +++ b/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go @@ -0,0 +1,69 @@ +package clickhouseprofileexporter + +// TODO: fix and complete this tc based integration test, something seems wrong with the docker wiring + +// import ( +// "context" +// "testing" + +// "github.com/stretchr/testify/require" +// "github.com/testcontainers/testcontainers-go/modules/clickhouse" +// "go.opentelemetry.io/collector/pdata/plog" +// ) + +// type chtest struct { +// name string +// batch plog.Logs +// // expected +// } + +// func startContainer(t *testing.T) string { +// ctx := context.Background() + +// tc, err := clickhouse.RunContainer(ctx) // clickhouse.WithInitScripts(filepath.Join("testdata", "init_db.sh")), + +// if err != nil { +// panic(err) +// } + +// t.Cleanup(func() { require.NoError(t, tc.Terminate(ctx)) }) + +// dsn, err := tc.ConnectionString(ctx) +// if err != nil { +// panic(err) +// } +// return dsn +// } + +// func TestExportProfileBatch(t *testing.T) { +// startContainer(t) +// cfg := &Config{ +// TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), +// QueueSettings: QueueSettings{QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize}, +// RetrySettings: exporterhelper.NewDefaultRetrySettings(), +// Dsn: dsn, +// } +// set := exportertest.NewNopCreateSettings() +// set.Logger = zap.Must(zap.NewDevelopment()) +// exp, err := newClickhouseProfileExporter(context.Background(), &set, cfg) +// if err != nil { +// panic(err) +// } + +// t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) }) + +// tests := []chtest{{ +// name: "send profile batch to clickhouse server", +// batch: , +// expected: , +// }} + +// for _, tt := range tests { +// t.Run(tt.name, func(t *testing.T) { +// assert.NoError(t, send(context.Background()), "send shouldn't have been failed") +// actual := +// assert.NoError(t, plogtest.CompareLogs(tt.expected, actual[0])) +// truncate table +// }) +// } +// } diff --git a/exporter/clickhouseprofileexporter/testdata/init_db.sh b/exporter/clickhouseprofileexporter/testdata/init_db.sh new file mode 100644 index 0000000..4c6b691 --- /dev/null +++ b/exporter/clickhouseprofileexporter/testdata/init_db.sh @@ -0,0 +1,97 @@ +#!/bin/bash +set -e + +clickhouse-client \ + --user "$CLICKHOUSE_USER" \ + --password "$CLICKHOUSE_PASSWORD" \ + --database "$CLICKHOUSE_DB" \ + --multiquery "CREATE TABLE IF NOT EXISTS profiles_input ( + timestamp_ns UInt64, + profile_id FixedString(16), + type LowCardinality(String), + service_name LowCardinality(String), + period_type LowCardinality(String), + period_unit LowCardinality(String), + tags Array(Tuple(String, String)), + duration_ns UInt64, + payload_type LowCardinality(String), + payload String + ) Engine=Null; + CREATE TABLE IF NOT EXISTS profiles ( + timestamp_ns UInt64 CODEC(DoubleDelta, ZSTD(1)), + fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), + type_id LowCardinality(String) CODEC(ZSTD(1)), + service_name LowCardinality(String) CODEC(ZSTD(1)), + profile_id FixedString(16) CODEC(ZSTD(1)), + duration_ns UInt64 CODEC(DoubleDelta, ZSTD(1)), + payload_type LowCardinality(String) CODEC(ZSTD(1)), + payload String CODEC(ZSTD(1)) + ) Engine MergeTree() + ORDER BY (type_id, service_name, timestamp_ns) + PARTITION BY toDate(FROM_UNIXTIME(intDiv(timestamp_ns, 1000000000))); + CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_mv TO profiles AS + SELECT + timestamp_ns, + cityHash64(arraySort(arrayConcat( + profiles_input.tags, [('__type__', concatWithSeparator(':', type, period_type, period_unit) as _type_id), ('service_name', service_name)] + )) as _tags) as fingerprint, + _type_id as type_id, + service_name, + unhex(profile_id)::FixedString(16) as profile_id, + duration_ns, + payload_type, + payload + FROM profiles_input; + CREATE TABLE IF NOT EXISTS profiles_series ( + date Date CODEC(ZSTD(1)), + type_id LowCardinality(String) CODEC(ZSTD(1)), + service_name LowCardinality(String) CODEC(ZSTD(1)), + fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), + tags Array(Tuple(String, String)) CODEC(ZSTD(1)), + ) Engine ReplacingMergeTree() + ORDER BY (date, type_id, fingerprint) + PARTITION BY date; + CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_mv TO profiles_series AS + SELECT + toDate(intDiv(timestamp_ns, 1000000000)) as date, + concatWithSeparator(':', type, period_type, period_unit) as type_id, + service_name, + cityHash64(arraySort(arrayConcat( + profiles_input.tags, [('__type__', type_id), ('service_name', service_name)] + )) as _tags) as fingerprint, + tags + FROM profiles_input; + CREATE TABLE IF NOT EXISTS profiles_series_gin ( + date Date CODEC(ZSTD(1)), + key String CODEC(ZSTD(1)), + val String CODEC(ZSTD(1)), + type_id LowCardinality(String) CODEC(ZSTD(1)), + service_name LowCardinality(String) CODEC(ZSTD(1)), + fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), + ) Engine ReplacingMergeTree() + ORDER BY (date, key, val, type_id, fingerprint) + PARTITION BY date; + CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_gin_mv TO profiles_series_gin AS + SELECT + date, + kv.1 as key, + kv.2 as val, + type_id, + service_name, + fingerprint, + FROM profiles_series ARRAY JOIN tags as kv; + CREATE TABLE IF NOT EXISTS profiles_series_keys ( + date Date, + key String, + val String, + val_id UInt64, + ) Engine ReplacingMergeTree() + ORDER BY (date, key, val_id) + PARTITION BY date; + CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_keys_mv TO profiles_series_keys AS + SELECT + date, + key, + val, + cityHash64(val) % 50000 as val_id + FROM profiles_series_gin" diff --git a/go.mod b/go.mod index 1ae9e66..4e1bc99 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,7 @@ replace ( exclude github.com/StackExchange/wmi v1.2.0 require ( - github.com/ClickHouse/clickhouse-go/v2 v2.10.1 + github.com/ClickHouse/clickhouse-go/v2 v2.14.2 github.com/KimMachineGun/automemlimit v0.4.0 github.com/go-logfmt/logfmt v0.6.0 github.com/google/pprof v0.0.0-20231127191134-f3a68a39ae15 @@ -158,7 +158,10 @@ require ( google.golang.org/protobuf v1.31.0 ) -require github.com/containerd/cgroups/v3 v3.0.2 // indirect +require ( + github.com/containerd/cgroups/v3 v3.0.2 // indirect + gotest.tools/v3 v3.5.0 // indirect +) require ( github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.85.0 @@ -201,7 +204,7 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect - github.com/ClickHouse/ch-go v0.52.1 // indirect + github.com/ClickHouse/ch-go v0.58.2 // indirect github.com/DataDog/datadog-agent/pkg/obfuscate v0.49.0-rc.2 // indirect github.com/DataDog/datadog-agent/pkg/proto v0.50.0-devel // indirect github.com/DataDog/datadog-agent/pkg/remoteconfig/state v0.49.0-rc.2 // indirect @@ -307,7 +310,7 @@ require ( github.com/gobwas/glob v0.2.3 // indirect github.com/goccy/go-json v0.10.0 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect - github.com/godbus/dbus/v5 v5.0.6 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt v3.2.2+incompatible // indirect @@ -451,7 +454,7 @@ require ( github.com/opencontainers/image-spec v1.1.0-rc5 // indirect github.com/opencontainers/runc v1.1.9 // indirect github.com/opencontainers/runtime-spec v1.1.0-rc.3 // indirect - github.com/opencontainers/selinux v1.10.0 // indirect + github.com/opencontainers/selinux v1.11.0 // indirect github.com/openshift/api v3.9.0+incompatible // indirect github.com/openshift/client-go v0.0.0-20210521082421-73d9475a9142 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect @@ -459,7 +462,7 @@ require ( github.com/outcaste-io/ristretto v0.2.1 // indirect github.com/ovh/go-ovh v1.4.1 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect - github.com/paulmach/orb v0.9.0 // indirect + github.com/paulmach/orb v0.10.0 // indirect github.com/philhofer/fwd v1.1.2 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect @@ -505,8 +508,8 @@ require ( github.com/tklauser/numcpus v0.6.1 // indirect github.com/uber/jaeger-client-go v2.30.0+incompatible // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect - github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 // indirect - github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae // indirect + github.com/vishvananda/netlink v1.2.1-beta.2 // indirect + github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect github.com/vmware/go-vmware-nsxt v0.0.0-20220328155605-f49a14c1ef5f // indirect github.com/vmware/govmomi v0.33.1 // indirect github.com/vultr/govultr/v2 v2.17.2 // indirect diff --git a/go.sum b/go.sum index 7f706e9..f436bc9 100644 --- a/go.sum +++ b/go.sum @@ -116,10 +116,10 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkM github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.52.1 h1:nucdgfD1BDSHjbNaG3VNebonxJzD8fX8jbuBpfo5VY0= -github.com/ClickHouse/ch-go v0.52.1/go.mod h1:B9htMJ0hii/zrC2hljUKdnagRBuLqtRG/GrU3jqCwRk= -github.com/ClickHouse/clickhouse-go/v2 v2.10.1 h1:WCnusqEeCO/9sLFVIv57le/O1ydUb+x9+SYYhJ11fsY= -github.com/ClickHouse/clickhouse-go/v2 v2.10.1/go.mod h1:teXfZNM90iQ99Jnuht+dxQXCuhDZ8nvvMoTJOFrcmcg= +github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= +github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= +github.com/ClickHouse/clickhouse-go/v2 v2.14.2 h1:iYGP2bgPYJ33y6rCfZTQAPrnHt8wmsM3Ut4cLoYhWY0= +github.com/ClickHouse/clickhouse-go/v2 v2.14.2/go.mod h1:ZLn63wODwGxVdnGB0EIYmFL5tjtlLcLBuwQUH6B2sYk= github.com/DataDog/datadog-agent/pkg/obfuscate v0.49.0-rc.2 h1:Y56sdsJotnJmxTzyHvADM2/0VpWzonQrSAeIjHCqk+s= github.com/DataDog/datadog-agent/pkg/obfuscate v0.49.0-rc.2/go.mod h1:HzySONXnAgSmIQfL6gOv9hWprKJkx8CicuXuUbmgWfo= github.com/DataDog/datadog-agent/pkg/proto v0.50.0-devel h1:lGJKaJlKDbycF6jItLw8ONN8GX3dkN6S+95AvDfGF+s= @@ -500,8 +500,8 @@ github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6 h1:mkgN1ofwASrYnJ5W6U/BxG15eXXXjirgZc7CLqkcaro= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -1291,8 +1291,8 @@ github.com/opencontainers/runc v1.1.9 h1:XR0VIHTGce5eWPkaPesqTBrhW2yAcaraWfsEalN github.com/opencontainers/runc v1.1.9/go.mod h1:CbUumNnWCuTGFukNXahoo/RFBZvDAgRh/smNYNOhA50= github.com/opencontainers/runtime-spec v1.1.0-rc.3 h1:l04uafi6kxByhbxev7OWiuUv0LZxEsYUfDWZ6bztAuU= github.com/opencontainers/runtime-spec v1.1.0-rc.3/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0 h1:rAiKF8hTcgLI3w0DHm6i0ylVVcOrlgR1kK99DRLDhyU= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= github.com/openshift/api v0.0.0-20210521075222-e273a339932a/go.mod h1:izBmoXbUu3z5kUa4FjZhvekTsyzIWiOoaIgJiZBBMQs= github.com/openshift/api v3.9.0+incompatible h1:fJ/KsefYuZAjmrr3+5U9yZIZbTOpVkDDLDLFresAeYs= github.com/openshift/api v3.9.0+incompatible/go.mod h1:dh9o4Fs58gpFXGSYfnVxGR9PnV53I8TW84pQaJDdGiY= @@ -1312,8 +1312,8 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= -github.com/paulmach/orb v0.9.0 h1:MwA1DqOKtvCgm7u9RZ/pnYejTeDJPnr0+0oFajBbJqk= -github.com/paulmach/orb v0.9.0/go.mod h1:SudmOk85SXtmXAB3sLGyJ6tZy/8pdfrV0o6ef98Xc30= +github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= +github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= @@ -1511,10 +1511,11 @@ github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaO github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg= github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852 h1:cPXZWzzG0NllBLdjWoD1nDfaqu98YMv+OneaKc8sPOA= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae h1:4hwBBUfQCFe3Cym0ZtKyq7L16eZUtYKs+BaHDN6mAns= +github.com/vishvananda/netlink v1.2.1-beta.2 h1:Llsql0lnQEbHj0I1OuKyp8otXp0r3q0mPkuhwHfStVs= +github.com/vishvananda/netlink v1.2.1-beta.2/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA= +github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v4 v4.3.12 h1:07s4sz9IReOgdikxLTKNbBdqDMLsjPKXwvCazn8G65U= github.com/vmihailenco/tagparser v0.1.2 h1:gnjoVuB/kljJ5wICEEOpx98oXMWPLj22G67Vbd1qPqc= github.com/vmware/go-vmware-nsxt v0.0.0-20220328155605-f49a14c1ef5f h1:NbC9yOr5At92seXK+kOr2TzU3mIWzcJOVzZasGSuwoU= @@ -1554,7 +1555,7 @@ go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsX go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.mongodb.org/atlas v0.35.0 h1:fLSPEyv+QcrG5djPWMekaM+BEVfEVBKQO4yEUQl4CQ4= go.mongodb.org/atlas v0.35.0/go.mod h1:nfPldE9dSama6G2IbIzmEza02Ly7yFZjMMVscaM0uEc= -go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= +go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= go.mongodb.org/mongo-driver v1.13.0 h1:67DgFFjYOCMWdtTEmKFpV3ffWlFnh+CYZ8ZS/tXWUfY= go.mongodb.org/mongo-driver v1.13.0/go.mod h1:/rGBTebI3XYboVmgz+Wv3Bcbl3aD0QF9zl6kDDw18rQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1869,7 +1870,6 @@ golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2196,7 +2196,8 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools/v3 v3.2.0 h1:I0DwBVMGAx26dttAj1BtJLAkVGncrkkUXfJLC4Flt/I= +gotest.tools/v3 v3.5.0 h1:Ljk6PdHdOhAb5aDMWXjDLMMhph+BpztA4v1QdqEW2eY= +gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 075ddec..659c218 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -24,12 +24,11 @@ import ( "go.uber.org/zap" ) -type jfrTest struct { +type jfrtest struct { name string urlParams map[string]string jfr string expected plog.Logs - err error } type profileLog struct { @@ -44,7 +43,7 @@ func loadTestData(t *testing.T, filename string) []byte { return b } -func run(t *testing.T, tests []jfrTest, collectorAddr string, sink *consumertest.LogsSink) { +func run(t *testing.T, tests []jfrtest, collectorAddr string, sink *consumertest.LogsSink) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert.NoError(t, send(t, collectorAddr, tt.urlParams, tt.jfr), "send shouldn't have been failed") @@ -121,9 +120,9 @@ func send(t *testing.T, addr string, urlParams map[string]string, jfr string) er } func TestPyroscopeIngestJfrCpu(t *testing.T) { - tests := make([]jfrTest, 1) + tests := make([]jfrtest, 1) pb := loadTestData(t, "cortex-dev-01__kafka-0__cpu__0.pb") - tests[0] = jfrTest{ + tests[0] = jfrtest{ name: "send labeled multipart form data gzipped cpu jfr to http ingest endpoint", urlParams: map[string]string{ "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", @@ -147,7 +146,6 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { }, body: pb, }}), - err: nil, } addr, sink := startHttpServer(t) collectorAddr := fmt.Sprintf("http://%s%s", addr, ingestPath) @@ -155,10 +153,10 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { } func TestPyroscopeIngestJfrMemory(t *testing.T) { - tests := make([]jfrTest, 1) + tests := make([]jfrtest, 1) pbAllocInNewTlab := loadTestData(t, "memory_example_alloc_in_new_tlab.pb") pbLiveObject := loadTestData(t, "memory_example_live_object.pb") - tests[0] = jfrTest{ + tests[0] = jfrtest{ name: "send labeled multipart form data gzipped memoty jfr to http ingest endpoint", urlParams: map[string]string{ "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", @@ -195,7 +193,6 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { }, body: pbLiveObject, }}), - err: nil, } addr, sink := startHttpServer(t) From 22217bb0f0fa95b37c86025a0c8b7bd356ffc2b2 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Wed, 20 Dec 2023 13:28:19 +0200 Subject: [PATCH 27/44] register ch profiler exporter --- cmd/otel-collector/components.go | 2 ++ config/example-config.yaml | 12 +++++++++++- exporter/clickhouseprofileexporter/factory.go | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/cmd/otel-collector/components.go b/cmd/otel-collector/components.go index c37f804..922de36 100644 --- a/cmd/otel-collector/components.go +++ b/cmd/otel-collector/components.go @@ -134,6 +134,7 @@ import ( "go.opentelemetry.io/collector/receiver/otlpreceiver" "go.uber.org/multierr" + "github.com/metrico/otel-collector/exporter/clickhouseprofileexporter" "github.com/metrico/otel-collector/exporter/qrynexporter" "github.com/metrico/otel-collector/receiver/pyroscopereceiver" ) @@ -243,6 +244,7 @@ func components() (otelcol.Factories, error) { exporters := []exporter.Factory{ qrynexporter.NewFactory(), + clickhouseprofileexporter.NewFactory(), carbonexporter.NewFactory(), fileexporter.NewFactory(), jaegerexporter.NewFactory(), diff --git a/config/example-config.yaml b/config/example-config.yaml index fdf63e5..7d657c6 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -61,6 +61,16 @@ exporters: initial_interval: 5s max_interval: 30s max_elapsed_time: 300s + clickhouseprofileexporter: + dsn: tcp://0.0.0.0:9000/cloki + timeout: 10s + sending_queue: + queue_size: 100 + retry_on_failure: + enabled: true + initial_interval: 5s + max_interval: 30s + max_elapsed_time: 300s otlp: endpoint: localhost:4317 tls: @@ -84,7 +94,7 @@ service: logs/profiles: receivers: [pyroscopereceiver] processors: [batch] - exporters: [qryn] + exporters: [clickhouseprofileexporter] traces: receivers: [otlp] processors: [resourcedetection/system, spanmetrics, batch] diff --git a/exporter/clickhouseprofileexporter/factory.go b/exporter/clickhouseprofileexporter/factory.go index fc87563..d9196e8 100644 --- a/exporter/clickhouseprofileexporter/factory.go +++ b/exporter/clickhouseprofileexporter/factory.go @@ -10,7 +10,7 @@ import ( ) const ( - typeStr = "qryn" + typeStr = "clickhouseprofileexporter" defaultDsn = "tcp://127.0.0.1:9000/cloki" ) From e2a7592eb84ac251c8b0653dae1a6f11ac6acd02 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Fri, 22 Dec 2023 11:54:31 +0200 Subject: [PATCH 28/44] fix receiver test --- .../pyroscopereceiver_test.go | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index 659c218..f9a8cf7 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -135,14 +135,16 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ - "service_name": "com.example.App", - "dc": "us-east-1", - "kubernetes_pod_name": "app-abcd1234", - "duration_ns": "7000000000", - "type": "process_cpu", - "period_type": "cpu", - "period_unit": "nanoseconds", - "payload_type": "0", + "service_name": "com.example.App", + "tags": map[string]any{ + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + }, + "duration_ns": "7000000000", + "type": "process_cpu", + "period_type": "cpu", + "period_unit": "nanoseconds", + "payload_type": "0", }, body: pb, }}), @@ -168,28 +170,32 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { expected: gen([]profileLog{{ timestamp: 1700332322, attrs: map[string]any{ - "service_name": "com.example.App", - "dc": "us-east-1", - "kubernetes_pod_name": "app-abcd1234", - "duration_ns": "7000000000", - "type": "memory", - "period_type": "space", - "period_unit": "bytes", - "payload_type": "0", + "service_name": "com.example.App", + "tags": map[string]any{ + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + }, + "duration_ns": "7000000000", + "type": "memory", + "period_type": "space", + "period_unit": "bytes", + "payload_type": "0", }, body: pbAllocInNewTlab, }, { timestamp: 1700332322, attrs: map[string]any{ - "service_name": "com.example.App", - "dc": "us-east-1", - "kubernetes_pod_name": "app-abcd1234", - "duration_ns": "7000000000", - "type": "memory", - "period_type": "objects", - "period_unit": "count", - "payload_type": "0", + "service_name": "com.example.App", + "tags": map[string]any{ + "dc": "us-east-1", + "kubernetes_pod_name": "app-abcd1234", + }, + "duration_ns": "7000000000", + "type": "memory", + "period_type": "objects", + "period_unit": "count", + "payload_type": "0", }, body: pbLiveObject, }}), From f04e3fcb43dc58d0bc2f43c5f83e73fd3c76e766 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Fri, 22 Dec 2023 12:54:44 +0200 Subject: [PATCH 29/44] convert s->ns --- receiver/pyroscopereceiver/receiver.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 7674805..f6a7e49 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -122,9 +122,9 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { rs := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() for _, pr := range ps { r := rs.AppendEmpty() - r.SetTimestamp(pcommon.Timestamp(att.start)) + r.SetTimestamp(pcommon.Timestamp(ns(att.start))) m := r.Attributes() - m.PutStr("duration_ns", fmt.Sprint((att.end-att.start)*1e9)) + m.PutStr("duration_ns", fmt.Sprint(ns(att.end-att.start))) m.PutStr("service_name", att.name) tm := m.PutEmptyMap("tags") for _, l := range att.labels { @@ -136,6 +136,10 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { return logs, nil } +func ns(sec uint64) uint64 { + return sec * 1e9 +} + func (recv *pyroscopeReceiver) openMultipartJfr(req *http.Request) (multipart.File, error) { if err := req.ParseMultipartForm(recv.cfg.Protocols.Http.MaxRequestBodySize); err != nil { return nil, fmt.Errorf("failed to parse multipart request: %w", err) From e5e15e00b595e6a6be7323527896430fefca2971 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Fri, 22 Dec 2023 17:24:12 +0200 Subject: [PATCH 30/44] fix labels compile --- .../pyroscopereceiver/pyroscopereceiver_test.go | 7 ++++--- receiver/pyroscopereceiver/receiver.go | 17 +++++++++++------ 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/pyroscopereceiver_test.go index f9a8cf7..53a0468 100644 --- a/receiver/pyroscopereceiver/pyroscopereceiver_test.go +++ b/receiver/pyroscopereceiver/pyroscopereceiver_test.go @@ -125,7 +125,7 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { tests[0] = jfrtest{ name: "send labeled multipart form data gzipped cpu jfr to http ingest endpoint", urlParams: map[string]string{ - "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", + "name": "com.example.App{dc=us-east-1,kubernetes_pod_name=app-abcd1234}", "from": "1700332322", "until": "1700332329", "format": "jfr", @@ -161,7 +161,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { tests[0] = jfrtest{ name: "send labeled multipart form data gzipped memoty jfr to http ingest endpoint", urlParams: map[string]string{ - "name": "com.example.App{dc=\"us-east-1\",kubernetes_pod_name=\"app-abcd1234\"}", + "name": "com.example.App{dc=us-east-1,kubernetes_pod_name=app-abcd1234}", "from": "1700332322", "until": "1700332329", "format": "jfr", @@ -198,7 +198,8 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { "payload_type": "0", }, body: pbLiveObject, - }}), + }, + }), } addr, sink := startHttpServer(t) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index f6a7e49..d88f3d7 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -17,7 +17,6 @@ import ( "github.com/metrico/otel-collector/receiver/pyroscopereceiver/jfrparser" profile_types "github.com/metrico/otel-collector/receiver/pyroscopereceiver/types" "github.com/prometheus/prometheus/model/labels" - promql_parser "github.com/prometheus/prometheus/promql/parser" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/consumer" "go.opentelemetry.io/collector/pdata/pcommon" @@ -198,12 +197,18 @@ func getAttrsFromParams(params *url.Values) (attrs, error) { if i < 0 { i = length } else { // optional labels - promql := tmp[0][i:length] - labels, err := promql_parser.ParseMetric(promql) - if err != nil { - return att, fmt.Errorf("failed to parse labels: %w", err) + // TODO: improve this stupid {k=v(,k=v)*} compiler, checkout pyroscope's implementation + promqllike := tmp[0][i+1 : length-1] // stripe {} + if len(promqllike) > 0 { + words := strings.FieldsFunc(promqllike, func(r rune) bool { return r == '=' || r == ',' }) + sz := len(words) + if sz == 0 || sz%2 != 0 { + return att, fmt.Errorf("failed to compile labels") + } + for j := 0; j < len(words); j += 2 { + att.labels = append(att.labels, labels.Label{Name: words[j], Value: words[j+1]}) + } } - att.labels = labels } // required app name att.name = tmp[0][:i] From dda4fb65872de707b49c6d7795dcda65df95cd93 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Fri, 22 Dec 2023 17:24:33 +0200 Subject: [PATCH 31/44] fix natifve columnar access --- .../ch/access_native_columnar.go | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go index ff2ab7a..bee09f8 100644 --- a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go +++ b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go @@ -3,6 +3,7 @@ package ch import ( "context" "fmt" + "strconv" "github.com/ClickHouse/clickhouse-go/v2" "github.com/ClickHouse/clickhouse-go/v2/lib/driver" @@ -15,10 +16,7 @@ type clickhouseAccessNativeColumnar struct { conn driver.Conn } -type kv struct { - k string - v string -} +type tuple []any // Connects to clickhouse and checks the connection's health, returning a new native client func NewClickhouseAccessNativeColumnar(opts *clickhouse.Options) (*clickhouseAccessNativeColumnar, error) { @@ -44,14 +42,13 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { rs := ls.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords() sz := rs.Len() - // send efficient native columnar protocol timestamp_ns := make([]uint64, sz) profile_id := make([]string, sz) typ := make([]string, sz) service_name := make([]string, sz) period_type := make([]string, sz) period_unit := make([]string, sz) - tags := make([][]kv, sz) + tags := make([][]tuple, sz) duration_ns := make([]uint64, sz) payload_type := make([]string, sz) payload := make([][]byte, sz) @@ -66,39 +63,41 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { r = rs.At(i) m = r.Attributes() - timestamp_ns = append(timestamp_ns, uint64(r.Timestamp())) + timestamp_ns[i] = uint64(r.Timestamp()) - profile_id = append(profile_id, "") + profile_id[i] = "" tmp, _ = m.Get("type") - typ = append(typ, tmp.AsString()) + typ[i] = tmp.AsString() tmp, _ = m.Get("service_name") - service_name = append(service_name, tmp.AsString()) + service_name[i] = tmp.AsString() tmp, _ = m.Get("period_type") - period_type = append(period_type, tmp.AsString()) + period_type[i] = tmp.AsString() tmp, _ = m.Get("period_unit") - period_unit = append(period_unit, tmp.AsString()) + period_unit[i] = tmp.AsString() tmp, _ = m.Get("tags") tm = tmp.Map().AsRaw() - tag := make([]kv, len(tm)) + tag, j := make([]tuple, len(tm)), 0 for k, v := range tm { - tag = append(tag, kv{k, v.(string)}) + tag[j] = tuple{k, v.(string)} + j++ } - tags = append(tags, tag) + tags[i] = tag tmp, _ = m.Get("duration_ns") - duration_ns = append(duration_ns, uint64(tmp.Int())) + duration_ns[i], _ = strconv.ParseUint(tmp.Str(), 10, 64) tmp, _ = m.Get("payload_type") - payload_type = append(payload_type, tmp.AsString()) + payload_type[i] = tmp.AsString() - payload = append(payload, r.Body().Bytes().AsRaw()) + payload[i] = r.Body().Bytes().AsRaw() } + // column order here should match table column order if err := b.Column(0).Append(timestamp_ns); err != nil { return err } From 959aafd53d376eecdeab9bb65e0d1766002f1b8c Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 24 Dec 2023 13:34:25 +0200 Subject: [PATCH 32/44] rename receiver_test --- .../{pyroscopereceiver_test.go => receiver_test.go} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename receiver/pyroscopereceiver/{pyroscopereceiver_test.go => receiver_test.go} (100%) diff --git a/receiver/pyroscopereceiver/pyroscopereceiver_test.go b/receiver/pyroscopereceiver/receiver_test.go similarity index 100% rename from receiver/pyroscopereceiver/pyroscopereceiver_test.go rename to receiver/pyroscopereceiver/receiver_test.go From 8e3226eb23805f79cd4621c51a374622cc6757d5 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 24 Dec 2023 13:35:24 +0200 Subject: [PATCH 33/44] clean exporter_test for now --- .../clickhouseprofileexporter_test.go | 69 ------------------- 1 file changed, 69 deletions(-) delete mode 100644 exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go diff --git a/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go b/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go deleted file mode 100644 index 5c99524..0000000 --- a/exporter/clickhouseprofileexporter/clickhouseprofileexporter_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package clickhouseprofileexporter - -// TODO: fix and complete this tc based integration test, something seems wrong with the docker wiring - -// import ( -// "context" -// "testing" - -// "github.com/stretchr/testify/require" -// "github.com/testcontainers/testcontainers-go/modules/clickhouse" -// "go.opentelemetry.io/collector/pdata/plog" -// ) - -// type chtest struct { -// name string -// batch plog.Logs -// // expected -// } - -// func startContainer(t *testing.T) string { -// ctx := context.Background() - -// tc, err := clickhouse.RunContainer(ctx) // clickhouse.WithInitScripts(filepath.Join("testdata", "init_db.sh")), - -// if err != nil { -// panic(err) -// } - -// t.Cleanup(func() { require.NoError(t, tc.Terminate(ctx)) }) - -// dsn, err := tc.ConnectionString(ctx) -// if err != nil { -// panic(err) -// } -// return dsn -// } - -// func TestExportProfileBatch(t *testing.T) { -// startContainer(t) -// cfg := &Config{ -// TimeoutSettings: exporterhelper.NewDefaultTimeoutSettings(), -// QueueSettings: QueueSettings{QueueSize: exporterhelper.NewDefaultQueueSettings().QueueSize}, -// RetrySettings: exporterhelper.NewDefaultRetrySettings(), -// Dsn: dsn, -// } -// set := exportertest.NewNopCreateSettings() -// set.Logger = zap.Must(zap.NewDevelopment()) -// exp, err := newClickhouseProfileExporter(context.Background(), &set, cfg) -// if err != nil { -// panic(err) -// } - -// t.Cleanup(func() { require.NoError(t, exp.Shutdown(context.Background())) }) - -// tests := []chtest{{ -// name: "send profile batch to clickhouse server", -// batch: , -// expected: , -// }} - -// for _, tt := range tests { -// t.Run(tt.name, func(t *testing.T) { -// assert.NoError(t, send(context.Background()), "send shouldn't have been failed") -// actual := -// assert.NoError(t, plogtest.CompareLogs(tt.expected, actual[0])) -// truncate table -// }) -// } -// } From 4097e605577c0f6f6ddde5a426a597e659f24e60 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 24 Dec 2023 13:38:01 +0200 Subject: [PATCH 34/44] clean init_db for now --- .../testdata/init_db.sh | 97 ------------------- 1 file changed, 97 deletions(-) delete mode 100644 exporter/clickhouseprofileexporter/testdata/init_db.sh diff --git a/exporter/clickhouseprofileexporter/testdata/init_db.sh b/exporter/clickhouseprofileexporter/testdata/init_db.sh deleted file mode 100644 index 4c6b691..0000000 --- a/exporter/clickhouseprofileexporter/testdata/init_db.sh +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -set -e - -clickhouse-client \ - --user "$CLICKHOUSE_USER" \ - --password "$CLICKHOUSE_PASSWORD" \ - --database "$CLICKHOUSE_DB" \ - --multiquery "CREATE TABLE IF NOT EXISTS profiles_input ( - timestamp_ns UInt64, - profile_id FixedString(16), - type LowCardinality(String), - service_name LowCardinality(String), - period_type LowCardinality(String), - period_unit LowCardinality(String), - tags Array(Tuple(String, String)), - duration_ns UInt64, - payload_type LowCardinality(String), - payload String - ) Engine=Null; - CREATE TABLE IF NOT EXISTS profiles ( - timestamp_ns UInt64 CODEC(DoubleDelta, ZSTD(1)), - fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), - type_id LowCardinality(String) CODEC(ZSTD(1)), - service_name LowCardinality(String) CODEC(ZSTD(1)), - profile_id FixedString(16) CODEC(ZSTD(1)), - duration_ns UInt64 CODEC(DoubleDelta, ZSTD(1)), - payload_type LowCardinality(String) CODEC(ZSTD(1)), - payload String CODEC(ZSTD(1)) - ) Engine MergeTree() - ORDER BY (type_id, service_name, timestamp_ns) - PARTITION BY toDate(FROM_UNIXTIME(intDiv(timestamp_ns, 1000000000))); - CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_mv TO profiles AS - SELECT - timestamp_ns, - cityHash64(arraySort(arrayConcat( - profiles_input.tags, [('__type__', concatWithSeparator(':', type, period_type, period_unit) as _type_id), ('service_name', service_name)] - )) as _tags) as fingerprint, - _type_id as type_id, - service_name, - unhex(profile_id)::FixedString(16) as profile_id, - duration_ns, - payload_type, - payload - FROM profiles_input; - CREATE TABLE IF NOT EXISTS profiles_series ( - date Date CODEC(ZSTD(1)), - type_id LowCardinality(String) CODEC(ZSTD(1)), - service_name LowCardinality(String) CODEC(ZSTD(1)), - fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), - tags Array(Tuple(String, String)) CODEC(ZSTD(1)), - ) Engine ReplacingMergeTree() - ORDER BY (date, type_id, fingerprint) - PARTITION BY date; - CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_mv TO profiles_series AS - SELECT - toDate(intDiv(timestamp_ns, 1000000000)) as date, - concatWithSeparator(':', type, period_type, period_unit) as type_id, - service_name, - cityHash64(arraySort(arrayConcat( - profiles_input.tags, [('__type__', type_id), ('service_name', service_name)] - )) as _tags) as fingerprint, - tags - FROM profiles_input; - CREATE TABLE IF NOT EXISTS profiles_series_gin ( - date Date CODEC(ZSTD(1)), - key String CODEC(ZSTD(1)), - val String CODEC(ZSTD(1)), - type_id LowCardinality(String) CODEC(ZSTD(1)), - service_name LowCardinality(String) CODEC(ZSTD(1)), - fingerprint UInt64 CODEC(DoubleDelta, ZSTD(1)), - ) Engine ReplacingMergeTree() - ORDER BY (date, key, val, type_id, fingerprint) - PARTITION BY date; - CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_gin_mv TO profiles_series_gin AS - SELECT - date, - kv.1 as key, - kv.2 as val, - type_id, - service_name, - fingerprint, - FROM profiles_series ARRAY JOIN tags as kv; - CREATE TABLE IF NOT EXISTS profiles_series_keys ( - date Date, - key String, - val String, - val_id UInt64, - ) Engine ReplacingMergeTree() - ORDER BY (date, key, val_id) - PARTITION BY date; - CREATE MATERIALIZED VIEW IF NOT EXISTS profiles_series_keys_mv TO profiles_series_keys AS - SELECT - date, - key, - val, - cityHash64(val) % 50000 as val_id - FROM profiles_series_gin" From 12f0c89aece7d4d69e1a38ceae6d60c03443a7b3 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 24 Dec 2023 14:57:29 +0200 Subject: [PATCH 35/44] fix batching --- config/example-config.yaml | 7 +++++-- .../ch/access_native_columnar.go | 11 +++++++---- exporter/clickhouseprofileexporter/exporter.go | 2 +- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/config/example-config.yaml b/config/example-config.yaml index 7d657c6..773be77 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -10,10 +10,11 @@ receivers: grpc: endpoint: 'localhost:12345' pyroscopereceiver: + processors: batch: - send_batch_size: 1000 - timeout: 5s + send_batch_size: 10000 + timeout: 30s memory_limiter: check_interval: 2s limit_mib: 1800 @@ -50,6 +51,7 @@ processors: - include: latency action: update new_name: traces_spanmetrics_latency + exporters: qryn: dsn: tcp://clickhouse-server:9000/cloki?username=qryn&password=demo @@ -75,6 +77,7 @@ exporters: endpoint: localhost:4317 tls: insecure: true + extensions: health_check: pprof: diff --git a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go index bee09f8..b551f2c 100644 --- a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go +++ b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go @@ -39,8 +39,11 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { return fmt.Errorf("failed to prepare batch: %w", err) } - rs := ls.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords() - sz := rs.Len() + // this implementation is tightly coupled to how pyroscope-java and pyroscopereciver work, + // specifically receiving a single profile at a time from the agent, + // and thus each batched resource logs slice contains a single log record + rl := ls.ResourceLogs() + sz := rl.Len() timestamp_ns := make([]uint64, sz) profile_id := make([]string, sz) @@ -59,8 +62,8 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { tmp pcommon.Value tm map[string]any ) - for i := 0; i < rs.Len(); i++ { - r = rs.At(i) + for i := 0; i < sz; i++ { + r = rl.At(i).ScopeLogs().At(0).LogRecords().At(0) m = r.Attributes() timestamp_ns[i] = uint64(r.Timestamp()) diff --git a/exporter/clickhouseprofileexporter/exporter.go b/exporter/clickhouseprofileexporter/exporter.go index 6d83da3..3f228c3 100644 --- a/exporter/clickhouseprofileexporter/exporter.go +++ b/exporter/clickhouseprofileexporter/exporter.go @@ -51,7 +51,7 @@ func (exp *clickhouseProfileExporter) send(ctx context.Context, logs plog.Logs) exp.logger.Error(msg) return err } - exp.logger.Info("inserted batch", zap.Int("size", logs.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().Len())) + exp.logger.Info("inserted batch", zap.Int("size", logs.ResourceLogs().Len())) return nil } From 5f2508ad36d3de8ead1915a6665c89cc5db67b43 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Thu, 28 Dec 2023 10:33:30 +0200 Subject: [PATCH 36/44] export cmp metrics and refactor stuff --- Makefile | 2 +- config/example-config.yaml | 10 +- .../clickhouseprofileexporter/exporter.go | 30 ++- exporter/clickhouseprofileexporter/metrics.go | 24 +++ go.mod | 4 +- receiver/pyroscopereceiver/factory.go | 7 +- .../pyroscopereceiver/jfrparser/parser.go | 2 +- receiver/pyroscopereceiver/metrics.go | 45 +++++ receiver/pyroscopereceiver/receiver.go | 179 +++++++++++------- receiver/pyroscopereceiver/receiver_test.go | 9 +- receiver/pyroscopereceiver/types/profile.go | 6 +- 11 files changed, 234 insertions(+), 84 deletions(-) create mode 100644 exporter/clickhouseprofileexporter/metrics.go create mode 100644 receiver/pyroscopereceiver/metrics.go diff --git a/Makefile b/Makefile index b3d03dc..967b8b5 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,7 @@ build: .PHONY: run run: - go run cmd/otel-collector/*.go --config ${CONFIG_FILE} + go run cmd/otel-collector/*.go --config ${CONFIG_FILE} --feature-gates=telemetry.useOtelForInternalMetrics .PHONY: fmt fmt: diff --git a/config/example-config.yaml b/config/example-config.yaml index 773be77..c7226eb 100644 --- a/config/example-config.yaml +++ b/config/example-config.yaml @@ -13,8 +13,8 @@ receivers: processors: batch: - send_batch_size: 10000 - timeout: 30s + send_batch_size: 1000 + timeout: 10s memory_limiter: check_interval: 2s limit_mib: 1800 @@ -85,9 +85,11 @@ extensions: memory_ballast: size_mib: 1000 service: - # telemetry: + telemetry: + metrics: + level: detailed # logs: - # level: "debug" + # level: debug extensions: [pprof, zpages, health_check] pipelines: logs: diff --git a/exporter/clickhouseprofileexporter/exporter.go b/exporter/clickhouseprofileexporter/exporter.go index 3f228c3..33f5df6 100644 --- a/exporter/clickhouseprofileexporter/exporter.go +++ b/exporter/clickhouseprofileexporter/exporter.go @@ -3,18 +3,27 @@ package clickhouseprofileexporter import ( "context" "fmt" + "time" "github.com/ClickHouse/clickhouse-go/v2" "github.com/metrico/otel-collector/exporter/clickhouseprofileexporter/ch" "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/pdata/plog" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" ) +const ( + errorCodeError = "1" + errorCodeSuccess = "" +) + type clickhouseProfileExporter struct { cfg *Config set *exporter.CreateSettings logger *zap.Logger + meter metric.Meter ch clickhouseAccess } @@ -36,25 +45,38 @@ func newClickhouseProfileExporter(ctx context.Context, set *exporter.CreateSetti if err != nil { return nil, fmt.Errorf("failed to init native ch storage: %w", err) } - return &clickhouseProfileExporter{ + exp := &clickhouseProfileExporter{ cfg: cfg, set: set, logger: set.Logger, + meter: set.MeterProvider.Meter(typeStr), ch: ch, - }, nil + } + if err := initMetrics(exp.meter); err != nil { + exp.logger.Error(fmt.Sprintf("failed to init metrics: %s", err.Error())) + return exp, err + } + return exp, nil } // Sends the profiles to clickhouse server using the configured connection func (exp *clickhouseProfileExporter) send(ctx context.Context, logs plog.Logs) error { + start := time.Now().UnixMilli() if err := exp.ch.InsertBatch(logs); err != nil { - msg := fmt.Sprintf("failed to insert batch: [%s]", err.Error()) - exp.logger.Error(msg) + otelcolExporterClickhouseProfileFlushTimeMillis.Record(ctx, time.Now().UnixMilli()-start, metric.WithAttributeSet(*newOtelcolAttrSetBatch(errorCodeError))) + exp.logger.Error(fmt.Sprintf("failed to insert batch: [%s]", err.Error())) return err } + otelcolExporterClickhouseProfileFlushTimeMillis.Record(ctx, time.Now().UnixMilli()-start, metric.WithAttributeSet(*newOtelcolAttrSetBatch(errorCodeSuccess))) exp.logger.Info("inserted batch", zap.Int("size", logs.ResourceLogs().Len())) return nil } +func newOtelcolAttrSetBatch(errorCode string) *attribute.Set { + s := attribute.NewSet(attribute.KeyValue{Key: "error_code", Value: attribute.StringValue(errorCode)}) + return &s +} + // Shuts down the exporter, by shutting down the ch connection pull func (exp *clickhouseProfileExporter) Shutdown(ctx context.Context) error { if err := exp.ch.Shutdown(); err != nil { diff --git a/exporter/clickhouseprofileexporter/metrics.go b/exporter/clickhouseprofileexporter/metrics.go new file mode 100644 index 0000000..37bb392 --- /dev/null +++ b/exporter/clickhouseprofileexporter/metrics.go @@ -0,0 +1,24 @@ +package clickhouseprofileexporter + +import ( + "fmt" + + "go.opentelemetry.io/otel/metric" +) + +const prefix = "exporter_clickhouse_profile_" + +var ( + otelcolExporterClickhouseProfileFlushTimeMillis metric.Int64Histogram +) + +func initMetrics(meter metric.Meter) error { + var err error + if otelcolExporterClickhouseProfileFlushTimeMillis, err = meter.Int64Histogram( + fmt.Sprint(prefix, "flush_time_millis"), + metric.WithDescription("Clickhouse profile exporter flush time in millis"), + ); err != nil { + return err + } + return nil +} diff --git a/go.mod b/go.mod index 4e1bc99..452ff3c 100644 --- a/go.mod +++ b/go.mod @@ -539,7 +539,7 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.20.0 // indirect go.opentelemetry.io/contrib/zpages v0.45.0 // indirect - go.opentelemetry.io/otel v1.20.0 // indirect + go.opentelemetry.io/otel v1.20.0 go.opentelemetry.io/otel/bridge/opencensus v0.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.43.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v0.43.0 // indirect @@ -549,7 +549,7 @@ require ( go.opentelemetry.io/otel/exporters/prometheus v0.43.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.43.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.20.0 // indirect - go.opentelemetry.io/otel/metric v1.20.0 // indirect + go.opentelemetry.io/otel/metric v1.20.0 go.opentelemetry.io/otel/schema v0.0.7 // indirect go.opentelemetry.io/otel/sdk v1.20.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.20.0 // indirect diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index bb5ac42..20d3e63 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -31,8 +31,11 @@ func createLogsReceiver(_ context.Context, set receiver.CreateSettings, cfg comp if nil == consumer { return nil, component.ErrNilNextConsumer } - - return newPyroscopeReceiver(cfg.(*Config), consumer, &set), nil + recv, err := newPyroscopeReceiver(cfg.(*Config), consumer, &set) + if err != nil { + return nil, err + } + return recv, nil } // Creates a factory for the pyroscope receiver. diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index 1c63f0e..ceb0469 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -198,7 +198,7 @@ func (pa *jfrPprofParser) addProfile(sampleType sampleType) *profileWrapper { pw := &profileWrapper{ prof: profile_types.ProfileIR{ Type: typetab[sampleType], - PayloadType: profile_types.PayloadTypePprof, + PayloadType: profile_types.Pprof, }, pprof: &pprof_proto.Profile{}, } diff --git a/receiver/pyroscopereceiver/metrics.go b/receiver/pyroscopereceiver/metrics.go new file mode 100644 index 0000000..2637dfd --- /dev/null +++ b/receiver/pyroscopereceiver/metrics.go @@ -0,0 +1,45 @@ +package pyroscopereceiver + +import ( + "fmt" + + "go.opentelemetry.io/otel/metric" +) + +const prefix = "receiver_pyroscope_" + +var ( + otelcolReceiverPyroscopeHttpRequestTotal metric.Int64Counter + otelcolReceiverPyroscopeReceivedPayloadSizeBytes metric.Int64Histogram + otelcolReceiverPyroscopeParsedPayloadSizeBytes metric.Int64Histogram + otelcolReceiverPyroscopeHttpResponseTimeMillis metric.Int64Histogram +) + +func initMetrics(meter metric.Meter) error { + var err error + if otelcolReceiverPyroscopeHttpRequestTotal, err = meter.Int64Counter( + fmt.Sprint(prefix, "http_request_total"), + metric.WithDescription("Pyroscope receiver http request count"), + ); err != nil { + return err + } + if otelcolReceiverPyroscopeReceivedPayloadSizeBytes, err = meter.Int64Histogram( + fmt.Sprint(prefix, "received_payload_size_bytes"), + metric.WithDescription("Pyroscope receiver received payload size in bytes"), + ); err != nil { + return err + } + if otelcolReceiverPyroscopeParsedPayloadSizeBytes, err = meter.Int64Histogram( + fmt.Sprint(prefix, "parsed_payload_size_bytes"), + metric.WithDescription("Pyroscope receiver parsed payload size in bytes"), + ); err != nil { + return err + } + if otelcolReceiverPyroscopeHttpResponseTimeMillis, err = meter.Int64Histogram( + fmt.Sprint(prefix, "http_response_time_millis"), + metric.WithDescription("Pyroscope receiver http response time in millis"), + ); err != nil { + return err + } + return nil +} diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index d88f3d7..1346e2d 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -12,6 +12,7 @@ import ( "strconv" "strings" "sync" + "time" "github.com/metrico/otel-collector/receiver/pyroscopereceiver/compress" "github.com/metrico/otel-collector/receiver/pyroscopereceiver/jfrparser" @@ -22,19 +23,33 @@ import ( "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" "go.uber.org/zap" ) const ( ingestPath = "/ingest" - formatJfr = "jfr" + + formatJfr = "jfr" + formatPprof = "pprof" + + errorCodeError = "1" + errorCodeSuccess = "" + + keyService = "service" + keyStart ctxkey = "start_time" ) +// avoids context key collision, need public getter/setter because should be propagated to other packages +type ctxkey string + type pyroscopeReceiver struct { cfg *Config - next consumer.Logs set *receiver.CreateSettings logger *zap.Logger + meter metric.Meter + next consumer.Logs host component.Host httpMux *http.ServeMux @@ -48,29 +63,88 @@ type parser interface { Parse(buf *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) ([]profile_types.ProfileIR, error) } -type attrs struct { +type params struct { start uint64 end uint64 name string labels labels.Labels } -func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.CreateSettings) *pyroscopeReceiver { +// Extracts start time from context +func StartTimeFromContext(ctx context.Context) int64 { + return ctx.Value(keyStart).(int64) +} + +// Creates new context with start time +func ContextWithStart(ctx context.Context, start int64) context.Context { + return context.WithValue(ctx, keyStart, start) +} + +func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.CreateSettings) (*pyroscopeReceiver, error) { recv := &pyroscopeReceiver{ cfg: cfg, - next: consumer, set: set, logger: set.Logger, + meter: set.MeterProvider.Meter(typeStr), + next: consumer, } recv.decompressor = compress.NewDecompressor(recv.cfg.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { handleIngest(resp, req, recv) }) - return recv + if err := initMetrics(recv.meter); err != nil { + recv.logger.Error(fmt.Sprintf("failed to init metrics: %s", err.Error())) + return recv, err + } + return recv, nil +} + +func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { + ctx := ContextWithStart(req.Context(), time.Now().UnixMilli()) + + qs := req.URL.Query() + params, err := readParams(&qs) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusBadRequest, "bad url query", "", errorCodeError, recv) + return + } + + if req.Method != http.MethodPost { + handleError(ctx, resp, "text/plain", http.StatusMethodNotAllowed, fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost), params.name, errorCodeError, recv) + return + } + + logs, err := parse(ctx, req, params, recv) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), params.name, errorCodeError, recv) + return + } + + // delegate to next consumer in the pipeline + // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver + err = recv.next.ConsumeLogs(ctx, logs) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusInternalServerError, err.Error(), params.name, errorCodeError, recv) + return + } + otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(params.name, errorCodeSuccess))) + otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-StartTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(params.name, errorCodeSuccess))) +} + +func handleError(ctx context.Context, resp http.ResponseWriter, contentType string, statusCode int, msg string, service string, errorCode string, recv *pyroscopeReceiver) { + otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) + otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-StartTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) + recv.logger.Error(msg) + writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) +} + +func newOtelcolAttrSetHttp(service string, errorCode string) *attribute.Set { + s := attribute.NewSet(attribute.KeyValue{Key: keyService, Value: attribute.StringValue(service)}, attribute.KeyValue{Key: "error_code", Value: attribute.StringValue(errorCode)}) + return &s } -func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { +func parse(ctx context.Context, req *http.Request, pm params, recv *pyroscopeReceiver) (plog.Logs, error) { var ( tmp []string ok bool @@ -78,18 +152,13 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { ) logs := plog.NewLogs() - params := req.URL.Query() - if tmp, ok = params["format"]; ok && tmp[0] == "jfr" { + qs := req.URL.Query() + if tmp, ok = qs["format"]; ok && tmp[0] == "jfr" { pa = jfrparser.NewJfrPprofParser() } else { return logs, fmt.Errorf("unsupported format, supported: [jfr]") } - att, err := getAttrsFromParams(¶ms) - if err != nil { - return logs, err - } - // support only multipart/form-data f, err := recv.openMultipartJfr(req) if err != nil { @@ -101,10 +170,12 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { if err != nil { return logs, fmt.Errorf("failed to decompress body: %w", err) } + // TODO: try measure compressed size + otelcolReceiverPyroscopeReceivedPayloadSizeBytes.Record(ctx, int64(buf.Len()), metric.WithAttributeSet(*newOtelcolAttrSetPayloadSizeBytes(pm.name, formatJfr, ""))) resetHeaders(req) md := profile_types.Metadata{SampleRateHertz: 0} - tmp, ok = params["sampleRate"] + tmp, ok = qs["sampleRate"] if ok { hz, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { @@ -118,20 +189,23 @@ func parse(req *http.Request, recv *pyroscopeReceiver) (plog.Logs, error) { return logs, fmt.Errorf("failed to parse pprof: %w", err) } + sz := 0 rs := logs.ResourceLogs().AppendEmpty().ScopeLogs().AppendEmpty().LogRecords() for _, pr := range ps { r := rs.AppendEmpty() - r.SetTimestamp(pcommon.Timestamp(ns(att.start))) + r.SetTimestamp(pcommon.Timestamp(ns(pm.start))) m := r.Attributes() - m.PutStr("duration_ns", fmt.Sprint(ns(att.end-att.start))) - m.PutStr("service_name", att.name) + m.PutStr("duration_ns", fmt.Sprint(ns(pm.end-pm.start))) + m.PutStr("service_name", pm.name) tm := m.PutEmptyMap("tags") - for _, l := range att.labels { + for _, l := range pm.labels { tm.PutStr(l.Name, l.Value) } setAttrsFromProfile(pr, m) r.Body().SetEmptyBytes().FromRaw(pr.Payload.Bytes()) + sz += pr.Payload.Len() } + otelcolReceiverPyroscopeParsedPayloadSizeBytes.Record(ctx, int64(sz), metric.WithAttributeSet(*newOtelcolAttrSetPayloadSizeBytes(pm.name, formatPprof, ""))) return logs, nil } @@ -139,6 +213,11 @@ func ns(sec uint64) uint64 { return sec * 1e9 } +func newOtelcolAttrSetPayloadSizeBytes(service string, typ string, encoding string) *attribute.Set { + s := attribute.NewSet(attribute.KeyValue{Key: keyService, Value: attribute.StringValue(service)}, attribute.KeyValue{Key: "type", Value: attribute.StringValue(typ)}, attribute.KeyValue{Key: "encoding", Value: attribute.StringValue(encoding)}) + return &s +} + func (recv *pyroscopeReceiver) openMultipartJfr(req *http.Request) (multipart.File, error) { if err := req.ParseMultipartForm(recv.cfg.Protocols.Http.MaxRequestBodySize); err != nil { return nil, fmt.Errorf("failed to parse multipart request: %w", err) @@ -172,25 +251,25 @@ func resetHeaders(req *http.Request) { req.ContentLength = -1 } -func getAttrsFromParams(params *url.Values) (attrs, error) { +func readParams(qs *url.Values) (params, error) { var ( tmp []string ok bool - pv = *params - att attrs = attrs{} + qsv = *qs + p params = params{} ) - if tmp, ok = pv["from"]; !ok { - return att, fmt.Errorf("required start time is missing") + if tmp, ok = qsv["from"]; !ok { + return p, fmt.Errorf("required start time is missing") } start, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return att, fmt.Errorf("failed to parse start time: %w", err) + return p, fmt.Errorf("failed to parse start time: %w", err) } - att.start = start + p.start = start - if tmp, ok = pv["name"]; !ok { - return att, fmt.Errorf("required labels are missing") + if tmp, ok = qsv["name"]; !ok { + return p, fmt.Errorf("required labels are missing") } i := strings.Index(tmp[0], "{") length := len(tmp[0]) @@ -203,25 +282,25 @@ func getAttrsFromParams(params *url.Values) (attrs, error) { words := strings.FieldsFunc(promqllike, func(r rune) bool { return r == '=' || r == ',' }) sz := len(words) if sz == 0 || sz%2 != 0 { - return att, fmt.Errorf("failed to compile labels") + return p, fmt.Errorf("failed to compile labels") } for j := 0; j < len(words); j += 2 { - att.labels = append(att.labels, labels.Label{Name: words[j], Value: words[j+1]}) + p.labels = append(p.labels, labels.Label{Name: words[j], Value: words[j+1]}) } } } // required app name - att.name = tmp[0][:i] + p.name = tmp[0][:i] - if tmp, ok = pv["until"]; !ok { - return att, fmt.Errorf("required end time is missing") + if tmp, ok = qsv["until"]; !ok { + return p, fmt.Errorf("required end time is missing") } end, err := strconv.ParseUint(tmp[0], 10, 64) if err != nil { - return att, fmt.Errorf("failed to parse end time: %w", err) + return p, fmt.Errorf("failed to parse end time: %w", err) } - att.end = end - return att, nil + p.end = end + return p, nil } func setAttrsFromProfile(prof profile_types.ProfileIR, m pcommon.Map) { @@ -231,34 +310,6 @@ func setAttrsFromProfile(prof profile_types.ProfileIR, m pcommon.Map) { m.PutStr("payload_type", fmt.Sprint(prof.PayloadType)) } -func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { - if req.Method != http.MethodPost { - msg := fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost) - recv.logger.Error(msg) - writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) - return - } - - ctx := req.Context() - logs, err := parse(req, recv) - if err != nil { - msg := err.Error() - recv.logger.Error(msg) - writeResponse(resp, "text/plain", http.StatusBadRequest, []byte(msg)) - return - } - - // delegate to next consumer in the pipeline - // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver - err = recv.next.ConsumeLogs(ctx, logs) - if err != nil { - msg := err.Error() - recv.logger.Error(msg) - writeResponse(resp, "text/plain", http.StatusInternalServerError, []byte(msg)) - return - } -} - // Starts a http server that receives profiles of supported protocols func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) error { recv.host = host diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/receiver_test.go index 53a0468..7aeb7a5 100644 --- a/receiver/pyroscopereceiver/receiver_test.go +++ b/receiver/pyroscopereceiver/receiver_test.go @@ -67,7 +67,8 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { sink := new(consumertest.LogsSink) set := receivertest.NewNopCreateSettings() set.Logger = zap.Must(zap.NewDevelopment()) - recv := newPyroscopeReceiver(cfg, sink, &set) + recv, err := newPyroscopeReceiver(cfg, sink, &set) + require.NoError(t, err) require.NoError(t, recv.Start(context.Background(), componenttest.NewNopHost())) t.Cleanup(func() { require.NoError(t, recv.Shutdown(context.Background())) }) @@ -133,7 +134,7 @@ func TestPyroscopeIngestJfrCpu(t *testing.T) { }, jfr: filepath.Join("testdata", "cortex-dev-01__kafka-0__cpu__0.jfr"), expected: gen([]profileLog{{ - timestamp: 1700332322, + timestamp: 1700332322000000000, attrs: map[string]any{ "service_name": "com.example.App", "tags": map[string]any{ @@ -168,7 +169,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { }, jfr: filepath.Join("testdata", "memory_alloc_live_example.jfr"), expected: gen([]profileLog{{ - timestamp: 1700332322, + timestamp: 1700332322000000000, attrs: map[string]any{ "service_name": "com.example.App", "tags": map[string]any{ @@ -184,7 +185,7 @@ func TestPyroscopeIngestJfrMemory(t *testing.T) { body: pbAllocInNewTlab, }, { - timestamp: 1700332322, + timestamp: 1700332322000000000, attrs: map[string]any{ "service_name": "com.example.App", "tags": map[string]any{ diff --git a/receiver/pyroscopereceiver/types/profile.go b/receiver/pyroscopereceiver/types/profile.go index bb2628c..0e38ce3 100644 --- a/receiver/pyroscopereceiver/types/profile.go +++ b/receiver/pyroscopereceiver/types/profile.go @@ -5,8 +5,10 @@ import ( ) // Enumeration of low-level payload type that are supported by the pipeline +type PayloadType uint8 + const ( - PayloadTypePprof = 0 + Pprof PayloadType = iota ) // Auxiliary profile metadata @@ -27,5 +29,5 @@ type ProfileType struct { type ProfileIR struct { Type ProfileType Payload *bytes.Buffer - PayloadType uint32 + PayloadType PayloadType } From cf57864ec5d51929e154f3ff61d49c07be04fedc Mon Sep 17 00:00:00 2001 From: tomershafir Date: Thu, 28 Dec 2023 13:53:54 +0200 Subject: [PATCH 37/44] compress io.Reader not io.ReadCloser --- receiver/pyroscopereceiver/compress/compress.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index db56e41..84e2cb6 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -16,15 +16,15 @@ const ( // Decodes compressed streams type Decompressor struct { maxDecompressedSizeBytes int64 - decoders map[codec]func(body io.ReadCloser) (io.ReadCloser, error) + decoders map[codec]func(body io.Reader) (io.Reader, error) } // Creates a new decompressor func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { return &Decompressor{ maxDecompressedSizeBytes: maxDecompressedSizeBytes, - decoders: map[codec]func(r io.ReadCloser) (io.ReadCloser, error){ - Gzip: func(r io.ReadCloser) (io.ReadCloser, error) { + decoders: map[codec]func(r io.Reader) (io.Reader, error){ + Gzip: func(r io.Reader) (io.Reader, error) { gr, err := gzip.NewReader(r) if err != nil { return nil, err @@ -35,7 +35,7 @@ func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { } } -func (d *Decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { +func (d *Decompressor) readBytes(r io.Reader) (*bytes.Buffer, error) { buf := PrepareBuffer(d.maxDecompressedSizeBytes) // read max+1 to validate size via a single Read() @@ -55,7 +55,7 @@ func (d *Decompressor) readBytes(r io.ReadCloser) (*bytes.Buffer, error) { } // Decodes the accepted reader, applying the configured size limit to avoid oom by compression bomb -func (d *Decompressor) Decompress(r io.ReadCloser, c codec) (*bytes.Buffer, error) { +func (d *Decompressor) Decompress(r io.Reader, c codec) (*bytes.Buffer, error) { decoder, ok := d.decoders[c] if !ok { return nil, fmt.Errorf("unsupported encoding") From 7f0c2b98ef66b4d69d19c57d9d13ececff613cae Mon Sep 17 00:00:00 2001 From: tomershafir Date: Thu, 28 Dec 2023 15:05:09 +0200 Subject: [PATCH 38/44] add buff pre-alloc cfg opt --- .../pyroscopereceiver/compress/compress.go | 25 ++++++++----------- receiver/pyroscopereceiver/config.go | 10 ++++++++ receiver/pyroscopereceiver/factory.go | 6 +++-- receiver/pyroscopereceiver/receiver.go | 2 +- receiver/pyroscopereceiver/receiver_test.go | 1 + 5 files changed, 26 insertions(+), 18 deletions(-) diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index 84e2cb6..16c00e3 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -15,14 +15,16 @@ const ( // Decodes compressed streams type Decompressor struct { - maxDecompressedSizeBytes int64 - decoders map[codec]func(body io.Reader) (io.Reader, error) + decompressedSizeBytesExpectedValue int64 + maxDecompressedSizeBytes int64 + decoders map[codec]func(body io.Reader) (io.Reader, error) } // Creates a new decompressor -func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { +func NewDecompressor(decompressedSizeBytesExpectedValue int64, maxDecompressedSizeBytes int64) *Decompressor { return &Decompressor{ - maxDecompressedSizeBytes: maxDecompressedSizeBytes, + decompressedSizeBytesExpectedValue: decompressedSizeBytesExpectedValue, + maxDecompressedSizeBytes: maxDecompressedSizeBytes, decoders: map[codec]func(r io.Reader) (io.Reader, error){ Gzip: func(r io.Reader) (io.Reader, error) { gr, err := gzip.NewReader(r) @@ -36,7 +38,7 @@ func NewDecompressor(maxDecompressedSizeBytes int64) *Decompressor { } func (d *Decompressor) readBytes(r io.Reader) (*bytes.Buffer, error) { - buf := PrepareBuffer(d.maxDecompressedSizeBytes) + buf := d.prepareBuffer() // read max+1 to validate size via a single Read() lr := io.LimitReader(r, d.maxDecompressedSizeBytes+1) @@ -70,16 +72,9 @@ func (d *Decompressor) Decompress(r io.Reader, c codec) (*bytes.Buffer, error) { } // Pre-allocates a buffer based on heuristics to minimize resize -func PrepareBuffer(maxDecompressedSizeBytes int64) *bytes.Buffer { - var ( - buf bytes.Buffer - expectedMinDataSizeBytes int64 = 10e3 - ) - - if maxDecompressedSizeBytes < expectedMinDataSizeBytes { - expectedMinDataSizeBytes = maxDecompressedSizeBytes - } +func (d *Decompressor) prepareBuffer() *bytes.Buffer { + var buf bytes.Buffer // extra space to try avoid realloc where expected size fits enough - buf.Grow(int(expectedMinDataSizeBytes) + bytes.MinRead) + buf.Grow(int(d.decompressedSizeBytesExpectedValue) + bytes.MinRead) return &buf } diff --git a/receiver/pyroscopereceiver/config.go b/receiver/pyroscopereceiver/config.go index f0130bf..b3e8778 100644 --- a/receiver/pyroscopereceiver/config.go +++ b/receiver/pyroscopereceiver/config.go @@ -9,12 +9,16 @@ import ( // Configures supported protocols type Protocols struct { + // Http.MaxRequestBodySize configures max decompressed body size in bytes Http *confighttp.HTTPServerSettings `mapstructure:"http"` } // Represents the receiver config within the collector's config.yaml type Config struct { Protocols Protocols `mapstructure:"protocols"` + + // Configures expected decompressed request body size in bytes to optimize pipeline allocations + DecompressedRequestBodySizeBytesExpectedValue int64 `mapstructure:"request_body_size_expected_value"` } var _ component.Config = (*Config)(nil) @@ -24,5 +28,11 @@ func (cfg *Config) Validate() error { if cfg.Protocols.Http.MaxRequestBodySize < 1 { return fmt.Errorf("max_request_body_size must be positive") } + if cfg.DecompressedRequestBodySizeBytesExpectedValue < 1 { + return fmt.Errorf("request_body_size_expected_value must be positive") + } + if cfg.DecompressedRequestBodySizeBytesExpectedValue > cfg.Protocols.Http.MaxRequestBodySize { + return fmt.Errorf("expected value cannot be greater than max") + } return nil } diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index 20d3e63..7258051 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -12,8 +12,9 @@ import ( const ( typeStr = "pyroscopereceiver" - defaultHttpAddr = "0.0.0.0:8062" - defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata + defaultHttpAddr = "0.0.0.0:8062" + defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata + defaultDecompressedRequestBodySizeBytesExpectedValue = 50e4 + 1e6 // reserve for metadata ) func createDefaultConfig() component.Config { @@ -24,6 +25,7 @@ func createDefaultConfig() component.Config { MaxRequestBodySize: defaultMaxRequestBodySize, }, }, + DecompressedRequestBodySizeBytesExpectedValue: defaultDecompressedRequestBodySizeBytesExpectedValue, } } diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 1346e2d..fccbce6 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -88,7 +88,7 @@ func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.Cre meter: set.MeterProvider.Meter(typeStr), next: consumer, } - recv.decompressor = compress.NewDecompressor(recv.cfg.Protocols.Http.MaxRequestBodySize) + recv.decompressor = compress.NewDecompressor(recv.cfg.DecompressedRequestBodySizeBytesExpectedValue, recv.cfg.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { handleIngest(resp, req, recv) diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/receiver_test.go index 7aeb7a5..4056dfa 100644 --- a/receiver/pyroscopereceiver/receiver_test.go +++ b/receiver/pyroscopereceiver/receiver_test.go @@ -63,6 +63,7 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { MaxRequestBodySize: defaultMaxRequestBodySize, }, }, + DecompressedRequestBodySizeBytesExpectedValue: defaultDecompressedRequestBodySizeBytesExpectedValue, } sink := new(consumertest.LogsSink) set := receivertest.NewNopCreateSettings() From a76da47fa06f997511022e33a1f52b6f142fa3f9 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sat, 30 Dec 2023 15:37:19 +0200 Subject: [PATCH 39/44] add timeout --- .../clickhouseprofileexporter/exporter.go | 1 + .../pyroscopereceiver/compress/compress.go | 1 + receiver/pyroscopereceiver/config.go | 8 +- receiver/pyroscopereceiver/factory.go | 5 +- .../pyroscopereceiver/jfrparser/parser.go | 5 +- receiver/pyroscopereceiver/receiver.go | 198 ++++++++++-------- receiver/pyroscopereceiver/receiver_test.go | 1 + 7 files changed, 125 insertions(+), 94 deletions(-) diff --git a/exporter/clickhouseprofileexporter/exporter.go b/exporter/clickhouseprofileexporter/exporter.go index 33f5df6..f458842 100644 --- a/exporter/clickhouseprofileexporter/exporter.go +++ b/exporter/clickhouseprofileexporter/exporter.go @@ -36,6 +36,7 @@ type clickhouseAccess interface { Shutdown() error } +// TODO: batch like this https://github.com/open-telemetry/opentelemetry-collector/issues/8122 func newClickhouseProfileExporter(ctx context.Context, set *exporter.CreateSettings, cfg *Config) (*clickhouseProfileExporter, error) { opts, err := clickhouse.ParseDSN(cfg.Dsn) if err != nil { diff --git a/receiver/pyroscopereceiver/compress/compress.go b/receiver/pyroscopereceiver/compress/compress.go index 16c00e3..1f9594c 100644 --- a/receiver/pyroscopereceiver/compress/compress.go +++ b/receiver/pyroscopereceiver/compress/compress.go @@ -75,6 +75,7 @@ func (d *Decompressor) Decompress(r io.Reader, c codec) (*bytes.Buffer, error) { func (d *Decompressor) prepareBuffer() *bytes.Buffer { var buf bytes.Buffer // extra space to try avoid realloc where expected size fits enough + // TODO: try simple statistical model to pre-allocate a buffer buf.Grow(int(d.decompressedSizeBytesExpectedValue) + bytes.MinRead) return &buf } diff --git a/receiver/pyroscopereceiver/config.go b/receiver/pyroscopereceiver/config.go index b3e8778..7025a35 100644 --- a/receiver/pyroscopereceiver/config.go +++ b/receiver/pyroscopereceiver/config.go @@ -2,6 +2,7 @@ package pyroscopereceiver import ( "fmt" + "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" @@ -17,7 +18,9 @@ type Protocols struct { type Config struct { Protocols Protocols `mapstructure:"protocols"` - // Configures expected decompressed request body size in bytes to optimize pipeline allocations + // Cofigures timeout for synchronous request handling by the receiver server + Timeout time.Duration `mapstructure:"timeout"` + // Configures expected decompressed request body size in bytes to size pipeline buffers DecompressedRequestBodySizeBytesExpectedValue int64 `mapstructure:"request_body_size_expected_value"` } @@ -25,6 +28,9 @@ var _ component.Config = (*Config)(nil) // Checks that the receiver configuration is valid func (cfg *Config) Validate() error { + if cfg.Timeout <= 0 { + return fmt.Errorf("timeout must be positive") + } if cfg.Protocols.Http.MaxRequestBodySize < 1 { return fmt.Errorf("max_request_body_size must be positive") } diff --git a/receiver/pyroscopereceiver/factory.go b/receiver/pyroscopereceiver/factory.go index 7258051..a2f482f 100644 --- a/receiver/pyroscopereceiver/factory.go +++ b/receiver/pyroscopereceiver/factory.go @@ -2,6 +2,7 @@ package pyroscopereceiver import ( "context" + "time" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" @@ -13,7 +14,8 @@ const ( typeStr = "pyroscopereceiver" defaultHttpAddr = "0.0.0.0:8062" - defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata + defaultMaxRequestBodySize = 5e6 + 1e6 // reserve for metadata + defaultTimeout = 10 * time.Second defaultDecompressedRequestBodySizeBytesExpectedValue = 50e4 + 1e6 // reserve for metadata ) @@ -25,6 +27,7 @@ func createDefaultConfig() component.Config { MaxRequestBodySize: defaultMaxRequestBodySize, }, }, + Timeout: defaultTimeout, DecompressedRequestBodySizeBytesExpectedValue: defaultDecompressedRequestBodySizeBytesExpectedValue, } } diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index ceb0469..471740b 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -85,7 +85,7 @@ func (pa *jfrPprofParser) Parse(jfr *bytes.Buffer, md profile_types.Metadata, ma if ts != nil && ts.Name == "STATE_RUNNABLE" { pa.addStacktrace(sampleTypeCpu, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } - // TODO: this code is from github/grafana/pyroscope, need to validate that the query simulator handles this branch as expected for wall + // TODO: this code is from github/grafana/pyroscope, need to validate that the qryn.js query simulator handles this branch as expected for wall if event == "wall" { pa.addStacktrace(sampleTypeWall, pa.jfrParser.ExecutionSample.StackTrace, values[:1]) } @@ -114,7 +114,7 @@ func (pa *jfrPprofParser) Parse(jfr *bytes.Buffer, md profile_types.Metadata, ma for _, pr := range pa.proftab { if nil != pr { // assuming jfr-pprof conversion should not expand memory footprint, transitively applying jfr limit on pprof - pr.prof.Payload = &bytes.Buffer{} // TODO: consider pre-allocate a buffer sized relatively to jfr, consider event distribution for example low probability live event as part of alloc profile, something better than: compress.PrepareBuffer(pa.maxDecompressedSizeBytes) + pr.prof.Payload = &bytes.Buffer{} // TODO: try simple statistical model to pre-allocate a buffer pr.pprof.WriteUncompressed(pr.prof.Payload) ps = append(ps, pr.prof) } @@ -124,6 +124,7 @@ func (pa *jfrPprofParser) Parse(jfr *bytes.Buffer, md profile_types.Metadata, ma func nopSymbolProcessor(ref *jfr_types.SymbolList) {} +// TODO: hash location lists, merge-sort similar samples and free unused pprof objects func (pa *jfrPprofParser) addStacktrace(sampleType sampleType, ref jfr_types.StackTraceRef, values []int64) { pr := pa.getProfile(sampleType) if nil == pr { diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index fccbce6..96dc508 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -70,16 +70,6 @@ type params struct { labels labels.Labels } -// Extracts start time from context -func StartTimeFromContext(ctx context.Context) int64 { - return ctx.Value(keyStart).(int64) -} - -// Creates new context with start time -func ContextWithStart(ctx context.Context, start int64) context.Context { - return context.WithValue(ctx, keyStart, start) -} - func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.CreateSettings) (*pyroscopeReceiver, error) { recv := &pyroscopeReceiver{ cfg: cfg, @@ -91,7 +81,7 @@ func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.Cre recv.decompressor = compress.NewDecompressor(recv.cfg.DecompressedRequestBodySizeBytesExpectedValue, recv.cfg.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { - handleIngest(resp, req, recv) + httpHandlerIngest(resp, req, recv) }) if err := initMetrics(recv.meter); err != nil { recv.logger.Error(fmt.Sprintf("failed to init metrics: %s", err.Error())) @@ -100,51 +90,132 @@ func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.Cre return recv, nil } -func handleIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { - ctx := ContextWithStart(req.Context(), time.Now().UnixMilli()) +// TODO: rate limit clients +func httpHandlerIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { + ctx, cancel := context.WithTimeout(contextWithStart(req.Context(), time.Now().UnixMilli()), recv.cfg.Timeout) + defer cancel() - qs := req.URL.Query() - params, err := readParams(&qs) - if err != nil { - handleError(ctx, resp, "text/plain", http.StatusBadRequest, "bad url query", "", errorCodeError, recv) - return - } + // all compute should be bounded by timeout, so dont add compute here - if req.Method != http.MethodPost { - handleError(ctx, resp, "text/plain", http.StatusMethodNotAllowed, fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost), params.name, errorCodeError, recv) + select { + case <-ctx.Done(): + handleError(ctx, resp, "text/plain", http.StatusRequestTimeout, fmt.Sprintf("receiver timeout elapsed: %s", recv.cfg.Timeout), "", errorCodeError, recv) return + case <-handle(ctx, resp, req, recv): } +} - logs, err := parse(ctx, req, params, recv) - if err != nil { - handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), params.name, errorCodeError, recv) - return - } +func startTimeFromContext(ctx context.Context) int64 { + return ctx.Value(keyStart).(int64) +} - // delegate to next consumer in the pipeline - // TODO: support memorylimiter processor, apply retry policy on "oom", and consider to shift right allocs from the receiver - err = recv.next.ConsumeLogs(ctx, logs) - if err != nil { - handleError(ctx, resp, "text/plain", http.StatusInternalServerError, err.Error(), params.name, errorCodeError, recv) - return - } - otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(params.name, errorCodeSuccess))) - otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-StartTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(params.name, errorCodeSuccess))) +func contextWithStart(ctx context.Context, start int64) context.Context { + return context.WithValue(ctx, keyStart, start) +} + +func handle(ctx context.Context, resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) <-chan struct{} { + c := make(chan struct{}) + go func() { + // signal completion event + defer func() { c <- struct{}{} }() + + qs := req.URL.Query() + pm, err := readParams(&qs) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusBadRequest, "bad url query", "", errorCodeError, recv) + return + } + + if req.Method != http.MethodPost { + handleError(ctx, resp, "text/plain", http.StatusMethodNotAllowed, fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost), pm.name, errorCodeError, recv) + return + } + + pl, err := readProfiles(ctx, req, pm, recv) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), pm.name, errorCodeError, recv) + return + } + + // delegate to next consumer in the pipeline + // TODO: support memorylimiter processor, apply retry policy on "oom" event, depends on https://github.com/open-telemetry/opentelemetry-collector/issues/9196 + err = recv.next.ConsumeLogs(ctx, pl) + if err != nil { + handleError(ctx, resp, "text/plain", http.StatusInternalServerError, err.Error(), pm.name, errorCodeError, recv) + return + } + + otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(pm.name, errorCodeSuccess))) + otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-startTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(pm.name, errorCodeSuccess))) + }() + return c } func handleError(ctx context.Context, resp http.ResponseWriter, contentType string, statusCode int, msg string, service string, errorCode string, recv *pyroscopeReceiver) { otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) - otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-StartTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) + otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-startTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) recv.logger.Error(msg) writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) } +func readParams(qs *url.Values) (params, error) { + var ( + tmp []string + ok bool + qsv = *qs + p params = params{} + ) + + if tmp, ok = qsv["from"]; !ok { + return p, fmt.Errorf("required start time is missing") + } + start, err := strconv.ParseUint(tmp[0], 10, 64) + if err != nil { + return p, fmt.Errorf("failed to parse start time: %w", err) + } + p.start = start + + if tmp, ok = qsv["name"]; !ok { + return p, fmt.Errorf("required labels are missing") + } + i := strings.Index(tmp[0], "{") + length := len(tmp[0]) + if i < 0 { + i = length + } else { // optional labels + // TODO: improve this stupid {k=v(,k=v)*} compiler, checkout pyroscope's implementation + promqllike := tmp[0][i+1 : length-1] // stripe {} + if len(promqllike) > 0 { + words := strings.FieldsFunc(promqllike, func(r rune) bool { return r == '=' || r == ',' }) + sz := len(words) + if sz == 0 || sz%2 != 0 { + return p, fmt.Errorf("failed to compile labels") + } + for j := 0; j < len(words); j += 2 { + p.labels = append(p.labels, labels.Label{Name: words[j], Value: words[j+1]}) + } + } + } + // required app name + p.name = tmp[0][:i] + + if tmp, ok = qsv["until"]; !ok { + return p, fmt.Errorf("required end time is missing") + } + end, err := strconv.ParseUint(tmp[0], 10, 64) + if err != nil { + return p, fmt.Errorf("failed to parse end time: %w", err) + } + p.end = end + return p, nil +} + func newOtelcolAttrSetHttp(service string, errorCode string) *attribute.Set { s := attribute.NewSet(attribute.KeyValue{Key: keyService, Value: attribute.StringValue(service)}, attribute.KeyValue{Key: "error_code", Value: attribute.StringValue(errorCode)}) return &s } -func parse(ctx context.Context, req *http.Request, pm params, recv *pyroscopeReceiver) (plog.Logs, error) { +func readProfiles(ctx context.Context, req *http.Request, pm params, recv *pyroscopeReceiver) (plog.Logs, error) { var ( tmp []string ok bool @@ -251,58 +322,6 @@ func resetHeaders(req *http.Request) { req.ContentLength = -1 } -func readParams(qs *url.Values) (params, error) { - var ( - tmp []string - ok bool - qsv = *qs - p params = params{} - ) - - if tmp, ok = qsv["from"]; !ok { - return p, fmt.Errorf("required start time is missing") - } - start, err := strconv.ParseUint(tmp[0], 10, 64) - if err != nil { - return p, fmt.Errorf("failed to parse start time: %w", err) - } - p.start = start - - if tmp, ok = qsv["name"]; !ok { - return p, fmt.Errorf("required labels are missing") - } - i := strings.Index(tmp[0], "{") - length := len(tmp[0]) - if i < 0 { - i = length - } else { // optional labels - // TODO: improve this stupid {k=v(,k=v)*} compiler, checkout pyroscope's implementation - promqllike := tmp[0][i+1 : length-1] // stripe {} - if len(promqllike) > 0 { - words := strings.FieldsFunc(promqllike, func(r rune) bool { return r == '=' || r == ',' }) - sz := len(words) - if sz == 0 || sz%2 != 0 { - return p, fmt.Errorf("failed to compile labels") - } - for j := 0; j < len(words); j += 2 { - p.labels = append(p.labels, labels.Label{Name: words[j], Value: words[j+1]}) - } - } - } - // required app name - p.name = tmp[0][:i] - - if tmp, ok = qsv["until"]; !ok { - return p, fmt.Errorf("required end time is missing") - } - end, err := strconv.ParseUint(tmp[0], 10, 64) - if err != nil { - return p, fmt.Errorf("failed to parse end time: %w", err) - } - p.end = end - return p, nil -} - func setAttrsFromProfile(prof profile_types.ProfileIR, m pcommon.Map) { m.PutStr("type", prof.Type.Type) m.PutStr("period_type", prof.Type.PeriodType) @@ -326,7 +345,6 @@ func (recv *pyroscopeReceiver) Start(_ context.Context, host component.Host) err return fmt.Errorf("failed to create tcp listener: %w", err) } - // TODO: rate limit clients and add timeout recv.shutdownWg.Add(1) go func() { defer recv.shutdownWg.Done() diff --git a/receiver/pyroscopereceiver/receiver_test.go b/receiver/pyroscopereceiver/receiver_test.go index 4056dfa..284fcb5 100644 --- a/receiver/pyroscopereceiver/receiver_test.go +++ b/receiver/pyroscopereceiver/receiver_test.go @@ -63,6 +63,7 @@ func startHttpServer(t *testing.T) (string, *consumertest.LogsSink) { MaxRequestBodySize: defaultMaxRequestBodySize, }, }, + Timeout: defaultTimeout, DecompressedRequestBodySizeBytesExpectedValue: defaultDecompressedRequestBodySizeBytesExpectedValue, } sink := new(consumertest.LogsSink) From 16c580fd0f488110d705f64b71d841b1dc3d3aa8 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 31 Dec 2023 10:40:52 +0200 Subject: [PATCH 40/44] fix bug response code from param --- receiver/pyroscopereceiver/receiver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 96dc508..61f1ebd 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -155,7 +155,7 @@ func handleError(ctx context.Context, resp http.ResponseWriter, contentType stri otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-startTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) recv.logger.Error(msg) - writeResponse(resp, "text/plain", http.StatusMethodNotAllowed, []byte(msg)) + writeResponse(resp, "text/plain", statusCode, []byte(msg)) } func readParams(qs *url.Values) (params, error) { From 75631a742ca04e9da94af46f7d67875ce251f32d Mon Sep 17 00:00:00 2001 From: tomershafir Date: Sun, 31 Dec 2023 10:54:33 +0200 Subject: [PATCH 41/44] dont exit on ping err on startup --- .../ch/access_native_columnar.go | 15 ++++++++++----- exporter/clickhouseprofileexporter/exporter.go | 16 ++++++++-------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go index b551f2c..622af4a 100644 --- a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go +++ b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go @@ -9,27 +9,32 @@ import ( "github.com/ClickHouse/clickhouse-go/v2/lib/driver" "go.opentelemetry.io/collector/pdata/pcommon" "go.opentelemetry.io/collector/pdata/plog" + "go.uber.org/zap" ) // schema reference: https://github.com/metrico/qryn/blob/master/lib/db/maintain/scripts.js type clickhouseAccessNativeColumnar struct { conn driver.Conn + + logger *zap.Logger } type tuple []any // Connects to clickhouse and checks the connection's health, returning a new native client -func NewClickhouseAccessNativeColumnar(opts *clickhouse.Options) (*clickhouseAccessNativeColumnar, error) { +func NewClickhouseAccessNativeColumnar(opts *clickhouse.Options, logger *zap.Logger) (*clickhouseAccessNativeColumnar, error) { c, err := clickhouse.Open(opts) if err != nil { return nil, fmt.Errorf("failed to connect to clickhouse: %w", err) } + nc := &clickhouseAccessNativeColumnar{ + conn: c, + logger: logger, + } if err = c.Ping(context.Background()); err != nil { - return nil, fmt.Errorf("failed to ping clickhouse server: %w", err) + nc.logger.Warn(fmt.Sprintf("failed to ping clickhouse server: %s", err.Error())) } - return &clickhouseAccessNativeColumnar{ - conn: c, - }, nil + return nc, nil } // Inserts a profile batch into the clickhouse server using columnar native protocol diff --git a/exporter/clickhouseprofileexporter/exporter.go b/exporter/clickhouseprofileexporter/exporter.go index f458842..149295f 100644 --- a/exporter/clickhouseprofileexporter/exporter.go +++ b/exporter/clickhouseprofileexporter/exporter.go @@ -38,21 +38,21 @@ type clickhouseAccess interface { // TODO: batch like this https://github.com/open-telemetry/opentelemetry-collector/issues/8122 func newClickhouseProfileExporter(ctx context.Context, set *exporter.CreateSettings, cfg *Config) (*clickhouseProfileExporter, error) { + exp := &clickhouseProfileExporter{ + cfg: cfg, + set: set, + logger: set.Logger, + meter: set.MeterProvider.Meter(typeStr), + } opts, err := clickhouse.ParseDSN(cfg.Dsn) if err != nil { return nil, fmt.Errorf("failed to parse clickhouse dsn: %w", err) } - ch, err := ch.NewClickhouseAccessNativeColumnar(opts) + ch, err := ch.NewClickhouseAccessNativeColumnar(opts, exp.logger) if err != nil { return nil, fmt.Errorf("failed to init native ch storage: %w", err) } - exp := &clickhouseProfileExporter{ - cfg: cfg, - set: set, - logger: set.Logger, - meter: set.MeterProvider.Meter(typeStr), - ch: ch, - } + exp.ch = ch if err := initMetrics(exp.meter); err != nil { exp.logger.Error(fmt.Sprintf("failed to init metrics: %s", err.Error())) return exp, err From cfc48f9433c510a7b3c703adc7a53f043e600ecf Mon Sep 17 00:00:00 2001 From: tomershafir Date: Mon, 1 Jan 2024 17:28:16 +0200 Subject: [PATCH 42/44] change recv funcs to be ptr receiver --- receiver/pyroscopereceiver/receiver.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index 61f1ebd..da3ccda 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -81,7 +81,7 @@ func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.Cre recv.decompressor = compress.NewDecompressor(recv.cfg.DecompressedRequestBodySizeBytesExpectedValue, recv.cfg.Protocols.Http.MaxRequestBodySize) recv.httpMux = http.NewServeMux() recv.httpMux.HandleFunc(ingestPath, func(resp http.ResponseWriter, req *http.Request) { - httpHandlerIngest(resp, req, recv) + recv.httpHandlerIngest(resp, req) }) if err := initMetrics(recv.meter); err != nil { recv.logger.Error(fmt.Sprintf("failed to init metrics: %s", err.Error())) @@ -91,7 +91,7 @@ func newPyroscopeReceiver(cfg *Config, consumer consumer.Logs, set *receiver.Cre } // TODO: rate limit clients -func httpHandlerIngest(resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) { +func (recv *pyroscopeReceiver) httpHandlerIngest(resp http.ResponseWriter, req *http.Request) { ctx, cancel := context.WithTimeout(contextWithStart(req.Context(), time.Now().UnixMilli()), recv.cfg.Timeout) defer cancel() @@ -99,9 +99,9 @@ func httpHandlerIngest(resp http.ResponseWriter, req *http.Request, recv *pyrosc select { case <-ctx.Done(): - handleError(ctx, resp, "text/plain", http.StatusRequestTimeout, fmt.Sprintf("receiver timeout elapsed: %s", recv.cfg.Timeout), "", errorCodeError, recv) + recv.handleError(ctx, resp, "text/plain", http.StatusRequestTimeout, fmt.Sprintf("receiver timeout elapsed: %s", recv.cfg.Timeout), "", errorCodeError) return - case <-handle(ctx, resp, req, recv): + case <-recv.handle(ctx, resp, req): } } @@ -113,7 +113,7 @@ func contextWithStart(ctx context.Context, start int64) context.Context { return context.WithValue(ctx, keyStart, start) } -func handle(ctx context.Context, resp http.ResponseWriter, req *http.Request, recv *pyroscopeReceiver) <-chan struct{} { +func (recv *pyroscopeReceiver) handle(ctx context.Context, resp http.ResponseWriter, req *http.Request) <-chan struct{} { c := make(chan struct{}) go func() { // signal completion event @@ -122,18 +122,18 @@ func handle(ctx context.Context, resp http.ResponseWriter, req *http.Request, re qs := req.URL.Query() pm, err := readParams(&qs) if err != nil { - handleError(ctx, resp, "text/plain", http.StatusBadRequest, "bad url query", "", errorCodeError, recv) + recv.handleError(ctx, resp, "text/plain", http.StatusBadRequest, "bad url query", "", errorCodeError) return } if req.Method != http.MethodPost { - handleError(ctx, resp, "text/plain", http.StatusMethodNotAllowed, fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost), pm.name, errorCodeError, recv) + recv.handleError(ctx, resp, "text/plain", http.StatusMethodNotAllowed, fmt.Sprintf("method not allowed, supported: [%s]", http.MethodPost), pm.name, errorCodeError) return } - pl, err := readProfiles(ctx, req, pm, recv) + pl, err := recv.readProfiles(ctx, req, pm) if err != nil { - handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), pm.name, errorCodeError, recv) + recv.handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), pm.name, errorCodeError) return } @@ -141,7 +141,7 @@ func handle(ctx context.Context, resp http.ResponseWriter, req *http.Request, re // TODO: support memorylimiter processor, apply retry policy on "oom" event, depends on https://github.com/open-telemetry/opentelemetry-collector/issues/9196 err = recv.next.ConsumeLogs(ctx, pl) if err != nil { - handleError(ctx, resp, "text/plain", http.StatusInternalServerError, err.Error(), pm.name, errorCodeError, recv) + recv.handleError(ctx, resp, "text/plain", http.StatusInternalServerError, err.Error(), pm.name, errorCodeError) return } @@ -151,7 +151,7 @@ func handle(ctx context.Context, resp http.ResponseWriter, req *http.Request, re return c } -func handleError(ctx context.Context, resp http.ResponseWriter, contentType string, statusCode int, msg string, service string, errorCode string, recv *pyroscopeReceiver) { +func (recv *pyroscopeReceiver) handleError(ctx context.Context, resp http.ResponseWriter, contentType string, statusCode int, msg string, service string, errorCode string) { otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-startTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(service, errorCode))) recv.logger.Error(msg) @@ -215,7 +215,7 @@ func newOtelcolAttrSetHttp(service string, errorCode string) *attribute.Set { return &s } -func readProfiles(ctx context.Context, req *http.Request, pm params, recv *pyroscopeReceiver) (plog.Logs, error) { +func (recv *pyroscopeReceiver) readProfiles(ctx context.Context, req *http.Request, pm params) (plog.Logs, error) { var ( tmp []string ok bool From f7100319cc9d226e5b764439cd194e5c557c1c4e Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 2 Jan 2024 18:21:23 +0200 Subject: [PATCH 43/44] handle 0 parsed profiles case and return 204 generally --- .../pyroscopereceiver/jfrparser/parser.go | 2 +- receiver/pyroscopereceiver/receiver.go | 21 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/receiver/pyroscopereceiver/jfrparser/parser.go b/receiver/pyroscopereceiver/jfrparser/parser.go index 471740b..e663ab9 100644 --- a/receiver/pyroscopereceiver/jfrparser/parser.go +++ b/receiver/pyroscopereceiver/jfrparser/parser.go @@ -53,7 +53,7 @@ func NewJfrPprofParser() *jfrPprofParser { return &jfrPprofParser{} } -// Parses the jfr buffer into pprof +// Parses the jfr buffer into pprof. The returned slice may be empty without an error. func (pa *jfrPprofParser) Parse(jfr *bytes.Buffer, md profile_types.Metadata, maxDecompressedSizeBytes int64) ([]profile_types.ProfileIR, error) { var ( period int64 diff --git a/receiver/pyroscopereceiver/receiver.go b/receiver/pyroscopereceiver/receiver.go index da3ccda..95ffdb4 100644 --- a/receiver/pyroscopereceiver/receiver.go +++ b/receiver/pyroscopereceiver/receiver.go @@ -136,6 +136,11 @@ func (recv *pyroscopeReceiver) handle(ctx context.Context, resp http.ResponseWri recv.handleError(ctx, resp, "text/plain", http.StatusBadRequest, err.Error(), pm.name, errorCodeError) return } + // if no profiles have been parsed, dont error but return + if pl.ResourceLogs().At(0).ScopeLogs().At(0).LogRecords().Len() == 0 { + writeResponseNoContent(resp) + return + } // delegate to next consumer in the pipeline // TODO: support memorylimiter processor, apply retry policy on "oom" event, depends on https://github.com/open-telemetry/opentelemetry-collector/issues/9196 @@ -147,6 +152,7 @@ func (recv *pyroscopeReceiver) handle(ctx context.Context, resp http.ResponseWri otelcolReceiverPyroscopeHttpRequestTotal.Add(ctx, 1, metric.WithAttributeSet(*newOtelcolAttrSetHttp(pm.name, errorCodeSuccess))) otelcolReceiverPyroscopeHttpResponseTimeMillis.Record(ctx, time.Now().Unix()-startTimeFromContext(ctx), metric.WithAttributeSet(*newOtelcolAttrSetHttp(pm.name, errorCodeSuccess))) + writeResponseNoContent(resp) }() return c } @@ -276,6 +282,7 @@ func (recv *pyroscopeReceiver) readProfiles(ctx context.Context, req *http.Reque r.Body().SetEmptyBytes().FromRaw(pr.Payload.Bytes()) sz += pr.Payload.Len() } + // sz may be 0 and it will be recorded otelcolReceiverPyroscopeParsedPayloadSizeBytes.Record(ctx, int64(sz), metric.WithAttributeSet(*newOtelcolAttrSetPayloadSizeBytes(pm.name, formatPprof, ""))) return logs, nil } @@ -364,8 +371,16 @@ func (recv *pyroscopeReceiver) Shutdown(ctx context.Context) error { return nil } -func writeResponse(w http.ResponseWriter, contentType string, statusCode int, msg []byte) { - w.Header().Set("Content-Type", contentType) +func writeResponseNoContent(w http.ResponseWriter) { + writeResponse(w, "", http.StatusNoContent, nil) +} + +func writeResponse(w http.ResponseWriter, contentType string, statusCode int, payload []byte) { + if len(contentType) > 0 { + w.Header().Set("Content-Type", contentType) + } w.WriteHeader(statusCode) - _, _ = w.Write(msg) + if payload != nil { + _, _ = w.Write(payload) + } } From 5ae5bb61416db23820e65cb17bd3ad944051c9d0 Mon Sep 17 00:00:00 2001 From: tomershafir Date: Tue, 2 Jan 2024 18:36:06 +0200 Subject: [PATCH 44/44] rm profile_id --- .../ch/access_native_columnar.go | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go index 622af4a..ab0f149 100644 --- a/exporter/clickhouseprofileexporter/ch/access_native_columnar.go +++ b/exporter/clickhouseprofileexporter/ch/access_native_columnar.go @@ -51,7 +51,6 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { sz := rl.Len() timestamp_ns := make([]uint64, sz) - profile_id := make([]string, sz) typ := make([]string, sz) service_name := make([]string, sz) period_type := make([]string, sz) @@ -73,8 +72,6 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { timestamp_ns[i] = uint64(r.Timestamp()) - profile_id[i] = "" - tmp, _ = m.Get("type") typ[i] = tmp.AsString() @@ -109,31 +106,28 @@ func (ch *clickhouseAccessNativeColumnar) InsertBatch(ls plog.Logs) error { if err := b.Column(0).Append(timestamp_ns); err != nil { return err } - if err := b.Column(1).Append(profile_id); err != nil { - return err - } - if err := b.Column(2).Append(typ); err != nil { + if err := b.Column(1).Append(typ); err != nil { return err } - if err := b.Column(3).Append(service_name); err != nil { + if err := b.Column(2).Append(service_name); err != nil { return err } - if err := b.Column(4).Append(period_type); err != nil { + if err := b.Column(3).Append(period_type); err != nil { return err } - if err := b.Column(5).Append(period_unit); err != nil { + if err := b.Column(4).Append(period_unit); err != nil { return err } - if err := b.Column(6).Append(tags); err != nil { + if err := b.Column(5).Append(tags); err != nil { return err } - if err := b.Column(7).Append(duration_ns); err != nil { + if err := b.Column(6).Append(duration_ns); err != nil { return err } - if err := b.Column(8).Append(payload_type); err != nil { + if err := b.Column(7).Append(payload_type); err != nil { return err } - if err := b.Column(9).Append(payload); err != nil { + if err := b.Column(8).Append(payload); err != nil { return err } return b.Send()