diff --git a/.gitignore b/.gitignore index 9fdc0060c5..a141a49118 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ hack/**/debug debug.test *.iml .coverage -*.out \ No newline at end of file +*.out +site/ diff --git a/api/event-source.html b/api/event-source.html index ba6282cab4..7ae5c0f765 100644 --- a/api/event-source.html +++ b/api/event-source.html @@ -1337,13 +1337,60 @@

GenericEventSource -value
+url
+ +string + + + +

URL of the gRPC server that implements the event source.

+ + + + +config
string -

Value of the event source

+

Config is the event source configuration

+ + + + +insecure
+ +bool + + + +

Insecure determines the type of connection.

+ + + + +jsonBody
+ +bool + + + +(Optional) +

JSONBody specifies that all event body payload coming from this +source will be JSON

+ + + + +metadata
+ +map[string]string + + + +(Optional) +

Metadata holds the user defined metadata which will passed along the event payload.

@@ -3590,7 +3637,7 @@

Template (Optional) -

Volumes is a list of volumes that can be mounted by containers in a workflow.

+

Volumes is a list of volumes that can be mounted by containers in an eventsource.

diff --git a/api/event-source.md b/api/event-source.md index 3496acaba9..6f44a7e578 100644 --- a/api/event-source.md +++ b/api/event-source.md @@ -2541,7 +2541,27 @@ Description -value
string +url
string + + + + + +

+ +URL of the gRPC server that implements the event source. + +

+ + + + + + + + + +config
string @@ -2549,7 +2569,73 @@ Description

-Value of the event source +Config is the event source configuration + +

+ + + + + + + + + +insecure
bool + + + + + +

+ +Insecure determines the type of connection. + +

+ + + + + + + + + +jsonBody
bool + + + + + +(Optional) + +

+ +JSONBody specifies that all event body payload coming from this source +will be JSON + +

+ + + + + + + + + +metadata
map\[string\]string + + + + + +(Optional) + +

+ +Metadata holds the user defined metadata which will passed along the +event payload.

@@ -6940,8 +7026,8 @@ Container is the main container image to run in the event source pod

-Volumes is a list of volumes that can be mounted by containers in a -workflow. +Volumes is a list of volumes that can be mounted by containers in an +eventsource.

diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 3e136b9fa4..c59327970b 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -886,11 +886,31 @@ "description": "GenericEventSource refers to a generic event source. It can be used to implement a custom event source.", "type": "object", "required": [ - "value" + "url", + "config" ], "properties": { - "value": { - "description": "Value of the event source", + "config": { + "description": "Config is the event source configuration", + "type": "string" + }, + "insecure": { + "description": "Insecure determines the type of connection.", + "type": "boolean" + }, + "jsonBody": { + "description": "JSONBody specifies that all event body payload coming from this source will be JSON", + "type": "boolean" + }, + "metadata": { + "description": "Metadata holds the user defined metadata which will passed along the event payload.", + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "url": { + "description": "URL of the gRPC server that implements the event source.", "type": "string" } } @@ -1813,7 +1833,7 @@ } }, "volumes": { - "description": "Volumes is a list of volumes that can be mounted by containers in a workflow.", + "description": "Volumes is a list of volumes that can be mounted by containers in an eventsource.", "type": "array", "items": { "$ref": "#/definitions/io.k8s.api.core.v1.Volume" diff --git a/docs/assets/generic-eventsource.png b/docs/assets/generic-eventsource.png new file mode 100644 index 0000000000..91de92ac75 Binary files /dev/null and b/docs/assets/generic-eventsource.png differ diff --git a/docs/eventsources/deployment-strategies.md b/docs/eventsources/deployment-strategies.md index e40dbd6b9f..bb49e70b87 100644 --- a/docs/eventsources/deployment-strategies.md +++ b/docs/eventsources/deployment-strategies.md @@ -44,6 +44,7 @@ EventSource object, defaults to 1. - Redis - Resource - Calendar +- Generic ### Replicas Of Recreate Types diff --git a/docs/eventsources/generic.md b/docs/eventsources/generic.md new file mode 100644 index 0000000000..ce062e8ebb --- /dev/null +++ b/docs/eventsources/generic.md @@ -0,0 +1,82 @@ +# Generic EventSource + +Generic eventsource extends Argo-Events eventsources via a simple gRPC contract. This is specifically useful when you want to onboard a custom eventsource implementation. + +## Contract + +In order to qualify as generic eventsource, the eventsource server needs to implement following gRPC contract, + + syntax = "proto3"; + + package generic; + + service Eventing { + rpc StartEventSource(EventSource) returns (stream Event); + } + + message EventSource { + // The event source name. + string name = 1; + // The event source configuration value. + bytes config = 2; + } + + /** + * Represents an event + */ + message Event { + // The event source name. + string name = 1; + // The event payload. + bytes payload = 2; + } + +The proto file is available [here](https://github.com/argoproj/argo-events/blob/master/eventsources/sources/generic/generic.proto). + +## Architecture + +
+
+ +![arch](../assets/generic-eventsource.png) + +
+ +Consider a generic eventsource, + + apiVersion: argoproj.io/v1alpha1 + kind: EventSource + metadata: + name: generic + spec: + generic: + example: + insecure: true + url: "generic-event-source-server.argo-events.svc:8080" + config: |- + key1: value1 + key2: value2 + +The values placed under `config` field follows a free-form style and Argo-Events eventsource client is not +opinionated about them. Although, it is expected that the eventsource server implemented by the user is able to parse the configuration. + +## Flow + +1. The eventsource client connects to the server via the `url` defined under eventsource `spec` and sends over the configuration defined +under `config` over an RPC call. + +2. The eventsource server then parses the configuration and connects to any external source if required to consume the events. +The eventsource server can produce events without connecting to any external source, e.g. a special implementation of calendar events. + +3. The events from eventsource server are streamed back to the client. + +4. Client then writes the events to the eventbus which are read by the sensor to trigger the workflows. + +## Connection Strategy + +The eventsource client performs indefinite retries to connect to the eventsource server and receives events over a stream upon successful +connection. This also applies when the eventsource server goes down. + +## Deployment Strategy + +The deployment strategy for the generic eventsource is `Recreate`. More info is available [here](../eventsources/deployment-strategies.md). diff --git a/eventsources/eventing.go b/eventsources/eventing.go index 931b92b807..c317d9bf5b 100644 --- a/eventsources/eventing.go +++ b/eventsources/eventing.go @@ -18,6 +18,7 @@ import ( "github.com/argoproj/argo-events/eventsources/sources/emitter" "github.com/argoproj/argo-events/eventsources/sources/file" "github.com/argoproj/argo-events/eventsources/sources/gcppubsub" + "github.com/argoproj/argo-events/eventsources/sources/generic" "github.com/argoproj/argo-events/eventsources/sources/github" "github.com/argoproj/argo-events/eventsources/sources/gitlab" "github.com/argoproj/argo-events/eventsources/sources/hdfs" @@ -223,6 +224,13 @@ func GetEventingServers(eventSource *v1alpha1.EventSource) map[apicommon.EventSo } result[apicommon.PulsarEvent] = servers } + if len(eventSource.Spec.Generic) != 0 { + servers := []EventingServer{} + for k, v := range eventSource.Spec.Generic { + servers = append(servers, &generic.EventListener{EventSourceName: eventSource.Name, EventName: k, GenericEventSource: v}) + } + result[apicommon.GenericEvent] = servers + } return result } diff --git a/eventsources/sources/generic/generic.pb.go b/eventsources/sources/generic/generic.pb.go new file mode 100644 index 0000000000..5c1c7fba75 --- /dev/null +++ b/eventsources/sources/generic/generic.pb.go @@ -0,0 +1,255 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// source: generic.proto + +package generic + +import ( + context "context" + fmt "fmt" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + math "math" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package + +type EventSource struct { + // The event source name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The event source configuration value. + Config []byte `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EventSource) Reset() { *m = EventSource{} } +func (m *EventSource) String() string { return proto.CompactTextString(m) } +func (*EventSource) ProtoMessage() {} +func (*EventSource) Descriptor() ([]byte, []int) { + return fileDescriptor_4c692b03a02b431c, []int{0} +} + +func (m *EventSource) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_EventSource.Unmarshal(m, b) +} +func (m *EventSource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_EventSource.Marshal(b, m, deterministic) +} +func (m *EventSource) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventSource.Merge(m, src) +} +func (m *EventSource) XXX_Size() int { + return xxx_messageInfo_EventSource.Size(m) +} +func (m *EventSource) XXX_DiscardUnknown() { + xxx_messageInfo_EventSource.DiscardUnknown(m) +} + +var xxx_messageInfo_EventSource proto.InternalMessageInfo + +func (m *EventSource) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *EventSource) GetConfig() []byte { + if m != nil { + return m.Config + } + return nil +} + +//* +// Represents an event +type Event struct { + // The event source name. + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // The event payload. + Payload []byte `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Event) Reset() { *m = Event{} } +func (m *Event) String() string { return proto.CompactTextString(m) } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_4c692b03a02b431c, []int{1} +} + +func (m *Event) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Event.Unmarshal(m, b) +} +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Event.Marshal(b, m, deterministic) +} +func (m *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(m, src) +} +func (m *Event) XXX_Size() int { + return xxx_messageInfo_Event.Size(m) +} +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) +} + +var xxx_messageInfo_Event proto.InternalMessageInfo + +func (m *Event) GetName() string { + if m != nil { + return m.Name + } + return "" +} + +func (m *Event) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func init() { + proto.RegisterType((*EventSource)(nil), "generic.EventSource") + proto.RegisterType((*Event)(nil), "generic.Event") +} + +func init() { + proto.RegisterFile("generic.proto", fileDescriptor_4c692b03a02b431c) +} + +var fileDescriptor_4c692b03a02b431c = []byte{ + // 153 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4d, 0x4f, 0xcd, 0x4b, + 0x2d, 0xca, 0x4c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0x72, 0x95, 0x2c, 0xb9, + 0xb8, 0x5d, 0xcb, 0x52, 0xf3, 0x4a, 0x82, 0xf3, 0x4b, 0x8b, 0x92, 0x53, 0x85, 0x84, 0xb8, 0x58, + 0xf2, 0x12, 0x73, 0x53, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0xc0, 0x6c, 0x21, 0x31, 0x2e, + 0xb6, 0xe4, 0xfc, 0xbc, 0xb4, 0xcc, 0x74, 0x09, 0x26, 0x05, 0x46, 0x0d, 0x9e, 0x20, 0x28, 0x4f, + 0xc9, 0x94, 0x8b, 0x15, 0xac, 0x15, 0xab, 0x26, 0x09, 0x2e, 0xf6, 0x82, 0xc4, 0xca, 0x9c, 0xfc, + 0xc4, 0x14, 0xa8, 0x2e, 0x18, 0xd7, 0xc8, 0x8d, 0x8b, 0x03, 0xac, 0x2d, 0x33, 0x2f, 0x5d, 0xc8, + 0x8a, 0x4b, 0x20, 0xb8, 0x24, 0xb1, 0xa8, 0x04, 0xd9, 0x09, 0x22, 0x7a, 0x30, 0xa7, 0x22, 0x89, + 0x4a, 0xf1, 0xa1, 0x8a, 0x1a, 0x30, 0x26, 0xb1, 0x81, 0x7d, 0x62, 0x0c, 0x08, 0x00, 0x00, 0xff, + 0xff, 0x6e, 0x1c, 0x65, 0x01, 0xda, 0x00, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// EventingClient is the client API for Eventing service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type EventingClient interface { + StartEventSource(ctx context.Context, in *EventSource, opts ...grpc.CallOption) (Eventing_StartEventSourceClient, error) +} + +type eventingClient struct { + cc grpc.ClientConnInterface +} + +func NewEventingClient(cc grpc.ClientConnInterface) EventingClient { + return &eventingClient{cc} +} + +func (c *eventingClient) StartEventSource(ctx context.Context, in *EventSource, opts ...grpc.CallOption) (Eventing_StartEventSourceClient, error) { + stream, err := c.cc.NewStream(ctx, &_Eventing_serviceDesc.Streams[0], "/generic.Eventing/StartEventSource", opts...) + if err != nil { + return nil, err + } + x := &eventingStartEventSourceClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Eventing_StartEventSourceClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type eventingStartEventSourceClient struct { + grpc.ClientStream +} + +func (x *eventingStartEventSourceClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// EventingServer is the server API for Eventing service. +type EventingServer interface { + StartEventSource(*EventSource, Eventing_StartEventSourceServer) error +} + +// UnimplementedEventingServer can be embedded to have forward compatible implementations. +type UnimplementedEventingServer struct { +} + +func (*UnimplementedEventingServer) StartEventSource(req *EventSource, srv Eventing_StartEventSourceServer) error { + return status.Errorf(codes.Unimplemented, "method StartEventSource not implemented") +} + +func RegisterEventingServer(s *grpc.Server, srv EventingServer) { + s.RegisterService(&_Eventing_serviceDesc, srv) +} + +func _Eventing_StartEventSource_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(EventSource) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(EventingServer).StartEventSource(m, &eventingStartEventSourceServer{stream}) +} + +type Eventing_StartEventSourceServer interface { + Send(*Event) error + grpc.ServerStream +} + +type eventingStartEventSourceServer struct { + grpc.ServerStream +} + +func (x *eventingStartEventSourceServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +var _Eventing_serviceDesc = grpc.ServiceDesc{ + ServiceName: "generic.Eventing", + HandlerType: (*EventingServer)(nil), + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ + { + StreamName: "StartEventSource", + Handler: _Eventing_StartEventSource_Handler, + ServerStreams: true, + }, + }, + Metadata: "generic.proto", +} diff --git a/eventsources/sources/generic/generic.proto b/eventsources/sources/generic/generic.proto new file mode 100644 index 0000000000..e6d48f44d2 --- /dev/null +++ b/eventsources/sources/generic/generic.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +package generic; + +service Eventing { + rpc StartEventSource(EventSource) returns (stream Event); +} + +message EventSource { + // The event source name. + string name = 1; + // The event source configuration value. + bytes config = 2; +} + +/** +* Represents an event +*/ +message Event { + // The event source name. + string name = 1; + // The event payload. + bytes payload = 2; +} diff --git a/eventsources/sources/generic/start.go b/eventsources/sources/generic/start.go new file mode 100644 index 0000000000..cdf86dc544 --- /dev/null +++ b/eventsources/sources/generic/start.go @@ -0,0 +1,115 @@ +package generic + +import ( + "context" + "encoding/json" + "time" + + "github.com/argoproj/argo-events/common/logging" + "github.com/argoproj/argo-events/eventsources/sources" + apicommon "github.com/argoproj/argo-events/pkg/apis/common" + "github.com/argoproj/argo-events/pkg/apis/events" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +// EventListener implements Eventing for generic event source +type EventListener struct { + EventSourceName string + EventName string + GenericEventSource v1alpha1.GenericEventSource + conn *grpc.ClientConn +} + +// GetEventSourceName returns name of event source +func (el *EventListener) GetEventSourceName() string { + return el.EventSourceName +} + +// GetEventName returns name of event +func (el *EventListener) GetEventName() string { + return el.EventName +} + +// GetEventSourceType return type of event server +func (el *EventListener) GetEventSourceType() apicommon.EventSourceType { + return apicommon.GenericEvent +} + +// StartListening listens to generic events +func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byte) error) error { + logger := logging.FromContext(ctx). + With(zap.String(logging.LabelEventSourceType, string(el.GetEventSourceType())), + zap.String(logging.LabelEventName, el.GetEventName()), + zap.String("url", el.GenericEventSource.URL)) + logger.Info("started processing the generic event source...") + defer sources.Recover(el.GetEventName()) + + logger.Info("connecting to eventsource server in 5 seconds...") + ticker := time.NewTicker(5 * time.Second) + for { + select { + case <-ctx.Done(): + logger.Info("closing client connection and exiting eventsource...") + if el.conn != nil && (el.conn.GetState() == connectivity.Ready || el.conn.GetState() == connectivity.Connecting) { + el.conn.Close() + } + return nil + case <-ticker.C: + if el.conn == nil || el.conn.GetState() == connectivity.Shutdown || el.conn.GetState() == connectivity.TransientFailure { + logger.Info("dialing eventsource server...") + eventStream, err := el.connect() + if err != nil { + logger.Error("failed to connect eventsource server, reconnecting in 5 seconds...", zap.Error(err)) + continue + } + logger.Info("connected to eventsource server successfully, started event stream...") + for { + event, err := eventStream.Recv() + if err != nil { + logger.Errorw("failed to receive events from the event stream, reconnecting in 5 seconds...", zap.Error(err)) + // close the connection and retry in next cycle. + el.conn.Close() + break + } + logger.Info("received an event from server") + eventData := &events.GenericEventData{ + Metadata: el.GenericEventSource.Metadata, + } + if el.GenericEventSource.JSONBody { + eventData.Body = (*json.RawMessage)(&event.Payload) + } + eventBytes, err := json.Marshal(eventData) + if err != nil { + logger.Errorw("failed to marshal the event data", zap.Error(err)) + continue + } + logger.Info("dispatching event...") + if err := dispatch(eventBytes); err != nil { + logger.Errorw("failed to dispatch the event", zap.Error(err)) + } + } + } + } + } +} + +func (el *EventListener) connect() (Eventing_StartEventSourceClient, error) { + var opt []grpc.DialOption + opt = append(opt, grpc.WithBlock()) + if el.GenericEventSource.Insecure { + opt = append(opt, grpc.WithInsecure()) + } + conn, err := grpc.DialContext(context.Background(), el.GenericEventSource.URL, opt...) + if err != nil { + return nil, err + } + el.conn = conn + client := NewEventingClient(el.conn) + return client.StartEventSource(context.Background(), &EventSource{ + Name: el.GetEventName(), + Config: []byte(el.GenericEventSource.Config), + }) +} diff --git a/eventsources/sources/generic/validate.go b/eventsources/sources/generic/validate.go new file mode 100644 index 0000000000..c692c0894b --- /dev/null +++ b/eventsources/sources/generic/validate.go @@ -0,0 +1,19 @@ +package generic + +import ( + "context" + "fmt" +) + +func (el *EventListener) ValidateEventSource(ctx context.Context) error { + if &el.GenericEventSource == nil { + return fmt.Errorf("event source can't be empty") + } + if el.GenericEventSource.URL == "" { + return fmt.Errorf("server url can't be empty") + } + if el.GenericEventSource.Config == "" { + return fmt.Errorf("config can't be empty") + } + return nil +} diff --git a/eventsources/sources/generic/validate_test.go b/eventsources/sources/generic/validate_test.go new file mode 100644 index 0000000000..e67f248018 --- /dev/null +++ b/eventsources/sources/generic/validate_test.go @@ -0,0 +1,38 @@ +package generic + +import ( + "context" + "fmt" + "io/ioutil" + "testing" + + "github.com/argoproj/argo-events/eventsources/sources" + "github.com/argoproj/argo-events/pkg/apis/eventsource/v1alpha1" + "github.com/ghodss/yaml" + "github.com/stretchr/testify/assert" +) + +func TestEventListener_ValidateEventSource(t *testing.T) { + listener := &EventListener{} + + err := listener.ValidateEventSource(context.Background()) + assert.Error(t, err) + assert.Equal(t, "server url can't be empty", err.Error()) + + content, err := ioutil.ReadFile(fmt.Sprintf("%s/%s", sources.EventSourceDir, "generic.yaml")) + assert.Nil(t, err) + + var eventSource *v1alpha1.EventSource + err = yaml.Unmarshal(content, &eventSource) + assert.Nil(t, err) + assert.NotNil(t, eventSource.Spec.Generic) + + for name, value := range eventSource.Spec.Generic { + fmt.Println(name) + l := &EventListener{ + GenericEventSource: value, + } + err := l.ValidateEventSource(context.Background()) + assert.NoError(t, err) + } +} diff --git a/eventsources/sources/minio/start.go b/eventsources/sources/minio/start.go index 902e288072..17a1e119a7 100644 --- a/eventsources/sources/minio/start.go +++ b/eventsources/sources/minio/start.go @@ -55,7 +55,8 @@ func (el *EventListener) GetEventSourceType() apicommon.EventSourceType { // StartListening starts listening events func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byte) error) error { log := logging.FromContext(ctx). - With(logging.LabelEventSourceType, el.GetEventSourceType(), logging.LabelEventName, el.GetEventName()) + With(logging.LabelEventSourceType, el.GetEventSourceType(), logging.LabelEventName, el.GetEventName(), + zap.String("bucketName", el.MinioEventSource.Bucket.Name)) defer sources.Recover(el.GetEventName()) log.Info("starting minio event source...") @@ -82,24 +83,23 @@ func (el *EventListener) StartListening(ctx context.Context, dispatch func([]byt doneCh := make(chan struct{}) - logger := log.With("bucketName", minioEventSource.Bucket.Name).Desugar() log.Info("started listening to bucket notifications...") for notification := range minioClient.ListenBucketNotification(minioEventSource.Bucket.Name, prefix, suffix, minioEventSource.Events, doneCh) { if notification.Err != nil { - logger.Error("invalid notification", zap.Error(err)) + log.Errorw("invalid notification", zap.Error(err)) continue } eventData := &events.MinioEventData{Notification: notification.Records, Metadata: minioEventSource.Metadata} eventBytes, err := json.Marshal(eventData) if err != nil { - logger.Error("failed to marshal the event data, rejecting the event...", zap.Error(err)) + log.Errorw("failed to marshal the event data, rejecting the event...", zap.Error(err)) continue } log.Info("dispatching the event on data channel...") if err = dispatch(eventBytes); err != nil { - logger.Error("failed to dispatch minio event", zap.Error(err)) + log.Errorw("failed to dispatch minio event", zap.Error(err)) } } diff --git a/examples/event-sources/generic.yaml b/examples/event-sources/generic.yaml new file mode 100644 index 0000000000..b8d8ee34fa --- /dev/null +++ b/examples/event-sources/generic.yaml @@ -0,0 +1,16 @@ +apiVersion: argoproj.io/v1alpha1 +kind: EventSource +metadata: + name: generic +spec: + generic: + example: + insecure: true + # URL of the gRPC server that implements event source + url: "generic-event-source-server.argo-events.svc:8080" + # Config represents the configuration required to run the event source. + # The configuration will be sent over to eventsource server and should be used + # by the server accordingly to consume events from external sources. + config: |- + key1: value1 + key2: value2 diff --git a/mkdocs.yml b/mkdocs.yml index 8f50cc4cc7..02622f6e41 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -61,6 +61,7 @@ nav: - 'eventsources/naming.md' - 'eventsources/services.md' - 'eventsources/gcp-pubsub.md' + - 'eventsources/generic.md' - Triggers: - 'triggers/argo-workflow.md' - 'triggers/aws-lambda.md' diff --git a/pkg/apis/common/common.go b/pkg/apis/common/common.go index 852182e3b2..f468bf6656 100644 --- a/pkg/apis/common/common.go +++ b/pkg/apis/common/common.go @@ -66,6 +66,7 @@ var ( ResourceEvent, HDFSEvent, FileEvent, + GenericEvent, } ) diff --git a/pkg/apis/events/event-data.go b/pkg/apis/events/event-data.go index 3dc9d55d14..94e3f4a56b 100644 --- a/pkg/apis/events/event-data.go +++ b/pkg/apis/events/event-data.go @@ -316,3 +316,11 @@ type StripeEventData struct { // Metadata holds the user defined metadata which will passed along the event payload. Metadata map[string]string `json:"metadata,omitempty"` } + +// GenericEventData represents the event data generated by the generic eventsource. +type GenericEventData struct { + // Body refers to the message payload + Body interface{} `json:"body"` + // Metadata holds the user defined metadata which will passed along the event payload. + Metadata map[string]string `json:"metadata,omitempty"` +} diff --git a/pkg/apis/eventsource/v1alpha1/generated.pb.go b/pkg/apis/eventsource/v1alpha1/generated.pb.go index 4e765f5d9a..b1c3ef73b2 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.pb.go +++ b/pkg/apis/eventsource/v1alpha1/generated.pb.go @@ -1038,6 +1038,7 @@ func init() { proto.RegisterType((*FileEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.FileEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.FileEventSource.MetadataEntry") proto.RegisterType((*GenericEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.GenericEventSource") + proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.GenericEventSource.MetadataEntry") proto.RegisterType((*GithubEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.GithubEventSource") proto.RegisterMapType((map[string]string)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.GithubEventSource.MetadataEntry") proto.RegisterType((*GitlabEventSource)(nil), "github.com.argoproj.argo_events.pkg.apis.eventsource.v1alpha1.GitlabEventSource") @@ -1087,309 +1088,311 @@ func init() { } var fileDescriptor_c9ac5d6cd016403b = []byte{ - // 4826 bytes of a gzipped FileDescriptorProto + // 4856 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x3c, 0x4b, 0x6f, 0x23, 0x47, 0x7a, 0xa6, 0x48, 0x51, 0xd4, 0x47, 0x3d, 0x6b, 0xc6, 0x36, 0xad, 0x5d, 0x8f, 0x26, 0x32, 0x76, - 0x30, 0xce, 0x7a, 0xa9, 0x78, 0x92, 0x4d, 0xbc, 0x36, 0xe2, 0x85, 0x28, 0x69, 0x34, 0x63, 0x3d, - 0x46, 0xfa, 0x28, 0xf9, 0xb1, 0x7e, 0x6d, 0xb3, 0x59, 0xa4, 0xda, 0x6c, 0x76, 0x53, 0xdd, 0x45, - 0xcd, 0xc8, 0x40, 0x92, 0x45, 0x80, 0x3c, 0x36, 0xce, 0x26, 0xbb, 0xc8, 0x26, 0x08, 0x92, 0x5b, - 0x0e, 0x59, 0x20, 0x39, 0x06, 0xc8, 0x6f, 0x30, 0x90, 0xcb, 0xe6, 0xb6, 0x40, 0x00, 0xc1, 0x56, - 0x82, 0xdc, 0x72, 0xca, 0xc5, 0xd8, 0x20, 0x40, 0x50, 0x8f, 0xae, 0x7e, 0xb0, 0xa5, 0x11, 0x47, - 0x24, 0xe7, 0x92, 0xcb, 0x8c, 0xf8, 0xbd, 0xbb, 0xea, 0xfb, 0xea, 0xab, 0xaf, 0xea, 0xeb, 0x86, - 0xed, 0xa6, 0xc5, 0x0e, 0xbb, 0xb5, 0xb2, 0xe9, 0xb6, 0x97, 0x0d, 0xaf, 0xe9, 0x76, 0x3c, 0xf7, - 0x13, 0xf1, 0xc7, 0xb7, 0xe8, 0x31, 0x75, 0x98, 0xbf, 0xdc, 0x69, 0x35, 0x97, 0x8d, 0x8e, 0xe5, - 0x2f, 0xcb, 0xdf, 0x6e, 0xd7, 0x33, 0xe9, 0xf2, 0xf1, 0xab, 0x86, 0xdd, 0x39, 0x34, 0x5e, 0x5d, - 0x6e, 0x52, 0x87, 0x7a, 0x06, 0xa3, 0xf5, 0x72, 0xc7, 0x73, 0x99, 0x4b, 0x7e, 0x3b, 0x14, 0x57, - 0x0e, 0xc4, 0x89, 0x3f, 0x3e, 0x96, 0xec, 0xe5, 0x4e, 0xab, 0x59, 0xe6, 0xe2, 0xca, 0x11, 0x71, - 0xe5, 0x40, 0xdc, 0xc2, 0x77, 0x2f, 0x6d, 0x8d, 0xe9, 0xb6, 0xdb, 0xae, 0x93, 0xd4, 0xbf, 0xf0, - 0xad, 0x88, 0x80, 0xa6, 0xdb, 0x74, 0x97, 0x05, 0xb8, 0xd6, 0x6d, 0x88, 0x5f, 0xe2, 0x87, 0xf8, - 0x4b, 0x91, 0x2f, 0xb5, 0x5e, 0xf3, 0xcb, 0x96, 0xcb, 0x45, 0x2e, 0x9b, 0xae, 0xc7, 0x1f, 0xac, - 0x47, 0xe4, 0x6f, 0x84, 0x34, 0x6d, 0xc3, 0x3c, 0xb4, 0x1c, 0xea, 0x9d, 0x84, 0x76, 0xb4, 0x29, - 0x33, 0xd2, 0xb8, 0x96, 0xcf, 0xe3, 0xf2, 0xba, 0x0e, 0xb3, 0xda, 0xb4, 0x87, 0xe1, 0x37, 0x1f, - 0xc7, 0xe0, 0x9b, 0x87, 0xb4, 0x6d, 0x24, 0xf9, 0x96, 0xfe, 0x7e, 0x1c, 0x66, 0x57, 0xb6, 0xf7, - 0x76, 0xd7, 0xf9, 0x00, 0x55, 0xc5, 0x78, 0x92, 0x17, 0x21, 0xdb, 0xf5, 0xec, 0x52, 0xe6, 0x66, - 0xe6, 0xf6, 0x64, 0xa5, 0xf8, 0xf9, 0xe9, 0xe2, 0x33, 0x67, 0xa7, 0x8b, 0xd9, 0x03, 0xdc, 0x42, - 0x0e, 0x27, 0xaf, 0xc1, 0x14, 0x7d, 0x64, 0x1e, 0x1a, 0x4e, 0x93, 0xee, 0x18, 0x6d, 0x5a, 0x1a, - 0x13, 0x74, 0xd7, 0x15, 0xdd, 0xd4, 0x7a, 0x04, 0x87, 0x31, 0xca, 0x28, 0xe7, 0xfe, 0x49, 0x87, - 0x96, 0xb2, 0xe9, 0x9c, 0x1c, 0x87, 0x31, 0x4a, 0x72, 0x07, 0xc0, 0x73, 0xbb, 0xcc, 0x72, 0x9a, - 0x9b, 0xf4, 0xa4, 0x94, 0x13, 0x7c, 0x44, 0xf1, 0x01, 0x6a, 0x0c, 0x46, 0xa8, 0xc8, 0xef, 0xc0, - 0xbc, 0xe9, 0x3a, 0x0e, 0x35, 0x99, 0xe5, 0x3a, 0x15, 0xc3, 0x6c, 0xb9, 0x8d, 0x46, 0x69, 0xfc, - 0x66, 0xe6, 0x76, 0xf1, 0xce, 0x6b, 0xe5, 0x4b, 0x3b, 0x9a, 0xf4, 0x94, 0xb2, 0xe2, 0xaf, 0x3c, - 0x7b, 0x76, 0xba, 0x38, 0xbf, 0x9a, 0x14, 0x8b, 0xbd, 0x9a, 0xc8, 0x2b, 0x50, 0xf8, 0xc4, 0x77, - 0x9d, 0x8a, 0x5b, 0x3f, 0x29, 0xe5, 0x6f, 0x66, 0x6e, 0x17, 0x2a, 0x73, 0xca, 0xe0, 0xc2, 0x5b, - 0xd5, 0x07, 0x3b, 0x1c, 0x8e, 0x9a, 0x82, 0x1c, 0x40, 0x96, 0xd9, 0x7e, 0x69, 0x42, 0x98, 0xf7, - 0x7a, 0xdf, 0xe6, 0xed, 0x6f, 0x55, 0x57, 0x5d, 0xa7, 0x61, 0x35, 0x2b, 0x13, 0x7c, 0xae, 0xf6, - 0xb7, 0xaa, 0xc8, 0xe5, 0x91, 0x3f, 0xc9, 0x40, 0x81, 0xfb, 0x58, 0xdd, 0x60, 0x46, 0xa9, 0x70, - 0x33, 0x7b, 0xbb, 0x78, 0xe7, 0x83, 0xf2, 0x95, 0x82, 0xac, 0x9c, 0xf0, 0x96, 0xf2, 0xb6, 0x12, - 0xbf, 0xee, 0x30, 0xef, 0x24, 0x7c, 0xc6, 0x00, 0x8c, 0x5a, 0xff, 0xc2, 0x1b, 0x30, 0x1d, 0x23, - 0x26, 0x73, 0x90, 0x6d, 0xd1, 0x13, 0xe9, 0x68, 0xc8, 0xff, 0x24, 0xd7, 0x61, 0xfc, 0xd8, 0xb0, - 0xbb, 0xca, 0xa9, 0x50, 0xfe, 0x78, 0x7d, 0xec, 0xb5, 0xcc, 0xd2, 0x4f, 0x73, 0xf0, 0xc2, 0xca, - 0xa7, 0x5d, 0x8f, 0x0a, 0xdd, 0xfe, 0xbd, 0x6e, 0x2d, 0xea, 0xb2, 0x37, 0x21, 0xd7, 0x38, 0xaa, - 0x3b, 0xca, 0x67, 0xa7, 0x94, 0x11, 0xb9, 0xbb, 0x7b, 0x6b, 0x3b, 0x28, 0x30, 0xa4, 0x03, 0xd7, - 0xfc, 0x43, 0xc3, 0xa3, 0xf5, 0x15, 0xd3, 0xa4, 0xbe, 0xbf, 0x49, 0x4f, 0xb4, 0xf3, 0x16, 0xef, - 0x7c, 0xa3, 0x2c, 0xc3, 0x87, 0x3f, 0x76, 0x99, 0x47, 0x72, 0xf9, 0xf8, 0xd5, 0x72, 0x95, 0x9a, - 0x1e, 0x65, 0x9b, 0xf4, 0xa4, 0x4a, 0x6d, 0x6a, 0x32, 0xd7, 0xab, 0x3c, 0x7f, 0x76, 0xba, 0x78, - 0xad, 0xda, 0x2b, 0x05, 0xd3, 0x44, 0x93, 0x3a, 0xcc, 0x26, 0xc0, 0xc2, 0xe1, 0x2f, 0xad, 0xed, - 0xda, 0xd9, 0xe9, 0xe2, 0x6c, 0x42, 0x1b, 0x26, 0x45, 0x92, 0x97, 0x61, 0xe2, 0xb0, 0x5b, 0x13, - 0xcf, 0x22, 0xc3, 0x62, 0x56, 0x3d, 0xfc, 0xc4, 0x3d, 0x09, 0xc6, 0x00, 0x4f, 0x7e, 0x1a, 0x75, - 0x86, 0x71, 0xe1, 0x0c, 0x8d, 0xab, 0x3a, 0xc3, 0x79, 0x33, 0x32, 0x2a, 0xb7, 0xf8, 0x2a, 0x0b, - 0xd7, 0x56, 0x0d, 0x9b, 0x3a, 0x75, 0xc3, 0x8b, 0x3a, 0xc4, 0x2b, 0x50, 0xe0, 0x2b, 0x5e, 0xbd, - 0x6b, 0x53, 0xe5, 0x14, 0xda, 0x84, 0xaa, 0x82, 0xa3, 0xa6, 0xe0, 0xd4, 0x96, 0xc3, 0xa8, 0x77, - 0x6c, 0xd8, 0x6a, 0x39, 0xd3, 0xd4, 0xf7, 0x15, 0x1c, 0x35, 0x05, 0x79, 0x1d, 0x66, 0xe8, 0x23, - 0xd3, 0xee, 0xfa, 0x96, 0xeb, 0xac, 0x19, 0x8c, 0xfa, 0xa5, 0xec, 0xcd, 0x2c, 0x5f, 0x90, 0xce, - 0x4e, 0x17, 0x67, 0xd6, 0x63, 0x18, 0x4c, 0x50, 0x72, 0x4d, 0x7c, 0x39, 0xfe, 0xd4, 0x75, 0x82, - 0xf9, 0xd2, 0x9a, 0xf6, 0x15, 0x1c, 0x35, 0x05, 0xd9, 0x86, 0x62, 0xd7, 0xa7, 0xde, 0xae, 0x71, - 0x62, 0xbb, 0x46, 0x5d, 0x2c, 0x5e, 0x53, 0x95, 0x6f, 0x9e, 0x9d, 0x2e, 0x16, 0x0f, 0x42, 0xf0, - 0x2f, 0x4f, 0x17, 0x4b, 0xd4, 0x31, 0xdd, 0xba, 0xe5, 0x34, 0x97, 0xf9, 0x82, 0x52, 0x46, 0xe3, - 0xe1, 0x36, 0xf5, 0x7d, 0xa3, 0x49, 0x31, 0xca, 0x4f, 0xfe, 0x2c, 0xea, 0x00, 0x79, 0xe1, 0x00, - 0xdf, 0xbf, 0xa2, 0x03, 0xa4, 0x8c, 0xfd, 0xa8, 0xa6, 0xfe, 0x6f, 0xf2, 0x40, 0xd6, 0xdb, 0x16, - 0x63, 0x34, 0x36, 0xf3, 0xb7, 0x20, 0x5f, 0xf3, 0xdc, 0x16, 0xf5, 0xd4, 0xbc, 0xcf, 0x28, 0xfd, - 0xf9, 0x8a, 0x80, 0xa2, 0xc2, 0xf2, 0x94, 0xc2, 0x13, 0x8c, 0x43, 0x6d, 0x1e, 0x99, 0x63, 0xf1, - 0x94, 0xb2, 0xaa, 0x31, 0x18, 0xa1, 0x22, 0xdf, 0x86, 0xa2, 0xfa, 0x25, 0x02, 0x4e, 0xe6, 0xaf, - 0x6b, 0x8a, 0xa9, 0xb8, 0x1a, 0xa2, 0x30, 0x4a, 0x47, 0x1e, 0x40, 0x81, 0x4f, 0x83, 0x13, 0x04, - 0xe9, 0xa5, 0x97, 0x80, 0x29, 0x3e, 0x6e, 0x07, 0x8a, 0x15, 0xb5, 0x10, 0x2e, 0xb0, 0x63, 0xf8, - 0xfe, 0x43, 0xd7, 0xab, 0xab, 0x8c, 0xd6, 0x8f, 0xc0, 0x5d, 0xc5, 0x8a, 0x5a, 0x48, 0x7a, 0xae, - 0xcc, 0x3f, 0x95, 0x5c, 0x39, 0x71, 0xd9, 0x5c, 0x59, 0x18, 0x70, 0xae, 0xfc, 0x51, 0x34, 0x3a, - 0x26, 0x45, 0x74, 0x7c, 0x7c, 0xc5, 0xe8, 0xe8, 0x75, 0xcf, 0x51, 0x05, 0xc7, 0xbf, 0x8d, 0x41, - 0x31, 0x1a, 0x15, 0xdf, 0x8f, 0x3c, 0x5b, 0x46, 0x0c, 0xdc, 0xaf, 0x45, 0x3c, 0x46, 0x6f, 0x19, - 0xc3, 0xe7, 0xe1, 0xd4, 0xdc, 0x87, 0x1e, 0xd4, 0x3e, 0xa1, 0x26, 0xe3, 0x86, 0x84, 0xd1, 0x11, - 0xc2, 0x42, 0x73, 0x49, 0x07, 0x72, 0x7e, 0x87, 0x9a, 0x2a, 0xa3, 0xee, 0x5c, 0x75, 0xe4, 0x42, - 0xdb, 0xab, 0x1d, 0x6a, 0x86, 0x29, 0x9d, 0xff, 0x42, 0xa1, 0x89, 0x3c, 0x82, 0xbc, 0xcf, 0x0c, - 0xd6, 0xf5, 0x55, 0x5e, 0xdd, 0x1d, 0xa0, 0x4e, 0x21, 0x37, 0x5c, 0x3b, 0xe4, 0x6f, 0x54, 0xfa, - 0x96, 0xbe, 0xc8, 0xc0, 0x6c, 0x84, 0x7a, 0xcb, 0xf2, 0x19, 0xf9, 0xa0, 0x67, 0x84, 0xcb, 0x97, - 0x1b, 0x61, 0xce, 0x2d, 0xc6, 0x57, 0x3b, 0x43, 0x00, 0x89, 0x8c, 0xae, 0x0b, 0xe3, 0x16, 0xa3, - 0x6d, 0xbf, 0x34, 0x26, 0x1c, 0xf3, 0xad, 0xc1, 0x3d, 0x6a, 0x65, 0x5a, 0xa9, 0x1d, 0xbf, 0xcf, - 0x15, 0xa0, 0xd4, 0xb3, 0xf4, 0x9f, 0xdf, 0x8e, 0x3d, 0x22, 0x1f, 0x76, 0xb1, 0x7f, 0xe7, 0xa0, - 0x4a, 0xd7, 0x17, 0xeb, 0x5f, 0x26, 0xb1, 0x7f, 0x8f, 0xe0, 0x30, 0x46, 0x49, 0x8e, 0xa0, 0xc0, - 0x68, 0xbb, 0x63, 0x1b, 0x2c, 0xd8, 0x72, 0x6d, 0x5c, 0xf1, 0x09, 0xf6, 0x95, 0x38, 0xb9, 0xa4, - 0x05, 0xbf, 0x50, 0xab, 0x21, 0x6d, 0x98, 0xf0, 0xa9, 0x77, 0x6c, 0x99, 0x54, 0xb9, 0xc7, 0xdd, - 0x2b, 0x6a, 0xac, 0x4a, 0x69, 0x95, 0x22, 0xdf, 0x5c, 0xa9, 0x1f, 0x18, 0xe8, 0x20, 0xdf, 0x80, - 0x09, 0x8f, 0x76, 0x6c, 0xcb, 0x34, 0xc4, 0x12, 0x3f, 0x2e, 0xc9, 0x50, 0x82, 0x30, 0xc0, 0x91, - 0xdf, 0x85, 0xf1, 0xb6, 0xe5, 0x58, 0xae, 0xda, 0x7f, 0xbd, 0x37, 0xd8, 0x30, 0x29, 0x6f, 0x73, - 0xd9, 0x72, 0x69, 0xd1, 0xd3, 0x2a, 0x60, 0x28, 0xd5, 0x8a, 0x82, 0xc0, 0x54, 0x39, 0x5b, 0x6d, - 0x01, 0x3e, 0x18, 0xb0, 0x0d, 0x7a, 0x4b, 0x10, 0x5f, 0xe1, 0x02, 0x30, 0x6a, 0xfd, 0xe4, 0x53, - 0xc8, 0x35, 0x2c, 0x9b, 0x96, 0x26, 0x84, 0x1d, 0xef, 0x0e, 0xd8, 0x8e, 0xbb, 0x96, 0x4d, 0xa5, - 0x0d, 0x61, 0x3d, 0x60, 0xd9, 0x14, 0x85, 0x4e, 0x31, 0x10, 0x1e, 0x95, 0x32, 0x06, 0x54, 0x19, - 0x25, 0x0d, 0x40, 0x25, 0x3e, 0x31, 0x10, 0x01, 0x18, 0xb5, 0x7e, 0xf2, 0x87, 0x19, 0x98, 0x78, - 0x48, 0x6b, 0x87, 0xae, 0xdb, 0x52, 0x99, 0xe7, 0xfd, 0x01, 0xdb, 0xf2, 0x8e, 0x94, 0x2e, 0x4d, - 0xd1, 0x25, 0x82, 0x82, 0x62, 0xa0, 0x9c, 0xcf, 0x88, 0xd1, 0x3e, 0xea, 0x94, 0x60, 0x28, 0x33, - 0xb2, 0xd2, 0x3e, 0xea, 0x24, 0x66, 0x84, 0x57, 0x93, 0x28, 0x74, 0xf2, 0xd0, 0x68, 0x19, 0x8d, - 0x96, 0x51, 0x2a, 0x0e, 0x25, 0x34, 0x36, 0xb9, 0xec, 0x44, 0x68, 0x08, 0x18, 0x4a, 0xb5, 0xfc, - 0xd9, 0xdb, 0x47, 0x8c, 0x95, 0xa6, 0x86, 0xf2, 0xec, 0xdb, 0x47, 0x8c, 0x25, 0x9e, 0x7d, 0x7b, - 0x6f, 0x7f, 0x1f, 0x85, 0x4e, 0xae, 0xdb, 0x31, 0x98, 0x5f, 0x9a, 0x1e, 0x8a, 0xee, 0x1d, 0x83, - 0xf9, 0x09, 0xdd, 0x3b, 0x2b, 0xfb, 0x55, 0x14, 0x3a, 0xc9, 0x31, 0x64, 0x7d, 0xc7, 0x2f, 0xcd, - 0x08, 0xd5, 0xef, 0x0c, 0x58, 0x75, 0xd5, 0x51, 0x9a, 0xf5, 0x39, 0x52, 0x75, 0xa7, 0x8a, 0x5c, - 0xa1, 0xd0, 0x7b, 0xe4, 0x97, 0x66, 0x87, 0xa3, 0xf7, 0xa8, 0x47, 0xef, 0x1e, 0xd7, 0x7b, 0xe4, - 0x93, 0xdf, 0xcf, 0x40, 0xbe, 0xd3, 0xad, 0x55, 0xbb, 0xb5, 0xd2, 0x9c, 0xd0, 0xfd, 0xbd, 0x01, - 0xeb, 0xde, 0x15, 0xc2, 0xa5, 0x7a, 0xbd, 0x83, 0x90, 0x40, 0x54, 0x9a, 0x85, 0x11, 0x52, 0x6b, - 0x69, 0x7e, 0x28, 0x46, 0x6c, 0x08, 0x69, 0x09, 0x23, 0x24, 0x10, 0x95, 0xe6, 0xc0, 0x08, 0xdb, - 0xa8, 0x95, 0xc8, 0xb0, 0x8c, 0xb0, 0x8d, 0x14, 0x23, 0x6c, 0x43, 0x1a, 0x61, 0x1b, 0x35, 0xee, - 0xfa, 0x87, 0xf5, 0x86, 0x5f, 0xba, 0x36, 0x14, 0xd7, 0xbf, 0x57, 0x6f, 0x24, 0x5d, 0xff, 0xde, - 0xda, 0xdd, 0x2a, 0x0a, 0x9d, 0x7c, 0xc9, 0xf1, 0x6d, 0xc3, 0x6c, 0x95, 0xae, 0x0f, 0x65, 0xc9, - 0xa9, 0x72, 0xd9, 0x89, 0x25, 0x47, 0xc0, 0x50, 0xaa, 0x25, 0x7f, 0x95, 0x81, 0xa2, 0xcf, 0x5c, - 0xcf, 0x68, 0xd2, 0x0d, 0xcf, 0xaa, 0x97, 0x9e, 0x1d, 0x4c, 0xd5, 0x91, 0x34, 0x23, 0xd4, 0x20, - 0x8d, 0xd1, 0x15, 0x6b, 0x04, 0x83, 0x51, 0x43, 0xc8, 0xdf, 0x65, 0x60, 0xc6, 0x88, 0x9d, 0xed, - 0x94, 0x9e, 0x13, 0xb6, 0xd5, 0x06, 0x9d, 0x12, 0xe2, 0x07, 0x48, 0xc2, 0xbc, 0xe7, 0x94, 0x79, - 0x33, 0x71, 0x24, 0x26, 0x2c, 0x12, 0xee, 0xeb, 0x33, 0xcf, 0xea, 0xd0, 0xd2, 0xf3, 0x43, 0x71, - 0xdf, 0xaa, 0x10, 0x9e, 0x70, 0x5f, 0x09, 0x44, 0xa5, 0x59, 0xa4, 0x6e, 0x2a, 0xcb, 0xbc, 0x52, - 0x69, 0x28, 0xa9, 0x3b, 0x28, 0x22, 0xe3, 0xa9, 0x5b, 0x41, 0x31, 0x50, 0xce, 0x7d, 0xd9, 0xa3, - 0x75, 0xcb, 0x2f, 0xbd, 0x30, 0x14, 0x5f, 0x46, 0x2e, 0x3b, 0xe1, 0xcb, 0x02, 0x86, 0x52, 0x2d, - 0x5f, 0xce, 0x1d, 0xff, 0xa8, 0xb4, 0x30, 0x94, 0xe5, 0x7c, 0xc7, 0x3f, 0x4a, 0x2c, 0xe7, 0x3b, - 0xd5, 0x3d, 0xe4, 0x0a, 0xd5, 0x72, 0x6e, 0xfb, 0x86, 0x57, 0xfa, 0xda, 0x90, 0x96, 0x73, 0x2e, - 0xbc, 0x67, 0x39, 0xe7, 0x40, 0x54, 0x9a, 0x85, 0x17, 0x88, 0xab, 0x15, 0xcb, 0x2c, 0x7d, 0x7d, - 0x28, 0x5e, 0xb0, 0x21, 0xa5, 0x27, 0xbc, 0x40, 0x41, 0x31, 0x50, 0xbe, 0xd0, 0x05, 0x08, 0x6b, - 0x80, 0x94, 0x13, 0x83, 0xbd, 0xe8, 0x89, 0x41, 0xf1, 0xce, 0x1b, 0x7d, 0x9f, 0x9e, 0x54, 0x7f, - 0x7d, 0xc5, 0x63, 0x56, 0xc3, 0x30, 0x59, 0xe4, 0xb8, 0x61, 0xe1, 0xcf, 0x33, 0x30, 0x1d, 0xdb, - 0xf7, 0xa7, 0xa8, 0x3e, 0x8c, 0xab, 0xc6, 0xc1, 0x9f, 0x3c, 0x46, 0x2d, 0xfa, 0xa3, 0x0c, 0x4c, - 0xea, 0x0a, 0x20, 0xc5, 0x9a, 0x7a, 0xdc, 0x9a, 0xab, 0x9e, 0x57, 0x08, 0x55, 0xe9, 0x96, 0xf0, - 0xb1, 0x89, 0x95, 0x02, 0xc3, 0x1f, 0x1b, 0xad, 0x2e, 0xdd, 0xa2, 0x1f, 0x66, 0x60, 0x2a, 0x5a, - 0x10, 0xa4, 0x18, 0x64, 0xc6, 0x0d, 0xda, 0xbe, 0xa2, 0x41, 0x4a, 0xdb, 0xaa, 0xeb, 0x30, 0xfa, - 0x88, 0x25, 0xe7, 0x49, 0xd7, 0x05, 0xc3, 0x9f, 0xa7, 0xc4, 0xed, 0x55, 0x62, 0x54, 0x20, 0x2c, - 0x12, 0x52, 0x4c, 0xa1, 0x71, 0x53, 0x1e, 0x5c, 0xd1, 0x14, 0xa9, 0xeb, 0x7c, 0xef, 0xd5, 0x15, - 0xc3, 0xf0, 0x47, 0x85, 0x57, 0x22, 0xe7, 0x58, 0xf2, 0xc7, 0x19, 0x98, 0xd4, 0xf5, 0xc3, 0xf0, - 0x07, 0x85, 0xd7, 0x25, 0x32, 0xc3, 0xf7, 0x9a, 0xf2, 0x07, 0x19, 0x28, 0x04, 0xf5, 0xc4, 0xf0, - 0x5d, 0xb6, 0xba, 0x53, 0x3d, 0x67, 0x48, 0x84, 0x1d, 0x47, 0x23, 0xb3, 0x63, 0xef, 0x3c, 0x3b, - 0x3e, 0xcb, 0x40, 0x31, 0x52, 0x6b, 0xa4, 0x98, 0xd2, 0x88, 0x9b, 0x72, 0xd5, 0x03, 0x52, 0xa5, - 0xec, 0x7c, 0x6b, 0x22, 0x45, 0xc7, 0xf0, 0xad, 0x51, 0xca, 0x2e, 0xb4, 0x26, 0xa8, 0x3e, 0x46, - 0x62, 0x0d, 0x57, 0x76, 0x7e, 0x38, 0xeb, 0x4a, 0x64, 0xf8, 0xe1, 0xcc, 0x2b, 0x9c, 0x0b, 0x16, - 0xb9, 0xb0, 0x2c, 0x19, 0x7e, 0x3c, 0x4b, 0x5d, 0xe9, 0xb6, 0xfc, 0x65, 0x06, 0xe6, 0x92, 0xb5, - 0x49, 0x8a, 0x45, 0xad, 0xb8, 0x45, 0x07, 0x57, 0xb5, 0x28, 0xa2, 0x31, 0xdd, 0xae, 0xbf, 0xcd, - 0xc0, 0xb5, 0x94, 0xba, 0x24, 0xc5, 0x34, 0x27, 0x6e, 0xda, 0xbb, 0xc3, 0xba, 0x4d, 0x4f, 0x7a, - 0x76, 0xa4, 0x30, 0x19, 0xbe, 0x67, 0x2b, 0x65, 0xe9, 0xd6, 0xfc, 0x28, 0x03, 0x53, 0xd1, 0x02, - 0x25, 0xc5, 0x9c, 0x66, 0xdc, 0x9c, 0xbd, 0x81, 0xdf, 0xa9, 0x25, 0xfd, 0x3b, 0x2c, 0x55, 0x86, - 0xef, 0xdf, 0x52, 0xd7, 0xf9, 0x79, 0x22, 0x28, 0x5c, 0x86, 0x9f, 0x27, 0x76, 0xaa, 0x7b, 0x17, - 0xe6, 0x09, 0x5d, 0xc4, 0x8c, 0x22, 0x4f, 0x08, 0x65, 0xe7, 0x7b, 0x4c, 0xb4, 0x98, 0x19, 0xbe, - 0xc7, 0x04, 0xda, 0x52, 0xed, 0x59, 0x62, 0x30, 0xdf, 0x73, 0xf1, 0x47, 0x3e, 0xd6, 0x57, 0x8b, - 0xf2, 0x2a, 0xef, 0xb7, 0xfa, 0xaf, 0x93, 0x2e, 0xbe, 0x41, 0xfc, 0x97, 0x2c, 0xcc, 0x26, 0x6a, - 0x06, 0xb2, 0x0c, 0x93, 0x42, 0x98, 0xe8, 0x8d, 0x93, 0x77, 0x6b, 0xf3, 0x8a, 0x7d, 0x72, 0x3d, - 0x40, 0x60, 0x48, 0x43, 0x7e, 0x92, 0x81, 0xd9, 0x87, 0x06, 0x33, 0x0f, 0x77, 0x0d, 0x76, 0x28, - 0xef, 0xb4, 0x07, 0x94, 0x41, 0xde, 0x89, 0x4b, 0xad, 0x3c, 0xaf, 0xec, 0x98, 0x4d, 0x20, 0x30, - 0xa9, 0x9f, 0xbc, 0x0c, 0x13, 0x1d, 0xd7, 0xb6, 0x2d, 0xa7, 0x29, 0xae, 0xdd, 0x0a, 0x61, 0xad, - 0xba, 0x2b, 0xc1, 0x18, 0xe0, 0xe3, 0xcd, 0x69, 0xb9, 0x81, 0x5c, 0xc1, 0x24, 0x86, 0x74, 0x54, - 0xb7, 0xed, 0xdf, 0x01, 0xd2, 0xeb, 0x64, 0xe4, 0xa5, 0x80, 0x5e, 0xce, 0xa5, 0x3e, 0x36, 0x79, - 0x9b, 0x03, 0x15, 0xfb, 0xd2, 0x57, 0x13, 0x30, 0xdf, 0xb3, 0x93, 0x21, 0x0b, 0x30, 0x66, 0xd5, - 0x05, 0x5f, 0xb6, 0x02, 0x8a, 0x6f, 0xec, 0xfe, 0x1a, 0x8e, 0x59, 0x75, 0xc2, 0xc2, 0xbb, 0xa2, - 0x61, 0x14, 0x67, 0xf2, 0xe2, 0xb2, 0xe7, 0x66, 0xe8, 0x25, 0x18, 0x77, 0x1f, 0x3a, 0xd4, 0x53, - 0x4d, 0x2f, 0xfa, 0x61, 0x1e, 0x70, 0x20, 0x4a, 0x9c, 0x68, 0xd3, 0xa4, 0x1d, 0xd7, 0xb7, 0x98, - 0xeb, 0xf5, 0xb6, 0x69, 0x6a, 0x0c, 0x46, 0xa8, 0xc8, 0x12, 0xe4, 0xa5, 0x55, 0xe2, 0x4a, 0x74, - 0xb2, 0x02, 0x3c, 0x5a, 0x64, 0x12, 0x44, 0x85, 0x21, 0x0f, 0xa0, 0x60, 0x74, 0xac, 0x7d, 0xb7, - 0x45, 0x1d, 0xd5, 0x95, 0xd2, 0x4f, 0xbf, 0xcb, 0xca, 0xee, 0x7d, 0xc1, 0x8a, 0x5a, 0x08, 0xf9, - 0x08, 0xa6, 0xd5, 0x83, 0x49, 0x1e, 0xd5, 0x78, 0x79, 0x49, 0xa9, 0xf3, 0x67, 0xa7, 0x8b, 0xd3, - 0xef, 0x44, 0xf9, 0x31, 0x2e, 0x4e, 0x36, 0x94, 0xf9, 0xd4, 0xec, 0x7a, 0x54, 0xf4, 0xa9, 0x14, - 0xa2, 0x0d, 0x65, 0x12, 0x8e, 0x9a, 0x82, 0xdc, 0x82, 0xbc, 0x61, 0x32, 0xeb, 0x98, 0x96, 0x26, - 0x05, 0xad, 0x5e, 0x34, 0x56, 0x04, 0x14, 0x15, 0x56, 0xb4, 0x1f, 0xf1, 0x49, 0x52, 0x4b, 0x04, - 0x24, 0xda, 0x8f, 0x42, 0x14, 0x46, 0xe9, 0xc8, 0x1b, 0x30, 0x2d, 0x1d, 0xa4, 0x62, 0xf8, 0xf4, - 0x00, 0xb7, 0x4a, 0x45, 0xc1, 0xf8, 0xac, 0x62, 0x9c, 0xde, 0x88, 0x22, 0x31, 0x4e, 0x4b, 0x56, - 0x60, 0x56, 0x02, 0x0e, 0x3a, 0xb6, 0x6b, 0xd4, 0x39, 0xfb, 0x94, 0x60, 0xd7, 0x4b, 0xc2, 0x46, - 0x1c, 0x8d, 0x49, 0x7a, 0xf2, 0x16, 0x90, 0x3a, 0xb5, 0x29, 0xa3, 0xf7, 0x5c, 0xb7, 0xf5, 0xc0, - 0xb9, 0x6b, 0x39, 0x96, 0x7f, 0x58, 0x9a, 0x16, 0x8f, 0xba, 0xa0, 0xa4, 0x90, 0xb5, 0x1e, 0x0a, - 0x4c, 0xe1, 0x22, 0x7f, 0x1a, 0x5d, 0x33, 0xe4, 0x95, 0xd5, 0x47, 0x83, 0xae, 0x23, 0x46, 0xb5, - 0x6a, 0x9c, 0x8d, 0x8b, 0xd0, 0x8f, 0x97, 0x0d, 0xd1, 0xf0, 0xce, 0x8c, 0x2e, 0xbc, 0x97, 0x61, - 0x92, 0x8b, 0xa5, 0x26, 0xbb, 0xbf, 0xa6, 0x9a, 0xe1, 0x74, 0xee, 0xd9, 0x0d, 0x10, 0x18, 0xd2, - 0x44, 0xc2, 0x36, 0x7b, 0x6e, 0xd8, 0xbe, 0x0b, 0x45, 0x43, 0x34, 0xaa, 0xca, 0xc8, 0xed, 0xab, - 0xf5, 0x6d, 0x96, 0xbb, 0xf4, 0x4a, 0xc8, 0x8d, 0x51, 0x51, 0xa4, 0x0a, 0xcf, 0x52, 0xc7, 0xa8, - 0xd9, 0xb4, 0x5a, 0xdd, 0x7a, 0x9b, 0x7a, 0x56, 0xc3, 0x32, 0x0d, 0x66, 0xb9, 0x8e, 0xe8, 0x86, - 0x2b, 0x54, 0x5e, 0x54, 0xa6, 0x3f, 0xbb, 0x9e, 0x46, 0x84, 0xe9, 0xbc, 0x2a, 0x4e, 0x6c, 0x43, - 0xc7, 0x49, 0xbe, 0x27, 0x4e, 0x42, 0x24, 0xc6, 0x69, 0xcf, 0x71, 0xf2, 0xc2, 0xd5, 0x9d, 0x7c, - 0x72, 0x50, 0x4e, 0x1e, 0xf7, 0xb3, 0x51, 0x39, 0xf9, 0xcf, 0x0a, 0x30, 0x9b, 0xa8, 0x47, 0x53, - 0xf7, 0x2d, 0x99, 0xa7, 0xbc, 0x6f, 0xb9, 0x09, 0x39, 0xc6, 0x17, 0xd5, 0xb1, 0x78, 0x07, 0xb9, - 0x58, 0x4d, 0x05, 0x86, 0xbb, 0x87, 0x79, 0x48, 0xcd, 0x56, 0xd0, 0x11, 0xac, 0x32, 0xa1, 0x76, - 0x8f, 0xd5, 0x28, 0x12, 0xe3, 0xb4, 0xe4, 0x9b, 0x30, 0x69, 0xd4, 0xeb, 0x1e, 0xf5, 0x7d, 0xea, - 0x8b, 0xbd, 0xce, 0x64, 0x65, 0x9a, 0xc7, 0xd6, 0x4a, 0x00, 0xc4, 0x10, 0xcf, 0xb3, 0xc7, 0x61, - 0xbd, 0xe1, 0x1f, 0xf8, 0xd4, 0x13, 0x0e, 0x1d, 0x69, 0x12, 0xe6, 0x43, 0xc9, 0xe1, 0xa8, 0x29, - 0x48, 0x1d, 0x66, 0x5b, 0x5e, 0x6d, 0x75, 0xd5, 0x30, 0x0f, 0xa9, 0xca, 0x66, 0xf9, 0xbe, 0xfb, - 0xcc, 0x37, 0xe3, 0x12, 0x30, 0x29, 0x52, 0x69, 0xd9, 0xa4, 0x27, 0xcc, 0xa8, 0x3d, 0x49, 0xce, - 0x0c, 0xb4, 0x44, 0x25, 0x60, 0x52, 0x24, 0xcf, 0x70, 0x2d, 0xaf, 0x16, 0x74, 0xbc, 0x8a, 0xf0, - 0x89, 0x64, 0xb8, 0xcd, 0x10, 0x85, 0x51, 0x3a, 0x3e, 0x60, 0x2d, 0xaf, 0x86, 0xd4, 0xb0, 0xdb, - 0x22, 0x85, 0x46, 0x06, 0x6c, 0x53, 0xc1, 0x51, 0x53, 0x90, 0x0e, 0x10, 0xfe, 0x74, 0x62, 0xde, - 0xe5, 0xbf, 0xdb, 0x46, 0x47, 0x64, 0xd3, 0xe2, 0x9d, 0xdb, 0x69, 0x4f, 0xa3, 0x89, 0xa2, 0x0f, - 0xf4, 0x1c, 0x0f, 0xe8, 0xcd, 0x1e, 0x39, 0x98, 0x22, 0x9b, 0xbc, 0x07, 0xcf, 0xb7, 0xbc, 0x9a, - 0xea, 0x19, 0xdb, 0xf5, 0x2c, 0xc7, 0xb4, 0x3a, 0x86, 0xec, 0x21, 0x96, 0xb9, 0x78, 0x51, 0x99, - 0xfb, 0xfc, 0x66, 0x3a, 0x19, 0x9e, 0xc7, 0x1f, 0xdf, 0x44, 0x4f, 0x0d, 0x64, 0x13, 0x9d, 0x08, - 0xd7, 0x51, 0xad, 0x14, 0xff, 0x9c, 0x01, 0x22, 0xce, 0xc4, 0x57, 0x5d, 0xc7, 0xef, 0xb6, 0xa9, - 0xb7, 0xe1, 0xb9, 0xdd, 0x0e, 0xcf, 0x4c, 0x4d, 0xfe, 0x47, 0xa4, 0xe3, 0x50, 0x67, 0xa6, 0x8d, - 0x00, 0x81, 0x21, 0x0d, 0xdf, 0x4d, 0xb9, 0x76, 0x9d, 0xfa, 0x4c, 0xa8, 0x88, 0xec, 0xa6, 0x1e, - 0x08, 0x28, 0x2a, 0x2c, 0xd9, 0x80, 0x79, 0x8f, 0xd6, 0x0c, 0xdb, 0x70, 0x78, 0xd9, 0xe7, 0x19, - 0x8c, 0x36, 0x4f, 0x54, 0x4c, 0xbf, 0xa0, 0x58, 0xe6, 0x31, 0x49, 0x80, 0xbd, 0x3c, 0x4b, 0x5f, - 0xe4, 0x61, 0x2e, 0x79, 0x98, 0xff, 0xb8, 0x97, 0xa8, 0x78, 0xbe, 0x35, 0x3c, 0x66, 0x89, 0xa4, - 0x95, 0xcc, 0xb7, 0x01, 0x02, 0x43, 0x1a, 0xbe, 0xff, 0x66, 0x6e, 0xc7, 0x32, 0x93, 0xfb, 0xef, - 0x7d, 0x0e, 0x44, 0x89, 0x4b, 0x6f, 0xe3, 0xce, 0x8d, 0xac, 0x8d, 0x5b, 0x35, 0x66, 0x8f, 0x0f, - 0xb8, 0x31, 0xbb, 0xbf, 0x37, 0xa9, 0x3e, 0x8b, 0x06, 0x84, 0xec, 0x2c, 0xfc, 0x70, 0xc0, 0x37, - 0x35, 0x97, 0x8f, 0x08, 0x1e, 0x9e, 0xd3, 0x66, 0xd4, 0x9f, 0x55, 0xdb, 0xfa, 0xde, 0x20, 0x4c, - 0x8a, 0x05, 0x8a, 0xac, 0x4a, 0x62, 0x20, 0x8c, 0xab, 0x26, 0xbb, 0x70, 0xdd, 0xb6, 0xda, 0x16, - 0x93, 0xdb, 0xb4, 0x5d, 0xea, 0x55, 0xa9, 0xe9, 0x3a, 0x75, 0xb1, 0x64, 0x66, 0x2b, 0x5f, 0x57, - 0x8f, 0x71, 0x7d, 0x2b, 0x85, 0x06, 0x53, 0x39, 0x79, 0xb5, 0x7f, 0x4c, 0x3d, 0x9f, 0x3b, 0x31, - 0xc4, 0xdf, 0x3e, 0x7a, 0x5b, 0x82, 0x31, 0xc0, 0x5f, 0x6d, 0x6d, 0xf8, 0xd7, 0x1c, 0xcc, 0x26, - 0x2e, 0xa9, 0x1e, 0x17, 0x61, 0x3a, 0x60, 0xc6, 0x2e, 0x08, 0x98, 0x57, 0xa0, 0x60, 0xda, 0x16, - 0x75, 0xd8, 0xfd, 0xba, 0x0a, 0xac, 0xb0, 0x5f, 0x55, 0xc2, 0xd7, 0x50, 0x53, 0x3c, 0xed, 0xf0, - 0x8a, 0xc6, 0xc1, 0xf8, 0x65, 0xdf, 0x92, 0xc8, 0x0f, 0xf3, 0x8d, 0xc2, 0x89, 0x81, 0xe4, 0x9b, - 0xc4, 0xc4, 0x8e, 0x2a, 0xdf, 0xfc, 0x63, 0x0e, 0xe6, 0x92, 0xd7, 0x8d, 0x8f, 0x73, 0xaa, 0x97, - 0x61, 0xc2, 0xef, 0x8a, 0xb7, 0x1f, 0x94, 0x5b, 0x69, 0x7f, 0xaf, 0x4a, 0x30, 0x06, 0xf8, 0x74, - 0x67, 0xc9, 0x3e, 0x15, 0x67, 0xc9, 0x5d, 0xd6, 0x59, 0x06, 0xbd, 0x72, 0x7f, 0xd6, 0xfb, 0xc2, - 0xd9, 0x87, 0x03, 0xbe, 0x20, 0x1e, 0x95, 0xb7, 0xfc, 0x47, 0x0e, 0x66, 0xe2, 0x47, 0xec, 0x7c, - 0xb3, 0x7a, 0xe8, 0xfa, 0x4c, 0x6d, 0xe1, 0x95, 0xcf, 0xe8, 0xcd, 0xea, 0xbd, 0x10, 0x85, 0x51, - 0xba, 0xcb, 0x2d, 0x4c, 0x2f, 0xc3, 0x84, 0x7a, 0x83, 0x4c, 0xad, 0x4b, 0xda, 0xd1, 0xd4, 0x5b, - 0x66, 0x18, 0xe0, 0xff, 0x7f, 0x55, 0xb2, 0x7d, 0xf2, 0xc3, 0xde, 0x55, 0xe9, 0xfd, 0x81, 0xde, - 0xa7, 0x8c, 0xca, 0xcd, 0xfe, 0x77, 0x1c, 0xe6, 0x7b, 0xae, 0xd9, 0xe3, 0xa7, 0x33, 0x99, 0x4b, - 0x9c, 0xce, 0xbc, 0x09, 0x33, 0xc2, 0x8f, 0x76, 0x13, 0x67, 0x3a, 0xba, 0xb5, 0x72, 0x3f, 0x86, - 0xc5, 0x04, 0xf5, 0xe5, 0x76, 0x9b, 0x6f, 0xc2, 0x8c, 0xdf, 0xad, 0xf9, 0xa6, 0x67, 0x75, 0xb8, - 0x43, 0xdc, 0x5f, 0x53, 0x27, 0xbe, 0x5a, 0x49, 0x35, 0x86, 0xc5, 0x04, 0x35, 0x69, 0xc2, 0x9c, - 0xe9, 0xd1, 0x3a, 0x75, 0x98, 0x65, 0xd8, 0xaa, 0xa6, 0xec, 0xeb, 0x6d, 0xc6, 0xeb, 0x67, 0xa7, - 0x8b, 0x73, 0xab, 0x09, 0x11, 0xd8, 0x23, 0x94, 0xd4, 0x60, 0x41, 0x9e, 0xb2, 0x44, 0x0d, 0xd2, - 0x67, 0x34, 0x72, 0x4b, 0xb9, 0xa4, 0x8c, 0x5e, 0x58, 0x3b, 0x97, 0x12, 0x2f, 0x90, 0xd2, 0xe7, - 0x2b, 0x8c, 0x9b, 0x30, 0x1b, 0x5a, 0xe9, 0xdf, 0xb5, 0xec, 0xa0, 0xd6, 0xfd, 0x15, 0xc5, 0xf4, - 0xc2, 0x1a, 0xed, 0x78, 0xd4, 0x34, 0x18, 0xad, 0xaf, 0xc6, 0x09, 0x31, 0xc9, 0x39, 0x8c, 0xe3, - 0xa2, 0x1e, 0x17, 0x1c, 0x95, 0xff, 0xff, 0x57, 0x9e, 0xfb, 0x7f, 0xe2, 0xfa, 0x90, 0x2c, 0x41, - 0x5e, 0xb8, 0x1c, 0x5f, 0x64, 0xf5, 0x61, 0xa3, 0xf0, 0x45, 0x1f, 0x15, 0xe6, 0x12, 0x07, 0x38, - 0x2a, 0xb7, 0x67, 0xcf, 0xc9, 0xed, 0x1d, 0xb8, 0xc6, 0x6c, 0x7f, 0xdf, 0xeb, 0xfa, 0x6c, 0x95, - 0x7a, 0xcc, 0x57, 0x1e, 0x99, 0xeb, 0xfb, 0x0b, 0x01, 0xfb, 0x5b, 0xd5, 0xa4, 0x14, 0x4c, 0x13, - 0xcd, 0xfd, 0x92, 0xd9, 0xfe, 0x8a, 0x6d, 0xbb, 0x0f, 0x83, 0x5b, 0x81, 0x70, 0xc9, 0x55, 0x8b, - 0xa9, 0xf6, 0xcb, 0xfd, 0xad, 0xea, 0x39, 0x94, 0x78, 0x81, 0x14, 0xb2, 0x2d, 0x9e, 0xea, 0x6d, - 0xc3, 0xb6, 0xea, 0x06, 0xa3, 0x3c, 0x29, 0x89, 0x93, 0x15, 0xe9, 0xf4, 0x5f, 0x53, 0xc2, 0xb9, - 0xc9, 0x49, 0x12, 0x4c, 0xe3, 0x1b, 0xd6, 0x77, 0x2a, 0x52, 0x73, 0x58, 0xe1, 0xa9, 0xe4, 0xb0, - 0xc9, 0xc7, 0x06, 0x6f, 0x2c, 0xde, 0x60, 0x40, 0xf1, 0x96, 0x70, 0xf9, 0x51, 0xc5, 0xdb, 0x3f, - 0xe5, 0x60, 0x2e, 0xd9, 0xc3, 0xf0, 0xa4, 0x1b, 0x9b, 0xe8, 0x5b, 0xe9, 0x63, 0x83, 0x78, 0x2b, - 0x7d, 0x19, 0x26, 0xb9, 0xd3, 0xf9, 0x1d, 0xc3, 0x0c, 0x5e, 0xb6, 0xd7, 0x69, 0x6f, 0x27, 0x40, - 0x60, 0x48, 0x43, 0x16, 0x60, 0xac, 0x5e, 0x53, 0xef, 0x5f, 0xea, 0x6b, 0xd3, 0xb5, 0x0a, 0x8e, - 0xd5, 0x6b, 0xe4, 0x36, 0x14, 0xd4, 0x8e, 0x29, 0xb8, 0x69, 0x14, 0x6a, 0xd5, 0x76, 0xca, 0x47, - 0x8d, 0x1d, 0xd6, 0x1e, 0x65, 0x08, 0x07, 0x13, 0xc9, 0x99, 0x1b, 0xd9, 0xdb, 0xe5, 0x39, 0xb8, - 0x96, 0xd2, 0x63, 0x1c, 0x9f, 0xb0, 0xcc, 0x25, 0x26, 0xec, 0x08, 0xf2, 0x0d, 0xcb, 0x66, 0xd4, - 0x1b, 0xd0, 0x55, 0x76, 0x60, 0xd4, 0x5d, 0x21, 0x54, 0xe6, 0x09, 0xf9, 0x37, 0x2a, 0x45, 0x3c, - 0x7a, 0xaf, 0x8b, 0xc3, 0xc2, 0xe0, 0x84, 0x22, 0x78, 0x09, 0x34, 0xab, 0xe6, 0xfb, 0x52, 0x2f, - 0x6d, 0x6f, 0xa4, 0x48, 0x08, 0x4f, 0x50, 0xd2, 0xb0, 0x98, 0xaa, 0x95, 0xac, 0x02, 0xe8, 0x86, - 0x8e, 0xe0, 0x66, 0xe0, 0xa5, 0xb3, 0xd3, 0x45, 0xd0, 0x1d, 0x1f, 0xfe, 0x2f, 0xc5, 0x41, 0x64, - 0x64, 0xb4, 0x45, 0x4e, 0x8b, 0xb0, 0xc5, 0x3f, 0xec, 0x31, 0x3e, 0x90, 0x0f, 0x7b, 0xa4, 0x4c, - 0xef, 0xc8, 0x0a, 0xf3, 0x2c, 0xcc, 0xc4, 0x27, 0x92, 0xdc, 0x82, 0x7c, 0xc7, 0xa3, 0x0d, 0xeb, - 0x51, 0xf2, 0xa3, 0x1e, 0xbb, 0x02, 0x8a, 0x0a, 0x4b, 0x5c, 0xc8, 0xdb, 0x46, 0x8d, 0x87, 0xb8, - 0x7c, 0x4f, 0x7e, 0xe3, 0xca, 0xef, 0x7c, 0xab, 0x25, 0x4a, 0x2b, 0xdc, 0x12, 0xe2, 0x51, 0xa9, - 0xe1, 0x0a, 0x1b, 0x16, 0xb5, 0xeb, 0xf2, 0x1a, 0x74, 0x18, 0x0a, 0xef, 0x0a, 0xf1, 0xa8, 0xd4, - 0x90, 0xf7, 0x61, 0xd2, 0xf4, 0x28, 0xdf, 0x17, 0x56, 0x4e, 0xd4, 0xde, 0xe4, 0x57, 0x2f, 0xe7, - 0xb2, 0xfb, 0x56, 0x9b, 0x86, 0xe1, 0xb8, 0x1a, 0x08, 0xc1, 0x50, 0x1e, 0xb9, 0x03, 0x60, 0x34, - 0x18, 0xf5, 0xaa, 0xcc, 0xf0, 0x98, 0xda, 0x80, 0xe8, 0xfe, 0x8d, 0x15, 0x8d, 0xc1, 0x08, 0xd5, - 0xd2, 0x57, 0x39, 0x98, 0x89, 0xf7, 0x4a, 0x3f, 0xa5, 0x2b, 0xec, 0x57, 0xa0, 0x20, 0xb6, 0x82, - 0x2b, 0x9e, 0x93, 0xfc, 0x88, 0xcf, 0xbe, 0x82, 0xa3, 0xa6, 0x20, 0x08, 0x93, 0xc6, 0x93, 0x7d, - 0x97, 0x49, 0xde, 0xdb, 0xe9, 0x2f, 0x32, 0x85, 0x62, 0xb8, 0x4c, 0x3f, 0x20, 0xef, 0x6f, 0xdf, - 0x28, 0x64, 0x6a, 0x30, 0x86, 0x62, 0xb8, 0xe7, 0x7b, 0xb4, 0x19, 0xec, 0x07, 0x23, 0x9e, 0x8f, - 0x02, 0x8a, 0x0a, 0x4b, 0x5e, 0x86, 0x09, 0xcf, 0xb5, 0xe9, 0x0a, 0xee, 0xa8, 0x6b, 0x6b, 0x7d, - 0x60, 0x80, 0x12, 0x8c, 0x01, 0x7e, 0x18, 0xc5, 0x72, 0xdc, 0x01, 0x46, 0xb5, 0x50, 0xfc, 0xc3, - 0x38, 0xcc, 0xc4, 0xdb, 0xe3, 0xe3, 0xd3, 0x9a, 0x19, 0xc2, 0xb4, 0x8e, 0x0d, 0x7a, 0x5a, 0xb3, - 0x17, 0x4e, 0xeb, 0x4b, 0x30, 0x7e, 0xd4, 0xa5, 0xdd, 0xe0, 0x63, 0x51, 0xba, 0x10, 0xdf, 0xe3, - 0x40, 0x94, 0x38, 0xb2, 0x02, 0xb3, 0x0f, 0x0d, 0x8b, 0xf1, 0x00, 0x97, 0xe7, 0xf2, 0xf2, 0x24, - 0x2f, 0x1b, 0xbd, 0xfe, 0x8e, 0xa1, 0x31, 0x49, 0xdf, 0x8f, 0xfb, 0xf4, 0x57, 0xe9, 0xbe, 0x09, - 0x33, 0xc2, 0xc8, 0x15, 0xd3, 0x74, 0xbb, 0xe2, 0x9c, 0xbd, 0x10, 0x3f, 0x24, 0xd8, 0x8b, 0x62, - 0xd7, 0x30, 0x41, 0x1d, 0x77, 0xd6, 0xc1, 0x7c, 0x1b, 0x21, 0xee, 0x32, 0xa3, 0x72, 0xd6, 0xdf, - 0x83, 0x42, 0xe0, 0x17, 0xbc, 0x12, 0xd5, 0x7c, 0x61, 0x25, 0xca, 0x5d, 0x44, 0x08, 0x59, 0x86, - 0x49, 0xb7, 0x43, 0x3d, 0x23, 0xed, 0x72, 0xf0, 0x41, 0x80, 0xc0, 0x90, 0x26, 0xec, 0x34, 0xcc, - 0x5e, 0xd0, 0x69, 0xf8, 0x83, 0x0c, 0x04, 0x9f, 0x2d, 0x21, 0x6b, 0x30, 0xde, 0x71, 0x3d, 0x26, - 0xeb, 0xe9, 0xe2, 0x9d, 0xc5, 0x74, 0x77, 0x96, 0xd7, 0xcd, 0xae, 0xc7, 0x42, 0x89, 0xfc, 0x97, - 0x8f, 0x92, 0x99, 0xdb, 0x69, 0xda, 0x5d, 0x9f, 0x51, 0xef, 0xfe, 0x6e, 0xd2, 0xce, 0xd5, 0x00, - 0x81, 0x21, 0xcd, 0xd2, 0xff, 0x64, 0x61, 0x2e, 0xf9, 0x46, 0x00, 0xf9, 0x08, 0xa6, 0x7d, 0xab, - 0xe9, 0x58, 0x4e, 0x53, 0x55, 0xdc, 0x99, 0xbe, 0x7b, 0xf1, 0xaa, 0x51, 0x7e, 0x8c, 0x8b, 0x23, - 0x77, 0x61, 0x9c, 0x89, 0xfe, 0xa3, 0xbe, 0x42, 0x77, 0x52, 0x1e, 0x77, 0xb5, 0xa8, 0x83, 0x92, - 0x3d, 0x9a, 0xd5, 0xb2, 0xa3, 0xcb, 0x6a, 0x9f, 0xf5, 0x36, 0xc9, 0x7e, 0x38, 0xe0, 0x77, 0x32, - 0x46, 0x15, 0x01, 0xff, 0x3d, 0x0e, 0xcf, 0xa5, 0xbf, 0x7d, 0xf1, 0x94, 0x76, 0x0c, 0x61, 0x0f, - 0xdb, 0xd8, 0xb9, 0x3d, 0x6c, 0x4c, 0x57, 0x28, 0xd9, 0x01, 0xbd, 0x4d, 0xa1, 0x07, 0xe0, 0x82, - 0x22, 0x25, 0xba, 0x97, 0xc9, 0x3d, 0x76, 0x2f, 0x73, 0x0b, 0xf2, 0xb5, 0xae, 0xd9, 0x52, 0xc7, - 0xa7, 0xd1, 0x4f, 0xde, 0x09, 0x28, 0x2a, 0x6c, 0x24, 0xe9, 0xe4, 0x2f, 0x4c, 0x3a, 0x3c, 0x89, - 0x76, 0xd9, 0xa1, 0xec, 0xda, 0x9b, 0xe8, 0x3f, 0x89, 0x06, 0xbc, 0x18, 0x8a, 0x11, 0x3d, 0xae, - 0x1d, 0xeb, 0x00, 0xb7, 0xd4, 0xfa, 0x1f, 0xf6, 0xb8, 0xee, 0xde, 0x3f, 0xc0, 0x2d, 0x54, 0x58, - 0xf2, 0x93, 0xde, 0xf5, 0xde, 0x1c, 0xca, 0x1b, 0x3f, 0xa3, 0xf2, 0x7a, 0x13, 0xe6, 0x7b, 0xe6, - 0xfc, 0xd2, 0xf5, 0xcc, 0x2d, 0xc8, 0xfb, 0xdd, 0x06, 0xa7, 0x1b, 0x8b, 0xd3, 0x55, 0x05, 0x14, - 0x15, 0x76, 0xe9, 0xc7, 0x39, 0xae, 0x25, 0xf1, 0x9e, 0xce, 0x53, 0x8a, 0xaa, 0x37, 0x60, 0x5a, - 0x56, 0x14, 0xef, 0x44, 0xba, 0xd4, 0x0b, 0x91, 0x3e, 0xb9, 0x28, 0x12, 0xe3, 0xb4, 0xe4, 0xbe, - 0x70, 0x93, 0xbe, 0xf7, 0xe4, 0xa0, 0x3c, 0x89, 0xa7, 0x50, 0x25, 0x80, 0xbc, 0x0a, 0x45, 0xf1, - 0x10, 0x72, 0xc8, 0x55, 0x69, 0x2d, 0xda, 0x4a, 0xd7, 0x43, 0x30, 0x46, 0x69, 0xe2, 0x27, 0x7b, - 0xe3, 0x03, 0x39, 0xd9, 0xeb, 0x99, 0x95, 0x91, 0x55, 0xd1, 0x79, 0xd0, 0x9f, 0x45, 0x23, 0x66, - 0xcf, 0xc7, 0xe9, 0xbe, 0xd3, 0xf7, 0xb9, 0x56, 0x60, 0x8a, 0x3c, 0x37, 0x4b, 0xe9, 0x75, 0x79, - 0x0b, 0x88, 0xfa, 0x1a, 0x9a, 0xda, 0xbe, 0x45, 0x3e, 0x0f, 0xad, 0x5b, 0x60, 0xab, 0x3d, 0x14, - 0x98, 0xc2, 0x45, 0xde, 0x82, 0x49, 0xd3, 0x75, 0x98, 0x61, 0x39, 0x7a, 0xe5, 0x7d, 0xf1, 0x9c, - 0xd6, 0x3c, 0x49, 0x24, 0x97, 0x1e, 0xfd, 0x13, 0x43, 0x76, 0xb2, 0x0e, 0x13, 0xc7, 0xae, 0xdd, - 0x6d, 0xab, 0xf3, 0x95, 0xe2, 0x9d, 0x85, 0x34, 0x49, 0x6f, 0x0b, 0x92, 0x48, 0x03, 0x8b, 0x64, - 0xc1, 0x80, 0x97, 0x50, 0x98, 0x15, 0xa7, 0xeb, 0x16, 0x3b, 0x51, 0x01, 0xa0, 0x6e, 0xab, 0x6e, - 0xa5, 0x89, 0xdb, 0x75, 0xeb, 0xd5, 0x38, 0xb5, 0xfa, 0xa0, 0x6f, 0x1c, 0x88, 0x49, 0x99, 0xe4, - 0x2e, 0x14, 0x8c, 0x46, 0xc3, 0x72, 0x2c, 0x76, 0xa2, 0x8e, 0x20, 0xbf, 0x9e, 0x26, 0x7f, 0x45, - 0xd1, 0xa8, 0x57, 0x1c, 0xd4, 0x2f, 0xd4, 0xbc, 0xe4, 0x00, 0x8a, 0xcc, 0xb5, 0xd5, 0x0e, 0xd1, - 0x57, 0x75, 0xde, 0x8d, 0x34, 0x51, 0xfb, 0x9a, 0x2c, 0x3c, 0xe4, 0x0d, 0x61, 0x3e, 0x46, 0xe5, - 0x90, 0xbf, 0xc8, 0xc0, 0x94, 0xe3, 0xd6, 0x69, 0x10, 0x7a, 0xea, 0xdb, 0x69, 0xef, 0x0d, 0xe8, - 0x73, 0x7e, 0xe5, 0x9d, 0x88, 0x6c, 0x19, 0x21, 0xfa, 0xfb, 0x82, 0x51, 0x14, 0xc6, 0x8c, 0x58, - 0xf8, 0x2e, 0xcc, 0xf7, 0x30, 0xf6, 0x15, 0x2d, 0x7f, 0x9d, 0x81, 0x64, 0x8f, 0x30, 0xdf, 0xde, - 0xd6, 0x2d, 0x4f, 0x08, 0x3c, 0x49, 0x9e, 0x66, 0xae, 0x05, 0x08, 0x0c, 0x69, 0xc8, 0x4d, 0xc8, - 0x75, 0x0c, 0x76, 0x98, 0xbc, 0x82, 0xe2, 0x22, 0x51, 0x60, 0xc8, 0x1d, 0x00, 0xfe, 0x3f, 0xd2, - 0x26, 0x7d, 0xd4, 0x51, 0xbb, 0x75, 0x7d, 0xc0, 0xb2, 0xab, 0x31, 0x18, 0xa1, 0x5a, 0xfa, 0x59, - 0x1e, 0x66, 0xe2, 0x0b, 0x2f, 0xdf, 0x1e, 0x50, 0xa7, 0xde, 0x71, 0x2d, 0x87, 0x25, 0xbf, 0x6e, - 0xbc, 0xae, 0xe0, 0xa8, 0x29, 0x78, 0x12, 0x69, 0x53, 0x76, 0xe8, 0xd6, 0x93, 0x49, 0x64, 0x5b, - 0x40, 0x51, 0x61, 0x85, 0xf9, 0xae, 0xc7, 0x94, 0x59, 0xa1, 0xf9, 0xae, 0xc7, 0x50, 0x60, 0x82, - 0x1b, 0xb4, 0xdc, 0x39, 0x37, 0x68, 0x4d, 0x98, 0xe3, 0xa1, 0x4c, 0xbd, 0x55, 0xea, 0xb1, 0x27, - 0xbe, 0xd0, 0xad, 0x26, 0x44, 0x60, 0x8f, 0x50, 0xf1, 0x69, 0x6d, 0x01, 0x13, 0xcc, 0x4f, 0xd8, - 0xf2, 0x5c, 0x8d, 0x4b, 0xc0, 0xa4, 0xc8, 0x61, 0x9c, 0x93, 0xc4, 0xe7, 0xb1, 0x8f, 0x3e, 0xc2, - 0x03, 0x00, 0xbe, 0x97, 0x52, 0x0f, 0x5b, 0xe8, 0xe7, 0x61, 0x67, 0xc4, 0xe1, 0x9d, 0x66, 0xc6, - 0x88, 0x20, 0x72, 0x0f, 0x66, 0xc2, 0xc1, 0xe5, 0xfe, 0xa7, 0xda, 0xa7, 0x6f, 0x2a, 0x53, 0x4a, - 0xe1, 0x35, 0x74, 0x35, 0x46, 0x87, 0x09, 0x3e, 0xb2, 0x0e, 0xd3, 0x7a, 0xfc, 0x84, 0x20, 0x88, - 0x37, 0x36, 0x27, 0x05, 0x29, 0x32, 0x8c, 0x73, 0x5d, 0x29, 0xe5, 0x55, 0xca, 0x9f, 0x7f, 0x79, - 0xe3, 0x99, 0x9f, 0x7f, 0x79, 0xe3, 0x99, 0x5f, 0x7c, 0x79, 0xe3, 0x99, 0x1f, 0x9c, 0xdd, 0xc8, - 0x7c, 0x7e, 0x76, 0x23, 0xf3, 0xf3, 0xb3, 0x1b, 0x99, 0x5f, 0x9c, 0xdd, 0xc8, 0x7c, 0x71, 0x76, - 0x23, 0xf3, 0xe3, 0x7f, 0xbf, 0xf1, 0xcc, 0xf7, 0x0a, 0xc1, 0x6c, 0xfc, 0x5f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0x2c, 0x16, 0x4b, 0x33, 0xbe, 0x62, 0x00, 0x00, + 0x30, 0x93, 0xf5, 0x52, 0xf1, 0x24, 0x9b, 0x38, 0x36, 0xe2, 0x85, 0x28, 0x69, 0x34, 0x63, 0x3d, + 0x46, 0xfa, 0x28, 0xf9, 0xb1, 0x7e, 0x6d, 0xb3, 0x59, 0x24, 0xdb, 0x6c, 0x76, 0x53, 0xdd, 0xc5, + 0x99, 0x91, 0x81, 0x24, 0x8b, 0x20, 0xaf, 0x8d, 0xe3, 0x64, 0x17, 0xd9, 0x04, 0x41, 0x72, 0xcb, + 0x21, 0x0b, 0x24, 0xc7, 0x00, 0xf9, 0x0d, 0x06, 0x72, 0xd9, 0xdc, 0x16, 0x08, 0x20, 0xd8, 0x4a, + 0x90, 0x5b, 0x4e, 0xb9, 0x2c, 0x36, 0x08, 0x10, 0xd4, 0xa3, 0xab, 0x1f, 0x6c, 0xcd, 0x88, 0x16, + 0xc9, 0xb9, 0xe4, 0x32, 0x23, 0x7e, 0xef, 0xae, 0xfa, 0xbe, 0xfa, 0xea, 0xab, 0xfa, 0xba, 0x61, + 0xb7, 0x69, 0xb1, 0x56, 0xaf, 0x56, 0x36, 0xdd, 0xce, 0xaa, 0xe1, 0x35, 0xdd, 0xae, 0xe7, 0x7e, + 0x2c, 0xfe, 0xf8, 0x16, 0x7d, 0x40, 0x1d, 0xe6, 0xaf, 0x76, 0xdb, 0xcd, 0x55, 0xa3, 0x6b, 0xf9, + 0xab, 0xf2, 0xb7, 0xdb, 0xf3, 0x4c, 0xba, 0xfa, 0xe0, 0x15, 0xc3, 0xee, 0xb6, 0x8c, 0x57, 0x56, + 0x9b, 0xd4, 0xa1, 0x9e, 0xc1, 0x68, 0xbd, 0xdc, 0xf5, 0x5c, 0xe6, 0x92, 0xdf, 0x0a, 0xc5, 0x95, + 0x03, 0x71, 0xe2, 0x8f, 0x8f, 0x24, 0x7b, 0xb9, 0xdb, 0x6e, 0x96, 0xb9, 0xb8, 0x72, 0x44, 0x5c, + 0x39, 0x10, 0xb7, 0xf4, 0x9d, 0x0b, 0x5b, 0x63, 0xba, 0x9d, 0x8e, 0xeb, 0x24, 0xf5, 0x2f, 0x7d, + 0x2b, 0x22, 0xa0, 0xe9, 0x36, 0xdd, 0x55, 0x01, 0xae, 0xf5, 0x1a, 0xe2, 0x97, 0xf8, 0x21, 0xfe, + 0x52, 0xe4, 0x2b, 0xed, 0x57, 0xfd, 0xb2, 0xe5, 0x72, 0x91, 0xab, 0xa6, 0xeb, 0xf1, 0x07, 0xeb, + 0x13, 0xf9, 0x6b, 0x21, 0x4d, 0xc7, 0x30, 0x5b, 0x96, 0x43, 0xbd, 0x93, 0xd0, 0x8e, 0x0e, 0x65, + 0x46, 0x1a, 0xd7, 0xea, 0x79, 0x5c, 0x5e, 0xcf, 0x61, 0x56, 0x87, 0xf6, 0x31, 0xfc, 0xfa, 0x93, + 0x18, 0x7c, 0xb3, 0x45, 0x3b, 0x46, 0x92, 0x6f, 0xe5, 0xef, 0x27, 0x61, 0x7e, 0x6d, 0xf7, 0x60, + 0x7f, 0x93, 0x0f, 0x50, 0x55, 0x8c, 0x27, 0x79, 0x11, 0xb2, 0x3d, 0xcf, 0x2e, 0x65, 0xae, 0x67, + 0x6e, 0x4e, 0x57, 0x8a, 0x9f, 0x9f, 0x2e, 0x3f, 0x73, 0x76, 0xba, 0x9c, 0x3d, 0xc2, 0x1d, 0xe4, + 0x70, 0xf2, 0x2a, 0xcc, 0xd0, 0x47, 0x66, 0xcb, 0x70, 0x9a, 0x74, 0xcf, 0xe8, 0xd0, 0xd2, 0x84, + 0xa0, 0xbb, 0xaa, 0xe8, 0x66, 0x36, 0x23, 0x38, 0x8c, 0x51, 0x46, 0x39, 0x0f, 0x4f, 0xba, 0xb4, + 0x94, 0x4d, 0xe7, 0xe4, 0x38, 0x8c, 0x51, 0x92, 0xdb, 0x00, 0x9e, 0xdb, 0x63, 0x96, 0xd3, 0xdc, + 0xa6, 0x27, 0xa5, 0x9c, 0xe0, 0x23, 0x8a, 0x0f, 0x50, 0x63, 0x30, 0x42, 0x45, 0x7e, 0x1b, 0x16, + 0x4d, 0xd7, 0x71, 0xa8, 0xc9, 0x2c, 0xd7, 0xa9, 0x18, 0x66, 0xdb, 0x6d, 0x34, 0x4a, 0x93, 0xd7, + 0x33, 0x37, 0x8b, 0xb7, 0x5f, 0x2d, 0x5f, 0xd8, 0xd1, 0xa4, 0xa7, 0x94, 0x15, 0x7f, 0xe5, 0xd9, + 0xb3, 0xd3, 0xe5, 0xc5, 0xf5, 0xa4, 0x58, 0xec, 0xd7, 0x44, 0x5e, 0x86, 0xc2, 0xc7, 0xbe, 0xeb, + 0x54, 0xdc, 0xfa, 0x49, 0x29, 0x7f, 0x3d, 0x73, 0xb3, 0x50, 0x59, 0x50, 0x06, 0x17, 0xde, 0xac, + 0xde, 0xdf, 0xe3, 0x70, 0xd4, 0x14, 0xe4, 0x08, 0xb2, 0xcc, 0xf6, 0x4b, 0x53, 0xc2, 0xbc, 0xd7, + 0x06, 0x36, 0xef, 0x70, 0xa7, 0xba, 0xee, 0x3a, 0x0d, 0xab, 0x59, 0x99, 0xe2, 0x73, 0x75, 0xb8, + 0x53, 0x45, 0x2e, 0x8f, 0xfc, 0x49, 0x06, 0x0a, 0xdc, 0xc7, 0xea, 0x06, 0x33, 0x4a, 0x85, 0xeb, + 0xd9, 0x9b, 0xc5, 0xdb, 0xef, 0x97, 0x2f, 0x15, 0x64, 0xe5, 0x84, 0xb7, 0x94, 0x77, 0x95, 0xf8, + 0x4d, 0x87, 0x79, 0x27, 0xe1, 0x33, 0x06, 0x60, 0xd4, 0xfa, 0x97, 0x5e, 0x87, 0xd9, 0x18, 0x31, + 0x59, 0x80, 0x6c, 0x9b, 0x9e, 0x48, 0x47, 0x43, 0xfe, 0x27, 0xb9, 0x0a, 0x93, 0x0f, 0x0c, 0xbb, + 0xa7, 0x9c, 0x0a, 0xe5, 0x8f, 0xd7, 0x26, 0x5e, 0xcd, 0xac, 0xfc, 0x38, 0x07, 0x2f, 0xac, 0x7d, + 0xd2, 0xf3, 0xa8, 0xd0, 0xed, 0xdf, 0xed, 0xd5, 0xa2, 0x2e, 0x7b, 0x1d, 0x72, 0x8d, 0xe3, 0xba, + 0xa3, 0x7c, 0x76, 0x46, 0x19, 0x91, 0xbb, 0x73, 0xb0, 0xb1, 0x87, 0x02, 0x43, 0xba, 0x70, 0xc5, + 0x6f, 0x19, 0x1e, 0xad, 0xaf, 0x99, 0x26, 0xf5, 0xfd, 0x6d, 0x7a, 0xa2, 0x9d, 0xb7, 0x78, 0xfb, + 0x1b, 0x65, 0x19, 0x3e, 0xfc, 0xb1, 0xcb, 0x3c, 0x92, 0xcb, 0x0f, 0x5e, 0x29, 0x57, 0xa9, 0xe9, + 0x51, 0xb6, 0x4d, 0x4f, 0xaa, 0xd4, 0xa6, 0x26, 0x73, 0xbd, 0xca, 0xf3, 0x67, 0xa7, 0xcb, 0x57, + 0xaa, 0xfd, 0x52, 0x30, 0x4d, 0x34, 0xa9, 0xc3, 0x7c, 0x02, 0x2c, 0x1c, 0xfe, 0xc2, 0xda, 0xae, + 0x9c, 0x9d, 0x2e, 0xcf, 0x27, 0xb4, 0x61, 0x52, 0x24, 0xb9, 0x05, 0x53, 0xad, 0x5e, 0x4d, 0x3c, + 0x8b, 0x0c, 0x8b, 0x79, 0xf5, 0xf0, 0x53, 0x77, 0x25, 0x18, 0x03, 0x3c, 0xf9, 0x71, 0xd4, 0x19, + 0x26, 0x85, 0x33, 0x34, 0x2e, 0xeb, 0x0c, 0xe7, 0xcd, 0xc8, 0xb8, 0xdc, 0xe2, 0xe7, 0x59, 0xb8, + 0xb2, 0x6e, 0xd8, 0xd4, 0xa9, 0x1b, 0x5e, 0xd4, 0x21, 0x5e, 0x86, 0x02, 0x5f, 0xf1, 0xea, 0x3d, + 0x9b, 0x2a, 0xa7, 0xd0, 0x26, 0x54, 0x15, 0x1c, 0x35, 0x05, 0xa7, 0xb6, 0x1c, 0x46, 0xbd, 0x07, + 0x86, 0xad, 0x96, 0x33, 0x4d, 0x7d, 0x4f, 0xc1, 0x51, 0x53, 0x90, 0xd7, 0x60, 0x8e, 0x3e, 0x32, + 0xed, 0x9e, 0x6f, 0xb9, 0xce, 0x86, 0xc1, 0xa8, 0x5f, 0xca, 0x5e, 0xcf, 0xf2, 0x05, 0xe9, 0xec, + 0x74, 0x79, 0x6e, 0x33, 0x86, 0xc1, 0x04, 0x25, 0xd7, 0xc4, 0x97, 0xe3, 0x4f, 0x5c, 0x27, 0x98, + 0x2f, 0xad, 0xe9, 0x50, 0xc1, 0x51, 0x53, 0x90, 0x5d, 0x28, 0xf6, 0x7c, 0xea, 0xed, 0x1b, 0x27, + 0xb6, 0x6b, 0xd4, 0xc5, 0xe2, 0x35, 0x53, 0xf9, 0xe6, 0xd9, 0xe9, 0x72, 0xf1, 0x28, 0x04, 0xff, + 0xe2, 0x74, 0xb9, 0x44, 0x1d, 0xd3, 0xad, 0x5b, 0x4e, 0x73, 0x95, 0x2f, 0x28, 0x65, 0x34, 0x1e, + 0xee, 0x52, 0xdf, 0x37, 0x9a, 0x14, 0xa3, 0xfc, 0xe4, 0xcf, 0xa2, 0x0e, 0x90, 0x17, 0x0e, 0xf0, + 0xbd, 0x4b, 0x3a, 0x40, 0xca, 0xd8, 0x8f, 0x6b, 0xea, 0xff, 0x26, 0x0f, 0x64, 0xb3, 0x63, 0x31, + 0x46, 0x63, 0x33, 0x7f, 0x03, 0xf2, 0x35, 0xcf, 0x6d, 0x53, 0x4f, 0xcd, 0xfb, 0x9c, 0xd2, 0x9f, + 0xaf, 0x08, 0x28, 0x2a, 0x2c, 0x4f, 0x29, 0x3c, 0xc1, 0x38, 0xd4, 0xe6, 0x91, 0x39, 0x11, 0x4f, + 0x29, 0xeb, 0x1a, 0x83, 0x11, 0x2a, 0xf2, 0x6d, 0x28, 0xaa, 0x5f, 0x22, 0xe0, 0x64, 0xfe, 0xba, + 0xa2, 0x98, 0x8a, 0xeb, 0x21, 0x0a, 0xa3, 0x74, 0xe4, 0x3e, 0x14, 0xf8, 0x34, 0x38, 0x41, 0x90, + 0x5e, 0x78, 0x09, 0x98, 0xe1, 0xe3, 0x76, 0xa4, 0x58, 0x51, 0x0b, 0xe1, 0x02, 0xbb, 0x86, 0xef, + 0x3f, 0x74, 0xbd, 0xba, 0xca, 0x68, 0x83, 0x08, 0xdc, 0x57, 0xac, 0xa8, 0x85, 0xa4, 0xe7, 0xca, + 0xfc, 0x53, 0xc9, 0x95, 0x53, 0x17, 0xcd, 0x95, 0x85, 0x21, 0xe7, 0xca, 0xcf, 0xa2, 0xd1, 0x31, + 0x2d, 0xa2, 0xe3, 0xa3, 0x4b, 0x46, 0x47, 0xbf, 0x7b, 0x8e, 0x2b, 0x38, 0xfe, 0x6d, 0x02, 0x8a, + 0xd1, 0xa8, 0xf8, 0x5e, 0xe4, 0xd9, 0x32, 0x62, 0xe0, 0x7e, 0x25, 0xe2, 0x31, 0x7a, 0xcb, 0x18, + 0x3e, 0x0f, 0xa7, 0xe6, 0x3e, 0x74, 0xbf, 0xf6, 0x31, 0x35, 0x19, 0x37, 0x24, 0x8c, 0x8e, 0x10, + 0x16, 0x9a, 0x4b, 0xba, 0x90, 0xf3, 0xbb, 0xd4, 0x54, 0x19, 0x75, 0xef, 0xb2, 0x23, 0x17, 0xda, + 0x5e, 0xed, 0x52, 0x33, 0x4c, 0xe9, 0xfc, 0x17, 0x0a, 0x4d, 0xe4, 0x11, 0xe4, 0x7d, 0x66, 0xb0, + 0x9e, 0xaf, 0xf2, 0xea, 0xfe, 0x10, 0x75, 0x0a, 0xb9, 0xe1, 0xda, 0x21, 0x7f, 0xa3, 0xd2, 0xb7, + 0xf2, 0x45, 0x06, 0xe6, 0x23, 0xd4, 0x3b, 0x96, 0xcf, 0xc8, 0xfb, 0x7d, 0x23, 0x5c, 0xbe, 0xd8, + 0x08, 0x73, 0x6e, 0x31, 0xbe, 0xda, 0x19, 0x02, 0x48, 0x64, 0x74, 0x5d, 0x98, 0xb4, 0x18, 0xed, + 0xf8, 0xa5, 0x09, 0xe1, 0x98, 0x6f, 0x0e, 0xef, 0x51, 0x2b, 0xb3, 0x4a, 0xed, 0xe4, 0x3d, 0xae, + 0x00, 0xa5, 0x9e, 0x95, 0xff, 0xfc, 0x76, 0xec, 0x11, 0xf9, 0xb0, 0x8b, 0xfd, 0x3b, 0x07, 0x55, + 0x7a, 0xbe, 0x58, 0xff, 0x32, 0x89, 0xfd, 0x7b, 0x04, 0x87, 0x31, 0x4a, 0x72, 0x0c, 0x05, 0x46, + 0x3b, 0x5d, 0xdb, 0x60, 0xc1, 0x96, 0x6b, 0xeb, 0x92, 0x4f, 0x70, 0xa8, 0xc4, 0xc9, 0x25, 0x2d, + 0xf8, 0x85, 0x5a, 0x0d, 0xe9, 0xc0, 0x94, 0x4f, 0xbd, 0x07, 0x96, 0x49, 0x95, 0x7b, 0xdc, 0xb9, + 0xa4, 0xc6, 0xaa, 0x94, 0x56, 0x29, 0xf2, 0xcd, 0x95, 0xfa, 0x81, 0x81, 0x0e, 0xf2, 0x0d, 0x98, + 0xf2, 0x68, 0xd7, 0xb6, 0x4c, 0x43, 0x2c, 0xf1, 0x93, 0x92, 0x0c, 0x25, 0x08, 0x03, 0x1c, 0xf9, + 0x1d, 0x98, 0xec, 0x58, 0x8e, 0xe5, 0xaa, 0xfd, 0xd7, 0xbb, 0xc3, 0x0d, 0x93, 0xf2, 0x2e, 0x97, + 0x2d, 0x97, 0x16, 0x3d, 0xad, 0x02, 0x86, 0x52, 0xad, 0x28, 0x08, 0x4c, 0x95, 0xb3, 0xd5, 0x16, + 0xe0, 0xfd, 0x21, 0xdb, 0xa0, 0xb7, 0x04, 0xf1, 0x15, 0x2e, 0x00, 0xa3, 0xd6, 0x4f, 0x3e, 0x81, + 0x5c, 0xc3, 0xb2, 0x69, 0x69, 0x4a, 0xd8, 0xf1, 0xce, 0x90, 0xed, 0xb8, 0x63, 0xd9, 0x54, 0xda, + 0x10, 0xd6, 0x03, 0x96, 0x4d, 0x51, 0xe8, 0x14, 0x03, 0xe1, 0x51, 0x29, 0x63, 0x48, 0x95, 0x51, + 0xd2, 0x00, 0x54, 0xe2, 0x13, 0x03, 0x11, 0x80, 0x51, 0xeb, 0x27, 0x7f, 0x98, 0x81, 0xa9, 0x87, + 0xb4, 0xd6, 0x72, 0xdd, 0xb6, 0xca, 0x3c, 0xef, 0x0d, 0xd9, 0x96, 0xb7, 0xa5, 0x74, 0x69, 0x8a, + 0x2e, 0x11, 0x14, 0x14, 0x03, 0xe5, 0x7c, 0x46, 0x8c, 0xce, 0x71, 0xb7, 0x04, 0x23, 0x99, 0x91, + 0xb5, 0xce, 0x71, 0x37, 0x31, 0x23, 0xbc, 0x9a, 0x44, 0xa1, 0x93, 0x87, 0x46, 0xdb, 0x68, 0xb4, + 0x8d, 0x52, 0x71, 0x24, 0xa1, 0xb1, 0xcd, 0x65, 0x27, 0x42, 0x43, 0xc0, 0x50, 0xaa, 0xe5, 0xcf, + 0xde, 0x39, 0x66, 0xac, 0x34, 0x33, 0x92, 0x67, 0xdf, 0x3d, 0x66, 0x2c, 0xf1, 0xec, 0xbb, 0x07, + 0x87, 0x87, 0x28, 0x74, 0x72, 0xdd, 0x8e, 0xc1, 0xfc, 0xd2, 0xec, 0x48, 0x74, 0xef, 0x19, 0xcc, + 0x4f, 0xe8, 0xde, 0x5b, 0x3b, 0xac, 0xa2, 0xd0, 0x49, 0x1e, 0x40, 0xd6, 0x77, 0xfc, 0xd2, 0x9c, + 0x50, 0xfd, 0xf6, 0x90, 0x55, 0x57, 0x1d, 0xa5, 0x59, 0x9f, 0x23, 0x55, 0xf7, 0xaa, 0xc8, 0x15, + 0x0a, 0xbd, 0xc7, 0x7e, 0x69, 0x7e, 0x34, 0x7a, 0x8f, 0xfb, 0xf4, 0x1e, 0x70, 0xbd, 0xc7, 0x3e, + 0xf9, 0xbd, 0x0c, 0xe4, 0xbb, 0xbd, 0x5a, 0xb5, 0x57, 0x2b, 0x2d, 0x08, 0xdd, 0xdf, 0x1d, 0xb2, + 0xee, 0x7d, 0x21, 0x5c, 0xaa, 0xd7, 0x3b, 0x08, 0x09, 0x44, 0xa5, 0x59, 0x18, 0x21, 0xb5, 0x96, + 0x16, 0x47, 0x62, 0xc4, 0x96, 0x90, 0x96, 0x30, 0x42, 0x02, 0x51, 0x69, 0x0e, 0x8c, 0xb0, 0x8d, + 0x5a, 0x89, 0x8c, 0xca, 0x08, 0xdb, 0x48, 0x31, 0xc2, 0x36, 0xa4, 0x11, 0xb6, 0x51, 0xe3, 0xae, + 0xdf, 0xaa, 0x37, 0xfc, 0xd2, 0x95, 0x91, 0xb8, 0xfe, 0xdd, 0x7a, 0x23, 0xe9, 0xfa, 0x77, 0x37, + 0xee, 0x54, 0x51, 0xe8, 0xe4, 0x4b, 0x8e, 0x6f, 0x1b, 0x66, 0xbb, 0x74, 0x75, 0x24, 0x4b, 0x4e, + 0x95, 0xcb, 0x4e, 0x2c, 0x39, 0x02, 0x86, 0x52, 0x2d, 0xf9, 0xab, 0x0c, 0x14, 0x7d, 0xe6, 0x7a, + 0x46, 0x93, 0x6e, 0x79, 0x56, 0xbd, 0xf4, 0xec, 0x70, 0xaa, 0x8e, 0xa4, 0x19, 0xa1, 0x06, 0x69, + 0x8c, 0xae, 0x58, 0x23, 0x18, 0x8c, 0x1a, 0x42, 0xfe, 0x2e, 0x03, 0x73, 0x46, 0xec, 0x6c, 0xa7, + 0xf4, 0x9c, 0xb0, 0xad, 0x36, 0xec, 0x94, 0x10, 0x3f, 0x40, 0x12, 0xe6, 0x3d, 0xa7, 0xcc, 0x9b, + 0x8b, 0x23, 0x31, 0x61, 0x91, 0x70, 0x5f, 0x9f, 0x79, 0x56, 0x97, 0x96, 0x9e, 0x1f, 0x89, 0xfb, + 0x56, 0x85, 0xf0, 0x84, 0xfb, 0x4a, 0x20, 0x2a, 0xcd, 0x22, 0x75, 0x53, 0x59, 0xe6, 0x95, 0x4a, + 0x23, 0x49, 0xdd, 0x41, 0x11, 0x19, 0x4f, 0xdd, 0x0a, 0x8a, 0x81, 0x72, 0xee, 0xcb, 0x1e, 0xad, + 0x5b, 0x7e, 0xe9, 0x85, 0x91, 0xf8, 0x32, 0x72, 0xd9, 0x09, 0x5f, 0x16, 0x30, 0x94, 0x6a, 0xf9, + 0x72, 0xee, 0xf8, 0xc7, 0xa5, 0xa5, 0x91, 0x2c, 0xe7, 0x7b, 0xfe, 0x71, 0x62, 0x39, 0xdf, 0xab, + 0x1e, 0x20, 0x57, 0xa8, 0x96, 0x73, 0xdb, 0x37, 0xbc, 0xd2, 0xd7, 0x46, 0xb4, 0x9c, 0x73, 0xe1, + 0x7d, 0xcb, 0x39, 0x07, 0xa2, 0xd2, 0x2c, 0xbc, 0x40, 0x5c, 0xad, 0x58, 0x66, 0xe9, 0xeb, 0x23, + 0xf1, 0x82, 0x2d, 0x29, 0x3d, 0xe1, 0x05, 0x0a, 0x8a, 0x81, 0xf2, 0xa5, 0x1e, 0x40, 0x58, 0x03, + 0xa4, 0x9c, 0x18, 0x1c, 0x44, 0x4f, 0x0c, 0x8a, 0xb7, 0x5f, 0x1f, 0xf8, 0xf4, 0xa4, 0xfa, 0xab, + 0x6b, 0x1e, 0xb3, 0x1a, 0x86, 0xc9, 0x22, 0xc7, 0x0d, 0x4b, 0x7f, 0x9e, 0x81, 0xd9, 0xd8, 0xbe, + 0x3f, 0x45, 0x75, 0x2b, 0xae, 0x1a, 0x87, 0x7f, 0xf2, 0x18, 0xb5, 0xe8, 0x8f, 0x32, 0x30, 0xad, + 0x2b, 0x80, 0x14, 0x6b, 0xea, 0x71, 0x6b, 0x2e, 0x7b, 0x5e, 0x21, 0x54, 0xa5, 0x5b, 0xc2, 0xc7, + 0x26, 0x56, 0x0a, 0x8c, 0x7e, 0x6c, 0xb4, 0xba, 0x74, 0x8b, 0x7e, 0x90, 0x81, 0x99, 0x68, 0x41, + 0x90, 0x62, 0x90, 0x19, 0x37, 0x68, 0xf7, 0x92, 0x06, 0x29, 0x6d, 0xeb, 0xae, 0xc3, 0xe8, 0x23, + 0x96, 0x9c, 0x27, 0x5d, 0x17, 0x8c, 0x7e, 0x9e, 0x12, 0xb7, 0x57, 0x89, 0x51, 0x81, 0xb0, 0x48, + 0x48, 0x31, 0x85, 0xc6, 0x4d, 0xb9, 0x7f, 0x49, 0x53, 0xa4, 0xae, 0xf3, 0xbd, 0x57, 0x57, 0x0c, + 0xa3, 0x1f, 0x15, 0x5e, 0x89, 0x9c, 0x63, 0xc9, 0x1f, 0x67, 0x60, 0x5a, 0xd7, 0x0f, 0xa3, 0x1f, + 0x14, 0x5e, 0x97, 0xc8, 0x0c, 0xdf, 0x6f, 0xca, 0x1f, 0x64, 0xa0, 0x10, 0xd4, 0x13, 0xa3, 0x77, + 0xd9, 0xea, 0x5e, 0xf5, 0x9c, 0x21, 0x11, 0x76, 0x1c, 0x8f, 0xcd, 0x8e, 0x83, 0xf3, 0xec, 0xf8, + 0x34, 0x03, 0xc5, 0x48, 0xad, 0x91, 0x62, 0x4a, 0x23, 0x6e, 0xca, 0x65, 0x0f, 0x48, 0x95, 0xb2, + 0xf3, 0xad, 0x89, 0x14, 0x1d, 0xa3, 0xb7, 0x46, 0x29, 0x7b, 0xac, 0x35, 0x41, 0xf5, 0x31, 0x16, + 0x6b, 0xb8, 0xb2, 0xf3, 0xc3, 0x59, 0x57, 0x22, 0xa3, 0x0f, 0x67, 0x5e, 0xe1, 0x3c, 0x66, 0x91, + 0x0b, 0xcb, 0x92, 0xd1, 0xc7, 0xb3, 0xd4, 0x95, 0x6e, 0xcb, 0x5f, 0x66, 0x60, 0x21, 0x59, 0x9b, + 0xa4, 0x58, 0xd4, 0x8e, 0x5b, 0x74, 0x74, 0x59, 0x8b, 0x22, 0x1a, 0xd3, 0xed, 0xfa, 0xdb, 0x0c, + 0x5c, 0x49, 0xa9, 0x4b, 0x52, 0x4c, 0x73, 0xe2, 0xa6, 0xbd, 0x33, 0xaa, 0xdb, 0xf4, 0xa4, 0x67, + 0x47, 0x0a, 0x93, 0xd1, 0x7b, 0xb6, 0x52, 0x96, 0x6e, 0xcd, 0x67, 0x19, 0x98, 0x89, 0x16, 0x28, + 0x29, 0xe6, 0x34, 0xe3, 0xe6, 0x1c, 0x0c, 0xfd, 0x4e, 0x2d, 0xe9, 0xdf, 0x61, 0xa9, 0x32, 0x7a, + 0xff, 0x96, 0xba, 0xce, 0xcf, 0x13, 0x41, 0xe1, 0x32, 0xfa, 0x3c, 0xb1, 0x57, 0x3d, 0x78, 0x6c, + 0x9e, 0xd0, 0x45, 0xcc, 0x38, 0xf2, 0x84, 0x50, 0x76, 0xbe, 0xc7, 0x44, 0x8b, 0x99, 0xd1, 0x7b, + 0x4c, 0xa0, 0x2d, 0xd5, 0x9e, 0x15, 0x06, 0x8b, 0x7d, 0x17, 0x7f, 0xe4, 0x23, 0x7d, 0xb5, 0x28, + 0xaf, 0xf2, 0x7e, 0x63, 0xf0, 0x3a, 0xe9, 0xf1, 0x37, 0x88, 0xff, 0x92, 0x85, 0xf9, 0x44, 0xcd, + 0x40, 0x56, 0x61, 0x5a, 0x08, 0x13, 0xbd, 0x71, 0xf2, 0x6e, 0x6d, 0x51, 0xb1, 0x4f, 0x6f, 0x06, + 0x08, 0x0c, 0x69, 0xc8, 0x8f, 0x32, 0x30, 0xff, 0xd0, 0x60, 0x66, 0x6b, 0xdf, 0x60, 0x2d, 0x79, + 0xa7, 0x3d, 0xa4, 0x0c, 0xf2, 0x76, 0x5c, 0x6a, 0xe5, 0x79, 0x65, 0xc7, 0x7c, 0x02, 0x81, 0x49, + 0xfd, 0xe4, 0x16, 0x4c, 0x75, 0x5d, 0xdb, 0xb6, 0x9c, 0xa6, 0xb8, 0x76, 0x2b, 0x84, 0xb5, 0xea, + 0xbe, 0x04, 0x63, 0x80, 0x8f, 0x37, 0xa7, 0xe5, 0x86, 0x72, 0x05, 0x93, 0x18, 0xd2, 0x71, 0xdd, + 0xb6, 0xff, 0x7e, 0x16, 0x48, 0xbf, 0x97, 0x3d, 0xa9, 0x91, 0xf2, 0x06, 0xe4, 0xcd, 0x70, 0xd2, + 0x22, 0x9d, 0x2a, 0x6a, 0x6c, 0x15, 0x56, 0x76, 0x27, 0xf9, 0xd4, 0xec, 0x79, 0x54, 0x8d, 0x69, + 0xa4, 0x3b, 0x49, 0xc2, 0x51, 0x53, 0xc4, 0x7a, 0x29, 0x72, 0x4f, 0xec, 0xa5, 0xf8, 0xac, 0xbf, + 0x27, 0xec, 0xa3, 0xa1, 0x87, 0xdb, 0xd8, 0x9a, 0xc1, 0xa6, 0x60, 0xb1, 0x6f, 0x57, 0x48, 0x96, + 0x60, 0xc2, 0xaa, 0x0b, 0x01, 0xd9, 0x0a, 0x28, 0xd5, 0x13, 0xf7, 0x36, 0x70, 0xc2, 0xaa, 0x13, + 0x16, 0xde, 0xbb, 0x8d, 0xa2, 0xd0, 0x95, 0x97, 0xc0, 0x7d, 0xb7, 0x6c, 0x2f, 0xc1, 0xa4, 0xfb, + 0xd0, 0xa1, 0x9e, 0x6a, 0x20, 0xd2, 0xe7, 0x69, 0xf7, 0x39, 0x10, 0x25, 0x4e, 0xb4, 0xbc, 0xd2, + 0xae, 0xeb, 0x5b, 0xcc, 0xf5, 0xfa, 0x5b, 0x5e, 0x35, 0x06, 0x23, 0x54, 0x64, 0x05, 0xf2, 0xd2, + 0x2a, 0x31, 0x95, 0xd3, 0x15, 0xe0, 0xde, 0x24, 0x37, 0x14, 0xa8, 0x30, 0xe4, 0x3e, 0x14, 0x8c, + 0xae, 0x75, 0xe8, 0xb6, 0xa9, 0xa3, 0x3a, 0x7c, 0x06, 0xe9, 0x1d, 0x5a, 0xdb, 0xbf, 0x27, 0x58, + 0x51, 0x0b, 0x21, 0x1f, 0xc2, 0xac, 0x7a, 0x30, 0xc9, 0xa3, 0x9a, 0x58, 0x2f, 0x28, 0x75, 0xf1, + 0xec, 0x74, 0x79, 0xf6, 0xed, 0x28, 0x3f, 0xc6, 0xc5, 0xc5, 0xdc, 0xbf, 0xf0, 0x44, 0xf7, 0xbf, + 0x01, 0x79, 0xc3, 0x64, 0xd6, 0x03, 0x5a, 0x9a, 0x16, 0xb4, 0x3a, 0xa8, 0xd6, 0x04, 0x14, 0x15, + 0x56, 0xb4, 0x72, 0xf1, 0x49, 0x52, 0xcb, 0x2d, 0x24, 0x5a, 0xb9, 0x42, 0x14, 0x46, 0xe9, 0xc8, + 0xeb, 0x30, 0x2b, 0x1d, 0xa4, 0x62, 0xf8, 0xf4, 0x08, 0x77, 0x4a, 0x45, 0xc1, 0xf8, 0xac, 0x62, + 0x9c, 0xdd, 0x8a, 0x22, 0x31, 0x4e, 0x4b, 0xd6, 0x60, 0x5e, 0x02, 0x8e, 0xba, 0xb6, 0x6b, 0xd4, + 0x39, 0xfb, 0x8c, 0x60, 0xd7, 0xcb, 0xeb, 0x56, 0x1c, 0x8d, 0x49, 0x7a, 0xf2, 0x26, 0x90, 0x3a, + 0xb5, 0x29, 0xa3, 0x77, 0x5d, 0xb7, 0x7d, 0xdf, 0xb9, 0x63, 0x39, 0x96, 0xdf, 0x2a, 0xcd, 0x8a, + 0x47, 0x5d, 0x52, 0x52, 0xc8, 0x46, 0x1f, 0x05, 0xa6, 0x70, 0x91, 0x3f, 0x8d, 0xc6, 0xbe, 0xbc, + 0xfe, 0xfb, 0x70, 0xd8, 0x35, 0xd9, 0xb8, 0x42, 0xff, 0x6c, 0x52, 0x84, 0x7e, 0xbc, 0x04, 0x8b, + 0x86, 0x77, 0x66, 0x7c, 0xe1, 0xbd, 0x0a, 0xd3, 0x5c, 0x2c, 0x35, 0xd9, 0xbd, 0x0d, 0xb5, 0xb4, + 0xeb, 0x3c, 0xbe, 0x1f, 0x20, 0x30, 0xa4, 0x89, 0x84, 0x6d, 0xf6, 0xdc, 0xb0, 0x7d, 0x07, 0x8a, + 0x86, 0x68, 0xfa, 0x95, 0x91, 0x3b, 0x50, 0x1b, 0xe1, 0x3c, 0x77, 0xe9, 0xb5, 0x90, 0x1b, 0xa3, + 0xa2, 0x48, 0x15, 0x9e, 0xa5, 0x8e, 0x51, 0xb3, 0x69, 0xb5, 0xba, 0xf3, 0x16, 0xf5, 0xac, 0x86, + 0x65, 0x1a, 0xcc, 0x72, 0x1d, 0xd1, 0x59, 0x58, 0xa8, 0xbc, 0xa8, 0x4c, 0x7f, 0x76, 0x33, 0x8d, + 0x08, 0xd3, 0x79, 0x55, 0x9c, 0xd8, 0x86, 0x8e, 0x93, 0x7c, 0x5f, 0x9c, 0x84, 0x48, 0x8c, 0xd3, + 0x9e, 0xe3, 0xe4, 0x85, 0xcb, 0x3b, 0xf9, 0xf4, 0xb0, 0x9c, 0x3c, 0xee, 0x67, 0xe3, 0x72, 0xf2, + 0x9f, 0x14, 0x60, 0x3e, 0x51, 0xdb, 0xa7, 0xee, 0x01, 0x33, 0x4f, 0x79, 0x0f, 0x78, 0x1d, 0x72, + 0x8c, 0x2f, 0xaa, 0x13, 0xf1, 0x6e, 0x7c, 0xb1, 0x9a, 0x0a, 0x0c, 0x77, 0x0f, 0xb3, 0x45, 0xcd, + 0x76, 0xd0, 0x5d, 0xad, 0x32, 0xa1, 0x76, 0x8f, 0xf5, 0x28, 0x12, 0xe3, 0xb4, 0xe4, 0x9b, 0x30, + 0x6d, 0xd4, 0xeb, 0x1e, 0xf5, 0x7d, 0xea, 0x8b, 0x7d, 0xe3, 0x74, 0x65, 0x96, 0xc7, 0xd6, 0x5a, + 0x00, 0xc4, 0x10, 0xcf, 0xb3, 0x47, 0xab, 0xde, 0xf0, 0x8f, 0x7c, 0xea, 0x09, 0x87, 0x8e, 0x34, + 0x5c, 0xf3, 0xa1, 0xe4, 0x70, 0xd4, 0x14, 0xa4, 0x0e, 0xf3, 0x6d, 0xaf, 0xb6, 0xbe, 0x6e, 0x98, + 0x2d, 0xaa, 0xb2, 0x59, 0x7e, 0xe0, 0x9e, 0xfd, 0xed, 0xb8, 0x04, 0x4c, 0x8a, 0x54, 0x5a, 0xb6, + 0xe9, 0x09, 0x33, 0x6a, 0x5f, 0x25, 0x67, 0x06, 0x5a, 0xa2, 0x12, 0x30, 0x29, 0x92, 0x67, 0xb8, + 0xb6, 0x57, 0x0b, 0xba, 0x87, 0x45, 0xf8, 0x44, 0x32, 0xdc, 0x76, 0x88, 0xc2, 0x28, 0x1d, 0x1f, + 0xb0, 0xb6, 0x57, 0x43, 0x6a, 0xd8, 0x1d, 0x91, 0x42, 0x23, 0x03, 0xb6, 0xad, 0xe0, 0xa8, 0x29, + 0x48, 0x17, 0x08, 0x7f, 0x3a, 0x31, 0xef, 0xf2, 0xdf, 0x5d, 0xa3, 0x2b, 0xb2, 0x69, 0xf1, 0xf6, + 0xcd, 0xb4, 0xa7, 0xd1, 0x44, 0xd1, 0x07, 0x7a, 0x8e, 0x07, 0xf4, 0x76, 0x9f, 0x1c, 0x4c, 0x91, + 0x4d, 0xde, 0x85, 0xe7, 0xdb, 0x5e, 0x4d, 0xf5, 0xdf, 0xed, 0x7b, 0x96, 0x63, 0x5a, 0x5d, 0x43, + 0xf6, 0x63, 0xcb, 0x5c, 0xbc, 0xac, 0xcc, 0x7d, 0x7e, 0x3b, 0x9d, 0x0c, 0xcf, 0xe3, 0x8f, 0x17, + 0x24, 0x33, 0x43, 0x29, 0x48, 0x12, 0xe1, 0x3a, 0xae, 0x95, 0xe2, 0x9f, 0x33, 0x40, 0xc4, 0xfd, + 0xc2, 0xba, 0xeb, 0xf8, 0xbd, 0x0e, 0xf5, 0xb6, 0x3c, 0xb7, 0xd7, 0xe5, 0x99, 0xa9, 0xc9, 0xff, + 0x88, 0x74, 0x6f, 0xea, 0xcc, 0xb4, 0x15, 0x20, 0x30, 0xa4, 0xe1, 0xbb, 0x29, 0xd7, 0xae, 0x53, + 0x9f, 0x09, 0x15, 0x91, 0xdd, 0xd4, 0x7d, 0x01, 0x45, 0x85, 0x25, 0x5b, 0xb0, 0xe8, 0xd1, 0x9a, + 0x61, 0x1b, 0x0e, 0x2f, 0xa1, 0x3d, 0x83, 0xd1, 0xe6, 0x89, 0x8a, 0xe9, 0x17, 0x14, 0xcb, 0x22, + 0x26, 0x09, 0xb0, 0x9f, 0x67, 0xe5, 0x8b, 0x3c, 0x2c, 0x24, 0x2f, 0x46, 0x9e, 0x54, 0x47, 0xf1, + 0x7c, 0x6b, 0x78, 0xcc, 0x12, 0x49, 0x2b, 0x99, 0x6f, 0x03, 0x04, 0x86, 0x34, 0x7c, 0xff, 0xcd, + 0xdc, 0xae, 0x65, 0x26, 0xf7, 0xdf, 0x87, 0x1c, 0x88, 0x12, 0x97, 0xde, 0x12, 0x9f, 0x1b, 0x5b, + 0x4b, 0xbc, 0x6a, 0x72, 0x9f, 0x1c, 0x72, 0x93, 0xfb, 0x60, 0x6f, 0xa5, 0x7d, 0x1a, 0x0d, 0x08, + 0xd9, 0xa5, 0xf9, 0xc1, 0x90, 0x6f, 0xbd, 0x2e, 0x1e, 0x11, 0x3c, 0x3c, 0x67, 0xcd, 0xa8, 0x3f, + 0xab, 0x57, 0x00, 0x0e, 0x86, 0x61, 0x52, 0x2c, 0x50, 0x64, 0x55, 0x12, 0x03, 0x61, 0x5c, 0x35, + 0xd9, 0x87, 0xab, 0xb6, 0xd5, 0xb1, 0x98, 0xdc, 0xa6, 0xed, 0x53, 0xaf, 0x4a, 0x4d, 0xd7, 0xa9, + 0x8b, 0x25, 0x33, 0x5b, 0xf9, 0xba, 0x7a, 0x8c, 0xab, 0x3b, 0x29, 0x34, 0x98, 0xca, 0x49, 0x6e, + 0xc1, 0xd4, 0x03, 0xea, 0xf9, 0xdc, 0x89, 0x21, 0xfe, 0x26, 0xd7, 0x5b, 0x12, 0x8c, 0x01, 0xfe, + 0x72, 0x6b, 0xc3, 0xbf, 0xe6, 0x60, 0x3e, 0x71, 0xe1, 0xf7, 0xa4, 0x08, 0xd3, 0x01, 0x33, 0xf1, + 0x98, 0x80, 0x79, 0x19, 0x0a, 0xa6, 0x6d, 0x51, 0x87, 0xdd, 0xab, 0xab, 0xc0, 0x0a, 0x7b, 0x7f, + 0x25, 0x7c, 0x03, 0x35, 0xc5, 0xd3, 0x0e, 0xaf, 0x68, 0x1c, 0x4c, 0x5e, 0xf4, 0x8d, 0x93, 0xfc, + 0x28, 0xdf, 0xce, 0x9c, 0x1a, 0x4a, 0xbe, 0x49, 0x4c, 0xec, 0xb8, 0xf2, 0xcd, 0x3f, 0xe6, 0x60, + 0x21, 0x79, 0x75, 0xfb, 0x24, 0xa7, 0xba, 0x05, 0x53, 0x7e, 0x4f, 0xbc, 0x49, 0xa2, 0xdc, 0x4a, + 0xfb, 0x7b, 0x55, 0x82, 0x31, 0xc0, 0xa7, 0x3b, 0x4b, 0xf6, 0xa9, 0x38, 0x4b, 0xee, 0xa2, 0xce, + 0x32, 0xec, 0x95, 0xfb, 0xd3, 0xfe, 0x97, 0xf7, 0x3e, 0x18, 0xf2, 0x65, 0xfb, 0xb8, 0xbc, 0xe5, + 0x3f, 0x72, 0x30, 0x17, 0xbf, 0xae, 0xe0, 0x9b, 0xd5, 0x96, 0xeb, 0x33, 0xb5, 0x85, 0x57, 0x3e, + 0xa3, 0x37, 0xab, 0x77, 0x43, 0x14, 0x46, 0xe9, 0x2e, 0xb6, 0x30, 0xdd, 0x82, 0x29, 0xf5, 0x36, + 0x9e, 0x5a, 0x97, 0xb4, 0xa3, 0xa9, 0x37, 0xf6, 0x30, 0xc0, 0xff, 0xff, 0xaa, 0x64, 0xfb, 0xe4, + 0x07, 0xfd, 0xab, 0xd2, 0x7b, 0x43, 0xbd, 0x9b, 0x1a, 0x97, 0x9b, 0xfd, 0xef, 0x24, 0x2c, 0xf6, + 0xb5, 0x2c, 0xc4, 0x4f, 0x67, 0x32, 0x17, 0x38, 0x9d, 0x79, 0x03, 0xe6, 0x84, 0x1f, 0xed, 0x27, + 0xce, 0x74, 0x74, 0x9b, 0xea, 0x61, 0x0c, 0x8b, 0x09, 0xea, 0x8b, 0xed, 0x36, 0xdf, 0x80, 0x39, + 0xbf, 0x57, 0xf3, 0x4d, 0xcf, 0xea, 0x72, 0x87, 0xb8, 0xb7, 0xa1, 0x4e, 0x7c, 0xb5, 0x92, 0x6a, + 0x0c, 0x8b, 0x09, 0x6a, 0xd2, 0x84, 0x05, 0xd3, 0xa3, 0x75, 0xea, 0x30, 0xcb, 0xb0, 0x55, 0x4d, + 0x39, 0xd0, 0x9b, 0xa1, 0x57, 0xcf, 0x4e, 0x97, 0x17, 0xd6, 0x13, 0x22, 0xb0, 0x4f, 0x28, 0xa9, + 0xc1, 0x92, 0x3c, 0x65, 0x89, 0x1a, 0xa4, 0xcf, 0x68, 0xe4, 0x96, 0x72, 0x45, 0x19, 0xbd, 0xb4, + 0x71, 0x2e, 0x25, 0x3e, 0x46, 0xca, 0x80, 0xaf, 0x83, 0x6e, 0xc3, 0x7c, 0x68, 0xa5, 0x7f, 0xc7, + 0xb2, 0x83, 0x5a, 0xf7, 0x97, 0x14, 0xd3, 0x0b, 0x1b, 0xb4, 0xeb, 0x51, 0xd3, 0x60, 0xb4, 0xbe, + 0x1e, 0x27, 0xc4, 0x24, 0xe7, 0x28, 0x8e, 0x8b, 0xfa, 0x5c, 0x70, 0x5c, 0xfe, 0xff, 0x5f, 0x79, + 0xee, 0xff, 0x89, 0xab, 0x58, 0xb2, 0x02, 0x79, 0xe1, 0x72, 0x7c, 0x91, 0xd5, 0x87, 0x8d, 0xc2, + 0x17, 0x7d, 0x54, 0x98, 0x0b, 0x1c, 0xe0, 0xa8, 0xdc, 0x9e, 0x3d, 0x27, 0xb7, 0x77, 0xe1, 0x0a, + 0xb3, 0xfd, 0x43, 0xaf, 0xe7, 0xb3, 0x75, 0xea, 0x31, 0x5f, 0x79, 0x64, 0x6e, 0xe0, 0xaf, 0x2d, + 0x1c, 0xee, 0x54, 0x93, 0x52, 0x30, 0x4d, 0x34, 0xf7, 0x4b, 0x66, 0xfb, 0x6b, 0xb6, 0xed, 0x3e, + 0x0c, 0x6e, 0x05, 0xc2, 0x25, 0x57, 0x2d, 0xa6, 0xda, 0x2f, 0x0f, 0x77, 0xaa, 0xe7, 0x50, 0xe2, + 0x63, 0xa4, 0x90, 0x5d, 0xf1, 0x54, 0x6f, 0x19, 0xb6, 0x55, 0x37, 0x18, 0xe5, 0x49, 0x49, 0x9c, + 0xac, 0x48, 0xa7, 0xff, 0x9a, 0x12, 0xce, 0x4d, 0x4e, 0x92, 0x60, 0x1a, 0xdf, 0xa8, 0xbe, 0xf9, + 0x91, 0x9a, 0xc3, 0x0a, 0x4f, 0x25, 0x87, 0x4d, 0x3f, 0x31, 0x78, 0x63, 0xf1, 0x06, 0x43, 0x8a, + 0xb7, 0x84, 0xcb, 0x8f, 0x2b, 0xde, 0xfe, 0x29, 0x07, 0x0b, 0xc9, 0x7e, 0x90, 0xaf, 0xba, 0xb1, + 0x89, 0xbe, 0xe1, 0x3f, 0x31, 0x8c, 0x37, 0xfc, 0x57, 0x61, 0x9a, 0x3b, 0x9d, 0xdf, 0x35, 0xcc, + 0xe0, 0xc3, 0x05, 0x3a, 0xed, 0xed, 0x05, 0x08, 0x0c, 0x69, 0xc8, 0x12, 0x4c, 0xd4, 0x6b, 0xea, + 0x5d, 0x56, 0x7d, 0x6d, 0xba, 0x51, 0xc1, 0x89, 0x7a, 0x8d, 0xdc, 0x84, 0x82, 0xda, 0x31, 0x05, + 0x37, 0x8d, 0x42, 0xad, 0xda, 0x4e, 0xf9, 0xa8, 0xb1, 0xa3, 0xda, 0xa3, 0x8c, 0xe0, 0x60, 0x22, + 0x39, 0x73, 0x63, 0x7b, 0x53, 0x3f, 0x07, 0x57, 0x52, 0xfa, 0xb5, 0xe3, 0x13, 0x96, 0xb9, 0xc0, + 0x84, 0x1d, 0x43, 0xbe, 0x61, 0xd9, 0x8c, 0x7a, 0x43, 0xba, 0xca, 0x0e, 0x8c, 0xba, 0x23, 0x84, + 0xca, 0x3c, 0x21, 0xff, 0x46, 0xa5, 0x88, 0x47, 0xef, 0x55, 0x71, 0x58, 0x18, 0x9c, 0x50, 0x04, + 0x2f, 0xd4, 0x66, 0xd5, 0x7c, 0x5f, 0xe8, 0x05, 0xf8, 0xad, 0x14, 0x09, 0xe1, 0x09, 0x4a, 0x1a, + 0x16, 0x53, 0xb5, 0x92, 0x75, 0x00, 0xdd, 0x1c, 0x13, 0xdc, 0x0c, 0xbc, 0x74, 0x76, 0xba, 0x0c, + 0xba, 0x7b, 0xc6, 0xff, 0x85, 0x38, 0x88, 0x8c, 0x8c, 0xb6, 0xc8, 0x69, 0x11, 0xb6, 0xf8, 0x47, + 0x52, 0x26, 0x87, 0xf2, 0x91, 0x94, 0x94, 0xe9, 0x1d, 0x5b, 0x61, 0x9e, 0x85, 0xb9, 0xf8, 0x44, + 0x92, 0x1b, 0x90, 0xef, 0x7a, 0xb4, 0x61, 0x3d, 0x4a, 0x7e, 0x20, 0x65, 0x5f, 0x40, 0x51, 0x61, + 0x89, 0x0b, 0x79, 0xdb, 0xa8, 0xf1, 0x10, 0x97, 0xdf, 0x1c, 0xd8, 0xba, 0xf4, 0xfb, 0xf3, 0x6a, + 0x89, 0xd2, 0x0a, 0x77, 0x84, 0x78, 0x54, 0x6a, 0xb8, 0xc2, 0x86, 0x45, 0xed, 0xba, 0xbc, 0x06, + 0x1d, 0x85, 0xc2, 0x3b, 0x42, 0x3c, 0x2a, 0x35, 0xe4, 0x3d, 0x98, 0x36, 0x3d, 0xca, 0xf7, 0x85, + 0x95, 0x13, 0xb5, 0x37, 0xf9, 0xe5, 0x8b, 0xb9, 0xec, 0xa1, 0xd5, 0xa1, 0x61, 0x38, 0xae, 0x07, + 0x42, 0x30, 0x94, 0x47, 0x6e, 0x03, 0x18, 0x0d, 0x46, 0xbd, 0x2a, 0x33, 0x3c, 0xa6, 0x36, 0x20, + 0xba, 0x7f, 0x63, 0x4d, 0x63, 0x30, 0x42, 0xb5, 0xf2, 0xf3, 0x1c, 0xcc, 0xc5, 0xfb, 0xce, 0x9f, + 0xd2, 0x15, 0xf6, 0xcb, 0x50, 0x10, 0x5b, 0xc1, 0x35, 0xcf, 0x49, 0x7e, 0x10, 0xe9, 0x50, 0xc1, + 0x51, 0x53, 0x10, 0x84, 0x69, 0xe3, 0xab, 0x7d, 0xe3, 0x4a, 0xde, 0xdb, 0xe9, 0xaf, 0x5b, 0x85, + 0x62, 0xb8, 0x4c, 0x3f, 0x20, 0x1f, 0x6c, 0xdf, 0x28, 0x64, 0x6a, 0x30, 0x86, 0x62, 0xb8, 0xe7, + 0x7b, 0xb4, 0x19, 0xec, 0x07, 0x23, 0x9e, 0x8f, 0x02, 0x8a, 0x0a, 0x4b, 0x6e, 0xc1, 0x94, 0xe7, + 0xda, 0x74, 0x0d, 0xf7, 0xd4, 0xb5, 0xb5, 0x3e, 0x30, 0x40, 0x09, 0xc6, 0x00, 0x3f, 0x8a, 0x62, + 0x39, 0xee, 0x00, 0xe3, 0x5a, 0x28, 0xfe, 0x61, 0x12, 0xe6, 0xe2, 0xaf, 0x1a, 0xc4, 0xa7, 0x35, + 0x33, 0x82, 0x69, 0x9d, 0x18, 0xf6, 0xb4, 0x66, 0x1f, 0x3b, 0xad, 0x2f, 0xc1, 0xe4, 0x71, 0x8f, + 0xf6, 0x82, 0x0f, 0x6f, 0xe9, 0x42, 0xfc, 0x80, 0x03, 0x51, 0xe2, 0xc8, 0x1a, 0xcc, 0x3f, 0x34, + 0x2c, 0xc6, 0x03, 0x5c, 0x9e, 0xcb, 0xcb, 0x93, 0xbc, 0x6c, 0xf4, 0xfa, 0x3b, 0x86, 0xc6, 0x24, + 0xfd, 0x20, 0xee, 0x33, 0x58, 0xa5, 0xfb, 0x06, 0xcc, 0x09, 0x23, 0xd7, 0x4c, 0xd3, 0xed, 0x89, + 0x73, 0xf6, 0x42, 0xfc, 0x90, 0xe0, 0x20, 0x8a, 0xdd, 0xc0, 0x04, 0x75, 0xdc, 0x59, 0x87, 0xf3, + 0x9d, 0x89, 0xb8, 0xcb, 0x8c, 0xcb, 0x59, 0x7f, 0x17, 0x0a, 0x81, 0x5f, 0xf0, 0x4a, 0x54, 0xf3, + 0x85, 0x95, 0x28, 0x77, 0x11, 0x21, 0x64, 0x15, 0xa6, 0xdd, 0x2e, 0xf5, 0x8c, 0xb4, 0xcb, 0xc1, + 0xfb, 0x01, 0x02, 0x43, 0x1a, 0xee, 0x25, 0x52, 0x6b, 0xe2, 0xb8, 0xe6, 0x2d, 0x0e, 0x54, 0x46, + 0xac, 0x7c, 0x3f, 0x03, 0xc1, 0x27, 0x60, 0xc8, 0x06, 0x4c, 0x76, 0x5d, 0x8f, 0xc9, 0x7a, 0xba, + 0x78, 0x7b, 0x39, 0xdd, 0x9d, 0xe5, 0x75, 0xb3, 0xeb, 0xb1, 0x50, 0x22, 0xff, 0xe5, 0xa3, 0x64, + 0xe6, 0x76, 0x9a, 0x76, 0xcf, 0x67, 0xd4, 0xbb, 0xb7, 0x9f, 0xb4, 0x73, 0x3d, 0x40, 0x60, 0x48, + 0xb3, 0xf2, 0x3f, 0x59, 0x58, 0x48, 0xbe, 0x5d, 0x41, 0x3e, 0x84, 0x59, 0xdf, 0x6a, 0x3a, 0x96, + 0xd3, 0x54, 0x15, 0x77, 0x66, 0xe0, 0x5e, 0xbc, 0x6a, 0x94, 0x1f, 0xe3, 0xe2, 0xc8, 0x1d, 0x98, + 0x64, 0xa2, 0xff, 0x68, 0xa0, 0xd0, 0x9d, 0x96, 0xc7, 0x5d, 0x6d, 0xea, 0xa0, 0x64, 0x8f, 0x66, + 0xb5, 0xec, 0xf8, 0xb2, 0xda, 0xa7, 0xfd, 0x0d, 0xc7, 0x1f, 0x0c, 0xf9, 0xfd, 0x96, 0x71, 0x45, + 0xc0, 0x7f, 0x4f, 0xc2, 0x73, 0xe9, 0x6f, 0xb2, 0x3c, 0xa5, 0x1d, 0x43, 0xd8, 0xc3, 0x36, 0x71, + 0x6e, 0x0f, 0x1b, 0xd3, 0x15, 0x4a, 0x76, 0x48, 0x6f, 0xa6, 0xe8, 0x01, 0x78, 0x4c, 0x91, 0x12, + 0xdd, 0xcb, 0xe4, 0x9e, 0xb8, 0x97, 0xb9, 0x01, 0xf9, 0x5a, 0xcf, 0x6c, 0xab, 0xe3, 0xd3, 0xe8, + 0xe7, 0x03, 0x05, 0x14, 0x15, 0x36, 0x92, 0x74, 0xf2, 0x8f, 0x4d, 0x3a, 0x3c, 0x89, 0xf6, 0x58, + 0x4b, 0x76, 0xed, 0x4d, 0x0d, 0x9e, 0x44, 0x03, 0x5e, 0x0c, 0xc5, 0x88, 0x1e, 0xd7, 0xae, 0x75, + 0x84, 0x3b, 0x6a, 0xfd, 0x0f, 0x7b, 0x5c, 0xf7, 0xef, 0x1d, 0xe1, 0x0e, 0x2a, 0x2c, 0xf9, 0x51, + 0xff, 0x7a, 0x6f, 0x8e, 0xe4, 0xed, 0xa9, 0x71, 0x79, 0xbd, 0x09, 0x8b, 0x7d, 0x73, 0x7e, 0xe1, + 0x7a, 0xe6, 0x06, 0xe4, 0xfd, 0x5e, 0x83, 0xd3, 0x25, 0xda, 0xed, 0xab, 0x02, 0x8a, 0x0a, 0xbb, + 0xf2, 0xc3, 0x1c, 0xd7, 0x92, 0x78, 0xe7, 0xe9, 0x29, 0x45, 0xd5, 0xeb, 0x30, 0x2b, 0x2b, 0x8a, + 0xb7, 0x23, 0x5d, 0xea, 0x85, 0x48, 0x9f, 0x5c, 0x14, 0x89, 0x71, 0x5a, 0x72, 0x4f, 0xb8, 0xc9, + 0xc0, 0x7b, 0x72, 0x50, 0x9e, 0xc4, 0x53, 0xa8, 0x12, 0x40, 0x5e, 0x81, 0xa2, 0x78, 0x08, 0x39, + 0xe4, 0xaa, 0xb4, 0x16, 0x6d, 0xa5, 0x9b, 0x21, 0x18, 0xa3, 0x34, 0xf1, 0x93, 0xbd, 0xc9, 0xa1, + 0x9c, 0xec, 0xf5, 0xcd, 0xca, 0xd8, 0xaa, 0xe8, 0x3c, 0xe8, 0x4f, 0xcc, 0x11, 0xb3, 0xef, 0x43, + 0x7f, 0xbf, 0x39, 0xf0, 0xb9, 0x56, 0x60, 0x8a, 0x3c, 0x37, 0x4b, 0xe9, 0x75, 0x79, 0x13, 0x88, + 0xfa, 0xb2, 0x9c, 0xda, 0xbe, 0x45, 0x3e, 0xb5, 0xad, 0x5b, 0x60, 0xab, 0x7d, 0x14, 0x98, 0xc2, + 0x45, 0xde, 0x84, 0x69, 0xd3, 0x75, 0x98, 0x61, 0x39, 0x7a, 0xe5, 0x7d, 0xf1, 0x9c, 0xd6, 0x3c, + 0x49, 0x24, 0x97, 0x1e, 0xfd, 0x13, 0x43, 0x76, 0xb2, 0x09, 0x53, 0x0f, 0x5c, 0xbb, 0xd7, 0x51, + 0xe7, 0x2b, 0xc5, 0xdb, 0x4b, 0x69, 0x92, 0xde, 0x12, 0x24, 0x91, 0x06, 0x16, 0xc9, 0x82, 0x01, + 0x2f, 0xa1, 0x30, 0x2f, 0x4e, 0xd7, 0x2d, 0x76, 0xa2, 0x02, 0x40, 0xdd, 0x56, 0xdd, 0x48, 0x13, + 0xb7, 0xef, 0xd6, 0xab, 0x71, 0x6a, 0xf5, 0x71, 0xe4, 0x38, 0x10, 0x93, 0x32, 0xc9, 0x1d, 0x28, + 0x18, 0x8d, 0x86, 0xe5, 0x58, 0xec, 0x44, 0x1d, 0x41, 0x7e, 0x3d, 0x4d, 0xfe, 0x9a, 0xa2, 0x51, + 0xaf, 0x38, 0xa8, 0x5f, 0xa8, 0x79, 0xc9, 0x11, 0x14, 0x99, 0x6b, 0xab, 0x1d, 0xa2, 0xaf, 0xea, + 0xbc, 0x6b, 0x69, 0xa2, 0x0e, 0x35, 0x59, 0x78, 0xc8, 0x1b, 0xc2, 0x7c, 0x8c, 0xca, 0x21, 0x7f, + 0x91, 0x81, 0x19, 0xc7, 0xad, 0xd3, 0x20, 0xf4, 0xd4, 0x77, 0xe8, 0xde, 0x1d, 0xd2, 0xa7, 0x11, + 0xcb, 0x7b, 0x11, 0xd9, 0x32, 0x42, 0xf4, 0xb7, 0x1a, 0xa3, 0x28, 0x8c, 0x19, 0xb1, 0xf4, 0x1d, + 0x58, 0xec, 0x63, 0x1c, 0x28, 0x5a, 0xfe, 0x3a, 0x03, 0xc9, 0x1e, 0x61, 0xbe, 0xbd, 0xad, 0x5b, + 0x9e, 0x10, 0x78, 0x92, 0x3c, 0xcd, 0xdc, 0x08, 0x10, 0x18, 0xd2, 0x90, 0xeb, 0x90, 0xeb, 0x1a, + 0xac, 0x95, 0xbc, 0x82, 0xe2, 0x22, 0x51, 0x60, 0xc8, 0x6d, 0x00, 0xfe, 0x3f, 0xd2, 0x26, 0x7d, + 0xd4, 0x55, 0xbb, 0x75, 0x7d, 0xc0, 0xb2, 0xaf, 0x31, 0x18, 0xa1, 0x5a, 0xf9, 0x49, 0x1e, 0xe6, + 0xe2, 0x0b, 0x2f, 0xdf, 0x1e, 0x50, 0xa7, 0xde, 0x75, 0x2d, 0x87, 0x25, 0xbf, 0x14, 0xbd, 0xa9, + 0xe0, 0xa8, 0x29, 0x78, 0x12, 0xe9, 0x50, 0xd6, 0x72, 0xeb, 0xc9, 0x24, 0xb2, 0x2b, 0xa0, 0xa8, + 0xb0, 0xc2, 0x7c, 0xd7, 0x63, 0xca, 0xac, 0xd0, 0x7c, 0xd7, 0x63, 0x28, 0x30, 0xc1, 0x0d, 0x5a, + 0xee, 0x9c, 0x1b, 0xb4, 0x26, 0x2c, 0xf0, 0x50, 0xa6, 0xde, 0x3a, 0xf5, 0xd8, 0x57, 0xbe, 0xd0, + 0xad, 0x26, 0x44, 0x60, 0x9f, 0x50, 0xf1, 0x99, 0x72, 0x01, 0x13, 0xcc, 0x5f, 0xb1, 0xe5, 0xb9, + 0x1a, 0x97, 0x80, 0x49, 0x91, 0xa3, 0x38, 0x27, 0x89, 0xcf, 0xe3, 0x00, 0x7d, 0x84, 0x47, 0x00, + 0x7c, 0x2f, 0xa5, 0x1e, 0xb6, 0x30, 0xc8, 0xc3, 0xce, 0x89, 0xc3, 0x3b, 0xcd, 0x8c, 0x11, 0x41, + 0xe4, 0x2e, 0xcc, 0x85, 0x83, 0xcb, 0xfd, 0x4f, 0xb5, 0x4f, 0x5f, 0x57, 0xa6, 0x94, 0xc2, 0x6b, + 0xe8, 0x6a, 0x8c, 0x0e, 0x13, 0x7c, 0x64, 0x13, 0x66, 0xf5, 0xf8, 0x09, 0x41, 0x10, 0x6f, 0x6c, + 0x4e, 0x0a, 0x52, 0x64, 0x18, 0xe7, 0xba, 0x54, 0xca, 0xab, 0x94, 0x3f, 0xff, 0xf2, 0xda, 0x33, + 0x3f, 0xfd, 0xf2, 0xda, 0x33, 0x3f, 0xfb, 0xf2, 0xda, 0x33, 0xdf, 0x3f, 0xbb, 0x96, 0xf9, 0xfc, + 0xec, 0x5a, 0xe6, 0xa7, 0x67, 0xd7, 0x32, 0x3f, 0x3b, 0xbb, 0x96, 0xf9, 0xe2, 0xec, 0x5a, 0xe6, + 0x87, 0xff, 0x7e, 0xed, 0x99, 0xef, 0x16, 0x82, 0xd9, 0xf8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xd3, 0xf0, 0x8a, 0x3d, 0x0a, 0x64, 0x00, 0x00, } func (m *AMQPEventSource) Marshal() (dAtA []byte, err error) { @@ -2770,9 +2773,54 @@ func (m *GenericEventSource) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintGenerated(dAtA, i, uint64(len(m.Value))) + if len(m.Metadata) > 0 { + keysForMetadata := make([]string, 0, len(m.Metadata)) + for k := range m.Metadata { + keysForMetadata = append(keysForMetadata, string(k)) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + for iNdEx := len(keysForMetadata) - 1; iNdEx >= 0; iNdEx-- { + v := m.Metadata[string(keysForMetadata[iNdEx])] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintGenerated(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(keysForMetadata[iNdEx]) + copy(dAtA[i:], keysForMetadata[iNdEx]) + i = encodeVarintGenerated(dAtA, i, uint64(len(keysForMetadata[iNdEx]))) + i-- + dAtA[i] = 0xa + i = encodeVarintGenerated(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x2a + } + } + i-- + if m.JSONBody { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + i-- + if m.Insecure { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + i -= len(m.Config) + copy(dAtA[i:], m.Config) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Config))) + i-- + dAtA[i] = 0x12 + i -= len(m.URL) + copy(dAtA[i:], m.URL) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.URL))) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -5399,8 +5447,20 @@ func (m *GenericEventSource) Size() (n int) { } var l int _ = l - l = len(m.Value) + l = len(m.URL) + n += 1 + l + sovGenerated(uint64(l)) + l = len(m.Config) n += 1 + l + sovGenerated(uint64(l)) + n += 2 + n += 2 + if len(m.Metadata) > 0 { + for k, v := range m.Metadata { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovGenerated(uint64(len(k))) + 1 + len(v) + sovGenerated(uint64(len(v))) + n += mapEntrySize + 1 + sovGenerated(uint64(mapEntrySize)) + } + } return n } @@ -6628,8 +6688,22 @@ func (this *GenericEventSource) String() string { if this == nil { return "nil" } + keysForMetadata := make([]string, 0, len(this.Metadata)) + for k := range this.Metadata { + keysForMetadata = append(keysForMetadata, k) + } + github_com_gogo_protobuf_sortkeys.Strings(keysForMetadata) + mapStringForMetadata := "map[string]string{" + for _, k := range keysForMetadata { + mapStringForMetadata += fmt.Sprintf("%v: %v,", k, this.Metadata[k]) + } + mapStringForMetadata += "}" s := strings.Join([]string{`&GenericEventSource{`, - `Value:` + fmt.Sprintf("%v", this.Value) + `,`, + `URL:` + fmt.Sprintf("%v", this.URL) + `,`, + `Config:` + fmt.Sprintf("%v", this.Config) + `,`, + `Insecure:` + fmt.Sprintf("%v", this.Insecure) + `,`, + `JSONBody:` + fmt.Sprintf("%v", this.JSONBody) + `,`, + `Metadata:` + mapStringForMetadata + `,`, `}`, }, "") return s @@ -12653,7 +12727,7 @@ func (m *GenericEventSource) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Value", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field URL", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12681,7 +12755,206 @@ func (m *GenericEventSource) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Value = string(dAtA[iNdEx:postIndex]) + m.URL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Config", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Config = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Insecure", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Insecure = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field JSONBody", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.JSONBody = bool(v != 0) + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Metadata == nil { + m.Metadata = make(map[string]string) + } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + if fieldNum == 1 { + var stringLenmapkey uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapkey |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapkey := int(stringLenmapkey) + if intStringLenmapkey < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapkey > l { + return io.ErrUnexpectedEOF + } + mapkey = string(dAtA[iNdEx:postStringIndexmapkey]) + iNdEx = postStringIndexmapkey + } else if fieldNum == 2 { + var stringLenmapvalue uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLenmapvalue |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLenmapvalue := int(stringLenmapvalue) + if intStringLenmapvalue < 0 { + return ErrInvalidLengthGenerated + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthGenerated + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipGenerated(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthGenerated + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Metadata[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex diff --git a/pkg/apis/eventsource/v1alpha1/generated.proto b/pkg/apis/eventsource/v1alpha1/generated.proto index b2d9d33e22..5b589e11ba 100644 --- a/pkg/apis/eventsource/v1alpha1/generated.proto +++ b/pkg/apis/eventsource/v1alpha1/generated.proto @@ -280,8 +280,23 @@ message FileEventSource { // GenericEventSource refers to a generic event source. It can be used to implement a custom event source. message GenericEventSource { - // Value of the event source - optional string value = 1; + // URL of the gRPC server that implements the event source. + optional string url = 1; + + // Config is the event source configuration + optional string config = 2; + + // Insecure determines the type of connection. + optional bool insecure = 3; + + // JSONBody specifies that all event body payload coming from this + // source will be JSON + // +optional + optional bool jsonBody = 4; + + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + map metadata = 5; } // GithubEventSource refers to event-source for github related events @@ -913,7 +928,7 @@ message Template { // +optional optional k8s.io.api.core.v1.Container container = 3; - // Volumes is a list of volumes that can be mounted by containers in a workflow. + // Volumes is a list of volumes that can be mounted by containers in an eventsource. // +patchStrategy=merge // +patchMergeKey=name // +optional diff --git a/pkg/apis/eventsource/v1alpha1/openapi_generated.go b/pkg/apis/eventsource/v1alpha1/openapi_generated.go index a779a0c7b0..9cfd0422cd 100644 --- a/pkg/apis/eventsource/v1alpha1/openapi_generated.go +++ b/pkg/apis/eventsource/v1alpha1/openapi_generated.go @@ -915,15 +915,51 @@ func schema_pkg_apis_eventsource_v1alpha1_GenericEventSource(ref common.Referenc Description: "GenericEventSource refers to a generic event source. It can be used to implement a custom event source.", Type: []string{"object"}, Properties: map[string]spec.Schema{ - "value": { + "url": { SchemaProps: spec.SchemaProps{ - Description: "Value of the event source", + Description: "URL of the gRPC server that implements the event source.", Type: []string{"string"}, Format: "", }, }, + "config": { + SchemaProps: spec.SchemaProps{ + Description: "Config is the event source configuration", + Type: []string{"string"}, + Format: "", + }, + }, + "insecure": { + SchemaProps: spec.SchemaProps{ + Description: "Insecure determines the type of connection.", + Type: []string{"boolean"}, + Format: "", + }, + }, + "jsonBody": { + SchemaProps: spec.SchemaProps{ + Description: "JSONBody specifies that all event body payload coming from this source will be JSON", + Type: []string{"boolean"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Description: "Metadata holds the user defined metadata which will passed along the event payload.", + Type: []string{"object"}, + AdditionalProperties: &spec.SchemaOrBool{ + Allows: true, + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + }, + }, }, - Required: []string{"value"}, + Required: []string{"url", "config"}, }, }, } @@ -2490,7 +2526,7 @@ func schema_pkg_apis_eventsource_v1alpha1_Template(ref common.ReferenceCallback) }, }, SchemaProps: spec.SchemaProps{ - Description: "Volumes is a list of volumes that can be mounted by containers in a workflow.", + Description: "Volumes is a list of volumes that can be mounted by containers in an eventsource.", Type: []string{"array"}, Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ diff --git a/pkg/apis/eventsource/v1alpha1/types.go b/pkg/apis/eventsource/v1alpha1/types.go index 8654de4643..c30d2daca8 100644 --- a/pkg/apis/eventsource/v1alpha1/types.go +++ b/pkg/apis/eventsource/v1alpha1/types.go @@ -120,7 +120,7 @@ type Template struct { // Container is the main container image to run in the event source pod // +optional Container *corev1.Container `json:"container,omitempty" protobuf:"bytes,3,opt,name=container"` - // Volumes is a list of volumes that can be mounted by containers in a workflow. + // Volumes is a list of volumes that can be mounted by containers in an eventsource. // +patchStrategy=merge // +patchMergeKey=name // +optional @@ -768,8 +768,19 @@ type PulsarEventSource struct { // GenericEventSource refers to a generic event source. It can be used to implement a custom event source. type GenericEventSource struct { - // Value of the event source - Value string `json:"value" protobuf:"bytes,1,opt,name=value"` + // URL of the gRPC server that implements the event source. + URL string `json:"url" protobuf:"bytes,1,name=url"` + // Config is the event source configuration + Config string `json:"config" protobuf:"bytes,2,name=config"` + // Insecure determines the type of connection. + Insecure bool `json:"insecure,omitempty" protobuf:"varint,3,opt,name=insecure"` + // JSONBody specifies that all event body payload coming from this + // source will be JSON + // +optional + JSONBody bool `json:"jsonBody,omitempty" protobuf:"varint,4,opt,name=jsonBody"` + // Metadata holds the user defined metadata which will passed along the event payload. + // +optional + Metadata map[string]string `json:"metadata,omitempty" protobuf:"bytes,5,rep,name=metadata"` } const ( diff --git a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go index a0fd3b9888..573b379584 100644 --- a/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/eventsource/v1alpha1/zz_generated.deepcopy.go @@ -414,7 +414,7 @@ func (in *EventSourceSpec) DeepCopyInto(out *EventSourceSpec) { in, out := &in.Generic, &out.Generic *out = make(map[string]GenericEventSource, len(*in)) for key, val := range *in { - (*out)[key] = val + (*out)[key] = *val.DeepCopy() } } return @@ -474,6 +474,13 @@ func (in *FileEventSource) DeepCopy() *FileEventSource { // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *GenericEventSource) DeepCopyInto(out *GenericEventSource) { *out = *in + if in.Metadata != nil { + in, out := &in.Metadata, &out.Metadata + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } return }