398 lines
514 KiB
Go
398 lines
514 KiB
Go
|
|
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
|
||
|
|
}
|
||
|
|
]
|
||
|
|
}
|
||
|
|
`
|