diff --git a/_meta/fields.common.yml b/_meta/fields.common.yml index 807961a35bb..d4d24ad0317 100644 --- a/_meta/fields.common.yml +++ b/_meta/fields.common.yml @@ -3,6 +3,21 @@ description: > Fields common to various APM events. fields: + - name: data_stream.type + type: keyword + description: "Data stream type: logs, metrics, or traces." + example: traces + + - name: data_stream.dataset + type: keyword + description: Data stream dataset name. + example: backend_service + + - name: data_stream.namespace + type: keyword + description: User-defined data stream namespace. + example: production + - name: processor.name type: keyword description: Processor name. diff --git a/beater/beater.go b/beater/beater.go index 80b38c07019..9e703796a39 100644 --- a/beater/beater.go +++ b/beater/beater.go @@ -36,8 +36,10 @@ import ( "github.com/elastic/beats/v7/libbeat/instrumentation" "github.com/elastic/beats/v7/libbeat/logp" esoutput "github.com/elastic/beats/v7/libbeat/outputs/elasticsearch" + "github.com/elastic/beats/v7/libbeat/processors" "github.com/elastic/apm-server/beater/config" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/elasticsearch" "github.com/elastic/apm-server/ingest/pipeline" logs "github.com/elastic/apm-server/log" @@ -117,7 +119,6 @@ type beater struct { // Run runs the APM Server, blocking until the beater's Stop method is called, // or a fatal error occurs. func (bt *beater) Run(b *beat.Beat) error { - done := make(chan struct{}) var reloadOnce sync.Once @@ -127,6 +128,7 @@ func (bt *beater) Run(b *beat.Beat) error { // during startup. This might change when APM Server is included in Fleet reloadOnce.Do(func() { defer close(done) + // TODO(axw) config received from Fleet should be modified to set data_streams.enabled. var cfg *config.Config cfg, err = config.NewConfig(ucfg.Config, elasticsearchOutputConfig(b)) if err != nil { @@ -365,11 +367,30 @@ func newPublisher(b *beat.Beat, cfg *config.Config, tracer *apm.Tracer) (*publis if err != nil { return nil, err } - return publish.NewPublisher(b.Publisher, tracer, &publish.PublisherConfig{ + publisherConfig := &publish.PublisherConfig{ Info: b.Info, Pipeline: cfg.Pipeline, TransformConfig: transformConfig, - }) + } + if !cfg.DataStreams.Enabled { + // Remove data_stream.* fields during publishing when data streams are disabled. + processors, err := processors.New(processors.PluginConfig{common.MustNewConfigFrom( + map[string]interface{}{ + "drop_fields": map[string]interface{}{ + "fields": []interface{}{ + datastreams.TypeField, + datastreams.DatasetField, + datastreams.NamespaceField, + }, + }, + }, + )}) + if err != nil { + return nil, err + } + publisherConfig.Processor = processors + } + return publish.NewPublisher(b.Publisher, tracer, publisherConfig) } func newTransformConfig(beatInfo beat.Info, cfg *config.Config) (*transform.Config, error) { diff --git a/beater/config/config.go b/beater/config/config.go index b40f00d6a62..0a086bf4c69 100644 --- a/beater/config/config.go +++ b/beater/config/config.go @@ -85,6 +85,7 @@ type Config struct { JaegerConfig JaegerConfig `config:"jaeger"` Aggregation AggregationConfig `config:"aggregation"` Sampling SamplingConfig `config:"sampling"` + DataStreams DataStreamsConfig `config:"data_streams"` Pipeline string } @@ -189,5 +190,6 @@ func DefaultConfig() *Config { JaegerConfig: defaultJaeger(), Aggregation: defaultAggregationConfig(), Sampling: defaultSamplingConfig(), + DataStreams: defaultDataStreamsConfig(), } } diff --git a/beater/config/data_streams.go b/beater/config/data_streams.go new file mode 100644 index 00000000000..1faf6144617 --- /dev/null +++ b/beater/config/data_streams.go @@ -0,0 +1,27 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package config + +// DataStreamsConfig holds data streams configuration. +type DataStreamsConfig struct { + Enabled bool `config:"enabled"` +} + +func defaultDataStreamsConfig() DataStreamsConfig { + return DataStreamsConfig{Enabled: false} +} diff --git a/beater/http.go b/beater/http.go index 6ef8fcaa444..e07c2734363 100644 --- a/beater/http.go +++ b/beater/http.go @@ -100,8 +100,13 @@ func (h *httpServer) start() error { h.logger.Infof("Connection limit set to: %d", h.cfg.MaxConnections) } - // Create the "onboarding" document, which contains the server's listening address. - notifyListening(context.Background(), addr, h.reporter) + if !h.cfg.DataStreams.Enabled { + // Create the "onboarding" document, which contains the server's + // listening address. We only do this if data streams are not enabled, + // as onboarding documents are incompatible with data streams. + // Onboarding documents should be replaced by Fleet status later. + notifyListening(context.Background(), addr, h.reporter) + } if h.TLSConfig != nil { h.logger.Info("SSL enabled.") diff --git a/beater/telemetry.go b/beater/telemetry.go index 34d65c2eed4..8d6bbdff7a2 100644 --- a/beater/telemetry.go +++ b/beater/telemetry.go @@ -29,6 +29,7 @@ import ( var apmRegistry = monitoring.GetNamespace("state").GetRegistry().NewRegistry("apm-server") type configTelemetry struct { + dataStreamsEnabled *monitoring.Bool rumEnabled *monitoring.Bool apiKeysEnabled *monitoring.Bool kibanaEnabled *monitoring.Bool @@ -49,6 +50,7 @@ type configTelemetry struct { } var configMonitors = &configTelemetry{ + dataStreamsEnabled: monitoring.NewBool(apmRegistry, "data_streams.enabled"), rumEnabled: monitoring.NewBool(apmRegistry, "rum.enabled"), apiKeysEnabled: monitoring.NewBool(apmRegistry, "api_key.enabled"), kibanaEnabled: monitoring.NewBool(apmRegistry, "kibana.enabled"), @@ -73,6 +75,7 @@ func recordConfigs(info beat.Info, apmCfg *config.Config, rootCfg *common.Config if err != nil { return err } + configMonitors.dataStreamsEnabled.Set(apmCfg.DataStreams.Enabled) configMonitors.rumEnabled.Set(apmCfg.RumConfig.IsEnabled()) configMonitors.apiKeysEnabled.Set(apmCfg.APIKeyConfig.IsEnabled()) configMonitors.kibanaEnabled.Set(apmCfg.Kibana.Enabled) diff --git a/datastreams/constants.go b/datastreams/constants.go new file mode 100644 index 00000000000..2ab6f6f7f5f --- /dev/null +++ b/datastreams/constants.go @@ -0,0 +1,37 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package datastreams + +// Constants for data stream types. +const ( + LogsType = "logs" + MetricsType = "metrics" + TracesType = "traces" +) + +// Cosntants for data stream event metadata fields. +const ( + TypeField = "data_stream.type" + DatasetField = "data_stream.dataset" + NamespaceField = "data_stream.namespace" +) + +// IndexFormat holds the variable "index" format to use for the libbeat Elasticsearch output. +// Each event the server publishes is expected to contain data_stream.* fields, which will be +// added to the documents as well as be used for routing documents to the correct data stream. +const IndexFormat = "%{[data_stream.type]}-%{[data_stream.dataset]}-%{[data_stream.namespace]}" diff --git a/datastreams/servicename.go b/datastreams/servicename.go new file mode 100644 index 00000000000..ac49422727b --- /dev/null +++ b/datastreams/servicename.go @@ -0,0 +1,45 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package datastreams + +import "strings" + +// NormalizeServiceName translates serviceName into a string suitable +// for inclusion in a data stream name. +// +// Concretely, this function will lowercase the string and replace any +// reserved characters with "_". +func NormalizeServiceName(s string) string { + s = strings.ToLower(s) + s = strings.Map(replaceReservedRune, s) + return s +} + +func replaceReservedRune(r rune) rune { + switch r { + case '\\', '/', '*', '?', '"', '<', '>', '|', ' ', ',', '#', ':': + // These characters are not permitted in data stream names + // by Elasticsearch. + return '_' + case '-': + // Hyphens are used to separate the data stream type, dataset, + // and namespace. + return '_' + } + return r +} diff --git a/datastreams/servicename_test.go b/datastreams/servicename_test.go new file mode 100644 index 00000000000..e71e1532c03 --- /dev/null +++ b/datastreams/servicename_test.go @@ -0,0 +1,35 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package datastreams_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/elastic/apm-server/datastreams" +) + +func TestNormalizeServiceName(t *testing.T) { + testNormalizeServiceName := func(expected, input string) { + t.Helper() + assert.Equal(t, expected, datastreams.NormalizeServiceName(input)) + } + testNormalizeServiceName("upper_case", "UPPER-CASE") + testNormalizeServiceName("____________", "\\/*?\"<>| ,#:") +} diff --git a/docs/fields.asciidoc b/docs/fields.asciidoc index b18c4201e69..a675e611972 100644 --- a/docs/fields.asciidoc +++ b/docs/fields.asciidoc @@ -38,6 +38,39 @@ Fields common to various APM events. +*`data_stream.type`*:: ++ +-- +Data stream type: logs, metrics, or traces. + +type: keyword + +example: traces + +-- + +*`data_stream.dataset`*:: ++ +-- +Data stream dataset name. + +type: keyword + +example: backend_service + +-- + +*`data_stream.namespace`*:: ++ +-- +User-defined data stream namespace. + +type: keyword + +example: production + +-- + *`processor.name`*:: + -- diff --git a/idxmgmt/supporter.go b/idxmgmt/supporter.go index 77543186223..e8a8f676f31 100644 --- a/idxmgmt/supporter.go +++ b/idxmgmt/supporter.go @@ -26,6 +26,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" + "github.com/elastic/beats/v7/libbeat/common/fmtstr" libidxmgmt "github.com/elastic/beats/v7/libbeat/idxmgmt" libilm "github.com/elastic/beats/v7/libbeat/idxmgmt/ilm" "github.com/elastic/beats/v7/libbeat/logp" @@ -33,6 +34,7 @@ import ( "github.com/elastic/beats/v7/libbeat/outputs/outil" "github.com/elastic/beats/v7/libbeat/template" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/idxmgmt/ilm" "github.com/elastic/apm-server/idxmgmt/unmanaged" ) @@ -49,6 +51,7 @@ const esKey = "elasticsearch" type supporter struct { log *logp.Logger info beat.Info + dataStreams bool templateConfig template.TemplateConfig ilmConfig ilm.Config unmanagedIdxConfig *unmanaged.Config @@ -63,6 +66,20 @@ type indexState struct { isSet atomic.Bool } +// newDataStreamSelector returns an outil.Selector which routes events to +// a data stream based on well-defined data_stream.* fields in events. +func newDataStreamSelector() (outputs.IndexSelector, error) { + fmtstr, err := fmtstr.CompileEvent(datastreams.IndexFormat) + if err != nil { + return nil, err + } + expr, err := outil.FmtSelectorExpr(fmtstr, "", outil.SelectorLowerCase) + if err != nil { + return nil, err + } + return outil.MakeSelector(expr), nil +} + type unmanagedIndexSelector outil.Selector type ilmIndexSelector struct { @@ -71,39 +88,41 @@ type ilmIndexSelector struct { st *indexState } -func newSupporter( - log *logp.Logger, - info beat.Info, - templateConfig template.TemplateConfig, - ilmConfig ilm.Config, - outConfig common.ConfigNamespace, -) (*supporter, error) { +func newSupporter(log *logp.Logger, info beat.Info, cfg *IndexManagementConfig) (*supporter, error) { var ( unmanagedIdxCfg unmanaged.Config - mode = ilmConfig.Mode + mode = cfg.ILM.Mode st = indexState{} ) - if outConfig.Name() == esKey { - if err := outConfig.Config().Unpack(&unmanagedIdxCfg); err != nil { + if cfg.Output.Name() == esKey { + if err := cfg.Output.Config().Unpack(&unmanagedIdxCfg); err != nil { return nil, fmt.Errorf("unpacking output elasticsearch index config fails: %+v", err) } - if err := checkTemplateESSettings(templateConfig, &unmanagedIdxCfg); err != nil { + if err := checkTemplateESSettings(cfg.Template, &unmanagedIdxCfg); err != nil { return nil, err } } - if outConfig.Name() != esKey || - ilmConfig.Mode == libilm.ModeDisabled || - ilmConfig.Mode == libilm.ModeAuto && unmanagedIdxCfg.Customized() { - + var disableILM bool + if cfg.Output.Name() != esKey || cfg.ILM.Mode == libilm.ModeDisabled { + disableILM = true + } else if cfg.ILM.Mode == libilm.ModeAuto { + // ILM is set to "auto": disable if we're using data streams, + // or if we're not using data streams but we're using customised, + // unmanaged indices. + if cfg.DataStreams || unmanagedIdxCfg.Customized() { + disableILM = true + } + } + if disableILM { mode = libilm.ModeDisabled st.isSet.CAS(false, true) } - ilmSupporters, err := ilm.MakeDefaultSupporter(log, mode, ilmConfig) + ilmSupporters, err := ilm.MakeDefaultSupporter(log, mode, cfg.ILM) if err != nil { return nil, err } @@ -111,8 +130,9 @@ func newSupporter( return &supporter{ log: log, info: info, - templateConfig: templateConfig, - ilmConfig: ilmConfig, + dataStreams: cfg.DataStreams, + templateConfig: cfg.Template, + ilmConfig: cfg.ILM, unmanagedIdxConfig: &unmanagedIdxCfg, migration: false, st: st, @@ -145,6 +165,10 @@ func (s *supporter) Manager( // depending on the supporter's config an ILM instance or an unmanaged index selector instance is returned. // The ILM instance decides on every Select call whether or not to return ILM indices or regular ones. func (s *supporter) BuildSelector(_ *common.Config) (outputs.IndexSelector, error) { + if s.dataStreams { + return newDataStreamSelector() + } + sel, err := s.buildSelector(s.unmanagedIdxConfig.SelectorConfig()) if err != nil { return nil, err diff --git a/idxmgmt/supporter_factory.go b/idxmgmt/supporter_factory.go index bb22010140d..9c8c801f6c4 100644 --- a/idxmgmt/supporter_factory.go +++ b/idxmgmt/supporter_factory.go @@ -33,31 +33,43 @@ import ( // functionality largely copied from libbeat type IndexManagementConfig struct { - Template template.TemplateConfig - ILM ilm.Config - Output common.ConfigNamespace + DataStreams bool + Template template.TemplateConfig + ILM ilm.Config + Output common.ConfigNamespace } -// MakeDefaultSupporter creates the index management supporter for APM that is passed to libbeat. +// MakeDefaultSupporter creates a new idxmgmt.Supporter, using the given root config. +// +// The Supporter will operate in one of three modes: data streams, legacy +// managed, and legacy unmanaged. The legacy modes exist purely to run +// apm-server without data streams or Fleet integration. +// +// If (Fleet) management is enabled, then no index, template, or ILM config +// should be set. Index (data stream) names will be well defined, based on +// the data type, service name, and user-defined namespace. +// +// If management is disabled, then the Supporter will operate in one of the +// legacy modes based on configuration. func MakeDefaultSupporter(log *logp.Logger, info beat.Info, configRoot *common.Config) (idxmgmt.Supporter, error) { cfg, err := NewIndexManagementConfig(info, configRoot) if err != nil { return nil, err } - if log == nil { log = logp.NewLogger(logs.IndexManagement) } else { log = log.Named(logs.IndexManagement) } - return newSupporter(log, info, cfg.Template, cfg.ILM, cfg.Output) + return newSupporter(log, info, cfg) } func NewIndexManagementConfig(info beat.Info, configRoot *common.Config) (*IndexManagementConfig, error) { cfg := struct { - ILM *common.Config `config:"apm-server.ilm"` - Template *common.Config `config:"setup.template"` - Output common.ConfigNamespace `config:"output"` + DataStreams *common.Config `config:"apm-server.data_streams"` + ILM *common.Config `config:"apm-server.ilm"` + Template *common.Config `config:"setup.template"` + Output common.ConfigNamespace `config:"output"` }{} if configRoot != nil { if err := configRoot.Unpack(&cfg); err != nil { @@ -76,9 +88,10 @@ func NewIndexManagementConfig(info beat.Info, configRoot *common.Config) (*Index } return &IndexManagementConfig{ - Template: tmplConfig, - ILM: ilmConfig, - Output: cfg.Output, + DataStreams: cfg.DataStreams.Enabled(), + Template: tmplConfig, + ILM: ilmConfig, + Output: cfg.Output, }, nil } diff --git a/include/fields.go b/include/fields.go index b223ce8442a..488e242db46 100644 --- a/include/fields.go +++ b/include/fields.go @@ -32,5 +32,5 @@ func init() { // AssetBuildFieldsFieldsYml returns asset data. // This is the base64 encoded gzipped contents of build/fields/fields.yml. func AssetBuildFieldsFieldsYml() string { - return "eJzs/XtTHDmWMIz/359CPzbih5ktkipuxrzvRDw00N3E2pgxeHqnxxugylRVaciUsiUluPqJ/e5v6BxJqbwAhU3Zbg+zz+OmqjKlo6Ojc9O5/Af59eDd6cnpz/8/ciSJkIawjBtiZlyTCc8ZybhiqcnnA8INuaWaTJlgihqWkfGcmBkjx4fnpFTyXyw1gx/+g4ypZhmRAr6/YUpzKcgo2U2GyQ//Qc5yRjUjN1xzQ2bGlHp/Y2PKzawaJ6ksNlhOteHpBks1MZLoajpl2pB0RsWUwVd22AlneaaTH35YJ9dsvk9Yqn8gxHCTs337wA+EZEynipeGSwFfkZ/cO8S9vf8DIetE0ILtk9X/Y3jBtKFFufoDIYTk7Ibl+ySVisFnxX6vuGLZPjGqwq/MvGT7JKMGPzbmWz2ihm3YMcntjAlAE7thwhCp+JQLi77kB3iPkAuLa67hoSy8xz4aRVOL5omSRT3CwE7MU5rnc6JYqZhmwnAxhYnciPV0vRumZaVSFuY/mUQv4G9kRjUR0kObk4CeAZLGDc0rBkAHYEpZVrmdxg3rJptwpQ283wJLsZTxmxqqkpcs56KG653DOe4XmUhFaJ7jCDrBfWIfaVHaTV/dHI5214c765tbF8O9/eHO/tZ2srez9dtqtM05HbNc924w7qYcWyqGL/DPS/z+ms1vpcp6Nvqw0kYW9oENxElJudJhDYdUkDEjlT0SRhKaZaRghhIuJlIV1A5iv3drIuczWeUZHMNUCkO5IIJpu3UIDpCv/d9BnuMeaEIVI9pIiyiqPaQBgGOPoKtMptdMXREqMnJ1vaevHDo6mPy/K7Qsc54CdCv7ZGUi5fqYqpUBWWHixn5TKplVKfz+vzGCC6Y1nbJ7MGzYR9ODxp+kIrmcOkQAPbix3O47dOBP9kn384DI0vCC/xHoztLJDWe39kxwQSg8bb9gKmDFTqeNqlJTWbzlcqrJLTczWRlCRU32DRgGRJoZU459kBS3NpUipYaJiPKNtEAUhJJZVVCxrhjN6DhnRFdFQdWcyOjExcewqHLDyzysXRP2kWt75GdsXk9YjLlgGeHCSCJFeLq9kb+wPJfkV6nyLNoiQ6f3nYCY0vlUSMUu6VjesH0yGm5ud3fuNdfGrse9pwOpGzoljKYzv8omjf0zJiGkq82V/4lJiU6ZQEpxbP0gfDFVsir3yWYPHV3MGL4ZdskdI8dcKaFju8nIBifm1p4ey0CNFXATtxVUzC3OqT2FeW7P3YBkzOAfUhE51kzd2O1BcpWWzGbS7pRUxNBrpknBqK4UK+wDbtjwWPt0asJFmlcZIz8yavkArFWTgs4JzbUkqhL2bTev0glINFho8he3VDeknlkmOWY1PwbKtvBTnmtPe4gkVQlhz4lEBFnYovUpN+TtjKmYe89oWTJLgXaxcFLDUoGzWwQIR40TKY2Qxu65X+w+OcHpUqsJyAkuGs6tPYiDGr7EkgJxmsiYUZNE5/fg7A3oJE5yNhfkdpyW5YZdCk9ZQmraiLlvJplHHbBdUDQInyC1cE2sfCVmpmQ1nZHfK1bZ8fVcG1ZokvNrRv6LTq7pgLxjGUf6KJVMmdZcTP2muMd1lc4sl34tp9pQPSO4DnIO6HYow4MIRI4oDOpKfTrGFc+zxPMpN0v7RPed6TtPdfskHX80TGRWPNupGiibuH3HPfK07BQZZNdWoxFuACPDKaRi3jMenDSKCEf9IwxpT0Cp5A3P2MAqJLpkKZ/wlODboPhwHdQzh8GI0xTMKJ5a2gm66Euri5IXtMh2t9cGJOdj+Bm//ucu3dxie5O9ydZwsjMcjsZ0a3ubbbOd7Wwve5WO9zbT8Wj4Mg0g2vUYsjncHK4PN9eHO2Rza3803B8NyX8Oh8MheX9x+D8BwxNa5eYScLRPJjTXrLGtrJyxgimaX/KsuanMbccTbKyfg/DMcr4JZwq5AtfufLzgExAsIH30WnuLudVQVAFan1fMaaqkthuhDVWWTY4rQ66QQnh2BcfMHrDuDu3RbYvoSQMR7eU/DU2/F/x3q7Y+ft1BjbKcB/kVvHcL+tqYEeBOvIcA3fKyxvLsv8tYoNNGgW3GjL6zg5pQfAqlHGoWU37DQB2lwr2GT7ufZywvJ1VueaPlAG6FYWBzK8lPjk8TLrShInXqaUvMaDsxyBpLJE5LIrWWxEqqgDOEsbkmgrEM7crbGU9n3akCw05lYSezZlO07pOJ5R9eoMBSUdL4r+TEMEFyNjGEFaWZd7dyImVjF+1GLWMXL+blPdvnhZidgND8ls410cb+G3BrVXw986SJ2+qsLHzXKmlJjRoRRHHAav0skribaMzqR0Az4ZPGxtc71iaAxuYXNJ1ZU6+L4ngcj2fHuJeA6r87kdBEdgum3WSYDNdVuhlrp7qhmlZGClnISpNzkPQPqKkHgtD6FVQOyIuD8zU8mE7pdIClUggGjoATYZgSzJAzJY1MpZf7L07O1oiSFUjDUrEJ/8g0qUTGUE5b6atkbgez3E0qUkjFiGDmVqprIkumqJHK6rHedmczmk/sC5RYNSZnhGYFF1wbezJvvM5sx8pkgQo2NcS5I3ARRSHFgKQ5oyqf1xIQbJcArcx5Ogd7YcZAZbALTBbWg0RVjIOeep+ozGVQxhpb4UQCjkNonssUdGYHUWebnBoZvg4E73bRDfTi4Px0jVQweD6vJY5GmyigHs/ESWPdEemNdka7rxoLlmpKBf8D2GPSFSOfoyaA9XkZYzlidd5sJ11LnoDqrAodazTkPnWntQdvozXBfB08/CylpcHXrw+jM5jmvGUiHtbf3GMjHrg37WHz9Ei1I0BuuD0LSPp+m9wRdLqvBw5tP8WmVGVgE1iVXwo9iJ5He2DM0YvKpaA5meTyliiWWnO54ZG4ODxzo6JkqsHswGa/sI9HkMEB1EwES9A+c/6PU1LS9JqZF3otgVnQiVE6FtKZCr2FVrVrTOpNWAW6NtMWDmdkeSwZRYWmAExCzmXBgtlTaTQfDVMFWfEuUKlWaoeJYhPPrRwoorVAjUfP/ezMe9zZMQvmLZj3EQLcsbRgianf5nqKGH50VDgi8hNY6VXpyiLEjVrb1VxY8P5VCdwAMLPRcPYO6p7BavwKaTpDWsUK92sdTrT3DAZ/Io634ecJHmA4PKiq0SwjmhVUGJ4C72cfjdPq2EfU1weoRHmOoINuZyS54Xa5/A9W+0zsQpkCC05zU1G3HScTMpeVCnNMaJ574vMSwXLTqVTzgX3UKyXa8DwnTOhKOQ3UuZ2t4pIxbSx5WJRahE14ngeGRstSyVJxalg+f4S9TLNMMa2XZVMBtaNzxNGWm9DpP4HNFGM+rWSl8zlSM7wTGOatRYuWBQN3O8m5BnfkydnAmscoZ6Ui1AqWj0RLSycJIf+oMRv0wVo7wnOg6K2HydP9VeK+uEKUNbVMQbiJlMisQpcwisarhJdXFpSrBMG6GpCMlUxkTs1HHV2KGgjw1Lgdq7Wo5N9OgFOdPMvw2JM1N0w/oNpHe49+n+ZrDUB+tD+g0y5cnLkz6UgCWWd3q/a2G4AhYS/B6HA8HMdPGnNOmUxSbuaXS3IQHFqdvXd33lgbgTlXYgMcKQwXTJhlwXQaOSvCZB34TqUyM3JQMMVT2gNkJYyaX3ItL1OZLQV1OAU5OX9L7BQdCA8P7gRrWbvpQOrd0EMqaNbFFLDHh43pKZOXpeRBNjXvfKSYclNlKK9zauBDB4LV/0tWcrhBXH+5leyOtve2hgOyklOzsk+2d5Kd4c6r0R7539UOkE/LE1s+QM3UupfH0U+o8Xv0DIjzgaAWJidkqqiocqq4mceCdU5SK+BB7YwE6KGXm8HDhBTOFWpUKbMSwynfk1xK5QTPADwqM16rtrWEQvByUs7mmts//MVV6o+1jkA4lSa6nYdrOY5+hwIE5JRJv9quH2YstZFiPUs7e6PYlEuxzJP2Dma476Ct/+3wLriWdNQcTL0n7W8VG7Mmonj5AAzhgcYsJ2dBR/MMEWXFi5Ozm22rb52c3eyuNWVGQdMlLPjNwWE/LM3JBTVJe7G9Z7V/wasX1mZE0+fkzE7kDAEMIjo9uAhWNXnBkmniXEQ0j61/giak9x417ivCAYgMSWupgk9RTEkuaUbGNKcihfM44YrdWjsGDHclK3tMW2qrXXQplXmc1uo1F20U71dlY2zY8f8s+ECD9RFKXGPVZ/j2J6lsm004OnuyiCZ5936cuT24i/gty9GGKZZd9imLTyezrMUy49MZ0yaa1OMI5x7AQsqSZR5kXY29jhn2/6f64gZlTzScMzAnUkHIT+KeS1JZrBCuyUr8RftGCYOf3E1RxgxTBUjYUrGUa2tCgXuEolEL1+YQ9FWNc54SXU0m/GMYEZ55MTOm3N/YwEfwCWs6rSXkQs0trRqJ/oCP3Eo0lJrjOdG8KPM5MfS63lc0gnOqDVxXYOQT2ttCGgK23C3Lc1j9xeuj+qp+JZVJdb3SFZERNhpUYWR5CRTwBYiCTSb2DN8wO6vTVdw2vmAXr4/WBnhLcy3krfDerwZYxOF+4N2MgKOS1pTvxgPR16Wf9rxh2OiK0KIICOjPTThANHfRTL0Ti1EPfN+gm0ozlSyXZGJTCz3SUqGf106Ol08FA/+HnNzFNaggr48OziB0BVd8FIaKaWW1uzpWUJ4vaXFWrycwgddbki4AkyrPe1TEP6XHxS54VRO7JJgOLAd6Q3lOx3lXSz3Ix0wZcsyFNsyRWAM34ED9agQIsy+fAnGRSwuu6QaY+FgpXJ+/AwdX40aZU2O1kB5CRTiXaAfHO4GTdYGYUT1bmhmOmAK+Y+fBKDGlmFV/O9Fm1DEoQaiQYh6H+6IiF5HKe81clMoVrIJn6KmGD3Z1VyEcLZVigntF88acVGRWJNU3NMRHcfcR1VKCle6IVUKU9WzW0xm+X42jnc+swo3eEogF5aK76IilUWBpXVQombddyk9GuAdKUQjgBoKEmbyrCHIcmqHdLYBX/7lyzcdU0EuIplgZkBXFrNXCxfTSDogh0PfgrL77lhUCHq6+/Rd333xjBgzBMxZuSGAoAte5E0VDVHy9DLzCwqgqbztBbBW5M753Qt7UcZdcxwFgVJDjw00M/7LHbMJMOmMa3GLR6IQb7UKqayDtEW1mAjRCurkOgUVNENy4qhIuVluxQpoQhkRkZTTPWDRTGzKEiRIXTOwX5ElH1K86l14zaQEHrQeCqGk3ubdv7bBc16A6hD3mkjMFh/PyxNvqRY0gnAuixeOrH56FDADHuuYk45MJU7F3AhyXHOLercC3DGfdMEGFIUzccCVF0Qx7q2nr4NfzMDnPBv5aCeifvH33MznJMEYfwhyqNhftauK7u7svX77c29t79epVLzqX6Y3uItSzP5pzqu/BZcBhwNHn4RJVyA42M67LnM5jhSq2gTFbbz1jN/fzrQirqKHynJv55R/1DfGTM+poHmLnsfjBa2ngFMCAatbU4dWVXmdUm/VRy7Pr4hqXd8hOfDzryZGXJgCrZ21tQPn6aHNre2f35d6rIR2nGZsM+yFeIh0HmOPI4y7UkcsavuwG0D4ZRG88d41iae9Fo9lMCpbxqunMcXmtX4SlurliZtV3aBtH9Cy8MyAHf1ixXX/TkwwxX3eTLHpa/fq/DA/0GMBrlkXXjpyrufp+dlXMyePXf8OzhQJUPvvu26MAJkz8quM0T3qrB4TahQ7INC0HAUNSkYxPuaG5TBkVXU35VjeWhZdlS1qUuyv7RHYbK7kyY5eaTwW1CmlD25UZI+eNX+5Wey9mTLN2PmDD2gP9ccwFVXOYlIRJ9eKhyJg08oAJNpYyZ1T0oe1H/AkMYVqCCs4x/trBYtHnov26loVRFXvAdqhB1YaaamnBcAdZxl2oaxfLQOlMWf6WWksfQenJT6nQjHdZgVOrDKdqXho5VbSc8ZQwpaTCtN3OqDc051l8Uy8VMarSxs9HXjN6w0glomhOPIb+1foVfz7r8cOwt1ZFE+mMpdd9yWfH7969fXf5/vTi3fvzi+Ojy3dv314svEcVJqAv6UL7HIdvCOxA+oHf1eFBPFVSy4khh1KVspGe8+BSAI1sEQl6z/FYPTdSMbT64q3s2R6Szpq3Xn+3e0ohArh+/a73IOcQ86x9yOMA7EHLx8KQaOC5+Egp8nkz5XY8J0bKXLvcRvBSQrYcS6/R4kM67JDM4w4yEOtn4rWf76CHFkRKkwPdMGV1k4zQqTVtI2/QjNU8VJimzdF73GgD+Q+cpUUQUwsOYPKOjIPMiL+8Jz8gPNiMAXfR2Z3yDVFCuUtOdUAGKJAI3P2au9CXk3iQqBZIJKtmLC8jpyi4DzAQIAytnWNCzK1kNTxoPYtIrGX6LevF86yp/POCTpdqjMRKFUwWQgsRIEtomLQrRR9ohk6XBFlNWQ4uOm3dUkUVSu6fPqpUck+tkraZBrO6sh+NeZe4HfWi6+ipoIcizS5LEcXRSUEFnSLz57omhI4ShRVSIj4SpSLEnOSo9fU9vCR69P6UFWS40dMQjoiRNRvNQiE9Y0ZZKg/lpyD7cfkp32ICRSP/Y6EsiiBlXHGhJ8qiCMNCNsVzFsVzFsW/dxZFfDB9XJ6rJNbery+VShGzwud8iud8iqcB6TmfYnGcPedTPOdT/InyKWIZ9k0kVUQALS2zgpd2tnjpD6QTsEYeQan4DTWMHL35ba0vkwCOAhgX31QyBUTvRx4Xt1Lww9S4MZKM54CJIwZl4p5+hctIj3iELvblciTupOWvnSiRddTE52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ52yJ7zVbIstRjvr7u9ev4eP9deQXiRmDiJmcjxVVnGmSzQUt0Gb0CJU086X6XVVwcCq5n99QMXf1N+Oq4q4YniQrekYh07sxz4qr6B5CwcFV5aMBx1Vo3wIhKszgeNA8hea5R/pE5rm85WK676H5CznCBaznXFy7+ebkxVWS5fnVmivp6e1hKcivXGTyVtfvnyO4bzG26MVVomXfe+8F/7gOymln7R1YGmDMcz7uG7Cg6dvzxS8zm4GFyZ8ocq8F+XMg37cfyNfesu8nrq+1sucwv2WF+bUQ/Rz1dweerGqcFNnOkhjim6MdnOJR8OgZHS0JoPNfDkafBtHmzu7yYNrc2f00qHacs3opUO2MNh8H1ZI4dMOsd8pNW2zWRYILWmrv4Y95OvTmk4JkXF93j801U4LlW5uJ13wXSXWhZln2609VniPEdpLO2lvAH+5/cIrlB6ymv7X54ZMWxBKq0hk3LA1ZIksIbzx7T+JpiKFqykxwZdhld5b4cXf7EauwIoqK+ZIWcBIqiOE0HTIb+KSkjEBHrKLkOVuHWOMnVSdKlkSALXu1rVCFT1jsGY3jOR5enB3+sreXxdOv7qbZ2OKRK9tNtpJXu8NhMnq5Pdp5xBJ5US7TDXaAzq8Q211KZVwO+dkxnjRyIIiDgqyvQ1kDeIxEcBH7S9rszDjhYspUqbhwmWDctXcjdGKg0DpizAXn+vxyq5lhpfZaI1JU6GAtaTKzOpBM00opq2JiTCc2VXHNxqAbh1E0WFsAPeb9NbUpJfBhWvdOvb29TSZcMTYHRrExzuV0w8wUo2bdmpyWN21sDkfbG8PRhlE0veZiul7Q/JYqto7IWbcTcjFNZqbIu9JkmO7uDbfSbfZqc3Nk/8hSuvNqd4vSbGs3yyaPIBDfsewSDsNSM5LdSfgcbnZ+dnByepEc//fxI5boGhsue11ums9Z30pg1x8+Hhx7bw78/Tb4ZVAEr9yPgOBoE42+OEen5/DxHkfbT42geDvh0ek5+b1icACtPUaFvmVRS1X7u6tL4uwyxuEshl4IddMaP9aclIpLcKlNGXaNc8O6QV9cZUJDPvo+PH+15pobzv0k8ehwi+R7KaD7u24z6UbEaUOMv8bLT6pjF5yDAa3HW6ZYvXeoPnCN43ShxFev1h4Twt9Y8cLJJS0WLAgFp65bMaLSvYF3uzSdubmIdr1JFDOVEtEthO9E7Op6RtovI3Aldc3mDi919LzfAMSzZr4pbiM5YDwnx4fndXOrd9hoBccCXgwcNHZoFfVy8Ec/uSC39q3jw3M3fDse0O6lpbGodSH2FoNfmgke9jlPy+TAkIILXlTFwH0ZxvWLKiptGu1Lr+wsVxY4KG/TWQbX9YXmwBoOYUhqR0tBcHLje2hTTUqpNR/jJWEGfUOs/kdrt59zgPssgH5AqSYp9p1rZJW0yC5Jc7q0/BEsIUAxrC5siM/0yZBioE+kCwbD9jsdjnhy2gt6VJtoKYEpAG3EAjHUqNWm2x0ORrEwkI9qxVdLJjLtL0yxM5zlSh4l8YB+7R0xPxom/v/1YmHZNSCiy2hLcVHxgBbopMRmNLrZ3o86x56ckMPTgzfH9kCMmUWWfT+/sdpXxJxWVzW5whvOmsWYKJtICt8eUSrFdCktioOXOhoEzmVCTgKvEtL48Jj2mL6z9BU0UfKpK1dWvDDoCt/ZFqvg3RU95bfGmEUCRe4KMbzw13EQ/XkD7n7LumHBgIHeXfAOVJrOYs7OJsCYGmlPXKdUZSxLyG9MSV/SogAH5MxdCCIPrRE4rrGGU/SkmfQT6hLLylzM6pIyn8hjgDab7i9GM6YuJ7lvzb0M08nfxG6SnBlr0Vg2iTMTmLlRcKXEjoN17ZF9cnAwIBeHA/LuaEDeHQzIwdGAHB4NyNHbDs26j+vk3VH9ZzOdY2lBJXaH7NIw6jaOCKAa7kAyr3yUSk4VLZAC0eNmIkK2j4Dyhblu0UCQRFryOj0OuYPuMaQ3R6NRY92y7Anzf/LFu2tVKfDuB/UozE53dyvXXEDoK6qpDc2VhIbyccwhdMI2Hnd1DzfM88BhUBMGzMCNdzzmnTj62/vjd/9o4Ciwxi+mMrhufE5coPXxoHbQ4ODLFIwgEVugxYIv+IZbVQeFFOvg0YC2uumMKpoaa2+8GLNc3pKtTciDtRCQ0ebu2iCifakbb9S8PNhB2DWR6ZSW9kxRzchoCCJkCnN8ODo6Wqv18B9pek10TvXM2XW/VxJyDMPIbqiEXNCxHpCUKsXplDnjQaOSmvMoG3bCWBaPkEpxw5QL6/9gBuSDwrc+CKA/5i7oHidkwz5/9TD259D1byl0PdBFwP8y6SFMAnZe7UNwK6y7/XaotMss3EAzsAtzw8vcJeYBMwwzDWrc6Gq8adc5ahDLoIH0GsLGrbk3YesxVgZII0ISoyjPoREwU1z2a7/9SH9OHEAW+Jw48LjEgZqAvoyV4Iyl+zWLg4ODpnrsLdbLz0kBPOg46vKcnJxZRY5Bfb6r2MFx1fI0+B+vvMPP0Q6fTHha5eBHqjQbkDFLaaWDE/qGKs7M3FtIMaUW1GhrGdqhHFgJOf5olG/PC/BFVT88oGbGFDgFwAEaIeeq1lnpNYPBvVMLWyBl7KN9u7BUEg+NegG+BL8zqjkEXYYR60a4qK5YDXciuxWEg4nTdqA0vxu1NxjU4S9hDfi5+tN/T99CdFsDuiWejdX4cARfvg9CygYO0VYxBfprSi/oN1yX0IruAiA4a8pvmIZOw9EtQqP1MDyWKhYH/2VCh1EmCFv7OmBRKGoAvG/fef4bQLTml8LXvimZcut/IUv0weZzO4SWMggWZ7Lh6VhLyIHIoDJ5KkVtvTqsNs/+3XcS3qtvjTnHEzq8NLh/Q8XLtHHbc3z40G3PG2boeuyy9hXTnE968WKbvdfoUXiOYr9XXLEMig8+QczO8eF5uFMHORbwaxejiZEJuWKpTtxDV5ic48GomSBoRsB6Km2wZihcYOedVt+E/DpjAvcMNjBVUkcKGxcZT5km6+vOVequMSxAFp8659OZyfvKr0ergfejcPGcwY26YVPl7q9p9i8Lqs8yTmesoC38k0Ygfw/pjJJhMowpRynZKM53HL5YOCifiuhOzsUQA/nOwbkR8Pgem88XqD/gc+4yqCwZFFnKGRb7t2j2jADyZ1JqpdAtSp/gzMC950azfFJb21Tg6I+4kVtSwQdAJnp+WpcKCOC9jrglpeP4cKgeCJy36QEwosSZnsV6j1VjYG1oen1ptYvvIYPxAsOJ02sCKwo3QIBRS6xlDjeF7GNIMgD1p7ci65fRfcOGD2I7BeOxwfUWBy+wjykr69oBEff4F72hSU7FNDmt8vxMwjXFsX88Ziuhm75nK+GL+9mKO9J99T4hqvmjuSMDIpfegsHSoIqnDfYQuNCBfZRAGRpXxA45RltMe+EMrT8LZmZ4dAO7qo2H1zIwK5AlXKR55ZqYwG0ONeEODYwvMa3HCDXV7UT1Itx4fijqc5Ys4UHeFbZPwb4sNNRvc752tHFCoQo3pr8YB3MwLsUwwCp8fpC6ISkZM3NrNX/qW1xSp+Kom3D/jJNxwQ2HyHK7VbnUdm0HficeRrdVvaQfEm7URYU1sXJSMKorxQpsgQOZAX2YjR6DaHZDr1mg4RjNMXnUOC5YISE+hWk7jB8uqzENc2dQncSfTlaAg79SLCHnDPf8CrPorOy7wmVz4+qwA5/wsRiQIRqu+MMRjkMVHKR2Xm2s6d6Q64u1olmgKNYnmw84erAZ/KVEs0ymc3yEsk8YMxjHS4joLXICFXqBBGqtdEaFx2tKDZtKMAX8+GFzLcO4AoSs0yy7GpArd27W4dww+GrCc7aOmn92hXdK/malISBA5Y+iWVyoYw4U1tfAptJMrZdUa4vMdQxKaqoZDvTlbAdmecFBmpCJtYysenmIc/pahhjmhUY3KK7U4I7U/jGwX5yTy22NHcgDT2acKarSWRws396bWiPE7V4Z8ykZV1BBZ8XCF43ImW462iIlPTdMOW7XmmLf7ewVmTthETR3bKzlHF/usTAm5AZxM3d3aqhsc408K5/HTbncjHZTrny8KHetgGhcvUxXYw9Wm+rD+N6yc/OCW43muby1EFpzM21ulJM7bkmRd44aq0fA1gQTJMJk11qszMxqf1F5vLvV3qfzLpw4lTONrj9DLB0sCio/gMkNaZ8R5qIitD6Wq9IsCI2M6UYrJqdzalKJqCLtgCg2pSrL490H7g9PE6vHVPYPqYhdHph2YGKhoJE3TIGUgVBmrzJ5ZY/HW8J8yCbqOeTkqLsN27vbe03kIwd6gBdktX+iiV93GnCQTi82tgHy8dYaroG3glSccBVljSlGgbdZ6pzCnkhlP4NjpeQly6FFzx00nXGrQ6SuHNb/gTK/hhYlsg1q4q9M3PDcxJ7zIM0ZOiCtvufLa4UwnbZIORGksCJZc1OhfTxwsYjmVpIwrTtoY9ZjhSPr9x/TOMqlEZGe0jyFrDlXWyuHcBtUjGIHlItccIGYSOI1k4jVFtgWeBWQjnsS0tIzwo3jEi1ICim4kXXgXz3E6ipYyn7H7EffcstIcs1YSaoSbxbgpfhwNbFqLW2EtIlHK1rxxKU0H8Q7W1/7RpUm4tTBzeFod324s765dTHc2x/u7G9tJ3s7L39rhidm1FDNHqqJ9vn1W3CaVsSaaGAEb1vgghxTAqz6IaMmVtaEkMqLG6zYR9OGnMnldOBMwlxO1wbx5EGKGOl0nHldYjo6r6ksoiqZ2OuxBhs2HdIhCuDZUHBASBOcXTC81Xsac4OpF6LnCplVeU36WJEHKxKg1kNJJrH3o+gM0yNsSprOWBLhImxvpRapz9pT8671JhdlZS79j4IK6SLkvP1XmfgBqt/wPOe9z+CdG9DIqJdwjtzUDbcagdvBMG2TkpBPIdbtmcfPzJpNirl7SVPfAzYCHvt4kWc0MLvIvClg95R3agUxsUgw110ipQa1I03aggTpzQpO/71XqwLgVtbANaIcg7nYaj6xxOykX6iekRclUzNaanv4tLHfRIlFa3AfSG+dJDPSbgDFq6rIHVRIoY2yyweXAfhirebYJvq67V/fXwc/Hh59MUffyZFdTehscHdNlz26PdkZDrMmZGLKupUDFtdJLoJMALoIXJUqxW98ZCaDGsGK5i7Q1EjV0TBAt/BFVUAZuKoFTqyLt+jSqwv5PCR6JY5T1pI417IzekObiicoGBUmTs7H9B4rr6OGGSQoUETT214b+EQ4o9KeLjT6rRmmdVVYjUFIYtcG1s4gaApO9vrbqpmSQuZy2qhsY0WNvPaRAlzvN3BF/t/24upv/HZfLSSzd5LRcPTbwiUArnmbGX1jdq6P6/okQxedO3jJaAda96O0fZOQt+LVhvhn02mX4bkuBuVAJzz040V3c8bVkg93pLXfpNeCdnHD3mpBfodq+7TiekZozpTxigychYZ3rBWKgEKrOVpLR8U1kpm8dfq4RRVA0MgViwQcmVGR5RBvOGNzuD27taayMNExVcyuGZyV9ZeoZgBClMzrVXMDo8BJh95NEJSljSWG2xmDJLUQ6Y79tOHuz8BN4bTKqQoh+LXpqKxy1aPy5O1qXg2dammKLM4SJZ9ANDSspa0puotyZz6AgYK8qioxc9eRVcpKCIPCodGiyKspaAJdT0p9U0/hJAivPaM+fACqIMjftYE/NzjyVSskrWEK1lcR4Aa0z9+lZzaw7nn/MvD+zjJ19tEE54ElZ2G4CqfvvSP/e7SGO4xoq7HD/RBD7S6T6WXUajTj2momGThGsbgfmLOQT8yymuit9u9CeiA62CjObrwtfXWJe9PD6s9ZSUavyHBvf3N3fzRET/fh8U/7w///f4w2t/+fc5ZWdgH4iWBGM3RyYgq/GyXu0dHQ/VFrgZYX6ArO6aSyclkbWZYs8y/gf7VK/zoaJvb/RiTT5q+bySjZTDZ1af462tzaDKr/HddosjLWVvqm5Y21qD5V3Lj1XfmQvYwJiNmOmRkKkcjvSj3i4XqnNiMpz60iE3wsJVM+IjuIFOi/gD4czG9mWa9WcyqNy2pAjc/n+0LuvbsdiHz/WcNriQwEc8FastCyb1+sKGL4tThrIWYA7dPRiYdiktdukmiBEegHVjqIAL/XTSkG0IFcKGXlTTjyIqwNP7uENBTZYdA6ihe1NLdGMP/rSoB1Im2oxxQMchSxdvRIROoQl4W8Wt5AVZp4gxfa1ps4+MRtbBzY9VOlgJ5qtAiXXOuYPXjTIHnXKrxay9Rd+uE+3KGFmAbDq2vq2MFrFExaN7eWMvysZhZ74/etknHV6LpMxTxoMWCXcsgv9ICRTDJktQW9rndHM6F7pItDa4PFLLkB9ep5iGLrO2foV4ZThRLbB9yez7VzRnXd0K/lNHK7Fqg/NWRtHTrnbTUvZnpavBAtJ+aWKnZfopY7LKABnM91YRW2mTFltgauZThZuhq77mRu4HbxyTDiCyw3NKjr2ay7Ja57sbR+UFlrSkzX7qq+1NhGxaheWtWX1XcwOrmdzePgNH/Z32VSXQ9sz1WpHc01IVSGp6CdOtZqMeoIPNzBNm5Tw7i/QuiUO0P49lWTp7ghA/9wdzTuFcTbVU/zHlysq7pnFx+u3lvlr8ktG9tj9NGHuIsWPNGQ9vRmTHAndhSDaPFaqw+yoQVeYKONfUYgkSivxrlMr1lGNDfsqodoLiAiHzgSFaQSzOdgNvXfBw1gqPUa+fKWQGxuAvL+3WuSc3HtY/3vLxfq6bJNdX4UrE8LAQc8jQMY3GmNRiAHkfk4CIpPo7xEZDHvg61khbViKGELKeBqD8RuuB7E/o2dnfGVdlznwyjbAhtzbvzHcAiOt4W3iOvrSx3piXdpjpNc0t6gt3dcXxMYAYwlxaXiGHLfZoba8SuiZV6B9yfKyXuvmbtKgqXBZY67+EJ9wJ7e5A7YL4VUxQJEduciVk/BMcX/YBkM+8CCBhgRo1MK96FhEUNLN6PhsMeZV1DuqgS7GudzWcG+N69XnFRAbgJJwjoCSDdv0+wQt845p5mlJ1EvA7HmInVBU8Kqxi2HubZ8ZbEj+rieR+duYN9/8w6xDqGErUchXhnh99dQcBGjO5fiA7gTpNfNygbsI00NkSpzkRPB8RLdjsd34+FYB+dtuBbpYOuGRW3inqRtEebVYqhXmKB5fhpC877by19DBYNgMIQR40oHUQINPuUvWXywAY3i9z130om7catKL7yjYKCwExA65mblzoRPpdBcm1j3dpQZ+91AHbDaVm+5EafnhfWMmUUz1Fy7yuU00fB74n9PUpmxq8QzX/91LWJj13YdvY2lgNwUHWWlcUWKXM233aqP5snR+Vri8xsbbwQV3JE14UYTeSvCjJiaYWV8nXMRxk1liSFYdy83itkJC+5KkZdNmjZ0oZZn91+a4Y3cg9dmLggtvjiLKAIv0OogjTtuzuw5/aNuRbyEtKD7DdXGkuyBqBmH3eGwIPRruVBYB3NTH8kVo5nXy5yw9oRe335EYhIPoCcOrPx3y3XDqk9TVmKefZjUJ7xB9Qxqj78UYP6dHLnJV44rJUu2cVBow1RGi5UoB5+Ox4rdoJ3rHz+/WFlDs5P88st+UdTMhNPcP7U+3NkfDlfWWmy0G/P9jXmqzIyrTwwAhFi5phOqFde2oqvxOkYCroCkHyBJYVRdJDtIrcx3oguRPJGnDwgTdr91FC7o+GoGt+0ycn7hoiAZtlR2S0HpdI4dn2foGufd4a9daiCf8y3NS9ZWVSq1rBZUq23zQcDYUNzQa2TSdTCu7BG+YdrwqV9d08uzgGUhsGKnGxpzerhYz1hpZp3RUSS5G7Da4YOXuyLOvnDZiwKMT1LmNGV32id32CX1kf8s+6SY91goMMXGzubLUcay8fpkZzxc394c7a3vvZwM17dpur33cki39ibsfuvF08OEuysml2Hxk/98T4LFAdZ+bkXjQzmZzu0kJDpoMrZ6UTNU0SUM2F8hctOHyNux3cL9/v8ExbFdeTqndkVeQzjgcN/gd8jnIPjPVGQbUtWLJY2Yq4GrjxJc1OM5Tnnib13Im/rO658/nbz5H1+uU9fZBlbI8pTptQRfdsknzuHXisgHTwnkvrMMsdlajz+OUUyC82o+KmofIwE/QzFZfU1djIILWcixxr8futeJ77299VZqDB6EerXghUKHc0/wETVG8XHVaX+/hNJZiPcwXyz+w5fYiwfZ8w1Vc0sboXMZ+YUpDJKE2jzs44xWGjzlUFFBTpxsaXJryxWCN8hnc7jjCZXHb9gArg0gsz0b1L3irIyCXivxhR37yNLKsAGZ8SxjYgDBuPivFPl84DjkgNwqbnq81Kv/XPHPrgzICj79YCum5+Y7z813zHPzHfLcfOe5+c732XynN7HkcboD6EEwDiiDULN8QXUB4jmR2BrvN5WFNAqefCrtplYInM5FMb4L8vD69R38LdRVhmHcBqLmUJXgx7kq7FRXzuTj9qwwTa5gFdG1lUs1wSwirPsevHr20YG1NNMwnLcmPdxx9fgWvhpZp08t4rDhvguD0K2LYXNX6xSd0SaIXtlZFpShWW4oAxHMmVwC64pL/8ZZ2JniN1EgDpRddW6HyBXQWeHGTBZsg+Ye82GldrhLHOZzF9tL3EcKVFEsD3vPapuOCWDMiuXshkae5ro7ZG8sZ5S8U5ZMWTsXBUDDfQfiMw8XAnER3UW5EqBmiR1XgGWFSTp7WTq/kgdnurS6t2eKF1YQYOvkkyPy4ueTo7V7j9LqaDgcNQ98bR8uG8J234qefrXtA/BF27t9pR5uX7FR21fsxlZngiwvNfjEjl37iL2iitxNhL+9K6l9VjZ3drf2tpqnpeAFu1xiLZU3J2+OMYrfSxefewzQglHYbAiniDaKUQhxGs9N5EqoNBQAiboGcSpoItV0A++8If14o2AZp+vgCY7/Tj7OTJH/8+Tg9KBm8ZMJTznN0W/8PwMnMnz9vQTrV/VkMlr9owS9f+zqW4YxMbk2ZB5ES/d5nosy/mJ5lPTGElKMdi6ITK3aHqiL9hayWR3ubg9bJPSZGmmPQho0SQqB7GA6NI/ZEgtWn7Z7FKIwDwWovKSss03Q7HFKVgdl3pfdFqTyViwtKBLdx3aCVfCgKEg6fVg+PW0Hxa9WaAq6NUKjxsg+GbQ2EvYWi9V2lN+GfZpFSuXjlN+Nu/b+ubHjc2PHu1f73NjxubHjc2PH58aOz40dn6CxYxSxxv94ZLxqj2/XDmKPNZgm0Ql4G/uQUEmAemkusIdrsmI/9hR4H+1u7W03AEUxffmdKGMXqHSAOgYxQ/MCQlpawXnLs0Fh38AQe4FUmHEFgRgOkrUO9YWoiRBDtNRmT1ZBB3/Xe/B3qTrkPSo/++K85QxD/X4Rl9jHneGrhOZwOg2/Qea2rGvf1y4OwF1UkmheF1nw4vzgdC1BOwsM7xBm0He1Siszw1B66M0U3f3Alo4r48KN6gJZrTL5R6fnJF4xIS8gn53nWUpVptfQb8sKyvP6vS5i/5KwnGrD0ySVC98pAe651hVTCcK5TNHike8CsIABvzg8BbqxQMDteYTCgNzOal1lSPCxkV/4dEYOtK4UFSkj51DFlBwefBoSKmGWdtdRIwBmIS8O17DuXXt9788/BfioAATLlrmRR/FEbh+PPmUfD//6/nxA3v7V7+eJSAfk7fu/ttpFDcjh6V/v2fNwdD5r73OZ0ryTB/Hkm++n8fzm9VpHfbLkYTnF3zm7/ZSVSDWlwgWqLnk18VSavHj7GYf5RKSfu1iaX1aCL0uF7FszzYmd0S79/Sesva8v2iPXDxWEL6W6BPV1eYmJQXRCxWLIIsP5guC8GJBzUF3OOiR9SHM+kUpw+qglCmkuwYxcYE13eXAvOhWl462BSh2gVYNRKjTPoIcbhKF0tmtzuDlcH75cH+2S4db+aGd/69V/Dof7w+GjV4VtXJe5LEw2WWBJo1frwz1Y0mh/e7i/ufMJS8ImVZfXbH5J86ml9dkiuYufQocHfvzggvAp61gfATtqXbPuYXt3/ji5EC0qrdTNMiv6w/i4IF9sO8/tA6n7qV4WCQjGSIEg/KBvnceNv+PpIEFwbcqdzdGnYoJ9LKWoc94+xVY9dkOEDcwYOLFb2xeCLBdY1e7OztZLj/V2OZlPWOVnWuOQAGptcWcRRbunS5qijc5NV43fHLpywovCrJniNL/EJNMlEagrQohT1fmsuqqptV/aQaWAkCaZzqNSXpO4XCbscTmjLmF00OxujS5BH4gvwaTKoXOOyOrwljB03VW1g92dnZ9+/PHV4cuj4x9/Gr7aG746Gm0eHh48jiuE0MGlc7qTZnuXRkByiF+MuMGvrK4bi/fRtY8ERPQECt9wQX6W5DUVU3IIscok52NF1Rx7HXj/6JSbWTUG1+hU5lRMN6ZyY5zL8cZUjpLR9oZW6QYGO29YxMA/yVT+x+utrZfrr7d2tjr4x5CI9cfyYWesfx0LVQcT1YPRXpWeUcWyZJrLMc2DNifYwlccrUV+DQv0Mw1QD/y3YIF2YvedqweLX91hgp5f/LVWUQfk9V/PqSA/WeOS61RGJurAmikJGKRPu+/fjPXZWPknLeVrm593HdTGFn72yr4BW7O10Met5Xu2G90t7nLVor/XV8V2UqendKhu637IQ2Qow8Pm8j5/dh/vSfv8mcm4WV9KlZpjyVBMYqJ1oBeEFltYozYoIXeimdsLSveUyfBKnB0V+htj4WcscMHSGSiIdfUyC9nJmdf2pHL3xWpdV2WZ85ALsVAPP27my8onOvSMsHuDKYVRjDaLjGGuNBNLy286beQ1ucm6DWWlMjNygG20WgCCVL/kWvb0vX0alDnF4eT8bX+728ODXpCWtYMOnN5NPKSCtrIZPFU/AMqUyctSxlEqMUOTYsoN9G8TGcmpgQ/dG5n/S1ZyKVb2yfrLrWR3tL23NRyQlZyalX2yvZPsDHdejfbI/zZvw5aoM62+t0fQp4i3wnhoQM3A57dgUQU5IVNFRZVTFacqmhmbW5bDkNlEd82HceuD6JKdK1eYGSrrYF8XMsmlVM6kHASrsFuNDsHLSTmbayzACdrcANgDCpJmJlBUIRG8DFxYu1QWwP0i9ta98R5LbaRYz9LGvig2tQJliSfrHcxw38Fa/9thH0xLOloOnt6T9beKjVn6Q19eg5df4Yu7JdjFjLlkhagxZE/5InhG18narWSYuIzR4h2OG33+n/yoNVrThAwnExYM1cAK5oqIxaVaG7UVBXl9dHBmJegBVnyts6UQ/rhfy12NKJ7aD9TTdRYXheXvXX77RsjK/1L8LcY5AJT80NOYxNHnL/7zA41LZ9hjBMizpsi6xhj8HnwwoY8lV+0wNKjPE/wwyrsY7PvM9xp6c7QzgISVNaDzUjHHrRNykGUejEkocYGhdG6I8RxqUauUah9E3AQOmTH1viFXPR9qAmpWUkWNVJ7jUt2opvNCC3qN5VIGBOsezujW5c5oc+0RqtyXTi368llFXyeh6EvmEoXzJHWjE/Av/vO9dWqgKEy7To0rHA0hd5XBpg3aUBEVyzs+PId3k7/4Q3Bnse1uXReYFMr3upuy2O6JqvhKhQbNQ61nYa0uNqgZkT+jKrulig3IDVemojkpaDrjAuJ8ZHqNV4yGcgEKkD2K/1WNmRIMKpvIjD2qB+ydMfpPIv/ftqo3N+brBubv7V7ubn8tCYuyUE6ivfOk5sXsXTK2TqRF3TON1Vc7yOqqvkv6hhGlIqfM/Hjy9rwhl2Gm11xUH3vGroGOZgojgtz3xcl78nPfnl68PX8bMPOAU2TKZPINGdIAzrduTCOQ35xBHYP1jRjVFqRv3rC2QD4b19+mcW335ls0sCO4vqaR3dS6lgTJ6i9u7FgiNfqS1t3TQ0XcW1+a+cpDdgWGjT2/iplKCe2tQpDHTh16wGB9mvU4axX1gLhOzIEOePSNmmh+S+eaVPDKAEpDusrSwelQMCq4mEKhc9fll4kbriQkdsc9PULHAYzrURjp4tpLXY0ZNcCIrtpYKB/AQnig2RYT1le2Q8ODzUXTJSD3F7eZd826LBo9vZc+4RbEBdkDZUZUGVHje8E/+sLxjlFCC6vfK5pDMncYM9LlwDygyHLdtUod/VJpphJX9d0a1SRjKc+gkZNVR4GUauYu7fOtzZc6mdCC58u6/n17TnB88sJf0iiWQZnejI05FQMyUYyNdTYgt6gOdxNP8MkO3FX+hCVsv1oiUMfcwV1vZmWH7FBMYLxD5aWpxfcb+S96w9rYinrXLGGX22vA2QLYYG4reusK93cg3062k+H6aLS5DjY5T9vQP60C9a3tdVwxwaHsrs397zZmvLfzS+2sn8+dZ6v3ST0g1bgSprrvDFN1yztneLnJ1R3gF6XH0TAZbSejBrRLK7Pumrm2xIq14A9zWWXBGPd+grqZltNqMOULGvZemc2kYBmviitomnBTtLqmNTwBwSc0AM9w7ZrwydLxFXyth4QR+/SRVpXxcsEyKHcFtJ5jU/RakwtFpNHN3ty2rc2d5vRWPn6tCxfIX1zmfQusDvLzlrQ4a1o2EwCTLgBWDD9xxN1X4892wasa1DIvhieE3lCe03FPUZCDfMyUIcdcaMNazA1wg7dB3++NX7TIb/ryL4LzS98DtoBYZrENhyngO3ADB20WFIZeNXj5BGwKZFCCUCHFvOB/RAYIojB8fB8abV3BKnh2ZSkFP3jrG+2fVIoJ7lW7wLXIXL/hMKwv/dVDVEsxzbuk5HYLpuwC8XTW5FfjaOczqXzJCSgVXnv+60U3il+N2+3H4Tkl86Xlxoc6/ECQMJP3VkIBtGazsxbAq/9cueZjKuglzQouVgZkRbFSKqv2XdoBH6xgH3xcxjQiSX65uDiDz3ffLP7k7+dDcKN9KfRegjbe6KaqVO7bzGiGPeZMREt2O1TuV+raUy4eU+JfGMtsnsTlAR/ZgS5+tUlGcX2PFpgEZm3vy97ey7tBdJXsvgON4cJ5cXDj78XILyzPJbmVKs/6MbOEfbuQWHT8nt17YYEF7jxj1JoZXdtttL3Vv5kFMzO5LMG/2kApThXJpDPFJfTJOz48J6NkNxm64pl5Lm+tzTeteAaFGW5p6L6S7dcDrMDe1Z2fSFFp6IUf9X00MsS2YL+e3yum5tZkXGn4deWkBgNde2F2uPkoFXONglhKK8cUQk9O3yS8UTAT1uvr6ftOlyCsCwot2w2DNrcJIW8bA/my4QUVWaN5KhcA5GYyTIadC5Kfjy8G5Oztuf33vf1Hnl/07jn0oVVLC25/54avuyPFZNAhTZ80Ns7ltNEfqQW7LqXQ7IszSJx2UQ4ZA/n9ssj7cHI3j/S4+dJM0kH7aVzSAY39KnquFz+/M2wTp66rR+8t4/awGSWzXNcbwHWXL3MErrW6NrRhakJdHpBTvk4aX94fyhsGiMN5fYq3YqlUGeFiqpjGMEmGfzbnJQ1jBSqVoR6Jty1U+PaZqt2qlChZQQ3UXNKMjGlu2b5aC6MGVxv7GIo6h7FmVGS5lVY09CpLpRCBtZ+411FCuDGp7zAYhqlRgMD5sTQTWirXYLmkgtgVrWFp/xiOxOGnBxU9AW+LK6Y053RZZkMgEZwFr5bqHaudAoOesAG/e7Vw9M13XUofOEQtKjnUsRgQWRn3hyJZ8QfYUinYuB4MQYs+Z7J78X4j5AtEUdf4OjlqI6tB3jW2zk/fnHXOCSEnRz3cb+G6HUv0wJzEe8HupohuNWozewD+OpFnGvOp1+7jPdGnR53A0NDq1rfuKlg6o4LrgkT9vKAsqYU+SpFj9tc6GNUyunq3HgxI7UznxvW8Ejv9+CaJYf7I+m46DbFrcpgIe0j7MeE+Om6u/JerxkL8W3VR+J5u3K0VCmlgESyLx/9L6LQ5rgxR1F1d+I6cfwFfFRfuTsOqwIi+R4S8Qs3Kp6082aqi2a7NbREL9Qwb3UgLBqHCrevhcDDvK969UNHu+ojHDbdvqRarqwZaCWKoMg3wDUgmsQu3o757W5pu3FC1kcvpxqQSUOJUJ/5ALcA54rK9T3oHFwwou6oQIee3od2D1uGm2dMIMeXMTO0Q5IZSoE1XVskMrclNq4IOSGPhuiZNJatbscMgeJ0H5yNqfw67ggdobt+uL/t85/OyMvGpCmfacp/QmR3aO6Di0OoLvxYt+xy6DuNOIuu5uqVKXA3IFVPK/ofDP7XuQPOefunQmLC5rfZEqyXs60UzVtFN5CQ6tMrCbhWoa9WtFStgNvHBikdJc6p9hA0X3HDvKwgzgI7g29OStNJGFv0hG1JNfflMLPycjKU02ihaJj/6vxrIQqcBlCZPcr5Q23YrwGsEdzBkR/HFdeJCqs6j70NQHNlB+Aku3vkvYhdD68i0Vru9eedSlhkh2yaDp1pd+L5uAGcaHbQsWwxphb4hYMzcMXYL7mhSg+/Vk/W/YscFthBEUs8ZC6ST/Ive0F6kVyJdYpmMDsrddK6T3kxmHSw/QDvcl7xoLoQuRR54VtDw0lnYCqYhoBIus3wwqo/ki58I24j19oguc24wx8iQqmw0aS+pMnGg8wlGEyroAIPawJUb1t8hIPLiuEPssg4FqDIYsdlKncXADWI6bSzDL3bQWVDiAh3DmFAln+ZWJ5hjR3rsSZM6A4pixQWMS2EilaCtSEUEuwWeY5XzQt6wJslD/8yqbIN8Z/t87CuXsY8sg13JZHrpQmitiMq4puOcZURLi/mUgsgcM3DkxiGXYx9/Ba5gx7wVM4qzUHHi6hLZRM+JO2clGb0iw739zd390RAD2yFg5c2c1CpOp0RcSKUDubvAacTu53edOSe+Q7PKWDkZ+F6kQalDdaDgJmZyN5y6YRJyljOqGdGMkXc/HWqys725bbdwa7S7nfTAn0xoynNu5skyfF2r0QpdxTbiJ+zoa+3QjbC+gzSVCjVnGa3K0o5d1iCuD1f7PqjwYpSMmbllTJBhGNK+u7nVJYrNrXtxtESZF2HKqp7rY2pNvIWR1VoHEPPLvrWUiku1WPGox211a5v9PF2C/sQtZvWQXJM98pcaOf8ZtN+kyXNCAUL7vkK+Hvq3Q6yFY8WOegKhwMyjV6OeLgdbO31oDQA8/hg9eGKC1r/wiWnYgk5RgsKS0IIkYhix+VNnqrcnrjkNYKntTT05Ol8bxJaONVU6wLuTOZUW8c7Q9z9eJfeCbg0nEBvecLLAasNFaiL7zBpQVgrIEi2ZvIY7lSU6k1rGUi8onS3v5Qlhw5etB39tYggTNnMTFiICcKDfQQGRofwVNz+Cotvt3tm9wQ2KLvrYmXgaffVAeQjv4G/mtONNQ1FUwqlh6FKSN9D316qMtE6gJ6iM4ThxTrpu+OncE5+UAe9H9wExbliqtUx5/aLVXW/q4OGFLhZqy31Zx+UALZgpv2EC65bFszrfTqmkkanMnfvAG/1qzI2iikeEg804rRTGi20x1agbF9DTh6kbnjI9AEWU5lrCZHM0AOqH9fW8jNw8PP19YCUXG0t5PSDm1upyygFzG/fXtBaH5qZy2nndBfqGiSwU9iDYZwVgqYuuWSmUhSJrWHwt2MwbGdOGnJxh4xU9gCsmPSDRmLdcsVClLpKpnxF+ARVjMZs9rcK1TRhb4wUaWTnx1zqWOR0fnvd0GqK8aJBWzxVzx6p8zPXyKt4v470y9hpjSuGOjKU9NxBpa7elyWevEMF4530FSsSVRba1l7kU4XvFyLWQt2JArvxhdT+hqsLrndBV0SORdvcaCHAcxMwvl3YXFTWG845+AdnLfnHk5Awvax01UU1uWZ47JhfW449fnQ7c5H9RLW9ipMzX6VRIbazkM1RkVAGN+e67YdhJ3uxv3t/ILSpUbAkk59OZ2QjIW+fZuhUyPUrf/uztf+rT7V/+883PO2/+sbE3O1H/ffZ7uv3b3/4Y/rWxFYE0luDlWDnyg3vp79m1UXQy4WnyQbzzZZ1ZRmqrev+DIB8Ccj6QvxAuxrIS2QdByF+IrEz0ibv+Z/jJUlD9qRJAuB/EB/HrjIl4zIKWpT2zIBi0v3WwwssZM4UU3EgFLS/wcn3QdwcRjxk4FxS90AQKAtjF33B2myAMd0zsUSMVKZniBTNMISANoBeDqQakAYH9L6g8brJ45DBpstL1jAG2G3QzkeqWqoxll5+T3Vs3jMKroshRGv3k/GSlkh+7AT2jV5vJKBklTc8vp4Iut0bqycHpATnz3OEULbcXD3bJ9vxkHYHrfoH9stdqJfPc8RGQV7krOevf0o7/0JxPheNgoPGcMvNTLm+Bw2n4y8UQh3FzOfWXDD5esG9N3YYETUSLxbop3+1VcjppAiPF9840yxzLzbANpuWkXv7c5FS4h2Pvni8BgR5JGBIag//99cEpktjv61ys/45fGIrX1VwTV/8sIQe5VQiiRAUEyN9xEjtxwtEVCH+721CAPoKqdbFsxUetrlhANBOZu4W3vBC3Lbhs94abyeh3wkRKS13lTqmySmIr9KZl4fzG2PWA/MoV0zOqrpO1gPKHokLsAhK3uiWdGUB6NzakESfUOd8Lh31EK1iikfvWWWy4mLuiQO5cziNjdZadTIS2x3hOJGSySgU05pRbXZdg8ceuvZyfIXT6Vz7hDbBLml4z8wgdt0+fdYN8kkbr3u3RaetferRa/2Nt/jj9tl+v3WwGPHqmvARVavX1S88oa5UUOQ/7mIDCOCA5MOx/0dQaaiG2JhiQ355hFBJiQpiwh3oZKDx3Z9VvdqQjoFEMWZbUF5G0S/wvnCc+hsTrsjWGczq3sr/KygExaTkgvLzZXedpUQ4IM2my9u1h3qQtxC8p99xFl749PyFvZMZy1FFv4xxxT9avLRYTi7ttxGDkhCg1Swek5AUg9NtDpwW6gc8/sxz9HiRouMN3o8DTzgn6Nv7uvqKeUchqu7InOHdp7nnJILQOxmo6Hd9hxsDhVbcFMyw1Az8+hvNgbOSDI643FXlnRVo5VzCjeKqbDQ9CPYYQJ+RreeKgkEIE2bpuqRBmEoogQLbttFL1vkuiKrE4AoiWE2OnS3z9qHZtUe+U1wNyy8Zg5nGmB9auVxVU0wipSBulgvXCuL7OkdeHa9v4B3+CrYLsho1BimaES+xcarAAOkNbrB6cvXGoCW23LmL6jNzWFPOi7vBaO7nhQ8b5hFARGocB1nGdOtCF9pGySBu6Vv7vwTeswo2KwTCKpwl54wJLfq9YhQOT44vXUJoWWtbp4OEqlUyZ1pGLIgwTiigrBnccUQ9Gjw/tssAe4WpncWbApxmR/kwnLvViJtFoq7MMwLkdhdKjwW7RAHUYAtu33A83/g8pmkntRhKMzeOTuc/x8J4sQs4xY4KqouE7quWJ8263DbhW7oS//cAUCmuZ35FC4QK4DJtKxf9gAZJF2TwuIAkoSZ5TKR5tnnVw+N3nVnRW/OdMtugs6M+ssMVL+JPrbZ1FWSa8LAeIY8PA5+Uk3CoEj9w9qyNGhgMV82BIO6nvmKhiECLnhIUf2XUaOHEXFwNy7C4tajF09Oa3Afnl3YC8ZlP7hLUj2xg9w66uOMzizfmeS2Y/l8x+PEi9G/pcMvu5ZPZzyezvr2R2u2J2U6jXFy5PaLj5/PnlW25+pj+v6eZGe7bdyOekwXeQ+N0bb90l/9mtN7+iP7P51ljDd2O/+VV9QQOOi1QWcUjFpxlwdWEAiqM2jbfEs6uO8QZGWxj1AePt6M1vC6Py0yKs6giqutxQvyBfTiuFNweHdwPQmH+ZqvhhnRzdRULYrDqIEx4Eb7yLTo7Ds8ObjWDsGcvLSZXHJa5rcTepY3rCtUO4CqCY1MjyuqIQZlrGzdGbEQ5CxvnekKDIWMYyp+VjxiXClbOJIawozbwnRPQSwunOf25sxHOzBvfDt1bA/7lZw3OzhudmDU8M/Oc0ayiVzKr0CasndrJr3Qx3SK4WiHpzOGzAp5niNF9uCLS33d1kzjJvqhZLa2oxc10p2vXuwAVPDSUQ+wDq4ETJohn9plx/rKgRcQitrkeal0wnfVVpfPC7uqrVvSsv3aFETabhPyX8ByQt/CHznEEhG/Qf2L/q8IKelL6G9VzXVYzyqZ4SqX+HgRcjuPN5QYVpeaR6z+/TtGz1mxIxxLpOR60rwbs+zqf9/QMZj/E4PqaDCcXTGRIUBHM0Cs6HNMRUFiUVXmuyaiA4TRvE2MpJjFMgdSgsaVVJSA6lSlExhcicCc8Ncy5dqOntlUSo9QDBuwIe9IpmAKNez2NKkX2FRgtNdZcszTT4eqI+pi2vrtWSr0G2QUydg5h6gHQvILzS04+vENBPprIlARcvs/mntAqeTYIWju42Cf7E9sD3wiGe2Bj4E1sC37wZEKe5+FJcjnufRV/dy7RrmX83zwYZrw3Nsb4UxtH6WT18J6ausAXno90WB4fyrw3CbRYSWMQ4NP8jHhVqBIShHSA4pgtprcfCNioqXG0/ooDznb3+n2zH3Z48us3/uOJ5drlcalw9cMmNvbtmTz1AUW/TxGU2OrIIfCZQRfgmqqQbMjxTWRTckPNfDjAUQWA8OYOEZz9ET/7+ZHvyku29yrLd0Xj4am9vPNpkbDgcjl/tvdrd3dt9+XI0TLMfHmB5If9/xtJrXS2LNx264TvI8isEvfOGqVBMrpvkujfe2nyV0Vd7r7bY1vbw1av0ZbZHs510/Cp9td20taPJl7Sio2YICWRDN7lAgPxtyUQom6PkVNECjOCcimll126kIykNV7EbiuWcjnO2wSYTnvI6eJzUoftN+wDRealT2bbtn/DyMIOtEVMyk7fxgqGsXNhRF0lXaabWIW5lQKa5HNO8gxf8um8hbBF7J6Omv/eEZXyQz9sLXxNzOU+Z0Eu76niNw7vK1Zja3cacP+zN3muEEh36eDmcQmCSGzE22ZQsyPnZ0X8TP91rrg2We6mZkdSaj3NWJ8TrMvsIyfBuSL2x1uUzByVNZywMvJkMl6jp9YqIaIqacmRTsVpeke4zamZR4Ry/b7xDUHHB60qrDSD9jUOW51RtTOXGKBltJq/aLWqgQla6LBT+IgsLMvoswmTk/bvX4brLazDQsoLrWiXhdSXRu4sEhqoo0vIyS0yLyhur2Cyw6kcVEPQU0+jq0pUjm5tbD3X5fcL6a84h2tUF4LrShSd5fTMmMSwEPy/ZwJe3NzPafKSggtZFnonLPvY5XftElcWAZOX1dEDGit0OiLBfTFkxIKKCr/9FVffMq7JYdBuXq4n5DW3OEreU2Uxexcp/U+8/Jr9A355P0fx/ReOInEllLOmT448srfDPF2fHa6Hc6jelVh+evW9MQwxVU2aCUw/qR3fU7N3thbXEhlN1KeFJ0NIMp2m4vbHvgG/pRqiBp3jOoKVA1wCHAmtyYsihVKVUzczPB5a5fO0xLDXrqpGPXOkZjcO1H1iZHXvJ5lNYWss+euSydpOt5NXucJiMXm6PdhZdHy/KZXbbrSuYgRFTQKEyLEF2duyqux8IDwVZX4cuJPAYieAi9hcXEeLzjydcTJkqFReGjLmgijNsAULoxDAFPa0sutAWDd3aU5mx9bhHBnHFObzZqrFot0zTSimrnaMSivn+6QxuNKDImVE0mL0APdb+erAi2u3tbTLhirE5NuEb53K6YWaKUbOuGHY42NgcjrY3hqMNo2h6zcV0vaC51TvWETnrdkIupsnMFHlXIA3T3b3hVrrNXm1ujuwfWUp3Xu1uUZpt7WbZZFHq8JXOL+EYLDvQ0iLyczjY+dnByelFcvzfx4uub7k34GFRfdfgj1zcSuDPHz4eHHtpC3+3L1tW7l99tPbUh3N7BSD66v6LxoU8f36K/mtCe5zDVWHdgdslaTcbzUH9Uz8c4dlGRIpRq51QhR9ulK789CV04p4YJog2dK59uzmcinCjWT4hVITdtasqObIZ+yDa3b4sHVxPILh1Sshi+sx0WfHtq6E9tEcSVVMoCKIHdtHQ6RnxaBdEx1rmlWG+mVLNCmeMsKC4RazsDbZYxXtcxEyppNWaII+AQzf8aM86PMl9XEdjb8zFhg7sfZ2s5+HPSgcFfZ2Mhon9v9FuB5GXkDP2OIuo5WpgYmqCbPLEYseGm+t5fzeFWgr5cElfjMWVPbQosJ/GVXrNDKGC5nPNNZGCzORtGLKw+lrYJHJrDebADaDzNVXxGSJvQIyEF1zP26jXBHf+JtQgdKVLnnJZ6brTdkdOPEKPzdil5lNBwfHMPnL9YGmssZQ5o6IP9z/iT3H7Fj6Bjo1uhricXRvoVaMq9kC78jshx+afSzuFDznCU6YMemx9H9KeAN6ItnwzulTNSyOnipYznmJ3KF0f53jUG5rzLM69gyZ1lTZ+PquV3DBSibrEh2t54V+tX/HZpvX4YdhbqkklwAvOenqYHb979/bd5fvTi3fvzy+Ojy7fvX178albVkHm1bIy1s5x+IZwhutnqEStntROaq0MkLyQ6/aes7R6bqRi2tXzqje6Z/Os+srjWOy/2x1H3aF+/a73PMuxegpUarHKMRVZs0uba9+PbhpIImtUkxnPocSwxvB04Ewsn+NtCjrYkEo7BPVZpx4o+zPR3M+zIDqKTzk2R464F17NWM1uSrnQpiFiwV6ZE9e+umkxdM8mbezFAwfvsXgqCiqyywWbpH2dAISeJpAObmzLBqQE8tI1yHIysx1f4rWeMFfcSrLWepCoaZ7X0rbd4K8jhj9dL2roQ2QdinSrlt6zSKkJCNZbYi3yuwPf2lo+at/NHElkKijeXC/TOp8JowLhug+LGOo4XLUWZBNyCzktjYr9cNMAmeUeEIywgcPz/v3J0cCaRYUU3rohP78/OdKDWD7SqM56YY+fXWo+DyXPsVR1KDIFt87dVR9KoY2qUoOdqtFoyOduuBhzkKRjSVgKUirLBFO40yy44dNYyJ6dHBHFKs0apd3rWuy+itsEuv/g8qCPhbUhB4RaUaXbMZXEpwdb7Eltephtuplu7+xkryavXm293Fn4Trw+Q98sL1k8mOmgZSPFtN6wke45zy3scPMJ7e27Qb52IFRRmrZLXRIBS/kza4hEBdV6q6dG3bvGVt12Qi1El9eT+fOOXVCwVHPsRLD/Ay7ccys6cl3/FyAiexSTIttZEiN7c7SDU3Qn1TM6WtKs578cjO6ZdnNnd3kTb+7s3jP1zmhzeVPvjDZ7pv5Ooh1XvUDBONWGhgBdm0nqInYwhMVZGIpoXvC87x6xzTFKquyxffYbfabfaBFPcI3qZ8/Sl/QsOcT/eR1M/Qt49jN9+36mO3bu+3E39S/w2eu0LK9TP76fnU8PoevZB/Vd+KDcfj67op5dUV/dFeVp8dv3SC3H6fQYFD27pRbH1hf1Tj0SrC/nv3o8YF/Qw/V44L6gD2xx4L5pL9kXcoQtjq2SJd9BuHi9mH+TwPF6wd9vCHm9xu89mLxe6XNY+XNY+SJ08t0HmIeV/juGmnfxMF3IK/CoJMaT2ph164Uo7OhOi+mGGTVmdnxrvD5WJSvb0N/XDnaB9MsQz94tF7O5vflY4DrQPUWCqB3aY26VlP2gjh4JKphjC8B6Z8L6jGG1jnhbnfOte5uzORztrg931je3LoZ7+8Od/a3tZG9n67fH+imBl2aLVeh+FJYvYGBycvQUZOCgXCIrdeD2VmfC2dcXrhvugebmz+KhCcYOwNzyXVhahO8H6L5D6yeUSaY6UCtmHh9SgSVqxoxkfAL55mY/DBkVYyaUjJW81VCp0gAL5sYB4f1E0HmSThkBFUOYHFpii8hRv+h+VKWF/HF03rR7WSpF1uS7oR9nVXbrEm1tPlbLvJXKajCX2EZbqie0lZZJP5ZMHOgkgN4OFWijZ2MmC7ZBc56yhbH0fRjE/z6W8HdtAv8b2L7PRi95NnrvJ5Dv3tr9tzdzv0X7NgD35a3XMPXXtk1DFaVvyPIMGuVXtCtbMHwLVmMA6Zu2CT8hTPzPZzB6/Hw9c9BD8Ocx9hYnjCewBOu6eFOujcOKK+bxLv7u7moeP2E1Dqy+Acqgr+TlB/Al16XQi9fugkpfUE9uWerwW6dMYdU6cqu4MczVChlTzXa3CROpzKAMcticn6QKC1TdBdbVgM+Z+bvVQY8/QijeOzb9W8XU3H03aIafQj0QXSKNyzqSDDoDY3TZVV5e2u+ukhB/LX0zu3FlvN5SjzlmxqveN0zRMc+5mQMsdWxMHalpT/67458vfzw5PXj3D1w5y7wa3VFqf/vbj9XB4fDg73/78eLg4OAAPuP//rqosgNbjNLnoUj9T+t6hgGqWJnUbi/Uu4b5XF+TelvPAiKoJpZHQlpL35uwL26PPAEkQBYaOqiGId3zgUhgSvLCIvn8twEg+/i/zw5Ojy7Pf1tDeoijlgIM3NSWlxTMV+bGKdnvFRMptpZzEwIB29HfvH99cQJzwdh+uDwn4xrKG6qg8i3JIecEhxUVtP+GtdYUbcc8+vXtuyMk6OOfL/9mPzVAj6gvIq6QAJCxlBc0J4q53Ak0CF+wZEquVkYrVz0xVqv/XDnc/6AM/aBYdmlM+WHMxYdiTssyYR/Zyv8s7JwEgltSM55zQ0VGVdbcbxSojov4iGndXiGSxKKrmPGbZSzgYDxW7AZ7s4BV5F1wdr6OGPnlv16/WRTgazZfAry/8Bu2jkWUbly4o5zYkboy7/ztTxe/Hrw7/lBbbJ6Fn158OETd5e/o8/lwUliF5iceKlBaAsW2ofrDLRcWUEt3C5t0nVK5T7J8iCC3Y8cB4narBnY4OKHAu/s27sNnIyQc8x7EfDhi42paV0l9uKRpBOdToug0su1hDi/ju31IF4K4VpaAqzV1pfqrewufhWQ9zYwV4QWjwoAHjaZWQFPDSMlvJAZeK1mJjFBScpbapXj4oAqq+wCx/PCAxk6tdTqXc9JpqyRDIoyYkzKn9klsnnR8eO5CaMlFDIIbGt1f0D0MeUExwOZLtXSSE0gygClQV3CykatIqantS1w8F+TKYTG5Cis5sAwyVcyEgHmLobiDq/f/ee8j1PieSW0GoUnXwEff1xRhXLTwgKQ5Z8IMiH8U+qdjA93E9zPLLnmZkJMJdqAqS+byKE7OPN82soael1cDLECHlYKFQxpgjLq+qSdnxCh+w2mezwdESFJQUM3ieuHcwGQUvJzjeZ26GU21P3q1mQyTzWS0c/WIsnFL9Ckf5DnKCKpnTCMZSGERojxhOc0K81c8+UOj1pqLVBrNS8gurfHnRg2F/rggmpvKeYaxRvhcVqvKkoKuFIOkitrecoARmk+l4mZWWHp6gblfTLGJhDcsQVmWCUIvALC2cGwH5B0sEb92fDuTrv3m9qsoCaMf8cftLrzR8ygyGPnpb0enekAyWVCOPbnsGZPqWpu6TZeGNvTQ976u7v3ohs29OOlv2mxX7fj2yVnv4preBb207o6eviGfCTfhLmgeFhuV2wwvM/znewSGfcbXuwzdkaMcPnD0uKwZTOYR87p5Y2iQSKfWDrIAuAxGn1ZEaM6UiShLSKy4DQurDSRf4dxOEaU4udHwOsar+2gZRYA7Ytv3rNYDlRVcwzWb1YuVzEP7JD3wj1rAgNhPjs43Ts7O6x9CH+kBuWVjP2SJKZ7YvDA8UKncJbfpAWEiA6uaZMywFNOehVXbraTSjLw4Pnq35toihdQqZtLH1OmszKzdnPLpGr5Dd4q4WSAcz1KzKpNiHhq+IBBwcuEvyzAlSRWjJuqYE/bKU1agDGDWDfruVFQ4N1Stv64X8HC1MGwyv6y7+IO6iz3SAGp9bihcosvTc70pUfB4JASsWOFTk4fP9+tFBjkwhhWltZpOItXrNaPXC5ulS7+2vwDTu3NjDxvvNtzjoX+RP+YyvSaK/V4xbUDFK6txzlNydHqOWXq/XFycnZMNcvH6HJJHZSpzvbCsWFaq5wGu8eQIGRXXPoPxlpuZq+ILLXyQdyKjjJTJ2vHiGWQv4TyKYEbDhcMdl9srJ7aP8jva5tzNGwJqMG/O2jI0Y/e0LnGNbXxDmwWWv9TbJNa4+4V1gg/PZ8Evdi5evz38r8uj0/NLewguL16fL7q2ZXeiWX3X6D5jpLWi7q/5Ee912N1eeRB+tWi0w1sVHaWq84xif+bVVU0ymVZ17nRzNrCz7MlcXa3pSUhTU9HAWgVpdGlFSc7FNawHgzl8uz+4h0IUjL2xUYs51xQG1J2ui9FHgzCR3PJrXrKMU2jUZD9tfNL2Wl2LLSuM4bRFuZqZASllztP5AHUT1AnwhttLXWs/wcl+lPTHpNuC1W3NY8+a83penjmWf/kT6lmL4qmqvhHeDw4ZqUJsRMARiARdywS0hiJhwJleSBw0GWZXLIyGQ/z/i+JuucFwF1FD3Q2i2A3XbdVhzOyqgXbA3eHqSXWXljywphBdARiOjaTz+pt7zKQD95zdZN/Knmp3RQMeKPubIDSYD6kUwm3PJKjqaPQQxaZUgT9VMzBQ9CB6Hvd/zPHGFfnpJJe3cNGmstpm+kkqcnF45kYdIL0FMBG2lPGbOi6HC244zcn5P06h4xQzL/Sa+9ENagesYcHbGqTFoHS1Z3IMMp938PFDzQU8XiD8jrrBwbXoLCFCU1NhDQjXRtMwVZCVMN6K5R8g1aJhPRSiBbhOgL7cz85OdMyb+c6qtbBwI7petdSVpdCtKeJ1OB/IeWMCtKBhFW7EqFINmKH/qgQSBdxYobvQvd03WI1aIU1nyAmwYLuNGOPYNqoPcfgNv4TmpRj6vWiWEc0KKgxP8f7oI8hYKgj7iAGQgwZT59g/f1Ll9rEbbpfL/2D1lbJdKFPQcqN2pnmHpwpzTKzp7McUyEK9IEGPp7ur1IbnOWHof8MqNth401rVkfcVEDbhUatJWpZKlopTw/L5Y8xrdAcvS3ECqkfR5zYm+J9hDYHBFGM+rWSl8zlSM7wTuDxctOqQwZ5zDb2MT84GhHqHG/iIK8E/Ei0tnSSE/KPGLM1v6Vyjx70psumth8nT/VXivrhClDV1NGG1qPpuOat8JSzwZSe8vLKgXCUI1tWAZKxk4LYn0ukMRIrIlWjFaSvGh+pEVFZJWGBf7grzcYV5cBxCc+ikXLdRoZWRQhay0r53P+C9/joA6NuH40AvDs5P1zqlcCBEmaaz2teEqMQYUdYjoXdGu6/aa44dMd92yYXFA4veRmvqD7j7Wcppzsjr14cNfPTE6ywSIxq/1qzCCJE5UL4FuvRE/N6RBLLo7lbtNbtYI2E/ANknXfsjNDh+0y09ZTJJuZkvqxDgITfz/t15I4VRrNXoF8CRwnDBxNKKE542ihK6yTrwnUplZuQAYkxoD5CVMGp+ybXsKSv0NKjDKcjJ+VvIQfj/2Hv75TZuZUH8//sUKKXuT9b5USNS3/at7ClZkhNVLFs3kpNz78kpCZwBSURDYDLAiGa2tmpfY19vn2QLjY/BfJFDirRkR6lTp6zhDNDdaDS6G/1RgfD0pBGsda2mAal2QU8xw1GVUrbR/BxwhoTfgnFeN+97zoZUZpE+r2Ms4Y9qKPL/RBsxZxtv0PbRXnDY2z/e63bQRozlxhu0fxAcdA9e947R/9qsALlGJ87mJ0HSbXselxyc2PXh7yCsXQ5aC+MDNEwxy2Kc+uVH5YhMUQjV15TaWSiGZs5NWXQa0VRrVCFh+moBkghirgOo+iTNC1dZ1TY/oTR4MUpGU0HVP7RjsYNCu6398LQPXCo6qRe1Bg4Kqzr4xnBADgm32Fa9G30uJGfbUVhZm5QMKWfr3Gk/wwyzNtr2f542wbWmrWZgqt1p/5mRPikSqnyRWYGh/hIzj1twrZ/1WfHq4uphX+lbF1cPh1vFM2OMwzUgfHlyWg9Luay6DB5xa7t5o2xHY01Beomv/fexYtoPJzfOqDal1qhRt/KNyFGS0gcsCTq7/O8tT5EtbgAw0WKOI9THMWYhbEHv1o+nKOWZ2pklTVXhmfBWaRwLpUv4BICkuedLAm2WLqCqVbpEE7mcYlbK66kswyNzigzZm1hcB2eSlES3dSrhCruQQ+DkcESE9Ca1NNJzdwCRJCGRAznrW03SLfm7PCWj4wUdw3DGjBzwFG0MOA/Me0HIxxuICrThPygX8NaXoyaUKiK6rCIUWSMhFcpQMm0zwXSN6b1JWtIXfyIbDOhnNyK882okZfJmZ0e/ot9QBtJWgG50MJPk2ur/TMfOy9yfIkHHSTxFEt/n66pN3RgLieSEoxj3SSy0Vc24hCAVXUZUYX/z/ky4OOWNkAfZ/Ub1IPSoUeAKyZNb4IAvwBRkMCBQPlrNajQSs4yvyM37s62Ovuq4Z3zCrI+rABYytO9YNyLQKME553vhPEGVf8rzumG95B9FImCgr5txgGmaeCZfiXbcA88LfJMJkgbrZRnfoMpzfFxIknc3g/igSWpght6fnVyp4+BEY3zmhvJ5ZbOKHRljGq8JOaW9I5jAaifVuK5gkMXxijOdn8yvohDeFEihBNOBfTDjwjzuk1Sic8qEJIbFCrQBN+mTMaC+KVs7B2ok13ZL2FwL3NwEmotCcCju2Ai1GkbVcK7R2vVXQk9WBWKd5SMMpUDuQFit5F7bbT+kQMc+awHFEGacTcf0Ty/qTJPQ/flJ9xGhA3QHWEC77dT8obC7c13CQ84Geq3KYQwMGuDk9zDI1qeoY6q5meyrYSWzWjBlFYjVmbdPJtGuR0rhZqYcb8yHlFWR9kQaBpFWJUXK47UleroOVcCQMJN1CEEmvoG3/lZ+858b97SPGb7F0ZiyjQ7aSImyWigb3qoB56af+XfbtvySd7ltH81ul2+/rlyVSv83He4JBlkewRVhiQ2EEyxQyOOYhFBtwDwtNNV3DfUHlEV6U7ktHvOhMHvbVeq3c0O+kY4WWOAmjyQjMiYpjtfY7OHczlHZmFQ48F/RAeRW6rZRW5VeRxFsEzC89aWrsA0JUgLVG4Tu9nBnBgQRFnEilN5ZVSWP8f7goNsdFIixFplU0+vCRXAwpmMcNMQ6FCvnJiqg/ElKhSe4+UBnETEeEePwLKCc3zG6EgTAMKCAR6TaRMolI1caVfjAmJTnMb4nAlGJEi4E7es6BI4/c5NC8aliyDGRKQ01z0LmbIlri7k4asMoK4qGWYxTgNcNScZU2sYs5Ri4D1yai2+qk4YYMX3SCMk/EHpfFsCAyHZeIHsecepdsevYda2KYInu1HfmXFTHJPypqA+KIq5pqxPtHZED0h+QLiaH4f7ro92oT14Pur2jfdw73Dvq9493948GhwV+XJP3taBRWmbTkQmedAJqlQINWc2H0MzB7EyQ75BxZfgFxzGf6OWPqJAp7Wd+7LsZwyQxpBmkddgGIzqtp6jjaO+LjRcREkPmNbj18h3C3DWBB/6FfhpiARicK+uUhibVqbCLrLoDBa6M0qP9aZmQ7nIdecb9W4KlqBtEm8jmWIIuLYkrD+FeVQt5lytmOj1voDYGkNvvcVPjUPHx2DbbrchEPCJrvQKy3IQdS8CUJTnjcYKccC2LHCupEezHVipatV/9BtvUC4n1S6dAvjSEIeh8so63CBZ1JxbzG5y+7czjBjXHiYPM5g7a0drxUkkkeyBUOaoEgHpXr7kXH1lkVMODgQJBTW9z8Ao7mRPBNjdz/RIKuJn74JAkUiPnZtMQA4mtGmmANBlXfqm5XI/lsKMpG2ZUjNyq5ZsStrQ6L1CWFI56c85xoUBFvrlgCmgYujAirHveiYR8+JIUKnJNLmAs92yhbS0VHI0NUmPMdFCdIDVqgp1vu2v+6xUltPBydVd6F60TwPX4JVyLdsyaiimAymtjthc+J+DDUoFCbczX6LMFPcGd0J5ibjHxJjm3C3Qx0IPw1I2BU1KCrrxDG0TvxGpOdwWpejdH6haWozYieDUr8kuxJKZdEBdWWLAtqquSy2DJUcz5vTLBsMklJFK3XCzZFl4VTifdq9TYC3aDfd/OgujDgpmVP5lhZem35sei2vBG3TkNbsJ2iiphcSQv6HROuKl/V2hiTp9lUKQJ73wJinwJinwJinwmQZF6T9rSYbkgecLISA3SS2TkS2TkakB6iYxsT7OXyMiXyMivKTJSnxXPIzISYFlzZKRBeE5EII5NGF2+FbkLFqyNCvQy7JBMMVhQbPjsoyQbyRE8kh7PMEqyvab2BUMla3j+yUMlff3xJVTyJVTyJVTyJVTyJVTyJVTyJVTyJVTyJVTyJVTyJVTyWw2V1P3X4F1zhXeTP2m+wtswrUjUZouxEHQwtbFXGIo4Q6lTHIZcV/eBGmJ6LiTxZ874ePqbgfA3p+QohC8vbn4+Ryc3N//f6U/Q4GuQ4jGBstG/sUL8JBQ54SkQsABJPrCBAyxC7Crd0tTVVNUm78XZdQd9+OHdrx2oPrplwzIwCvl4rGStATnIh4bbb0AokDiUNAz+BhC5KuN+3Vhlcxnt1lUIMwusx8jH1RD9tkHHCQ7lbxtbQWEqEo5gPwd/88lQmRSuzPJB7ykDaw6UVRyOoEKXK9EJrkGpb5P1PB1YsDDk4ySmQodNDTmONXT5uL9teCVemRJ+fGCvjxXouhlbmztVt8pf4JgyfOimzFsrZqnulWhLm2p/tOWrgiavFx1+d4vi4j1hLzpqBuidm8qMRQs+c2TNFtcQD4LJoKgZG7oCuYgoG0d3TpGIsqEy45Ww0H4VIlMuEm08xB6weDjU6NmaSCVh4u+4ogGq+XptSs6GYmyq3QyamgWetMT7L1PyPRME4Yp8+M0h+psZpVMwGdEr8jlwVQexlDi8D8ZUpgSqDupPxM7NSbe7391BWxtl8uhf6gizRq1qo8CvNjqnLZF8mlTk6eOJVKWRFlZ1NFp37U3gITcJlJ9+RpTyh69Sre0oRbq6E+CL7Esn2h67Ne1Ai5HTfiV2bnr7r1/XsB48b6DQN2KgbxQishdeEX8ZfO5e14qcW5XgzKkEfvZNdZmeSEa0JqRPwCqXr4qQy8qK8ji+cm/KClrN3tTUXaTBIIYq434ZzIIOPuBhJqw3Iq/ZawtkIioFiQegJVFoyAVFPOMpwg+cQr+C7YgkcuQKmuYqlAbhc3DQfW1GDUkqteqkGwgv0OIwpMlobZ0rrnUzOMoiUOtMdVo9pWauKEvdYxPw65G0ItLeX9+en579eH778/XJ7a8XNz/enpxf3/Z2j29P357eXv94sntwONu88zDXxUE82q2JClfnl9u2laGQmEXbOOaMFFaNQyi/6wxgYAP/veN+ME10DOc403VQt8nnMM4EfQAJeFdF6TYcYcrukKAsNG54v9MV0pcXOuPMldiMqaha1pcXF0HQuvFKEyTr9hn4tPYmr8TiF6ifGxsjiP1sXoul1iAPr7argKW5lCmmqg1oKmSBLWzezciFr9V0wCiszPZyCzXCYhSMo4M1rc9pQUDlbfrzktWXZwcoomC48QE6O//ZLWMxnhzS/1rsnHc6h0NQIQkLzRWXaVyUt+bveJaruynLF0W7K/OGnFmSkBRyXoBe5S3SfXd0eHr0bvf04ODtu7Ojs+Pz47fH7/bfvnv7rnv6+vx0mTURI9x7skW5/vGk99Wvyuvzvdd7Z6/3envHx8fHZ7vHx7uHh6e7Z697B7u9/bPeWe/09Pzt7smSq5OfOE+yPrsHh/Ur5GjoZTA8foXyUfVKrWbfHB4fvTs8PDzpHuyfv+sdnXSPz3ff7fYOd89P3u6fvj3tnu0eHpz3zo6Ojw7enh/tv323d3rU2z09eb17dvKudSsPgyMVIlubynOWZ4TZHqZ8gETW/52E7sJfQ2D/Ak2u9jwypbgrq1Qm4OmH7006EPqZc4lOTzro46fvL9ggxUKmWQiuzxuCxx10dvq9u+Y7O/3exla0J9/veG9dp7i5p4I05jwVQM9rclyVSj3iEx0PmpBUsZpisevr9zu5mo3QCLNIjPB99Zo22icH/d5xdNg/OAiPertHu8ev93Z3e+Hrwz7e3V+UmxiXt3ggWzFUlC9ukWmwJDs3dEx8VRn6Ppvq7wWdQCDGIcyKmK0aqY3s70waVS9Gdru7ve2u+t9Nt/sG/hd0u93/bt242MO3D2mmXxBhoxm1Rrb3+qi7CmR1qbwVxzOUmvsJjkIcx0pYMnT94cLIVEniuNBcQCf72EaMygSt9lEx1KMCYd0RzFwxGZsKSR6gXxWZPbGtXi50uik10R4SRfmEmpwkP1rQZCVV6D+ZTAKTIBiEfFGaa1n5lPK5IpFzSezIMlcij6e20+vHT9+fFRoQrUgSiyzR1ym32qRe+42smaZedyjY8vrJiMQxb7RbGqz53YPD2x9OL5U1v3e8X/P2+elZi/c3gyBYdLt/Pui+DnAMYb6SPhDY+Oui6nuqdTbLe968OsEAvbo++bAV6Bs6CY37H3A6VVSvUxZ0h0Uqdd9tn3nhmqSfSXNpq0O0ITyj2Nf47MM18jFGuk/thMZRiNNIbOlmxYUQMFK9Ntv8m7f5l1oCrR8FGtx1Sl+7BuY2G8TBq9MP0O9GAQEN8z1KOhpXkLb6l1LJ0Y90OEInQmQpVga/qc9/uqiJUaQFJCCtnQ46zenV6RYkhIgymp9aNx+rwSHyZe86l7VGyL86W2ZVT7//dN1BH512fcFCEOdwwOWhtx1fA6/hALefVsEJkJiUp0atixXsNFYWvd8qE+dSMYuSIr9QMnkEQn6i7pqR8qcS6NXHR2z0CxauCGcc32aMrkvhqUMdx0jNqCjwaQkSlLj/EWSA4h63PL2F+I71XXS5s1YXE0mRnc+dtDcddA3RIlcVPj/FMR3wlFG8DKarsA/BUsLSK6jXwiBssI12u7vd7e7Rdu8Qdffe9A7e7L3+/8FAWha5RxuDc7ErW3+NmPVeb3ePAbPem/3um92D5THTqQ2392R66zr3r80ENOPXdcB0eRj3pLoRf75e6iDxcAuz9GFdm+5GX+o9kGLT6zhWL4Tmpxw75OhcvfdyP7nCLBVaMCpkcrDbunFlA0HI54SzPLtvmVoZ52YIt5wRSelDZTHdhVIL5A4PDvaOLPFZRD6XgyKWQ1bQP9ssfhOiUBOU/unCsby1FAkO4fqqT2sC63a7+8fLgC5ISnF827qaySOiwvVUtk4JHFe5vVt7SpZd5/kthk0zz/0tcTLCLIMKC51iBZjcdT6hcsTBaIuVsqIsL+dHd0OHI5ziENJGy0Q+OHj39u3r06Oz87fvuq+Pu6/PerunpydLSQzXkXrtwvCimNjhkzpvi+1Jil+hgykfj4mij/DTyvTRPuAZxFigHzh6j9kQnabTRHIU036K02mArglxQSRDKkdZXyk1O0MeYzbcGfKdfsz7O0PeC3r7OyINd0IYYEcRBv4vGPLv3u/tHW2/3zvYq3Ynhjua7SVFtXEOPI0pLJwtbMEoIydGOCVRMIx5H8dOJ8y7yCyJ61OYuquxdC0Oz8HULYsq62jSpSwabN3rm+9zfbeD3n9/jRl6p6xYKkLu2cIdZQEFYPmuhQuejZlbIMBjMHpqO7dpExcWdFUIPgOjtoTvUij9BQxUEx+wXq3Kq9yoJjVqToUV91ojsEa7pSFqMbdkXMYpFMfVlyIdfX2JEyjgV5ceLEiY7B4cpq0tFCIk7scg2Ftg2uc8JpjVIfRW/4QGMS6gRQc2OhUxMuSS6tupCYbs+pAIMchipXg6lQo6s1P1lgmCZYgw0IfU3xljJG693Rj5LG9tPOwXXUoXhNsn8AjgJlGAroheWB3cgrxaC1B+8OTDianmofQGqzNOJpOAYoYh6BgLpaWOCZNiR8ZiGzBRnK9w2NbjNv4QfB7JcfwdjhO2bWHcppHYKgVE6XoqntEQ8wkkZ4kq1ykod3pBa6ZLicjGa2U4KkqR08BwZl7ISHTYQoN5reCUubQ1m5kOfM8yzNfAtmiYbxWlpwrzbYJkTSReZ5ivvxZLrcGzDvM14H4zYb52tb7mMF9/Tb6NMN+nXJVVh/mWVucbCfNtuUL5qF9hmK/Bca1hvtcLBfRWAnnzo8LrD/zFA3rN5L/jvbVFjtVH9OqJVxbRu/d6f3+/h/uHB0cH+2R3t3vU75Fef//gqL93uN+LFqTHqm5shcTjpBLgaqI5n0NEr4fvSi5xF0H4i0f0GmTXG1163TqOtCSQawRAJcZobQLgJezx6cIe/SX4q4c91tLiKwt7rMHhOdwFfWVhjzVUfDb3QUuFPdYg9NTXQWsPe5yD8zO4IfoiYY81ZPhGb5V8TL+5sMcyct9O2KOP2bcW9tiA21837LGBIN9m2GMDsl9D2KMP+kvY4xcMeywQ/iXs8cuFPRYI/42HPdbj+nWFPdbh8BxM3a8n7LGOgs/GzF0q7LEOo6e2c1ca9jgPwWdg1C4a9liH0l/AQP0qwx5re2uvrhS4Vs0KvYnstXKCU2F7iavnPKVDqphPB6PVXNgEu62d4HYt1hwN+EFRP6Z/kkhHzMFVtQsGhEPER3MeiraIaCOCrtpoikOrodmKo96j5qqj6pRLaT+D6Er9BQQ3CaU8J1wI2o+JjsPE8fRPYq9PsY4/Snk2VLq0gRKjMQ1Tbrum4zQcUUlCo1rGSlnkjKAHSiaeleZq3RtDwAMcea0DUEr+yIiQAm3nTEIZhcYfE9K3v9tYp0HKmdxW2muxz/22QuePjKSUCDTGkcNDVxlOYoL6OLz3v1yg2qlIMFtfeejNxo4ial7bOwH+DrmuXK4EtyKp39n/RL+eEnNZCLEVPCGpCc+1LRggGBdDCGXHdYrAjtCSuxEx06EdhmAd3d48whL31RZQ5J7WNLUfDF7j49fHvf5RGEYHraWsxucJqFwlJDzRPCFyBjL9OHSns5yIJnqwT5ThjyQfEkU0MHDdkHmHJNOexBB7hFkU6x3ipoGmkNsmzpV47Fqh9H5/8Hp3sHdwdNTf24/wId4Lyevd11GXdMn+0d5hmbwW4icisp1+AY72vzJt8Gy7Rdf2F9pAjAkWWWr8AMDmjmkVi+csXWR18x5Jq8TtdgfdwyOMu338urvbP/IEc5bGvlD+9PP7OQL508/vbYFn05ECmSJM2mxXopIYTQanIPs+/fxe6Atk86Y9NBQN+imBVngo4hOmGIYjEY7ImHRcz8kEy5H5niMb99xG1q23z9iZ7gJmmwelcS6CNorlv/x+hBcMCT4mEKquFlDRc4ynuga5SSi4uFLY7igSKrrqJmbxtOM8Q7jcCJFB48QLU9VMja07J3o9fifgaBpy2/P0zpQu05SrMk1NBTOXlmEj99dF2puRqSJu4xWECRtWostOXqOJmd3gyJKlcaEVZGUIKhCERQgiEVU710SId9QqMi6VoEynUBZ+BPut+H1p8Jhg6GiUkJTyCI0zIWGQvpKEYZxFJKrpbqmdg/Byn6CNhA03cg+i+nwjUM+qK5QYJcTrkzMct/NgL7UqVzyVRpU3HI/gfkuz03d3Hv9LnmyUiHP33Z2+sCp2/rRAl3qeDbJ4hTrwk7VnuBjo3olKBEI3JjpWW9p0ZJryDIrA5xt26jmEheR+VBhl6E7xsxrvDnKtQKGBDa/3ChXgEWU6OopE2poEBcrqnHDuuyH9fsM1/QSKEuDN/v7ejiBKZ/77H9+b5/rv7yRPCqtnN+Q3sIKbn9iYR+r8j3I5A6wvkCCEFSjrKOqm+cClyYOgDDEi9QnPGZVcWVRaAvA+nNyROwz6RIkawziw1inBwmcFDMlpKOZD09ZffQotEiRh6PcMmjjnoXYgu9Q5Wu6M6zjHtQlzn7lhMRhbEywcoJ3COc+4rAqnpZhIjdbwc4G/EiyExzUrz2Myw5cMu6AEg1xX48orLEeluT3Zagi0UQJnDT3i/d7kFTj296tXHvv7ewWgwKxap5IAExgm1r/2idYV9C8mT7AOB1+P3igxW+Xs+jucXZD/FPk+IH+WQEl7rdA5rYVx9S3s0DSXPTpuw4MdPoV3dHdaNV8/k+6tjjeZRlarKW5E3b6aITJOZA4PgK7fvDNfm2Zy7oKaQnIEkxRLgvpETggppnzKCde6aumAfuq+9EoEvzSlf1ZN6bXdti4+uIbRm8UiHDgbpaNXhyrcvalVPTW8DUdX0eHw0m4fvbTbX67d/hqvgD+Z4Wv0FB+CgoPH/t3s4QEuBNee8fPYg7XYvbrPM+naJhsVF9qDkQfsbAzjazCdis1D00lM8ccIPxBwuRO4kuep56JkMqVEmFPV9vBGYw59c7H21NPImsrWGYUZwpAjbZRuOLGF56Yfm4V7egdSc6N63Yh8jX3qIZNjjVxZTBUJKqb9igMjnsw6VLhuCm2qqek6iA7yXgIV/fgEmomjc8qEJIaxLJy6Qf5TcRzMvlaW0/itzV1f9da7GjWAmulDqPsl7yQxlrqlfxXENQpsn/56ssL8Xt7xum4zrBwd6Z4Yqe6lWJDsA7ga0yKIIcw4m47pn54nShPO/flJkEEWK8a/g874NLpTrKH/UIjduayzkLOBXiEcF08TFqnzgPF8XxorpcRFZf4J8wj0VfKOdXEKm5joSvZUmGNZCJ5MZl2PlFmv9YYUxXzoXWKImkRMDEKraPzxeG3Zka7Cib5dVDMhrDUNSfPtY1SKEqyb/9y4p33M8C2OxpRtdNCGbrhO2fBWDbjxrzkhGb7idIuH1l3qqU8of9pCidJjWFWKQfwF5GGOiXYjYNRP+cS7SXVb62ZEpsahJ0Z8gpSAZhBJYAMYYj4UaiilADufhAngyByo1h+wgN5D1PBfShKa2cprSa9GnJE5u28tAOWkqwb14gFOaQGoZ+/sLsk6jz9uC/xRxvWS/0njGO8cBF30Sq/Gf6DTq09mZdDHa9Tbve1pA+4Sh+rBP7bQSZLE5FfS/4nKncPuQdALegcOvFc//Xhz+b6jv/mBhPd8y4aI7fR2gy665H0ak53ewXlv/9iQe+ewu2/qdzmii2CAxzRel3fx4zXS46NX1u5LSTTCsoMi0qeYddAgJaQvog6aUBbxidiq9lmDNytwfxtXWx91OA4bGp3K6r9gcdm6La4kSwqh1lovrPCZZp1L/jt+IGVq3ZOUkXWZKhUc9GwObB1igSdNO2Q/2A+6273e7jYkbtGwDP03YuY0rLUNR/BWumlx/1GmjNXAv9TK2vnMfg4Jk1x0UNbPmMxm7WGcTmhlD683CrUCfFt+7HWDXllSrhdUL7x3zsmppLunXz3ERjIazeqX9ycf2uhU6j2rTeE0v8kwyvsUHXd3g94fSOLhKwHR4BglOLwn0nqKsNAuPiwQZUOIjYHiFvqfMD4WgofUBNGrIZi9+gSbCIwmhbULMMQug89MpiVe3sbdvPdB3wAHCvs6LFIS8jRSw1E2jA22Eg8hXhGuijMIuICiknbxRjqAQAH6xzZl238gwkKciExDKTrGpKuDDBVudeU0oaHST83QxqkGQX3YXV8LwgRP0SsSDAP034Tcd9CvNCVihNP7LbibpQ8kniKneYPxneIBJDiWKEEZI2njquohkH7JIJcvsECvrLvQjGp+K+K/1YDkbPQ0fmbcRbGcgV6htyQEH9n7OGVtRxE1nGXhKfCKYnRdXIhYckg8HIIsMEN+7NvqXx5zW+4NfC43NV5r+M++boZ0vO2b7FDZyO0KE1BqDf2IijAl4Fgo7zAzJkDgjde0LgOakgmOY9FBKTC/6GizFUeoj2PMQpKKBUybtTmgAKGLM60p6qaUNm3UUb8qr2cbo1/E8vmYmCQawAD8AovgwDMpaDQnIdlJ/SxmJMV96hK8rPiv/NB8DqhjoDBQi4sKXDM1qtxa2ILOuW+hDUup3Tjk6w10gEpOfGAVAiXP/eQFQERW6ILhBstlCINLQRAbYmRVom23v18NfD/vGZgvaq7rT9fnW+ofuj5BDC+6QfMPbDg9T9E7s2+3CheMec3oPzIcT8Uww2kU6H9D8u0fE9IfkTjZGfBbiJSLd+4Zn8QkGhI19E4BwVtDekpEMJLjf/4nDOQAKxIjf/dfW7VRUDYE014hVW/4Nv+5YfGa60jyS82rwwJyMdeniEHNhcJELn+pQAUR8jTXLAuLkxvpfvAW1OCAyt7hgxA71Ry0X65bJ8x6ED9bq6hCVe9BPUlh85kzS7gjHMdwGvqz1X3dsD3CBxKMqUyJrqmuZNjOAP8BbB5/Fz6QW7gxvfWAE7dhSrAk0T9PIZPbTevLVkr0WXz+OeFCSY7TX859DP9VWd8LhsY4/HiNdLkXtBv0doPDjh+uVCSHCYj8+ep0gerMBIoirHuDWCnqefq9dgZUzFia6uaoW6Ka3XHelgRr00wU5hZjIxpeXZxt2egQU+kiyaO76w9LpC/pA3Th36ujrHh5YiYwg9o7uCpdy6dHW9afjLC8peJWbQEabRleL/O4G73C6xdn/6pZo21dQqjb7S7QJgAi59aWGHyCUqLDiZsFTEF/NtJGZ8qMqaRDbf44WtjFcNwfldalTJj6FQmHdLtPmXoK7rxwSP+u/vG9o+Nhr7cAGRXj3a6V+Y0VyVMkQszqWbW2qFSv2zsOFmEKNT4jafBAWMTXlVKtUPLDfsoHPICANAgVtG4Iw/24ff2gkKck6OeVZ2YhM4g5lrUq7LUaRof8pJgNzdVXN+gqjbvXDbramQj/tD1JRgSNuZBIkAeS+jH1b5WKKcyIXFmfSmMTgggxhrs2kNpJzKm0RBkTmdJQoFdYShzeowcIV8jTbHQ4+2cqpx2UpPSBxmRITNKauQmXJNXZe1sdRMcJDmU+qn+vrcZw46rPhikMq4YykSEAk6mpClmDDUpAjfplVXVg3e2Ih5lCeauiqR4EB4stMWEPNOXQt6XVVdYXWutzH6x5i47ZFLlkDeASs0IdtMwKwYUsTQn0snkGSyTJOOHpc1qdGwPRvIWBu58xlpkmtCJpZFotARadwnlt1ypc3b5oSeH1+srBkP9gS5YUPB656fzqwy9nW/lhr0xjKqE2tKMRLAPwJ2b3lA3BRb3xnk82OmjjkkQ0G29obt74kQ5HG7AEykxDD7tqUZ34dCMCJ4iyA1IX53ZzSZgqH2sv6Jrw4yn4ECMyoKyYsKZGyF8urJHHRfAGFYhPGIm09oIZHmrf07uLn69vgo/pUFepQa/ggRKe6NP1ti6fzzh0ixpQz9Ty6sN00GTElTCgwiZ9So5GJE5A7oNHXZAQmFNptiAnlPaVcOZdlkmCxwLhMOVCK84TnsZRA4uyhyhgVMhgyB/AZ7FtRBGwa1UY6MuRdqxqlmSN2oVb9VoNAwJ3FfVAUNhDEEOxNahkHjuaJSnlKZVmIVBKhjiFy2FPBCxHwYoSr6YJ3dRz/JCfD7qvffcjlKY5LdVWn+WBpEIpAbE+G/QVjDZE1L6y/ki1Vz6X6t+LQo1L31FJdT2GeIpiPhya/H9o+qVkqb7IieiQwkFoK+LlZe4cQUiYSaXioT5lOKVKjbneuby4PC/OxkyMbp9H8A6cnzieCsgihERnCyUHh/59gH4Fnz+Lp/kNValiqwEdAge1H7VY5tCMyIiQJEIZi0iK7tRcd2b0ERYjIizj+Y14CsUXU5KH2XacN5egO/X9HRT2gKTuPJ024UkWY5MMCReA+gILZveb3Nxt+QaqudgAE8yFMRYaVxUjJ/tcjpAA2W0rsbnLNh9Q4Auu67KFFsYCWXREvxKaEGOrxqwOWcNHBi0Zi8Cr9nS31d6h/dII4UkaIfzVmx98rQ0PXpocmP+WXfFnU/FxqcYGf5VmBn/hBgbfdtOCb65RwbfVnOBba0jw0oSgSIRvs/HA19ds4KXBwBdrMPDSVOALNhX41hsJfK3NA14aBjxitZ+Nybhck4BvsjHAN9IM4NtuAPDVFP3fVjO/QX0CF9mYhSOe6j+3QxvfaG5v3up3CiD8Dxj71BZiM2eS+tzlmdj7A7itiGNTwhHczArUWs84pDaNuJCeoK6jUw0s6r8zkqQkhFuIbaj8qQe0yfj6L1pMaMKsmFGF0I9mfiu6zc8FSBWmgaRj8qdNoraA4pi6WpIJlqM3Jt699PKYDnU85hsk04wUR9e0KQzL/a7S+o/bBSjjVgrCbSAEYJilsDx6sjr8KotQxU2tlf/eTLRg0NrVrQ5cywozR1cEFlDWP6BMSM91OpdO4IzQ3yL7LaKR3SRhzLMo3w+n6k8bQ5CiMZE4whLXb5FL86sOBAkLn0KwYW6d4Ci6hRdu7ZDqzZAIoQPN/B1TwBw+CugYD72q+HmBiTHdxv0w6u3u1UqTnEku1Ajo4syFMmpwLUUMi3yHTtRqwUs8jnxmtQAp+AMNlcV1znLXvjxzub05LIB5mOPsaRxC7v2FZ2rBwaW52rKxN9sYhyPKCOzzVpOZDwLvg7Zz+ZFZty2E2uyv2s6apBwkWcuFM68vvm4pGeY64Ow5Cq/Wjm/FQsTDe+BVIxfO7N8120v/BlqIOi3jWHdsAKGgf1M7XIx4Km+1dM61C3s46/m2nUxoOEQdWKjmPrr4SUGI6BMCKgy5H+uI5RGs/pNaojVMpSTO4rOBpPM21IKzlr5sN+ny05mioOg7dPPx7OMb9COfKA1kjBMlZAX5ewWWwmGPZh/4qFmeIyfTNQiB5Vx1rOZ8+6P+q2aQCzbgPreaY0F9jqys8RhUPa9lT3NunJ9e+1nI1ObdBiQUwXQcB+Y9nUaHU+1hZZxt51+WSnpx146gmdObl6ZQd8sO0ec8Jpi1JO8gpwgk6+TLXp2Xi6Cf0bg6ZXVF3em90Ts+63Vfb7QD5+M1ghn8iJV6QEIekdp9MAsWIVMiw1F7YOwsunAfmzoOvM/6JGVEQmCA4cOf/Gc14+a/O52rqEDlgyKfC2dL1fyjuZK1APRsnitTPOFRvdhZaDN7FEi4djJVF1dNldXI8GVnuuIR+nRxVp0IDOgEh6tDKh+xOhmPKiL/kZPZijkNk5Vsj8dPaAesy/9WM/7f//1/hCmRUwXJSPC/Pfqs8H6+HeMkoWxo3t34W8uN7eFkzrYxTqogQ8FB7RF7dnB7sNUDn5IkpiEWRK6W6/JxG3gvIknMp2Prt1jZxPm4DRODh2yQxStH2Ru4Yeo5qtmyE7th505br4c+fl49rjnzzPGSH3hX7kHNuObH/Khzdnbd0ZSPjRY6l8jntpqwmSHII6BnaMMGY5yMc2x/MMUNTq4u6zG2hau1L1Fy9IBTyjOhvjCBwk2Ow9xPsojj8Mp+ZQqnNQzpd/VZYEy/KnfBRyXxOFl4oTJRWSfvRh9Bkl3G5BvUa8euNxaSQsVPpZObHp4hZ5FAAlzlnxj9jEjCw1EJH9vfrg6ThslP8uY2n9LYpEPZnnSgR2MWmWY6ZqApw2MaFiMkysp9bZeE5p3cTJmbkdeytdwOAWK/dS+ENxu5xxjxB5JOUipJyRqs6be1LExqiI7tyTrV/tFtLAQZ92PT26gGWndZ7oXlzekStABapQYGyyE2KrnbS8QuNgdpDZrXsKdhw8xhgbrmPACR15mnDRx5H6OlubGuX5EmTrFZUSuA/KZBy0I0s/uPhqza8qc1hKVGe8sAiU7cKCYGC7pYYLhxtgk6GIr9JnhIkIVaN9abDanzPUjZLMYXklnFvMil95GUSV4RtLAornUipB1SUSzv3GJJyp0fazCuc7gUfLEjHhWWqEnHmrmuHqp6yEUxnYGsv7YERyQVNfBWzBaEdMp/VK7+2QqTEDPOaIhjO6XFxzSxIxH68ebmqlK8GpVLZaQkbUndxjvmeuo0ovOzmTYv71IPaQ5mKeOzLRP5Bkombr24IG+UkjI0k/IQ8giD6dRpQ3IDvoaywDLNHJPf2DII/KkCVnUnzoTtkxdN+0EBp2tI+5UJoTSgSf+14KKYDggKp2EMBbZImnLd0IWHYZamJFoQn5oN0MT/zew/bw3aM79dk4IA1r6Hf2uEzvcYJDjF44JaPdPdUPq5vIaln0WIYxLd+lUB1H/qMWXD2wEOJU/VVoP/yieEt8vq916jIj2IsUTGF2JL+m+bPPG8FZlSr6XuhmnwgK6SOj5WF6ksEbbYML/l4dYA5bWppe9775utnMeb/xfjscnP9XVKW9GfjKmUuuhC3dnQuC8aT+plQCwV9V0VbF6JkcfBZ5fMG7DmDoEVxXCtLK+s84y1ngXsHIDVfyb6e0wwo2w4yOLa9QfHbunbuYSNMRtmdf6hJmxrzugKsktqP34fhSTlwxSPoT2FhVE3damDoMq6SwNRYuA2cDglIGOS1uzxJyalAespqNcwtWcMjcmEp/fPjWQOsKcgWu3kzsmWYiawn7+/oH1WxuOxl2lQGzEHCl2cBZU5BHg5HnkbfZNPYmoq4JSgTTP2pu7EaIoLQkymH6SZXxg3jMO4tGDmPR2hxaBIMBOm8rkkn2UVPS8iaUki/qRfhlheW1DXFBbWSUqenN8UeU/PYYA2jU2y2UGbfRzeK0Zg0e+8v9lBRIZby6ohdaVRS2j79Un9wUo/zMD7B936Qr0CKTWuiKTPURb9kOsKnK5+iD34NB1+OL9BO0pLFDtvaLS5VSNvoqxQJhQtdbSDK7oW77KZ5sWFj2s/KE/bNDVq8pXXzF/dfCQe3LY6l2Ys1FVe4VMWN7xiR0NW3WweMW4aBKJwROMIur+nGWO0QJ1vicT9lOD7iE/mM9YMEp8qpG2ymQtLckMLF6FUPQIeSc+ifZTgFZ0sLcXiYlc7S0vKN2gz6gcJF3KYEvFHHICfV0lNScZJjCUJSKqE5maIwxEx0rNGiIisvxbMTtAgS+WIpGqG7Yg+UF8pUHOY8jw5Dh1U8ENvfZnNrzhkdbu+mUdrd3zTfm/a7fV7fcZOb9oXMsWLeg3WpXKBznVx5gnjkCDJvXID+r6zTxQaAklevv7FafnW97kgo0GrvV/OeycufSmxQl/Mh3ISjdHW8zeexOGyJCgkGZExSXF8uwp74NyOphbWlYyGBlRaIriAi3kwVqJZFlt/m9RS+np2HlHevdy1t1FH75hI3NDG3J1EZTDzNiHwmi7JzQclgwQigs2UprSkba4LwTFQqdKN6OYQpgkom1o7u+yBXPlmNY4oLwZoPpstEGA6aw1/Kn/eAGZdIK0fkAgbRLSRD+sK/5xDL/R8/ZC1AabFV+ailPAqD7bw9nwBlFzUcUuMfKCKMcmrg8nGJ7cAqVXawCK3G665EwQu1d9xVJbXby30+IOk0KiIe+kIuZIDeia0HiMRyptIzlw5n1SP1wTq4nxWCORqVZX2gCF0IaFery13KdQwhQNQh30HOfIpwvpqwpyI+XWv3x68Fdo0qSBNW9orF1clbLE0SIpq/+9WwPBCgKI+kPJOm9fQD8l7o1D9txX/fHTJQ5ba9ZoGL7X3DB51OpQaqRYHWkp0QUiXbZe6BMvNkW3zIoEXEW8XHoETkiqiu9gaUlZUjZELLceVRqGQcE6aORYSToc++9QXTJhF91mmuQEPp8NM9xoonk+Xul3bgMYS6sxJDvGfykwXhAkK9XIL+VRzVqKwGjXqZMlcnyWVdKUpR+HcBrR+3bZGQgGm1QBVAWZTWNN0GahAZDxupa+LRNFDtla+S105H2s+x1BNrOjaWQKnE10F2dEZaprlg6Pa/L4FDu3mcK8ZQJUrZJxcXZrqtDXAtDfhl4Ilnztvkt0Ew+0Y/87TCiT9qWw52aX63gVZmhgaQwTHP1XWbucLXQp913cNbuT6BMqyS47ucDLe1gDdlYP2xSOZvFbtqseqEfIbo/D4bJRXty+qQg2yo8ZiXxAIr37d40CAiuXLQnEO5c6XAcC5fmKa+/3qPQRzEk1qVMqKQtlMRlfk3VU7A4D0TaRTZCo6pa2Xmbcm5n1wmpjCCNgGk24K9I/tdzydYDWQ+pdt2P2P7Z8JjrcvrkwIoXo+wHEsUB+H99BwFg3pA2F5zRtpewmkZMwlsaC3JLV2UD0jUuces2+N1BERkjL/NtoW2qj8ULImin2BvNcrrYwjIjGNhWc+eLP67e13fHc7glpTlVG1LzTTTbZdPwwKBPk9Y/qqXgdk6kUzDoPNBTnHkNGB0qQu18uhGfHfRbpd87E1SHyiuL4MflsihMd9Osx4JmIohOufXsamUeeT4GMCOXCgwSDM0MVVB2F7BwnGccboZyS4InqA0H/xzBZZxfEET30zQUhuDI4UT9y+MBecd4F5cKepWND6byCE2i/fGmWQlyu1AXAX0OROgXMXaNDuOigiCWGR6USv75HygjdAWIlovpjzj62kvICFplGzZcKmFgSeHPCWqIDqKWYKP85ARtiG/uji6mFfIXhx9XDotdpoDX0hv6oZ/oJZoU2oNyYcuR6xKy/vqoDSTLh81ebWvwSb5S7/JEhauDFrkLpWVdED283OFDIxtDoZEytE+ymfqFFtEoT6dor4QJJc/xUjPkFZovh0QvrOkov5EHJfFYPBaOaqTxDTI1HPrmkXNEqMeiWyQYHjKR1Sv6HUgprLJ2YALKUd5dTK1y2vInLJ/6RxjHcOgi56Ra9GnJH/QKdXn5D+N/p4jXq7tz1o14Qucage/GMLnSRJTH4l/Z+o3DnsHgS9oHeAXv30483l+45+9wcS3vMte92309sNuuiS92lMdnoH5739Y3SNBzilO4fd/aC3MY/VmwK8GoK7Fg3suuYDOYFOS7CwOASfFVW7dYTjgT58FCU7iAwDk61mGWxHV1cZ9yv7Y+7ObaG1N1kiXllWRcf5DOK7VXMmDsoglU3ExaBqnP2XKleWaz06jBSzlMGKiJcGUe88bILJaSqFEZrVOs/RFnIWkpTZ1pAaiBzix97XN1uZjhZ6H7bjYn+FLahlKSMeQ8JGH/JM0/LxzuIZ4dS1PuFmj3DrjLqyr/hjCbjcbfxKZOEIhYRJLjoo62dMZh00oSziE7FV9Be7ZY1wOqHskfHhs5DxRLyR2huPQJZB3ShbTB/6JFb8O00Z9qtD4ZL/jh/I4/HQUdd2U7vz0jRvZXn9iRJaeEzj6UoRi0ifYrYIRtcGDMN2cDkRjbBUOrEaq4MGKSF9EfksWIPMYvkA7bDpdYNe4TBffIHsYmCIvsETp2PVoGDKM60Sg/1gP+hu93q720Md6v0YXDR8c1DKi78kJKWFntQ1aZR1iYoFoE7yjvn+iLZLJJOuwO3Qu37JfVe6uC5CxQK79ZZ9jcOyIVAJSte2D28pLjMOi7GWdedWrWnRMghw8QuumVnbBRpozA0GqBAY0cSQDefAl4OyNHE9nG5xGorOrssRYkD1W5erWYtAu/2ciW2Chext4zkajmOMYrHqr5HZLAo7pijoM+e6CrgLsZ/5aJXLVbogegIKlCBw3Cx3gzG0PG9NHlOj+SvmZoPBM2diC+VCvFsqsL5eiekq5NcLymE4zwbMK4cMfbVxnTDrqeaI9kawi9pVpWzcrOLEzljOZMj9Fa3zrTYx0SweatYj7/TVhpn5Dgk6TuIpigjjkkBYD6Tc5OFJKUlSIqBxN0YiCyHYgqcI+6MOMI2zlHi+TJK6btu25hw0QNLRZ0nKoywkUW34Wd7PSs+W/1Jegrzy4DYUQcnrD55cXaJz86hADHi47QLUdbFFnppChXXlBu3I9UvbQOkzNW6IE5mlRg81nUdyekKNKtPY3VRuMT5B7NVEMR7jhcrjLRbebrKyGiVQNQQhDwYC2iwU+RNmcZLSNkUrDFyNQYPv7CVbiOPY3NFMsDBVCugYp1PFhgmRKZbcXPrnxTYqkMGqUja8vSfTFuDNyuI1I/0E1wH+Tb8u1aP4LROQnWcnrYGHfA5J0io7d1boZ70jzFwFxGo7pnzCqgs5M+S8XJVpkRjJG8s22hkiiNQ1jhw7oRFOEsJIZOq0qS3ax8L/KqgHa0yEKJbuQE2uelTPYLXQWmoZAMwsTTDwKIsfRRw9Qp4f4UKOCmA0TF9S7eZN7vZ+7WAjzKJimQI0o1RBW5Je6NJWPC0eNkBbCCPF2XAk4fZYB5maO15dvStFjNft3phXY+8W2CeeW6PgO7YV59X+tf68xfYKHOmP4QdBHkiqTk5X/C7kadSw/iBn0tvH5ISoOSuBWmneKqlSAWTtGxC7xYmnRUk6ey9CHbDbWUAtFdN9ogcmElpKOBjQuZJWm6cQZMA4tLNmSmmXHP272CzHdbviswlJ5dSOgqhAQtI4hltlmiopiFnkxS6QPzIc26jsAoYd1M+kDjlJYhySEY+hzlpK4M+oCsEFg22GBJUZtgVASqMqiFwHa7WhNOkFknwI29e1eRD2ysboYBv6DgddKkqFYqO+ELR5yZToG+t3zR3v6dUnwH5Mxjydokxj6WqUlFrrNF3xFFtCGJOjTtMT/p1Ta1XvTn92Zy+fhO50aZ20BqOGRCF3oibZbCO6iSXvwiSrTK3oBt2Hqjdc5T0iucRxwHg6DpKwqpY1VLuzwR0JScNiCbI5qqP5QPEVHwCcUA9JJJ7n2EZ063LUIIKwkHXFPW8K/Zp1kAbsSdtowcXsqpmUVaU7NFOJUsyGpJjtDkzUVXze63b/vXKzqZlwyVXSH1cWyjD2ImtVWaJSML9dmv5UFvCbtTBqXANLtZoPDmVWM+0ihyuMkO9iEsEqDFJC6o7R/EleF4vUXVlWip804T5HpBv41CwWSMr0IAG6gHTlEMehCfGD7GPEtVLy8TpAHxl6T1n2WbGV6Swu8tpVbszSpEmcqWHDkeHJfjYYkFTAcB+v/6EDzMDkhsQhHzj1uhqcMqwtbLN06tNf9Z1cx3wPp0X56ONWZgXmQzX4XYXhi8lFi3K8+dpj+aTU5KADu9JJfE/Ql2TmjD5mnthcgjHbCs9ZvNkoQOeI0FlCtEUt4dUK0lWL0qowLZOtsidaLN4lfJM7b9QqUSj3oshRl4iUpGRAP79BG/8E8v9ro9WSCvrnOsUNZHGAyH2gqS8Z/TUb4QIizjsqRFCdbvXw/UwE1KlA10Sia/onCbQmPoYbPD6oA5mHYZZQHQQNEb7mnVc/n1xuVTkgLK91Kw4AwQCcF9MxlXkVKD1cxy8VNQU3oL4BVgIbpHS7XV0jspsq6sxkUQ2VFWge3MX9NyspdUzGAXxTs/CNSz9r8WtB1mDl1MxSSO4z8Iu4EJZWBg8U8zWBZ+GDOaw0qgfP9wd7RcG2DfU9y0TxhVf3cI6Jot72C/AVjqyaH/LlN+YdJaIDI9mQGu+jIOVcLmSmPLrkZemcVwCUDvmyd2d+UpUz3XQKCOfSh1ME+oAJdXy6qyFj1SplsPnfQwmnvIWlWtAk5QMKnjXPxX/lHhbjyuExZcN6R/+MxkJmtCWIWt4Xi/jeW1ZEM9VmvJ7NBuKS/+Mkjk3tTl0SHK4UzKs6NQMKeUJCER67UaBUaQWPxhqRj+pIdGYThvKywgqETrkn0SMxs8CXzEaO8HCYkiFUFDKviA6a5uknA5oKafwduTbVTKU2iujMujStBWcNnefQGgjnDm6nKhp8IqA5w6yG5E4h0iR/FIYL1LBcFskPTke1a2V5pbhfoI4BSSmvq8GM45iHtzoo7ivC2ACswQc7Ndf6nR0gcSprC09rpOsLPC2C8kIqwGM52VrDFuOOs9o7CyFPWSbIt7DiSh0xmlE8NVnFjfh+Q4vdEm/JW1gb9cFKswmxylpX1TNe8kQxb3ivC6Hn12FQfRuq50lwUMUkFfU6+sBclS8A5nLr5e7k4QKpAYMGGGlc7lG9HhivdTouXCfaSRcDNaasHsyV8b0PYwxBi3rbN4JZPbLVr18bu+MnYPSFORqvhZeXZdoW0CzCro/gyxIknummE+DHOCkab9fe48K87gdAVSDCUhqOoBGBHDn38b8hdE/7mGHNpXqSW13ZyYvxd5MHPhi113/e72jZgg/ecIXGSvXfziF5fT+luknR2gpClsMBbAozxFI5khVqK9cBVZcO9LgdYeBorgPUz1gUA0eQYmPOZWK63ttekoVKHApzqExLH4i9kwfDw+SEQ0CfLG4GXU/e3wf6SXELJJgt5rx4oGSie3NYvjQetrxtL3QJu7Xl3d+gjV/UN2oqsVHK0xnROGrk+C/eT+Xi7JXYyuvNQD11uMV45ZLP3K5bulz/miD3q8TrIhYRFIoknxFhSpBG1RS0BbN8F3O9NPYYAQirzUV8X2WN5Vg+b1cD5I1fRfqeMmhwYGuLgN8HoMz621APywXV5hdWgI1uEACdDTo2HqeuK4CyDR9lC1UK569YIfw4GAgiK7Km2HfENRy3NcanNmQNEPQ5cZajba7nb6HyxOumTNmT2BY7MWVhBbOFGjCZQMZS1Dzw3QQLpHvnq+09ZeEo5Qzq5UDofOFJHeX7j9fcm1TB+9UdwWc2MlcN2xCDl/KJuMWDgV8YtDj14lpo7gNRoyM7ut35LmBYSCxJQ0fDar2pVdO6qv81zzBzlgpF/GpUVh0zVlLps1oA0ex4YTSHKSrgVBdI/XczTUhNbR+vSRWES0bQYqbQtmVzK0DX2g2fVzDre159LGCXBQrKoBm3Gj14Rbh5pQStRT4DxZGUyZudHYNjEPIqxh20meJ+n8rxH5tbzRilpFCR7mmwskCgPoH6WBBxqSOimhB+c9ydifPOHxnJCEQtb9Ycz9UI3lXuU5i79S6du6PWx3V+9RUbnAvAQ9E+ntDQq8rsRe8mWT+GftUIivOFhD40RnA3BUovQAq3ajN7CS2M/8nQ6KMOM3XExzF1R3z97X/R1rop/FCMNPciBhbJD1t5B8qVdOVrr3bNs/8hUikqaFm0EMHQRttKicjiR7YqvtEt0LNY1rTdC3T3cL/Tu1o29XBb946JigEJNWIGp/fV+59KD/SZvcTrK2jMQeyk2Mzba/INKw6GLwBX5fl6JIK/BX9bEJGl2ppX8a3Ao4uEEPbIu6YwrufnxuDKNqBXlkVx2Gk2zoyR9R5PeSbR9YgOpAlPqZeagwaX+OqhewdxCRcsySQ6IzGezoRL9utvI1cPl5YSb2Me3ivWvaFjMhMyJYckFvXGSK127M/43nztxNKOriySB3r5/81rb1l3a4tmn1Y1FNARnXmYLB84JEWztlBt04narBJqvVK1sJqY8rhMxhmAjvHnJwB0jD9Xoayx5RPMbsvLuLiQiVKeJEtaqTkL5DGyZjzTMVnr1MWjs06Ar0rZrcNwOV23vEx/XVW3iRI1uu4i8qOeCPM13v8XAAD//3VP2FY=" + return "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" } diff --git a/model/error.go b/model/error.go index e9d85fc63b3..e6ef6bf3c62 100644 --- a/model/error.go +++ b/model/error.go @@ -32,6 +32,7 @@ import ( "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/monitoring" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/transform" "github.com/elastic/apm-server/utility" ) @@ -109,7 +110,15 @@ func (e *Error) Transform(ctx context.Context, cfg *transform.Config) []beat.Eve addStacktraceCounter(e.Log.Stacktrace) } + // Errors are stored in an APM errors-specific "logs" data stream, per service. + // By storing errors in a "logs" data stream, they can be viewed in the Logs app + // in Kibana. + dataset := fmt.Sprintf("apm.error.%s", datastreams.NormalizeServiceName(e.Metadata.Service.Name)) + fields := common.MapStr{ + datastreams.TypeField: datastreams.LogsType, + datastreams.DatasetField: dataset, + "error": e.fields(ctx, cfg), "processor": errorProcessorEntry, } diff --git a/model/error_test.go b/model/error_test.go index 02bc5262228..0ad89f04bf1 100644 --- a/model/error_test.go +++ b/model/error_test.go @@ -307,8 +307,10 @@ func TestEvents(t *testing.T) { "valid": { Transformable: &Error{Timestamp: timestamp, Metadata: md}, Output: common.MapStr{ - "agent": common.MapStr{"name": "go", "version": "1.0"}, - "service": common.MapStr{"name": "myservice", "version": "1.0"}, + "data_stream.type": "logs", + "data_stream.dataset": "apm.error.myservice", + "agent": common.MapStr{"name": "go", "version": "1.0"}, + "service": common.MapStr{"name": "myservice", "version": "1.0"}, "error": common.MapStr{ "grouping_key": "d41d8cd98f00b204e9800998ecf8427e", }, @@ -320,9 +322,11 @@ func TestEvents(t *testing.T) { "notSampled": { Transformable: &Error{Timestamp: timestamp, Metadata: md, TransactionSampled: &sampledFalse}, Output: common.MapStr{ - "transaction": common.MapStr{"sampled": false}, - "agent": common.MapStr{"name": "go", "version": "1.0"}, - "service": common.MapStr{"name": "myservice", "version": "1.0"}, + "data_stream.type": "logs", + "data_stream.dataset": "apm.error.myservice", + "transaction": common.MapStr{"sampled": false}, + "agent": common.MapStr{"name": "go", "version": "1.0"}, + "service": common.MapStr{"name": "myservice", "version": "1.0"}, "error": common.MapStr{ "grouping_key": "d41d8cd98f00b204e9800998ecf8427e", }, @@ -334,7 +338,9 @@ func TestEvents(t *testing.T) { "withMeta": { Transformable: &Error{Timestamp: timestamp, Metadata: md, TransactionType: &transactionType}, Output: common.MapStr{ - "transaction": common.MapStr{"type": "request"}, + "data_stream.type": "logs", + "data_stream.dataset": "apm.error.myservice", + "transaction": common.MapStr{"type": "request"}, "error": common.MapStr{ "grouping_key": "d41d8cd98f00b204e9800998ecf8427e", }, @@ -363,13 +369,15 @@ func TestEvents(t *testing.T) { }, Output: common.MapStr{ - "labels": common.MapStr{"key": true, "label": 101}, - "service": common.MapStr{"name": "myservice", "version": "1.0"}, - "agent": common.MapStr{"name": "go", "version": "1.0"}, - "user": common.MapStr{"id": uid, "email": email}, - "client": common.MapStr{"ip": userIP}, - "source": common.MapStr{"ip": userIP}, - "user_agent": common.MapStr{"original": userAgent}, + "data_stream.type": "logs", + "data_stream.dataset": "apm.error.myservice", + "labels": common.MapStr{"key": true, "label": 101}, + "service": common.MapStr{"name": "myservice", "version": "1.0"}, + "agent": common.MapStr{"name": "go", "version": "1.0"}, + "user": common.MapStr{"id": uid, "email": email}, + "client": common.MapStr{"ip": userIP}, + "source": common.MapStr{"ip": userIP}, + "user_agent": common.MapStr{"original": userAgent}, "error": common.MapStr{ "custom": common.MapStr{ "foo": "bar", diff --git a/model/metricset.go b/model/metricset.go index 4b1a7f57de8..f3afda7d5a3 100644 --- a/model/metricset.go +++ b/model/metricset.go @@ -26,6 +26,7 @@ import ( "github.com/elastic/beats/v7/libbeat/logp" "github.com/elastic/beats/v7/libbeat/monitoring" + "github.com/elastic/apm-server/datastreams" logs "github.com/elastic/apm-server/log" "github.com/elastic/apm-server/transform" "github.com/elastic/apm-server/utility" @@ -161,15 +162,19 @@ func (me *Metricset) Transform(ctx context.Context, _ *transform.Config) []beat. } } - fields["processor"] = metricsetProcessorEntry me.Metadata.Set(fields) + + var isInternal bool if eventFields := me.Event.fields(); eventFields != nil { + isInternal = true utility.DeepUpdate(fields, metricsetEventKey, eventFields) } if transactionFields := me.Transaction.fields(); transactionFields != nil { + isInternal = true utility.DeepUpdate(fields, metricsetTransactionKey, transactionFields) } if spanFields := me.Span.fields(); spanFields != nil { + isInternal = true utility.DeepUpdate(fields, metricsetSpanKey, spanFields) } @@ -180,6 +185,20 @@ func (me *Metricset) Transform(ctx context.Context, _ *transform.Config) []beat. fields["timeseries"] = common.MapStr{"instance": me.TimeseriesInstanceID} } + // Metrics are stored in "metrics" data streams. + dataset := "apm." + if isInternal { + // Metrics that include well-defined transaction/span fields + // (i.e. breakdown metrics, transaction and span metrics) will + // be stored separately from application and runtime metrics. + dataset += "internal." + } + dataset += datastreams.NormalizeServiceName(me.Metadata.Service.Name) + + fields["processor"] = metricsetProcessorEntry + fields[datastreams.TypeField] = datastreams.MetricsType + fields[datastreams.DatasetField] = dataset + return []beat.Event{{ Fields: fields, Timestamp: me.Timestamp, diff --git a/model/metricset_test.go b/model/metricset_test.go index fb6975b1899..29d5e658de4 100644 --- a/model/metricset_test.go +++ b/model/metricset_test.go @@ -62,7 +62,9 @@ func TestTransform(t *testing.T) { Metricset: &Metricset{Timestamp: timestamp, Metadata: metadata}, Output: []common.MapStr{ { - "processor": common.MapStr{"event": "metric", "name": "metric"}, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.myservice", + "processor": common.MapStr{"event": "metric", "name": "metric"}, "service": common.MapStr{ "name": "myservice", }, @@ -73,106 +75,105 @@ func TestTransform(t *testing.T) { { Metricset: &Metricset{ Metadata: metadata, + Labels: common.MapStr{"a.b": "a.b.value"}, Timestamp: timestamp, - Samples: []Sample{{ - Name: "transaction.duration.histogram", - Counts: []int64{1}, - Values: []float64{42}, - }}, - Transaction: MetricsetTransaction{ - Type: trType, - Name: trName, - Result: trResult, - Root: true, + Samples: []Sample{ + { + Name: "a.counter", + Value: 612, + }, + { + Name: "some.gauge", + Value: 9.16, + }, }, - TimeseriesInstanceID: "foo", }, Output: []common.MapStr{ { - "processor": common.MapStr{"event": "metric", "name": "metric"}, - "service": common.MapStr{"name": "myservice"}, - "timeseries": common.MapStr{"instance": "foo"}, - "transaction": common.MapStr{ - "name": trName, - "type": trType, - "result": trResult, - "root": true, - "duration": common.MapStr{ - "histogram": common.MapStr{ - "counts": []int64{1}, - "values": []float64{42}, - }, - }, - }, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.myservice", + "processor": common.MapStr{"event": "metric", "name": "metric"}, + "service": common.MapStr{"name": "myservice"}, + "labels": common.MapStr{"a.b": "a.b.value"}, + + "a": common.MapStr{"counter": float64(612)}, + "some": common.MapStr{"gauge": float64(9.16)}, }, }, - Msg: "Payload with extended transaction metadata.", + Msg: "Payload with valid metric.", }, { Metricset: &Metricset{ - Metadata: metadata, - Timestamp: timestamp, + Timestamp: timestamp, + Metadata: metadata, + Span: MetricsetSpan{Type: spType, Subtype: spSubtype}, + Transaction: MetricsetTransaction{Type: trType, Name: trName}, Samples: []Sample{{ - Name: "metric_field", + Name: "span.self_time.count", Value: 123, }}, - Event: MetricsetEventCategorization{ - Outcome: eventOutcome, - }, }, Output: []common.MapStr{ { - "processor": common.MapStr{"event": "metric", "name": "metric"}, - "service": common.MapStr{"name": "myservice"}, - "event": common.MapStr{"outcome": eventOutcome}, - "metric_field": 123.0, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.internal.myservice", + "processor": common.MapStr{"event": "metric", "name": "metric"}, + "service": common.MapStr{"name": "myservice"}, + "transaction": common.MapStr{"type": trType, "name": trName}, + "span": common.MapStr{ + "type": spType, "subtype": spSubtype, + "self_time": common.MapStr{ + "count": 123.0, + }, + }, }, }, - Msg: "Payload with event categorization metadata.", + Msg: "Payload with breakdown metrics.", }, { Metricset: &Metricset{ - Metadata: metadata, - Labels: common.MapStr{"a.b": "a.b.value"}, Timestamp: timestamp, + Metadata: metadata, + Event: MetricsetEventCategorization{Outcome: eventOutcome}, + Transaction: MetricsetTransaction{ + Type: trType, + Name: trName, + Result: trResult, + Root: true, + }, + TimeseriesInstanceID: "foo", Samples: []Sample{ { - Name: "a.counter", - Value: 612, - }, - { - Name: "some.gauge", - Value: 9.16, - }, - { - Name: "histo.gram", + Name: "transaction.duration.histogram", Value: 666, // Value is ignored when Counts/Values are specified Counts: []int64{1, 2, 3}, Values: []float64{4.5, 6.0, 9.0}, }, }, - Span: MetricsetSpan{Type: spType, Subtype: spSubtype}, - Transaction: MetricsetTransaction{Type: trType, Name: trName}, }, Output: []common.MapStr{ { - "processor": common.MapStr{"event": "metric", "name": "metric"}, - "service": common.MapStr{"name": "myservice"}, - "transaction": common.MapStr{"name": trName, "type": trType}, - "span": common.MapStr{"type": spType, "subtype": spSubtype}, - "labels": common.MapStr{"a.b": "a.b.value"}, - - "a": common.MapStr{"counter": float64(612)}, - "some": common.MapStr{"gauge": float64(9.16)}, - "histo": common.MapStr{ - "gram": common.MapStr{ - "counts": []int64{1, 2, 3}, - "values": []float64{4.5, 6.0, 9.0}, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.internal.myservice", + "processor": common.MapStr{"event": "metric", "name": "metric"}, + "service": common.MapStr{"name": "myservice"}, + "event": common.MapStr{"outcome": eventOutcome}, + "timeseries": common.MapStr{"instance": "foo"}, + "transaction": common.MapStr{ + "type": trType, + "name": trName, + "result": trResult, + "root": true, + "duration": common.MapStr{ + "histogram": common.MapStr{ + "counts": []int64{1, 2, 3}, + "values": []float64{4.5, 6.0, 9.0}, + }, }, }, }, }, - Msg: "Payload with valid metric.", + Msg: "Payload with transaction duration.", }, { Metricset: &Metricset{ @@ -194,8 +195,10 @@ func TestTransform(t *testing.T) { }, Output: []common.MapStr{ { - "processor": common.MapStr{"event": "metric", "name": "metric"}, - "service": common.MapStr{"name": "myservice"}, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.internal.myservice", + "processor": common.MapStr{"event": "metric", "name": "metric"}, + "service": common.MapStr{"name": "myservice"}, "span": common.MapStr{"type": spType, "subtype": spSubtype, "destination": common.MapStr{"service": common.MapStr{"resource": resource}}}, "destination": common.MapStr{"service": common.MapStr{"response_time": common.MapStr{ diff --git a/model/modeldecoder/rumv3/metricset_test.go b/model/modeldecoder/rumv3/metricset_test.go index 809827b538f..a2c80b991ee 100644 --- a/model/modeldecoder/rumv3/metricset_test.go +++ b/model/modeldecoder/rumv3/metricset_test.go @@ -22,12 +22,13 @@ import ( "testing" "time" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/elastic/apm-server/decoder" "github.com/elastic/apm-server/model" "github.com/elastic/apm-server/model/modeldecoder" "github.com/elastic/apm-server/model/modeldecoder/modeldecodertest" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" ) func TestResetMetricsetOnRelease(t *testing.T) { diff --git a/model/profile.go b/model/profile.go index 666ca477976..566938453c2 100644 --- a/model/profile.go +++ b/model/profile.go @@ -26,6 +26,7 @@ import ( "github.com/gofrs/uuid" "github.com/google/pprof/profile" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/transform" "github.com/elastic/apm-server/utility" "github.com/elastic/beats/v7/libbeat/beat" @@ -66,6 +67,11 @@ func (pp PprofProfile) Transform(ctx context.Context, _ *transform.Config) []bea profileID = fmt.Sprintf("%x", uuid) } + // Profiles are stored in their own "metrics" data stream, with a data + // set per service. This enables managing retention of profiling data + // per-service, and indepedently of lower volume metrics. + dataset := fmt.Sprintf("apm.profiling.%s", datastreams.NormalizeServiceName(pp.Metadata.Service.Name)) + samples := make([]beat.Event, len(pp.Profile.Sample)) for i, sample := range pp.Profile.Sample { profileFields := common.MapStr{} @@ -116,8 +122,10 @@ func (pp PprofProfile) Transform(ctx context.Context, _ *transform.Config) []bea event := beat.Event{ Timestamp: profileTimestamp, Fields: common.MapStr{ - "processor": profileProcessorEntry, - profileDocType: profileFields, + datastreams.TypeField: datastreams.MetricsType, + datastreams.DatasetField: dataset, + "processor": profileProcessorEntry, + profileDocType: profileFields, }, } pp.Metadata.Set(event.Fields) diff --git a/model/profile_test.go b/model/profile_test.go index 0a021193e84..8bfd75b9017 100644 --- a/model/profile_test.go +++ b/model/profile_test.go @@ -97,7 +97,9 @@ func TestPprofProfileTransform(t *testing.T) { assert.Equal(t, beat.Event{ Timestamp: timestamp, Fields: common.MapStr{ - "processor": common.MapStr{"event": "profile", "name": "profile"}, + "data_stream.type": "metrics", + "data_stream.dataset": "apm.profiling.myservice", + "processor": common.MapStr{"event": "profile", "name": "profile"}, "service": common.MapStr{ "name": "myService", "environment": "staging", diff --git a/model/span.go b/model/span.go index fd767cf56cf..f14c6174b22 100644 --- a/model/span.go +++ b/model/span.go @@ -19,6 +19,7 @@ package model import ( "context" + "fmt" "net" "time" @@ -26,6 +27,7 @@ import ( "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/monitoring" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/transform" "github.com/elastic/apm-server/utility" ) @@ -189,7 +191,13 @@ func (e *Span) Transform(ctx context.Context, cfg *transform.Config) []beat.Even spanFrameCounter.Add(int64(frames)) } + // Spans are stored in a "traces" data stream along with transactions. + dataset := fmt.Sprintf("apm.%s", datastreams.NormalizeServiceName(e.Metadata.Service.Name)) + fields := common.MapStr{ + datastreams.TypeField: datastreams.TracesType, + datastreams.DatasetField: dataset, + "processor": spanProcessorEntry, spanDocType: e.fields(ctx, cfg), } diff --git a/model/span_test.go b/model/span_test.go index d1e2a85ced6..2d1f8e26165 100644 --- a/model/span_test.go +++ b/model/span_test.go @@ -58,8 +58,10 @@ func TestSpanTransform(t *testing.T) { Msg: "Span without a Stacktrace", Span: Span{Timestamp: timestamp, Metadata: metadata}, Output: common.MapStr{ - "processor": common.MapStr{"event": "span", "name": "transaction"}, - "service": common.MapStr{"name": serviceName, "environment": env, "version": serviceVersion}, + "data_stream.type": "traces", + "data_stream.dataset": "apm.myservice", + "processor": common.MapStr{"event": "span", "name": "transaction"}, + "service": common.MapStr{"name": serviceName, "environment": env, "version": serviceVersion}, "span": common.MapStr{ "duration": common.MapStr{"us": 0}, "name": "", @@ -74,8 +76,10 @@ func TestSpanTransform(t *testing.T) { Msg: "Span with outcome", Span: Span{Timestamp: timestamp, Metadata: metadata, Outcome: "success"}, Output: common.MapStr{ - "processor": common.MapStr{"event": "span", "name": "transaction"}, - "service": common.MapStr{"name": serviceName, "environment": env, "version": serviceVersion}, + "data_stream.type": "traces", + "data_stream.dataset": "apm.myservice", + "processor": common.MapStr{"event": "span", "name": "transaction"}, + "service": common.MapStr{"name": serviceName, "environment": env, "version": serviceVersion}, "span": common.MapStr{ "duration": common.MapStr{"us": 0}, "name": "", @@ -121,6 +125,8 @@ func TestSpanTransform(t *testing.T) { Message: &Message{QueueName: tests.StringPtr("users")}, }, Output: common.MapStr{ + "data_stream.type": "traces", + "data_stream.dataset": "apm.myservice", "span": common.MapStr{ "id": hexID, "duration": common.MapStr{"us": 1200}, diff --git a/model/transaction.go b/model/transaction.go index 4ae0815ae53..586aef85a41 100644 --- a/model/transaction.go +++ b/model/transaction.go @@ -19,12 +19,14 @@ package model import ( "context" + "fmt" "time" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" "github.com/elastic/beats/v7/libbeat/monitoring" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/transform" "github.com/elastic/apm-server/utility" ) @@ -111,7 +113,13 @@ func (e *Transaction) fields() common.MapStr { func (e *Transaction) Transform(_ context.Context, _ *transform.Config) []beat.Event { transactionTransformations.Inc() + // Transactions are stored in a "traces" data stream along with spans. + dataset := fmt.Sprintf("apm.%s", datastreams.NormalizeServiceName(e.Metadata.Service.Name)) + fields := common.MapStr{ + datastreams.TypeField: datastreams.TracesType, + datastreams.DatasetField: dataset, + "processor": transactionProcessorEntry, transactionDocType: e.fields(), } diff --git a/model/transaction_test.go b/model/transaction_test.go index 294b4fb236f..4fd04bacd41 100644 --- a/model/transaction_test.go +++ b/model/transaction_test.go @@ -181,10 +181,12 @@ func TestEventsTransformWithMetadata(t *testing.T) { events := txWithContext.Transform(context.Background(), &transform.Config{}) require.Len(t, events, 1) assert.Equal(t, events[0].Fields, common.MapStr{ - "user": common.MapStr{"id": "123", "name": "jane"}, - "client": common.MapStr{"ip": ip}, - "source": common.MapStr{"ip": ip}, - "user_agent": common.MapStr{"original": userAgent}, + "data_stream.type": "traces", + "data_stream.dataset": "apm." + serviceName, + "user": common.MapStr{"id": "123", "name": "jane"}, + "client": common.MapStr{"ip": ip}, + "source": common.MapStr{"ip": ip}, + "user_agent": common.MapStr{"original": userAgent}, "host": common.MapStr{ "architecture": "darwin", "hostname": "a.b.c", diff --git a/processor/otel/test_approved/consume_span.approved.json b/processor/otel/test_approved/consume_span.approved.json index 27532f1aa4c..38d72b66e0b 100644 --- a/processor/otel/test_approved/consume_span.approved.json +++ b/processor/otel/test_approved/consume_span.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -38,6 +40,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/otel/test_approved/jaeger_sampling_rate.approved.json b/processor/otel/test_approved/jaeger_sampling_rate.approved.json index 62dd8bc9954..cb858f95734 100644 --- a/processor/otel/test_approved/jaeger_sampling_rate.approved.json +++ b/processor/otel/test_approved/jaeger_sampling_rate.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -45,6 +47,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/otel/test_approved/metadata_jaeger-no-language.approved.json b/processor/otel/test_approved/metadata_jaeger-no-language.approved.json index c2b0e86f0ee..7947c0590d6 100644 --- a/processor/otel/test_approved/metadata_jaeger-no-language.approved.json +++ b/processor/otel/test_approved/metadata_jaeger-no-language.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "3.4.12" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/metadata_jaeger-version.approved.json b/processor/otel/test_approved/metadata_jaeger-version.approved.json index d3254dc9a11..1968c9e3e6c 100644 --- a/processor/otel/test_approved/metadata_jaeger-version.approved.json +++ b/processor/otel/test_approved/metadata_jaeger-version.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger/PHP", "version": "3.4.12" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/metadata_jaeger.approved.json b/processor/otel/test_approved/metadata_jaeger.approved.json index 878f9244434..12045a12e69 100644 --- a/processor/otel/test_approved/metadata_jaeger.approved.json +++ b/processor/otel/test_approved/metadata_jaeger.approved.json @@ -7,6 +7,8 @@ "name": "Jaeger/C++", "version": "3.2.1" }, + "data_stream.dataset": "apm.foo", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/metadata_jaeger_full-traceid.approved.json b/processor/otel/test_approved/metadata_jaeger_full-traceid.approved.json index c5c53999fe4..f08c8b749b5 100644 --- a/processor/otel/test_approved/metadata_jaeger_full-traceid.approved.json +++ b/processor/otel/test_approved/metadata_jaeger_full-traceid.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/metadata_jaeger_minimal.approved.json b/processor/otel/test_approved/metadata_jaeger_minimal.approved.json index 23443e1c37e..2ea014e11d3 100644 --- a/processor/otel/test_approved/metadata_jaeger_minimal.approved.json +++ b/processor/otel/test_approved/metadata_jaeger_minimal.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/metadata_minimal.approved.json b/processor/otel/test_approved/metadata_minimal.approved.json index 34faf081ee8..34008f72ff6 100644 --- a/processor/otel/test_approved/metadata_minimal.approved.json +++ b/processor/otel/test_approved/metadata_minimal.approved.json @@ -6,6 +6,8 @@ "name": "Foo", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/span_jaeger_custom.approved.json b/processor/otel/test_approved/span_jaeger_custom.approved.json index 52caa6e6884..1ac4cb50267 100644 --- a/processor/otel/test_approved/span_jaeger_custom.approved.json +++ b/processor/otel/test_approved/span_jaeger_custom.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/otel/test_approved/span_jaeger_db.approved.json b/processor/otel/test_approved/span_jaeger_db.approved.json index d09666b5ab8..af989813dc9 100644 --- a/processor/otel/test_approved/span_jaeger_db.approved.json +++ b/processor/otel/test_approved/span_jaeger_db.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "destination": { "address": "db", "port": 3306 diff --git a/processor/otel/test_approved/span_jaeger_http.approved.json b/processor/otel/test_approved/span_jaeger_http.approved.json index f0730302c8d..8bc36446961 100644 --- a/processor/otel/test_approved/span_jaeger_http.approved.json +++ b/processor/otel/test_approved/span_jaeger_http.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "destination": { "address": "foo.bar.com", "port": 80 @@ -79,6 +81,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -138,6 +142,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "grouping_key": "23b7ac1bdf1ca957f9f581cfadee467c", "log": { @@ -192,6 +198,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -248,6 +256,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -304,6 +314,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -360,6 +372,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "grouping_key": "c9221918248f05433f6b81c46a666aee", "log": { diff --git a/processor/otel/test_approved/span_jaeger_http_status_code.approved.json b/processor/otel/test_approved/span_jaeger_http_status_code.approved.json index b0eaa635f99..7ee56b57b25 100644 --- a/processor/otel/test_approved/span_jaeger_http_status_code.approved.json +++ b/processor/otel/test_approved/span_jaeger_http_status_code.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "destination": { "address": "foo.bar.com", "port": 80 diff --git a/processor/otel/test_approved/span_jaeger_https_default_port.approved.json b/processor/otel/test_approved/span_jaeger_https_default_port.approved.json index 118982f1120..af475472371 100644 --- a/processor/otel/test_approved/span_jaeger_https_default_port.approved.json +++ b/processor/otel/test_approved/span_jaeger_https_default_port.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "destination": { "address": "foo.bar.com", "port": 443 diff --git a/processor/otel/test_approved/span_jaeger_messaging.approved.json b/processor/otel/test_approved/span_jaeger_messaging.approved.json index 09358952df0..032f4516de9 100644 --- a/processor/otel/test_approved/span_jaeger_messaging.approved.json +++ b/processor/otel/test_approved/span_jaeger_messaging.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "destination": { "address": "mq", "port": 1234 diff --git a/processor/otel/test_approved/transaction_jaeger_custom.approved.json b/processor/otel/test_approved/transaction_jaeger_custom.approved.json index 7146dcf5257..cf301f83203 100644 --- a/processor/otel/test_approved/transaction_jaeger_custom.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_custom.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/transaction_jaeger_full.approved.json b/processor/otel/test_approved/transaction_jaeger_full.approved.json index d99eeeb0ba5..7ffece71652 100644 --- a/processor/otel/test_approved/transaction_jaeger_full.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_full.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -74,6 +76,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -139,6 +143,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "grouping_key": "23b7ac1bdf1ca957f9f581cfadee467c", "log": { @@ -199,6 +205,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -261,6 +269,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -323,6 +333,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "exception": [ { @@ -385,6 +397,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.error.unknown", + "data_stream.type": "logs", "error": { "grouping_key": "c9221918248f05433f6b81c46a666aee", "log": { diff --git a/processor/otel/test_approved/transaction_jaeger_no_attrs.approved.json b/processor/otel/test_approved/transaction_jaeger_no_attrs.approved.json index b25646f7724..81eb60c050b 100644 --- a/processor/otel/test_approved/transaction_jaeger_no_attrs.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_no_attrs.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "failure" }, diff --git a/processor/otel/test_approved/transaction_jaeger_type_component.approved.json b/processor/otel/test_approved/transaction_jaeger_type_component.approved.json index 1a54e23acd3..b414c1171e4 100644 --- a/processor/otel/test_approved/transaction_jaeger_type_component.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_type_component.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/transaction_jaeger_type_messaging.approved.json b/processor/otel/test_approved/transaction_jaeger_type_messaging.approved.json index bcb21fb6051..3ca0d234b8f 100644 --- a/processor/otel/test_approved/transaction_jaeger_type_messaging.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_type_messaging.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/otel/test_approved/transaction_jaeger_type_request.approved.json b/processor/otel/test_approved/transaction_jaeger_type_request.approved.json index 649a4bbc419..9f10e0ec06f 100644 --- a/processor/otel/test_approved/transaction_jaeger_type_request.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_type_request.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "failure" }, diff --git a/processor/otel/test_approved/transaction_jaeger_type_request_result.approved.json b/processor/otel/test_approved/transaction_jaeger_type_request_result.approved.json index 965c35a5587..679228c4af0 100644 --- a/processor/otel/test_approved/transaction_jaeger_type_request_result.approved.json +++ b/processor/otel/test_approved/transaction_jaeger_type_request_result.approved.json @@ -6,6 +6,8 @@ "name": "Jaeger", "version": "unknown" }, + "data_stream.dataset": "apm.unknown", + "data_stream.type": "traces", "event": { "outcome": "success" }, diff --git a/processor/stream/package_tests/error_attrs_test.go b/processor/stream/package_tests/error_attrs_test.go index bc234c4747d..5a9c7eb5b82 100644 --- a/processor/stream/package_tests/error_attrs_test.go +++ b/processor/stream/package_tests/error_attrs_test.go @@ -110,6 +110,7 @@ func errorCondRequiredKeys() map[string]tests.Condition { func errorKeywordExceptionKeys() *tests.Set { return tests.NewSet( + "data_stream.type", "data_stream.dataset", "data_stream.namespace", "processor.event", "processor.name", "error.grouping_key", "context.tags", "transaction.name", "event.outcome", // not relevant diff --git a/processor/stream/package_tests/intake_test_processor.go b/processor/stream/package_tests/intake_test_processor.go index c85fb7c4438..e5efab0e89e 100644 --- a/processor/stream/package_tests/intake_test_processor.go +++ b/processor/stream/package_tests/intake_test_processor.go @@ -27,6 +27,7 @@ import ( "github.com/elastic/beats/v7/libbeat/beat" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/decoder" "github.com/elastic/apm-server/model" "github.com/elastic/apm-server/model/modeldecoder" @@ -142,6 +143,17 @@ func (p *intakeTestProcessor) Process(buf []byte) ([]beat.Event, error) { } } + for _, event := range events { + // TODO(axw) migrate all of these tests to systemtest, + // so we can use the proper event publishing pipeline. + // https://github.com/elastic/apm-server/issues/4408 + // + // We need to set the data_stream.namespace field manually; + // it would normally be set by the libbeat pipeline by a + // processor. + event.Fields.Put(datastreams.NamespaceField, "default") + } + if len(result.Errors) > 0 { return events, errors.New(result.Error()) } diff --git a/processor/stream/package_tests/metadata_attrs_test.go b/processor/stream/package_tests/metadata_attrs_test.go index 67883ef8992..de05c682361 100644 --- a/processor/stream/package_tests/metadata_attrs_test.go +++ b/processor/stream/package_tests/metadata_attrs_test.go @@ -124,7 +124,9 @@ func TestMetadataPayloadAttrsMatchFields(t *testing.T) { func TestKeywordLimitationOnMetadataAttrs(t *testing.T) { metadataProcSetup().KeywordLimitation( t, - tests.NewSet("processor.event", "processor.name", + tests.NewSet( + "data_stream.type", "data_stream.dataset", "data_stream.namespace", + "processor.event", "processor.name", "process.args", tests.Group("observer"), tests.Group("event"), diff --git a/processor/stream/package_tests/span_attrs_test.go b/processor/stream/package_tests/span_attrs_test.go index 5d83945bc91..4eb0c252689 100644 --- a/processor/stream/package_tests/span_attrs_test.go +++ b/processor/stream/package_tests/span_attrs_test.go @@ -129,6 +129,7 @@ func transactionContext() *tests.Set { func spanKeywordExceptionKeys() *tests.Set { return tests.Union(tests.NewSet( + "data_stream.type", "data_stream.dataset", "data_stream.namespace", "processor.event", "processor.name", "context.tags", "transaction.type", "transaction.name", "event.outcome", diff --git a/processor/stream/package_tests/transaction_attrs_test.go b/processor/stream/package_tests/transaction_attrs_test.go index bee0a593cdd..4da0d241ccb 100644 --- a/processor/stream/package_tests/transaction_attrs_test.go +++ b/processor/stream/package_tests/transaction_attrs_test.go @@ -92,6 +92,7 @@ func transactionRequiredKeys() *tests.Set { func transactionKeywordExceptionKeys() *tests.Set { return tests.NewSet( + "data_stream.type", "data_stream.dataset", "data_stream.namespace", "processor.event", "processor.name", "transaction.marks", "context.tags", diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json index 54f576a7064..0389ee8613c 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationErrors.approved.json @@ -33,6 +33,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.error.service1", + "data_stream.type": "logs", "error": { "culprit": "my.module.function_name", "custom": { @@ -375,6 +377,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.error.1234_service_12a3", + "data_stream.type": "logs", "error": { "grouping_key": "dc8dd667f7036ec5f0bae87bf2188243", "id": "xFoaabb123FFFFFF", @@ -479,6 +483,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.error.1234_service_12a3", + "data_stream.type": "logs", "error": { "exception": [ { @@ -579,6 +585,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.error.service1", + "data_stream.type": "logs", "error": { "exception": [ { @@ -685,6 +693,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.error.1234_service_12a3", + "data_stream.type": "logs", "error": { "grouping_key": "d6b3f958dfea98dc9ed2b57d5f0c48bb", "id": "abcdef0123456789", diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationEvents.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationEvents.approved.json index 599c731aad3..d44e28bd1f4 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationEvents.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationEvents.approved.json @@ -13,6 +13,8 @@ "container": { "id": "8ec7ceb990749e79b37f6dc6cd3628633618d6ce412553a552a0fa6b69419ad4" }, + "data_stream.dataset": "apm.experimental_java", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -194,6 +196,8 @@ "container": { "id": "8ec7ceb990749e79b37f6dc6cd3628633618d6ce412553a552a0fa6b69419ad4" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -339,6 +343,8 @@ "container": { "id": "8ec7ceb990749e79b37f6dc6cd3628633618d6ce412553a552a0fa6b69419ad4" }, + "data_stream.dataset": "apm.internal.1234_service_12a3", + "data_stream.type": "metrics", "dotted": { "float": { "gauge": 6.12 @@ -463,6 +469,8 @@ "container": { "id": "8ec7ceb990749e79b37f6dc6cd3628633618d6ce412553a552a0fa6b69419ad4" }, + "data_stream.dataset": "apm.error.service1", + "data_stream.type": "logs", "error": { "culprit": "opbeans.controllers.DTInterceptor.preHandle(DTInterceptor.java:73)", "custom": { diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidEvent.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidEvent.approved.json index bb7538be513..f659fa936a9 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidEvent.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidEvent.approved.json @@ -6,6 +6,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidJSONEvent.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidJSONEvent.approved.json index bb7538be513..f659fa936a9 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidJSONEvent.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationInvalidJSONEvent.approved.json @@ -6,6 +6,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationMetadataNullValues.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationMetadataNullValues.approved.json index a287923824a..28a23968ebf 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationMetadataNullValues.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationMetadataNullValues.approved.json @@ -6,6 +6,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.error.1234_service_12a3", + "data_stream.type": "logs", "error": { "grouping_key": "d6b3f958dfea98dc9ed2b57d5f0c48bb", "id": "abcdef0123456789", diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationMetricsets.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationMetricsets.approved.json index 19762863b35..7290188947c 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationMetricsets.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationMetricsets.approved.json @@ -7,6 +7,8 @@ "version": "3.14.0" }, "byte_counter": 1, + "data_stream.dataset": "apm.internal.1234_service_12a3", + "data_stream.type": "metrics", "dotted": { "float": { "gauge": 6.12 @@ -97,6 +99,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "metrics", "go": { "memstats": { "heap": { @@ -141,6 +145,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "metrics", "host": { "ip": "192.0.0.1" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationMinimalService.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationMinimalService.approved.json index bc593968dfd..640713b5f48 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationMinimalService.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationMinimalService.approved.json @@ -6,6 +6,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "metrics", "go": { "memstats": { "heap": { @@ -35,6 +37,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.error.1234_service_12a3", + "data_stream.type": "logs", "error": { "grouping_key": "d6b3f958dfea98dc9ed2b57d5f0c48bb", "id": "abcdef0123456789", diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationOptionalTimestamps.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationOptionalTimestamps.approved.json index e4c1afa17f6..00525a34146 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationOptionalTimestamps.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationOptionalTimestamps.approved.json @@ -6,6 +6,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -81,6 +83,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -161,6 +165,8 @@ "name": "elastic-node", "version": "3.14.0" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "metrics", "host": { "architecture": "x64", "hostname": "prod1.example.com", diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationRumErrors.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationRumErrors.approved.json index 75223646be4..943b273fc39 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationRumErrors.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationRumErrors.approved.json @@ -9,6 +9,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.error.apm_agent_js", + "data_stream.type": "logs", "error": { "culprit": "test/e2e/general-usecase/bundle.js.map", "exception": [ diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationRumTransactions.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationRumTransactions.approved.json index 8fc3791df8c..79051b7e7da 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationRumTransactions.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationRumTransactions.approved.json @@ -9,6 +9,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_agent_js", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -75,6 +77,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_agent_js", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json index 0d46024b789..f822471e299 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationSpans.approved.json @@ -34,6 +34,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -149,6 +151,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -265,6 +269,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -385,6 +391,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -502,6 +510,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "destination": { "address": "0:0::0:1", "ip": "0:0::0:1", @@ -701,6 +711,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.backendspans", + "data_stream.type": "traces", "destination": { "address": "0:0::0:1", "ip": "0:0::0:1" diff --git a/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json b/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json index 7ff6a5f5ca1..40942881c59 100644 --- a/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeIntegrationTransactions.approved.json @@ -29,6 +29,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -146,6 +148,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -354,6 +358,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.service1", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -494,6 +500,8 @@ "container": { "id": "container-id" }, + "data_stream.dataset": "apm.1234_service_12a3", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, diff --git a/processor/stream/test_approved_es_documents/testIntakeRUMV3Errors.approved.json b/processor/stream/test_approved_es_documents/testIntakeRUMV3Errors.approved.json index c35eb2463e9..9d4b28ce273 100644 --- a/processor/stream/test_approved_es_documents/testIntakeRUMV3Errors.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeRUMV3Errors.approved.json @@ -9,6 +9,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.error.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "logs", "error": { "culprit": "test/e2e/general-usecase/app.e2e-bundle.min.js?token=secret", "custom": { diff --git a/processor/stream/test_approved_es_documents/testIntakeRUMV3Events.approved.json b/processor/stream/test_approved_es_documents/testIntakeRUMV3Events.approved.json index e5c85d57ebe..6cf3af3b8c7 100644 --- a/processor/stream/test_approved_es_documents/testIntakeRUMV3Events.approved.json +++ b/processor/stream/test_approved_es_documents/testIntakeRUMV3Events.approved.json @@ -9,6 +9,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -155,6 +157,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -224,6 +228,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -293,6 +299,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "destination": { "address": "localhost", "port": 8000 @@ -383,6 +391,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -451,6 +461,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "destination": { "address": "localhost", "port": 8000 @@ -541,6 +553,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "destination": { "address": "localhost", "port": 8003 @@ -631,6 +645,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "destination": { "address": "localhost", "port": 8003 @@ -722,6 +738,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -813,6 +831,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.internal.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "metrics", "labels": { "testTagKey": "testTagValue" }, @@ -868,6 +888,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.internal.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "metrics", "labels": { "testTagKey": "testTagValue" }, @@ -923,6 +945,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.internal.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "metrics", "labels": { "testTagKey": "testTagValue" }, @@ -978,6 +1002,8 @@ "client": { "ip": "192.0.0.1" }, + "data_stream.dataset": "apm.internal.apm_a_rum_test_e2e_general_usecase", + "data_stream.type": "metrics", "labels": { "tag1": "value1", "testTagKey": "testTagValue" diff --git a/publish/pub.go b/publish/pub.go index 97c3fb5256c..2df520ffc76 100644 --- a/publish/pub.go +++ b/publish/pub.go @@ -26,6 +26,7 @@ import ( "github.com/pkg/errors" "go.elastic.co/apm" + "github.com/elastic/apm-server/datastreams" "github.com/elastic/apm-server/transform" "github.com/elastic/beats/v7/libbeat/beat" "github.com/elastic/beats/v7/libbeat/common" @@ -61,6 +62,7 @@ type PendingReq struct { type PublisherConfig struct { Info beat.Info Pipeline string + Processor beat.ProcessorList TransformConfig *transform.Config } @@ -86,6 +88,7 @@ func NewPublisher(pipeline beat.Pipeline, tracer *apm.Tracer, cfg *PublisherConf processingCfg := beat.ProcessingConfig{ Fields: common.MapStr{ + datastreams.NamespaceField: "default", "observer": common.MapStr{ "type": cfg.Info.Beat, "hostname": cfg.Info.Hostname, @@ -95,6 +98,7 @@ func NewPublisher(pipeline beat.Pipeline, tracer *apm.Tracer, cfg *PublisherConf "ephemeral_id": cfg.Info.EphemeralID.String(), }, }, + Processor: cfg.Processor, } if cfg.Pipeline != "" { processingCfg.Meta = map[string]interface{}{"pipeline": cfg.Pipeline} diff --git a/testdata/jaeger/batch_0.approved.json b/testdata/jaeger/batch_0.approved.json index e30bc33d761..f84030bb217 100644 --- a/testdata/jaeger/batch_0.approved.json +++ b/testdata/jaeger/batch_0.approved.json @@ -7,6 +7,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.driver", + "data_stream.type": "traces", "event": { "outcome": "success" }, @@ -60,6 +62,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.driver", + "data_stream.type": "logs", "error": { "exception": [ { @@ -110,6 +114,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.driver", + "data_stream.type": "logs", "error": { "exception": [ { @@ -160,6 +166,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.driver", + "data_stream.type": "logs", "error": { "exception": [ { diff --git a/testdata/jaeger/batch_1.approved.json b/testdata/jaeger/batch_1.approved.json index 336fc199743..5a6e6669a20 100644 --- a/testdata/jaeger/batch_1.approved.json +++ b/testdata/jaeger/batch_1.approved.json @@ -7,6 +7,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -56,6 +58,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -106,6 +110,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -155,6 +161,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -204,6 +212,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -253,6 +263,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -302,6 +314,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -352,6 +366,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -401,6 +417,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -450,6 +468,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -499,6 +519,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -548,6 +570,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -598,6 +622,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -647,6 +673,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.redis", + "data_stream.type": "traces", "event": { "outcome": "unknown" }, @@ -696,6 +724,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.redis", + "data_stream.type": "logs", "error": { "exception": [ { @@ -742,6 +772,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.redis", + "data_stream.type": "logs", "error": { "exception": [ { @@ -788,6 +820,8 @@ "name": "Jaeger/Go", "version": "2.20.1" }, + "data_stream.dataset": "apm.error.redis", + "data_stream.type": "logs", "error": { "exception": [ { diff --git a/tests/fields.go b/tests/fields.go index a33c49d4d4e..03693012f9a 100644 --- a/tests/fields.go +++ b/tests/fields.go @@ -44,6 +44,7 @@ import ( // not part of the payload, e.g. Kibana visualisation attributes. func (ps *ProcessorSetup) PayloadAttrsMatchFields(t *testing.T, payloadAttrsNotInFields, fieldsNotInPayload *Set) { notInFields := Union(payloadAttrsNotInFields, NewSet( + Group("data_stream"), Group("processor"), //dynamically indexed: Group("labels"),