telegraf/plugins/inputs/cloudwatch_metric_streams/cloudwatch_metric_streams_t...

398 lines
514 KiB
Go
Raw Normal View History

package cloudwatch_metric_streams
import (
"bytes"
"crypto/tls"
"crypto/x509"
"net/http"
"net/url"
"os"
"testing"
"github.com/stretchr/testify/require"
"github.com/influxdata/telegraf/config"
"github.com/influxdata/telegraf/testutil"
)
const (
badMsg = "blahblahblah: 42\n"
emptyMsg = ""
accessKey = "super-secure-password!"
badAccessKey = "super-insecure-password!"
maxBodySize = 524288000
)
var (
pki = testutil.NewPKI("../../../testutil/pki")
)
func newTestCloudWatchMetricStreams() *CloudWatchMetricStreams {
metricStream := &CloudWatchMetricStreams{
Log: testutil.Logger{},
ServiceAddress: "localhost:8080",
Paths: []string{"/write"},
MaxBodySize: config.Size(maxBodySize),
close: make(chan struct{}),
}
return metricStream
}
func newTestMetricStreamAuth() *CloudWatchMetricStreams {
metricStream := newTestCloudWatchMetricStreams()
metricStream.AccessKey = accessKey
return metricStream
}
func newTestMetricStreamHTTPS() *CloudWatchMetricStreams {
metricStream := newTestCloudWatchMetricStreams()
metricStream.ServerConfig = *pki.TLSServerConfig()
return metricStream
}
func newTestCompatibleCloudWatchMetricStreams() *CloudWatchMetricStreams {
metricStream := newTestCloudWatchMetricStreams()
metricStream.APICompatability = true
return metricStream
}
func getHTTPSClient() *http.Client {
tlsConfig, err := pki.TLSClientConfig().TLSConfig()
if err != nil {
panic(err)
}
return &http.Client{
Transport: &http.Transport{
TLSClientConfig: tlsConfig,
},
}
}
func createURL(metricStream *CloudWatchMetricStreams, scheme string, path string, rawquery string) string {
u := url.URL{
Scheme: scheme,
Host: "localhost:8080",
Path: path,
RawQuery: rawquery,
}
return u.String()
}
func TestInvalidListenerConfig(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
metricStream.ServiceAddress = "address_without_port"
acc := &testutil.Accumulator{}
require.Error(t, metricStream.Start(acc))
// Stop is called when any ServiceInput fails to start; it must succeed regardless of state
metricStream.Stop()
}
func TestWriteHTTPSNoClientAuth(t *testing.T) {
metricStream := newTestMetricStreamHTTPS()
metricStream.TLSAllowedCACerts = nil
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
cas := x509.NewCertPool()
cas.AppendCertsFromPEM([]byte(pki.ReadServerCert()))
noClientAuthClient := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
RootCAs: cas,
},
},
}
// post single message to the metric stream listener
resp, err := noClientAuthClient.Post(createURL(metricStream, "https", "/write", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
func TestWriteHTTPSWithClientAuth(t *testing.T) {
metricStream := newTestMetricStreamHTTPS()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post single message to the metric stream listener
resp, err := getHTTPSClient().Post(createURL(metricStream, "https", "/write", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
func TestWriteHTTPSuccessfulAuth(t *testing.T) {
metricStream := newTestMetricStreamAuth()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
client := &http.Client{}
req, err := http.NewRequest("POST", createURL(metricStream, "http", "/write", ""), bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
req.Header.Set("X-Amz-Firehose-Access-Key", accessKey)
// post single message to the metric stream listener
resp, err := client.Do(req)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, http.StatusOK, resp.StatusCode)
}
func TestWriteHTTPFailedAuth(t *testing.T) {
metricStream := newTestMetricStreamAuth()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
client := &http.Client{}
req, err := http.NewRequest("POST", createURL(metricStream, "http", "/write", ""), bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
req.Header.Set("X-Amz-Firehose-Access-Key", badAccessKey)
// post single message to the metric stream listener
resp, err := client.Do(req)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, http.StatusUnauthorized, resp.StatusCode)
}
func TestWriteHTTP(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post single message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
func TestWriteHTTPMultipleRecords(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post multiple records to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(records)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
func TestWriteHTTPExactMaxBodySize(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
metricStream.MaxBodySize = config.Size(len(record))
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post single message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
func TestWriteHTTPVerySmallMaxBody(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
metricStream.MaxBodySize = config.Size(512)
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post single message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 413, resp.StatusCode)
}
func TestReceive404ForInvalidEndpoint(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post single message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/foobar", ""), "", bytes.NewBuffer([]byte(record)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 404, resp.StatusCode)
}
func TestWriteHTTPInvalid(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post a badly formatted message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(badMsg)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 400, resp.StatusCode)
}
func TestWriteHTTPEmpty(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// post empty message to the metric stream listener
resp, err := http.Post(createURL(metricStream, "http", "/write", ""), "", bytes.NewBuffer([]byte(emptyMsg)))
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 400, resp.StatusCode)
}
func TestComposeMetrics(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// compose a Data object for writing
data := Data{
MetricStreamName: "cloudwatch-metric-stream",
AccountID: "546734499701",
Region: "us-west-2",
Namespace: "AWS/EC2",
MetricName: "CPUUtilization",
Dimensions: map[string]string{"AutoScalingGroupName": "test-autoscaling-group"},
Timestamp: 1651679400000,
Value: map[string]float64{"max": 0.4366666666666666, "min": 0.3683333333333333, "sum": 1.9399999999999997, "count": 5.0},
Unit: "Percent",
}
// Compose the metrics from data
metricStream.composeMetrics(data)
acc.Wait(1)
acc.AssertContainsTaggedFields(t, "aws_ec2_cpuutilization",
map[string]interface{}{"max": 0.4366666666666666, "min": 0.3683333333333333, "sum": 1.9399999999999997, "count": 5.0},
map[string]string{"AutoScalingGroupName": "test-autoscaling-group", "accountId": "546734499701", "region": "us-west-2"},
)
}
func TestComposeAPICompatibleMetrics(t *testing.T) {
metricStream := newTestCompatibleCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
// compose a Data object for writing
data := Data{
MetricStreamName: "cloudwatch-metric-stream",
AccountID: "546734499701",
Region: "us-west-2",
Namespace: "AWS/EC2",
MetricName: "CPUUtilization",
Dimensions: map[string]string{"AutoScalingGroupName": "test-autoscaling-group"},
Timestamp: 1651679400000,
Value: map[string]float64{"max": 0.4366666666666666, "min": 0.3683333333333333, "sum": 1.9399999999999997, "count": 5.0},
Unit: "Percent",
}
// Compose the metrics from data
metricStream.composeMetrics(data)
acc.Wait(1)
acc.AssertContainsTaggedFields(t, "aws_ec2_cpuutilization",
map[string]interface{}{"maximum": 0.4366666666666666, "minimum": 0.3683333333333333, "sum": 1.9399999999999997, "samplecount": 5.0},
map[string]string{"AutoScalingGroupName": "test-autoscaling-group", "accountId": "546734499701", "region": "us-west-2"},
)
}
// post GZIP encoded data to the metric stream listener
func TestWriteHTTPGzippedData(t *testing.T) {
metricStream := newTestCloudWatchMetricStreams()
acc := &testutil.Accumulator{}
require.NoError(t, metricStream.Init())
require.NoError(t, metricStream.Start(acc))
defer metricStream.Stop()
data, err := os.ReadFile("./testdata/records.gz")
require.NoError(t, err)
req, err := http.NewRequest("POST", createURL(metricStream, "http", "/write", ""), bytes.NewBuffer(data))
require.NoError(t, err)
req.Header.Set("Content-Encoding", "gzip")
client := &http.Client{}
resp, err := client.Do(req)
require.NoError(t, err)
require.NoError(t, resp.Body.Close())
require.EqualValues(t, 200, resp.StatusCode)
}
const record = `{
"requestId": "c8291d2e-8c46-4f2a-a8df-2562550287ad",
"timestamp": 1651679861072,
"records": [
{
"data": "eyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJDUFVVdGlsaXphdGlvbiIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMGVmYzdmZGYwOWMxMjM0MjgifSwidGltZXN0YW1wIjoxNjUxNjc5NTgwMDAwLCJ2YWx1ZSI6eyJtYXgiOjEwLjAxMTY2NjY2NjY2NjY2NywibWluIjoxMC4wMTE2NjY2NjY2NjY2NjcsInN1bSI6MTAuMDExNjY2NjY2NjY2NjY3LCJjb3VudCI6MS4wfSwidW5pdCI6IlBlcmNlbnQifQ=="
}
]
}
`
const records = `{
"requestId": "c8291d2e-8c46-4f2a-a8df-2562550287ad",
"timestamp": 1651679861072,
"records": [
{
"data": "eyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJEaXNrUmVhZEJ5dGVzIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZVR5cGUiOiJtNWFkLjJ4bGFyZ2UifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjAuMCwibWluIjowLjAsInN1bSI6MC4wLCJjb3VudCI6My4wfSwidW5pdCI6IkJ5dGVzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJTdGF0dXNDaGVja0ZhaWxlZF9JbnN0YW5jZSIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMGNiYmM3ZTAyMWExOWJlMmUifSwidGltZXN0YW1wIjoxNjUxNjc5NTgwMDAwLCJ2YWx1ZSI6eyJtYXgiOjAuMCwibWluIjowLjAsInN1bSI6MC4wLCJjb3VudCI6MS4wfSwidW5pdCI6IkNvdW50In0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJEaXNrUmVhZEJ5dGVzIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZUlkIjoiaS0wMjNkZjdhODI3Y2JjNzY1YyJ9LCJ0aW1lc3RhbXAiOjE2NTE2NzkzNDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50Ijo1LjB9LCJ1bml0IjoiQnl0ZXMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6IkVCU0lPQmFsYW5jZSUiLCJkaW1lbnNpb25zIjp7IkF1dG9TY2FsaW5nR3JvdXBOYW1lIjoiZWRnZS1wcm94eS5nZW5zYW5kYm94LmRlZmF1bHQudXMtd2VzdC0yYi5hbWktMGU3NGJjZTZjNzNiMDNiMmUuMjAyMjA1MDMyMjIwNTkxNDkzMDAwMDAwMDUifSwidGltZXN0YW1wIjoxNjUxNjc5NDAwMDAwLCJ2YWx1ZSI6eyJtYXgiOjEwMC4wLCJtaW4iOjk5LjAsInN1bSI6NDk5LjAsImNvdW50Ijo1LjB9LCJ1bml0IjoiUGVyY2VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiTmV0d29ya0luIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZUlkIjoiaS0wZjQ5MDY5MjRlZjliNzhiYSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6OTQyMTcyNS4wLCJtaW4iOjk0MjE3MjUuMCwic3VtIjo5NDIxNzI1LjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQnl0ZXMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6Ik1ldGFkYXRhTm9Ub2tlbiIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VUeXBlIjoibTVuLjJ4bGFyZ2UifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjYuMCwibWluIjowLjAsInN1bSI6Ni4wLCJjb3VudCI6Mi4wfSwidW5pdCI6Ik5vbmUifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6IkRpc2tXcml0ZUJ5dGVzIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZUlkIjoiaS0wZjc4MzVhNTRlYTM4NDczYSJ9LCJ0aW1lc3RhbXAiOjE2NTE2NzkzNDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50Ijo1LjB9LCJ1bml0IjoiQnl0ZXMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6Ik1ldGFkYXRhTm9Ub2tlbiIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMDdkYmI0ZGZiNjhiMDU2YTYifSwidGltZXN0YW1wIjoxNjUxNjc5NDAwMDAwLCJ2YWx1ZSI6eyJtYXgiOjAuMCwibWluIjowLjAsInN1bSI6MC4wLCJjb3VudCI6NS4wfSwidW5pdCI6Ik5vbmUifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6Ik5ldHdvcmtJbiIsImRpbWVuc2lvbnMiOnsiQXV0b1NjYWxpbmdHcm91cE5hbWUiOiJjb252ZXlvci1yYXBpZDY5LWNvbnZleW9yLXBsYXRmb3JtLXNwb3QyMDIyMDIwOTEzMTgzNTMyMjIwMDAwMDEwYyJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6OC43NzEzMDE5N0U4LCJtaW4iOjMuNTk3NjY5RTcsInN1bSI6OS4xMzEwNjg4N0U4LCJjb3VudCI6Mi4wfSwidW5pdCI6IkJ5dGVzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1
},
{
"data": "eyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVSZWFkQnl0ZXMiLCJkaW1lbnNpb25zIjp7IlZvbHVtZUlkIjoidm9sLTBkZTQ5NDFiNzdlODE3YTEzIn0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJCeXRlcyJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VCUyIsIm1ldHJpY19uYW1lIjoiVm9sdW1lV3JpdGVPcHMiLCJkaW1lbnNpb25zIjp7IlZvbHVtZUlkIjoidm9sLTBhMmUxMmZhYWVlMjE2NTg3In0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJDb3VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VCUyIsIm1ldHJpY19uYW1lIjoiVm9sdW1lV3JpdGVPcHMiLCJkaW1lbnNpb25zIjp7IlZvbHVtZUlkIjoidm9sLTBkYzJkODk1NzY5OTFiZGE4In0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJDb3VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VCUyIsIm1ldHJpY19uYW1lIjoiVm9sdW1lUmVhZEJ5dGVzIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wNWNiOGQxZTdmMzFlYjg0MyJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQnl0ZXMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVdyaXRlT3BzIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wNmQwZTdmZDYxZGZmMjM0YSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk1ODAwMDAsInZhbHVlIjp7Im1heCI6NjAuMCwibWluIjo2MC4wLCJzdW0iOjYwLjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZUlkbGVUaW1lIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wNjJiMGQ1MWEzMTFkMzI1YyJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk1ODAwMDAsInZhbHVlIjp7Im1heCI6NTkuOTUsIm1pbiI6NTkuOTUsInN1bSI6NTkuOTUsImNvdW50IjoxLjB9LCJ1bml0IjoiU2Vjb25kcyJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VCUyIsIm1ldHJpY19uYW1lIjoiVm9sdW1lVG90YWxXcml0ZVRpbWUiLCJkaW1lbnNpb25zIjp7IlZvbHVtZUlkIjoidm9sLTAyMjU2ODFkOTQwOWI2YTVjIn0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjI1MDc4OSwibWluIjowLjI1MDc4OSwic3VtIjowLjI1MDc4OSwiY291bnQiOjEuMH0sInVuaXQiOiJTZWNvbmRzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVXcml0ZU9wcyIsImRpbWVuc2lvbnMiOnsiVm9sdW1lSWQiOiJ2b2wtMGRlNDk0MWI3N2U4MTdhMTMifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjMyMC4wLCJtaW4iOjMyMC4wLCJzdW0iOjMyMC4wLCJjb3VudCI6MS4wfSwidW5pdCI6IkNvdW50In0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVUb3RhbFdyaXRlVGltZSIsImRpbWVuc2lvbnMiOnsiVm9sdW1lSWQiOiJ2b2wtMGU2Y2IzYmIxZmE1ZDBhNGEifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjAuMzE0MDA3LCJtaW4iOjAuMzE0MDA3LCJzdW0iOjAuMzE0MDA3LCJjb3VudCI6MS4wfSwidW5pdCI6IlNlY29uZHMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVRvdGFsV3JpdGVUaW1lIiwiZGltZW5zaW9ucyI6eyJW
},
{
"data": "eyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVSZWFkT3BzIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wN2U1NWI2ZTgxOTI5MTA5YSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVF1ZXVlTGVuZ3RoIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wZTZjYjNiYjFmYTVkMGE0YSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wMDQ4ODI4MTI1LCJtaW4iOjAuMDA0ODgyODEyNSwic3VtIjowLjAwNDg4MjgxMjUsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVdyaXRlT3BzIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wOGE2NDFjZGJlNzQ2NGZkOCJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVF1ZXVlTGVuZ3RoIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wYzM2NGQxY2U3MWFhNDFkOSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wMDE5NTMxMjUsIm1pbiI6MC4wMDE5NTMxMjUsInN1bSI6MC4wMDE5NTMxMjUsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVF1ZXVlTGVuZ3RoIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wYzg3NjkxMWIxNDEwMTQ3ZiJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk2NDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50IjoxLjB9LCJ1bml0IjoiQ291bnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVJlYWRCeXRlcyIsImRpbWVuc2lvbnMiOnsiVm9sdW1lSWQiOiJ2b2wtMGRjODA3YzA5ZmFlYjMxZDMifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjAuMCwibWluIjowLjAsInN1bSI6MC4wLCJjb3VudCI6MS4wfSwidW5pdCI6IkJ5dGVzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVXcml0ZUJ5dGVzIiwiZGltZW5zaW9ucyI6eyJWb2x1bWVJZCI6InZvbC0wYjA1OTlkZDRkMTQxMjdhMSJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk1ODAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjoxMDM0MjQuMCwiY291bnQiOjE1LjB9LCJ1bml0IjoiQnl0ZXMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IlZvbHVtZVRvdGFsUmVhZFRpbWUiLCJkaW1lbnNpb25zIjp7IlZvbHVtZUlkIjoidm9sLTBjMzY0ZDFjZTcxYWE0MWQ5In0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJTZWNvbmRzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUJTIiwibWV0cmljX25hbWUiOiJWb2x1bWVJZGxlVGltZSIsImRpbWVuc2lvbnMiOnsiVm9sdW1lSWQiOiJ2b2wtMDc0OGM1ZmJiMzExNTBjYzMifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjYwLjAwNDQxNSwibWluIjo2MC4wMDQ0MTUsInN1bSI6NjAuMDA0NDE1LCJjb3VudCI6MS4wfSwidW5pdCI6IlNlY29uZHMifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQlMiLCJtZXRyaWNfbmFtZSI6IkJ1cnN0QmFs
},
{
"data": "eyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJFQlNXcml0ZUJ5dGVzIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZUlkIjoiaS0wYzkzMWE2M2Y4YjVlYTg5OCJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk0MDAwMDAsInZhbHVlIjp7Im1heCI6MjIyNTY2NC4wLCJtaW4iOjIwNTM2MzIuMCwic3VtIjoxLjA2MjYwNDhFNywiY291bnQiOjUuMH0sInVuaXQiOiJCeXRlcyJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiTmV0d29ya1BhY2tldHNJbiIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMGU3NWYzYzQ1YmRjMjk4OTAifSwidGltZXN0YW1wIjoxNjUxNjc5NDAwMDAwLCJ2YWx1ZSI6eyJtYXgiOjgxOTEuMCwibWluIjo2OTgwLjAsInN1bSI6MzcyNjEuMCwiY291bnQiOjUuMH0sInVuaXQiOiJDb3VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiQ1BVVXRpbGl6YXRpb24iLCJkaW1lbnNpb25zIjp7Ikluc3RhbmNlSWQiOiJpLTBlYmU2YWIzZTM3OWY0OGFmIn0sInRpbWVzdGFtcCI6MTY1MTY3OTQwMDAwMCwidmFsdWUiOnsibWF4IjowLjQzMzMzMzMzMzMzMzMzMzMsIm1pbiI6MC4zOTE2NjY2NjY2NjY2NjY2LCJzdW0iOjIuMDgzMzMzMzMzMzMzMzMzLCJjb3VudCI6NS4wfSwidW5pdCI6IlBlcmNlbnQifQp7Im1ldHJpY19zdHJlYW1fbmFtZSI6ImdycG4tc2FuZGJveC1kZXYtY2xvdWR3YXRjaC1tZXRyaWMtc3RyZWFtIiwiYWNjb3VudF9pZCI6IjU0OTczNDM5OTcwOSIsInJlZ2lvbiI6InVzLXdlc3QtMiIsIm5hbWVzcGFjZSI6IkFXUy9FQzIiLCJtZXRyaWNfbmFtZSI6IkVCU1JlYWRPcHMiLCJkaW1lbnNpb25zIjp7Ikluc3RhbmNlSWQiOiJpLTBlNzVmM2M0NWJkYzI5ODkwIn0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJDb3VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiU3RhdHVzQ2hlY2tGYWlsZWQiLCJkaW1lbnNpb25zIjp7Ikluc3RhbmNlSWQiOiJpLTBjNTdiYzYwZDM1ZWYxODM2In0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjowLjAsIm1pbiI6MC4wLCJzdW0iOjAuMCwiY291bnQiOjEuMH0sInVuaXQiOiJDb3VudCJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiRUJTV3JpdGVCeXRlcyIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMGNhNTgwMWZjMjAwMmIwOTkifSwidGltZXN0YW1wIjoxNjUxNjc5NDAwMDAwLCJ2YWx1ZSI6eyJtYXgiOjU0MjcyMC4wLCJtaW4iOjAuMCwic3VtIjoxNzk1MDcyLjAsImNvdW50IjoxNS4wfSwidW5pdCI6IkJ5dGVzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJFQlNXcml0ZU9wcyIsImRpbWVuc2lvbnMiOnsiSW5zdGFuY2VJZCI6ImktMGY4OThjOWIxYzUxMWViNDEifSwidGltZXN0YW1wIjoxNjUxNjc5NjQwMDAwLCJ2YWx1ZSI6eyJtYXgiOjI3MjMzLjAsIm1pbiI6MjcyMzMuMCwic3VtIjoyNzIzMy4wLCJjb3VudCI6MS4wfSwidW5pdCI6IkNvdW50In0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0cmljX25hbWUiOiJOZXR3b3JrSW4iLCJkaW1lbnNpb25zIjp7Ikluc3RhbmNlSWQiOiJpLTBhYTM3MzFlOTVlNjRiYjMzIn0sInRpbWVzdGFtcCI6MTY1MTY3OTY0MDAwMCwidmFsdWUiOnsibWF4IjoxLjA5NzEzNjdFNywibWluIjoxLjA5NzEzNjdFNywic3VtIjoxLjA5NzEzNjdFNywiY291bnQiOjEuMH0sInVuaXQiOiJCeXRlcyJ9CnsibWV0cmljX3N0cmVhbV9uYW1lIjoiZ3Jwbi1zYW5kYm94LWRldi1jbG91ZHdhdGNoLW1ldHJpYy1zdHJlYW0iLCJhY2NvdW50X2lkIjoiNTQ5NzM0Mzk5NzA5IiwicmVnaW9uIjoidXMtd2VzdC0yIiwibmFtZXNwYWNlIjoiQVdTL0VDMiIsIm1ldHJpY19uYW1lIjoiRUJTUmVhZEJ5dGVzIiwiZGltZW5zaW9ucyI6eyJJbnN0YW5jZUlkIjoiaS0wZWJlNmFiM2UzNzlmNDhhZiJ9LCJ0aW1lc3RhbXAiOjE2NTE2Nzk0MDAwMDAsInZhbHVlIjp7Im1heCI6MC4wLCJtaW4iOjAuMCwic3VtIjowLjAsImNvdW50IjoxNS4wfSwidW5pdCI6IkJ5dGVzIn0KeyJtZXRyaWNfc3RyZWFtX25hbWUiOiJncnBuLXNhbmRib3gtZGV2LWNsb3Vkd2F0Y2gtbWV0cmljLXN0cmVhbSIsImFjY291bnRfaWQiOiI1NDk3MzQzOTk3MDkiLCJyZWdpb24iOiJ1cy13ZXN0LTIiLCJuYW1lc3BhY2UiOiJBV1MvRUMyIiwibWV0
}
]
}
`