From 87bd771d1c3713d28463302d0fe4f8c8ee4fcc5f Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Fri, 24 Mar 2023 16:24:19 -0400
Subject: [PATCH 1/6] feat: add edge level onFull write actions
Signed-off-by: Keran Yang
---
.github/workflows/ci.yaml | 4 +-
Makefile | 5 +-
api/json-schema/schema.json | 6 +-
api/openapi-spec/swagger.json | 6 +-
.../full/numaflow.numaproj.io_pipelines.yaml | 6 +
.../full/numaflow.numaproj.io_vertices.yaml | 12 +
config/install.yaml | 18 +
config/namespace-install.yaml | 18 +
docs/APIs.md | 15 +-
pkg/apis/numaflow/v1alpha1/const.go | 4 +
pkg/apis/numaflow/v1alpha1/edge_types.go | 7 +-
pkg/apis/numaflow/v1alpha1/generated.pb.go | 593 ++++++++++--------
pkg/apis/numaflow/v1alpha1/generated.proto | 8 +-
.../numaflow/v1alpha1/openapi_generated.go | 10 +-
pkg/forward/forward.go | 92 +--
pkg/forward/forward_test.go | 108 +++-
pkg/forward/metrics.go | 20 +-
pkg/forward/options.go | 10 +
pkg/forward/shutdown_test.go | 12 +-
pkg/isb/interfaces.go | 1 +
pkg/isb/stores/jetstream/writer.go | 7 +-
pkg/isb/stores/jetstream/writer_test.go | 2 +-
pkg/isb/stores/redis/read_test.go | 15 +-
pkg/isb/stores/redis/write_test.go | 11 +-
pkg/sinks/blackhole/blackhole.go | 2 +-
pkg/sinks/blackhole/blackhole_test.go | 6 +-
pkg/sinks/kafka/kafka.go | 6 +-
pkg/sinks/kafka/kafka_test.go | 4 +-
pkg/sinks/logger/log.go | 2 +-
pkg/sinks/logger/log_test.go | 6 +-
pkg/sinks/udsink/sink.go | 2 +-
pkg/sources/generator/tickgen.go | 3 +-
pkg/sources/generator/tickgen_test.go | 6 +-
pkg/sources/http/http.go | 3 +-
pkg/sources/http/http_test.go | 2 +-
pkg/sources/kafka/handler_test.go | 2 +-
pkg/sources/kafka/reader.go | 3 +-
pkg/sources/kafka/reader_test.go | 8 +-
pkg/sources/nats/nats.go | 3 +-
pkg/sources/nats/nats_test.go | 2 +-
pkg/sources/source.go | 28 +-
pkg/udf/map_udf.go | 11 +-
test/{e2e => e2e-suite-1}/functional_test.go | 0
.../testdata/even-odd.yaml | 0
.../extract-event-time-from-payload.yaml | 0
.../testdata/simple-pipeline.yaml | 0
.../testdata/source-filtering.yaml | 0
.../testdata/udf-filtering.yaml | 0
.../testdata/watermark.yaml | 0
test/e2e-suite-2/functional_test.go | 75 +++
test/e2e-suite-2/testdata/drop-on-full.yaml | 34 +
test/fixtures/expect.go | 20 +-
test/fixtures/util.go | 37 +-
53 files changed, 871 insertions(+), 384 deletions(-)
rename test/{e2e => e2e-suite-1}/functional_test.go (100%)
rename test/{e2e => e2e-suite-1}/testdata/even-odd.yaml (100%)
rename test/{e2e => e2e-suite-1}/testdata/extract-event-time-from-payload.yaml (100%)
rename test/{e2e => e2e-suite-1}/testdata/simple-pipeline.yaml (100%)
rename test/{e2e => e2e-suite-1}/testdata/source-filtering.yaml (100%)
rename test/{e2e => e2e-suite-1}/testdata/udf-filtering.yaml (100%)
rename test/{e2e => e2e-suite-1}/testdata/watermark.yaml (100%)
create mode 100644 test/e2e-suite-2/functional_test.go
create mode 100644 test/e2e-suite-2/testdata/drop-on-full.yaml
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 8d08a7fff6..f1882f6471 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -136,10 +136,10 @@ jobs:
timeout-minutes: 20
strategy:
fail-fast: false
- max-parallel: 6
+ max-parallel: 7
matrix:
driver: [jetstream]
- case: [e2e, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e]
+ case: [e2e-suite-1, e2e-suite-2, kafka-e2e, http-e2e, nats-e2e, sdks-e2e, reduce-e2e]
steps:
- name: Checkout code
uses: actions/checkout@v3
diff --git a/Makefile b/Makefile
index 81ba344e10..7bbddc326b 100644
--- a/Makefile
+++ b/Makefile
@@ -102,7 +102,8 @@ test-coverage-with-isb:
test-code:
go test -tags=isb_redis -race -v $(shell go list ./... | grep -v /vendor/ | grep -v /numaflow/test/)
-test-e2e:
+test-e2e-suite-1:
+test-e2e-suite-2:
test-kafka-e2e:
test-http-e2e:
test-nats-e2e:
@@ -135,7 +136,7 @@ Test%:
kubectl -n numaflow-system delete po -lapp.kubernetes.io/component=controller-manager,app.kubernetes.io/part-of=numaflow
kubectl -n numaflow-system delete po e2e-api-pod --ignore-not-found=true
cat test/manifests/e2e-api-pod.yaml | sed 's@quay.io/numaproj/@$(IMAGE_NAMESPACE)/@' | sed 's/:$(BASE_VERSION)/:$(VERSION)/' | kubectl -n numaflow-system apply -f -
- -go test -v -timeout 10m -count 1 --tags test -p 1 ./test/e2e -run='.*/$*'
+ -go test -v -timeout 10m -count 1 --tags test -p 1 ./test/e2e-suite-1 -run='.*/$*'
$(MAKE) cleanup-e2e
.PHONY: ui-build
diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json
index aabb69bd36..6eb9fdfa36 100644
--- a/api/json-schema/schema.json
+++ b/api/json-schema/schema.json
@@ -17658,8 +17658,12 @@
"$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits",
"description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings."
},
+ "onFull": {
+ "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
+ "type": "string"
+ },
"parallelism": {
- "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
+ "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
"format": "int32",
"type": "integer"
},
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index b2ad170834..08c77f1a77 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -17667,8 +17667,12 @@
"description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings.",
"$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits"
},
+ "onFull": {
+ "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
+ "type": "string"
+ },
"parallelism": {
- "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
+ "description": "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
"type": "integer",
"format": "int32"
},
diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
index 5f3a05c067..8a71d09bf9 100644
--- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
@@ -77,6 +77,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
index 78c44d81bf..1d4022dfeb 100644
--- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
@@ -591,6 +591,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
@@ -2760,6 +2766,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
diff --git a/config/install.yaml b/config/install.yaml
index ffd85c131b..ec7b1bac7d 100644
--- a/config/install.yaml
+++ b/config/install.yaml
@@ -2375,6 +2375,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
@@ -8165,6 +8171,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
@@ -10334,6 +10346,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml
index c0b2f27bae..8780e2db19 100644
--- a/config/namespace-install.yaml
+++ b/config/namespace-install.yaml
@@ -2375,6 +2375,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
@@ -8165,6 +8171,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
@@ -10334,6 +10346,12 @@ spec:
format: int32
type: integer
type: object
+ onFull:
+ enum:
+ - ""
+ - retryUntilSuccess
+ - dropAndAckLatest
+ type: string
parallelism:
format: int32
type: integer
diff --git a/docs/APIs.md b/docs/APIs.md
index b6fc29c403..6b2b7a57f5 100644
--- a/docs/APIs.md
+++ b/docs/APIs.md
@@ -911,11 +911,24 @@ edge, will override pipeline level settings.
(Optional)
Parallelism is only effective when the “to” vertex is a reduce vertex,
-if it’s provided, the default value is set to “1”. Parallelism is
+if it’s not provided, the default value is set to “1”. Parallelism is
ignored when the “to” vertex is not a reduce vertex.
+
+
+onFull string
+ |
+
+(Optional)
+
+OnFull specifies the behaviour for the write actions when the inter step
+buffer is full. if not provided, the default value is set to “”, which
+currently has the same effect as “retryUntilSuccess”.
+
+ |
+
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index dcfcb76fd0..971e89e528 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -122,6 +122,10 @@ const (
DefaultBufferUsageLimit = 0.8
DefaultReadBatchSize = 500
+ // Edge-level specification to define the writing behaviour when the ToBuffer is full
+ RetryUntilSuccess = "retryUntilSuccess"
+ DropAndAckLatest = "dropAndAckLatest"
+
// Auto scaling
DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending
DefaultCooldownSeconds = 90 // Default cooldown seconds after a scaling operation
diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go
index b2bcdd3340..09aa3f0d00 100644
--- a/pkg/apis/numaflow/v1alpha1/edge_types.go
+++ b/pkg/apis/numaflow/v1alpha1/edge_types.go
@@ -26,10 +26,15 @@ type Edge struct {
// +optional
Limits *EdgeLimits `json:"limits,omitempty" protobuf:"bytes,4,opt,name=limits"`
// Parallelism is only effective when the "to" vertex is a reduce vertex,
- // if it's provided, the default value is set to "1".
+ // if it's not provided, the default value is set to "1".
// Parallelism is ignored when the "to" vertex is not a reduce vertex.
// +optional
Parallelism *int32 `json:"parallelism" protobuf:"bytes,5,opt,name=parallelism"`
+ // OnFull specifies the behaviour for the write actions when the inter step buffer is full.
+ // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess".
+ // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest
+ // +optional
+ OnFull string `json:"onFull" protobuf:"bytes,6,opt,name=onFull"`
}
type ForwardConditions struct {
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index dcf8823de8..7d9cb87e39 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -2037,16 +2037,16 @@ func init() {
}
var fileDescriptor_9d0d1b17d3865563 = []byte{
- // 5683 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x1c, 0xd7,
- 0x75, 0xbf, 0xf7, 0x93, 0xbb, 0x67, 0x49, 0x7d, 0x5c, 0x59, 0xf2, 0x8a, 0x91, 0xb9, 0xca, 0x04,
- 0x36, 0x94, 0xff, 0x3f, 0x21, 0x2b, 0xd6, 0x69, 0x94, 0xb6, 0x89, 0xcd, 0x25, 0x45, 0x59, 0x12,
- 0x29, 0xd1, 0x67, 0x49, 0xc9, 0xb1, 0x5b, 0xbb, 0xc3, 0xd9, 0xbb, 0xcb, 0xf1, 0xce, 0xce, 0xac,
- 0x67, 0xee, 0x52, 0xa2, 0xdb, 0xa0, 0x41, 0xfc, 0x60, 0x17, 0x4d, 0x91, 0x02, 0x45, 0x81, 0xa0,
- 0x41, 0x0a, 0x14, 0x28, 0x50, 0xb4, 0x40, 0x80, 0x3e, 0x34, 0x2f, 0xed, 0x4b, 0x9f, 0x0a, 0xb7,
- 0x0f, 0xad, 0x1f, 0x0a, 0xd4, 0x45, 0x83, 0x45, 0xcd, 0x3e, 0xf5, 0xa1, 0x45, 0x8a, 0xbc, 0x04,
- 0x42, 0x81, 0x16, 0xf7, 0x63, 0x3e, 0x77, 0x96, 0x22, 0x77, 0x49, 0x47, 0x46, 0xdf, 0x66, 0xee,
- 0x39, 0xe7, 0x77, 0xee, 0xdc, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x81, 0x1b, 0x6d, 0x93, 0xed,
+ // 5699 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57,
+ 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9,
+ 0x5a, 0x25, 0x9a, 0xfd, 0xff, 0x77, 0x6d, 0xc6, 0x64, 0xd9, 0x59, 0x60, 0x37, 0x71, 0xdb, 0xe3,
+ 0xc9, 0xcc, 0xd8, 0x33, 0xce, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2,
+ 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0x83, 0x94, 0x20, 0x16, 0x2d, 0x12,
+ 0x42, 0x5a, 0xb1, 0x5a, 0x24, 0x24, 0x24, 0x04, 0xd2, 0x4a, 0x3c, 0xb0, 0x2f, 0xf0, 0xc2, 0x13,
+ 0x0a, 0x3c, 0x40, 0x1e, 0x90, 0x08, 0x02, 0xb5, 0x88, 0x79, 0xe2, 0x01, 0xb4, 0x68, 0x5f, 0x56,
+ 0x23, 0x24, 0xd0, 0xfd, 0xa8, 0xcf, 0xae, 0xf6, 0xd8, 0xdd, 0x76, 0x76, 0x22, 0xde, 0xaa, 0xee,
+ 0x39, 0xe7, 0x77, 0x6e, 0xdd, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x82, 0x1b, 0x6d, 0x93, 0xed,
0xf4, 0xb7, 0xe7, 0x0d, 0xa7, 0xbb, 0x60, 0xf7, 0xbb, 0x7a, 0xcf, 0x75, 0xde, 0x12, 0x0f, 0x2d,
0xcb, 0x79, 0xb0, 0xd0, 0xeb, 0xb4, 0x17, 0xf4, 0x9e, 0xe9, 0x85, 0x25, 0xbb, 0x57, 0x75, 0xab,
0xb7, 0xa3, 0x5f, 0x5d, 0x68, 0x53, 0x9b, 0xba, 0x3a, 0xa3, 0xcd, 0xf9, 0x9e, 0xeb, 0x30, 0x87,
@@ -2056,7 +2056,7 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{
0x60, 0x38, 0x2e, 0x5d, 0xd8, 0x1d, 0xaa, 0xcb, 0xec, 0x0b, 0x21, 0x4f, 0x57, 0x37, 0x76, 0x4c,
0x9b, 0xba, 0x7b, 0xfe, 0xb7, 0x2c, 0xb8, 0xd4, 0x73, 0xfa, 0xae, 0x41, 0x8f, 0x24, 0xe5, 0x2d,
0x74, 0x29, 0xd3, 0xd3, 0x74, 0x2d, 0x8c, 0x92, 0x72, 0xfb, 0x36, 0x33, 0xbb, 0xc3, 0x6a, 0x7e,
- 0xe1, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0x97, 0x32, 0x9c, 0x5b, 0xda,
+ 0xee, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0xe7, 0x32, 0x9c, 0x5b, 0xda,
0xf6, 0x98, 0xab, 0x1b, 0x6c, 0xc3, 0x69, 0x6e, 0xd2, 0x6e, 0xcf, 0xd2, 0x19, 0x25, 0x1d, 0x28,
0xf1, 0xba, 0x35, 0x75, 0xa6, 0x57, 0x33, 0x97, 0x33, 0x57, 0x2a, 0x8b, 0x4b, 0xf3, 0x63, 0xf6,
0xc5, 0xfc, 0xba, 0x02, 0xaa, 0x4f, 0xef, 0x0f, 0x6a, 0x25, 0xff, 0x0d, 0x03, 0x05, 0xe4, 0xbb,
@@ -2085,13 +2085,13 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{
0xa0, 0x63, 0x88, 0x41, 0xd6, 0x05, 0xe0, 0xb2, 0x63, 0xb7, 0xcc, 0x76, 0x75, 0x46, 0xf4, 0xc6,
0xe5, 0x11, 0x03, 0x7a, 0xe5, 0x4e, 0x43, 0xf2, 0xd5, 0x67, 0x94, 0x3a, 0xf9, 0x8a, 0x21, 0xc2,
0xec, 0x8b, 0x70, 0x76, 0x68, 0xd6, 0x92, 0x33, 0x90, 0xeb, 0xd0, 0x3d, 0x61, 0x94, 0xca, 0xc8,
- 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xc5, 0xec,
+ 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xf9, 0xec,
0xb5, 0x8c, 0x36, 0x28, 0xc3, 0x29, 0xdf, 0x16, 0xdc, 0xa3, 0x2e, 0xa3, 0x0f, 0xc9, 0x65, 0xc8,
0xdb, 0xbc, 0x3f, 0x84, 0x7c, 0x7d, 0x5a, 0x7d, 0x6e, 0x5e, 0xf4, 0x83, 0xa0, 0x10, 0x03, 0x8a,
0xd2, 0x96, 0x0b, 0xbc, 0xca, 0xe2, 0x8b, 0x63, 0x9b, 0xa1, 0x86, 0x80, 0xa9, 0xc3, 0xfe, 0xa0,
0x56, 0x94, 0xcf, 0xa8, 0xa0, 0xc9, 0xeb, 0x90, 0xf7, 0x4c, 0xbb, 0x53, 0xcd, 0x09, 0x15, 0x5f,
0x1d, 0x5f, 0x85, 0x69, 0x77, 0xea, 0x25, 0xfe, 0x05, 0xfc, 0x09, 0x05, 0x28, 0xb9, 0x0f, 0xb9,
- 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8f, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4,
+ 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8e, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4,
0x72, 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x32, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5,
0xc5, 0xb7, 0xac, 0xd5, 0x82, 0xd0, 0x73, 0x6b, 0x6c, 0x3d, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0x6e,
0x28, 0x86, 0x8a, 0x71, 0x58, 0x37, 0xf9, 0x5e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0xc4, 0x2c, 0xcc,
@@ -2102,22 +2102,22 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{
0xf9, 0xee, 0xa1, 0x2f, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xb0, 0x96, 0x95, 0xc5,
0xeb, 0x63, 0x7f, 0x96, 0x9c, 0xa2, 0x6b, 0x02, 0x4c, 0xce, 0x1a, 0xf9, 0x8c, 0x4a, 0x01, 0x31,
0xa0, 0xe0, 0x19, 0xba, 0x25, 0xad, 0x69, 0x65, 0xf1, 0x6b, 0xe3, 0x4f, 0x1b, 0x8e, 0x52, 0x9f,
- 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0xaf, 0xc2, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a,
+ 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0x2f, 0xc3, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a,
0x68, 0x9d, 0x67, 0xd3, 0x5a, 0x27, 0xe0, 0xaa, 0x5f, 0x50, 0x60, 0xa7, 0x62, 0x23, 0xc4, 0xc3,
0x04, 0x18, 0xb9, 0x0d, 0x25, 0xcf, 0x6c, 0x52, 0x43, 0x77, 0xbd, 0xea, 0xf4, 0x61, 0x80, 0xcf,
0x28, 0xe0, 0x52, 0x43, 0x89, 0x61, 0x00, 0xa0, 0xdd, 0x87, 0x99, 0xa5, 0x3e, 0xdb, 0x71, 0x5c,
0xf3, 0x1d, 0xe1, 0x59, 0x90, 0x55, 0x28, 0x30, 0xb1, 0x42, 0x48, 0xa7, 0xed, 0xb9, 0x34, 0x68,
0xb9, 0x5a, 0xdf, 0xa6, 0x7b, 0xbe, 0x61, 0xad, 0x97, 0x79, 0x23, 0xc8, 0x15, 0x43, 0x8a, 0x6b,
- 0x7f, 0x94, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e,
+ 0x7f, 0x98, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e,
0x0d, 0x54, 0x58, 0xa5, 0x2d, 0x8f, 0xba, 0x28, 0x84, 0xc9, 0x5d, 0x28, 0xf5, 0x74, 0xcf, 0x7b,
0xe0, 0xb8, 0x4d, 0x65, 0x59, 0x0f, 0x09, 0x24, 0x97, 0x7e, 0x25, 0x8a, 0x01, 0x88, 0x56, 0x81,
0x72, 0xdd, 0xd2, 0x8d, 0xce, 0x8e, 0x63, 0x51, 0xed, 0x35, 0x28, 0xd6, 0xfb, 0xad, 0x16, 0x75,
0x0f, 0x61, 0xe1, 0xe7, 0x21, 0xcf, 0xf6, 0x7a, 0x6a, 0xbd, 0x08, 0x56, 0xf7, 0xfc, 0xe6, 0x5e,
- 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x4f, 0x32, 0x70, 0x4e, 0x16,
+ 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x8f, 0x33, 0x70, 0x4e, 0x16,
0xaa, 0x55, 0x54, 0xae, 0x4f, 0x84, 0x42, 0xc1, 0xa5, 0x4d, 0xd3, 0x53, 0xed, 0xb2, 0x32, 0xf6,
0x70, 0x44, 0x8e, 0xa2, 0x96, 0x43, 0xd1, 0x17, 0xa2, 0x00, 0x25, 0x3a, 0xe9, 0x43, 0xf9, 0x2d,
0xca, 0x3c, 0xe6, 0x52, 0xbd, 0xab, 0x5a, 0xee, 0xe5, 0xb1, 0x55, 0xdd, 0xa2, 0xac, 0x21, 0x90,
- 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0xa7, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e,
+ 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0x27, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e,
0x0a, 0xc2, 0xdd, 0x53, 0xcd, 0x1a, 0x4c, 0x1d, 0xe1, 0x15, 0xa2, 0xa4, 0x91, 0xe7, 0x60, 0xca,
0x70, 0xba, 0x5d, 0xdd, 0x6e, 0x0a, 0x17, 0xbe, 0x5c, 0xaf, 0x70, 0x8b, 0xb1, 0x2c, 0x8b, 0xd0,
0xa7, 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xf4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f,
@@ -2135,265 +2135,266 @@ var fileDescriptor_9d0d1b17d3865563 = []byte{
0x26, 0x77, 0xdc, 0x1d, 0x33, 0xfe, 0xdc, 0xd1, 0xde, 0xcf, 0xc3, 0xa9, 0x15, 0x9d, 0x76, 0x1d,
0xfb, 0xb1, 0xee, 0x4b, 0xe6, 0x89, 0x70, 0x5f, 0xae, 0x40, 0xc9, 0xa5, 0x3d, 0xcb, 0x34, 0x74,
0x4f, 0x74, 0x96, 0xda, 0x23, 0xa2, 0x2a, 0xc3, 0x80, 0x3a, 0xc2, 0x6d, 0xcd, 0x3d, 0x91, 0x6e,
- 0x6b, 0xfe, 0x67, 0xef, 0xb6, 0x6a, 0x3f, 0xca, 0x42, 0xfe, 0x7a, 0xb3, 0x4d, 0xf9, 0x52, 0xda,
- 0xe2, 0xc6, 0x34, 0xb1, 0x94, 0x0a, 0x33, 0x29, 0x28, 0x64, 0x16, 0xb2, 0xcc, 0x51, 0x73, 0x05,
- 0x14, 0x3d, 0xbb, 0xe9, 0x60, 0x96, 0x39, 0xe4, 0x1d, 0x00, 0xc3, 0xb1, 0x9b, 0xa6, 0x1f, 0x3a,
- 0x99, 0xec, 0xc3, 0x56, 0x1d, 0xf7, 0x81, 0xee, 0x36, 0x97, 0x03, 0xc4, 0xfa, 0xa9, 0xfd, 0x41,
- 0x0d, 0xc2, 0x77, 0x8c, 0x68, 0x23, 0xed, 0xc0, 0x29, 0x95, 0x0d, 0xba, 0x3c, 0xb6, 0x5e, 0xde,
- 0x10, 0x07, 0xb8, 0xa4, 0x57, 0xa1, 0xd2, 0xd3, 0x5d, 0xdd, 0xb2, 0xa8, 0x65, 0x7a, 0x5d, 0xb1,
- 0x17, 0x2a, 0xd4, 0x4f, 0xef, 0x0f, 0x6a, 0x95, 0x8d, 0xb0, 0x18, 0xa3, 0x3c, 0xda, 0xef, 0x64,
- 0x00, 0x42, 0x54, 0xf2, 0x55, 0x38, 0xbd, 0x2d, 0x9c, 0x8b, 0x75, 0xfd, 0xe1, 0x1a, 0xb5, 0xdb,
- 0x6c, 0x47, 0xb4, 0x77, 0x5e, 0x4e, 0xf9, 0x7a, 0x9c, 0x84, 0x49, 0x5e, 0xf2, 0x12, 0x9c, 0x91,
- 0x45, 0x5b, 0x9e, 0xae, 0x30, 0x45, 0x7f, 0xcc, 0xc8, 0x60, 0x43, 0x3d, 0x41, 0xc3, 0x21, 0x6e,
- 0x4d, 0x87, 0xca, 0xaa, 0xf9, 0x90, 0x36, 0xef, 0x9b, 0x76, 0xd3, 0x79, 0x40, 0x10, 0x8a, 0x56,
- 0x58, 0x8d, 0xca, 0xe2, 0x7c, 0xc4, 0x8c, 0x04, 0xb1, 0xc5, 0xb0, 0xc5, 0xba, 0x94, 0xe9, 0xdc,
- 0xb0, 0xac, 0xf4, 0x55, 0xf4, 0x4b, 0xb6, 0x92, 0xac, 0xad, 0x42, 0xd2, 0x5e, 0x80, 0xb3, 0x43,
- 0xfd, 0x47, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0x57, 0xe5, 0x7e, 0x80, 0x70, 0x7c, 0x6e,
- 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda, 0xb7, 0x0d, 0xe1, 0xd9, 0x3e, 0xde,
- 0xad, 0xf3, 0xdd, 0x8a, 0x6c, 0xaa, 0x5b, 0xd1, 0x87, 0x62, 0xe7, 0x41, 0xe0, 0x76, 0x54, 0x16,
- 0xd7, 0xc7, 0x1f, 0x89, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e, 0x0c, 0x26, 0x9e, 0x52, 0x15, 0x2a,
- 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0xd1, 0x8b, 0x9f,
- 0x66, 0xe0, 0xf4, 0x0d, 0x19, 0xaf, 0x75, 0x5c, 0xe9, 0xad, 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d,
- 0x21, 0x9f, 0x93, 0x9b, 0x73, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53, 0xf5, 0x81,
- 0xf2, 0x12, 0x8f, 0xda, 0x73, 0xc2, 0x7e, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xb7, 0xae, 0xeb, 0xb5,
- 0x1b, 0xe6, 0x3b, 0xd2, 0x68, 0x16, 0xa4, 0x5b, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71, 0x83, 0xdc,
- 0xa1, 0x7b, 0xcb, 0xdc, 0xc3, 0x11, 0xb3, 0x4e, 0x19, 0xe4, 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef,
- 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x64,
- 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x7a, 0xb4, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x71, 0xa4, 0x6f,
- 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x07, 0x5d, 0x8d, 0x86, 0xcb, 0xaa, 0xf1,
- 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xd9, 0xec, 0x01, 0xae,
- 0x6c, 0x03, 0xa0, 0x17, 0x3a, 0x03, 0x39, 0xc1, 0xf9, 0xf3, 0xbe, 0x9a, 0xa3, 0xf8, 0x01, 0x11,
- 0x98, 0x49, 0x96, 0xe7, 0xbf, 0xcc, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x4f, 0x5d, 0xed, 0x44, 0x1a,
- 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65,
- 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54,
- 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a, 0x99, 0x83,
- 0x88, 0xf8, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9,
- 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47,
- 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84,
- 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff,
- 0xaa, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f,
- 0x41, 0x45, 0x45, 0x92, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc,
- 0x76, 0xd8, 0xef, 0x32, 0x69, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00,
- 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x7e, 0xf7, 0x1d, 0x9f, 0x80, 0x21, 0x0f,
- 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2,
- 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21, 0x03, 0xc9,
- 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x93, 0xb9, 0x3c, 0xcc, 0x82, 0x69, 0x72,
- 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1,
- 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0xe6, 0x12, 0xc9, 0x53,
- 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8,
- 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78,
- 0x00, 0x0a, 0xf9, 0x25, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x5a, 0x9c, 0x57,
- 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66,
- 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x39, 0x8a, 0x72, 0xfd, 0x19, 0x7f, 0x93, 0xb7, 0x11, 0x27,
- 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0x21, 0x8d, 0xea, 0x29, 0x99, 0xd5,
- 0xf1, 0x77, 0xfc, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31, 0x14, 0x31,
- 0xa1, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4,
- 0xbf, 0x05, 0xc4, 0x55, 0x11, 0x2c, 0xb9, 0x93, 0x88, 0x58, 0xfe, 0x20, 0x77, 0x86, 0x43, 0x1c,
- 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0,
- 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x47, 0x65, 0xb1, 0xee,
- 0xca, 0xa6, 0x39, 0x36, 0xb3, 0xfd, 0x5e, 0xd2, 0x6c, 0xbf, 0x39, 0x79, 0xbf, 0x8d, 0x67, 0xb2,
- 0x17, 0x01, 0x44, 0x2f, 0x44, 0x6d, 0x76, 0x60, 0xa9, 0x30, 0xa0, 0x60, 0x84, 0x8b, 0xcf, 0x42,
- 0xbf, 0x9d, 0xa3, 0xe6, 0x3a, 0x98, 0x85, 0x8d, 0x28, 0x11, 0xe3, 0xbc, 0x23, 0x4d, 0x7e, 0x61,
- 0x6c, 0x93, 0x7f, 0x0b, 0x48, 0x6c, 0x1f, 0x2b, 0xf1, 0x8a, 0xf1, 0xd4, 0xed, 0xcd, 0x21, 0x0e,
- 0x4c, 0x91, 0x1a, 0x31, 0x94, 0xa7, 0x8e, 0x77, 0x28, 0x97, 0xc6, 0x1f, 0xca, 0xe4, 0x4d, 0xb8,
- 0x28, 0x54, 0xa9, 0xf6, 0x89, 0x03, 0x4b, 0xe3, 0xff, 0x59, 0x05, 0x7c, 0x11, 0x47, 0x31, 0xe2,
- 0x68, 0x0c, 0xde, 0x3f, 0x86, 0x4b, 0x9b, 0x5c, 0xb9, 0x6e, 0x8d, 0x5e, 0x18, 0x96, 0x53, 0x78,
- 0x30, 0x55, 0x92, 0x0f, 0x31, 0xc6, 0x87, 0xa1, 0xbe, 0x6d, 0xd1, 0xa6, 0x4a, 0x5d, 0x07, 0x43,
- 0x6c, 0x73, 0xad, 0xa1, 0x28, 0x18, 0xe1, 0x4a, 0xb3, 0xd5, 0xd3, 0x47, 0xb4, 0xd5, 0x37, 0x44,
- 0xd0, 0xa7, 0x15, 0x5b, 0x12, 0x94, 0xc1, 0x0f, 0x0e, 0x23, 0x2c, 0x27, 0x19, 0x70, 0x58, 0x46,
- 0x2c, 0x95, 0x86, 0x6b, 0xf6, 0x98, 0x17, 0xc7, 0x3a, 0x95, 0x58, 0x2a, 0x53, 0x78, 0x30, 0x55,
- 0x92, 0x3b, 0x29, 0x3b, 0x54, 0xb7, 0xd8, 0x4e, 0x1c, 0xf0, 0x74, 0xdc, 0x49, 0x79, 0x79, 0x98,
- 0x05, 0xd3, 0xe4, 0x26, 0x31, 0x6f, 0xdf, 0xce, 0xc2, 0xb9, 0x1b, 0x54, 0x25, 0xc7, 0x37, 0x9c,
- 0xa6, 0x6f, 0xd7, 0xfe, 0x8f, 0xee, 0xb2, 0xde, 0xcd, 0xc2, 0xd4, 0x0d, 0xd7, 0xe9, 0xf7, 0xea,
- 0x7b, 0xa4, 0x0d, 0xc5, 0x07, 0x22, 0x22, 0xa2, 0xe2, 0x20, 0xe3, 0x9f, 0x03, 0x90, 0x81, 0x95,
- 0xd0, 0x04, 0xcb, 0x77, 0x54, 0xf0, 0xbc, 0xa5, 0x3a, 0x74, 0x8f, 0xca, 0xac, 0x58, 0x29, 0x6c,
- 0xa9, 0xdb, 0xbc, 0x10, 0x25, 0x8d, 0xbc, 0x05, 0x53, 0x1e, 0x73, 0x5c, 0xdf, 0x48, 0x4f, 0x12,
- 0xd1, 0xda, 0xa8, 0xbf, 0xd2, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f,
- 0x03, 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea,
- 0xf8, 0x61, 0xdf, 0x68, 0xa6, 0x52, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c,
- 0xa9, 0x15, 0x52, 0xb5, 0x43, 0x90, 0x98, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0xc7, 0x59, 0xb8,
- 0x70, 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xe6, 0xc8, 0xaf, 0x0d, 0x9d, 0x5b, 0xfb,
- 0xb9, 0xc3, 0x05, 0x41, 0xe4, 0xb1, 0xa7, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0xc3,
- 0x6a, 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e,
- 0xff, 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x06, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f,
- 0x48, 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0xc7, 0x19,
- 0x98, 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2,
- 0xa2, 0xd1, 0x83, 0x2c, 0xb7, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b,
- 0xdd, 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f,
- 0xe6, 0xdd, 0x42, 0xac, 0x78, 0xf2, 0xf7, 0xf6, 0x64, 0xc9, 0xdf, 0x78, 0x85, 0x86, 0x73, 0xc0,
- 0xbf, 0x31, 0x9c, 0x03, 0xbe, 0x3b, 0x79, 0x0e, 0x38, 0xd1, 0x0c, 0x23, 0x53, 0xc1, 0xdf, 0xce,
- 0xc1, 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64,
- 0x11, 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83,
- 0x5a, 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b,
- 0x58, 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x1b, 0x8c, 0x9f,
- 0xe3, 0x4a, 0x39, 0x2f, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x79, 0x84, 0x42, 0xfa,
- 0x79, 0x84, 0xc8, 0x02, 0x2b, 0xcf, 0x23, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6,
- 0x5d, 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xb7, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa,
- 0xf3, 0x67, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x39, 0xb4, 0x67, 0xa5, 0x3b,
- 0x3d, 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f,
- 0xce, 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a,
- 0x8f, 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xcf, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06,
- 0x73, 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x29, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x2a, 0x77,
- 0x05, 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32,
- 0x0c, 0xa8, 0xe4, 0xff, 0x43, 0x59, 0xc4, 0x7d, 0x96, 0xdc, 0xb6, 0x57, 0x2d, 0x8b, 0x4c, 0x94,
- 0xb0, 0xab, 0x0d, 0xbf, 0x10, 0x43, 0x3a, 0x79, 0x01, 0xa6, 0x65, 0x36, 0x4e, 0x1d, 0x99, 0x95,
- 0x7b, 0xac, 0x33, 0xfb, 0x83, 0xda, 0x74, 0x3d, 0x52, 0x8e, 0x31, 0x2e, 0xbe, 0x9f, 0xa2, 0x41,
- 0x70, 0x2c, 0xb9, 0x9f, 0x0a, 0xc3, 0x66, 0x18, 0xe1, 0x22, 0xcf, 0x42, 0x8e, 0x59, 0x9e, 0xd8,
- 0x43, 0x95, 0x42, 0xbf, 0x77, 0x73, 0xad, 0x81, 0xbc, 0x5c, 0xfb, 0x9f, 0x0c, 0x9c, 0x4e, 0x9c,
- 0x0c, 0xe2, 0x22, 0x7d, 0xd7, 0x52, 0x66, 0x24, 0x10, 0xd9, 0xc2, 0x35, 0xe4, 0xe5, 0xe4, 0x4d,
- 0xe5, 0x15, 0x66, 0x27, 0xbc, 0x1d, 0x70, 0x47, 0x67, 0x1e, 0x77, 0x03, 0x87, 0x1c, 0xc2, 0x6b,
- 0x89, 0xc6, 0xc9, 0xc5, 0x63, 0x6d, 0x07, 0x37, 0x50, 0x64, 0xc3, 0x99, 0x3f, 0xcc, 0x86, 0x53,
- 0xfb, 0xbb, 0x1c, 0x54, 0x6e, 0x39, 0xdb, 0x9f, 0x92, 0xb3, 0x0f, 0xe9, 0x16, 0x39, 0xfb, 0x33,
- 0xb4, 0xc8, 0x5b, 0xf0, 0x0c, 0x63, 0x7c, 0xd7, 0xef, 0xd8, 0x4d, 0x6f, 0xa9, 0xc5, 0xa8, 0xbb,
- 0x6a, 0xda, 0xa6, 0xb7, 0x43, 0x9b, 0x2a, 0x72, 0xf7, 0x99, 0xfd, 0x41, 0xed, 0x99, 0xcd, 0xcd,
- 0xb5, 0x34, 0x16, 0x1c, 0x25, 0x2b, 0x66, 0x88, 0x6e, 0x74, 0x9c, 0x56, 0x4b, 0x66, 0xb6, 0x65,
- 0x8e, 0x47, 0xce, 0x90, 0x48, 0x39, 0xc6, 0xb8, 0xb4, 0x8f, 0x32, 0x50, 0xbe, 0xad, 0xb7, 0x3a,
- 0x7a, 0xc3, 0xb4, 0x3b, 0xe4, 0x39, 0x98, 0xda, 0x76, 0x9d, 0x0e, 0x75, 0x3d, 0x95, 0x69, 0x16,
- 0xbb, 0x9e, 0xba, 0x2c, 0x42, 0x9f, 0xc6, 0xb7, 0x61, 0xcc, 0xe9, 0x99, 0x46, 0x72, 0xc3, 0xba,
- 0xc9, 0x0b, 0x51, 0xd2, 0xc8, 0x7d, 0x39, 0x8f, 0x72, 0x13, 0x1e, 0xad, 0xde, 0x5c, 0x6b, 0xc8,
- 0xec, 0xad, 0x3f, 0x03, 0xc9, 0xf3, 0x31, 0xcf, 0xa3, 0x3c, 0xca, 0x57, 0xd0, 0xbe, 0x97, 0x85,
- 0x8a, 0xfc, 0x34, 0xb9, 0x39, 0x3b, 0xce, 0x8f, 0x7b, 0x51, 0x44, 0xd7, 0xbd, 0x7e, 0x97, 0xba,
- 0x62, 0x13, 0xac, 0xa6, 0x5c, 0x34, 0x5a, 0x12, 0x12, 0x83, 0x08, 0x7b, 0x58, 0xe4, 0xb7, 0x4e,
- 0xfe, 0x04, 0x5b, 0xa7, 0x70, 0x60, 0xeb, 0xfc, 0x79, 0x06, 0xca, 0x6b, 0x66, 0x8b, 0x1a, 0x7b,
- 0x86, 0x45, 0xc9, 0xab, 0x50, 0x6d, 0x52, 0x8b, 0x32, 0x7a, 0xc3, 0xd5, 0x0d, 0xba, 0x41, 0x5d,
- 0x53, 0x5c, 0xa4, 0xe1, 0xa3, 0x4c, 0xcc, 0xe3, 0x82, 0x5c, 0x2e, 0x57, 0x46, 0xf0, 0xe0, 0x48,
- 0x69, 0x72, 0x13, 0xa6, 0x9b, 0xd4, 0x33, 0x5d, 0xda, 0xdc, 0x88, 0x78, 0xa3, 0xcf, 0xf9, 0xb6,
- 0x69, 0x25, 0x42, 0x7b, 0x34, 0xa8, 0xcd, 0x6c, 0x98, 0x3d, 0x6a, 0x99, 0x36, 0x95, 0x6e, 0x69,
- 0x4c, 0x54, 0x2b, 0x40, 0x6e, 0xcd, 0x69, 0x6b, 0xef, 0xe7, 0x20, 0xb8, 0x1a, 0x45, 0x7e, 0x2b,
- 0x03, 0x15, 0xdd, 0xb6, 0x1d, 0xa6, 0xae, 0x1d, 0xc9, 0xd8, 0x3e, 0x4e, 0x7c, 0x03, 0x6b, 0x7e,
- 0x29, 0x04, 0x95, 0x61, 0xe1, 0x20, 0x54, 0x1d, 0xa1, 0x60, 0x54, 0x37, 0xe9, 0x27, 0x22, 0xd5,
- 0xeb, 0x93, 0xd7, 0xe2, 0x10, 0x71, 0xe9, 0xd9, 0xaf, 0xc1, 0x99, 0x64, 0x65, 0x8f, 0x12, 0xd8,
- 0x9a, 0x24, 0x26, 0xf6, 0x6e, 0x19, 0x2a, 0x77, 0x74, 0x66, 0xee, 0x52, 0xb1, 0x05, 0x3b, 0x19,
- 0x9f, 0xfa, 0x0f, 0x33, 0x70, 0x21, 0x1e, 0x33, 0x3e, 0x41, 0xc7, 0x7a, 0x76, 0x7f, 0x50, 0xbb,
- 0x80, 0xa9, 0xda, 0x70, 0x44, 0x2d, 0x84, 0x8b, 0x3d, 0x14, 0x82, 0x3e, 0x69, 0x17, 0xbb, 0x31,
- 0x4a, 0x21, 0x8e, 0xae, 0xcb, 0xa7, 0xc5, 0xc5, 0x7e, 0xb2, 0xaf, 0xaa, 0x24, 0x36, 0x00, 0x53,
- 0x4f, 0xcc, 0x06, 0xa0, 0xf4, 0x44, 0x38, 0x5c, 0xbd, 0xc8, 0x06, 0xa0, 0x3c, 0x61, 0x1c, 0x54,
- 0xa5, 0x59, 0x25, 0xda, 0xa8, 0x8d, 0x84, 0x38, 0xfc, 0xe6, 0xfb, 0xc6, 0xc4, 0x80, 0xc2, 0xb6,
- 0xee, 0x99, 0x86, 0x72, 0x3f, 0xeb, 0xe3, 0x87, 0x25, 0xfc, 0x3b, 0x1d, 0x32, 0xc6, 0x24, 0x5e,
- 0x51, 0x62, 0x87, 0x77, 0x47, 0xb2, 0x13, 0xdd, 0x1d, 0x21, 0xcb, 0x90, 0xb7, 0xb9, 0xb1, 0xcd,
- 0x1d, 0xf9, 0xb6, 0xc8, 0x9d, 0xdb, 0x74, 0x0f, 0x85, 0xb0, 0xf6, 0xc3, 0x2c, 0x00, 0xff, 0x7c,
- 0xe5, 0xe6, 0x3c, 0x66, 0x33, 0xf2, 0x79, 0x98, 0xf2, 0xfa, 0x22, 0x5a, 0xab, 0x96, 0xe2, 0x30,
- 0x78, 0x2c, 0x8b, 0xd1, 0xa7, 0x73, 0x4f, 0xe8, 0xed, 0x3e, 0xed, 0xfb, 0xb1, 0xa0, 0xc0, 0x13,
- 0x7a, 0x85, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2,
- 0xbe, 0x99, 0x05, 0x08, 0x03, 0xfc, 0xe4, 0xfb, 0x19, 0x38, 0x1f, 0xcc, 0x32, 0x26, 0x6f, 0x24,
- 0x2c, 0x5b, 0xba, 0xd9, 0x9d, 0x78, 0x23, 0x93, 0x36, 0xc3, 0x85, 0xd9, 0xd9, 0x48, 0x53, 0x87,
- 0xe9, 0xb5, 0x20, 0x08, 0x25, 0xda, 0xed, 0xb1, 0xbd, 0x15, 0xd3, 0x55, 0xc3, 0x2e, 0xf5, 0x48,
- 0xff, 0x75, 0xc5, 0x23, 0x45, 0xd5, 0xcd, 0x0d, 0x31, 0x73, 0x7c, 0x0a, 0x06, 0x38, 0xda, 0x77,
- 0xb3, 0x70, 0x2e, 0xa5, 0x76, 0xe4, 0x25, 0x38, 0xa3, 0x32, 0x1c, 0xe1, 0xb5, 0xdc, 0x4c, 0x78,
- 0x2d, 0xb7, 0x91, 0xa0, 0xe1, 0x10, 0x37, 0x79, 0x13, 0x40, 0x37, 0x0c, 0xea, 0x79, 0xeb, 0x4e,
- 0xd3, 0x77, 0xfa, 0x5e, 0xe4, 0x9b, 0xca, 0xa5, 0xa0, 0xf4, 0xd1, 0xa0, 0xf6, 0xc5, 0xb4, 0x54,
- 0x55, 0xe2, 0xeb, 0x43, 0x01, 0x8c, 0x40, 0x92, 0x37, 0x00, 0xe4, 0x3d, 0x91, 0xe0, 0xb0, 0xe5,
- 0x63, 0x22, 0xe9, 0xf3, 0xfe, 0x1d, 0x86, 0xf9, 0x57, 0xfa, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f,
- 0x45, 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4,
- 0x4a, 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x17, 0x03, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec,
- 0xc8, 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7,
- 0x97, 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76,
- 0x7f, 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf,
- 0x1d, 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x44,
- 0x70, 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a,
- 0x6c, 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1,
- 0xef, 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13,
- 0x1c, 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06,
- 0xf5, 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03,
- 0x55, 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xa3, 0x22, 0x6c,
- 0x4f, 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe,
- 0x4e, 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0xae, 0x48, 0xe1,
- 0x98, 0x8c, 0xc7, 0x01, 0xf7, 0x45, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51,
- 0x8e, 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0,
- 0xcc, 0x94, 0x27, 0xeb, 0x5f, 0x37, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc,
- 0x62, 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c,
- 0x4b, 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a,
- 0x4d, 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0xff, 0x1d, 0xce, 0x7a, 0x71, 0x7b, 0x18, 0x06, 0x5d,
- 0xd6, 0x42, 0x18, 0x8c, 0x62, 0x92, 0xab, 0x50, 0xd9, 0x15, 0x33, 0x52, 0xde, 0xa6, 0x28, 0x08,
- 0x73, 0x2e, 0x2c, 0xec, 0xbd, 0xb0, 0x18, 0xa3, 0x3c, 0x5c, 0x44, 0x7a, 0x02, 0x52, 0xa4, 0x18,
- 0x8a, 0x34, 0xc2, 0x62, 0x8c, 0xf2, 0x88, 0x5c, 0x85, 0x69, 0x77, 0xa4, 0xc0, 0x94, 0x10, 0x90,
- 0xb9, 0x0a, 0xbf, 0x10, 0x43, 0x3a, 0xb9, 0x02, 0xa5, 0x7e, 0xb3, 0x25, 0x79, 0x4b, 0x82, 0x57,
- 0xf8, 0x5f, 0x5b, 0x2b, 0xab, 0xea, 0x76, 0x87, 0x4f, 0xd5, 0xfe, 0x33, 0x03, 0x64, 0x38, 0xa9,
- 0x4d, 0x76, 0xa0, 0x68, 0x8b, 0xa8, 0xca, 0xc4, 0xd7, 0xa5, 0x23, 0xc1, 0x19, 0x39, 0xc7, 0x54,
- 0x81, 0xc2, 0x27, 0x36, 0x94, 0xe8, 0x43, 0x46, 0x5d, 0x5b, 0xb7, 0x94, 0xeb, 0x71, 0x3c, 0x57,
- 0xb3, 0xa5, 0xc3, 0xa9, 0x90, 0x31, 0xd0, 0xa1, 0xfd, 0x24, 0x0b, 0x95, 0x08, 0xdf, 0xe3, 0x36,
- 0x2b, 0xe2, 0xcc, 0xa8, 0x0c, 0x66, 0x6c, 0xb9, 0x96, 0x1a, 0xa6, 0x91, 0x33, 0xa3, 0x8a, 0x84,
- 0x6b, 0x18, 0xe5, 0x23, 0x8b, 0x00, 0x5d, 0xdd, 0x63, 0xd4, 0x15, 0x4b, 0x49, 0xe2, 0xa4, 0xe6,
- 0x7a, 0x40, 0xc1, 0x08, 0x17, 0xb9, 0xac, 0x2e, 0xee, 0xe7, 0xe3, 0x97, 0xa6, 0x46, 0xdc, 0xca,
- 0x2f, 0x1c, 0xc3, 0xad, 0x7c, 0xd2, 0x86, 0x33, 0x7e, 0xad, 0x7d, 0xaa, 0xb2, 0x73, 0x87, 0x04,
- 0x96, 0xce, 0x78, 0x02, 0x02, 0x87, 0x40, 0xb5, 0x1f, 0x66, 0x60, 0x26, 0xb6, 0x95, 0xe6, 0x5b,
- 0xbb, 0xf0, 0x48, 0x46, 0x64, 0x6b, 0x17, 0x3b, 0x49, 0xf1, 0x3c, 0x14, 0x65, 0x03, 0xa9, 0x86,
- 0x0f, 0xcc, 0x88, 0x6c, 0x42, 0x54, 0x54, 0x6e, 0x10, 0x54, 0xb0, 0x2e, 0x69, 0x10, 0x54, 0x34,
- 0x0f, 0x7d, 0x3a, 0xf9, 0x02, 0x94, 0xfc, 0xda, 0xa9, 0x96, 0x0e, 0xff, 0xd9, 0xa0, 0xca, 0x31,
- 0xe0, 0xd0, 0xbe, 0x55, 0x00, 0xf9, 0xc3, 0x09, 0x2e, 0xd7, 0x34, 0x3d, 0x99, 0xa5, 0xca, 0x88,
- 0x2c, 0x55, 0x20, 0xb7, 0xa2, 0xca, 0x31, 0xe0, 0x20, 0x17, 0x21, 0xd7, 0x35, 0x6d, 0x15, 0x56,
- 0x14, 0xbb, 0xca, 0x75, 0xd3, 0x46, 0x5e, 0x26, 0x48, 0xfa, 0x43, 0x95, 0x68, 0x91, 0x24, 0xfd,
- 0x21, 0xf2, 0x32, 0xee, 0x5c, 0x5a, 0x8e, 0xd3, 0xd9, 0xd6, 0x8d, 0x8e, 0x1f, 0xfa, 0xce, 0x8b,
- 0xd9, 0x2b, 0x9c, 0xcb, 0xb5, 0x38, 0x09, 0x93, 0xbc, 0x5c, 0xdc, 0x70, 0x1c, 0xab, 0xe9, 0x3c,
- 0xb0, 0x7d, 0xf1, 0x42, 0x28, 0xbe, 0x1c, 0x27, 0x61, 0x92, 0x97, 0x6c, 0xc1, 0x33, 0xef, 0x50,
- 0xd7, 0x51, 0x2d, 0xd6, 0xb0, 0x28, 0xed, 0xf9, 0x30, 0xd2, 0x40, 0x89, 0xac, 0xd0, 0x6b, 0xe9,
- 0x2c, 0x38, 0x4a, 0x56, 0x24, 0x9b, 0x74, 0xb7, 0x4d, 0xd9, 0x86, 0xeb, 0xf0, 0xbd, 0x93, 0x69,
- 0xb7, 0x7d, 0xd8, 0xa9, 0x10, 0x76, 0x33, 0x9d, 0x05, 0x47, 0xc9, 0x92, 0x75, 0x38, 0x2b, 0x49,
- 0x11, 0x9f, 0x59, 0xd9, 0xba, 0xda, 0xfe, 0xa0, 0xf6, 0x99, 0x15, 0xda, 0x73, 0xa9, 0xc1, 0x0d,
- 0xf4, 0x66, 0x92, 0x0d, 0x87, 0x25, 0xc5, 0x6f, 0xa0, 0x54, 0xb8, 0x77, 0x83, 0xba, 0xa2, 0xcb,
- 0x45, 0xec, 0x48, 0x39, 0xe6, 0x98, 0xa0, 0xe1, 0x10, 0x37, 0x79, 0x15, 0xaa, 0x51, 0xd8, 0xa5,
- 0x5d, 0xdd, 0xb4, 0xf4, 0x6d, 0xd3, 0x32, 0xd9, 0x9e, 0xc8, 0x15, 0xcf, 0xc8, 0x60, 0xe4, 0xe6,
- 0x08, 0x1e, 0x1c, 0x29, 0xad, 0xfd, 0x41, 0x0e, 0xc4, 0x1f, 0x83, 0xc8, 0x7d, 0xc8, 0x59, 0x4e,
- 0x5b, 0x99, 0xe4, 0xf1, 0x23, 0x1d, 0x6b, 0x4e, 0x5b, 0x0e, 0xbc, 0x35, 0xa7, 0x8d, 0x1c, 0x91,
- 0x18, 0x50, 0xe8, 0xe8, 0xad, 0x8e, 0xae, 0x2c, 0xf0, 0xf8, 0xfe, 0x46, 0x90, 0xc8, 0x53, 0x37,
- 0x44, 0xf9, 0x2b, 0x4a, 0x6c, 0xee, 0xd8, 0x6c, 0xfb, 0xbf, 0x00, 0x51, 0x5b, 0xbf, 0x09, 0x62,
- 0x63, 0x3e, 0x92, 0x5c, 0x05, 0x83, 0x57, 0x0c, 0x75, 0x10, 0x03, 0x8a, 0xfd, 0xa6, 0xf8, 0x73,
- 0x53, 0x7e, 0x42, 0x2f, 0x66, 0x6b, 0x45, 0x7c, 0x93, 0x58, 0xbf, 0xe4, 0x33, 0x2a, 0x68, 0xed,
- 0x2f, 0x32, 0x30, 0xd3, 0xb0, 0xcc, 0xa6, 0x69, 0xb7, 0x4f, 0xee, 0x4e, 0x2e, 0xb9, 0x0b, 0x05,
- 0xcf, 0x32, 0x9b, 0x74, 0xcc, 0xcb, 0xa2, 0xa2, 0x33, 0x78, 0x2d, 0x29, 0x4a, 0x1c, 0xed, 0x4f,
- 0xf3, 0xa0, 0x7e, 0x73, 0x45, 0xfa, 0x50, 0x6e, 0xfb, 0x37, 0x57, 0x55, 0x95, 0x5f, 0x9e, 0xe0,
- 0x86, 0x43, 0xec, 0x0e, 0xac, 0xec, 0x9d, 0xa0, 0x10, 0x43, 0x4d, 0x84, 0xc6, 0xc7, 0xdc, 0xca,
- 0x84, 0x63, 0x4e, 0xaa, 0x1b, 0x1e, 0x75, 0x3a, 0xe4, 0x77, 0x18, 0xeb, 0x4d, 0x7c, 0x10, 0x37,
- 0x3c, 0x63, 0x2b, 0xc3, 0x78, 0xfc, 0x1d, 0x05, 0x34, 0x57, 0x61, 0xeb, 0xc7, 0x70, 0x7b, 0x3d,
- 0x0c, 0xa1, 0xaa, 0x08, 0xab, 0xce, 0x3c, 0x14, 0xd0, 0xe4, 0xd7, 0xa1, 0xc2, 0x5c, 0xdd, 0xf6,
- 0x5a, 0x8e, 0xdb, 0xa5, 0xae, 0x5a, 0xfc, 0x57, 0x27, 0x18, 0xcf, 0x9b, 0x21, 0x9a, 0x8c, 0x7a,
- 0xc4, 0x8a, 0x30, 0xaa, 0x4d, 0xeb, 0x82, 0x72, 0xdb, 0x89, 0x11, 0xfb, 0x4b, 0x80, 0xcc, 0x74,
- 0x2e, 0x1c, 0x6e, 0x2c, 0x06, 0x77, 0xc9, 0x23, 0x77, 0xeb, 0x52, 0x7f, 0x07, 0xa0, 0xfd, 0x73,
- 0x16, 0x72, 0x9b, 0x6b, 0x0d, 0x79, 0x55, 0x44, 0xfc, 0x34, 0x83, 0x36, 0x3a, 0x66, 0xef, 0x1e,
- 0x75, 0xcd, 0xd6, 0x9e, 0x5a, 0x7b, 0x23, 0x57, 0x45, 0x92, 0x1c, 0x98, 0x22, 0x45, 0x5e, 0x87,
- 0x69, 0x43, 0x5f, 0xa6, 0x2e, 0x93, 0x2e, 0xcc, 0xd1, 0xa2, 0xe6, 0xe2, 0x04, 0xc3, 0xf2, 0x52,
- 0x28, 0x8e, 0x31, 0x30, 0xb2, 0x05, 0x60, 0x84, 0xd0, 0x47, 0x8a, 0xa4, 0xcb, 0xdf, 0x22, 0x84,
- 0xc0, 0x11, 0x20, 0x82, 0x50, 0xee, 0x70, 0x56, 0x81, 0x9a, 0x3f, 0x0a, 0xaa, 0x98, 0x74, 0xb7,
- 0x7d, 0x59, 0x0c, 0x61, 0xb4, 0x7f, 0xcf, 0x40, 0xb8, 0x09, 0x24, 0x1e, 0x14, 0x9b, 0xe2, 0xd6,
- 0xb6, 0x9a, 0xf6, 0xe3, 0x6f, 0xa6, 0xe3, 0x3f, 0x23, 0xa9, 0x93, 0xfd, 0x41, 0x2d, 0xf1, 0x83,
- 0x12, 0x54, 0xaa, 0x48, 0x1b, 0x72, 0x6f, 0x39, 0xdb, 0x13, 0xcf, 0xfa, 0xc8, 0xf9, 0x1f, 0xb9,
- 0x73, 0x8a, 0x14, 0x20, 0xd7, 0xa0, 0x7d, 0x2b, 0x0b, 0x95, 0xc8, 0x98, 0x9e, 0xf8, 0xa7, 0x04,
- 0x0f, 0x13, 0x3f, 0x25, 0xd8, 0x18, 0x7f, 0x57, 0x1e, 0xd6, 0xea, 0xa4, 0xff, 0x4b, 0xf0, 0xb7,
- 0x59, 0xc8, 0x6d, 0xad, 0xac, 0xf2, 0xc5, 0x37, 0x38, 0x07, 0x34, 0x71, 0x62, 0x2a, 0xfc, 0xdf,
- 0x99, 0x18, 0x69, 0xc1, 0x2b, 0x86, 0x3a, 0xc8, 0x0e, 0x4c, 0x6d, 0xf7, 0x4d, 0x8b, 0x99, 0xf6,
- 0xc4, 0xa7, 0xce, 0xfc, 0x7f, 0x38, 0xa8, 0xe3, 0x32, 0x12, 0x15, 0x7d, 0x78, 0xd2, 0x86, 0xa9,
- 0xb6, 0xbc, 0x06, 0xa2, 0xe6, 0xde, 0x4b, 0xe3, 0xaf, 0x5e, 0x12, 0x47, 0x2a, 0x52, 0x2f, 0xe8,
- 0xa3, 0x6b, 0xdf, 0x00, 0xb5, 0xf8, 0x13, 0xef, 0x64, 0x5a, 0x33, 0x08, 0x0c, 0xa5, 0xb5, 0xa8,
- 0xf6, 0x1f, 0x19, 0x88, 0x5b, 0xe9, 0x4f, 0xbe, 0x53, 0x3b, 0xc9, 0x4e, 0x5d, 0x39, 0x8e, 0x39,
- 0x90, 0xde, 0xaf, 0xda, 0x5f, 0x67, 0xa1, 0xa8, 0x7e, 0x04, 0x7a, 0xf2, 0xd9, 0x0f, 0x1a, 0xcb,
- 0x7e, 0x2c, 0x4f, 0xf8, 0x5b, 0xc4, 0x91, 0xb9, 0x8f, 0x6e, 0x22, 0xf7, 0x31, 0xe9, 0xff, 0x17,
- 0x1f, 0x93, 0xf9, 0xf8, 0xfb, 0x0c, 0x9c, 0x92, 0x8c, 0x37, 0x6d, 0x8f, 0xe9, 0xb6, 0x21, 0x9c,
- 0x62, 0x19, 0x89, 0x9a, 0x38, 0xb4, 0xa7, 0xc2, 0xd0, 0xc2, 0x5d, 0x95, 0xcf, 0xa8, 0xa0, 0xf9,
- 0x66, 0x79, 0xc7, 0xf1, 0x98, 0x30, 0xb7, 0xd9, 0xf8, 0x26, 0xfb, 0x65, 0x55, 0x8e, 0x01, 0x47,
- 0x72, 0xf7, 0x5e, 0x18, 0xbd, 0x7b, 0xd7, 0xfe, 0x2c, 0x03, 0xd3, 0xd1, 0x3f, 0x4f, 0x8e, 0x9f,
- 0xc8, 0x49, 0xe4, 0x51, 0xb2, 0x27, 0x90, 0x47, 0xf9, 0x30, 0x03, 0xe0, 0x57, 0xf6, 0xc4, 0xb3,
- 0x28, 0xcd, 0x78, 0x16, 0x65, 0xe2, 0x6e, 0x4d, 0xcf, 0xa1, 0xfc, 0xa0, 0xe0, 0x7f, 0x92, 0xc8,
- 0xa0, 0xbc, 0x97, 0x81, 0x53, 0x7a, 0x2c, 0x2b, 0x31, 0xb1, 0x27, 0x91, 0x48, 0x72, 0x04, 0x7f,
- 0xea, 0x8c, 0x97, 0x63, 0x42, 0x2d, 0xb9, 0x06, 0xd3, 0x3d, 0x15, 0x2a, 0xbe, 0x13, 0x8e, 0xba,
- 0xe0, 0x00, 0xf2, 0x46, 0x84, 0x86, 0x31, 0xce, 0xc7, 0x64, 0x81, 0x72, 0xc7, 0x92, 0x05, 0x8a,
- 0x1e, 0x35, 0xcb, 0x1f, 0x78, 0xd4, 0xcc, 0x86, 0x72, 0xcb, 0x75, 0xba, 0x22, 0xd1, 0xa2, 0xfe,
- 0x8b, 0x38, 0x61, 0xf2, 0x26, 0x58, 0x54, 0x56, 0x7d, 0x5c, 0x0c, 0x55, 0xf0, 0x65, 0x9a, 0x39,
- 0x52, 0x5b, 0xf1, 0x38, 0xb4, 0x05, 0x53, 0x77, 0x53, 0xa2, 0xa2, 0x0f, 0x1f, 0x4f, 0xa6, 0x4c,
- 0x7d, 0x32, 0xc9, 0x14, 0xed, 0x9f, 0xb2, 0xbe, 0xbd, 0x68, 0x24, 0xee, 0x24, 0x65, 0x46, 0xdc,
- 0x49, 0x52, 0xb7, 0x6b, 0xa3, 0xe9, 0x86, 0xe7, 0xa1, 0xe8, 0x52, 0xdd, 0x73, 0x6c, 0x75, 0x4f,
- 0x3d, 0xb0, 0xb6, 0x28, 0x4a, 0x51, 0x51, 0xa3, 0x69, 0x89, 0xec, 0x63, 0xd2, 0x12, 0x5f, 0x88,
- 0x0c, 0x08, 0x99, 0xff, 0x0d, 0xe6, 0x76, 0xca, 0xa0, 0x10, 0x31, 0x4b, 0xf5, 0xbb, 0xfd, 0x42,
- 0x32, 0x66, 0xa9, 0x7e, 0x85, 0x1f, 0x70, 0x90, 0x26, 0x4c, 0x5b, 0xba, 0xc7, 0x44, 0x54, 0xaa,
- 0xb9, 0xc4, 0xc6, 0xc8, 0x79, 0x04, 0xd3, 0x66, 0x2d, 0x82, 0x83, 0x31, 0x54, 0xed, 0xf7, 0x32,
- 0x10, 0x36, 0xf9, 0x11, 0xa3, 0xa3, 0xaf, 0x42, 0xa9, 0xab, 0x3f, 0x5c, 0xa1, 0x96, 0xbe, 0x37,
- 0xc9, 0xdf, 0xaf, 0xd6, 0x15, 0x06, 0x06, 0x68, 0xda, 0x20, 0x03, 0xea, 0xc6, 0x2e, 0xa1, 0x50,
- 0x68, 0x99, 0x0f, 0x55, 0x7d, 0x26, 0xf1, 0x54, 0x22, 0xff, 0x5b, 0x93, 0xf1, 0x05, 0x51, 0x80,
- 0x12, 0x9d, 0x74, 0x61, 0xca, 0x93, 0xe1, 0x1f, 0xf5, 0x29, 0xe3, 0xef, 0xca, 0x63, 0x61, 0x24,
- 0x75, 0xdd, 0x57, 0x16, 0xa1, 0xaf, 0xa3, 0x3e, 0xff, 0xc1, 0xc7, 0x73, 0x4f, 0x7d, 0xf8, 0xf1,
- 0xdc, 0x53, 0x1f, 0x7d, 0x3c, 0xf7, 0xd4, 0x37, 0xf7, 0xe7, 0x32, 0x1f, 0xec, 0xcf, 0x65, 0x3e,
- 0xdc, 0x9f, 0xcb, 0x7c, 0xb4, 0x3f, 0x97, 0xf9, 0xd7, 0xfd, 0xb9, 0xcc, 0xef, 0xfe, 0xdb, 0xdc,
- 0x53, 0xaf, 0x95, 0x7c, 0xcc, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x5b, 0xd2, 0x27, 0xde,
- 0x63, 0x00, 0x00,
+ 0x6b, 0xfe, 0xa7, 0xef, 0xb6, 0x6a, 0xbf, 0x91, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4,
+ 0xc5, 0x8d, 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a,
+ 0x28, 0x7a, 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0x3b, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74,
+ 0x32, 0xd9, 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83,
+ 0x1a, 0x84, 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc,
+ 0x21, 0x0e, 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62,
+ 0x2f, 0x54, 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0xc8, 0xf3, 0x50,
+ 0x74, 0xec, 0xd5, 0xbe, 0x65, 0xa9, 0xd0, 0xc8, 0x29, 0xd5, 0x6e, 0xc5, 0xbb, 0xa2, 0x14, 0x15,
+ 0x55, 0xfb, 0xed, 0x0c, 0x40, 0xa8, 0x9d, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x27, 0x64, 0x5d, 0x7f,
+ 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0xfd, 0x92, 0x97, 0xa6, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97,
+ 0xbc, 0x04, 0x67, 0x64, 0xd1, 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x6f, 0x33, 0x32, 0x28, 0x51, 0x4f,
+ 0xd0, 0x70, 0x88, 0x5b, 0xd3, 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e,
+ 0x10, 0x84, 0xa2, 0x15, 0x56, 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x37, 0x41, 0x0c, 0x32, 0x6c, 0xd9,
+ 0x2e, 0x65, 0x3a, 0x37, 0x40, 0x2b, 0x7d, 0x15, 0x25, 0x93, 0xad, 0x29, 0x6b, 0xab, 0x90, 0xb4,
+ 0x17, 0xe0, 0xec, 0x50, 0x3f, 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x69, 0xb9, 0xbf,
+ 0x20, 0x1c, 0xa4, 0xdb, 0xbc, 0x00, 0x65, 0xb9, 0xf6, 0xdf, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43,
+ 0x78, 0xc0, 0x8f, 0x77, 0xff, 0x7c, 0xf7, 0x23, 0x9b, 0xea, 0x7e, 0xf4, 0xa1, 0xd8, 0x79, 0x10,
+ 0xb8, 0x27, 0x95, 0xc5, 0xf5, 0xf1, 0x47, 0xac, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x83, 0x8e,
+ 0x41, 0x67, 0xdf, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0x51,
+ 0x8e, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xd7, 0x75, 0x5c, 0xe9, 0xd5, 0x90, 0x8b, 0x90, 0x73,
+ 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0x9b, 0x78, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53,
+ 0xf5, 0x81, 0xf2, 0x26, 0x8f, 0xda, 0x73, 0xc2, 0xce, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xf7, 0xaf,
+ 0xeb, 0xb5, 0x1b, 0xe6, 0x3b, 0xd2, 0xb8, 0x16, 0xa4, 0xfb, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71,
+ 0xc3, 0xdd, 0xa1, 0x7b, 0xcb, 0xdc, 0x13, 0x12, 0xb3, 0x53, 0x19, 0xee, 0xdb, 0xaa, 0x0c, 0x03,
+ 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5,
+ 0xef, 0x64, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0xba, 0xb5, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x7b,
+ 0xa4, 0x6f, 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x47, 0x5e, 0x8d, 0x86, 0xcb,
+ 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xde, 0xec,
+ 0x01, 0x2e, 0x6f, 0x03, 0xa0, 0x17, 0x3a, 0x0d, 0x39, 0xc1, 0xf9, 0xb3, 0xbe, 0x9a, 0xa3, 0xf8,
+ 0x0b, 0x11, 0x98, 0x49, 0x96, 0xf1, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x8f, 0x5e, 0xed,
+ 0x58, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66,
+ 0x53, 0x65, 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb,
+ 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a,
+ 0xc1, 0x83, 0xc8, 0xf9, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c,
+ 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d,
+ 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3,
+ 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34,
+ 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef,
+ 0xc0, 0x2f, 0x41, 0x45, 0x45, 0x9c, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94,
+ 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xb9, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d,
+ 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0xfe, 0xf9, 0x1d, 0x9f, 0x80,
+ 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b,
+ 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21,
+ 0x03, 0xce, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x33, 0xba, 0x3c, 0xcc, 0x82,
+ 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6,
+ 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0x36, 0x13,
+ 0xc9, 0x67, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba,
+ 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91,
+ 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x05, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x6e,
+ 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc,
+ 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0xb9, 0x8c, 0x72, 0xfd, 0x19, 0x7f, 0x33, 0xb8,
+ 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0xa1, 0x8f, 0xea, 0x29,
+ 0x99, 0xfd, 0xf1, 0x23, 0x03, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31,
+ 0x14, 0xb1, 0xa3, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38,
+ 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x91, 0x2e, 0xb9, 0xe3, 0x88, 0x58, 0xfe, 0x20, 0xc7, 0x86,
+ 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4,
+ 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x5f, 0xca,
+ 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xbd, 0xa4, 0xd9, 0x7e, 0x73, 0xf2, 0x7e, 0x1b,
+ 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, 0x40, 0xc1, 0x08, 0x17,
+ 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, 0xc6, 0x79, 0x47, 0x9a,
+ 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x7e, 0x57, 0xe2, 0x15, 0xe3, 0x29, 0xde, 0x9b,
+ 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, 0x8d, 0x3f, 0x94, 0xc9,
+ 0x9b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, 0x0a, 0xf8, 0x22, 0x8e,
+ 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, 0x1a, 0xbd, 0x30, 0x2c,
+ 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, 0xa2, 0x4d, 0x95, 0xe2,
+ 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, 0xa7, 0x8f, 0x68, 0xab,
+ 0x6f, 0x88, 0xe0, 0x50, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x1c, 0x5a, 0x58, 0x4e, 0x32, 0xe0,
+ 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, 0xb1, 0x54, 0xa6, 0xf0,
+ 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, 0xe9, 0xb8, 0x93, 0xf2,
+ 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x9d, 0x85, 0x73, 0x37, 0xa8, 0x4a, 0xa2,
+ 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x9b, 0x85, 0xa9, 0x1b, 0xae, 0xd3,
+ 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, 0xc6, 0x3f, 0x2f, 0x20,
+ 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, 0x1e, 0x95, 0xd9, 0xb3,
+ 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x0b, 0xa6, 0x3c, 0xe6, 0xb8, 0xbe, 0x91,
+ 0x9e, 0x24, 0xf2, 0xb5, 0x51, 0x7f, 0xa5, 0x21, 0xa1, 0xe4, 0x46, 0x5e, 0xbd, 0xa0, 0xaf, 0x40,
+ 0xfb, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, 0x5e, 0xef, 0x07, 0xe1,
+ 0xa0, 0xd5, 0xf1, 0xc3, 0xc3, 0xd1, 0x8c, 0xa6, 0x8a, 0xcf, 0xf4, 0xd9, 0x0e, 0x0a, 0x74, 0xf2,
+ 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0x81, 0xa3, 0x56, 0x51, 0xf4, 0xe9, 0xda, 0x8f,
+ 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0x4b, 0xe0, 0x91, 0x5f, 0x19, 0x3a,
+ 0xdf, 0xf6, 0x33, 0x87, 0x0b, 0x82, 0xc8, 0xe3, 0x51, 0xeb, 0x94, 0xe9, 0xa1, 0x6d, 0x0a, 0xcb,
+ 0x22, 0x87, 0xda, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0xfe,
+ 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x0d, 0x28, 0x7a, 0x4c, 0x67,
+ 0x7d, 0x3f, 0xe0, 0xba, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, 0x3b, 0x2a, 0xa5, 0xda,
+ 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xd2, 0x50, 0xb3, 0x1f, 0x32, 0xf6,
+ 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0xd9, 0x70, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, 0x0a, 0x26, 0xa3, 0x5d,
+ 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, 0x65, 0xda, 0xfb, 0xd9,
+ 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0x24, 0xf1, 0xed, 0xc9, 0x92, 0xc4, 0xf1, 0x0a, 0x0d,
+ 0xe7, 0x8a, 0x7f, 0x6d, 0x38, 0x57, 0x7c, 0x77, 0xf2, 0x5c, 0x71, 0xa2, 0x19, 0x46, 0xa6, 0x8c,
+ 0xbf, 0x9d, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, 0xd4, 0x56, 0x1e, 0x3c,
+ 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, 0x5b, 0xd8, 0xe0, 0x85,
+ 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, 0xba, 0xd4, 0xf3, 0x42,
+ 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, 0x7b, 0x46, 0x95, 0x5e,
+ 0x18, 0x3f, 0x17, 0x96, 0x72, 0xae, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, 0xba, 0x82, 0x73, 0x0b,
+ 0x85, 0xf4, 0x73, 0x0b, 0x91, 0x05, 0x56, 0x9e, 0x5b, 0xf8, 0xfb, 0x12, 0x5c, 0x48, 0xef, 0x43,
+ 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xbe, 0x47, 0x16, 0xa3, 0x4f,
+ 0xff, 0x54, 0xe7, 0xd9, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, 0x24, 0x72, 0x6d, 0xcf,
+ 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, 0x76, 0x13, 0x7e, 0xf6,
+ 0x09, 0x9e, 0xb0, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, 0x91, 0x35, 0x21, 0xbf,
+ 0x0e, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x1f, 0xb2, 0x1b, 0x7f, 0xf4, 0x6f, 0x84,
+ 0x58, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, 0xf7, 0x54, 0xf2, 0x2c, 0x24, 0x60, 0x54, 0xe3, 0x13, 0x7e,
+ 0xa4, 0xee, 0x0a, 0x94, 0x3c, 0xca, 0x98, 0x69, 0xb7, 0x3d, 0xb1, 0x7b, 0x2b, 0xcb, 0xb9, 0xd2,
+ 0x50, 0x65, 0x18, 0x50, 0xc9, 0xff, 0x87, 0xb2, 0x88, 0xfb, 0x2c, 0xb9, 0x6d, 0xaf, 0x5a, 0x16,
+ 0x99, 0x28, 0x61, 0x57, 0x1b, 0x7e, 0x21, 0x86, 0x74, 0xf2, 0x02, 0x4c, 0xcb, 0x6c, 0x9c, 0x3a,
+ 0x5a, 0x2b, 0xf7, 0x58, 0x67, 0xf6, 0x07, 0xb5, 0xe9, 0x7a, 0xa4, 0x1c, 0x63, 0x5c, 0x7c, 0x3f,
+ 0x45, 0x83, 0xe0, 0x58, 0x72, 0x3f, 0x15, 0x86, 0xcd, 0x30, 0xc2, 0x45, 0x9e, 0x85, 0x1c, 0xb3,
+ 0x3c, 0xb1, 0x87, 0x2a, 0x85, 0x7e, 0xef, 0xe6, 0x5a, 0x03, 0x79, 0xb9, 0xf6, 0x3f, 0x19, 0x38,
+ 0x9d, 0x38, 0x41, 0xc4, 0x45, 0xfa, 0xae, 0xa5, 0xcc, 0x48, 0x20, 0xb2, 0x85, 0x6b, 0xc8, 0xcb,
+ 0xc9, 0x9b, 0xca, 0x2b, 0xcc, 0x4e, 0x78, 0x8b, 0xe0, 0x8e, 0xce, 0x3c, 0xee, 0x06, 0x0e, 0x39,
+ 0x84, 0xd7, 0x12, 0x8d, 0x93, 0x8b, 0xc7, 0xda, 0x0e, 0x6e, 0xa0, 0xc8, 0x86, 0x33, 0x7f, 0x98,
+ 0x0d, 0xa7, 0xf6, 0xb7, 0x39, 0xa8, 0xdc, 0x72, 0xb6, 0x3f, 0x25, 0x67, 0x24, 0xd2, 0x2d, 0x72,
+ 0xf6, 0xa7, 0x68, 0x91, 0xb7, 0xe0, 0x19, 0xc6, 0xf8, 0xae, 0xdf, 0xb1, 0x9b, 0xde, 0x52, 0x8b,
+ 0x51, 0x77, 0xd5, 0xb4, 0x4d, 0x6f, 0x87, 0x36, 0x55, 0xe4, 0xee, 0x33, 0xfb, 0x83, 0xda, 0x33,
+ 0x9b, 0x9b, 0x6b, 0x69, 0x2c, 0x38, 0x4a, 0x56, 0xcc, 0x10, 0xdd, 0xe8, 0x38, 0xad, 0x96, 0xcc,
+ 0x6c, 0xcb, 0x1c, 0x8f, 0x9c, 0x21, 0x91, 0x72, 0x8c, 0x71, 0x69, 0x1f, 0x65, 0xa0, 0x7c, 0x5b,
+ 0x6f, 0x75, 0xf4, 0x86, 0x69, 0x77, 0xc8, 0x73, 0x30, 0xb5, 0xed, 0x3a, 0x1d, 0xea, 0x7a, 0x2a,
+ 0xd3, 0x2c, 0x76, 0x3d, 0x75, 0x59, 0x84, 0x3e, 0x8d, 0x6f, 0xc3, 0x98, 0xd3, 0x33, 0x8d, 0xe4,
+ 0x86, 0x75, 0x93, 0x17, 0xa2, 0xa4, 0x91, 0xfb, 0x72, 0x1e, 0xe5, 0x26, 0x3c, 0x82, 0xbd, 0xb9,
+ 0xd6, 0x90, 0xd9, 0x5b, 0x7f, 0x06, 0x92, 0xe7, 0x63, 0x9e, 0x47, 0x79, 0x94, 0xaf, 0xa0, 0x7d,
+ 0x2f, 0x0b, 0x15, 0xf9, 0x69, 0x72, 0x73, 0x76, 0x9c, 0x1f, 0xf7, 0xa2, 0x88, 0xae, 0x7b, 0xfd,
+ 0x2e, 0x75, 0xc5, 0x26, 0x58, 0x4d, 0xb9, 0x68, 0xb4, 0x24, 0x24, 0x06, 0x11, 0xf6, 0xb0, 0xc8,
+ 0x6f, 0x9d, 0xfc, 0x09, 0xb6, 0x4e, 0xe1, 0xc0, 0xd6, 0xf9, 0xb3, 0x0c, 0x94, 0xd7, 0xcc, 0x16,
+ 0x35, 0xf6, 0x0c, 0x8b, 0x92, 0x57, 0xa1, 0xda, 0xa4, 0x16, 0x65, 0xf4, 0x86, 0xab, 0x1b, 0x74,
+ 0x83, 0xba, 0xa6, 0xb8, 0x70, 0xc3, 0x47, 0x99, 0x98, 0xc7, 0x05, 0xb9, 0x5c, 0xae, 0x8c, 0xe0,
+ 0xc1, 0x91, 0xd2, 0xe4, 0x26, 0x4c, 0x37, 0xa9, 0x67, 0xba, 0xb4, 0xb9, 0x11, 0xf1, 0x46, 0x9f,
+ 0xf3, 0x6d, 0xd3, 0x4a, 0x84, 0xf6, 0x68, 0x50, 0x9b, 0xd9, 0x30, 0x7b, 0xd4, 0x32, 0x6d, 0x2a,
+ 0xdd, 0xd2, 0x98, 0xa8, 0x56, 0x80, 0xdc, 0x9a, 0xd3, 0xd6, 0xde, 0xcf, 0x41, 0x70, 0x85, 0x8a,
+ 0xfc, 0x66, 0x06, 0x2a, 0xba, 0x6d, 0x3b, 0x4c, 0x5d, 0x4f, 0x92, 0xb1, 0x7d, 0x9c, 0xf8, 0xa6,
+ 0xd6, 0xfc, 0x52, 0x08, 0x2a, 0xc3, 0xc2, 0x41, 0xa8, 0x3a, 0x42, 0xc1, 0xa8, 0x6e, 0xd2, 0x4f,
+ 0x44, 0xaa, 0xd7, 0x27, 0xaf, 0xc5, 0x21, 0xe2, 0xd2, 0xb3, 0x5f, 0x83, 0x33, 0xc9, 0xca, 0x1e,
+ 0x25, 0xb0, 0x35, 0x49, 0x4c, 0xec, 0xdd, 0x32, 0x54, 0xee, 0xe8, 0xcc, 0xdc, 0xa5, 0x62, 0x0b,
+ 0x76, 0x32, 0x3e, 0xf5, 0x1f, 0x64, 0xe0, 0x42, 0x3c, 0x66, 0x7c, 0x82, 0x8e, 0xf5, 0xec, 0xfe,
+ 0xa0, 0x76, 0x01, 0x53, 0xb5, 0xe1, 0x88, 0x5a, 0x08, 0x17, 0x7b, 0x28, 0x04, 0x7d, 0xd2, 0x2e,
+ 0x76, 0x63, 0x94, 0x42, 0x1c, 0x5d, 0x97, 0x4f, 0x8b, 0x8b, 0xfd, 0x64, 0x5f, 0x69, 0x49, 0x6c,
+ 0x00, 0xa6, 0x9e, 0x98, 0x0d, 0x40, 0xe9, 0x89, 0x70, 0xb8, 0x7a, 0x91, 0x0d, 0x40, 0x79, 0xc2,
+ 0x38, 0xa8, 0x4a, 0xb3, 0x4a, 0xb4, 0x51, 0x1b, 0x09, 0x71, 0xf8, 0xcd, 0xf7, 0x8d, 0x89, 0x01,
+ 0x85, 0x6d, 0xdd, 0x33, 0x0d, 0xe5, 0x7e, 0xd6, 0xc7, 0x0f, 0x4b, 0xf8, 0x77, 0x3f, 0x64, 0x8c,
+ 0x49, 0xbc, 0xa2, 0xc4, 0x0e, 0xef, 0x98, 0x64, 0x27, 0xba, 0x63, 0x42, 0x96, 0x21, 0x6f, 0x73,
+ 0x63, 0x9b, 0x3b, 0xf2, 0xad, 0x92, 0x3b, 0xb7, 0xe9, 0x1e, 0x0a, 0x61, 0xed, 0x87, 0x59, 0x00,
+ 0xfe, 0xf9, 0xca, 0xcd, 0x79, 0xcc, 0x66, 0xe4, 0xf3, 0x30, 0xe5, 0xf5, 0x45, 0xb4, 0x56, 0x2d,
+ 0xc5, 0x61, 0xf0, 0x58, 0x16, 0xa3, 0x4f, 0xe7, 0x9e, 0xd0, 0xdb, 0x7d, 0xda, 0xf7, 0x63, 0x41,
+ 0x81, 0x27, 0xf4, 0x0a, 0x2f, 0x44, 0x49, 0x3b, 0x39, 0x47, 0xc6, 0xdf, 0x35, 0x15, 0x4e, 0x68,
+ 0xd7, 0xa4, 0x7d, 0x33, 0x0b, 0x10, 0x06, 0xf8, 0xc9, 0xf7, 0x33, 0x70, 0x3e, 0x98, 0x65, 0x4c,
+ 0xde, 0x5c, 0x58, 0xb6, 0x74, 0xb3, 0x3b, 0xf1, 0x46, 0x26, 0x6d, 0x86, 0x0b, 0xb3, 0xb3, 0x91,
+ 0xa6, 0x0e, 0xd3, 0x6b, 0x41, 0x10, 0x4a, 0xb4, 0xdb, 0x63, 0x7b, 0x2b, 0xa6, 0xab, 0x86, 0x5d,
+ 0xea, 0xd1, 0xff, 0xeb, 0x8a, 0x47, 0x8a, 0xaa, 0x1b, 0x1e, 0x62, 0xe6, 0xf8, 0x14, 0x0c, 0x70,
+ 0xb4, 0xef, 0x66, 0xe1, 0x5c, 0x4a, 0xed, 0xc8, 0x4b, 0x70, 0x46, 0x65, 0x38, 0xc2, 0xeb, 0xbb,
+ 0x99, 0xf0, 0xfa, 0x6e, 0x23, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x26, 0x80, 0x6e, 0x18, 0xd4, 0xf3,
+ 0xd6, 0x9d, 0xa6, 0xef, 0xf4, 0xbd, 0xc8, 0x37, 0x95, 0x4b, 0x41, 0xe9, 0xa3, 0x41, 0xed, 0x8b,
+ 0x69, 0xa9, 0xaa, 0xc4, 0xd7, 0x87, 0x02, 0x18, 0x81, 0x24, 0x6f, 0x00, 0xc8, 0xfb, 0x24, 0xc1,
+ 0x61, 0xcb, 0xc7, 0x44, 0xd2, 0xe7, 0xfd, 0xbb, 0x0e, 0xf3, 0xaf, 0xf4, 0x75, 0x9b, 0x99, 0x6c,
+ 0x4f, 0x1e, 0x9f, 0xbe, 0x17, 0xa0, 0x60, 0x04, 0x51, 0xfb, 0xeb, 0x2c, 0x94, 0x7c, 0x67, 0xf4,
+ 0x13, 0xc8, 0x95, 0xb4, 0x63, 0xb9, 0x92, 0xf1, 0x2f, 0x10, 0xfa, 0x55, 0x1e, 0x99, 0x1d, 0x71,
+ 0x12, 0xd9, 0x91, 0x1b, 0x93, 0xab, 0x3a, 0x38, 0x1f, 0xf2, 0x83, 0x2c, 0x9c, 0xf2, 0x59, 0xd5,
+ 0x39, 0xee, 0x2f, 0xc3, 0x8c, 0x4b, 0xf5, 0x66, 0x5d, 0x67, 0xc6, 0x8e, 0xe8, 0x3e, 0x79, 0x8a,
+ 0xfb, 0xec, 0xfe, 0xa0, 0x36, 0x83, 0x51, 0x02, 0xc6, 0xf9, 0xd2, 0x0e, 0x80, 0x67, 0x27, 0x3c,
+ 0x00, 0x9e, 0x3b, 0xca, 0x01, 0x70, 0xa2, 0x43, 0x85, 0xd7, 0x68, 0xd3, 0xec, 0x52, 0xa7, 0xef,
+ 0xff, 0xb1, 0xe0, 0xa8, 0x87, 0x87, 0xc5, 0xea, 0x8e, 0x21, 0x0c, 0x46, 0x31, 0xb5, 0x7f, 0xc8,
+ 0xc0, 0x74, 0xd8, 0x5e, 0x27, 0x9e, 0x31, 0x6a, 0xc5, 0x33, 0x46, 0x4b, 0x13, 0x0f, 0x87, 0x11,
+ 0x39, 0xa2, 0xdf, 0x2b, 0x86, 0x9f, 0x25, 0xb2, 0x42, 0xdb, 0x30, 0x6b, 0xa6, 0x26, 0x4a, 0x22,
+ 0xd6, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x27, 0x1e, 0x80, 0x42, 0xfa, 0x50, 0xda, 0xa5, 0x2e,
+ 0x33, 0x0d, 0xea, 0x7f, 0xdf, 0x8d, 0x89, 0xbd, 0x23, 0x79, 0x00, 0x20, 0x6c, 0xd3, 0x7b, 0x4a,
+ 0x01, 0x06, 0xaa, 0xc8, 0x36, 0x14, 0x68, 0xb3, 0x4d, 0xfd, 0xf3, 0xf3, 0x5f, 0x9d, 0xe8, 0xe6,
+ 0x45, 0xd8, 0x9e, 0xfc, 0xcd, 0x43, 0x09, 0x4d, 0x3c, 0x28, 0x5b, 0xfe, 0xf6, 0x5d, 0x8d, 0xc3,
+ 0xf1, 0x7d, 0x9d, 0x20, 0x10, 0x10, 0x1e, 0x42, 0x0d, 0x8a, 0x30, 0xd4, 0x43, 0x3a, 0xc1, 0x9d,
+ 0x92, 0xc2, 0x31, 0x19, 0x8f, 0x03, 0xee, 0x95, 0x78, 0x50, 0x7e, 0xa0, 0x33, 0xea, 0x76, 0x75,
+ 0xb7, 0xa3, 0x1c, 0xff, 0xf1, 0xbf, 0xf0, 0xbe, 0x8f, 0x14, 0x7e, 0x61, 0x50, 0x84, 0xa1, 0x1e,
+ 0xe2, 0x40, 0x99, 0x29, 0x4f, 0xd6, 0xbf, 0x96, 0x38, 0xbe, 0x52, 0xdf, 0x27, 0xf6, 0x64, 0x60,
+ 0x3b, 0x78, 0xc5, 0x50, 0x87, 0xf6, 0x28, 0x17, 0x9a, 0xc7, 0x4f, 0x3a, 0x45, 0xf8, 0x42, 0x3c,
+ 0x45, 0x38, 0x97, 0x4c, 0x11, 0x26, 0xa2, 0x31, 0x47, 0x4f, 0x12, 0xea, 0x50, 0xb1, 0x74, 0x8f,
+ 0x6d, 0xf5, 0x9a, 0x3a, 0x53, 0xf1, 0xe5, 0xca, 0xe2, 0xff, 0x3b, 0x9c, 0xf5, 0xe2, 0xf6, 0x30,
+ 0x0c, 0xba, 0xac, 0x85, 0x30, 0x18, 0xc5, 0x24, 0x57, 0xa1, 0xb2, 0x2b, 0x66, 0xa4, 0xbc, 0x4d,
+ 0x51, 0x10, 0xe6, 0x5c, 0x58, 0xd8, 0x7b, 0x61, 0x31, 0x46, 0x79, 0xb8, 0x88, 0xf4, 0x04, 0xa4,
+ 0x48, 0x31, 0x14, 0x69, 0x84, 0xc5, 0x18, 0xe5, 0x11, 0xb9, 0x0a, 0xd3, 0xee, 0x48, 0x81, 0x29,
+ 0x21, 0x20, 0x73, 0x15, 0x7e, 0x21, 0x86, 0x74, 0x72, 0x05, 0x4a, 0xfd, 0x66, 0x4b, 0xf2, 0x96,
+ 0x04, 0xaf, 0xf0, 0xbf, 0xb6, 0x56, 0x56, 0xd5, 0xed, 0x0e, 0x9f, 0xaa, 0xfd, 0x67, 0x06, 0xc8,
+ 0x70, 0x52, 0x9b, 0xec, 0x40, 0xd1, 0x16, 0x51, 0x95, 0x89, 0xaf, 0x55, 0x47, 0x82, 0x33, 0x72,
+ 0x8e, 0xa9, 0x02, 0x85, 0x4f, 0x6c, 0x28, 0xd1, 0x87, 0x8c, 0xba, 0xb6, 0x6e, 0x29, 0xd7, 0xe3,
+ 0x78, 0xae, 0x70, 0x4b, 0x87, 0x53, 0x21, 0x63, 0xa0, 0x43, 0xfb, 0x71, 0x16, 0x2a, 0x11, 0xbe,
+ 0xc7, 0x6d, 0x56, 0xc4, 0x99, 0x51, 0x19, 0xcc, 0xd8, 0x72, 0x2d, 0x35, 0x4c, 0x23, 0x67, 0x46,
+ 0x15, 0x09, 0xd7, 0x30, 0xca, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8, 0x2b, 0x96, 0x92, 0xc4,
+ 0x49, 0xcd, 0xf5, 0x80, 0x82, 0x11, 0x2e, 0x72, 0x59, 0x5d, 0xf0, 0xcf, 0xc7, 0x2f, 0x4d, 0x8d,
+ 0xb8, 0xbd, 0x5f, 0x38, 0x86, 0xdb, 0xfb, 0xa4, 0x0d, 0x67, 0xfc, 0x5a, 0xfb, 0x54, 0x65, 0xe7,
+ 0x0e, 0x09, 0x2c, 0x9d, 0xf1, 0x04, 0x04, 0x0e, 0x81, 0x6a, 0x3f, 0xcc, 0xc0, 0x4c, 0x6c, 0x2b,
+ 0xcd, 0xb7, 0x76, 0xe1, 0x91, 0x8c, 0xc8, 0xd6, 0x2e, 0x76, 0x92, 0xe2, 0x79, 0x28, 0xca, 0x06,
+ 0x52, 0x0d, 0x1f, 0x98, 0x11, 0xd9, 0x84, 0xa8, 0xa8, 0xdc, 0x20, 0xa8, 0x60, 0x5d, 0xd2, 0x20,
+ 0xa8, 0x68, 0x1e, 0xfa, 0x74, 0xf2, 0x05, 0x28, 0xf9, 0xb5, 0x53, 0x2d, 0x1d, 0xfe, 0xdb, 0x41,
+ 0x95, 0x63, 0xc0, 0xa1, 0x7d, 0xab, 0x00, 0xf2, 0xc7, 0x14, 0x5c, 0xae, 0x69, 0x7a, 0x32, 0x4b,
+ 0x95, 0x11, 0x59, 0xaa, 0x40, 0x6e, 0x45, 0x95, 0x63, 0xc0, 0x41, 0x2e, 0x42, 0xae, 0x6b, 0xda,
+ 0x2a, 0xac, 0x28, 0x76, 0x95, 0xeb, 0xa6, 0x8d, 0xbc, 0x4c, 0x90, 0xf4, 0x87, 0x2a, 0xd1, 0x22,
+ 0x49, 0xfa, 0x43, 0xe4, 0x65, 0xdc, 0xb9, 0xb4, 0x1c, 0xa7, 0xb3, 0xad, 0x1b, 0x1d, 0x3f, 0xf4,
+ 0x9d, 0x17, 0xb3, 0x57, 0x38, 0x97, 0x6b, 0x71, 0x12, 0x26, 0x79, 0xb9, 0xb8, 0xe1, 0x38, 0x56,
+ 0xd3, 0x79, 0x60, 0xfb, 0xe2, 0x85, 0x50, 0x7c, 0x39, 0x4e, 0xc2, 0x24, 0x2f, 0xd9, 0x82, 0x67,
+ 0xde, 0xa1, 0xae, 0xa3, 0x5a, 0xac, 0x61, 0x51, 0xda, 0xf3, 0x61, 0xa4, 0x81, 0x12, 0x59, 0xa1,
+ 0xd7, 0xd2, 0x59, 0x70, 0x94, 0xac, 0x48, 0x36, 0xe9, 0x6e, 0x9b, 0xb2, 0x0d, 0xd7, 0xe1, 0x7b,
+ 0x27, 0xd3, 0x6e, 0xfb, 0xb0, 0x53, 0x21, 0xec, 0x66, 0x3a, 0x0b, 0x8e, 0x92, 0x25, 0xeb, 0x70,
+ 0x56, 0x92, 0x22, 0x3e, 0xb3, 0xb2, 0x75, 0xb5, 0xfd, 0x41, 0xed, 0x33, 0x2b, 0xb4, 0xe7, 0x52,
+ 0x83, 0x1b, 0xe8, 0xcd, 0x24, 0x1b, 0x0e, 0x4b, 0x8a, 0xdf, 0x45, 0xa9, 0x70, 0xef, 0x06, 0x75,
+ 0x45, 0x97, 0x8b, 0xd8, 0x91, 0x72, 0xcc, 0x31, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x2a, 0x54, 0xa3,
+ 0xb0, 0x4b, 0xbb, 0xba, 0x69, 0xe9, 0xdb, 0xa6, 0x65, 0xb2, 0x3d, 0x91, 0x2b, 0x9e, 0x91, 0xc1,
+ 0xc8, 0xcd, 0x11, 0x3c, 0x38, 0x52, 0x5a, 0xfb, 0xfd, 0x1c, 0x88, 0x3f, 0x0b, 0x91, 0xfb, 0x90,
+ 0xb3, 0x9c, 0xb6, 0x32, 0xc9, 0xe3, 0x47, 0x3a, 0xd6, 0x9c, 0xb6, 0x1c, 0x78, 0x6b, 0x4e, 0x1b,
+ 0x39, 0x22, 0x31, 0xa0, 0xd0, 0xd1, 0x5b, 0x1d, 0x5d, 0x59, 0xe0, 0xf1, 0xfd, 0x8d, 0x20, 0x91,
+ 0xa7, 0x6e, 0x88, 0xf2, 0x57, 0x94, 0xd8, 0xdc, 0xb1, 0xd9, 0xf6, 0x7f, 0x15, 0xa2, 0xb6, 0x7e,
+ 0x13, 0xc4, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xaf, 0x18, 0xea, 0x20, 0x06, 0x14, 0xfb, 0x4d,
+ 0xf1, 0x87, 0xa7, 0xfc, 0x84, 0x5e, 0xcc, 0xd6, 0x8a, 0xf8, 0x26, 0xb1, 0x7e, 0xc9, 0x67, 0x54,
+ 0xd0, 0xda, 0x9f, 0x67, 0x60, 0xa6, 0x61, 0x99, 0x4d, 0xd3, 0x6e, 0x9f, 0xdc, 0x9d, 0x5c, 0x72,
+ 0x17, 0x0a, 0x9e, 0x65, 0x36, 0xe9, 0x98, 0x97, 0x45, 0x45, 0x67, 0xf0, 0x5a, 0x52, 0x94, 0x38,
+ 0xda, 0x9f, 0xe4, 0x41, 0xfd, 0x0e, 0x8b, 0xf4, 0xa1, 0xdc, 0xf6, 0x6f, 0xae, 0xaa, 0x2a, 0xbf,
+ 0x3c, 0xc1, 0x0d, 0x87, 0xd8, 0x1d, 0x58, 0xd9, 0x3b, 0x41, 0x21, 0x86, 0x9a, 0x08, 0x8d, 0x8f,
+ 0xb9, 0x95, 0x09, 0xc7, 0x9c, 0x54, 0x37, 0x3c, 0xea, 0x74, 0xc8, 0xef, 0x30, 0xd6, 0x9b, 0xf8,
+ 0x20, 0x6e, 0x78, 0xc6, 0x56, 0x86, 0xf1, 0xf8, 0x3b, 0x0a, 0x68, 0xae, 0xc2, 0xd6, 0x8f, 0xe1,
+ 0x96, 0x7b, 0x18, 0x42, 0x55, 0x11, 0x56, 0x9d, 0x79, 0x28, 0xa0, 0xc9, 0xaf, 0x42, 0x85, 0xb9,
+ 0xba, 0xed, 0xb5, 0x1c, 0xb7, 0x4b, 0x5d, 0xb5, 0xf8, 0xaf, 0x4e, 0x30, 0x9e, 0x37, 0x43, 0x34,
+ 0x19, 0xf5, 0x88, 0x15, 0x61, 0x54, 0x9b, 0xd6, 0x05, 0xe5, 0xb6, 0x13, 0x23, 0xf6, 0x37, 0x01,
+ 0x99, 0xe9, 0x5c, 0x38, 0xdc, 0x58, 0x0c, 0xee, 0x92, 0x47, 0xee, 0xd6, 0xa5, 0xfe, 0x36, 0x40,
+ 0xfb, 0xa7, 0x2c, 0xe4, 0x36, 0xd7, 0x1a, 0xf2, 0xaa, 0x88, 0xf8, 0xb9, 0x06, 0x6d, 0x74, 0xcc,
+ 0xde, 0x3d, 0xea, 0x9a, 0xad, 0x3d, 0xb5, 0xf6, 0x46, 0xae, 0x8a, 0x24, 0x39, 0x30, 0x45, 0x8a,
+ 0xbc, 0x0e, 0xd3, 0x86, 0xbe, 0x4c, 0x5d, 0x26, 0x5d, 0x98, 0xa3, 0x45, 0xcd, 0xc5, 0x09, 0x86,
+ 0xe5, 0xa5, 0x50, 0x1c, 0x63, 0x60, 0x64, 0x0b, 0xc0, 0x08, 0xa1, 0x8f, 0x14, 0x49, 0x97, 0xbf,
+ 0x4f, 0x08, 0x81, 0x23, 0x40, 0x04, 0xa1, 0xdc, 0xe1, 0xac, 0x02, 0x35, 0x7f, 0x14, 0x54, 0x31,
+ 0xe9, 0x6e, 0xfb, 0xb2, 0x18, 0xc2, 0x68, 0xff, 0x9e, 0x81, 0x70, 0x13, 0x48, 0x3c, 0x28, 0x36,
+ 0xc5, 0xad, 0x6d, 0x35, 0xed, 0xc7, 0xdf, 0x4c, 0xc7, 0x7f, 0x5a, 0x52, 0x27, 0xfb, 0x83, 0x5a,
+ 0xe2, 0x47, 0x26, 0xa8, 0x54, 0x91, 0x36, 0xe4, 0xde, 0x72, 0xb6, 0x27, 0x9e, 0xf5, 0x91, 0xf3,
+ 0x3f, 0x72, 0xe7, 0x14, 0x29, 0x40, 0xae, 0x41, 0xfb, 0x56, 0x16, 0x2a, 0x91, 0x31, 0x3d, 0xf1,
+ 0x4f, 0x09, 0x1e, 0x26, 0x7e, 0x4a, 0xb0, 0x31, 0xfe, 0xae, 0x3c, 0xac, 0xd5, 0x49, 0xff, 0x97,
+ 0xe0, 0x6f, 0xb2, 0x90, 0xdb, 0x5a, 0x59, 0xe5, 0x8b, 0x6f, 0x70, 0x0e, 0x68, 0xe2, 0xc4, 0x54,
+ 0xf8, 0x5f, 0x34, 0x31, 0xd2, 0x82, 0x57, 0x0c, 0x75, 0x90, 0x1d, 0x98, 0xda, 0xee, 0x9b, 0x16,
+ 0x33, 0xed, 0x89, 0x4f, 0x9d, 0xf9, 0xff, 0x70, 0x50, 0xc7, 0x65, 0x24, 0x2a, 0xfa, 0xf0, 0xa4,
+ 0x0d, 0x53, 0x6d, 0x79, 0x0d, 0x44, 0xcd, 0xbd, 0x97, 0xc6, 0x5f, 0xbd, 0x24, 0x8e, 0x54, 0xa4,
+ 0x5e, 0xd0, 0x47, 0xd7, 0xbe, 0x01, 0x6a, 0xf1, 0x27, 0xde, 0xc9, 0xb4, 0x66, 0x10, 0x18, 0x4a,
+ 0x6b, 0x51, 0xed, 0x3f, 0x32, 0x10, 0xb7, 0xd2, 0x9f, 0x7c, 0xa7, 0x76, 0x92, 0x9d, 0xba, 0x72,
+ 0x1c, 0x73, 0x20, 0xbd, 0x5f, 0xb5, 0xbf, 0xca, 0x42, 0x51, 0xfd, 0x30, 0xf4, 0xe4, 0xb3, 0x1f,
+ 0x34, 0x96, 0xfd, 0x58, 0x9e, 0xf0, 0xf7, 0x89, 0x23, 0x73, 0x1f, 0xdd, 0x44, 0xee, 0x63, 0xd2,
+ 0xff, 0x34, 0x3e, 0x26, 0xf3, 0xf1, 0x77, 0x19, 0x38, 0x25, 0x19, 0x6f, 0xda, 0x1e, 0xd3, 0x6d,
+ 0x43, 0x38, 0xc5, 0x32, 0x12, 0x35, 0x71, 0x68, 0x4f, 0x85, 0xa1, 0x85, 0xbb, 0x2a, 0x9f, 0x51,
+ 0x41, 0xf3, 0xcd, 0xf2, 0x8e, 0xe3, 0x31, 0x61, 0x6e, 0xb3, 0xf1, 0x4d, 0xf6, 0xcb, 0xaa, 0x1c,
+ 0x03, 0x8e, 0xe4, 0xee, 0xbd, 0x30, 0x7a, 0xf7, 0xae, 0xfd, 0x69, 0x06, 0xa6, 0xa3, 0x7f, 0xa8,
+ 0x1c, 0x3f, 0x91, 0x93, 0xc8, 0xa3, 0x64, 0x4f, 0x20, 0x8f, 0xf2, 0x61, 0x06, 0xc0, 0xaf, 0xec,
+ 0x89, 0x67, 0x51, 0x9a, 0xf1, 0x2c, 0xca, 0xc4, 0xdd, 0x9a, 0x9e, 0x43, 0xf9, 0x41, 0xc1, 0xff,
+ 0x24, 0x91, 0x41, 0x79, 0x2f, 0x03, 0xa7, 0xf4, 0x58, 0x56, 0x62, 0x62, 0x4f, 0x22, 0x91, 0xe4,
+ 0x08, 0xfe, 0xe8, 0x19, 0x2f, 0xc7, 0x84, 0x5a, 0x72, 0x0d, 0xa6, 0x7b, 0x2a, 0x54, 0x7c, 0x27,
+ 0x1c, 0x75, 0xc1, 0x01, 0xe4, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x8f, 0xc9, 0x02, 0xe5, 0x8e, 0x25,
+ 0x0b, 0x14, 0x3d, 0x6a, 0x96, 0x3f, 0xf0, 0xa8, 0x99, 0x0d, 0xe5, 0x96, 0xeb, 0x74, 0x45, 0xa2,
+ 0x45, 0xfd, 0x3f, 0x71, 0xc2, 0xe4, 0x4d, 0xb0, 0xa8, 0xac, 0xfa, 0xb8, 0x18, 0xaa, 0xe0, 0xcb,
+ 0x34, 0x73, 0xa4, 0xb6, 0xe2, 0x71, 0x68, 0x0b, 0xa6, 0xee, 0xa6, 0x44, 0x45, 0x1f, 0x3e, 0x9e,
+ 0x4c, 0x99, 0xfa, 0x64, 0x92, 0x29, 0xda, 0x3f, 0x66, 0x7d, 0x7b, 0xd1, 0x48, 0xdc, 0x49, 0xca,
+ 0x8c, 0xb8, 0x93, 0xa4, 0x6e, 0xd7, 0x46, 0xd3, 0x0d, 0xcf, 0x43, 0xd1, 0xa5, 0xba, 0xe7, 0xd8,
+ 0xc9, 0x7f, 0x85, 0xa1, 0x28, 0x45, 0x45, 0x8d, 0xa6, 0x25, 0xb2, 0x8f, 0x49, 0x4b, 0x7c, 0x21,
+ 0x32, 0x20, 0x64, 0xfe, 0x37, 0x98, 0xdb, 0x29, 0x83, 0x42, 0xc4, 0x2c, 0xd5, 0x6f, 0xf9, 0x0b,
+ 0xc9, 0x98, 0xa5, 0xfa, 0x65, 0x7e, 0xc0, 0x41, 0x9a, 0x30, 0x6d, 0xe9, 0x1e, 0x13, 0x51, 0xa9,
+ 0xe6, 0x12, 0x1b, 0x23, 0xe7, 0x11, 0x4c, 0x9b, 0xb5, 0x08, 0x0e, 0xc6, 0x50, 0xb5, 0xdf, 0xcd,
+ 0x40, 0xd8, 0xe4, 0x47, 0x8c, 0x8e, 0xbe, 0x0a, 0xa5, 0xae, 0xfe, 0x70, 0x85, 0x5a, 0xfa, 0xde,
+ 0x24, 0x7f, 0xbf, 0x5a, 0x57, 0x18, 0x18, 0xa0, 0x69, 0x83, 0x0c, 0xa8, 0x1b, 0xbb, 0x84, 0x42,
+ 0xa1, 0x65, 0x3e, 0x54, 0xf5, 0x99, 0xc4, 0x53, 0x89, 0xfc, 0x6f, 0x4d, 0xc6, 0x17, 0x44, 0x01,
+ 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0x86, 0x7f, 0xd4, 0xa7, 0x8c, 0xbf, 0x2b, 0x8f, 0x85, 0x91,
+ 0xd4, 0x75, 0x5f, 0x59, 0x84, 0xbe, 0x8e, 0xfa, 0xfc, 0x07, 0x1f, 0xcf, 0x3d, 0xf5, 0xe1, 0xc7,
+ 0x73, 0x4f, 0x7d, 0xf4, 0xf1, 0xdc, 0x53, 0xdf, 0xdc, 0x9f, 0xcb, 0x7c, 0xb0, 0x3f, 0x97, 0xf9,
+ 0x70, 0x7f, 0x2e, 0xf3, 0xd1, 0xfe, 0x5c, 0xe6, 0x5f, 0xf7, 0xe7, 0x32, 0xbf, 0xf3, 0x6f, 0x73,
+ 0x4f, 0xbd, 0x56, 0xf2, 0x31, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x46, 0x67, 0x87, 0xd1, 0x06,
+ 0x64, 0x00, 0x00,
}
func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) {
@@ -3166,6 +3167,11 @@ func (m *Edge) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ i -= len(m.OnFull)
+ copy(dAtA[i:], m.OnFull)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(m.OnFull)))
+ i--
+ dAtA[i] = 0x32
if m.Parallelism != nil {
i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism))
i--
@@ -6807,6 +6813,8 @@ func (m *Edge) Size() (n int) {
if m.Parallelism != nil {
n += 1 + sovGenerated(uint64(*m.Parallelism))
}
+ l = len(m.OnFull)
+ n += 1 + l + sovGenerated(uint64(l))
return n
}
@@ -8238,6 +8246,7 @@ func (this *Edge) String() string {
`Conditions:` + strings.Replace(this.Conditions.String(), "ForwardConditions", "ForwardConditions", 1) + `,`,
`Limits:` + strings.Replace(this.Limits.String(), "EdgeLimits", "EdgeLimits", 1) + `,`,
`Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`,
+ `OnFull:` + fmt.Sprintf("%v", this.OnFull) + `,`,
`}`,
}, "")
return s
@@ -11536,6 +11545,38 @@ func (m *Edge) Unmarshal(dAtA []byte) error {
}
}
m.Parallelism = &v
+ case 6:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field OnFull", 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.OnFull = string(dAtA[iNdEx:postIndex])
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto
index 9ac2592fbc..e6abdd67d3 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.proto
+++ b/pkg/apis/numaflow/v1alpha1/generated.proto
@@ -271,10 +271,16 @@ message Edge {
optional EdgeLimits limits = 4;
// Parallelism is only effective when the "to" vertex is a reduce vertex,
- // if it's provided, the default value is set to "1".
+ // if it's not provided, the default value is set to "1".
// Parallelism is ignored when the "to" vertex is not a reduce vertex.
// +optional
optional int32 parallelism = 5;
+
+ // OnFull specifies the behaviour for the write actions when the inter step buffer is full.
+ // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess".
+ // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest
+ // +optional
+ optional string onFull = 6;
}
message EdgeLimits {
diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
index d1044d4670..1fc84b3f42 100644
--- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go
+++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
@@ -898,11 +898,19 @@ func schema_pkg_apis_numaflow_v1alpha1_Edge(ref common.ReferenceCallback) common
},
"parallelism": {
SchemaProps: spec.SchemaProps{
- Description: "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
+ Description: "Parallelism is only effective when the \"to\" vertex is a reduce vertex, if it's not provided, the default value is set to \"1\". Parallelism is ignored when the \"to\" vertex is not a reduce vertex.",
Type: []string{"integer"},
Format: "int32",
},
},
+ "onFull": {
+ SchemaProps: spec.SchemaProps{
+ Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
},
Required: []string{"from", "to"},
},
diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go
index cad0614b4b..3ee53256be 100644
--- a/pkg/forward/forward.go
+++ b/pkg/forward/forward.go
@@ -23,6 +23,7 @@ import (
"context"
"fmt"
"math"
+ "strings"
"sync"
"time"
@@ -46,9 +47,11 @@ type InterStepDataForward struct {
ctx context.Context
// cancelFn cancels our new context, our cancellation is little more complex and needs to be well orchestrated, hence
// we need something more than a cancel().
- cancelFn context.CancelFunc
- fromBuffer isb.BufferReader
- toBuffers map[string]isb.BufferWriter
+ cancelFn context.CancelFunc
+ fromBuffer isb.BufferReader
+ toBuffers map[string]isb.BufferWriter
+ // key is the toBuffer name, value is the corresponding onFull action.
+ onFullActions map[string]string
FSD ToWhichStepDecider
UDF applier.MapApplier
fetchWatermark fetch.Fetcher
@@ -68,17 +71,13 @@ func NewInterStepDataForward(vertex *dfv1.Vertex,
fromStep isb.BufferReader,
toSteps map[string]isb.BufferWriter,
fsd ToWhichStepDecider,
+ onFullActions map[string]string,
applyUDF applier.MapApplier,
fetchWatermark fetch.Fetcher,
publishWatermark map[string]publish.Publisher,
opts ...Option) (*InterStepDataForward, error) {
- options := &options{
- retryInterval: time.Millisecond,
- readBatchSize: dfv1.DefaultReadBatchSize,
- udfConcurrency: dfv1.DefaultReadBatchSize,
- logger: logging.NewLogger(),
- }
+ options := DefaultOptions()
for _, o := range opts {
if err := o(options); err != nil {
return nil, err
@@ -92,6 +91,7 @@ func NewInterStepDataForward(vertex *dfv1.Vertex,
cancelFn: cancel,
fromBuffer: fromStep,
toBuffers: toSteps,
+ onFullActions: onFullActions,
FSD: fsd,
UDF: applyUDF,
fetchWatermark: fetchWatermark,
@@ -478,53 +478,73 @@ func (isdf *InterStepDataForward) writeToBuffers(ctx context.Context, messageToS
// writeToBuffer forwards an array of messages to a single buffer and is a blocking call or until shutdown has been initiated.
func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer isb.BufferWriter, messages []isb.Message) (writeOffsets []isb.Offset, err error) {
- var totalBytes float64
- for _, m := range messages {
- totalBytes += float64(len(m.Payload))
- }
- writeOffsets = make([]isb.Offset, 0, len(messages))
-retry:
- needRetry := false
+ var (
+ totalCount int
+ writeCount int
+ writeBytes float64
+ dropBytes float64
+ )
+ totalCount = len(messages)
+ writeOffsets = make([]isb.Offset, 0, totalCount)
+
for {
_writeOffsets, errs := toBuffer.Write(ctx, messages)
// Note: this is an unwanted memory allocation during a happy path. We want only minimal allocation since using failedMessages is an unlikely path.
- var failedMessages []isb.Message
- for idx := range messages {
- // use the messages index to index error, there is a 1:1 mapping
- err := errs[idx]
- // ATM there are no user defined errors during write, all are InternalErrors, and they require retry.
- if err != nil {
- needRetry = true
- // we retry only failed messages
- failedMessages = append(failedMessages, messages[idx])
- writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc()
- // a shutdown can break the blocking loop caused due to InternalErr
- if ok, _ := isdf.IsShuttingDown(); ok {
- err := fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs)
- platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc()
- return writeOffsets, err
+ failedMessages := make([]isb.Message, 0, len(messages))
+ needRetry := false
+
+ for idx, msg := range messages {
+ if err := errs[idx]; err != nil {
+ // ATM there are no user defined errors during write, all are InternalErrors.
+
+ // using `strings.Contains` to check BufferFull error type is not a good practice for two reasons:
+ // 1. it's an O(n) operation which, if being called frequently, can introduce performance issue.
+ // 2. it assumes that all the buffer implementations implement err.Error() to use "Buffer full" as error message content.
+ // TODO - a better way could be to declare a BufferFullError type and use type check instead of checking error message.
+ needRetry = !(isdf.onFullActions[toBuffer.GetName()] == dfv1.DropAndAckLatest && strings.Contains(err.Error(), "Buffer full"))
+ if needRetry {
+ // we retry only failed messages
+ failedMessages = append(failedMessages, msg)
+ writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc()
+ // a shutdown can break the blocking loop caused due to InternalErr
+ if ok, _ := isdf.IsShuttingDown(); ok {
+ platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc()
+ return writeOffsets, fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs)
+ }
+ } else {
+ // drop the message
+ dropBytes += float64(len(msg.Payload))
}
} else {
+ writeCount++
+ writeBytes += float64(len(msg.Payload))
// we support write offsets only for jetstream
if _writeOffsets != nil {
writeOffsets = append(writeOffsets, _writeOffsets[idx])
}
}
}
- // set messages to failed for the retry
+
if needRetry {
- isdf.opts.logger.Errorw("Retrying failed msgs", zap.Any("errors", errorArrayToMap(errs)))
+ isdf.opts.logger.Errorw("Retrying failed messages",
+ zap.Any("errors", errorArrayToMap(errs)),
+ zap.String("pipeline", isdf.pipelineName),
+ zap.String("vertex", isdf.vertexName),
+ zap.String("buffer", toBuffer.GetName()),
+ )
+ // set messages to failed for the retry
messages = failedMessages
// TODO: implement retry with backoff etc.
time.Sleep(isdf.opts.retryInterval)
- goto retry
} else {
break
}
}
- writeMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(len(messages)))
- writeBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(totalBytes)
+ dropMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(totalCount - writeCount))
+ dropBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(dropBytes)
+ writeMessagesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(float64(writeCount))
+ writeBytesCount.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Add(writeBytes)
return writeOffsets, nil
}
diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go
index bad829c86f..cb5bfb5632 100644
--- a/pkg/forward/forward_test.go
+++ b/pkg/forward/forward_test.go
@@ -96,6 +96,9 @@ func TestNewInterStepDataForward(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
@@ -110,7 +113,7 @@ func TestNewInterStepDataForward(t *testing.T) {
writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime)
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -226,6 +229,9 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -241,7 +247,7 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) {
fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -391,6 +397,9 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -405,7 +414,7 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) {
fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -572,6 +581,9 @@ func TestSourceInterStepDataForward(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
AbstractVertex: dfv1.AbstractVertex{
@@ -586,13 +598,13 @@ func TestSourceInterStepDataForward(t *testing.T) {
_, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
// verify if source watermark publisher is not set, NewInterStepDataForward throws.
- failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource))
+ failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource))
assert.True(t, failedForwarder == nil)
assert.Error(t, err)
assert.Equal(t, fmt.Errorf("failed to assign a non-nil source watermark publisher for source vertex data forwarder"), err)
// create a valid source forwarder
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{}))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{}))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -622,13 +634,17 @@ func TestSourceInterStepDataForward(t *testing.T) {
<-stopped
}
-// TestWriteToBufferError explicitly tests the case of retrying failed messages
-func TestWriteToBufferError(t *testing.T) {
+// TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess explicitly tests the case of retrying failed messages
+func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) {
fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
to1 := simplebuffer.NewInMemoryBuffer("to1", 10)
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -641,7 +657,7 @@ func TestWriteToBufferError(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -671,7 +687,46 @@ func TestWriteToBufferError(t *testing.T) {
assert.True(t, strings.Contains(err.Error(), "with failed messages:1"))
<-stopped
+}
+
+// TestWriteToBufferError_ActionOnFullIsDropAndAckLatest explicitly tests the case of dropping messages when buffer is full
+func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) {
+ fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
+ to1 := simplebuffer.NewInMemoryBuffer("to1", 10)
+ toSteps := map[string]isb.BufferWriter{
+ "to1": to1,
+ }
+ actionsOnFull := map[string]string{
+ "to1": dfv1.DropAndAckLatest,
+ }
+
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ defer cancel()
+ vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
+ PipelineName: "testPipeline",
+ AbstractVertex: dfv1.AbstractVertex{
+ Name: "testVertex",
+ },
+ }}
+ fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
+ assert.NoError(t, err)
+ assert.False(t, to1.IsFull())
+ assert.True(t, to1.IsEmpty())
+
+ stopped := f.Start()
+ writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime)
+ var messageToStep = make(map[string][]isb.Message)
+ messageToStep["to1"] = make([]isb.Message, 0)
+ messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...)
+ _, err = f.writeToBuffers(ctx, messageToStep)
+ // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DropAndAckLatest,
+ // the writeToBuffers() call should return no error.
+ assert.Nil(t, err)
+ // stop will cancel the contexts and therefore the forwarder stops without waiting
+ f.Stop()
+ <-stopped
}
// TestNewInterStepDataForwardToOneStep explicitly tests the case where we forward to only one buffer
@@ -683,6 +738,11 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) {
"to1": to1,
"to2": to2,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ "to2": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -697,7 +757,7 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) {
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -779,6 +839,11 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) {
"to1": to1,
"to2": to2,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ "to2": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -793,7 +858,7 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) {
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, actionsOnFull, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -872,6 +937,10 @@ func TestNewInterStepData_forwardToAll(t *testing.T) {
"to1": to1,
"to2": to2,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ "to2": dfv1.RetryUntilSuccess,
+ }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -885,7 +954,7 @@ func TestNewInterStepData_forwardToAll(t *testing.T) {
}}
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, actionsOnFull, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -970,6 +1039,10 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -983,7 +1056,7 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, actionsOnFull, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -1016,6 +1089,9 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -1029,7 +1105,7 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, actionsOnFull, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.True(t, to1.IsEmpty())
@@ -1063,6 +1139,10 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -1076,7 +1156,7 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, actionsOnFull, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.True(t, to1.IsEmpty())
diff --git a/pkg/forward/metrics.go b/pkg/forward/metrics.go
index 47cc6259a2..cc61a4b417 100644
--- a/pkg/forward/metrics.go
+++ b/pkg/forward/metrics.go
@@ -65,6 +65,20 @@ var writeMessagesError = promauto.NewCounterVec(prometheus.CounterOpts{
Help: "Total number of Write Errors",
}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"})
+// dropMessagesCount is used to indicate the number of messages dropped
+var dropMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{
+ Subsystem: "forwarder",
+ Name: "drop_total",
+ Help: "Total number of Messages Dropped",
+}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"})
+
+// dropBytesCount is to indicate the number of bytes dropped
+var dropBytesCount = promauto.NewCounterVec(prometheus.CounterOpts{
+ Subsystem: "forwarder",
+ Name: "drop_bytes_total",
+ Help: "Total number of Bytes Dropped",
+}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"})
+
// ackMessagesCount is used to indicate the number of messages acknowledged
var ackMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{
Subsystem: "forwarder",
@@ -121,12 +135,12 @@ var concurrentUDFProcessingTime = promauto.NewHistogramVec(prometheus.HistogramO
var udfReadMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{
Subsystem: "forwarder",
Name: "udf_read_total",
- Help: "Total number of Messages Read at UDF",
+ Help: "Total number of Messages Read by UDF",
}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"})
-// udfWriteMessagesCount is used to indicate the number of messages read by UDF
+// udfWriteMessagesCount is used to indicate the number of messages written by UDF
var udfWriteMessagesCount = promauto.NewCounterVec(prometheus.CounterOpts{
Subsystem: "forwarder",
Name: "udf_write_total",
- Help: "Total number of Messages Written at UDF",
+ Help: "Total number of Messages Written by UDF",
}, []string{metrics.LabelVertex, metrics.LabelPipeline, "buffer"})
diff --git a/pkg/forward/options.go b/pkg/forward/options.go
index 001b3c91c3..d3aa448d19 100644
--- a/pkg/forward/options.go
+++ b/pkg/forward/options.go
@@ -23,6 +23,7 @@ import (
dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
"github.com/numaproj/numaflow/pkg/isb"
+ "github.com/numaproj/numaflow/pkg/shared/logging"
)
// options for forwarding the message
@@ -43,6 +44,15 @@ type options struct {
type Option func(*options) error
+func DefaultOptions() *options {
+ return &options{
+ readBatchSize: dfv1.DefaultReadBatchSize,
+ udfConcurrency: dfv1.DefaultReadBatchSize,
+ retryInterval: time.Millisecond,
+ logger: logging.NewLogger(),
+ }
+}
+
// WithRetryInterval sets the retry interval
func WithRetryInterval(f time.Duration) Option {
return func(o *options) error {
diff --git a/pkg/forward/shutdown_test.go b/pkg/forward/shutdown_test.go
index 5b2f9231d0..b7f851ed07 100644
--- a/pkg/forward/shutdown_test.go
+++ b/pkg/forward/shutdown_test.go
@@ -47,6 +47,10 @@ func TestInterStepDataForward_Stop(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -61,7 +65,7 @@ func TestInterStepDataForward_Stop(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
stopped := f.Start()
// write some data but buffer is not full even though we are not reading
@@ -80,6 +84,10 @@ func TestInterStepDataForward_ForceStop(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -94,7 +102,7 @@ func TestInterStepDataForward_ForceStop(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
stopped := f.Start()
// write some data such that the fromBuffer can be empty, that is toBuffer gets full
diff --git a/pkg/isb/interfaces.go b/pkg/isb/interfaces.go
index 20a680f173..de18a3f7c1 100644
--- a/pkg/isb/interfaces.go
+++ b/pkg/isb/interfaces.go
@@ -51,6 +51,7 @@ type BufferWriter interface {
BufferWriterInformation
io.Closer
Write(context.Context, []Message) ([]Offset, []error)
+ IsFull() bool
}
// BufferReader is the buffer from which we are reading.
diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go
index b3bc025530..def0aeaed4 100644
--- a/pkg/isb/stores/jetstream/writer.go
+++ b/pkg/isb/stores/jetstream/writer.go
@@ -194,7 +194,7 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([
for i := 0; i < len(errs); i++ {
errs[i] = fmt.Errorf("unknown error")
}
- if jw.isFull.Load() {
+ if jw.IsFull() {
jw.log.Debugw("Is full")
isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc()
for i := 0; i < len(errs); i++ {
@@ -210,6 +210,11 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([
return jw.syncWrite(ctx, messages, errs, labels)
}
+// IsFull returns whether the buffer is full. It could be approximate.
+func (jw *jetStreamWriter) IsFull() bool {
+ return jw.isFull.Load()
+}
+
func (jw *jetStreamWriter) asyncWrite(_ context.Context, messages []isb.Message, errs []error, metricsLabels map[string]string) ([]isb.Offset, []error) {
var writeOffsets = make([]isb.Offset, len(messages))
var futures = make([]nats.PubAckFuture, len(messages))
diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go
index 942744295b..179f8d6b66 100644
--- a/pkg/isb/stores/jetstream/writer_test.go
+++ b/pkg/isb/stores/jetstream/writer_test.go
@@ -114,7 +114,7 @@ func TestForwarderJetStreamBuffer(t *testing.T) {
"to1": to1,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, map[string]string{"toStreamName": dfv1.RetryUntilSuccess}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
diff --git a/pkg/isb/stores/redis/read_test.go b/pkg/isb/stores/redis/read_test.go
index 3c0c98ee33..6bbe65e8c0 100644
--- a/pkg/isb/stores/redis/read_test.go
+++ b/pkg/isb/stores/redis/read_test.go
@@ -130,8 +130,11 @@ func TestRedisCheckBacklog(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": rqw,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10))
+ f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10))
stopped := f.Start()
// validate the length of the toStep stream.
@@ -314,6 +317,9 @@ func (suite *ReadWritePerformance) SetupSuite() {
toSteps := map[string]isb.BufferWriter{
"to1": rqw,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
@@ -323,7 +329,7 @@ func (suite *ReadWritePerformance) SetupSuite() {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
+ isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
suite.ctx = ctx
suite.rclient = client
@@ -410,8 +416,11 @@ func (suite *ReadWritePerformance) TestReadWriteLatencyPipelining() {
toSteps := map[string]isb.BufferWriter{
"to1": suite.rqw,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
+ suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
suite.False(suite.rqw.IsFull())
var writeMessages = make([]isb.Message, 0, suite.count)
diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go
index 6b1bcbfc84..1bc8b4e2e6 100644
--- a/pkg/isb/stores/redis/write_test.go
+++ b/pkg/isb/stores/redis/write_test.go
@@ -343,6 +343,9 @@ func TestNewInterStepDataForwardRedis(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
writeMessages, internalKeys := buildTestWriteMessages(fromStepWrite, int64(20), testStartTime)
@@ -356,7 +359,7 @@ func TestNewInterStepDataForwardRedis(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
assert.False(t, to1.IsFull())
@@ -392,6 +395,10 @@ func TestReadTimeout(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ }
+
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
AbstractVertex: dfv1.AbstractVertex{
@@ -400,7 +407,7 @@ func TestReadTimeout(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
// Call stop to end the test as we have a blocking read. The forwarder is up and running with no messages written
diff --git a/pkg/sinks/blackhole/blackhole.go b/pkg/sinks/blackhole/blackhole.go
index 259c767434..72877ccde8 100644
--- a/pkg/sinks/blackhole/blackhole.go
+++ b/pkg/sinks/blackhole/blackhole.go
@@ -71,7 +71,7 @@ func NewBlackhole(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWaterma
}
}
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sinks/blackhole/blackhole_test.go b/pkg/sinks/blackhole/blackhole_test.go
index 7c47e391ab..710efc72a0 100644
--- a/pkg/sinks/blackhole/blackhole_test.go
+++ b/pkg/sinks/blackhole/blackhole_test.go
@@ -118,7 +118,11 @@ func TestBlackhole_ForwardToTwoVertex(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ "to2": dfv1.RetryUntilSuccess,
+ }
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
diff --git a/pkg/sinks/kafka/kafka.go b/pkg/sinks/kafka/kafka.go
index 2d0920bd6f..deb86d1e80 100644
--- a/pkg/sinks/kafka/kafka.go
+++ b/pkg/sinks/kafka/kafka.go
@@ -84,7 +84,7 @@ func NewToKafka(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark
}
}
- f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
@@ -190,6 +190,10 @@ func (tk *ToKafka) Write(_ context.Context, messages []isb.Message) ([]isb.Offse
return nil, errs
}
+func (tk *ToKafka) IsFull() bool {
+ return false
+}
+
func (tk *ToKafka) Close() error {
tk.log.Info("Closing kafka producer...")
return tk.producer.Close()
diff --git a/pkg/sinks/kafka/kafka_test.go b/pkg/sinks/kafka/kafka_test.go
index c92890bf62..ff7a04eb72 100644
--- a/pkg/sinks/kafka/kafka_test.go
+++ b/pkg/sinks/kafka/kafka_test.go
@@ -47,7 +47,7 @@ func TestWriteSuccessToKafka(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromEdgeList(generic.GetBufferNameList(vertex.GetToBuffers()))
- toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
+ toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
toKafka.kafkaSink = vertex.Spec.Sink.Kafka
toKafka.name = "Test"
@@ -100,7 +100,7 @@ func TestWriteFailureToKafka(t *testing.T) {
}}
toSteps := map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
+ toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
toKafka.name = "Test"
toKafka.topic = "topic-1"
diff --git a/pkg/sinks/logger/log.go b/pkg/sinks/logger/log.go
index 4fdfb27bd7..5aba5a3c5e 100644
--- a/pkg/sinks/logger/log.go
+++ b/pkg/sinks/logger/log.go
@@ -72,7 +72,7 @@ func NewToLog(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark f
}
}
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sinks/logger/log_test.go b/pkg/sinks/logger/log_test.go
index 80f5f1d5e8..257ca15744 100644
--- a/pkg/sinks/logger/log_test.go
+++ b/pkg/sinks/logger/log_test.go
@@ -116,6 +116,10 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) {
"to1": to1,
"to2": to2,
}
+ actionsOnFull := map[string]string{
+ "to1": dfv1.RetryUntilSuccess,
+ "to2": dfv1.RetryUntilSuccess,
+ }
writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime)
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
@@ -125,7 +129,7 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
diff --git a/pkg/sinks/udsink/sink.go b/pkg/sinks/udsink/sink.go
index f0713c9bc5..1ca382b333 100644
--- a/pkg/sinks/udsink/sink.go
+++ b/pkg/sinks/udsink/sink.go
@@ -78,7 +78,7 @@ func NewUserDefinedSink(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchW
return nil, fmt.Errorf("failed to create gRPC client, %w", err)
}
s.udsink = udsink
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sources/generator/tickgen.go b/pkg/sources/generator/tickgen.go
index 6a8fcd9b33..4e0349cf76 100644
--- a/pkg/sources/generator/tickgen.go
+++ b/pkg/sources/generator/tickgen.go
@@ -154,6 +154,7 @@ func NewMemGen(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
+ onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -227,7 +228,7 @@ func NewMemGen(
gensrc.sourcePublishWM = gensrc.buildSourceWatermarkPublisher(publishWMStores)
// we pass in the context to forwarder as well so that it can shut down when we cancel the context
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sources/generator/tickgen_test.go b/pkg/sources/generator/tickgen_test.go
index 3465a5a8e7..8ab4c0f141 100644
--- a/pkg/sources/generator/tickgen_test.go
+++ b/pkg/sources/generator/tickgen_test.go
@@ -62,7 +62,7 @@ func TestRead(t *testing.T) {
"writer": dest,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
assert.NoError(t, err)
_ = mgen.Start()
@@ -106,7 +106,7 @@ func TestStop(t *testing.T) {
"writer": dest,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
assert.NoError(t, err)
stop := mgen.Start()
@@ -201,7 +201,7 @@ func TestWatermark(t *testing.T) {
Replica: 0,
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, nil, nil, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, nil, nil, publishWMStore)
assert.NoError(t, err)
stop := mgen.Start()
diff --git a/pkg/sources/http/http.go b/pkg/sources/http/http.go
index 729c575dcd..dcc3b9ef99 100644
--- a/pkg/sources/http/http.go
+++ b/pkg/sources/http/http.go
@@ -88,6 +88,7 @@ func New(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
+ onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -202,7 +203,7 @@ func New(
}
}
- h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
+ h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
h.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/http/http_test.go b/pkg/sources/http/http_test.go
index 9d959a84ca..88a333ed8f 100644
--- a/pkg/sources/http/http_test.go
+++ b/pkg/sources/http/http_test.go
@@ -69,7 +69,7 @@ func Test_NewHTTP(t *testing.T) {
dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)}
publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- h, err := New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores)
+ h, err := New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores)
assert.NoError(t, err)
assert.False(t, h.ready)
assert.Equal(t, v.Spec.Name, h.GetName())
diff --git a/pkg/sources/kafka/handler_test.go b/pkg/sources/kafka/handler_test.go
index 3b9f000a9b..79a2a5b0b1 100644
--- a/pkg/sources/kafka/handler_test.go
+++ b/pkg/sources/kafka/handler_test.go
@@ -66,7 +66,7 @@ func TestMessageHandling(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()),
+ ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()),
WithBufferSize(100), WithReadTimeOut(100*time.Millisecond))
msg := &sarama.ConsumerMessage{
diff --git a/pkg/sources/kafka/reader.go b/pkg/sources/kafka/reader.go
index 61142b17d5..4f641f4e1c 100644
--- a/pkg/sources/kafka/reader.go
+++ b/pkg/sources/kafka/reader.go
@@ -267,6 +267,7 @@ func NewKafkaSource(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
+ onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -343,7 +344,7 @@ func NewKafkaSource(
forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize)))
}
}
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
kafkasource.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/kafka/reader_test.go b/pkg/sources/kafka/reader_test.go
index 020b552cdf..508467487c 100644
--- a/pkg/sources/kafka/reader_test.go
+++ b/pkg/sources/kafka/reader_test.go
@@ -54,7 +54,7 @@ func TestNewKafkasource(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, err := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, err := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
// no errors if everything is good.
assert.Nil(t, err)
@@ -90,7 +90,7 @@ func TestGroupNameOverride(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, "default", ks.groupName)
@@ -116,7 +116,7 @@ func TestDefaultBufferSize(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, 100, ks.handlerbuffer)
@@ -142,7 +142,7 @@ func TestBufferSizeOverrides(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, 110, ks.handlerbuffer)
diff --git a/pkg/sources/nats/nats.go b/pkg/sources/nats/nats.go
index a18d92f7bc..9c07f4ee8f 100644
--- a/pkg/sources/nats/nats.go
+++ b/pkg/sources/nats/nats.go
@@ -61,6 +61,7 @@ func New(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
+ onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -94,7 +95,7 @@ func New(
forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize)))
}
}
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
n.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/nats/nats_test.go b/pkg/sources/nats/nats_test.go
index 51ea552ffa..615503fc3b 100644
--- a/pkg/sources/nats/nats_test.go
+++ b/pkg/sources/nats/nats_test.go
@@ -65,7 +65,7 @@ func newInstance(t *testing.T, vi *dfv1.VertexInstance) (*natsSource, error) {
dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)}
publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- return New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second))
+ return New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second))
}
func Test_Single(t *testing.T) {
diff --git a/pkg/sources/source.go b/pkg/sources/source.go
index bbed686966..dfd23034fb 100644
--- a/pkg/sources/source.go
+++ b/pkg/sources/source.go
@@ -139,9 +139,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
}
}()
readyChecker = t
- sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log)
+ sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), sp.getOnFullActions(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log)
} else {
- sourcer, err = sp.getSourcer(writers, forward.All, applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log)
+ sourcer, err = sp.getSourcer(writers, forward.All, sp.getOnFullActions(), applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log)
}
if err != nil {
return fmt.Errorf("failed to find a sourcer, error: %w", err)
@@ -179,6 +179,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
func (sp *SourceProcessor) getSourcer(
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
+ onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -193,7 +194,7 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, generator.WithReadTimeout(l.ReadTimeout.Duration))
}
- return generator.NewMemGen(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return generator.NewMemGen(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
} else if x := src.Kafka; x != nil {
readOptions := []kafka.Option{
kafka.WithGroupName(x.ConsumerGroupName),
@@ -202,9 +203,9 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, kafka.WithReadTimeOut(l.ReadTimeout.Duration))
}
- return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
} else if x := src.HTTP; x != nil {
- return http.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger))
+ return http.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger))
} else if x := src.Nats; x != nil {
readOptions := []nats.Option{
nats.WithLogger(logger),
@@ -212,7 +213,7 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, nats.WithReadTimeout(l.ReadTimeout.Duration))
}
- return nats.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return nats.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
}
return nil, fmt.Errorf("invalid source spec")
}
@@ -220,8 +221,9 @@ func (sp *SourceProcessor) getSourcer(
func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere {
shuffleFuncMap := make(map[string]*shuffle.Shuffle)
for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges {
+ bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)
if edge.Parallelism != nil && *edge.Parallelism > 1 {
- s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge))
+ s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), bufferNames)
shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s
}
}
@@ -244,3 +246,15 @@ func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere {
})
return fsd
}
+
+// getOnFullActions builds a mapping between the out-going buffers and their respective onFull action.
+func (sp *SourceProcessor) getOnFullActions() map[string]string {
+ onFullActions := make(map[string]string)
+ for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges {
+ bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)
+ for _, bn := range bufferNames {
+ onFullActions[bn] = edge.OnFull
+ }
+ }
+ return onFullActions
+}
diff --git a/pkg/udf/map_udf.go b/pkg/udf/map_udf.go
index d9d4506294..65c80646c8 100644
--- a/pkg/udf/map_udf.go
+++ b/pkg/udf/map_udf.go
@@ -73,13 +73,18 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error {
return fmt.Errorf("unrecognized isbsvc type %q", u.ISBSvcType)
}
- // Populate shuffle function map
+ // Populate shuffle function map and onFull actions map
shuffleFuncMap := make(map[string]*shuffle.Shuffle)
+ onFullActions := make(map[string]string)
for _, edge := range u.VertexInstance.Vertex.Spec.ToEdges {
+ bufferNames := dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge)
if edge.Parallelism != nil && *edge.Parallelism > 1 {
- s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge))
+ s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), bufferNames)
shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s
}
+ for _, bn := range bufferNames {
+ onFullActions[bn] = edge.OnFull
+ }
}
conditionalForwarder := forward.GoWhere(func(key string) ([]string, error) {
@@ -131,7 +136,7 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error {
}
}
- forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, udfHandler, fetchWatermark, publishWatermark, opts...)
+ forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, onFullActions, udfHandler, fetchWatermark, publishWatermark, opts...)
if err != nil {
return err
}
diff --git a/test/e2e/functional_test.go b/test/e2e-suite-1/functional_test.go
similarity index 100%
rename from test/e2e/functional_test.go
rename to test/e2e-suite-1/functional_test.go
diff --git a/test/e2e/testdata/even-odd.yaml b/test/e2e-suite-1/testdata/even-odd.yaml
similarity index 100%
rename from test/e2e/testdata/even-odd.yaml
rename to test/e2e-suite-1/testdata/even-odd.yaml
diff --git a/test/e2e/testdata/extract-event-time-from-payload.yaml b/test/e2e-suite-1/testdata/extract-event-time-from-payload.yaml
similarity index 100%
rename from test/e2e/testdata/extract-event-time-from-payload.yaml
rename to test/e2e-suite-1/testdata/extract-event-time-from-payload.yaml
diff --git a/test/e2e/testdata/simple-pipeline.yaml b/test/e2e-suite-1/testdata/simple-pipeline.yaml
similarity index 100%
rename from test/e2e/testdata/simple-pipeline.yaml
rename to test/e2e-suite-1/testdata/simple-pipeline.yaml
diff --git a/test/e2e/testdata/source-filtering.yaml b/test/e2e-suite-1/testdata/source-filtering.yaml
similarity index 100%
rename from test/e2e/testdata/source-filtering.yaml
rename to test/e2e-suite-1/testdata/source-filtering.yaml
diff --git a/test/e2e/testdata/udf-filtering.yaml b/test/e2e-suite-1/testdata/udf-filtering.yaml
similarity index 100%
rename from test/e2e/testdata/udf-filtering.yaml
rename to test/e2e-suite-1/testdata/udf-filtering.yaml
diff --git a/test/e2e/testdata/watermark.yaml b/test/e2e-suite-1/testdata/watermark.yaml
similarity index 100%
rename from test/e2e/testdata/watermark.yaml
rename to test/e2e-suite-1/testdata/watermark.yaml
diff --git a/test/e2e-suite-2/functional_test.go b/test/e2e-suite-2/functional_test.go
new file mode 100644
index 0000000000..2552452cb6
--- /dev/null
+++ b/test/e2e-suite-2/functional_test.go
@@ -0,0 +1,75 @@
+//go:build test
+
+/*
+Copyright 2022 The Numaproj Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package e2e
+
+import (
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/suite"
+
+ . "github.com/numaproj/numaflow/test/fixtures"
+)
+
+type FunctionalSuite struct {
+ E2ESuite
+}
+
+func (s *FunctionalSuite) TestDropOnFull() {
+ w := s.Given().Pipeline("@testdata/drop-on-full.yaml").
+ When().
+ CreatePipelineAndWait()
+ defer w.DeletePipelineAndWait()
+ pipelineName := "drop-on-full"
+
+ // wait for all the pods to come up
+ w.Expect().VertexPodsRunning()
+
+ // scale the sinks down to 0 pod to create a buffer full scenario.
+ scaleDownArgs := "kubectl scale vtx drop-on-full-drop-sink --replicas=0 -n numaflow-system"
+ w.Exec("/bin/sh", []string{"-c", scaleDownArgs}, CheckVertexScaled)
+ scaleDownArgs = "kubectl scale vtx drop-on-full-retry-sink --replicas=0 -n numaflow-system"
+ w.Exec("/bin/sh", []string{"-c", scaleDownArgs}, CheckVertexScaled)
+ w.Expect().
+ VertexSizeScaledTo("retry-sink", 0).
+ VertexSizeScaledTo("drop-sink", 0)
+
+ w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("1")))
+ // give buffer writer 2 seconds to update it's isFull attribute.
+ time.Sleep(time.Second * 2)
+ w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("2")))
+
+ // scale the sinks up to 1 pod to process the message from the buffer.
+ scaleUpArgs := "kubectl scale vtx drop-on-full-drop-sink --replicas=1 -n numaflow-system"
+ w.Exec("/bin/sh", []string{"-c", scaleUpArgs}, CheckVertexScaled)
+ scaleUpArgs = "kubectl scale vtx drop-on-full-retry-sink --replicas=1 -n numaflow-system"
+ w.Exec("/bin/sh", []string{"-c", scaleUpArgs}, CheckVertexScaled)
+ w.Expect().
+ VertexSizeScaledTo("retry-sink", 1).
+ VertexSizeScaledTo("drop-sink", 1)
+
+ w.Expect().SinkContains("retry-sink", "1")
+ w.Expect().SinkContains("retry-sink", "2")
+ w.Expect().SinkContains("drop-sink", "1")
+ w.Expect().SinkNotContains("drop-sink", "2")
+}
+
+func TestFunctionalSuite(t *testing.T) {
+ suite.Run(t, new(FunctionalSuite))
+}
diff --git a/test/e2e-suite-2/testdata/drop-on-full.yaml b/test/e2e-suite-2/testdata/drop-on-full.yaml
new file mode 100644
index 0000000000..964da5829f
--- /dev/null
+++ b/test/e2e-suite-2/testdata/drop-on-full.yaml
@@ -0,0 +1,34 @@
+apiVersion: numaflow.numaproj.io/v1alpha1
+kind: Pipeline
+metadata:
+ name: drop-on-full
+spec:
+ limits:
+ # Using the following limits for generating a buffer full scenario.
+ bufferMaxLength: 1
+ bufferUsageLimit: 100
+ vertices:
+ - name: in
+ source:
+ http: {}
+ - name: drop-sink
+ scale:
+ disabled: true
+ sink:
+ udsink:
+ container:
+ image: quay.io/numaio/numaflow-sink/redis-e2e-test-sink:latest
+ - name: retry-sink
+ scale:
+ disabled: true
+ sink:
+ udsink:
+ container:
+ image: quay.io/numaio/numaflow-sink/redis-e2e-test-sink:latest
+ edges:
+ - from: in
+ to: drop-sink
+ onFull: dropAndAckLatest
+ - from: in
+ to: retry-sink
+ onFull: retryUntilSuccess
\ No newline at end of file
diff --git a/test/fixtures/expect.go b/test/fixtures/expect.go
index 27a43915dc..4d433d7d5a 100644
--- a/test/fixtures/expect.go
+++ b/test/fixtures/expect.go
@@ -22,12 +22,13 @@ import (
"testing"
"time"
- dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
- flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1"
apierr "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
+
+ dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
+ flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1"
)
type Expect struct {
@@ -111,6 +112,21 @@ func (t *Expect) VertexPodsRunning() *Expect {
return t
}
+func (t *Expect) VertexSizeScaledTo(v string, size int) *Expect {
+ t.t.Helper()
+ ctx := context.Background()
+ if _, err := t.vertexClient.Get(ctx, t.pipeline.Name+"-"+v, metav1.GetOptions{}); err != nil {
+ t.t.Fatalf("Expected vertex %s existing: %v", v, err)
+ }
+
+ // check expected number of pods running
+ timeout := 2 * time.Minute
+ if err := WaitForVertexPodScalingTo(t.kubeClient, t.vertexClient, Namespace, t.pipeline.Name, v, timeout, size); err != nil {
+ t.t.Fatalf("Expected %d pods running on vertex %s : %v", size, v, err)
+ }
+ return t
+}
+
func (t *Expect) VertexPodLogContains(vertexName, regex string, opts ...PodLogCheckOption) *Expect {
t.t.Helper()
ctx := context.Background()
diff --git a/test/fixtures/util.go b/test/fixtures/util.go
index 51100e3800..5aab3c298e 100644
--- a/test/fixtures/util.go
+++ b/test/fixtures/util.go
@@ -29,14 +29,15 @@ import (
"testing"
"time"
- dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
- flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1"
"github.com/stretchr/testify/assert"
appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"
+
+ dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
+ flowpkg "github.com/numaproj/numaflow/pkg/client/clientset/versioned/typed/numaflow/v1alpha1"
)
var OutputRegexp = func(rx string) func(t *testing.T, output string, err error) {
@@ -53,6 +54,11 @@ var CheckPodKillSucceeded = func(t *testing.T, output string, err error) {
assert.NoError(t, err)
}
+var CheckVertexScaled = func(t *testing.T, output string, err error) {
+ assert.Contains(t, output, "scaled")
+ assert.NoError(t, err)
+}
+
func Exec(name string, args ...string) (string, error) {
cmd := exec.Command(name, args...)
cmd.Env = os.Environ()
@@ -253,6 +259,33 @@ func WaitForVertexPodRunning(kubeClient kubernetes.Interface, vertexClient flowp
}
}
+func WaitForVertexPodScalingTo(kubeClient kubernetes.Interface, vertexClient flowpkg.VertexInterface, namespace, pipelineName, vertexName string, timeout time.Duration, size int) error {
+ ctx, cancel := context.WithTimeout(context.Background(), timeout)
+ defer cancel()
+ labelSelector := fmt.Sprintf("%s=%s,%s=%s", dfv1.KeyPipelineName, pipelineName, dfv1.KeyVertexName, vertexName)
+ for {
+ select {
+ case <-ctx.Done():
+ return fmt.Errorf("timeout after %v waiting for vertex pod scaling", timeout)
+ default:
+ }
+ vertexList, err := vertexClient.List(ctx, metav1.ListOptions{LabelSelector: labelSelector})
+ if err != nil {
+ return fmt.Errorf("error getting vertex list: %w", err)
+ }
+ ok := len(vertexList.Items) == 1
+ podList, err := kubeClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{LabelSelector: labelSelector, FieldSelector: "status.phase=Running"})
+ if err != nil {
+ return fmt.Errorf("error getting vertex pod list: %w", err)
+ }
+ ok = ok && len(podList.Items) == size
+ if ok {
+ return nil
+ }
+ time.Sleep(2 * time.Second)
+ }
+}
+
func WaitForDaemonPodsRunning(kubeClient kubernetes.Interface, namespace, pipelineName string, timeout time.Duration) error {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
From dcea97f5f9c9cf0f6eb7f113ef864402747ebd1c Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Mon, 27 Mar 2023 17:58:33 -0400
Subject: [PATCH 2/6] Address comments
Signed-off-by: Keran Yang
---
api/json-schema/schema.json | 2 +-
api/openapi-spec/swagger.json | 2 +-
.../full/numaflow.numaproj.io_pipelines.yaml | 3 +-
.../full/numaflow.numaproj.io_vertices.yaml | 6 +-
config/install.yaml | 9 +-
config/namespace-install.yaml | 9 +-
docs/APIs.md | 15 +-
pkg/apis/numaflow/v1alpha1/const.go | 7 +-
pkg/apis/numaflow/v1alpha1/edge_types.go | 21 +-
pkg/apis/numaflow/v1alpha1/generated.pb.go | 739 +++++++++---------
pkg/apis/numaflow/v1alpha1/generated.proto | 5 +-
.../numaflow/v1alpha1/openapi_generated.go | 3 +-
.../v1alpha1/zz_generated.deepcopy.go | 5 +
pkg/forward/forward.go | 29 +-
pkg/forward/forward_test.go | 82 +-
pkg/forward/shutdown_test.go | 12 +-
pkg/isb/errors.go | 10 +
pkg/isb/interfaces.go | 1 -
pkg/isb/stores/jetstream/options.go | 19 +-
pkg/isb/stores/jetstream/writer.go | 23 +-
pkg/isb/stores/jetstream/writer_test.go | 58 +-
pkg/isb/stores/redis/options.go | 20 +-
pkg/isb/stores/redis/read_test.go | 15 +-
pkg/isb/stores/redis/write.go | 13 +-
pkg/isb/stores/redis/write_test.go | 51 +-
pkg/isb/stores/simplebuffer/buffer.go | 11 +-
pkg/isb/stores/simplebuffer/buffer_test.go | 25 +-
pkg/isb/stores/simplebuffer/options.go | 16 +-
pkg/sinks/blackhole/blackhole.go | 2 +-
pkg/sinks/blackhole/blackhole_test.go | 6 +-
pkg/sinks/kafka/kafka.go | 6 +-
pkg/sinks/kafka/kafka_test.go | 4 +-
pkg/sinks/logger/log.go | 2 +-
pkg/sinks/logger/log_test.go | 6 +-
pkg/sinks/udsink/sink.go | 2 +-
pkg/sources/generator/tickgen.go | 3 +-
pkg/sources/generator/tickgen_test.go | 6 +-
pkg/sources/http/http.go | 3 +-
pkg/sources/http/http_test.go | 2 +-
pkg/sources/kafka/handler_test.go | 2 +-
pkg/sources/kafka/reader.go | 3 +-
pkg/sources/kafka/reader_test.go | 8 +-
pkg/sources/nats/nats.go | 3 +-
pkg/sources/nats/nats_test.go | 2 +-
pkg/sources/source.go | 33 +-
pkg/udf/common.go | 8 +-
pkg/udf/map_udf.go | 11 +-
test/e2e-suite-2/testdata/drop-on-full.yaml | 2 +-
48 files changed, 721 insertions(+), 604 deletions(-)
diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json
index 6eb9fdfa36..028f638354 100644
--- a/api/json-schema/schema.json
+++ b/api/json-schema/schema.json
@@ -17659,7 +17659,7 @@
"description": "Limits define the limitations such as buffer read batch size for the edge, will override pipeline level settings."
},
"onFull": {
- "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
+ "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"",
"type": "string"
},
"parallelism": {
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index 08c77f1a77..7acc7cc5fb 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -17668,7 +17668,7 @@
"$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.EdgeLimits"
},
"onFull": {
- "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
+ "description": "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"",
"type": "string"
},
"parallelism": {
diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
index 8a71d09bf9..f09d67180c 100644
--- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
@@ -79,9 +79,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
index 1d4022dfeb..d3bcf54915 100644
--- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
@@ -593,9 +593,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
@@ -2768,9 +2767,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
diff --git a/config/install.yaml b/config/install.yaml
index ec7b1bac7d..64617d87a1 100644
--- a/config/install.yaml
+++ b/config/install.yaml
@@ -2377,9 +2377,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
@@ -8173,9 +8172,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
@@ -10348,9 +10346,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml
index 8780e2db19..70f25fed69 100644
--- a/config/namespace-install.yaml
+++ b/config/namespace-install.yaml
@@ -2377,9 +2377,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
@@ -8173,9 +8172,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
@@ -10348,9 +10346,8 @@ spec:
type: object
onFull:
enum:
- - ""
- retryUntilSuccess
- - dropAndAckLatest
+ - discardLatest
type: string
parallelism:
format: int32
diff --git a/docs/APIs.md b/docs/APIs.md
index 6b2b7a57f5..660951bc92 100644
--- a/docs/APIs.md
+++ b/docs/APIs.md
@@ -924,8 +924,9 @@ ignored when the “to” vertex is not a reduce vertex.
(Optional)
OnFull specifies the behaviour for the write actions when the inter step
-buffer is full. if not provided, the default value is set to “”, which
-currently has the same effect as “retryUntilSuccess”.
+buffer is full. There are currently two options, retryUntilSuccess and
+discardLatest. if not provided, the default value is set to
+“retryUntilSuccess”
@@ -2718,6 +2719,16 @@ Auth information
+
+OnFullWritingStrategy (string
alias)
+
+
+
+
+OnFullWritingStrategy is an edge-level specification to define the
+writing behaviour when the ToBuffer is full
+
+
PBQStorage
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index 971e89e528..d4399afdae 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -24,6 +24,9 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
)
+// OnFullWritingStrategy is an edge-level specification to define the writing behaviour when the ToBuffer is full
+type OnFullWritingStrategy string
+
const (
Project = "numaflow"
@@ -123,8 +126,8 @@ const (
DefaultReadBatchSize = 500
// Edge-level specification to define the writing behaviour when the ToBuffer is full
- RetryUntilSuccess = "retryUntilSuccess"
- DropAndAckLatest = "dropAndAckLatest"
+ RetryUntilSuccess OnFullWritingStrategy = "retryUntilSuccess"
+ DiscardLatest OnFullWritingStrategy = "discardLatest"
// Auto scaling
DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending
diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go
index 09aa3f0d00..a574bdd9d1 100644
--- a/pkg/apis/numaflow/v1alpha1/edge_types.go
+++ b/pkg/apis/numaflow/v1alpha1/edge_types.go
@@ -31,10 +31,11 @@ type Edge struct {
// +optional
Parallelism *int32 `json:"parallelism" protobuf:"bytes,5,opt,name=parallelism"`
// OnFull specifies the behaviour for the write actions when the inter step buffer is full.
- // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess".
- // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest
+ // There are currently two options, retryUntilSuccess and discardLatest.
+ // if not provided, the default value is set to "retryUntilSuccess"
+ // +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest
// +optional
- OnFull string `json:"onFull" protobuf:"bytes,6,opt,name=onFull"`
+ OnFull *string `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"`
}
type ForwardConditions struct {
@@ -51,3 +52,17 @@ type EdgeLimits struct {
// +optional
BufferUsageLimit *uint32 `json:"bufferUsageLimit,omitempty" protobuf:"varint,2,opt,name=bufferUsageLimit"`
}
+
+func (e Edge) OnFullWritingStrategy() OnFullWritingStrategy {
+ if e.OnFull == nil {
+ return RetryUntilSuccess
+ }
+ switch *e.OnFull {
+ case "retryUntilSuccess":
+ return RetryUntilSuccess
+ case "discardLatest":
+ return DiscardLatest
+ default:
+ return RetryUntilSuccess
+ }
+}
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index 7d9cb87e39..496370c87f 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -2037,364 +2037,364 @@ func init() {
}
var fileDescriptor_9d0d1b17d3865563 = []byte{
- // 5699 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57,
- 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9,
- 0x5a, 0x25, 0x9a, 0xfd, 0xff, 0x77, 0x6d, 0xc6, 0x64, 0xd9, 0x59, 0x60, 0x37, 0x71, 0xdb, 0xe3,
- 0xc9, 0xcc, 0xd8, 0x33, 0xce, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2,
- 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0x83, 0x94, 0x20, 0x16, 0x2d, 0x12,
- 0x42, 0x5a, 0xb1, 0x5a, 0x24, 0x24, 0x24, 0x04, 0xd2, 0x4a, 0x3c, 0xb0, 0x2f, 0xf0, 0xc2, 0x13,
- 0x0a, 0x3c, 0x40, 0x1e, 0x90, 0x08, 0x02, 0xb5, 0x88, 0x79, 0xe2, 0x01, 0xb4, 0x68, 0x5f, 0x56,
- 0x23, 0x24, 0xd0, 0xfd, 0xa8, 0xcf, 0xae, 0xf6, 0xd8, 0xdd, 0x76, 0x76, 0x22, 0xde, 0xaa, 0xee,
- 0x39, 0xe7, 0x77, 0x6e, 0xdd, 0x8f, 0x73, 0xcf, 0x3d, 0xe7, 0xde, 0x82, 0x1b, 0x6d, 0x93, 0xed,
- 0xf4, 0xb7, 0xe7, 0x0d, 0xa7, 0xbb, 0x60, 0xf7, 0xbb, 0x7a, 0xcf, 0x75, 0xde, 0x12, 0x0f, 0x2d,
- 0xcb, 0x79, 0xb0, 0xd0, 0xeb, 0xb4, 0x17, 0xf4, 0x9e, 0xe9, 0x85, 0x25, 0xbb, 0x57, 0x75, 0xab,
- 0xb7, 0xa3, 0x5f, 0x5d, 0x68, 0x53, 0x9b, 0xba, 0x3a, 0xa3, 0xcd, 0xf9, 0x9e, 0xeb, 0x30, 0x87,
- 0x7c, 0x39, 0x04, 0x9a, 0xf7, 0x81, 0xe6, 0x7d, 0xb1, 0xf9, 0x5e, 0xa7, 0x3d, 0xcf, 0x81, 0xc2,
- 0x12, 0x1f, 0x68, 0xf6, 0x8b, 0x91, 0x1a, 0xb4, 0x9d, 0xb6, 0xb3, 0x20, 0xf0, 0xb6, 0xfb, 0x2d,
- 0xf1, 0x26, 0x5e, 0xc4, 0x93, 0xd4, 0x33, 0xab, 0x75, 0xae, 0x79, 0xf3, 0xa6, 0xc3, 0xab, 0xb5,
- 0x60, 0x38, 0x2e, 0x5d, 0xd8, 0x1d, 0xaa, 0xcb, 0xec, 0x0b, 0x21, 0x4f, 0x57, 0x37, 0x76, 0x4c,
- 0x9b, 0xba, 0x7b, 0xfe, 0xb7, 0x2c, 0xb8, 0xd4, 0x73, 0xfa, 0xae, 0x41, 0x8f, 0x24, 0xe5, 0x2d,
- 0x74, 0x29, 0xd3, 0xd3, 0x74, 0x2d, 0x8c, 0x92, 0x72, 0xfb, 0x36, 0x33, 0xbb, 0xc3, 0x6a, 0x7e,
- 0xee, 0x71, 0x02, 0x9e, 0xb1, 0x43, 0xbb, 0x7a, 0x52, 0x4e, 0xfb, 0xe7, 0x32, 0x9c, 0x5b, 0xda,
- 0xf6, 0x98, 0xab, 0x1b, 0x6c, 0xc3, 0x69, 0x6e, 0xd2, 0x6e, 0xcf, 0xd2, 0x19, 0x25, 0x1d, 0x28,
- 0xf1, 0xba, 0x35, 0x75, 0xa6, 0x57, 0x33, 0x97, 0x33, 0x57, 0x2a, 0x8b, 0x4b, 0xf3, 0x63, 0xf6,
- 0xc5, 0xfc, 0xba, 0x02, 0xaa, 0x4f, 0xef, 0x0f, 0x6a, 0x25, 0xff, 0x0d, 0x03, 0x05, 0xe4, 0xbb,
- 0x19, 0x98, 0xb6, 0x9d, 0x26, 0x6d, 0x50, 0x8b, 0x1a, 0xcc, 0x71, 0xab, 0xd9, 0xcb, 0xb9, 0x2b,
- 0x95, 0xc5, 0x37, 0xc6, 0xd6, 0x98, 0xf2, 0x45, 0xf3, 0x77, 0x22, 0x0a, 0xae, 0xdb, 0xcc, 0xdd,
- 0xab, 0x3f, 0xfd, 0xc1, 0xa0, 0xf6, 0xd4, 0xfe, 0xa0, 0x36, 0x1d, 0x25, 0x61, 0xac, 0x26, 0x64,
- 0x0b, 0x2a, 0xcc, 0xb1, 0x78, 0x93, 0x99, 0x8e, 0xed, 0x55, 0x73, 0xa2, 0x62, 0x73, 0xf3, 0xb2,
- 0xb5, 0xb9, 0xfa, 0x79, 0x3e, 0x5c, 0xe6, 0x77, 0xaf, 0xce, 0x6f, 0x06, 0x6c, 0xf5, 0x73, 0x0a,
- 0xb8, 0x12, 0x96, 0x79, 0x18, 0xc5, 0x21, 0x14, 0x4e, 0x7b, 0xd4, 0xe8, 0xbb, 0x26, 0xdb, 0x5b,
- 0x76, 0x6c, 0x46, 0x1f, 0xb2, 0x6a, 0x5e, 0xb4, 0xf2, 0xf3, 0x69, 0xd0, 0x1b, 0x4e, 0xb3, 0x11,
- 0xe7, 0xae, 0x9f, 0xdb, 0x1f, 0xd4, 0x4e, 0x27, 0x0a, 0x31, 0x89, 0x49, 0x6c, 0x38, 0x63, 0x76,
- 0xf5, 0x36, 0xdd, 0xe8, 0x5b, 0x56, 0x83, 0x1a, 0x2e, 0x65, 0x5e, 0xb5, 0x20, 0x3e, 0xe1, 0x4a,
- 0x9a, 0x9e, 0x35, 0xc7, 0xd0, 0xad, 0xbb, 0xdb, 0x6f, 0x51, 0x83, 0x21, 0x6d, 0x51, 0x97, 0xda,
- 0x06, 0xad, 0x57, 0xd5, 0xc7, 0x9c, 0xb9, 0x99, 0x40, 0xc2, 0x21, 0x6c, 0x72, 0x03, 0xce, 0xf6,
- 0x5c, 0xd3, 0x11, 0x55, 0xb0, 0x74, 0xcf, 0xbb, 0xa3, 0x77, 0x69, 0xb5, 0x78, 0x39, 0x73, 0xa5,
- 0x5c, 0xbf, 0xa8, 0x60, 0xce, 0x6e, 0x24, 0x19, 0x70, 0x58, 0x86, 0x5c, 0x81, 0x92, 0x5f, 0x58,
- 0x9d, 0xba, 0x9c, 0xb9, 0x52, 0x90, 0x63, 0xc7, 0x97, 0xc5, 0x80, 0x4a, 0x56, 0xa1, 0xa4, 0xb7,
- 0x5a, 0xa6, 0xcd, 0x39, 0x4b, 0xa2, 0x09, 0x2f, 0xa5, 0x7d, 0xda, 0x92, 0xe2, 0x91, 0x38, 0xfe,
- 0x1b, 0x06, 0xb2, 0xe4, 0x16, 0x10, 0x8f, 0xba, 0xbb, 0xa6, 0x41, 0x97, 0x0c, 0xc3, 0xe9, 0xdb,
- 0x4c, 0xd4, 0xbd, 0x2c, 0xea, 0x3e, 0xab, 0xea, 0x4e, 0x1a, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x5e,
- 0x82, 0x33, 0x6a, 0xda, 0x85, 0xad, 0x00, 0x02, 0xe9, 0x69, 0xde, 0x90, 0x98, 0xa0, 0xe1, 0x10,
- 0x37, 0x69, 0xc2, 0x25, 0xbd, 0xcf, 0x9c, 0x2e, 0x87, 0x8c, 0x2b, 0xdd, 0x74, 0x3a, 0xd4, 0xae,
- 0x56, 0x2e, 0x67, 0xae, 0x94, 0xea, 0x97, 0xf7, 0x07, 0xb5, 0x4b, 0x4b, 0x07, 0xf0, 0xe1, 0x81,
- 0x28, 0xe4, 0x2e, 0x94, 0x9b, 0xb6, 0xb7, 0xe1, 0x58, 0xa6, 0xb1, 0x57, 0x9d, 0x16, 0x15, 0xbc,
- 0xaa, 0x3e, 0xb5, 0xbc, 0x72, 0xa7, 0x21, 0x09, 0x8f, 0x06, 0xb5, 0x4b, 0xc3, 0xd6, 0x71, 0x3e,
- 0xa0, 0x63, 0x88, 0x41, 0xd6, 0x05, 0xe0, 0xb2, 0x63, 0xb7, 0xcc, 0x76, 0x75, 0x46, 0xf4, 0xc6,
- 0xe5, 0x11, 0x03, 0x7a, 0xe5, 0x4e, 0x43, 0xf2, 0xd5, 0x67, 0x94, 0x3a, 0xf9, 0x8a, 0x21, 0xc2,
- 0xec, 0x8b, 0x70, 0x76, 0x68, 0xd6, 0x92, 0x33, 0x90, 0xeb, 0xd0, 0x3d, 0x61, 0x94, 0xca, 0xc8,
- 0x1f, 0xc9, 0xd3, 0x50, 0xd8, 0xd5, 0xad, 0x3e, 0xad, 0x66, 0x45, 0x99, 0x7c, 0xf9, 0xf9, 0xec,
- 0xb5, 0x8c, 0x36, 0x28, 0xc3, 0x29, 0xdf, 0x16, 0xdc, 0xa3, 0x2e, 0xa3, 0x0f, 0xc9, 0x65, 0xc8,
- 0xdb, 0xbc, 0x3f, 0x84, 0x7c, 0x7d, 0x5a, 0x7d, 0x6e, 0x5e, 0xf4, 0x83, 0xa0, 0x10, 0x03, 0x8a,
- 0xd2, 0x96, 0x0b, 0xbc, 0xca, 0xe2, 0x8b, 0x63, 0x9b, 0xa1, 0x86, 0x80, 0xa9, 0xc3, 0xfe, 0xa0,
- 0x56, 0x94, 0xcf, 0xa8, 0xa0, 0xc9, 0xeb, 0x90, 0xf7, 0x4c, 0xbb, 0x53, 0xcd, 0x09, 0x15, 0x5f,
- 0x1d, 0x5f, 0x85, 0x69, 0x77, 0xea, 0x25, 0xfe, 0x05, 0xfc, 0x09, 0x05, 0x28, 0xb9, 0x0f, 0xb9,
- 0x7e, 0xb3, 0xa5, 0x2c, 0xca, 0x2f, 0x8e, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4,
- 0x72, 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x32, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5,
- 0xc5, 0xb7, 0xac, 0xd5, 0x82, 0xd0, 0x73, 0x6b, 0x6c, 0x3d, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0x6e,
- 0x28, 0x86, 0x8a, 0x71, 0x58, 0x37, 0xf9, 0x5e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0xc4, 0x2c, 0xcc,
- 0xce, 0xf1, 0xd6, 0xea, 0xe2, 0xfe, 0xa0, 0x76, 0xfe, 0x66, 0x9a, 0x32, 0x4c, 0xaf, 0x03, 0xaf,
- 0xdd, 0x39, 0x7d, 0x78, 0x2d, 0x12, 0x26, 0xad, 0xb2, 0xb8, 0x76, 0x9c, 0xeb, 0x5b, 0xfd, 0x33,
- 0x6a, 0x28, 0xa7, 0x2d, 0xe7, 0x98, 0x56, 0x0b, 0x72, 0x1d, 0xa6, 0x76, 0x1d, 0xab, 0xdf, 0xa5,
- 0x5e, 0xb5, 0x24, 0x16, 0x85, 0xd9, 0xb4, 0xb9, 0x7a, 0x4f, 0xb0, 0xd4, 0x4f, 0x2b, 0xf8, 0x29,
- 0xf9, 0xee, 0xa1, 0x2f, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xb0, 0x96, 0x95, 0xc5,
- 0xeb, 0x63, 0x7f, 0x96, 0x9c, 0xa2, 0x6b, 0x02, 0x4c, 0xce, 0x1a, 0xf9, 0x8c, 0x4a, 0x01, 0x31,
- 0xa0, 0xe0, 0x19, 0xba, 0x25, 0xad, 0x69, 0x65, 0xf1, 0x6b, 0xe3, 0x4f, 0x1b, 0x8e, 0x52, 0x9f,
- 0x51, 0xdf, 0x54, 0x10, 0xaf, 0x28, 0xb1, 0xc9, 0x2f, 0xc3, 0xa9, 0x58, 0x6f, 0x7a, 0xd5, 0x8a,
- 0x68, 0x9d, 0x67, 0xd3, 0x5a, 0x27, 0xe0, 0xaa, 0x5f, 0x50, 0x60, 0xa7, 0x62, 0x23, 0xc4, 0xc3,
- 0x04, 0x18, 0xb9, 0x0d, 0x25, 0xcf, 0x6c, 0x52, 0x43, 0x77, 0xbd, 0xea, 0xf4, 0x61, 0x80, 0xcf,
- 0x28, 0xe0, 0x52, 0x43, 0x89, 0x61, 0x00, 0xa0, 0xdd, 0x87, 0x99, 0xa5, 0x3e, 0xdb, 0x71, 0x5c,
- 0xf3, 0x1d, 0xe1, 0x59, 0x90, 0x55, 0x28, 0x30, 0xb1, 0x42, 0x48, 0xa7, 0xed, 0xb9, 0x34, 0x68,
- 0xb9, 0x5a, 0xdf, 0xa6, 0x7b, 0xbe, 0x61, 0xad, 0x97, 0x79, 0x23, 0xc8, 0x15, 0x43, 0x8a, 0x6b,
- 0x7f, 0x98, 0x81, 0x72, 0x5d, 0xf7, 0x4c, 0x83, 0xc3, 0x93, 0x65, 0xc8, 0xf7, 0x3d, 0xea, 0x1e,
- 0x0d, 0x54, 0x58, 0xa5, 0x2d, 0x8f, 0xba, 0x28, 0x84, 0xc9, 0x5d, 0x28, 0xf5, 0x74, 0xcf, 0x7b,
- 0xe0, 0xb8, 0x4d, 0x65, 0x59, 0x0f, 0x09, 0x24, 0x97, 0x7e, 0x25, 0x8a, 0x01, 0x88, 0x56, 0x81,
- 0x72, 0xdd, 0xd2, 0x8d, 0xce, 0x8e, 0x63, 0x51, 0xed, 0x35, 0x28, 0xd6, 0xfb, 0xad, 0x16, 0x75,
- 0x0f, 0x61, 0xe1, 0xe7, 0x21, 0xcf, 0xf6, 0x7a, 0x6a, 0xbd, 0x08, 0x56, 0xf7, 0xfc, 0xe6, 0x5e,
- 0x8f, 0x3e, 0x1a, 0xd4, 0x40, 0xe2, 0xf0, 0x37, 0x14, 0x7c, 0xda, 0x8f, 0x33, 0x70, 0x4e, 0x16,
- 0xaa, 0x55, 0x54, 0xae, 0x4f, 0x84, 0x42, 0xc1, 0xa5, 0x4d, 0xd3, 0x53, 0xed, 0xb2, 0x32, 0xf6,
- 0x70, 0x44, 0x8e, 0xa2, 0x96, 0x43, 0xd1, 0x17, 0xa2, 0x00, 0x25, 0x3a, 0xe9, 0x43, 0xf9, 0x2d,
- 0xca, 0x3c, 0xe6, 0x52, 0xbd, 0xab, 0x5a, 0xee, 0xe5, 0xb1, 0x55, 0xdd, 0xa2, 0xac, 0x21, 0x90,
- 0xa2, 0xab, 0x6f, 0x50, 0x88, 0xa1, 0x26, 0xed, 0x27, 0x79, 0x28, 0x07, 0xa3, 0x90, 0x7c, 0x0e,
- 0x0a, 0xc2, 0xdd, 0x53, 0xcd, 0x1a, 0x4c, 0x1d, 0xe1, 0x15, 0xa2, 0xa4, 0x91, 0xe7, 0x60, 0xca,
- 0x70, 0xba, 0x5d, 0xdd, 0x6e, 0x0a, 0x17, 0xbe, 0x5c, 0xaf, 0x70, 0x8b, 0xb1, 0x2c, 0x8b, 0xd0,
- 0xa7, 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xf4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f,
- 0x45, 0x29, 0xf9, 0x0a, 0xe4, 0xa8, 0xbd, 0x5b, 0xcd, 0x8f, 0x36, 0x49, 0xd7, 0xed, 0xdd, 0x7b,
- 0xba, 0x5b, 0xaf, 0xa8, 0x3a, 0xe4, 0xae, 0xdb, 0xbb, 0xc8, 0x65, 0xc8, 0x1a, 0x4c, 0x51, 0x7b,
- 0x77, 0xd5, 0x75, 0xba, 0xca, 0xcd, 0xfd, 0xec, 0x08, 0x71, 0xce, 0xa2, 0x56, 0xe7, 0xc0, 0xb0,
- 0xa9, 0x62, 0xf4, 0x21, 0xc8, 0xd7, 0x61, 0x5a, 0xda, 0xb8, 0x75, 0xee, 0x32, 0x79, 0xd5, 0xa2,
- 0x80, 0xac, 0x8d, 0x36, 0x92, 0x82, 0x2f, 0xdc, 0x56, 0x44, 0x0a, 0x3d, 0x8c, 0x41, 0x91, 0xaf,
- 0x43, 0xd9, 0xdf, 0x31, 0x7a, 0x6a, 0x35, 0x48, 0xf5, 0xc8, 0x51, 0x31, 0x21, 0x7d, 0xbb, 0x6f,
- 0xba, 0xb4, 0x4b, 0x6d, 0xe6, 0xd5, 0xcf, 0xfa, 0x3e, 0x9a, 0x4f, 0xf5, 0x30, 0x44, 0x23, 0xdb,
- 0xc3, 0x5b, 0x0b, 0xe9, 0x17, 0x7f, 0x6e, 0xc4, 0x6c, 0x1b, 0x63, 0x5f, 0xf1, 0x06, 0x9c, 0x0e,
- 0x7c, 0x7f, 0xe5, 0x3e, 0x4a, 0x4f, 0xf9, 0x05, 0x2e, 0x7e, 0x33, 0x4e, 0x7a, 0x34, 0xa8, 0x3d,
- 0x9b, 0xe2, 0x40, 0x86, 0x0c, 0x98, 0x04, 0xd3, 0xfe, 0x2b, 0x0b, 0xc3, 0xcb, 0x7f, 0xbc, 0xd1,
- 0x32, 0xc7, 0xdd, 0x68, 0xc9, 0x0f, 0x92, 0xc6, 0xe1, 0x9a, 0x12, 0x9b, 0xfc, 0xa3, 0xd2, 0x3a,
- 0x26, 0x77, 0xdc, 0x1d, 0x33, 0xfe, 0xdc, 0xd1, 0xde, 0xcf, 0xc3, 0xa9, 0x15, 0x9d, 0x76, 0x1d,
- 0xfb, 0xb1, 0xee, 0x4b, 0xe6, 0x89, 0x70, 0x5f, 0xae, 0x40, 0xc9, 0xa5, 0x3d, 0xcb, 0x34, 0x74,
- 0x4f, 0x74, 0x96, 0xda, 0x23, 0xa2, 0x2a, 0xc3, 0x80, 0x3a, 0xc2, 0x6d, 0xcd, 0x3d, 0x91, 0x6e,
- 0x6b, 0xfe, 0xa7, 0xef, 0xb6, 0x6a, 0xbf, 0x91, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4,
- 0xc5, 0x8d, 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a,
- 0x28, 0x7a, 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0x3b, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74,
- 0x32, 0xd9, 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83,
- 0x1a, 0x84, 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc,
- 0x21, 0x0e, 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62,
- 0x2f, 0x54, 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0xc8, 0xf3, 0x50,
- 0x74, 0xec, 0xd5, 0xbe, 0x65, 0xa9, 0xd0, 0xc8, 0x29, 0xd5, 0x6e, 0xc5, 0xbb, 0xa2, 0x14, 0x15,
- 0x55, 0xfb, 0xed, 0x0c, 0x40, 0xa8, 0x9d, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x27, 0x64, 0x5d, 0x7f,
- 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0xfd, 0x92, 0x97, 0xa6, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97,
- 0xbc, 0x04, 0x67, 0x64, 0xd1, 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x6f, 0x33, 0x32, 0x28, 0x51, 0x4f,
- 0xd0, 0x70, 0x88, 0x5b, 0xd3, 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e,
- 0x10, 0x84, 0xa2, 0x15, 0x56, 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x37, 0x41, 0x0c, 0x32, 0x6c, 0xd9,
- 0x2e, 0x65, 0x3a, 0x37, 0x40, 0x2b, 0x7d, 0x15, 0x25, 0x93, 0xad, 0x29, 0x6b, 0xab, 0x90, 0xb4,
- 0x17, 0xe0, 0xec, 0x50, 0x3f, 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x69, 0xb9, 0xbf,
- 0x20, 0x1c, 0xa4, 0xdb, 0xbc, 0x00, 0x65, 0xb9, 0xf6, 0xdf, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43,
- 0x78, 0xc0, 0x8f, 0x77, 0xff, 0x7c, 0xf7, 0x23, 0x9b, 0xea, 0x7e, 0xf4, 0xa1, 0xd8, 0x79, 0x10,
- 0xb8, 0x27, 0x95, 0xc5, 0xf5, 0xf1, 0x47, 0xac, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x83, 0x8e,
- 0x41, 0x67, 0xdf, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a, 0x84, 0xed, 0x48, 0x51,
- 0x8e, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xd7, 0x75, 0x5c, 0xe9, 0xd5, 0x90, 0x8b, 0x90, 0x73,
- 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0x9b, 0x78, 0xdc, 0xd8, 0x42, 0x5e, 0x46, 0x5e, 0x85, 0x52, 0x53,
- 0xf5, 0x81, 0xf2, 0x26, 0x8f, 0xda, 0x73, 0xc2, 0xce, 0xfa, 0x6f, 0x18, 0xa0, 0x71, 0xf7, 0xaf,
- 0xeb, 0xb5, 0x1b, 0xe6, 0x3b, 0xd2, 0xb8, 0x16, 0xa4, 0xfb, 0xb7, 0x2e, 0x8b, 0xd0, 0xa7, 0x71,
- 0xc3, 0xdd, 0xa1, 0x7b, 0xcb, 0xdc, 0x13, 0x12, 0xb3, 0x53, 0x19, 0xee, 0xdb, 0xaa, 0x0c, 0x03,
- 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3, 0x05, 0xea, 0xf3, 0xb5,
- 0xef, 0x64, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0xba, 0xb5, 0x42, 0x7b, 0x96, 0xb3, 0xc7, 0x97, 0x7b,
- 0xa4, 0x6f, 0x93, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x47, 0x5e, 0x8d, 0x86, 0xcb,
- 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91, 0x09, 0x5d, 0xde, 0xec,
- 0x01, 0x2e, 0x6f, 0x03, 0xa0, 0x17, 0x3a, 0x0d, 0x39, 0xc1, 0xf9, 0xb3, 0xbe, 0x9a, 0xa3, 0xf8,
- 0x0b, 0x11, 0x98, 0x49, 0x96, 0xf1, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca, 0x02, 0x8f, 0x5e, 0xed,
- 0x58, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x2f, 0x03, 0x45, 0x4b, 0xdf, 0xa6, 0x96, 0x27, 0x66,
- 0x53, 0x65, 0xf1, 0xcd, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42, 0x43, 0x62, 0xc0, 0xcb,
- 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77, 0xc3, 0x71, 0x99, 0x5a,
- 0xc1, 0x83, 0xc8, 0xf9, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30, 0x2c, 0x93, 0xda, 0x4c,
- 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2, 0xaa, 0xba, 0x8e, 0x6d,
- 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09, 0x31, 0xca, 0x5c, 0xd3,
- 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72, 0xe4, 0xfb, 0x8f, 0x34,
- 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe, 0xd5, 0xa0, 0xcc, 0xef,
- 0xc0, 0x2f, 0x41, 0x45, 0x45, 0x9c, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54, 0x23, 0x24, 0x61, 0x94,
- 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xb9, 0x62, 0x1c, 0x4f, 0xbf, 0x0f, 0x55, 0xf0, 0x50, 0x7d,
- 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0xfe, 0xf9, 0x1d, 0x9f, 0x80,
- 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c, 0x46, 0x5d, 0x29, 0x9b,
- 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xd6, 0xe1, 0x9c, 0x21,
- 0x03, 0xce, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x33, 0xba, 0x3c, 0xcc, 0x82,
- 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6,
- 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67, 0x3b, 0x32, 0x36, 0x13,
- 0xc9, 0x67, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xb3, 0xb2, 0xfc, 0xba,
- 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91,
- 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x05, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7, 0x04, 0xac, 0xcc, 0x6e,
- 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c, 0xee, 0xed, 0x1a, 0xfc,
- 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0xb9, 0x8c, 0x72, 0xfd, 0x19, 0x7f, 0x33, 0xb8,
- 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0xa1, 0x8f, 0xea, 0x29,
- 0x99, 0xfd, 0xf1, 0x23, 0x03, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58, 0x8f, 0x47, 0x72, 0x31,
- 0x14, 0xb1, 0xa3, 0x84, 0xd9, 0x7f, 0x37, 0x69, 0xf6, 0x5f, 0x9f, 0x64, 0xfa, 0xa7, 0x68, 0x38,
- 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x91, 0x2e, 0xb9, 0xe3, 0x88, 0x58, 0xfe, 0x20, 0xc7, 0x86,
- 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d, 0x6a, 0xc5, 0xe1, 0xe4,
- 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49, 0x1a, 0xff, 0x5f, 0xca,
- 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xbd, 0xa4, 0xd9, 0x7e, 0x73, 0xf2, 0x7e, 0x1b,
- 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61, 0x40, 0xc1, 0x08, 0x17,
- 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22, 0xc6, 0x79, 0x47, 0x9a,
- 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x7e, 0x57, 0xe2, 0x15, 0xe3, 0x29, 0xde, 0x9b,
- 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e, 0x8d, 0x3f, 0x94, 0xc9,
- 0x9b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3, 0x0a, 0xf8, 0x22, 0x8e,
- 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd, 0x1a, 0xbd, 0x30, 0x2c,
- 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb, 0xa2, 0x4d, 0x95, 0xe2,
- 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab, 0xa7, 0x8f, 0x68, 0xab,
- 0x6f, 0x88, 0xe0, 0x50, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x1c, 0x5a, 0x58, 0x4e, 0x32, 0xe0,
- 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a, 0xb1, 0x54, 0xa6, 0xf0,
- 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0, 0xe9, 0xb8, 0x93, 0xf2,
- 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x9d, 0x85, 0x73, 0x37, 0xa8, 0x4a, 0xa2,
- 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x9b, 0x85, 0xa9, 0x1b, 0xae, 0xd3,
- 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41, 0xc6, 0x3f, 0x2f, 0x20,
- 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8, 0x1e, 0x95, 0xd9, 0xb3,
- 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x0b, 0xa6, 0x3c, 0xe6, 0xb8, 0xbe, 0x91,
- 0x9e, 0x24, 0xf2, 0xb5, 0x51, 0x7f, 0xa5, 0x21, 0xa1, 0xe4, 0x46, 0x5e, 0xbd, 0xa0, 0xaf, 0x40,
- 0xfb, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42, 0x5e, 0xef, 0x07, 0xe1,
- 0xa0, 0xd5, 0xf1, 0xc3, 0xc3, 0xd1, 0x8c, 0xa6, 0x8a, 0xcf, 0xf4, 0xd9, 0x0e, 0x0a, 0x74, 0xf2,
- 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0x81, 0xa3, 0x56, 0x51, 0xf4, 0xe9, 0xda, 0x8f,
- 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0x4b, 0xe0, 0x91, 0x5f, 0x19, 0x3a,
- 0xdf, 0xf6, 0x33, 0x87, 0x0b, 0x82, 0xc8, 0xe3, 0x51, 0xeb, 0x94, 0xe9, 0xa1, 0x6d, 0x0a, 0xcb,
- 0x22, 0x87, 0xda, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0xfe,
- 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x0d, 0x28, 0x7a, 0x4c, 0x67,
- 0x7d, 0x3f, 0xe0, 0xba, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5, 0x3b, 0x2a, 0xa5, 0xda,
- 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xd2, 0x50, 0xb3, 0x1f, 0x32, 0xf6,
- 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0xd9, 0x70, 0xbf, 0x24, 0xd2, 0xe4, 0x0c, 0x0a, 0x26, 0xa3, 0x5d,
- 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a, 0x65, 0xda, 0xfb, 0xd9,
- 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0x24, 0xf1, 0xed, 0xc9, 0x92, 0xc4, 0xf1, 0x0a, 0x0d,
- 0xe7, 0x8a, 0x7f, 0x6d, 0x38, 0x57, 0x7c, 0x77, 0xf2, 0x5c, 0x71, 0xa2, 0x19, 0x46, 0xa6, 0x8c,
- 0xbf, 0x9d, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c, 0xd4, 0x56, 0x1e, 0x3c,
- 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2, 0x5b, 0xd8, 0xe0, 0x85,
- 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59, 0xba, 0xd4, 0xf3, 0x42,
- 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94, 0x7b, 0x46, 0x95, 0x5e,
- 0x18, 0x3f, 0x17, 0x96, 0x72, 0xae, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50, 0xba, 0x82, 0x73, 0x0b,
- 0x85, 0xf4, 0x73, 0x0b, 0x91, 0x05, 0x56, 0x9e, 0x5b, 0xf8, 0xfb, 0x12, 0x5c, 0x48, 0xef, 0x43,
- 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xbe, 0x47, 0x16, 0xa3, 0x4f,
- 0xff, 0x54, 0xe7, 0xd9, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9, 0x24, 0x72, 0x6d, 0xcf,
- 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8, 0x76, 0x13, 0x7e, 0xf6,
- 0x09, 0x9e, 0xb0, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3, 0x91, 0x35, 0x21, 0xbf,
- 0x0e, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x1f, 0xb2, 0x1b, 0x7f, 0xf4, 0x6f, 0x84,
- 0x58, 0x0d, 0xe6, 0xea, 0x8c, 0xb6, 0xf7, 0x54, 0xf2, 0x2c, 0x24, 0x60, 0x54, 0xe3, 0x13, 0x7e,
- 0xa4, 0xee, 0x0a, 0x94, 0x3c, 0xca, 0x98, 0x69, 0xb7, 0x3d, 0xb1, 0x7b, 0x2b, 0xcb, 0xb9, 0xd2,
- 0x50, 0x65, 0x18, 0x50, 0xc9, 0xff, 0x87, 0xb2, 0x88, 0xfb, 0x2c, 0xb9, 0x6d, 0xaf, 0x5a, 0x16,
- 0x99, 0x28, 0x61, 0x57, 0x1b, 0x7e, 0x21, 0x86, 0x74, 0xf2, 0x02, 0x4c, 0xcb, 0x6c, 0x9c, 0x3a,
- 0x5a, 0x2b, 0xf7, 0x58, 0x67, 0xf6, 0x07, 0xb5, 0xe9, 0x7a, 0xa4, 0x1c, 0x63, 0x5c, 0x7c, 0x3f,
- 0x45, 0x83, 0xe0, 0x58, 0x72, 0x3f, 0x15, 0x86, 0xcd, 0x30, 0xc2, 0x45, 0x9e, 0x85, 0x1c, 0xb3,
- 0x3c, 0xb1, 0x87, 0x2a, 0x85, 0x7e, 0xef, 0xe6, 0x5a, 0x03, 0x79, 0xb9, 0xf6, 0x3f, 0x19, 0x38,
- 0x9d, 0x38, 0x41, 0xc4, 0x45, 0xfa, 0xae, 0xa5, 0xcc, 0x48, 0x20, 0xb2, 0x85, 0x6b, 0xc8, 0xcb,
- 0xc9, 0x9b, 0xca, 0x2b, 0xcc, 0x4e, 0x78, 0x8b, 0xe0, 0x8e, 0xce, 0x3c, 0xee, 0x06, 0x0e, 0x39,
- 0x84, 0xd7, 0x12, 0x8d, 0x93, 0x8b, 0xc7, 0xda, 0x0e, 0x6e, 0xa0, 0xc8, 0x86, 0x33, 0x7f, 0x98,
- 0x0d, 0xa7, 0xf6, 0xb7, 0x39, 0xa8, 0xdc, 0x72, 0xb6, 0x3f, 0x25, 0x67, 0x24, 0xd2, 0x2d, 0x72,
- 0xf6, 0xa7, 0x68, 0x91, 0xb7, 0xe0, 0x19, 0xc6, 0xf8, 0xae, 0xdf, 0xb1, 0x9b, 0xde, 0x52, 0x8b,
- 0x51, 0x77, 0xd5, 0xb4, 0x4d, 0x6f, 0x87, 0x36, 0x55, 0xe4, 0xee, 0x33, 0xfb, 0x83, 0xda, 0x33,
- 0x9b, 0x9b, 0x6b, 0x69, 0x2c, 0x38, 0x4a, 0x56, 0xcc, 0x10, 0xdd, 0xe8, 0x38, 0xad, 0x96, 0xcc,
- 0x6c, 0xcb, 0x1c, 0x8f, 0x9c, 0x21, 0x91, 0x72, 0x8c, 0x71, 0x69, 0x1f, 0x65, 0xa0, 0x7c, 0x5b,
- 0x6f, 0x75, 0xf4, 0x86, 0x69, 0x77, 0xc8, 0x73, 0x30, 0xb5, 0xed, 0x3a, 0x1d, 0xea, 0x7a, 0x2a,
- 0xd3, 0x2c, 0x76, 0x3d, 0x75, 0x59, 0x84, 0x3e, 0x8d, 0x6f, 0xc3, 0x98, 0xd3, 0x33, 0x8d, 0xe4,
- 0x86, 0x75, 0x93, 0x17, 0xa2, 0xa4, 0x91, 0xfb, 0x72, 0x1e, 0xe5, 0x26, 0x3c, 0x82, 0xbd, 0xb9,
- 0xd6, 0x90, 0xd9, 0x5b, 0x7f, 0x06, 0x92, 0xe7, 0x63, 0x9e, 0x47, 0x79, 0x94, 0xaf, 0xa0, 0x7d,
- 0x2f, 0x0b, 0x15, 0xf9, 0x69, 0x72, 0x73, 0x76, 0x9c, 0x1f, 0xf7, 0xa2, 0x88, 0xae, 0x7b, 0xfd,
- 0x2e, 0x75, 0xc5, 0x26, 0x58, 0x4d, 0xb9, 0x68, 0xb4, 0x24, 0x24, 0x06, 0x11, 0xf6, 0xb0, 0xc8,
- 0x6f, 0x9d, 0xfc, 0x09, 0xb6, 0x4e, 0xe1, 0xc0, 0xd6, 0xf9, 0xb3, 0x0c, 0x94, 0xd7, 0xcc, 0x16,
- 0x35, 0xf6, 0x0c, 0x8b, 0x92, 0x57, 0xa1, 0xda, 0xa4, 0x16, 0x65, 0xf4, 0x86, 0xab, 0x1b, 0x74,
- 0x83, 0xba, 0xa6, 0xb8, 0x70, 0xc3, 0x47, 0x99, 0x98, 0xc7, 0x05, 0xb9, 0x5c, 0xae, 0x8c, 0xe0,
- 0xc1, 0x91, 0xd2, 0xe4, 0x26, 0x4c, 0x37, 0xa9, 0x67, 0xba, 0xb4, 0xb9, 0x11, 0xf1, 0x46, 0x9f,
- 0xf3, 0x6d, 0xd3, 0x4a, 0x84, 0xf6, 0x68, 0x50, 0x9b, 0xd9, 0x30, 0x7b, 0xd4, 0x32, 0x6d, 0x2a,
- 0xdd, 0xd2, 0x98, 0xa8, 0x56, 0x80, 0xdc, 0x9a, 0xd3, 0xd6, 0xde, 0xcf, 0x41, 0x70, 0x85, 0x8a,
- 0xfc, 0x66, 0x06, 0x2a, 0xba, 0x6d, 0x3b, 0x4c, 0x5d, 0x4f, 0x92, 0xb1, 0x7d, 0x9c, 0xf8, 0xa6,
- 0xd6, 0xfc, 0x52, 0x08, 0x2a, 0xc3, 0xc2, 0x41, 0xa8, 0x3a, 0x42, 0xc1, 0xa8, 0x6e, 0xd2, 0x4f,
- 0x44, 0xaa, 0xd7, 0x27, 0xaf, 0xc5, 0x21, 0xe2, 0xd2, 0xb3, 0x5f, 0x83, 0x33, 0xc9, 0xca, 0x1e,
- 0x25, 0xb0, 0x35, 0x49, 0x4c, 0xec, 0xdd, 0x32, 0x54, 0xee, 0xe8, 0xcc, 0xdc, 0xa5, 0x62, 0x0b,
- 0x76, 0x32, 0x3e, 0xf5, 0x1f, 0x64, 0xe0, 0x42, 0x3c, 0x66, 0x7c, 0x82, 0x8e, 0xf5, 0xec, 0xfe,
- 0xa0, 0x76, 0x01, 0x53, 0xb5, 0xe1, 0x88, 0x5a, 0x08, 0x17, 0x7b, 0x28, 0x04, 0x7d, 0xd2, 0x2e,
- 0x76, 0x63, 0x94, 0x42, 0x1c, 0x5d, 0x97, 0x4f, 0x8b, 0x8b, 0xfd, 0x64, 0x5f, 0x69, 0x49, 0x6c,
- 0x00, 0xa6, 0x9e, 0x98, 0x0d, 0x40, 0xe9, 0x89, 0x70, 0xb8, 0x7a, 0x91, 0x0d, 0x40, 0x79, 0xc2,
- 0x38, 0xa8, 0x4a, 0xb3, 0x4a, 0xb4, 0x51, 0x1b, 0x09, 0x71, 0xf8, 0xcd, 0xf7, 0x8d, 0x89, 0x01,
- 0x85, 0x6d, 0xdd, 0x33, 0x0d, 0xe5, 0x7e, 0xd6, 0xc7, 0x0f, 0x4b, 0xf8, 0x77, 0x3f, 0x64, 0x8c,
- 0x49, 0xbc, 0xa2, 0xc4, 0x0e, 0xef, 0x98, 0x64, 0x27, 0xba, 0x63, 0x42, 0x96, 0x21, 0x6f, 0x73,
- 0x63, 0x9b, 0x3b, 0xf2, 0xad, 0x92, 0x3b, 0xb7, 0xe9, 0x1e, 0x0a, 0x61, 0xed, 0x87, 0x59, 0x00,
- 0xfe, 0xf9, 0xca, 0xcd, 0x79, 0xcc, 0x66, 0xe4, 0xf3, 0x30, 0xe5, 0xf5, 0x45, 0xb4, 0x56, 0x2d,
- 0xc5, 0x61, 0xf0, 0x58, 0x16, 0xa3, 0x4f, 0xe7, 0x9e, 0xd0, 0xdb, 0x7d, 0xda, 0xf7, 0x63, 0x41,
- 0x81, 0x27, 0xf4, 0x0a, 0x2f, 0x44, 0x49, 0x3b, 0x39, 0x47, 0xc6, 0xdf, 0x35, 0x15, 0x4e, 0x68,
- 0xd7, 0xa4, 0x7d, 0x33, 0x0b, 0x10, 0x06, 0xf8, 0xc9, 0xf7, 0x33, 0x70, 0x3e, 0x98, 0x65, 0x4c,
- 0xde, 0x5c, 0x58, 0xb6, 0x74, 0xb3, 0x3b, 0xf1, 0x46, 0x26, 0x6d, 0x86, 0x0b, 0xb3, 0xb3, 0x91,
- 0xa6, 0x0e, 0xd3, 0x6b, 0x41, 0x10, 0x4a, 0xb4, 0xdb, 0x63, 0x7b, 0x2b, 0xa6, 0xab, 0x86, 0x5d,
- 0xea, 0xd1, 0xff, 0xeb, 0x8a, 0x47, 0x8a, 0xaa, 0x1b, 0x1e, 0x62, 0xe6, 0xf8, 0x14, 0x0c, 0x70,
- 0xb4, 0xef, 0x66, 0xe1, 0x5c, 0x4a, 0xed, 0xc8, 0x4b, 0x70, 0x46, 0x65, 0x38, 0xc2, 0xeb, 0xbb,
- 0x99, 0xf0, 0xfa, 0x6e, 0x23, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x26, 0x80, 0x6e, 0x18, 0xd4, 0xf3,
- 0xd6, 0x9d, 0xa6, 0xef, 0xf4, 0xbd, 0xc8, 0x37, 0x95, 0x4b, 0x41, 0xe9, 0xa3, 0x41, 0xed, 0x8b,
- 0x69, 0xa9, 0xaa, 0xc4, 0xd7, 0x87, 0x02, 0x18, 0x81, 0x24, 0x6f, 0x00, 0xc8, 0xfb, 0x24, 0xc1,
- 0x61, 0xcb, 0xc7, 0x44, 0xd2, 0xe7, 0xfd, 0xbb, 0x0e, 0xf3, 0xaf, 0xf4, 0x75, 0x9b, 0x99, 0x6c,
- 0x4f, 0x1e, 0x9f, 0xbe, 0x17, 0xa0, 0x60, 0x04, 0x51, 0xfb, 0xeb, 0x2c, 0x94, 0x7c, 0x67, 0xf4,
- 0x13, 0xc8, 0x95, 0xb4, 0x63, 0xb9, 0x92, 0xf1, 0x2f, 0x10, 0xfa, 0x55, 0x1e, 0x99, 0x1d, 0x71,
- 0x12, 0xd9, 0x91, 0x1b, 0x93, 0xab, 0x3a, 0x38, 0x1f, 0xf2, 0x83, 0x2c, 0x9c, 0xf2, 0x59, 0xd5,
- 0x39, 0xee, 0x2f, 0xc3, 0x8c, 0x4b, 0xf5, 0x66, 0x5d, 0x67, 0xc6, 0x8e, 0xe8, 0x3e, 0x79, 0x8a,
- 0xfb, 0xec, 0xfe, 0xa0, 0x36, 0x83, 0x51, 0x02, 0xc6, 0xf9, 0xd2, 0x0e, 0x80, 0x67, 0x27, 0x3c,
- 0x00, 0x9e, 0x3b, 0xca, 0x01, 0x70, 0xa2, 0x43, 0x85, 0xd7, 0x68, 0xd3, 0xec, 0x52, 0xa7, 0xef,
- 0xff, 0xb1, 0xe0, 0xa8, 0x87, 0x87, 0xc5, 0xea, 0x8e, 0x21, 0x0c, 0x46, 0x31, 0xb5, 0x7f, 0xc8,
- 0xc0, 0x74, 0xd8, 0x5e, 0x27, 0x9e, 0x31, 0x6a, 0xc5, 0x33, 0x46, 0x4b, 0x13, 0x0f, 0x87, 0x11,
- 0x39, 0xa2, 0xdf, 0x2b, 0x86, 0x9f, 0x25, 0xb2, 0x42, 0xdb, 0x30, 0x6b, 0xa6, 0x26, 0x4a, 0x22,
- 0xd6, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x27, 0x1e, 0x80, 0x42, 0xfa, 0x50, 0xda, 0xa5, 0x2e,
- 0x33, 0x0d, 0xea, 0x7f, 0xdf, 0x8d, 0x89, 0xbd, 0x23, 0x79, 0x00, 0x20, 0x6c, 0xd3, 0x7b, 0x4a,
- 0x01, 0x06, 0xaa, 0xc8, 0x36, 0x14, 0x68, 0xb3, 0x4d, 0xfd, 0xf3, 0xf3, 0x5f, 0x9d, 0xe8, 0xe6,
- 0x45, 0xd8, 0x9e, 0xfc, 0xcd, 0x43, 0x09, 0x4d, 0x3c, 0x28, 0x5b, 0xfe, 0xf6, 0x5d, 0x8d, 0xc3,
- 0xf1, 0x7d, 0x9d, 0x20, 0x10, 0x10, 0x1e, 0x42, 0x0d, 0x8a, 0x30, 0xd4, 0x43, 0x3a, 0xc1, 0x9d,
- 0x92, 0xc2, 0x31, 0x19, 0x8f, 0x03, 0xee, 0x95, 0x78, 0x50, 0x7e, 0xa0, 0x33, 0xea, 0x76, 0x75,
- 0xb7, 0xa3, 0x1c, 0xff, 0xf1, 0xbf, 0xf0, 0xbe, 0x8f, 0x14, 0x7e, 0x61, 0x50, 0x84, 0xa1, 0x1e,
- 0xe2, 0x40, 0x99, 0x29, 0x4f, 0xd6, 0xbf, 0x96, 0x38, 0xbe, 0x52, 0xdf, 0x27, 0xf6, 0x64, 0x60,
- 0x3b, 0x78, 0xc5, 0x50, 0x87, 0xf6, 0x28, 0x17, 0x9a, 0xc7, 0x4f, 0x3a, 0x45, 0xf8, 0x42, 0x3c,
- 0x45, 0x38, 0x97, 0x4c, 0x11, 0x26, 0xa2, 0x31, 0x47, 0x4f, 0x12, 0xea, 0x50, 0xb1, 0x74, 0x8f,
- 0x6d, 0xf5, 0x9a, 0x3a, 0x53, 0xf1, 0xe5, 0xca, 0xe2, 0xff, 0x3b, 0x9c, 0xf5, 0xe2, 0xf6, 0x30,
- 0x0c, 0xba, 0xac, 0x85, 0x30, 0x18, 0xc5, 0x24, 0x57, 0xa1, 0xb2, 0x2b, 0x66, 0xa4, 0xbc, 0x4d,
- 0x51, 0x10, 0xe6, 0x5c, 0x58, 0xd8, 0x7b, 0x61, 0x31, 0x46, 0x79, 0xb8, 0x88, 0xf4, 0x04, 0xa4,
- 0x48, 0x31, 0x14, 0x69, 0x84, 0xc5, 0x18, 0xe5, 0x11, 0xb9, 0x0a, 0xd3, 0xee, 0x48, 0x81, 0x29,
- 0x21, 0x20, 0x73, 0x15, 0x7e, 0x21, 0x86, 0x74, 0x72, 0x05, 0x4a, 0xfd, 0x66, 0x4b, 0xf2, 0x96,
- 0x04, 0xaf, 0xf0, 0xbf, 0xb6, 0x56, 0x56, 0xd5, 0xed, 0x0e, 0x9f, 0xaa, 0xfd, 0x67, 0x06, 0xc8,
- 0x70, 0x52, 0x9b, 0xec, 0x40, 0xd1, 0x16, 0x51, 0x95, 0x89, 0xaf, 0x55, 0x47, 0x82, 0x33, 0x72,
- 0x8e, 0xa9, 0x02, 0x85, 0x4f, 0x6c, 0x28, 0xd1, 0x87, 0x8c, 0xba, 0xb6, 0x6e, 0x29, 0xd7, 0xe3,
- 0x78, 0xae, 0x70, 0x4b, 0x87, 0x53, 0x21, 0x63, 0xa0, 0x43, 0xfb, 0x71, 0x16, 0x2a, 0x11, 0xbe,
- 0xc7, 0x6d, 0x56, 0xc4, 0x99, 0x51, 0x19, 0xcc, 0xd8, 0x72, 0x2d, 0x35, 0x4c, 0x23, 0x67, 0x46,
- 0x15, 0x09, 0xd7, 0x30, 0xca, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8, 0x2b, 0x96, 0x92, 0xc4,
- 0x49, 0xcd, 0xf5, 0x80, 0x82, 0x11, 0x2e, 0x72, 0x59, 0x5d, 0xf0, 0xcf, 0xc7, 0x2f, 0x4d, 0x8d,
- 0xb8, 0xbd, 0x5f, 0x38, 0x86, 0xdb, 0xfb, 0xa4, 0x0d, 0x67, 0xfc, 0x5a, 0xfb, 0x54, 0x65, 0xe7,
- 0x0e, 0x09, 0x2c, 0x9d, 0xf1, 0x04, 0x04, 0x0e, 0x81, 0x6a, 0x3f, 0xcc, 0xc0, 0x4c, 0x6c, 0x2b,
- 0xcd, 0xb7, 0x76, 0xe1, 0x91, 0x8c, 0xc8, 0xd6, 0x2e, 0x76, 0x92, 0xe2, 0x79, 0x28, 0xca, 0x06,
- 0x52, 0x0d, 0x1f, 0x98, 0x11, 0xd9, 0x84, 0xa8, 0xa8, 0xdc, 0x20, 0xa8, 0x60, 0x5d, 0xd2, 0x20,
- 0xa8, 0x68, 0x1e, 0xfa, 0x74, 0xf2, 0x05, 0x28, 0xf9, 0xb5, 0x53, 0x2d, 0x1d, 0xfe, 0xdb, 0x41,
- 0x95, 0x63, 0xc0, 0xa1, 0x7d, 0xab, 0x00, 0xf2, 0xc7, 0x14, 0x5c, 0xae, 0x69, 0x7a, 0x32, 0x4b,
- 0x95, 0x11, 0x59, 0xaa, 0x40, 0x6e, 0x45, 0x95, 0x63, 0xc0, 0x41, 0x2e, 0x42, 0xae, 0x6b, 0xda,
- 0x2a, 0xac, 0x28, 0x76, 0x95, 0xeb, 0xa6, 0x8d, 0xbc, 0x4c, 0x90, 0xf4, 0x87, 0x2a, 0xd1, 0x22,
- 0x49, 0xfa, 0x43, 0xe4, 0x65, 0xdc, 0xb9, 0xb4, 0x1c, 0xa7, 0xb3, 0xad, 0x1b, 0x1d, 0x3f, 0xf4,
- 0x9d, 0x17, 0xb3, 0x57, 0x38, 0x97, 0x6b, 0x71, 0x12, 0x26, 0x79, 0xb9, 0xb8, 0xe1, 0x38, 0x56,
- 0xd3, 0x79, 0x60, 0xfb, 0xe2, 0x85, 0x50, 0x7c, 0x39, 0x4e, 0xc2, 0x24, 0x2f, 0xd9, 0x82, 0x67,
- 0xde, 0xa1, 0xae, 0xa3, 0x5a, 0xac, 0x61, 0x51, 0xda, 0xf3, 0x61, 0xa4, 0x81, 0x12, 0x59, 0xa1,
- 0xd7, 0xd2, 0x59, 0x70, 0x94, 0xac, 0x48, 0x36, 0xe9, 0x6e, 0x9b, 0xb2, 0x0d, 0xd7, 0xe1, 0x7b,
- 0x27, 0xd3, 0x6e, 0xfb, 0xb0, 0x53, 0x21, 0xec, 0x66, 0x3a, 0x0b, 0x8e, 0x92, 0x25, 0xeb, 0x70,
- 0x56, 0x92, 0x22, 0x3e, 0xb3, 0xb2, 0x75, 0xb5, 0xfd, 0x41, 0xed, 0x33, 0x2b, 0xb4, 0xe7, 0x52,
- 0x83, 0x1b, 0xe8, 0xcd, 0x24, 0x1b, 0x0e, 0x4b, 0x8a, 0xdf, 0x45, 0xa9, 0x70, 0xef, 0x06, 0x75,
- 0x45, 0x97, 0x8b, 0xd8, 0x91, 0x72, 0xcc, 0x31, 0x41, 0xc3, 0x21, 0x6e, 0xf2, 0x2a, 0x54, 0xa3,
- 0xb0, 0x4b, 0xbb, 0xba, 0x69, 0xe9, 0xdb, 0xa6, 0x65, 0xb2, 0x3d, 0x91, 0x2b, 0x9e, 0x91, 0xc1,
- 0xc8, 0xcd, 0x11, 0x3c, 0x38, 0x52, 0x5a, 0xfb, 0xfd, 0x1c, 0x88, 0x3f, 0x0b, 0x91, 0xfb, 0x90,
- 0xb3, 0x9c, 0xb6, 0x32, 0xc9, 0xe3, 0x47, 0x3a, 0xd6, 0x9c, 0xb6, 0x1c, 0x78, 0x6b, 0x4e, 0x1b,
- 0x39, 0x22, 0x31, 0xa0, 0xd0, 0xd1, 0x5b, 0x1d, 0x5d, 0x59, 0xe0, 0xf1, 0xfd, 0x8d, 0x20, 0x91,
- 0xa7, 0x6e, 0x88, 0xf2, 0x57, 0x94, 0xd8, 0xdc, 0xb1, 0xd9, 0xf6, 0x7f, 0x15, 0xa2, 0xb6, 0x7e,
- 0x13, 0xc4, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xaf, 0x18, 0xea, 0x20, 0x06, 0x14, 0xfb, 0x4d,
- 0xf1, 0x87, 0xa7, 0xfc, 0x84, 0x5e, 0xcc, 0xd6, 0x8a, 0xf8, 0x26, 0xb1, 0x7e, 0xc9, 0x67, 0x54,
- 0xd0, 0xda, 0x9f, 0x67, 0x60, 0xa6, 0x61, 0x99, 0x4d, 0xd3, 0x6e, 0x9f, 0xdc, 0x9d, 0x5c, 0x72,
- 0x17, 0x0a, 0x9e, 0x65, 0x36, 0xe9, 0x98, 0x97, 0x45, 0x45, 0x67, 0xf0, 0x5a, 0x52, 0x94, 0x38,
- 0xda, 0x9f, 0xe4, 0x41, 0xfd, 0x0e, 0x8b, 0xf4, 0xa1, 0xdc, 0xf6, 0x6f, 0xae, 0xaa, 0x2a, 0xbf,
- 0x3c, 0xc1, 0x0d, 0x87, 0xd8, 0x1d, 0x58, 0xd9, 0x3b, 0x41, 0x21, 0x86, 0x9a, 0x08, 0x8d, 0x8f,
- 0xb9, 0x95, 0x09, 0xc7, 0x9c, 0x54, 0x37, 0x3c, 0xea, 0x74, 0xc8, 0xef, 0x30, 0xd6, 0x9b, 0xf8,
- 0x20, 0x6e, 0x78, 0xc6, 0x56, 0x86, 0xf1, 0xf8, 0x3b, 0x0a, 0x68, 0xae, 0xc2, 0xd6, 0x8f, 0xe1,
- 0x96, 0x7b, 0x18, 0x42, 0x55, 0x11, 0x56, 0x9d, 0x79, 0x28, 0xa0, 0xc9, 0xaf, 0x42, 0x85, 0xb9,
- 0xba, 0xed, 0xb5, 0x1c, 0xb7, 0x4b, 0x5d, 0xb5, 0xf8, 0xaf, 0x4e, 0x30, 0x9e, 0x37, 0x43, 0x34,
- 0x19, 0xf5, 0x88, 0x15, 0x61, 0x54, 0x9b, 0xd6, 0x05, 0xe5, 0xb6, 0x13, 0x23, 0xf6, 0x37, 0x01,
- 0x99, 0xe9, 0x5c, 0x38, 0xdc, 0x58, 0x0c, 0xee, 0x92, 0x47, 0xee, 0xd6, 0xa5, 0xfe, 0x36, 0x40,
- 0xfb, 0xa7, 0x2c, 0xe4, 0x36, 0xd7, 0x1a, 0xf2, 0xaa, 0x88, 0xf8, 0xb9, 0x06, 0x6d, 0x74, 0xcc,
- 0xde, 0x3d, 0xea, 0x9a, 0xad, 0x3d, 0xb5, 0xf6, 0x46, 0xae, 0x8a, 0x24, 0x39, 0x30, 0x45, 0x8a,
- 0xbc, 0x0e, 0xd3, 0x86, 0xbe, 0x4c, 0x5d, 0x26, 0x5d, 0x98, 0xa3, 0x45, 0xcd, 0xc5, 0x09, 0x86,
- 0xe5, 0xa5, 0x50, 0x1c, 0x63, 0x60, 0x64, 0x0b, 0xc0, 0x08, 0xa1, 0x8f, 0x14, 0x49, 0x97, 0xbf,
- 0x4f, 0x08, 0x81, 0x23, 0x40, 0x04, 0xa1, 0xdc, 0xe1, 0xac, 0x02, 0x35, 0x7f, 0x14, 0x54, 0x31,
- 0xe9, 0x6e, 0xfb, 0xb2, 0x18, 0xc2, 0x68, 0xff, 0x9e, 0x81, 0x70, 0x13, 0x48, 0x3c, 0x28, 0x36,
- 0xc5, 0xad, 0x6d, 0x35, 0xed, 0xc7, 0xdf, 0x4c, 0xc7, 0x7f, 0x5a, 0x52, 0x27, 0xfb, 0x83, 0x5a,
- 0xe2, 0x47, 0x26, 0xa8, 0x54, 0x91, 0x36, 0xe4, 0xde, 0x72, 0xb6, 0x27, 0x9e, 0xf5, 0x91, 0xf3,
- 0x3f, 0x72, 0xe7, 0x14, 0x29, 0x40, 0xae, 0x41, 0xfb, 0x56, 0x16, 0x2a, 0x91, 0x31, 0x3d, 0xf1,
- 0x4f, 0x09, 0x1e, 0x26, 0x7e, 0x4a, 0xb0, 0x31, 0xfe, 0xae, 0x3c, 0xac, 0xd5, 0x49, 0xff, 0x97,
- 0xe0, 0x6f, 0xb2, 0x90, 0xdb, 0x5a, 0x59, 0xe5, 0x8b, 0x6f, 0x70, 0x0e, 0x68, 0xe2, 0xc4, 0x54,
- 0xf8, 0x5f, 0x34, 0x31, 0xd2, 0x82, 0x57, 0x0c, 0x75, 0x90, 0x1d, 0x98, 0xda, 0xee, 0x9b, 0x16,
- 0x33, 0xed, 0x89, 0x4f, 0x9d, 0xf9, 0xff, 0x70, 0x50, 0xc7, 0x65, 0x24, 0x2a, 0xfa, 0xf0, 0xa4,
- 0x0d, 0x53, 0x6d, 0x79, 0x0d, 0x44, 0xcd, 0xbd, 0x97, 0xc6, 0x5f, 0xbd, 0x24, 0x8e, 0x54, 0xa4,
- 0x5e, 0xd0, 0x47, 0xd7, 0xbe, 0x01, 0x6a, 0xf1, 0x27, 0xde, 0xc9, 0xb4, 0x66, 0x10, 0x18, 0x4a,
- 0x6b, 0x51, 0xed, 0x3f, 0x32, 0x10, 0xb7, 0xd2, 0x9f, 0x7c, 0xa7, 0x76, 0x92, 0x9d, 0xba, 0x72,
- 0x1c, 0x73, 0x20, 0xbd, 0x5f, 0xb5, 0xbf, 0xca, 0x42, 0x51, 0xfd, 0x30, 0xf4, 0xe4, 0xb3, 0x1f,
- 0x34, 0x96, 0xfd, 0x58, 0x9e, 0xf0, 0xf7, 0x89, 0x23, 0x73, 0x1f, 0xdd, 0x44, 0xee, 0x63, 0xd2,
- 0xff, 0x34, 0x3e, 0x26, 0xf3, 0xf1, 0x77, 0x19, 0x38, 0x25, 0x19, 0x6f, 0xda, 0x1e, 0xd3, 0x6d,
- 0x43, 0x38, 0xc5, 0x32, 0x12, 0x35, 0x71, 0x68, 0x4f, 0x85, 0xa1, 0x85, 0xbb, 0x2a, 0x9f, 0x51,
- 0x41, 0xf3, 0xcd, 0xf2, 0x8e, 0xe3, 0x31, 0x61, 0x6e, 0xb3, 0xf1, 0x4d, 0xf6, 0xcb, 0xaa, 0x1c,
- 0x03, 0x8e, 0xe4, 0xee, 0xbd, 0x30, 0x7a, 0xf7, 0xae, 0xfd, 0x69, 0x06, 0xa6, 0xa3, 0x7f, 0xa8,
- 0x1c, 0x3f, 0x91, 0x93, 0xc8, 0xa3, 0x64, 0x4f, 0x20, 0x8f, 0xf2, 0x61, 0x06, 0xc0, 0xaf, 0xec,
- 0x89, 0x67, 0x51, 0x9a, 0xf1, 0x2c, 0xca, 0xc4, 0xdd, 0x9a, 0x9e, 0x43, 0xf9, 0x41, 0xc1, 0xff,
- 0x24, 0x91, 0x41, 0x79, 0x2f, 0x03, 0xa7, 0xf4, 0x58, 0x56, 0x62, 0x62, 0x4f, 0x22, 0x91, 0xe4,
- 0x08, 0xfe, 0xe8, 0x19, 0x2f, 0xc7, 0x84, 0x5a, 0x72, 0x0d, 0xa6, 0x7b, 0x2a, 0x54, 0x7c, 0x27,
- 0x1c, 0x75, 0xc1, 0x01, 0xe4, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x8f, 0xc9, 0x02, 0xe5, 0x8e, 0x25,
- 0x0b, 0x14, 0x3d, 0x6a, 0x96, 0x3f, 0xf0, 0xa8, 0x99, 0x0d, 0xe5, 0x96, 0xeb, 0x74, 0x45, 0xa2,
- 0x45, 0xfd, 0x3f, 0x71, 0xc2, 0xe4, 0x4d, 0xb0, 0xa8, 0xac, 0xfa, 0xb8, 0x18, 0xaa, 0xe0, 0xcb,
- 0x34, 0x73, 0xa4, 0xb6, 0xe2, 0x71, 0x68, 0x0b, 0xa6, 0xee, 0xa6, 0x44, 0x45, 0x1f, 0x3e, 0x9e,
- 0x4c, 0x99, 0xfa, 0x64, 0x92, 0x29, 0xda, 0x3f, 0x66, 0x7d, 0x7b, 0xd1, 0x48, 0xdc, 0x49, 0xca,
- 0x8c, 0xb8, 0x93, 0xa4, 0x6e, 0xd7, 0x46, 0xd3, 0x0d, 0xcf, 0x43, 0xd1, 0xa5, 0xba, 0xe7, 0xd8,
- 0xc9, 0x7f, 0x85, 0xa1, 0x28, 0x45, 0x45, 0x8d, 0xa6, 0x25, 0xb2, 0x8f, 0x49, 0x4b, 0x7c, 0x21,
- 0x32, 0x20, 0x64, 0xfe, 0x37, 0x98, 0xdb, 0x29, 0x83, 0x42, 0xc4, 0x2c, 0xd5, 0x6f, 0xf9, 0x0b,
- 0xc9, 0x98, 0xa5, 0xfa, 0x65, 0x7e, 0xc0, 0x41, 0x9a, 0x30, 0x6d, 0xe9, 0x1e, 0x13, 0x51, 0xa9,
- 0xe6, 0x12, 0x1b, 0x23, 0xe7, 0x11, 0x4c, 0x9b, 0xb5, 0x08, 0x0e, 0xc6, 0x50, 0xb5, 0xdf, 0xcd,
- 0x40, 0xd8, 0xe4, 0x47, 0x8c, 0x8e, 0xbe, 0x0a, 0xa5, 0xae, 0xfe, 0x70, 0x85, 0x5a, 0xfa, 0xde,
- 0x24, 0x7f, 0xbf, 0x5a, 0x57, 0x18, 0x18, 0xa0, 0x69, 0x83, 0x0c, 0xa8, 0x1b, 0xbb, 0x84, 0x42,
- 0xa1, 0x65, 0x3e, 0x54, 0xf5, 0x99, 0xc4, 0x53, 0x89, 0xfc, 0x6f, 0x4d, 0xc6, 0x17, 0x44, 0x01,
- 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0x86, 0x7f, 0xd4, 0xa7, 0x8c, 0xbf, 0x2b, 0x8f, 0x85, 0x91,
- 0xd4, 0x75, 0x5f, 0x59, 0x84, 0xbe, 0x8e, 0xfa, 0xfc, 0x07, 0x1f, 0xcf, 0x3d, 0xf5, 0xe1, 0xc7,
- 0x73, 0x4f, 0x7d, 0xf4, 0xf1, 0xdc, 0x53, 0xdf, 0xdc, 0x9f, 0xcb, 0x7c, 0xb0, 0x3f, 0x97, 0xf9,
- 0x70, 0x7f, 0x2e, 0xf3, 0xd1, 0xfe, 0x5c, 0xe6, 0x5f, 0xf7, 0xe7, 0x32, 0xbf, 0xf3, 0x6f, 0x73,
- 0x4f, 0xbd, 0x56, 0xf2, 0x31, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x46, 0x67, 0x87, 0xd1, 0x06,
- 0x64, 0x00, 0x00,
+ // 5698 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x5d, 0x6c, 0x24, 0x57,
+ 0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x3d, 0x3f, 0x77, 0x32, 0x93, 0x1e, 0xef, 0xc4, 0x3d, 0x5b,
+ 0xab, 0x44, 0xb3, 0xb0, 0x6b, 0x33, 0x26, 0xcb, 0xce, 0x02, 0xbb, 0x89, 0xdb, 0x1e, 0x4f, 0x66,
+ 0xc6, 0x9e, 0xf1, 0x9e, 0xb6, 0x67, 0xb2, 0x09, 0x24, 0x94, 0xab, 0x6f, 0xb7, 0x2b, 0x5d, 0x5d,
+ 0xd5, 0xa9, 0xba, 0xed, 0x19, 0x07, 0x56, 0x44, 0x9b, 0x87, 0x04, 0xb1, 0x68, 0x91, 0x10, 0xd2,
+ 0x8a, 0xd5, 0x22, 0x21, 0x21, 0x21, 0x90, 0x56, 0xe2, 0x81, 0x7d, 0x81, 0x17, 0x9e, 0x50, 0xe0,
+ 0x01, 0xf2, 0x80, 0x44, 0x10, 0xa8, 0x45, 0xcc, 0x13, 0x0f, 0xa0, 0x45, 0xfb, 0xb2, 0x1a, 0x21,
+ 0x81, 0xee, 0x4f, 0xfd, 0x76, 0xb5, 0xc7, 0xee, 0xb6, 0xb3, 0x13, 0xf1, 0x56, 0x75, 0xcf, 0x39,
+ 0xdf, 0xb9, 0x75, 0x7f, 0xce, 0x3d, 0xf7, 0x9c, 0x7b, 0x0b, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3, 0xdf,
+ 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x3c, 0xb4, 0x2c, 0xe7,
+ 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0x96, 0xec, 0x5e, 0xd5, 0xad, 0xde, 0x8e,
+ 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2, 0xe5,
+ 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xc5, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x4b, 0x7c,
+ 0xa0, 0xd9, 0x2f, 0x46, 0x6a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4, 0x9b,
+ 0x78, 0x11, 0x4f, 0x52, 0xcf, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0xaf, 0xd6, 0x82, 0xe1,
+ 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2e, 0xb3, 0x2f, 0x84, 0x3c, 0x5d, 0xdd, 0xd8, 0x31, 0x6d, 0xea,
+ 0xee, 0xf9, 0xdf, 0xb2, 0xe0, 0x52, 0xcf, 0xe9, 0xbb, 0x06, 0x3d, 0x92, 0x94, 0xb7, 0xd0, 0xa5,
+ 0x4c, 0x4f, 0xd3, 0xb5, 0x30, 0x4a, 0xca, 0xed, 0xdb, 0xcc, 0xec, 0x0e, 0xab, 0xf9, 0x85, 0xc7,
+ 0x09, 0x78, 0xc6, 0x0e, 0xed, 0xea, 0x49, 0x39, 0xed, 0x5f, 0xca, 0x70, 0x6e, 0x69, 0xdb, 0x63,
+ 0xae, 0x6e, 0xb0, 0x0d, 0xa7, 0xb9, 0x49, 0xbb, 0x3d, 0x4b, 0x67, 0x94, 0x74, 0xa0, 0xc4, 0xeb,
+ 0xd6, 0xd4, 0x99, 0x5e, 0xcd, 0x5c, 0xce, 0x5c, 0xa9, 0x2c, 0x2e, 0xcd, 0x8f, 0xd9, 0x17, 0xf3,
+ 0xeb, 0x0a, 0xa8, 0x3e, 0xbd, 0x3f, 0xa8, 0x95, 0xfc, 0x37, 0x0c, 0x14, 0x90, 0xef, 0x66, 0x60,
+ 0xda, 0x76, 0x9a, 0xb4, 0x41, 0x2d, 0x6a, 0x30, 0xc7, 0xad, 0x66, 0x2f, 0xe7, 0xae, 0x54, 0x16,
+ 0x5f, 0x1f, 0x5b, 0x63, 0xca, 0x17, 0xcd, 0xdf, 0x89, 0x28, 0xb8, 0x6e, 0x33, 0x77, 0xaf, 0xfe,
+ 0xf4, 0x07, 0x83, 0xda, 0x53, 0xfb, 0x83, 0xda, 0x74, 0x94, 0x84, 0xb1, 0x9a, 0x90, 0x2d, 0xa8,
+ 0x30, 0xc7, 0xe2, 0x4d, 0x66, 0x3a, 0xb6, 0x57, 0xcd, 0x89, 0x8a, 0xcd, 0xcd, 0xcb, 0xd6, 0xe6,
+ 0xea, 0xe7, 0xf9, 0x70, 0x99, 0xdf, 0xbd, 0x3a, 0xbf, 0x19, 0xb0, 0xd5, 0xcf, 0x29, 0xe0, 0x4a,
+ 0x58, 0xe6, 0x61, 0x14, 0x87, 0x50, 0x38, 0xed, 0x51, 0xa3, 0xef, 0x9a, 0x6c, 0x6f, 0xd9, 0xb1,
+ 0x19, 0x7d, 0xc8, 0xaa, 0x79, 0xd1, 0xca, 0xcf, 0xa7, 0x41, 0x6f, 0x38, 0xcd, 0x46, 0x9c, 0xbb,
+ 0x7e, 0x6e, 0x7f, 0x50, 0x3b, 0x9d, 0x28, 0xc4, 0x24, 0x26, 0xb1, 0xe1, 0x8c, 0xd9, 0xd5, 0xdb,
+ 0x74, 0xa3, 0x6f, 0x59, 0x0d, 0x6a, 0xb8, 0x94, 0x79, 0xd5, 0x82, 0xf8, 0x84, 0x2b, 0x69, 0x7a,
+ 0xd6, 0x1c, 0x43, 0xb7, 0xee, 0x6e, 0xbf, 0x49, 0x0d, 0x86, 0xb4, 0x45, 0x5d, 0x6a, 0x1b, 0xb4,
+ 0x5e, 0x55, 0x1f, 0x73, 0xe6, 0x66, 0x02, 0x09, 0x87, 0xb0, 0xc9, 0x0d, 0x38, 0xdb, 0x73, 0x4d,
+ 0x47, 0x54, 0xc1, 0xd2, 0x3d, 0xef, 0x8e, 0xde, 0xa5, 0xd5, 0xe2, 0xe5, 0xcc, 0x95, 0x72, 0xfd,
+ 0xa2, 0x82, 0x39, 0xbb, 0x91, 0x64, 0xc0, 0x61, 0x19, 0x72, 0x05, 0x4a, 0x7e, 0x61, 0x75, 0xea,
+ 0x72, 0xe6, 0x4a, 0x41, 0x8e, 0x1d, 0x5f, 0x16, 0x03, 0x2a, 0x59, 0x85, 0x92, 0xde, 0x6a, 0x99,
+ 0x36, 0xe7, 0x2c, 0x89, 0x26, 0xbc, 0x94, 0xf6, 0x69, 0x4b, 0x8a, 0x47, 0xe2, 0xf8, 0x6f, 0x18,
+ 0xc8, 0x92, 0x5b, 0x40, 0x3c, 0xea, 0xee, 0x9a, 0x06, 0x5d, 0x32, 0x0c, 0xa7, 0x6f, 0x33, 0x51,
+ 0xf7, 0xb2, 0xa8, 0xfb, 0xac, 0xaa, 0x3b, 0x69, 0x0c, 0x71, 0x60, 0x8a, 0x14, 0x79, 0x09, 0xce,
+ 0xa8, 0x69, 0x17, 0xb6, 0x02, 0x08, 0xa4, 0xa7, 0x79, 0x43, 0x62, 0x82, 0x86, 0x43, 0xdc, 0xa4,
+ 0x09, 0x97, 0xf4, 0x3e, 0x73, 0xba, 0x1c, 0x32, 0xae, 0x74, 0xd3, 0xe9, 0x50, 0xbb, 0x5a, 0xb9,
+ 0x9c, 0xb9, 0x52, 0xaa, 0x5f, 0xde, 0x1f, 0xd4, 0x2e, 0x2d, 0x1d, 0xc0, 0x87, 0x07, 0xa2, 0x90,
+ 0xbb, 0x50, 0x6e, 0xda, 0xde, 0x86, 0x63, 0x99, 0xc6, 0x5e, 0x75, 0x5a, 0x54, 0xf0, 0xaa, 0xfa,
+ 0xd4, 0xf2, 0xca, 0x9d, 0x86, 0x24, 0x3c, 0x1a, 0xd4, 0x2e, 0x0d, 0x5b, 0xc7, 0xf9, 0x80, 0x8e,
+ 0x21, 0x06, 0x59, 0x17, 0x80, 0xcb, 0x8e, 0xdd, 0x32, 0xdb, 0xd5, 0x19, 0xd1, 0x1b, 0x97, 0x47,
+ 0x0c, 0xe8, 0x95, 0x3b, 0x0d, 0xc9, 0x57, 0x9f, 0x51, 0xea, 0xe4, 0x2b, 0x86, 0x08, 0xb3, 0x2f,
+ 0xc2, 0xd9, 0xa1, 0x59, 0x4b, 0xce, 0x40, 0xae, 0x43, 0xf7, 0x84, 0x51, 0x2a, 0x23, 0x7f, 0x24,
+ 0x4f, 0x43, 0x61, 0x57, 0xb7, 0xfa, 0xb4, 0x9a, 0x15, 0x65, 0xf2, 0xe5, 0x17, 0xb3, 0xd7, 0x32,
+ 0xda, 0xa0, 0x0c, 0xa7, 0x7c, 0x5b, 0x70, 0x8f, 0xba, 0x8c, 0x3e, 0x24, 0x97, 0x21, 0x6f, 0xf3,
+ 0xfe, 0x10, 0xf2, 0xf5, 0x69, 0xf5, 0xb9, 0x79, 0xd1, 0x0f, 0x82, 0x42, 0x0c, 0x28, 0x4a, 0x5b,
+ 0x2e, 0xf0, 0x2a, 0x8b, 0x2f, 0x8e, 0x6d, 0x86, 0x1a, 0x02, 0xa6, 0x0e, 0xfb, 0x83, 0x5a, 0x51,
+ 0x3e, 0xa3, 0x82, 0x26, 0xaf, 0x41, 0xde, 0x33, 0xed, 0x4e, 0x35, 0x27, 0x54, 0x7c, 0x75, 0x7c,
+ 0x15, 0xa6, 0xdd, 0xa9, 0x97, 0xf8, 0x17, 0xf0, 0x27, 0x14, 0xa0, 0xe4, 0x3e, 0xe4, 0xfa, 0xcd,
+ 0x96, 0xb2, 0x28, 0xbf, 0x3c, 0x36, 0xf6, 0xd6, 0xca, 0x6a, 0x7d, 0x6a, 0x7f, 0x50, 0xcb, 0x6d,
+ 0xad, 0xac, 0x22, 0x47, 0x24, 0xdf, 0xc9, 0xc0, 0x59, 0xc3, 0xb1, 0x99, 0xce, 0xd7, 0x17, 0xdf,
+ 0xb2, 0x56, 0x0b, 0x42, 0xcf, 0xad, 0xb1, 0xf5, 0x2c, 0x27, 0x11, 0xeb, 0xe7, 0xb9, 0xa1, 0x18,
+ 0x2a, 0xc6, 0x61, 0xdd, 0xe4, 0x7b, 0x19, 0x38, 0xcf, 0x27, 0xf0, 0x10, 0xb3, 0x30, 0x3b, 0xc7,
+ 0x5b, 0xab, 0x8b, 0xfb, 0x83, 0xda, 0xf9, 0x9b, 0x69, 0xca, 0x30, 0xbd, 0x0e, 0xbc, 0x76, 0xe7,
+ 0xf4, 0xe1, 0xb5, 0x48, 0x98, 0xb4, 0xca, 0xe2, 0xda, 0x71, 0xae, 0x6f, 0xf5, 0xcf, 0xa8, 0xa1,
+ 0x9c, 0xb6, 0x9c, 0x63, 0x5a, 0x2d, 0xc8, 0x75, 0x98, 0xda, 0x75, 0xac, 0x7e, 0x97, 0x7a, 0xd5,
+ 0x92, 0x58, 0x14, 0x66, 0xd3, 0xe6, 0xea, 0x3d, 0xc1, 0x52, 0x3f, 0xad, 0xe0, 0xa7, 0xe4, 0xbb,
+ 0x87, 0xbe, 0x2c, 0x31, 0xa1, 0x68, 0x99, 0x5d, 0x93, 0x79, 0xc2, 0x5a, 0x56, 0x16, 0xaf, 0x8f,
+ 0xfd, 0x59, 0x72, 0x8a, 0xae, 0x09, 0x30, 0x39, 0x6b, 0xe4, 0x33, 0x2a, 0x05, 0xc4, 0x80, 0x82,
+ 0x67, 0xe8, 0x96, 0xb4, 0xa6, 0x95, 0xc5, 0xaf, 0x8d, 0x3f, 0x6d, 0x38, 0x4a, 0x7d, 0x46, 0x7d,
+ 0x53, 0x41, 0xbc, 0xa2, 0xc4, 0x26, 0xbf, 0x0a, 0xa7, 0x62, 0xbd, 0xe9, 0x55, 0x2b, 0xa2, 0x75,
+ 0x9e, 0x4d, 0x6b, 0x9d, 0x80, 0xab, 0x7e, 0x41, 0x81, 0x9d, 0x8a, 0x8d, 0x10, 0x0f, 0x13, 0x60,
+ 0xe4, 0x36, 0x94, 0x3c, 0xb3, 0x49, 0x0d, 0xdd, 0xf5, 0xaa, 0xd3, 0x87, 0x01, 0x3e, 0xa3, 0x80,
+ 0x4b, 0x0d, 0x25, 0x86, 0x01, 0x80, 0x76, 0x1f, 0x66, 0x96, 0xfa, 0x6c, 0xc7, 0x71, 0xcd, 0xb7,
+ 0x85, 0x67, 0x41, 0x56, 0xa1, 0xc0, 0xc4, 0x0a, 0x21, 0x9d, 0xb6, 0xe7, 0xd2, 0xa0, 0xe5, 0x6a,
+ 0x7d, 0x9b, 0xee, 0xf9, 0x86, 0xb5, 0x5e, 0xe6, 0x8d, 0x20, 0x57, 0x0c, 0x29, 0xae, 0xfd, 0x51,
+ 0x06, 0xca, 0x75, 0xdd, 0x33, 0x0d, 0x0e, 0x4f, 0x96, 0x21, 0xdf, 0xf7, 0xa8, 0x7b, 0x34, 0x50,
+ 0x61, 0x95, 0xb6, 0x3c, 0xea, 0xa2, 0x10, 0x26, 0x77, 0xa1, 0xd4, 0xd3, 0x3d, 0xef, 0x81, 0xe3,
+ 0x36, 0x95, 0x65, 0x3d, 0x24, 0x90, 0x5c, 0xfa, 0x95, 0x28, 0x06, 0x20, 0x5a, 0x05, 0xca, 0x75,
+ 0x4b, 0x37, 0x3a, 0x3b, 0x8e, 0x45, 0xb5, 0x57, 0xa1, 0x58, 0xef, 0xb7, 0x5a, 0xd4, 0x3d, 0x84,
+ 0x85, 0x9f, 0x87, 0x3c, 0xdb, 0xeb, 0xa9, 0xf5, 0x22, 0x58, 0xdd, 0xf3, 0x9b, 0x7b, 0x3d, 0xfa,
+ 0x68, 0x50, 0x03, 0x89, 0xc3, 0xdf, 0x50, 0xf0, 0x69, 0x3f, 0xce, 0xc0, 0x39, 0x59, 0xa8, 0x56,
+ 0x51, 0xb9, 0x3e, 0x11, 0x0a, 0x05, 0x97, 0x36, 0x4d, 0x4f, 0xb5, 0xcb, 0xca, 0xd8, 0xc3, 0x11,
+ 0x39, 0x8a, 0x5a, 0x0e, 0x45, 0x5f, 0x88, 0x02, 0x94, 0xe8, 0xa4, 0x0f, 0xe5, 0x37, 0x29, 0xf3,
+ 0x98, 0x4b, 0xf5, 0xae, 0x6a, 0xb9, 0x97, 0xc7, 0x56, 0x75, 0x8b, 0xb2, 0x86, 0x40, 0x8a, 0xae,
+ 0xbe, 0x41, 0x21, 0x86, 0x9a, 0xb4, 0x9f, 0xe4, 0xa1, 0x1c, 0x8c, 0x42, 0xf2, 0x39, 0x28, 0x08,
+ 0x77, 0x4f, 0x35, 0x6b, 0x30, 0x75, 0x84, 0x57, 0x88, 0x92, 0x46, 0x9e, 0x83, 0x29, 0xc3, 0xe9,
+ 0x76, 0x75, 0xbb, 0x29, 0x5c, 0xf8, 0x72, 0xbd, 0xc2, 0x2d, 0xc6, 0xb2, 0x2c, 0x42, 0x9f, 0x46,
+ 0x2e, 0x41, 0x5e, 0x77, 0xdb, 0xd2, 0x9b, 0x2e, 0xcb, 0x71, 0xb2, 0xe4, 0xb6, 0x3d, 0x14, 0xa5,
+ 0xe4, 0x2b, 0x90, 0xa3, 0xf6, 0x6e, 0x35, 0x3f, 0xda, 0x24, 0x5d, 0xb7, 0x77, 0xef, 0xe9, 0x6e,
+ 0xbd, 0xa2, 0xea, 0x90, 0xbb, 0x6e, 0xef, 0x22, 0x97, 0x21, 0x6b, 0x30, 0x45, 0xed, 0xdd, 0x55,
+ 0xd7, 0xe9, 0x2a, 0x37, 0xf7, 0xb3, 0x23, 0xc4, 0x39, 0x8b, 0x5a, 0x9d, 0x03, 0xc3, 0xa6, 0x8a,
+ 0xd1, 0x87, 0x20, 0xdf, 0x80, 0x69, 0x69, 0xe3, 0xd6, 0xb9, 0xcb, 0xe4, 0x55, 0x8b, 0x02, 0xb2,
+ 0x36, 0xda, 0x48, 0x0a, 0xbe, 0x70, 0x5b, 0x11, 0x29, 0xf4, 0x30, 0x06, 0x45, 0xbe, 0x01, 0x65,
+ 0x7f, 0xc7, 0xe8, 0xa9, 0xd5, 0x20, 0xd5, 0x23, 0x47, 0xc5, 0x84, 0xf4, 0xad, 0xbe, 0xe9, 0xd2,
+ 0x2e, 0xb5, 0x99, 0x57, 0x3f, 0xeb, 0xfb, 0x68, 0x3e, 0xd5, 0xc3, 0x10, 0x8d, 0x6c, 0x0f, 0x6f,
+ 0x2d, 0xa4, 0x5f, 0xfc, 0xb9, 0x11, 0xb3, 0x6d, 0x8c, 0x7d, 0xc5, 0xeb, 0x70, 0x3a, 0xf0, 0xfd,
+ 0x95, 0xfb, 0x28, 0x3d, 0xe5, 0x17, 0xb8, 0xf8, 0xcd, 0x38, 0xe9, 0xd1, 0xa0, 0xf6, 0x6c, 0x8a,
+ 0x03, 0x19, 0x32, 0x60, 0x12, 0x4c, 0xfb, 0xef, 0x2c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb, 0x1c,
+ 0x77, 0xa3, 0x25, 0x3f, 0x48, 0x1a, 0x87, 0x6b, 0x4a, 0x6c, 0xf2, 0x8f, 0x4a, 0xeb, 0x98, 0xdc,
+ 0x71, 0x77, 0xcc, 0xf8, 0x73, 0x47, 0x7b, 0x3f, 0x0f, 0xa7, 0x56, 0x74, 0xda, 0x75, 0xec, 0xc7,
+ 0xba, 0x2f, 0x99, 0x27, 0xc2, 0x7d, 0xb9, 0x02, 0x25, 0x97, 0xf6, 0x2c, 0xd3, 0xd0, 0x3d, 0xd1,
+ 0x59, 0x6a, 0x8f, 0x88, 0xaa, 0x0c, 0x03, 0xea, 0x08, 0xb7, 0x35, 0xf7, 0x44, 0xba, 0xad, 0xf9,
+ 0x9f, 0xbe, 0xdb, 0xaa, 0xbd, 0x93, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, 0xc5, 0x8d,
+ 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, 0x28, 0x7a,
+ 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0xdb, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, 0x32, 0xd9,
+ 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, 0x1a, 0x84,
+ 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, 0x21, 0x0e,
+ 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, 0x2f, 0x54,
+ 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0x88, 0x06, 0x45, 0xc7, 0x5e,
+ 0xed, 0x5b, 0x96, 0x0a, 0x8d, 0x08, 0xd8, 0xbb, 0xa2, 0x04, 0x15, 0x45, 0xfb, 0x9d, 0x0c, 0x40,
+ 0xa8, 0x99, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x07, 0x64, 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb,
+ 0x11, 0x7d, 0x92, 0x97, 0x66, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, 0xbc, 0x04, 0x67, 0x64, 0xd1,
+ 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x67, 0x33, 0x32, 0x20, 0x51, 0x4f, 0xd0, 0x70, 0x88, 0x5b, 0xd3,
+ 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, 0x10, 0x84, 0xa2, 0x15, 0x56,
+ 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x35, 0x41, 0xfc, 0x31, 0x6c, 0xd5, 0x2e, 0x65, 0x3a, 0x37, 0x3e,
+ 0x2b, 0x7d, 0x15, 0x21, 0x93, 0x2d, 0x29, 0x6b, 0xab, 0x90, 0xb4, 0x17, 0xe0, 0xec, 0x50, 0x1f,
+ 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x67, 0xb9, 0xaf, 0x20, 0x9c, 0xa3, 0xdb, 0xbc,
+ 0x00, 0x65, 0xb9, 0xf6, 0x3f, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, 0x78, 0xbf, 0x8f, 0x77, 0xfd,
+ 0x7c, 0xd7, 0x23, 0x9b, 0xea, 0x7a, 0xf4, 0xa1, 0xd8, 0x79, 0x10, 0xb8, 0x26, 0x95, 0xc5, 0xf5,
+ 0xf1, 0x47, 0xab, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x03, 0x8e, 0xa7, 0x54, 0x85, 0x8a, 0xb7,
+ 0xef, 0x0b, 0xa5, 0x4a, 0xd9, 0xec, 0x57, 0xa0, 0x12, 0x61, 0x3b, 0x52, 0x84, 0xe3, 0x27, 0x19,
+ 0x38, 0x7d, 0x43, 0xc6, 0x74, 0x1d, 0x57, 0x7a, 0x34, 0xe4, 0x22, 0xe4, 0xdc, 0x5e, 0x5f, 0xc8,
+ 0xe7, 0xe4, 0x06, 0x1e, 0x37, 0xb6, 0x90, 0x97, 0x91, 0x57, 0xa0, 0xd4, 0x54, 0x7d, 0xa0, 0x3c,
+ 0xc9, 0xa3, 0xf6, 0x9c, 0xb0, 0xb1, 0xfe, 0x1b, 0x06, 0x68, 0xdc, 0xf5, 0xeb, 0x7a, 0xed, 0x86,
+ 0xf9, 0xb6, 0x34, 0xac, 0x05, 0xe9, 0xfa, 0xad, 0xcb, 0x22, 0xf4, 0x69, 0xdc, 0x68, 0x77, 0xe8,
+ 0xde, 0x32, 0xf7, 0x82, 0xc4, 0xcc, 0x54, 0x46, 0xfb, 0xb6, 0x2a, 0xc3, 0x80, 0xca, 0x7b, 0x5e,
+ 0x7e, 0x73, 0x41, 0x0c, 0x74, 0xd1, 0xf3, 0xf7, 0x78, 0x81, 0xfa, 0x7c, 0xed, 0x3b, 0x59, 0xb8,
+ 0x70, 0x83, 0x32, 0xb9, 0x66, 0xad, 0xd0, 0x9e, 0xe5, 0xec, 0xf1, 0xa5, 0x1e, 0xe9, 0x5b, 0xe4,
+ 0x25, 0x00, 0xd3, 0xdb, 0x6e, 0xec, 0x1a, 0xdc, 0x89, 0x57, 0xa3, 0xe1, 0xb2, 0x6a, 0x7c, 0xb8,
+ 0xd9, 0xa8, 0x2b, 0xca, 0xa3, 0xd8, 0x1b, 0x46, 0x64, 0x42, 0x77, 0x37, 0x7b, 0x80, 0xbb, 0xdb,
+ 0x00, 0xe8, 0x85, 0x0e, 0x43, 0x4e, 0x70, 0xfe, 0xbc, 0xaf, 0xe6, 0x28, 0xbe, 0x42, 0x04, 0x66,
+ 0x92, 0x25, 0xfc, 0x2f, 0x73, 0x30, 0x7b, 0x83, 0xb2, 0xc0, 0x9b, 0x57, 0xbb, 0x95, 0x46, 0x8f,
+ 0x1a, 0xbc, 0x55, 0xde, 0xcb, 0x40, 0xd1, 0xd2, 0xb7, 0xa9, 0xe5, 0x89, 0xd9, 0x54, 0x59, 0x7c,
+ 0x63, 0xec, 0xe1, 0x3d, 0x5a, 0xcb, 0xfc, 0x9a, 0xd0, 0x90, 0x18, 0xf0, 0xb2, 0x10, 0x95, 0x7a,
+ 0xf2, 0x25, 0xa8, 0x18, 0x56, 0xdf, 0x63, 0xd4, 0xdd, 0x70, 0x5c, 0xa6, 0x56, 0xef, 0x20, 0x6a,
+ 0xbe, 0x1c, 0x92, 0x30, 0xca, 0x47, 0x16, 0x01, 0x0c, 0xcb, 0xa4, 0x36, 0x13, 0x52, 0x72, 0x98,
+ 0x11, 0xbf, 0xbd, 0x97, 0x03, 0x0a, 0x46, 0xb8, 0xb8, 0xaa, 0xae, 0x63, 0x9b, 0xcc, 0x91, 0xaa,
+ 0xf2, 0x71, 0x55, 0xeb, 0x21, 0x09, 0xa3, 0x7c, 0x42, 0x8c, 0x32, 0xd7, 0x34, 0x3c, 0x21, 0x56,
+ 0x48, 0x88, 0x85, 0x24, 0x8c, 0xf2, 0xf1, 0x99, 0x1c, 0xf9, 0xfe, 0x23, 0xcd, 0xe4, 0xbf, 0x2a,
+ 0xc1, 0x5c, 0xac, 0x59, 0x99, 0xce, 0x68, 0xab, 0x6f, 0x35, 0x28, 0xf3, 0x3b, 0xf0, 0x4b, 0x50,
+ 0x51, 0xd1, 0xe6, 0x3b, 0xa1, 0x95, 0x0b, 0x2a, 0xd5, 0x08, 0x49, 0x18, 0xe5, 0x23, 0xbf, 0x1d,
+ 0xf6, 0xbb, 0x4c, 0xac, 0x18, 0xc7, 0xd3, 0xef, 0x43, 0x15, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9,
+ 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33, 0x81, 0x6f, 0x7e, 0xc7, 0x27, 0x60, 0xc8, 0x43, 0x36,
+ 0xe0, 0x69, 0xd5, 0xc4, 0xd7, 0x1f, 0xf6, 0x1c, 0x97, 0x51, 0x57, 0xca, 0xe6, 0x85, 0xec, 0x25,
+ 0x25, 0xfb, 0xf4, 0x7a, 0x0a, 0x0f, 0xa6, 0x4a, 0x92, 0x75, 0x38, 0x67, 0xc8, 0x60, 0x33, 0xb5,
+ 0x1c, 0xbd, 0xe9, 0x03, 0x16, 0x04, 0x60, 0xe0, 0x88, 0x2e, 0x0f, 0xb3, 0x60, 0x9a, 0x5c, 0x72,
+ 0x34, 0x17, 0xc7, 0x1a, 0xcd, 0x53, 0xe3, 0x8c, 0xe6, 0xd2, 0x78, 0xa3, 0xb9, 0x7c, 0xb8, 0xd1,
+ 0xcc, 0x5b, 0x9e, 0x8f, 0x23, 0xea, 0x2e, 0xf5, 0xd9, 0x8e, 0x8c, 0xcb, 0x44, 0x72, 0x19, 0x41,
+ 0xcb, 0x37, 0x52, 0x78, 0x30, 0x55, 0x92, 0x6c, 0xc3, 0xac, 0x2c, 0xbf, 0x6e, 0x1b, 0xee, 0x5e,
+ 0x8f, 0xaf, 0x1c, 0x11, 0xdc, 0x8a, 0xc0, 0xd5, 0x14, 0xee, 0x6c, 0x63, 0x24, 0x27, 0x1e, 0x80,
+ 0x42, 0x7e, 0x09, 0x66, 0x64, 0x2f, 0xad, 0xeb, 0x3d, 0x01, 0x2b, 0x33, 0x1b, 0xe7, 0x15, 0xec,
+ 0xcc, 0x72, 0x94, 0x88, 0x71, 0x5e, 0xb2, 0x04, 0xa7, 0x7b, 0xbb, 0x06, 0x7f, 0xbc, 0xd9, 0xba,
+ 0x43, 0x69, 0x93, 0x36, 0x45, 0x1e, 0xa3, 0x5c, 0x7f, 0xc6, 0xdf, 0x08, 0x6e, 0xc4, 0xc9, 0x98,
+ 0xe4, 0x27, 0xd7, 0x60, 0xda, 0x63, 0xba, 0xcb, 0x54, 0xd8, 0xa3, 0x7a, 0x4a, 0x66, 0x7e, 0xfc,
+ 0xa8, 0x40, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x24, 0xd6, 0xe3, 0x91, 0x5c, 0x0c, 0x45, 0xdc, 0x28,
+ 0x61, 0xf6, 0xdf, 0x4d, 0x9a, 0xfd, 0xd7, 0x26, 0x99, 0xfe, 0x29, 0x1a, 0x0e, 0x35, 0xed, 0x6f,
+ 0x01, 0x71, 0x55, 0x94, 0x4b, 0xee, 0x36, 0x22, 0x96, 0x3f, 0xc8, 0xaf, 0xe1, 0x10, 0x07, 0xa6,
+ 0x48, 0x91, 0x06, 0x9c, 0xf7, 0xa8, 0xcd, 0x4c, 0x9b, 0x5a, 0x71, 0x38, 0xb9, 0x24, 0x3c, 0xab,
+ 0xe0, 0xce, 0x37, 0xd2, 0x98, 0x30, 0x5d, 0x76, 0x92, 0xc6, 0xff, 0xd7, 0xb2, 0x58, 0x77, 0x65,
+ 0xd3, 0x1c, 0x9b, 0xd9, 0x7e, 0x2f, 0x69, 0xb6, 0xdf, 0x98, 0xbc, 0xdf, 0xc6, 0x33, 0xd9, 0x8b,
+ 0x00, 0xa2, 0x17, 0xa2, 0x36, 0x3b, 0xb0, 0x54, 0x18, 0x50, 0x30, 0xc2, 0xc5, 0x67, 0xa1, 0xdf,
+ 0xce, 0x51, 0x73, 0x1d, 0xcc, 0xc2, 0x46, 0x94, 0x88, 0x71, 0xde, 0x91, 0x26, 0xbf, 0x30, 0xb6,
+ 0xc9, 0xbf, 0x05, 0x24, 0xb6, 0xd7, 0x95, 0x78, 0xc5, 0x78, 0x7a, 0xf7, 0xe6, 0x10, 0x07, 0xa6,
+ 0x48, 0x8d, 0x18, 0xca, 0x53, 0xc7, 0x3b, 0x94, 0x4b, 0xe3, 0x0f, 0x65, 0xf2, 0x06, 0x5c, 0x14,
+ 0xaa, 0x54, 0xfb, 0xc4, 0x81, 0xa5, 0xf1, 0xff, 0xac, 0x02, 0xbe, 0x88, 0xa3, 0x18, 0x71, 0x34,
+ 0x06, 0xef, 0x1f, 0xc3, 0xa5, 0x4d, 0xae, 0x5c, 0xb7, 0x46, 0x2f, 0x0c, 0xcb, 0x29, 0x3c, 0x98,
+ 0x2a, 0xc9, 0x87, 0x18, 0xe3, 0xc3, 0x50, 0xdf, 0xb6, 0x68, 0x53, 0xa5, 0xb7, 0x83, 0x21, 0xb6,
+ 0xb9, 0xd6, 0x50, 0x14, 0x8c, 0x70, 0xa5, 0xd9, 0xea, 0xe9, 0x23, 0xda, 0xea, 0x1b, 0x22, 0x30,
+ 0xd4, 0x8a, 0x2d, 0x09, 0xca, 0xe0, 0x07, 0x07, 0x16, 0x96, 0x93, 0x0c, 0x38, 0x2c, 0x23, 0x96,
+ 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b, 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x3c, 0x98, 0x2a, 0xc9,
+ 0x9d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c, 0x27, 0x0e, 0x78, 0x3a, 0xee, 0xa4, 0xbc, 0x3c, 0xcc, 0x82,
+ 0x69, 0x72, 0x93, 0x98, 0xb7, 0x6f, 0x67, 0xe1, 0xdc, 0x0d, 0xaa, 0x12, 0xe8, 0x1b, 0x4e, 0xd3,
+ 0xb7, 0x6b, 0xff, 0x4f, 0x77, 0x59, 0xef, 0x66, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d,
+ 0xd2, 0x86, 0xe2, 0x03, 0x11, 0x11, 0x51, 0x71, 0x90, 0xf1, 0xcf, 0x0a, 0xc8, 0xc0, 0x4a, 0x68,
+ 0x82, 0xe5, 0x3b, 0x2a, 0x78, 0xde, 0x52, 0x1d, 0xba, 0x47, 0x65, 0xe6, 0xac, 0x14, 0xb6, 0xd4,
+ 0x6d, 0x5e, 0x88, 0x92, 0x46, 0xde, 0x84, 0x29, 0x8f, 0x39, 0xae, 0x6f, 0xa4, 0x27, 0x89, 0x7a,
+ 0x6d, 0xd4, 0xbf, 0xde, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f, 0x03,
+ 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea, 0xf8,
+ 0xa1, 0xe1, 0x68, 0x36, 0x53, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9,
+ 0x15, 0x52, 0xb5, 0x43, 0x90, 0xbc, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0x47, 0x59, 0xb8, 0x70,
+ 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xef, 0xc8, 0xaf, 0x0d, 0x9d, 0x6d, 0xfb, 0xb9,
+ 0xc3, 0x05, 0x41, 0xe4, 0xd1, 0xa8, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0x03, 0x6d,
+ 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e, 0xff,
+ 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f, 0x6c,
+ 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0x47, 0x19, 0x98,
+ 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2, 0xa2,
+ 0xd1, 0x83, 0x4c, 0xb8, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b, 0xdd,
+ 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f, 0xe6,
+ 0xdd, 0x42, 0xac, 0x78, 0x82, 0xf8, 0xf6, 0x64, 0x09, 0xe2, 0x78, 0x85, 0x86, 0xf3, 0xc4, 0xbf,
+ 0x31, 0x9c, 0x27, 0xbe, 0x3b, 0x79, 0x9e, 0x38, 0xd1, 0x0c, 0x23, 0xd3, 0xc5, 0xdf, 0xce, 0xc1,
+ 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64, 0x11,
+ 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83, 0x5a,
+ 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b, 0x58,
+ 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x2d, 0x8c, 0x9f, 0x07,
+ 0x4b, 0x39, 0x53, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x99, 0x85, 0x42, 0xfa, 0x99,
+ 0x85, 0xc8, 0x02, 0x2b, 0xcf, 0x2c, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6, 0x5d,
+ 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xdb, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa, 0x73,
+ 0x6c, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x79, 0xb6, 0x67, 0xa5, 0x3b, 0x3d,
+ 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f, 0xd7,
+ 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a, 0x8f,
+ 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xd8, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06, 0x73,
+ 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x71, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x4e, 0x77, 0x05,
+ 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32, 0x0c,
+ 0xa8, 0xe4, 0x67, 0xa1, 0x2c, 0xe2, 0x3e, 0x4b, 0x6e, 0xdb, 0xab, 0x96, 0x45, 0x26, 0x4a, 0xd8,
+ 0xd5, 0x86, 0x5f, 0x88, 0x21, 0x9d, 0xbc, 0x00, 0xd3, 0x32, 0x1b, 0xa7, 0x8e, 0xd5, 0xca, 0x3d,
+ 0xd6, 0x99, 0xfd, 0x41, 0x6d, 0xba, 0x1e, 0x29, 0xc7, 0x18, 0x17, 0xdf, 0x4f, 0xd1, 0x20, 0x38,
+ 0x96, 0xdc, 0x4f, 0x85, 0x61, 0x33, 0x8c, 0x70, 0x91, 0x67, 0x21, 0xc7, 0x2c, 0x4f, 0xec, 0xa1,
+ 0x4a, 0xa1, 0xdf, 0xbb, 0xb9, 0xd6, 0x40, 0x5e, 0xae, 0xfd, 0x6f, 0x06, 0x4e, 0x27, 0x4e, 0x0f,
+ 0x71, 0x91, 0xbe, 0x6b, 0x29, 0x33, 0x12, 0x88, 0x6c, 0xe1, 0x1a, 0xf2, 0x72, 0xf2, 0x86, 0xf2,
+ 0x0a, 0xb3, 0x13, 0xde, 0x20, 0xb8, 0xa3, 0x33, 0x8f, 0xbb, 0x81, 0x43, 0x0e, 0xe1, 0xb5, 0x44,
+ 0xe3, 0xe4, 0xe2, 0xb1, 0xb6, 0x83, 0x1b, 0x28, 0xb2, 0xe1, 0xcc, 0x1f, 0x66, 0xc3, 0xa9, 0xfd,
+ 0x5d, 0x0e, 0x2a, 0xb7, 0x9c, 0xed, 0x4f, 0xc9, 0xf9, 0x88, 0x74, 0x8b, 0x9c, 0xfd, 0x29, 0x5a,
+ 0xe4, 0x2d, 0x78, 0x86, 0x31, 0xbe, 0xeb, 0x77, 0xec, 0xa6, 0xb7, 0xd4, 0x62, 0xd4, 0x5d, 0x35,
+ 0x6d, 0xd3, 0xdb, 0xa1, 0x4d, 0x15, 0xb9, 0xfb, 0xcc, 0xfe, 0xa0, 0xf6, 0xcc, 0xe6, 0xe6, 0x5a,
+ 0x1a, 0x0b, 0x8e, 0x92, 0x15, 0x33, 0x44, 0x37, 0x3a, 0x4e, 0xab, 0x25, 0x33, 0xdb, 0x32, 0xc7,
+ 0x23, 0x67, 0x48, 0xa4, 0x1c, 0x63, 0x5c, 0xda, 0x47, 0x19, 0x28, 0xdf, 0xd6, 0x5b, 0x1d, 0xbd,
+ 0x61, 0xda, 0x1d, 0xf2, 0x1c, 0x4c, 0x6d, 0xbb, 0x4e, 0x87, 0xba, 0x9e, 0xca, 0x34, 0x8b, 0x5d,
+ 0x4f, 0x5d, 0x16, 0xa1, 0x4f, 0xe3, 0xdb, 0x30, 0xe6, 0xf4, 0x4c, 0x23, 0xb9, 0x61, 0xdd, 0xe4,
+ 0x85, 0x28, 0x69, 0xe4, 0xbe, 0x9c, 0x47, 0xb9, 0x09, 0x8f, 0x5f, 0x6f, 0xae, 0x35, 0x64, 0xf6,
+ 0xd6, 0x9f, 0x81, 0xe4, 0xf9, 0x98, 0xe7, 0x51, 0x1e, 0xe5, 0x2b, 0x68, 0xdf, 0xcb, 0x42, 0x45,
+ 0x7e, 0x9a, 0xdc, 0x9c, 0x1d, 0xe7, 0xc7, 0xbd, 0x28, 0xa2, 0xeb, 0x5e, 0xbf, 0x4b, 0x5d, 0xb1,
+ 0x09, 0x56, 0x53, 0x2e, 0x1a, 0x2d, 0x09, 0x89, 0x41, 0x84, 0x3d, 0x2c, 0xf2, 0x5b, 0x27, 0x7f,
+ 0x82, 0xad, 0x53, 0x38, 0xb0, 0x75, 0xfe, 0x3c, 0x03, 0xe5, 0x35, 0xb3, 0x45, 0x8d, 0x3d, 0xc3,
+ 0xa2, 0xe4, 0x15, 0xa8, 0x36, 0xa9, 0x45, 0x19, 0xbd, 0xe1, 0xea, 0x06, 0xdd, 0xa0, 0xae, 0x29,
+ 0x2e, 0xdb, 0xf0, 0x51, 0x26, 0xe6, 0x71, 0x41, 0x2e, 0x97, 0x2b, 0x23, 0x78, 0x70, 0xa4, 0x34,
+ 0xb9, 0x09, 0xd3, 0x4d, 0xea, 0x99, 0x2e, 0x6d, 0x6e, 0x44, 0xbc, 0xd1, 0xe7, 0x7c, 0xdb, 0xb4,
+ 0x12, 0xa1, 0x3d, 0x1a, 0xd4, 0x66, 0x36, 0xcc, 0x1e, 0xb5, 0x4c, 0x9b, 0x4a, 0xb7, 0x34, 0x26,
+ 0xaa, 0x15, 0x20, 0xb7, 0xe6, 0xb4, 0xb5, 0xf7, 0x73, 0x10, 0x5c, 0x9f, 0x22, 0xbf, 0x95, 0x81,
+ 0x8a, 0x6e, 0xdb, 0x0e, 0x53, 0x57, 0x93, 0x64, 0x6c, 0x1f, 0x27, 0xbe, 0xa5, 0x35, 0xbf, 0x14,
+ 0x82, 0xca, 0xb0, 0x70, 0x10, 0xaa, 0x8e, 0x50, 0x30, 0xaa, 0x9b, 0xf4, 0x13, 0x91, 0xea, 0xf5,
+ 0xc9, 0x6b, 0x71, 0x88, 0xb8, 0xf4, 0xec, 0xd7, 0xe0, 0x4c, 0xb2, 0xb2, 0x47, 0x09, 0x6c, 0x4d,
+ 0x12, 0x13, 0x7b, 0xb7, 0x0c, 0x95, 0x3b, 0x3a, 0x33, 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4f,
+ 0xfd, 0x87, 0x19, 0xb8, 0x10, 0x8f, 0x19, 0x9f, 0xa0, 0x63, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0,
+ 0x54, 0x6d, 0x38, 0xa2, 0x16, 0xc2, 0xc5, 0x1e, 0x0a, 0x41, 0x9f, 0xb4, 0x8b, 0xdd, 0x18, 0xa5,
+ 0x10, 0x47, 0xd7, 0xe5, 0xd3, 0xe2, 0x62, 0x3f, 0xd9, 0xd7, 0x59, 0x12, 0x1b, 0x80, 0xa9, 0x27,
+ 0x66, 0x03, 0x50, 0x7a, 0x22, 0x1c, 0xae, 0x5e, 0x64, 0x03, 0x50, 0x9e, 0x30, 0x0e, 0xaa, 0xd2,
+ 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3, 0x7d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7,
+ 0x4c, 0x43, 0xb9, 0x9f, 0xf5, 0xf1, 0xc3, 0x12, 0xfe, 0xbd, 0x0f, 0x19, 0x63, 0x12, 0xaf, 0x28,
+ 0xb1, 0xc3, 0xfb, 0x25, 0xd9, 0x89, 0xee, 0x97, 0x90, 0x65, 0xc8, 0xdb, 0xdc, 0xd8, 0xe6, 0x8e,
+ 0x7c, 0xa3, 0xe4, 0xce, 0x6d, 0xba, 0x87, 0x42, 0x58, 0xfb, 0x61, 0x16, 0x80, 0x7f, 0xbe, 0x72,
+ 0x73, 0x1e, 0xb3, 0x19, 0xf9, 0x3c, 0x4c, 0x79, 0x7d, 0x11, 0xad, 0x55, 0x4b, 0x71, 0x18, 0x3c,
+ 0x96, 0xc5, 0xe8, 0xd3, 0xb9, 0x27, 0xf4, 0x56, 0x9f, 0xf6, 0xfd, 0x58, 0x50, 0xe0, 0x09, 0x7d,
+ 0x9d, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2, 0xde,
+ 0xc9, 0x02, 0x84, 0x01, 0x7e, 0xf2, 0xfd, 0x0c, 0x9c, 0x0f, 0x66, 0x19, 0x93, 0xb7, 0x16, 0x96,
+ 0x2d, 0xdd, 0xec, 0x4e, 0xbc, 0x91, 0x49, 0x9b, 0xe1, 0xc2, 0xec, 0x6c, 0xa4, 0xa9, 0xc3, 0xf4,
+ 0x5a, 0x10, 0x84, 0x12, 0xed, 0xf6, 0xd8, 0xde, 0x8a, 0xe9, 0xaa, 0x61, 0x97, 0x7a, 0xec, 0xff,
+ 0xba, 0xe2, 0x91, 0xa2, 0xea, 0x76, 0x87, 0x98, 0x39, 0x3e, 0x05, 0x03, 0x1c, 0xed, 0xbb, 0x59,
+ 0x38, 0x97, 0x52, 0x3b, 0xf2, 0x12, 0x9c, 0x51, 0x19, 0x8e, 0xf0, 0xea, 0x6e, 0x26, 0xbc, 0xba,
+ 0xdb, 0x48, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x01, 0xa0, 0x1b, 0x06, 0xf5, 0xbc, 0x75, 0xa7, 0xe9,
+ 0x3b, 0x7d, 0x2f, 0xf2, 0x4d, 0xe5, 0x52, 0x50, 0xfa, 0x68, 0x50, 0xfb, 0x62, 0x5a, 0xaa, 0x2a,
+ 0xf1, 0xf5, 0xa1, 0x00, 0x46, 0x20, 0xc9, 0xeb, 0x00, 0xf2, 0x2e, 0x49, 0x70, 0xd8, 0xf2, 0x31,
+ 0x91, 0xf4, 0x79, 0xff, 0x9e, 0xc3, 0xfc, 0xd7, 0xfb, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f, 0x4e,
+ 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4, 0x4a,
+ 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x97, 0x07, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec, 0xc8,
+ 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7, 0x97,
+ 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76, 0x7f,
+ 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf, 0x1d,
+ 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x56, 0x70,
+ 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a, 0x6c,
+ 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1, 0xef,
+ 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13, 0x1c,
+ 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06, 0xf5,
+ 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03, 0x55,
+ 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xeb, 0x22, 0x6c, 0x4f,
+ 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe, 0x4e,
+ 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0x3e, 0x49, 0xe1, 0x98,
+ 0x8c, 0xc7, 0x01, 0x77, 0x4a, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x8e,
+ 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0, 0xcc,
+ 0x94, 0x27, 0xeb, 0x5f, 0x49, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc, 0x62,
+ 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c, 0x4b,
+ 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a, 0x4d,
+ 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0x67, 0x0e, 0x67, 0xbd, 0xb8, 0x3d, 0x0c, 0x83, 0x2e, 0x6b,
+ 0x21, 0x0c, 0x46, 0x31, 0xc9, 0x55, 0xa8, 0xec, 0x8a, 0x19, 0x29, 0x6f, 0x53, 0x14, 0x84, 0x39,
+ 0x17, 0x16, 0xf6, 0x5e, 0x58, 0x8c, 0x51, 0x1e, 0x2e, 0x22, 0x3d, 0x01, 0x29, 0x52, 0x0c, 0x45,
+ 0x1a, 0x61, 0x31, 0x46, 0x79, 0x44, 0xae, 0xc2, 0xb4, 0x3b, 0x52, 0x60, 0x4a, 0x08, 0xc8, 0x5c,
+ 0x85, 0x5f, 0x88, 0x21, 0x9d, 0x5c, 0x81, 0x52, 0xbf, 0xd9, 0x92, 0xbc, 0x25, 0xc1, 0x2b, 0xfc,
+ 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xa7, 0x6a, 0xff, 0x95, 0x01, 0x32, 0x9c, 0xd4, 0x26,
+ 0x3b, 0x50, 0xb4, 0x45, 0x54, 0x65, 0xe2, 0x2b, 0xd5, 0x91, 0xe0, 0x8c, 0x9c, 0x63, 0xaa, 0x40,
+ 0xe1, 0x13, 0x1b, 0x4a, 0xf4, 0x21, 0xa3, 0xae, 0xad, 0x5b, 0xca, 0xf5, 0x38, 0x9e, 0xeb, 0xdb,
+ 0xd2, 0xe1, 0x54, 0xc8, 0x18, 0xe8, 0xd0, 0x7e, 0x9c, 0x85, 0x4a, 0x84, 0xef, 0x71, 0x9b, 0x15,
+ 0x71, 0x66, 0x54, 0x06, 0x33, 0xb6, 0x5c, 0x4b, 0x0d, 0xd3, 0xc8, 0x99, 0x51, 0x45, 0xc2, 0x35,
+ 0x8c, 0xf2, 0x91, 0x45, 0x80, 0xae, 0xee, 0x31, 0xea, 0x8a, 0xa5, 0x24, 0x71, 0x52, 0x73, 0x3d,
+ 0xa0, 0x60, 0x84, 0x8b, 0x5c, 0x56, 0x97, 0xfb, 0xf3, 0xf1, 0x4b, 0x53, 0x23, 0x6e, 0xee, 0x17,
+ 0x8e, 0xe1, 0xe6, 0x3e, 0x69, 0xc3, 0x19, 0xbf, 0xd6, 0x3e, 0x55, 0xd9, 0xb9, 0x43, 0x02, 0x4b,
+ 0x67, 0x3c, 0x01, 0x81, 0x43, 0xa0, 0xda, 0x0f, 0x33, 0x30, 0x13, 0xdb, 0x4a, 0xf3, 0xad, 0x5d,
+ 0x78, 0x24, 0x23, 0xb2, 0xb5, 0x8b, 0x9d, 0xa4, 0x78, 0x1e, 0x8a, 0xb2, 0x81, 0x54, 0xc3, 0x07,
+ 0x66, 0x44, 0x36, 0x21, 0x2a, 0x2a, 0x37, 0x08, 0x2a, 0x58, 0x97, 0x34, 0x08, 0x2a, 0x9a, 0x87,
+ 0x3e, 0x9d, 0x7c, 0x01, 0x4a, 0x7e, 0xed, 0x54, 0x4b, 0x87, 0xff, 0x75, 0x50, 0xe5, 0x18, 0x70,
+ 0x68, 0xdf, 0x2a, 0x80, 0xfc, 0x29, 0x05, 0x97, 0x6b, 0x9a, 0x9e, 0xcc, 0x52, 0x65, 0x44, 0x96,
+ 0x2a, 0x90, 0x5b, 0x51, 0xe5, 0x18, 0x70, 0x90, 0x8b, 0x90, 0xeb, 0x9a, 0xb6, 0x0a, 0x2b, 0x8a,
+ 0x5d, 0xe5, 0xba, 0x69, 0x23, 0x2f, 0x13, 0x24, 0xfd, 0xa1, 0x4a, 0xb4, 0x48, 0x92, 0xfe, 0x10,
+ 0x79, 0x19, 0x77, 0x2e, 0x2d, 0xc7, 0xe9, 0x6c, 0xeb, 0x46, 0xc7, 0x0f, 0x7d, 0xe7, 0xc5, 0xec,
+ 0x15, 0xce, 0xe5, 0x5a, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e, 0xd5, 0x74, 0x1e, 0xd8,
+ 0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8e, 0x93, 0x30, 0xc9, 0x4b, 0xb6, 0xe0, 0x99, 0xb7, 0xa9, 0xeb,
+ 0xa8, 0x16, 0x6b, 0x58, 0x94, 0xf6, 0x7c, 0x18, 0x69, 0xa0, 0x44, 0x56, 0xe8, 0xd5, 0x74, 0x16,
+ 0x1c, 0x25, 0x2b, 0x92, 0x4d, 0xba, 0xdb, 0xa6, 0x6c, 0xc3, 0x75, 0xf8, 0xde, 0xc9, 0xb4, 0xdb,
+ 0x3e, 0xec, 0x54, 0x08, 0xbb, 0x99, 0xce, 0x82, 0xa3, 0x64, 0xc9, 0x3a, 0x9c, 0x95, 0xa4, 0x88,
+ 0xcf, 0xac, 0x6c, 0x5d, 0x6d, 0x7f, 0x50, 0xfb, 0xcc, 0x0a, 0xed, 0xb9, 0xd4, 0xe0, 0x06, 0x7a,
+ 0x33, 0xc9, 0x86, 0xc3, 0x92, 0xe2, 0x57, 0x51, 0x2a, 0xdc, 0xbb, 0x41, 0x5d, 0xd1, 0xe5, 0x22,
+ 0x76, 0xa4, 0x1c, 0x73, 0x4c, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x02, 0xd5, 0x28, 0xec, 0xd2, 0xae,
+ 0x6e, 0x5a, 0xfa, 0xb6, 0x69, 0x99, 0x6c, 0x4f, 0xe4, 0x8a, 0x67, 0x64, 0x30, 0x72, 0x73, 0x04,
+ 0x0f, 0x8e, 0x94, 0xd6, 0xfe, 0x20, 0x07, 0xe2, 0xaf, 0x42, 0xe4, 0x3e, 0xe4, 0x2c, 0xa7, 0xad,
+ 0x4c, 0xf2, 0xf8, 0x91, 0x8e, 0x35, 0xa7, 0x2d, 0x07, 0xde, 0x9a, 0xd3, 0x46, 0x8e, 0x48, 0x0c,
+ 0x28, 0x74, 0xf4, 0x56, 0x47, 0x57, 0x16, 0x78, 0x7c, 0x7f, 0x23, 0x48, 0xe4, 0xa9, 0x1b, 0xa2,
+ 0xfc, 0x15, 0x25, 0x36, 0x77, 0x6c, 0xb6, 0xfd, 0xdf, 0x84, 0xa8, 0xad, 0xdf, 0x04, 0xb1, 0x31,
+ 0x1f, 0x49, 0xae, 0x82, 0xc1, 0x2b, 0x86, 0x3a, 0x88, 0x01, 0xc5, 0x7e, 0x53, 0xfc, 0xdd, 0x29,
+ 0x3f, 0xa1, 0x17, 0xb3, 0xb5, 0x22, 0xbe, 0x49, 0xac, 0x5f, 0xf2, 0x19, 0x15, 0xb4, 0xf6, 0x17,
+ 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb, 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67,
+ 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19, 0xbc, 0x96, 0x14, 0x25, 0x8e, 0xf6, 0xa7, 0x79,
+ 0x50, 0xbf, 0xc2, 0x22, 0x7d, 0x28, 0xb7, 0xfd, 0x9b, 0xab, 0xaa, 0xca, 0x2f, 0x4f, 0x70, 0xc3,
+ 0x21, 0x76, 0x07, 0x56, 0xf6, 0x4e, 0x50, 0x88, 0xa1, 0x26, 0x42, 0xe3, 0x63, 0x6e, 0x65, 0xc2,
+ 0x31, 0x27, 0xd5, 0x0d, 0x8f, 0x3a, 0x1d, 0xf2, 0x3b, 0x8c, 0xf5, 0x26, 0x3e, 0x88, 0x1b, 0x9e,
+ 0xb1, 0x95, 0x61, 0x3c, 0xfe, 0x8e, 0x02, 0x9a, 0xab, 0xb0, 0xf5, 0x63, 0xb8, 0xe1, 0x1e, 0x86,
+ 0x50, 0x55, 0x84, 0x55, 0x67, 0x1e, 0x0a, 0x68, 0xf2, 0xeb, 0x50, 0x61, 0xae, 0x6e, 0x7b, 0x2d,
+ 0xc7, 0xed, 0x52, 0x57, 0x2d, 0xfe, 0xab, 0x13, 0x8c, 0xe7, 0xcd, 0x10, 0x4d, 0x46, 0x3d, 0x62,
+ 0x45, 0x18, 0xd5, 0xa6, 0x75, 0x41, 0xb9, 0xed, 0xc4, 0x88, 0xfd, 0x49, 0x40, 0x66, 0x3a, 0x17,
+ 0x0e, 0x37, 0x16, 0x83, 0xbb, 0xe4, 0x91, 0xbb, 0x75, 0xa9, 0xbf, 0x0c, 0xd0, 0xfe, 0x39, 0x0b,
+ 0xb9, 0xcd, 0xb5, 0x86, 0xbc, 0x2a, 0x22, 0x7e, 0xac, 0x41, 0x1b, 0x1d, 0xb3, 0x77, 0x8f, 0xba,
+ 0x66, 0x6b, 0x4f, 0xad, 0xbd, 0x91, 0xab, 0x22, 0x49, 0x0e, 0x4c, 0x91, 0x22, 0xaf, 0xc1, 0xb4,
+ 0xa1, 0x2f, 0x53, 0x97, 0x49, 0x17, 0xe6, 0x68, 0x51, 0x73, 0x71, 0x82, 0x61, 0x79, 0x29, 0x14,
+ 0xc7, 0x18, 0x18, 0xd9, 0x02, 0x30, 0x42, 0xe8, 0x23, 0x45, 0xd2, 0xe5, 0xaf, 0x13, 0x42, 0xe0,
+ 0x08, 0x10, 0x41, 0x28, 0x77, 0x38, 0xab, 0x40, 0xcd, 0x1f, 0x05, 0x55, 0x4c, 0xba, 0xdb, 0xbe,
+ 0x2c, 0x86, 0x30, 0xda, 0x7f, 0x64, 0x20, 0xdc, 0x04, 0x12, 0x0f, 0x8a, 0x4d, 0x71, 0x6b, 0x5b,
+ 0x4d, 0xfb, 0xf1, 0x37, 0xd3, 0xf1, 0x1f, 0x96, 0xd4, 0xc9, 0xfe, 0xa0, 0x96, 0xf8, 0x89, 0x09,
+ 0x2a, 0x55, 0xa4, 0x0d, 0xb9, 0x37, 0x9d, 0xed, 0x89, 0x67, 0x7d, 0xe4, 0xfc, 0x8f, 0xdc, 0x39,
+ 0x45, 0x0a, 0x90, 0x6b, 0xd0, 0xbe, 0x95, 0x85, 0x4a, 0x64, 0x4c, 0x4f, 0xfc, 0x53, 0x82, 0x87,
+ 0x89, 0x9f, 0x12, 0x6c, 0x8c, 0xbf, 0x2b, 0x0f, 0x6b, 0x75, 0xd2, 0xff, 0x25, 0xf8, 0xdb, 0x2c,
+ 0xe4, 0xb6, 0x56, 0x56, 0xf9, 0xe2, 0x1b, 0x9c, 0x03, 0x9a, 0x38, 0x31, 0x15, 0xfe, 0x13, 0x4d,
+ 0x8c, 0xb4, 0xe0, 0x15, 0x43, 0x1d, 0x64, 0x07, 0xa6, 0xb6, 0xfb, 0xa6, 0xc5, 0x4c, 0x7b, 0xe2,
+ 0x53, 0x67, 0xfe, 0x3f, 0x1c, 0xd4, 0x71, 0x19, 0x89, 0x8a, 0x3e, 0x3c, 0x69, 0xc3, 0x54, 0x5b,
+ 0x5e, 0x03, 0x51, 0x73, 0xef, 0xa5, 0xf1, 0x57, 0x2f, 0x89, 0x23, 0x15, 0xa9, 0x17, 0xf4, 0xd1,
+ 0xb5, 0x6f, 0x82, 0x5a, 0xfc, 0x89, 0x77, 0x32, 0xad, 0x19, 0x04, 0x86, 0xd2, 0x5a, 0x54, 0xfb,
+ 0xcf, 0x0c, 0xc4, 0xad, 0xf4, 0x27, 0xdf, 0xa9, 0x9d, 0x64, 0xa7, 0xae, 0x1c, 0xc7, 0x1c, 0x48,
+ 0xef, 0x57, 0xed, 0xaf, 0xb3, 0x50, 0x54, 0x3f, 0x0b, 0x3d, 0xf9, 0xec, 0x07, 0x8d, 0x65, 0x3f,
+ 0x96, 0x27, 0xfc, 0x75, 0xe2, 0xc8, 0xdc, 0x47, 0x37, 0x91, 0xfb, 0x98, 0xf4, 0x1f, 0x8d, 0x8f,
+ 0xc9, 0x7c, 0xfc, 0x7d, 0x06, 0x4e, 0x49, 0xc6, 0x9b, 0xb6, 0xc7, 0x74, 0xdb, 0x10, 0x4e, 0xb1,
+ 0x8c, 0x44, 0x4d, 0x1c, 0xda, 0x53, 0x61, 0x68, 0xe1, 0xae, 0xca, 0x67, 0x54, 0xd0, 0x7c, 0xb3,
+ 0xbc, 0xe3, 0x78, 0x4c, 0x98, 0xdb, 0x6c, 0x7c, 0x93, 0xfd, 0xb2, 0x2a, 0xc7, 0x80, 0x23, 0xb9,
+ 0x7b, 0x2f, 0x8c, 0xde, 0xbd, 0x6b, 0x7f, 0x96, 0x81, 0xe9, 0xe8, 0xdf, 0x29, 0xc7, 0x4f, 0xe4,
+ 0x24, 0xf2, 0x28, 0xd9, 0x13, 0xc8, 0xa3, 0x7c, 0x98, 0x01, 0xf0, 0x2b, 0x7b, 0xe2, 0x59, 0x94,
+ 0x66, 0x3c, 0x8b, 0x32, 0x71, 0xb7, 0xa6, 0xe7, 0x50, 0x7e, 0x50, 0xf0, 0x3f, 0x49, 0x64, 0x50,
+ 0xde, 0xcb, 0xc0, 0x29, 0x3d, 0x96, 0x95, 0x98, 0xd8, 0x93, 0x48, 0x24, 0x39, 0x82, 0xbf, 0x79,
+ 0xc6, 0xcb, 0x31, 0xa1, 0x96, 0x5c, 0x83, 0xe9, 0x9e, 0x0a, 0x15, 0xdf, 0x09, 0x47, 0x5d, 0x70,
+ 0x00, 0x79, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x63, 0xb2, 0x40, 0xb9, 0x63, 0xc9, 0x02, 0x45, 0x8f,
+ 0x9a, 0xe5, 0x0f, 0x3c, 0x6a, 0x66, 0x43, 0xb9, 0xe5, 0x3a, 0x5d, 0x91, 0x68, 0x51, 0xff, 0x4e,
+ 0x9c, 0x30, 0x79, 0x13, 0x2c, 0x2a, 0xab, 0x3e, 0x2e, 0x86, 0x2a, 0xf8, 0x32, 0xcd, 0x1c, 0xa9,
+ 0xad, 0x78, 0x1c, 0xda, 0x82, 0xa9, 0xbb, 0x29, 0x51, 0xd1, 0x87, 0x8f, 0x27, 0x53, 0xa6, 0x3e,
+ 0x99, 0x64, 0x8a, 0xf6, 0x4f, 0x59, 0xdf, 0x5e, 0x34, 0x12, 0x77, 0x92, 0x32, 0x23, 0xee, 0x24,
+ 0xa9, 0xdb, 0xb5, 0xd1, 0x74, 0xc3, 0xf3, 0x50, 0x74, 0xa9, 0xee, 0x39, 0xb6, 0xba, 0xa7, 0x1e,
+ 0x58, 0x5b, 0x14, 0xa5, 0xa8, 0xa8, 0xd1, 0xb4, 0x44, 0xf6, 0x31, 0x69, 0x89, 0x2f, 0x44, 0x06,
+ 0x84, 0xcc, 0xff, 0x06, 0x73, 0x3b, 0x65, 0x50, 0x88, 0x98, 0xa5, 0xfa, 0x25, 0x7f, 0x21, 0x19,
+ 0xb3, 0x54, 0xbf, 0xcb, 0x0f, 0x38, 0x48, 0x13, 0xa6, 0x2d, 0xdd, 0x63, 0x22, 0x2a, 0xd5, 0x5c,
+ 0x62, 0x63, 0xe4, 0x3c, 0x82, 0x69, 0xb3, 0x16, 0xc1, 0xc1, 0x18, 0xaa, 0xf6, 0x7b, 0x19, 0x08,
+ 0x9b, 0xfc, 0x88, 0xd1, 0xd1, 0x57, 0xa0, 0xd4, 0xd5, 0x1f, 0xae, 0x50, 0x4b, 0xdf, 0x9b, 0xe4,
+ 0xef, 0x57, 0xeb, 0x0a, 0x03, 0x03, 0x34, 0x6d, 0x90, 0x01, 0x75, 0x63, 0x97, 0x50, 0x28, 0xb4,
+ 0xcc, 0x87, 0xaa, 0x3e, 0x93, 0x78, 0x2a, 0x91, 0xff, 0xad, 0xc9, 0xf8, 0x82, 0x28, 0x40, 0x89,
+ 0x4e, 0xba, 0x30, 0xe5, 0xc9, 0xf0, 0x8f, 0xfa, 0x94, 0xf1, 0x77, 0xe5, 0xb1, 0x30, 0x92, 0xba,
+ 0xee, 0x2b, 0x8b, 0xd0, 0xd7, 0x51, 0x9f, 0xff, 0xe0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfc, 0x78, 0xee,
+ 0xa9, 0x8f, 0x3e, 0x9e, 0x7b, 0xea, 0x9d, 0xfd, 0xb9, 0xcc, 0x07, 0xfb, 0x73, 0x99, 0x0f, 0xf7,
+ 0xe7, 0x32, 0x1f, 0xed, 0xcf, 0x65, 0xfe, 0x6d, 0x7f, 0x2e, 0xf3, 0xbb, 0xff, 0x3e, 0xf7, 0xd4,
+ 0xab, 0x25, 0x1f, 0xf3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xe6, 0xa8, 0xb2, 0x02, 0x64,
+ 0x00, 0x00,
}
func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) {
@@ -3167,11 +3167,13 @@ func (m *Edge) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
- i -= len(m.OnFull)
- copy(dAtA[i:], m.OnFull)
- i = encodeVarintGenerated(dAtA, i, uint64(len(m.OnFull)))
- i--
- dAtA[i] = 0x32
+ if m.OnFull != nil {
+ i -= len(*m.OnFull)
+ copy(dAtA[i:], *m.OnFull)
+ i = encodeVarintGenerated(dAtA, i, uint64(len(*m.OnFull)))
+ i--
+ dAtA[i] = 0x32
+ }
if m.Parallelism != nil {
i = encodeVarintGenerated(dAtA, i, uint64(*m.Parallelism))
i--
@@ -6813,8 +6815,10 @@ func (m *Edge) Size() (n int) {
if m.Parallelism != nil {
n += 1 + sovGenerated(uint64(*m.Parallelism))
}
- l = len(m.OnFull)
- n += 1 + l + sovGenerated(uint64(l))
+ if m.OnFull != nil {
+ l = len(*m.OnFull)
+ n += 1 + l + sovGenerated(uint64(l))
+ }
return n
}
@@ -8246,7 +8250,7 @@ func (this *Edge) String() string {
`Conditions:` + strings.Replace(this.Conditions.String(), "ForwardConditions", "ForwardConditions", 1) + `,`,
`Limits:` + strings.Replace(this.Limits.String(), "EdgeLimits", "EdgeLimits", 1) + `,`,
`Parallelism:` + valueToStringGenerated(this.Parallelism) + `,`,
- `OnFull:` + fmt.Sprintf("%v", this.OnFull) + `,`,
+ `OnFull:` + valueToStringGenerated(this.OnFull) + `,`,
`}`,
}, "")
return s
@@ -11575,7 +11579,8 @@ func (m *Edge) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- m.OnFull = string(dAtA[iNdEx:postIndex])
+ s := string(dAtA[iNdEx:postIndex])
+ m.OnFull = &s
iNdEx = postIndex
default:
iNdEx = preIndex
diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto
index e6abdd67d3..cf0718357b 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.proto
+++ b/pkg/apis/numaflow/v1alpha1/generated.proto
@@ -277,8 +277,9 @@ message Edge {
optional int32 parallelism = 5;
// OnFull specifies the behaviour for the write actions when the inter step buffer is full.
- // if not provided, the default value is set to "", which currently has the same effect as "retryUntilSuccess".
- // +kubebuilder:validation:Enum="";retryUntilSuccess;dropAndAckLatest
+ // There are currently two options, retryUntilSuccess and discardLatest.
+ // if not provided, the default value is set to "retryUntilSuccess"
+ // +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest
// +optional
optional string onFull = 6;
}
diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
index 1fc84b3f42..aed25bc0c4 100644
--- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go
+++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
@@ -905,8 +905,7 @@ func schema_pkg_apis_numaflow_v1alpha1_Edge(ref common.ReferenceCallback) common
},
"onFull": {
SchemaProps: spec.SchemaProps{
- Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. if not provided, the default value is set to \"\", which currently has the same effect as \"retryUntilSuccess\".",
- Default: "",
+ Description: "OnFull specifies the behaviour for the write actions when the inter step buffer is full. There are currently two options, retryUntilSuccess and discardLatest. if not provided, the default value is set to \"retryUntilSuccess\"",
Type: []string{"string"},
Format: "",
},
diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
index 1e09b34b9d..002170ce97 100644
--- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
@@ -408,6 +408,11 @@ func (in *Edge) DeepCopyInto(out *Edge) {
*out = new(int32)
**out = **in
}
+ if in.OnFull != nil {
+ in, out := &in.OnFull, &out.OnFull
+ *out = new(string)
+ **out = **in
+ }
return
}
diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go
index 3ee53256be..8cf629445d 100644
--- a/pkg/forward/forward.go
+++ b/pkg/forward/forward.go
@@ -23,7 +23,6 @@ import (
"context"
"fmt"
"math"
- "strings"
"sync"
"time"
@@ -47,11 +46,9 @@ type InterStepDataForward struct {
ctx context.Context
// cancelFn cancels our new context, our cancellation is little more complex and needs to be well orchestrated, hence
// we need something more than a cancel().
- cancelFn context.CancelFunc
- fromBuffer isb.BufferReader
- toBuffers map[string]isb.BufferWriter
- // key is the toBuffer name, value is the corresponding onFull action.
- onFullActions map[string]string
+ cancelFn context.CancelFunc
+ fromBuffer isb.BufferReader
+ toBuffers map[string]isb.BufferWriter
FSD ToWhichStepDecider
UDF applier.MapApplier
fetchWatermark fetch.Fetcher
@@ -71,7 +68,6 @@ func NewInterStepDataForward(vertex *dfv1.Vertex,
fromStep isb.BufferReader,
toSteps map[string]isb.BufferWriter,
fsd ToWhichStepDecider,
- onFullActions map[string]string,
applyUDF applier.MapApplier,
fetchWatermark fetch.Fetcher,
publishWatermark map[string]publish.Publisher,
@@ -91,7 +87,6 @@ func NewInterStepDataForward(vertex *dfv1.Vertex,
cancelFn: cancel,
fromBuffer: fromStep,
toBuffers: toSteps,
- onFullActions: onFullActions,
FSD: fsd,
UDF: applyUDF,
fetchWatermark: fetchWatermark,
@@ -490,19 +485,16 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is
for {
_writeOffsets, errs := toBuffer.Write(ctx, messages)
// Note: this is an unwanted memory allocation during a happy path. We want only minimal allocation since using failedMessages is an unlikely path.
- failedMessages := make([]isb.Message, 0, len(messages))
+ var failedMessages []isb.Message
needRetry := false
-
for idx, msg := range messages {
if err := errs[idx]; err != nil {
// ATM there are no user defined errors during write, all are InternalErrors.
-
- // using `strings.Contains` to check BufferFull error type is not a good practice for two reasons:
- // 1. it's an O(n) operation which, if being called frequently, can introduce performance issue.
- // 2. it assumes that all the buffer implementations implement err.Error() to use "Buffer full" as error message content.
- // TODO - a better way could be to declare a BufferFullError type and use type check instead of checking error message.
- needRetry = !(isdf.onFullActions[toBuffer.GetName()] == dfv1.DropAndAckLatest && strings.Contains(err.Error(), "Buffer full"))
- if needRetry {
+ if _, ok := err.(isb.NoRetryableBufferWriteErr); ok {
+ // If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message.
+ dropBytes += float64(len(msg.Payload))
+ } else {
+ needRetry = true
// we retry only failed messages
failedMessages = append(failedMessages, msg)
writeMessagesError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName, "buffer": toBuffer.GetName()}).Inc()
@@ -511,9 +503,6 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is
platformError.With(map[string]string{metrics.LabelVertex: isdf.vertexName, metrics.LabelPipeline: isdf.pipelineName}).Inc()
return writeOffsets, fmt.Errorf("writeToBuffer failed, Stop called while stuck on an internal error with failed messages:%d, %v", len(failedMessages), errs)
}
- } else {
- // drop the message
- dropBytes += float64(len(msg.Payload))
}
} else {
writeCount++
diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go
index cb5bfb5632..2d980332ce 100644
--- a/pkg/forward/forward_test.go
+++ b/pkg/forward/forward_test.go
@@ -96,9 +96,6 @@ func TestNewInterStepDataForward(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
@@ -113,7 +110,7 @@ func TestNewInterStepDataForward(t *testing.T) {
writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime)
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -229,9 +226,6 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -247,7 +241,7 @@ func TestNewInterStepDataForwardIdleWatermark(t *testing.T) {
fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -397,9 +391,6 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -414,7 +405,7 @@ func TestNewInterStepDataForwardIdleWatermark_Reset(t *testing.T) {
fetchWatermark := &testWMBFetcher{WMBTestSameHeadWMB: true}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -581,9 +572,6 @@ func TestSourceInterStepDataForward(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
AbstractVertex: dfv1.AbstractVertex{
@@ -598,13 +586,13 @@ func TestSourceInterStepDataForward(t *testing.T) {
_, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
// verify if source watermark publisher is not set, NewInterStepDataForward throws.
- failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource))
+ failedForwarder, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource))
assert.True(t, failedForwarder == nil)
assert.Error(t, err)
assert.Equal(t, fmt.Errorf("failed to assign a non-nil source watermark publisher for source vertex data forwarder"), err)
// create a valid source forwarder
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, actionsOnFull, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{}))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, mySourceForwardTest{}, mySourceForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(5), WithVertexType(dfv1.VertexTypeSource), WithSourceWatermarkPublisher(TestSourceWatermarkPublisher{}))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -634,17 +622,13 @@ func TestSourceInterStepDataForward(t *testing.T) {
<-stopped
}
-// TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess explicitly tests the case of retrying failed messages
-func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) {
+// TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages
+func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing.T) {
fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
to1 := simplebuffer.NewInMemoryBuffer("to1", 10)
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -657,7 +641,7 @@ func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -689,16 +673,13 @@ func TestWriteToBufferError_ActionOnFullIsRetryUntilSuccess(t *testing.T) {
<-stopped
}
-// TestWriteToBufferError_ActionOnFullIsDropAndAckLatest explicitly tests the case of dropping messages when buffer is full
-func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) {
+// TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full
+func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) {
fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
- to1 := simplebuffer.NewInMemoryBuffer("to1", 10)
+ to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithOnFullWritingStrategy(dfv1.DiscardLatest))
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.DropAndAckLatest,
- }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -710,7 +691,7 @@ func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(10))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -721,7 +702,7 @@ func TestWriteToBufferError_ActionOnFullIsDropAndAckLatest(t *testing.T) {
messageToStep["to1"] = make([]isb.Message, 0)
messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...)
_, err = f.writeToBuffers(ctx, messageToStep)
- // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DropAndAckLatest,
+ // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DiscardLatest,
// the writeToBuffers() call should return no error.
assert.Nil(t, err)
// stop will cancel the contexts and therefore the forwarder stops without waiting
@@ -738,11 +719,6 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) {
"to1": to1,
"to2": to2,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- "to2": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -757,7 +733,7 @@ func TestNewInterStepDataForwardToOneStep(t *testing.T) {
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, actionsOnFull, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardTest{}, myForwardTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -839,11 +815,6 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) {
"to1": to1,
"to2": to2,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- "to2": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -858,7 +829,7 @@ func TestNewInterStepDataForward_dropAll(t *testing.T) {
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, actionsOnFull, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardDropTest{}, myForwardDropTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -937,10 +908,6 @@ func TestNewInterStepData_forwardToAll(t *testing.T) {
"to1": to1,
"to2": to2,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- "to2": dfv1.RetryUntilSuccess,
- }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -954,7 +921,7 @@ func TestNewInterStepData_forwardToAll(t *testing.T) {
}}
fetchWatermark := &testForwardFetcher{}
publishWatermark, otStores := buildPublisherMapAndOTStore(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, actionsOnFull, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardToAllTest{}, myForwardToAllTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2), WithVertexType(dfv1.VertexTypeMapUDF))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -1039,10 +1006,6 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -1056,7 +1019,7 @@ func TestNewInterStepDataForward_WithInternalError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, actionsOnFull, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardInternalErrTest{}, myForwardInternalErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.False(t, to1.IsFull())
assert.True(t, to1.IsEmpty())
@@ -1089,9 +1052,6 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -1105,7 +1065,7 @@ func TestNewInterStepDataForward_WhereToError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, actionsOnFull, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyWhereToErrTest{}, myForwardApplyWhereToErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.True(t, to1.IsEmpty())
@@ -1139,10 +1099,6 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
@@ -1156,7 +1112,7 @@ func TestNewInterStepDataForward_UDFError(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, actionsOnFull, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myForwardApplyUDFErrTest{}, myForwardApplyUDFErrTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
assert.True(t, to1.IsEmpty())
diff --git a/pkg/forward/shutdown_test.go b/pkg/forward/shutdown_test.go
index b7f851ed07..5b2f9231d0 100644
--- a/pkg/forward/shutdown_test.go
+++ b/pkg/forward/shutdown_test.go
@@ -47,10 +47,6 @@ func TestInterStepDataForward_Stop(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -65,7 +61,7 @@ func TestInterStepDataForward_Stop(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
stopped := f.Start()
// write some data but buffer is not full even though we are not reading
@@ -84,10 +80,6 @@ func TestInterStepDataForward_ForceStop(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
@@ -102,7 +94,7 @@ func TestInterStepDataForward_ForceStop(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, actionsOnFull, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
+ f, err := NewInterStepDataForward(vertex, fromStep, toSteps, myShutdownTest{}, myShutdownTest{}, fetchWatermark, publishWatermark, WithReadBatchSize(2))
assert.NoError(t, err)
stopped := f.Start()
// write some data such that the fromBuffer can be empty, that is toBuffer gets full
diff --git a/pkg/isb/errors.go b/pkg/isb/errors.go
index 2ecd890f1e..c30cbd39f6 100644
--- a/pkg/isb/errors.go
+++ b/pkg/isb/errors.go
@@ -96,3 +96,13 @@ type MessageReadErr struct {
func (e MessageReadErr) Error() string {
return fmt.Sprintf("(%s) %s Header: %s Body:%s", e.Name, e.Message, string(e.Header), string(e.Body))
}
+
+// NoRetryableBufferWriteErr indicates that the buffer is full and the writer, based on user specification, decides to not retry.
+type NoRetryableBufferWriteErr struct {
+ Name string
+ Message string
+}
+
+func (e NoRetryableBufferWriteErr) Error() string {
+ return fmt.Sprintf("(%s) %s %#v", e.Name, e.Message, e)
+}
diff --git a/pkg/isb/interfaces.go b/pkg/isb/interfaces.go
index de18a3f7c1..20a680f173 100644
--- a/pkg/isb/interfaces.go
+++ b/pkg/isb/interfaces.go
@@ -51,7 +51,6 @@ type BufferWriter interface {
BufferWriterInformation
io.Closer
Write(context.Context, []Message) ([]Offset, []error)
- IsFull() bool
}
// BufferReader is the buffer from which we are reading.
diff --git a/pkg/isb/stores/jetstream/options.go b/pkg/isb/stores/jetstream/options.go
index 6af8ba6284..49ec9da565 100644
--- a/pkg/isb/stores/jetstream/options.go
+++ b/pkg/isb/stores/jetstream/options.go
@@ -32,14 +32,17 @@ type writeOptions struct {
refreshInterval time.Duration
// useWriteInfoAsRate indicates whether to check the write sequence for rate calculation
useWriteInfoAsRate bool
+ // onFullWritingStrategy is the writing strategy when buffer is full
+ onFullWritingStrategy dfv1.OnFullWritingStrategy
}
func defaultWriteOptions() *writeOptions {
return &writeOptions{
- maxLength: dfv1.DefaultBufferLength,
- bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
- refreshInterval: 1 * time.Second,
- useWriteInfoAsRate: false,
+ maxLength: dfv1.DefaultBufferLength,
+ bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
+ refreshInterval: 1 * time.Second,
+ useWriteInfoAsRate: false,
+ onFullWritingStrategy: dfv1.RetryUntilSuccess,
}
}
@@ -77,6 +80,14 @@ func WithUsingWriteInfoAsRate(yes bool) WriteOption {
}
}
+// WithOnFullWritingStrategy sets the writing strategy when buffer is full
+func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) WriteOption {
+ return func(o *writeOptions) error {
+ o.onFullWritingStrategy = s
+ return nil
+ }
+}
+
// options for reading from JetStream
type readOptions struct {
// readTimeOut is the timeout needed for read timeout
diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go
index def0aeaed4..d6565fce43 100644
--- a/pkg/isb/stores/jetstream/writer.go
+++ b/pkg/isb/stores/jetstream/writer.go
@@ -26,6 +26,7 @@ import (
"go.uber.org/atomic"
"go.uber.org/zap"
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
"github.com/numaproj/numaflow/pkg/isb"
jsclient "github.com/numaproj/numaflow/pkg/shared/clients/nats"
"github.com/numaproj/numaflow/pkg/shared/logging"
@@ -194,11 +195,22 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([
for i := 0; i < len(errs); i++ {
errs[i] = fmt.Errorf("unknown error")
}
- if jw.IsFull() {
+ if jw.isFull.Load() {
jw.log.Debugw("Is full")
isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc()
- for i := 0; i < len(errs); i++ {
- errs[i] = isb.BufferWriteErr{Name: jw.name, Full: true, Message: "Buffer full!"}
+ // when buffer is full, we need to decide whether to discard the message or not.
+ switch jw.opts.onFullWritingStrategy {
+ case v1alpha1.DiscardLatest:
+ // user explicitly wants to discard the message when buffer if full.
+ // return no retryable error as a callback to let caller know that the message is discarded.
+ for i := 0; i < len(errs); i++ {
+ errs[i] = isb.NoRetryableBufferWriteErr{Name: jw.name, Message: "Buffer full!"}
+ }
+ default:
+ // Default behavior is to return a BufferWriteErr.
+ for i := 0; i < len(errs); i++ {
+ errs[i] = isb.BufferWriteErr{Name: jw.name, Full: true, Message: "Buffer full!"}
+ }
}
isbWriteErrors.With(labels).Inc()
return nil, errs
@@ -210,11 +222,6 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([
return jw.syncWrite(ctx, messages, errs, labels)
}
-// IsFull returns whether the buffer is full. It could be approximate.
-func (jw *jetStreamWriter) IsFull() bool {
- return jw.isFull.Load()
-}
-
func (jw *jetStreamWriter) asyncWrite(_ context.Context, messages []isb.Message, errs []error, metricsLabels map[string]string) ([]isb.Offset, []error) {
var writeOffsets = make([]isb.Offset, len(messages))
var futures = make([]nats.PubAckFuture, len(messages))
diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go
index 179f8d6b66..607103928d 100644
--- a/pkg/isb/stores/jetstream/writer_test.go
+++ b/pkg/isb/stores/jetstream/writer_test.go
@@ -114,7 +114,7 @@ func TestForwarderJetStreamBuffer(t *testing.T) {
"to1": to1,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, map[string]string{"toStreamName": dfv1.RetryUntilSuccess}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardJetStreamTest{}, myForwardJetStreamTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
@@ -212,6 +212,62 @@ func TestJetStreamBufferWriterBufferFull(t *testing.T) {
}
}
+// TestJetStreamBufferWrite on buffer full, with writing strategy being DiscardLatest
+func TestJetStreamBufferWriterBufferFull_DiscardLatest(t *testing.T) {
+ s := natstest.RunJetStreamServer(t)
+ defer natstest.ShutdownJetStreamServer(t, s)
+
+ ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
+ defer cancel()
+
+ defaultJetStreamClient := natstest.JetStreamClient(t, s)
+ conn, err := defaultJetStreamClient.Connect(ctx)
+ assert.NoError(t, err)
+ js, err := conn.JetStream()
+ assert.NoError(t, err)
+
+ streamName := "TestJetStreamBufferWriterBufferFull"
+ addStream(t, js, streamName)
+ defer deleteStream(js, streamName)
+
+ bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithOnFullWritingStrategy(dfv1.DiscardLatest))
+ assert.NoError(t, err)
+ jw, _ := bw.(*jetStreamWriter)
+ timeout := time.After(10 * time.Second)
+ for jw.isFull.Load() {
+ select {
+ case <-timeout:
+ t.Fatalf("expected not to be full")
+ default:
+ time.Sleep(500 * time.Millisecond)
+ }
+ }
+ // Add some data
+ startTime := time.Unix(1636470000, 0)
+ messages := testutils.BuildTestWriteMessages(int64(2), startTime)
+ // Add some data to buffer using write and verify no writes are performed when buffer is full
+ _, errs := jw.Write(ctx, messages)
+ assert.Equal(t, len(errs), 2)
+ for _, errMsg := range errs {
+ assert.Nil(t, errMsg) // Buffer not full, expect no error
+ }
+ timeout = time.After(10 * time.Second)
+ for !jw.isFull.Load() {
+ select {
+ case <-timeout:
+ t.Fatalf("expected to be full")
+ default:
+ time.Sleep(500 * time.Millisecond)
+ }
+ }
+ messages = testutils.BuildTestWriteMessages(int64(2), time.Unix(1636470001, 0))
+ _, errs = jw.Write(ctx, messages)
+ assert.Equal(t, len(errs), 2)
+ for _, errMsg := range errs {
+ assert.Equal(t, errMsg, isb.NoRetryableBufferWriteErr{Name: streamName, Message: "Buffer full!"})
+ }
+}
+
// TestGetName is used to test the GetName function
func TestWriteGetName(t *testing.T) {
s := natstest.RunJetStreamServer(t)
diff --git a/pkg/isb/stores/redis/options.go b/pkg/isb/stores/redis/options.go
index ba5a1cace3..37fc071931 100644
--- a/pkg/isb/stores/redis/options.go
+++ b/pkg/isb/stores/redis/options.go
@@ -18,6 +18,8 @@ package redis
import (
"time"
+
+ dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
)
// options for writing to redis
@@ -38,6 +40,8 @@ type options struct {
bufferUsageLimit float64
// refreshBufferWriteInfo is used to determine if we refresh buffer write info
refreshBufferWriteInfo bool
+ // onFullWritingStrategy is the writing strategy when buffer is full
+ onFullWritingStrategy dfv1.OnFullWritingStrategy
}
// Option to apply different options
@@ -49,7 +53,7 @@ type Option interface {
type pipelining bool
func (p pipelining) apply(opts *options) {
- opts.pipelining = true
+ opts.pipelining = bool(p)
}
// WithoutPipelining turns on redis pipelining
@@ -97,7 +101,7 @@ func WithReadTimeOut(t time.Duration) Option {
type checkBackLog bool
func (b checkBackLog) apply(o *options) {
- o.checkBackLog = true
+ o.checkBackLog = bool(b)
}
// WithCheckBacklog sets the checkBackLog option
@@ -140,3 +144,15 @@ func (r refreshBufferWriteInfo) apply(o *options) {
func WithRefreshBufferWriteInfo(r bool) Option {
return refreshBufferWriteInfo(r)
}
+
+// WithOnFullWritingStrategy option
+type onFullWritingStrategy dfv1.OnFullWritingStrategy
+
+func (s onFullWritingStrategy) apply(o *options) {
+ o.onFullWritingStrategy = dfv1.OnFullWritingStrategy(s)
+}
+
+// WithOnFullWritingStrategy sets the OnFullWritingStrategy
+func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option {
+ return onFullWritingStrategy(s)
+}
diff --git a/pkg/isb/stores/redis/read_test.go b/pkg/isb/stores/redis/read_test.go
index 6bbe65e8c0..3c0c98ee33 100644
--- a/pkg/isb/stores/redis/read_test.go
+++ b/pkg/isb/stores/redis/read_test.go
@@ -130,11 +130,8 @@ func TestRedisCheckBacklog(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": rqw,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10))
+ f, err := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark, forward.WithReadBatchSize(10))
stopped := f.Start()
// validate the length of the toStep stream.
@@ -317,9 +314,6 @@ func (suite *ReadWritePerformance) SetupSuite() {
toSteps := map[string]isb.BufferWriter{
"to1": rqw,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
@@ -329,7 +323,7 @@ func (suite *ReadWritePerformance) SetupSuite() {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
+ isdf, _ := forward.NewInterStepDataForward(vertex, rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
suite.ctx = ctx
suite.rclient = client
@@ -416,11 +410,8 @@ func (suite *ReadWritePerformance) TestReadWriteLatencyPipelining() {
toSteps := map[string]isb.BufferWriter{
"to1": suite.rqw,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, actionsOnFull, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
+ suite.isdf, _ = forward.NewInterStepDataForward(vertex, suite.rqr, toSteps, forwardReadWritePerformance{}, forwardReadWritePerformance{}, fetchWatermark, publishWatermark)
suite.False(suite.rqw.IsFull())
var writeMessages = make([]isb.Message, 0, suite.count)
diff --git a/pkg/isb/stores/redis/write.go b/pkg/isb/stores/redis/write.go
index dbe78a4817..a8708ce703 100644
--- a/pkg/isb/stores/redis/write.go
+++ b/pkg/isb/stores/redis/write.go
@@ -73,6 +73,7 @@ func NewBufferWrite(ctx context.Context, client *redisclient.RedisClient, name s
maxLength: dfv1.DefaultBufferLength,
bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
refreshBufferWriteInfo: true,
+ onFullWritingStrategy: dfv1.RetryUntilSuccess,
}
for _, o := range opts {
@@ -158,7 +159,17 @@ func (bw *BufferWrite) Write(_ context.Context, messages []isb.Message) ([]isb.O
if bw.IsFull() {
bw.log.Debugw("Is full")
isbIsFull.With(labels).Inc()
- initializeErrorArray(errs, isb.BufferWriteErr{Name: bw.Name, Full: true, Message: "Buffer full!"})
+
+ // when buffer is full, we need to decide whether to discard the message or not.
+ switch bw.onFullWritingStrategy {
+ case dfv1.DiscardLatest:
+ // user explicitly wants to discard the message when buffer if full.
+ // return no retryable error as a callback to let caller know that the message is discarded.
+ initializeErrorArray(errs, isb.NoRetryableBufferWriteErr{Name: bw.Name, Message: "Buffer full!"})
+ default:
+ // Default behavior is to return a BufferWriteErr.
+ initializeErrorArray(errs, isb.BufferWriteErr{Name: bw.Name, Full: true, Message: "Buffer full!"})
+ }
isbWriteErrors.With(labels).Inc()
return nil, errs
}
diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go
index 1bc8b4e2e6..2b071c4623 100644
--- a/pkg/isb/stores/redis/write_test.go
+++ b/pkg/isb/stores/redis/write_test.go
@@ -177,6 +177,46 @@ func TestRedisQWrite_WithInfoRefreshInterval(t *testing.T) {
}
}
+func TestRedisQWrite_WithInfoRefreshInterval_DiscardMessageOnFull(t *testing.T) {
+ client := redisclient.NewRedisClient(redisOptions)
+ ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
+ defer cancel()
+ stream := "withInfoRefreshInterval"
+ count := int64(10)
+ group := "withInfoRefreshInterval-group"
+ rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithOnFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite)
+ err := client.CreateStreamGroup(ctx, rqw.GetStreamName(), group, redisclient.ReadFromEarliest)
+ if err != nil {
+ t.Fatalf("error creating consumer group: %s", err)
+ }
+ defer func() { _ = client.DeleteStreamGroup(ctx, rqw.GetStreamName(), group) }()
+ defer func() { _ = client.DeleteKeys(ctx, rqw.GetStreamName()) }()
+
+ writeMessages, internalKeys := buildTestWriteMessages(rqw, count, testStartTime)
+ defer func() { _ = client.DeleteKeys(ctx, internalKeys...) }()
+ _, errs := rqw.Write(ctx, writeMessages)
+ assert.Equal(t, make([]error, len(writeMessages)), errs, "Write failed")
+
+ for !rqw.IsFull() {
+ select {
+ case <-ctx.Done():
+ t.Fatalf("full, %s", ctx.Err())
+ default:
+ time.Sleep(1 * time.Millisecond)
+ }
+ }
+
+ // Once full try to write messages and expect NoRetryableError
+ writeMessages, internalKeys = buildTestWriteMessages(rqw, count, testStartTime)
+ defer func() { _ = client.DeleteKeys(ctx, internalKeys...) }()
+ _, errs = rqw.Write(ctx, writeMessages)
+
+ // assert the NoRetryableBufferWriteErr
+ for _, err := range errs {
+ assert.Equal(t, err, isb.NoRetryableBufferWriteErr{Name: stream, Message: "Buffer full!"})
+ }
+}
+
// buildTestWriteMessages a list test messages and the internal hashKeys it created
func buildTestWriteMessages(rqw *BufferWrite, count int64, startTime time.Time) ([]isb.Message, []string) {
var messages = make([]isb.Message, 0, count)
@@ -343,9 +383,6 @@ func TestNewInterStepDataForwardRedis(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
writeMessages, internalKeys := buildTestWriteMessages(fromStepWrite, int64(20), testStartTime)
@@ -359,7 +396,7 @@ func TestNewInterStepDataForwardRedis(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
assert.False(t, to1.IsFull())
@@ -395,10 +432,6 @@ func TestReadTimeout(t *testing.T) {
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- }
-
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
PipelineName: "testPipeline",
AbstractVertex: dfv1.AbstractVertex{
@@ -407,7 +440,7 @@ func TestReadTimeout(t *testing.T) {
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, actionsOnFull, myForwardRedisTest{}, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, myForwardRedisTest{}, myForwardRedisTest{}, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
// Call stop to end the test as we have a blocking read. The forwarder is up and running with no messages written
diff --git a/pkg/isb/stores/simplebuffer/buffer.go b/pkg/isb/stores/simplebuffer/buffer.go
index 9a202f4f66..66acf4226d 100644
--- a/pkg/isb/stores/simplebuffer/buffer.go
+++ b/pkg/isb/stores/simplebuffer/buffer.go
@@ -28,6 +28,7 @@ import (
"sync"
"time"
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
"github.com/numaproj/numaflow/pkg/isb"
)
@@ -58,7 +59,8 @@ type elem struct {
func NewInMemoryBuffer(name string, size int64, opts ...Option) *InMemoryBuffer {
bufferOptions := &options{
- readTimeOut: time.Second, // default read time out
+ readTimeOut: time.Second, // default read time out
+ onFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default on full writing strategy
}
for _, o := range opts {
@@ -145,7 +147,12 @@ func (b *InMemoryBuffer) Write(_ context.Context, messages []isb.Message) ([]isb
// access buffer via lock
b.rwlock.Unlock()
} else {
- errs[idx] = isb.BufferWriteErr{Name: b.name, Full: true, Message: "Buffer full!"}
+ switch b.options.onFullWritingStrategy {
+ case v1alpha1.DiscardLatest:
+ errs[idx] = isb.NoRetryableBufferWriteErr{Name: b.name, Message: "Buffer full!"}
+ default:
+ errs[idx] = isb.BufferWriteErr{Name: b.name, Full: true, Message: "Buffer full!"}
+ }
}
}
return writeOffsets, errs
diff --git a/pkg/isb/stores/simplebuffer/buffer_test.go b/pkg/isb/stores/simplebuffer/buffer_test.go
index cf4baed69b..be851dad55 100644
--- a/pkg/isb/stores/simplebuffer/buffer_test.go
+++ b/pkg/isb/stores/simplebuffer/buffer_test.go
@@ -21,9 +21,11 @@ import (
"testing"
"time"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
"github.com/numaproj/numaflow/pkg/isb"
"github.com/numaproj/numaflow/pkg/isb/testutils"
- "github.com/stretchr/testify/assert"
)
func TestNewSimpleBuffer(t *testing.T) {
@@ -77,3 +79,24 @@ func TestNewSimpleBuffer(t *testing.T) {
// still full as we did not ack
assert.Equal(t, true, sb.IsFull())
}
+
+func TestNewSimpleBuffer_DiscardOnFull(t *testing.T) {
+ count := int64(3)
+ sb := NewInMemoryBuffer("test", 2, WithOnFullWritingStrategy(v1alpha1.DiscardLatest))
+ ctx := context.Background()
+ assert.NotEmpty(t, sb.String())
+ assert.Equal(t, sb.IsEmpty(), true)
+
+ startTime := time.Unix(1636470000, 0)
+ writeMessages := testutils.BuildTestWriteMessages(count, startTime)
+
+ // try to write 3 messages, it should fail (we have only space for 2)
+ // the first 2 messages should be written, the last one should be discarded and returns us a NoRetryableError.
+ _, errors := sb.Write(ctx, writeMessages[0:3])
+ assert.NoError(t, errors[0])
+ assert.NoError(t, errors[1])
+ assert.EqualValues(t, []error{nil, nil, isb.NoRetryableBufferWriteErr{Name: "test", Message: "Buffer full!"}}, errors)
+
+ // still full as we did not ack
+ assert.Equal(t, true, sb.IsFull())
+}
diff --git a/pkg/isb/stores/simplebuffer/options.go b/pkg/isb/stores/simplebuffer/options.go
index df9ea98d16..3df5cea89f 100644
--- a/pkg/isb/stores/simplebuffer/options.go
+++ b/pkg/isb/stores/simplebuffer/options.go
@@ -16,12 +16,18 @@ limitations under the License.
package simplebuffer
-import "time"
+import (
+ "time"
+
+ dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
+)
// Options for simple buffer
type options struct {
// readTimeOut is the timeout needed for read timeout
readTimeOut time.Duration
+ // onFullWritingStrategy is the writing strategy when buffer is full
+ onFullWritingStrategy dfv1.OnFullWritingStrategy
}
type Option func(options *options) error
@@ -33,3 +39,11 @@ func WithReadTimeOut(timeout time.Duration) Option {
return nil
}
}
+
+// WithOnFullWritingStrategy sets the writing strategy when buffer is full
+func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option {
+ return func(o *options) error {
+ o.onFullWritingStrategy = s
+ return nil
+ }
+}
diff --git a/pkg/sinks/blackhole/blackhole.go b/pkg/sinks/blackhole/blackhole.go
index 72877ccde8..259c767434 100644
--- a/pkg/sinks/blackhole/blackhole.go
+++ b/pkg/sinks/blackhole/blackhole.go
@@ -71,7 +71,7 @@ func NewBlackhole(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWaterma
}
}
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: bh}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sinks/blackhole/blackhole_test.go b/pkg/sinks/blackhole/blackhole_test.go
index 710efc72a0..7c47e391ab 100644
--- a/pkg/sinks/blackhole/blackhole_test.go
+++ b/pkg/sinks/blackhole/blackhole_test.go
@@ -118,11 +118,7 @@ func TestBlackhole_ForwardToTwoVertex(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- "to2": dfv1.RetryUntilSuccess,
- }
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
diff --git a/pkg/sinks/kafka/kafka.go b/pkg/sinks/kafka/kafka.go
index deb86d1e80..2d0920bd6f 100644
--- a/pkg/sinks/kafka/kafka.go
+++ b/pkg/sinks/kafka/kafka.go
@@ -84,7 +84,7 @@ func NewToKafka(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark
}
}
- f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ f, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
@@ -190,10 +190,6 @@ func (tk *ToKafka) Write(_ context.Context, messages []isb.Message) ([]isb.Offse
return nil, errs
}
-func (tk *ToKafka) IsFull() bool {
- return false
-}
-
func (tk *ToKafka) Close() error {
tk.log.Info("Closing kafka producer...")
return tk.producer.Close()
diff --git a/pkg/sinks/kafka/kafka_test.go b/pkg/sinks/kafka/kafka_test.go
index ff7a04eb72..c92890bf62 100644
--- a/pkg/sinks/kafka/kafka_test.go
+++ b/pkg/sinks/kafka/kafka_test.go
@@ -47,7 +47,7 @@ func TestWriteSuccessToKafka(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromEdgeList(generic.GetBufferNameList(vertex.GetToBuffers()))
- toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark)
+ toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, map[string]isb.BufferWriter{"name": toKafka}, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
toKafka.kafkaSink = vertex.Spec.Sink.Kafka
toKafka.name = "Test"
@@ -100,7 +100,7 @@ func TestWriteFailureToKafka(t *testing.T) {
}}
toSteps := map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toKafka}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark)
+ toKafka.isdf, err = forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
toKafka.name = "Test"
toKafka.topic = "topic-1"
diff --git a/pkg/sinks/logger/log.go b/pkg/sinks/logger/log.go
index 5aba5a3c5e..4fdfb27bd7 100644
--- a/pkg/sinks/logger/log.go
+++ b/pkg/sinks/logger/log.go
@@ -72,7 +72,7 @@ func NewToLog(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchWatermark f
}
}
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: toLog}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sinks/logger/log_test.go b/pkg/sinks/logger/log_test.go
index 257ca15744..80f5f1d5e8 100644
--- a/pkg/sinks/logger/log_test.go
+++ b/pkg/sinks/logger/log_test.go
@@ -116,10 +116,6 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) {
"to1": to1,
"to2": to2,
}
- actionsOnFull := map[string]string{
- "to1": dfv1.RetryUntilSuccess,
- "to2": dfv1.RetryUntilSuccess,
- }
writeMessages := testutils.BuildTestWriteMessages(int64(20), testStartTime)
vertex := &dfv1.Vertex{Spec: dfv1.VertexSpec{
@@ -129,7 +125,7 @@ func TestToLog_ForwardToTwoVertex(t *testing.T) {
},
}}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, actionsOnFull, applier.Terminal, fetchWatermark, publishWatermark)
+ f, err := forward.NewInterStepDataForward(vertex, fromStep, toSteps, forward.All, applier.Terminal, fetchWatermark, publishWatermark)
assert.NoError(t, err)
stopped := f.Start()
diff --git a/pkg/sinks/udsink/sink.go b/pkg/sinks/udsink/sink.go
index 1ca382b333..f0713c9bc5 100644
--- a/pkg/sinks/udsink/sink.go
+++ b/pkg/sinks/udsink/sink.go
@@ -78,7 +78,7 @@ func NewUserDefinedSink(vertex *dfv1.Vertex, fromBuffer isb.BufferReader, fetchW
return nil, fmt.Errorf("failed to create gRPC client, %w", err)
}
s.udsink = udsink
- isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, map[string]string{vertex.GetToBuffers()[0].Name: dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
+ isdf, err := forward.NewInterStepDataForward(vertex, fromBuffer, map[string]isb.BufferWriter{vertex.GetToBuffers()[0].Name: s}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sources/generator/tickgen.go b/pkg/sources/generator/tickgen.go
index 4e0349cf76..6a8fcd9b33 100644
--- a/pkg/sources/generator/tickgen.go
+++ b/pkg/sources/generator/tickgen.go
@@ -154,7 +154,6 @@ func NewMemGen(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
- onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -228,7 +227,7 @@ func NewMemGen(
gensrc.sourcePublishWM = gensrc.buildSourceWatermarkPublisher(publishWMStores)
// we pass in the context to forwarder as well so that it can shut down when we cancel the context
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, gensrc, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
return nil, err
}
diff --git a/pkg/sources/generator/tickgen_test.go b/pkg/sources/generator/tickgen_test.go
index 8ab4c0f141..3465a5a8e7 100644
--- a/pkg/sources/generator/tickgen_test.go
+++ b/pkg/sources/generator/tickgen_test.go
@@ -62,7 +62,7 @@ func TestRead(t *testing.T) {
"writer": dest,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
assert.NoError(t, err)
_ = mgen.Start()
@@ -106,7 +106,7 @@ func TestStop(t *testing.T) {
"writer": dest,
}
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(toSteps)
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore)
assert.NoError(t, err)
stop := mgen.Start()
@@ -201,7 +201,7 @@ func TestWatermark(t *testing.T) {
Replica: 0,
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
- mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, map[string]string{"writer": dfv1.RetryUntilSuccess}, applier.Terminal, nil, nil, publishWMStore)
+ mgen, err := NewMemGen(m, []isb.BufferWriter{dest}, forward.All, applier.Terminal, nil, nil, publishWMStore)
assert.NoError(t, err)
stop := mgen.Start()
diff --git a/pkg/sources/http/http.go b/pkg/sources/http/http.go
index dcc3b9ef99..729c575dcd 100644
--- a/pkg/sources/http/http.go
+++ b/pkg/sources/http/http.go
@@ -88,7 +88,6 @@ func New(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
- onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -203,7 +202,7 @@ func New(
}
}
- h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
+ h.forwarder, err = forward.NewInterStepDataForward(vertexInstance.Vertex, h, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
h.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/http/http_test.go b/pkg/sources/http/http_test.go
index 88a333ed8f..9d959a84ca 100644
--- a/pkg/sources/http/http_test.go
+++ b/pkg/sources/http/http_test.go
@@ -69,7 +69,7 @@ func Test_NewHTTP(t *testing.T) {
dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)}
publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- h, err := New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores)
+ h, err := New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores)
assert.NoError(t, err)
assert.False(t, h.ready)
assert.Equal(t, v.Spec.Name, h.GetName())
diff --git a/pkg/sources/kafka/handler_test.go b/pkg/sources/kafka/handler_test.go
index 79a2a5b0b1..3b9f000a9b 100644
--- a/pkg/sources/kafka/handler_test.go
+++ b/pkg/sources/kafka/handler_test.go
@@ -66,7 +66,7 @@ func TestMessageHandling(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()),
+ ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()),
WithBufferSize(100), WithReadTimeOut(100*time.Millisecond))
msg := &sarama.ConsumerMessage{
diff --git a/pkg/sources/kafka/reader.go b/pkg/sources/kafka/reader.go
index 4f641f4e1c..61142b17d5 100644
--- a/pkg/sources/kafka/reader.go
+++ b/pkg/sources/kafka/reader.go
@@ -267,7 +267,6 @@ func NewKafkaSource(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
- onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -344,7 +343,7 @@ func NewKafkaSource(
forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize)))
}
}
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, kafkasource, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
kafkasource.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/kafka/reader_test.go b/pkg/sources/kafka/reader_test.go
index 508467487c..020b552cdf 100644
--- a/pkg/sources/kafka/reader_test.go
+++ b/pkg/sources/kafka/reader_test.go
@@ -54,7 +54,7 @@ func TestNewKafkasource(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, err := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, err := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
// no errors if everything is good.
assert.Nil(t, err)
@@ -90,7 +90,7 @@ func TestGroupNameOverride(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(100), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, "default", ks.groupName)
@@ -116,7 +116,7 @@ func TestDefaultBufferSize(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, 100, ks.handlerbuffer)
@@ -142,7 +142,7 @@ func TestBufferSizeOverrides(t *testing.T) {
}
publishWMStore := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- ks, _ := NewKafkaSource(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
+ ks, _ := NewKafkaSource(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStore, WithLogger(logging.NewLogger()), WithBufferSize(110), WithReadTimeOut(100*time.Millisecond), WithGroupName("default"))
assert.Equal(t, 110, ks.handlerbuffer)
diff --git a/pkg/sources/nats/nats.go b/pkg/sources/nats/nats.go
index 9c07f4ee8f..a18d92f7bc 100644
--- a/pkg/sources/nats/nats.go
+++ b/pkg/sources/nats/nats.go
@@ -61,7 +61,6 @@ func New(
vertexInstance *dfv1.VertexInstance,
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
- onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -95,7 +94,7 @@ func New(
forwardOpts = append(forwardOpts, forward.WithReadBatchSize(int64(*x.ReadBatchSize)))
}
}
- forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, onFullActions, mapApplier, fetchWM, publishWM, forwardOpts...)
+ forwarder, err := forward.NewInterStepDataForward(vertexInstance.Vertex, n, destinations, fsd, mapApplier, fetchWM, publishWM, forwardOpts...)
if err != nil {
n.logger.Errorw("Error instantiating the forwarder", zap.Error(err))
return nil, err
diff --git a/pkg/sources/nats/nats_test.go b/pkg/sources/nats/nats_test.go
index 615503fc3b..51ea552ffa 100644
--- a/pkg/sources/nats/nats_test.go
+++ b/pkg/sources/nats/nats_test.go
@@ -65,7 +65,7 @@ func newInstance(t *testing.T, vi *dfv1.VertexInstance) (*natsSource, error) {
dest := []isb.BufferWriter{simplebuffer.NewInMemoryBuffer("test", 100)}
publishWMStores := store.BuildWatermarkStore(noop.NewKVNoOpStore(), noop.NewKVNoOpStore())
fetchWatermark, publishWatermark := generic.BuildNoOpWatermarkProgressorsFromBufferMap(map[string]isb.BufferWriter{})
- return New(vi, dest, forward.All, map[string]string{"test": dfv1.RetryUntilSuccess}, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second))
+ return New(vi, dest, forward.All, applier.Terminal, fetchWatermark, publishWatermark, publishWMStores, WithReadTimeout(1*time.Second))
}
func Test_Single(t *testing.T) {
diff --git a/pkg/sources/source.go b/pkg/sources/source.go
index dfd23034fb..f8d5e6bd94 100644
--- a/pkg/sources/source.go
+++ b/pkg/sources/source.go
@@ -69,7 +69,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
switch sp.ISBSvcType {
case dfv1.ISBSvcTypeRedis:
for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges {
- writeOpts := []redisisb.Option{}
+ writeOpts := []redisisb.Option{
+ redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ }
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength)))
}
@@ -100,6 +102,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges {
writeOpts := []jetstreamisb.WriteOption{
jetstreamisb.WithUsingWriteInfoAsRate(true),
+ jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
}
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength)))
@@ -139,9 +142,9 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
}
}()
readyChecker = t
- sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), sp.getOnFullActions(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log)
+ sourcer, err = sp.getSourcer(writers, sp.getTransformerGoWhereDecider(), t, fetchWatermark, publishWatermark, sourcePublisherStores, log)
} else {
- sourcer, err = sp.getSourcer(writers, forward.All, sp.getOnFullActions(), applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log)
+ sourcer, err = sp.getSourcer(writers, forward.All, applier.Terminal, fetchWatermark, publishWatermark, sourcePublisherStores, log)
}
if err != nil {
return fmt.Errorf("failed to find a sourcer, error: %w", err)
@@ -179,7 +182,6 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
func (sp *SourceProcessor) getSourcer(
writers []isb.BufferWriter,
fsd forward.ToWhichStepDecider,
- onFullActions map[string]string,
mapApplier applier.MapApplier,
fetchWM fetch.Fetcher,
publishWM map[string]publish.Publisher,
@@ -194,7 +196,7 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, generator.WithReadTimeout(l.ReadTimeout.Duration))
}
- return generator.NewMemGen(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return generator.NewMemGen(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
} else if x := src.Kafka; x != nil {
readOptions := []kafka.Option{
kafka.WithGroupName(x.ConsumerGroupName),
@@ -203,9 +205,9 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, kafka.WithReadTimeOut(l.ReadTimeout.Duration))
}
- return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return kafka.NewKafkaSource(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
} else if x := src.HTTP; x != nil {
- return http.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger))
+ return http.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, http.WithLogger(logger))
} else if x := src.Nats; x != nil {
readOptions := []nats.Option{
nats.WithLogger(logger),
@@ -213,7 +215,7 @@ func (sp *SourceProcessor) getSourcer(
if l := sp.VertexInstance.Vertex.Spec.Limits; l != nil && l.ReadTimeout != nil {
readOptions = append(readOptions, nats.WithReadTimeout(l.ReadTimeout.Duration))
}
- return nats.New(sp.VertexInstance, writers, fsd, onFullActions, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
+ return nats.New(sp.VertexInstance, writers, fsd, mapApplier, fetchWM, publishWM, publishWMStores, readOptions...)
}
return nil, fmt.Errorf("invalid source spec")
}
@@ -221,9 +223,8 @@ func (sp *SourceProcessor) getSourcer(
func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere {
shuffleFuncMap := make(map[string]*shuffle.Shuffle)
for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges {
- bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)
if edge.Parallelism != nil && *edge.Parallelism > 1 {
- s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), bufferNames)
+ s := shuffle.NewShuffle(sp.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge))
shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s
}
}
@@ -246,15 +247,3 @@ func (sp *SourceProcessor) getTransformerGoWhereDecider() forward.GoWhere {
})
return fsd
}
-
-// getOnFullActions builds a mapping between the out-going buffers and their respective onFull action.
-func (sp *SourceProcessor) getOnFullActions() map[string]string {
- onFullActions := make(map[string]string)
- for _, edge := range sp.VertexInstance.Vertex.Spec.ToEdges {
- bufferNames := dfv1.GenerateEdgeBufferNames(sp.VertexInstance.Vertex.Namespace, sp.VertexInstance.Vertex.Spec.PipelineName, edge)
- for _, bn := range bufferNames {
- onFullActions[bn] = edge.OnFull
- }
- }
- return onFullActions
-}
diff --git a/pkg/udf/common.go b/pkg/udf/common.go
index 65e2613a52..1fe89dc8c8 100644
--- a/pkg/udf/common.go
+++ b/pkg/udf/common.go
@@ -41,7 +41,9 @@ func buildRedisBufferIO(ctx context.Context, fromBufferName string, vertexInstan
reader := redisisb.NewBufferRead(ctx, redisClient, fromBufferName, fromGroup, consumer, readerOpts...)
for _, e := range vertexInstance.Vertex.Spec.ToEdges {
- writeOpts := []redisisb.Option{}
+ writeOpts := []redisisb.Option{
+ redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ }
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength)))
}
@@ -73,7 +75,9 @@ func buildJetStreamBufferIO(ctx context.Context, fromBufferName string, vertexIn
}
for _, e := range vertexInstance.Vertex.Spec.ToEdges {
- writeOpts := []jetstreamisb.WriteOption{}
+ writeOpts := []jetstreamisb.WriteOption{
+ jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ }
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength)))
}
diff --git a/pkg/udf/map_udf.go b/pkg/udf/map_udf.go
index 65c80646c8..d9d4506294 100644
--- a/pkg/udf/map_udf.go
+++ b/pkg/udf/map_udf.go
@@ -73,18 +73,13 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error {
return fmt.Errorf("unrecognized isbsvc type %q", u.ISBSvcType)
}
- // Populate shuffle function map and onFull actions map
+ // Populate shuffle function map
shuffleFuncMap := make(map[string]*shuffle.Shuffle)
- onFullActions := make(map[string]string)
for _, edge := range u.VertexInstance.Vertex.Spec.ToEdges {
- bufferNames := dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge)
if edge.Parallelism != nil && *edge.Parallelism > 1 {
- s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), bufferNames)
+ s := shuffle.NewShuffle(u.VertexInstance.Vertex.GetName(), dfv1.GenerateEdgeBufferNames(u.VertexInstance.Vertex.Namespace, u.VertexInstance.Vertex.Spec.PipelineName, edge))
shuffleFuncMap[fmt.Sprintf("%s:%s", edge.From, edge.To)] = s
}
- for _, bn := range bufferNames {
- onFullActions[bn] = edge.OnFull
- }
}
conditionalForwarder := forward.GoWhere(func(key string) ([]string, error) {
@@ -136,7 +131,7 @@ func (u *MapUDFProcessor) Start(ctx context.Context) error {
}
}
- forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, onFullActions, udfHandler, fetchWatermark, publishWatermark, opts...)
+ forwarder, err := forward.NewInterStepDataForward(u.VertexInstance.Vertex, reader, writers, conditionalForwarder, udfHandler, fetchWatermark, publishWatermark, opts...)
if err != nil {
return err
}
diff --git a/test/e2e-suite-2/testdata/drop-on-full.yaml b/test/e2e-suite-2/testdata/drop-on-full.yaml
index 964da5829f..8c4853420f 100644
--- a/test/e2e-suite-2/testdata/drop-on-full.yaml
+++ b/test/e2e-suite-2/testdata/drop-on-full.yaml
@@ -28,7 +28,7 @@ spec:
edges:
- from: in
to: drop-sink
- onFull: dropAndAckLatest
+ onFull: discardLatest
- from: in
to: retry-sink
onFull: retryUntilSuccess
\ No newline at end of file
From 37abe9b75ebc4b2d76dd89b7c7dd9d8988a59975 Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Tue, 28 Mar 2023 09:45:16 -0400
Subject: [PATCH 3/6] Address comments
Signed-off-by: Keran Yang
---
docs/APIs.md | 24 +-
pkg/apis/numaflow/v1alpha1/const.go | 8 +-
pkg/apis/numaflow/v1alpha1/edge_types.go | 10 +-
pkg/apis/numaflow/v1alpha1/generated.pb.go | 719 +++++++++---------
.../v1alpha1/zz_generated.deepcopy.go | 2 +-
pkg/forward/forward.go | 3 +-
pkg/forward/forward_test.go | 12 +-
pkg/isb/stores/jetstream/options.go | 20 +-
pkg/isb/stores/jetstream/writer.go | 2 +-
pkg/isb/stores/jetstream/writer_test.go | 2 +-
pkg/isb/stores/redis/options.go | 18 +-
pkg/isb/stores/redis/write.go | 16 +-
pkg/isb/stores/redis/write_test.go | 4 +-
pkg/isb/stores/simplebuffer/buffer.go | 6 +-
pkg/isb/stores/simplebuffer/buffer_test.go | 4 +-
pkg/isb/stores/simplebuffer/options.go | 10 +-
pkg/sources/source.go | 4 +-
pkg/udf/common.go | 4 +-
18 files changed, 434 insertions(+), 434 deletions(-)
diff --git a/docs/APIs.md b/docs/APIs.md
index 660951bc92..c64c0571bf 100644
--- a/docs/APIs.md
+++ b/docs/APIs.md
@@ -526,6 +526,16 @@ Description
+
+BufferFullWritingStrategy (string
alias)
+
+
+
+(Appears on:
+Edge)
+
+
+
BufferServiceConfig
@@ -918,7 +928,9 @@ ignored when the “to” vertex is not a reduce vertex.
-onFull string
+onFull
+
+BufferFullWritingStrategy
|
(Optional)
@@ -2719,16 +2731,6 @@ Auth information
|
-
-OnFullWritingStrategy (string
alias)
-
-
-
-
-OnFullWritingStrategy is an edge-level specification to define the
-writing behaviour when the ToBuffer is full
-
-
PBQStorage
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index d4399afdae..d8694de32e 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -24,8 +24,7 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
)
-// OnFullWritingStrategy is an edge-level specification to define the writing behaviour when the ToBuffer is full
-type OnFullWritingStrategy string
+type BufferFullWritingStrategy string
const (
Project = "numaflow"
@@ -125,9 +124,8 @@ const (
DefaultBufferUsageLimit = 0.8
DefaultReadBatchSize = 500
- // Edge-level specification to define the writing behaviour when the ToBuffer is full
- RetryUntilSuccess OnFullWritingStrategy = "retryUntilSuccess"
- DiscardLatest OnFullWritingStrategy = "discardLatest"
+ RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess"
+ DiscardLatest BufferFullWritingStrategy = "discardLatest"
// Auto scaling
DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending
diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go
index a574bdd9d1..8bcb61a4b7 100644
--- a/pkg/apis/numaflow/v1alpha1/edge_types.go
+++ b/pkg/apis/numaflow/v1alpha1/edge_types.go
@@ -35,7 +35,7 @@ type Edge struct {
// if not provided, the default value is set to "retryUntilSuccess"
// +kubebuilder:validation:Enum=retryUntilSuccess;discardLatest
// +optional
- OnFull *string `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"`
+ OnFull *BufferFullWritingStrategy `json:"onFull,omitempty" protobuf:"bytes,6,opt,name=onFull"`
}
type ForwardConditions struct {
@@ -53,15 +53,13 @@ type EdgeLimits struct {
BufferUsageLimit *uint32 `json:"bufferUsageLimit,omitempty" protobuf:"varint,2,opt,name=bufferUsageLimit"`
}
-func (e Edge) OnFullWritingStrategy() OnFullWritingStrategy {
+func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy {
if e.OnFull == nil {
return RetryUntilSuccess
}
switch *e.OnFull {
- case "retryUntilSuccess":
- return RetryUntilSuccess
- case "discardLatest":
- return DiscardLatest
+ case RetryUntilSuccess, DiscardLatest:
+ return *e.OnFull
default:
return RetryUntilSuccess
}
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index 496370c87f..1bc14e7d33 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -2037,364 +2037,365 @@ func init() {
}
var fileDescriptor_9d0d1b17d3865563 = []byte{
- // 5698 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5c, 0x5d, 0x6c, 0x24, 0x57,
- 0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x3d, 0x3f, 0x77, 0x32, 0x93, 0x1e, 0xef, 0xc4, 0x3d, 0x5b,
- 0xab, 0x44, 0xb3, 0xb0, 0x6b, 0x33, 0x26, 0xcb, 0xce, 0x02, 0xbb, 0x89, 0xdb, 0x1e, 0x4f, 0x66,
- 0xc6, 0x9e, 0xf1, 0x9e, 0xb6, 0x67, 0xb2, 0x09, 0x24, 0x94, 0xab, 0x6f, 0xb7, 0x2b, 0x5d, 0x5d,
- 0xd5, 0xa9, 0xba, 0xed, 0x19, 0x07, 0x56, 0x44, 0x9b, 0x87, 0x04, 0xb1, 0x68, 0x91, 0x10, 0xd2,
- 0x8a, 0xd5, 0x22, 0x21, 0x21, 0x21, 0x90, 0x56, 0xe2, 0x81, 0x7d, 0x81, 0x17, 0x9e, 0x50, 0xe0,
- 0x01, 0xf2, 0x80, 0x44, 0x10, 0xa8, 0x45, 0xcc, 0x13, 0x0f, 0xa0, 0x45, 0xfb, 0xb2, 0x1a, 0x21,
- 0x81, 0xee, 0x4f, 0xfd, 0x76, 0xb5, 0xc7, 0xee, 0xb6, 0xb3, 0x13, 0xf1, 0x56, 0x75, 0xcf, 0x39,
- 0xdf, 0xb9, 0x75, 0x7f, 0xce, 0x3d, 0xf7, 0x9c, 0x7b, 0x0b, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3, 0xdf,
- 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x3c, 0xb4, 0x2c, 0xe7,
- 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0x96, 0xec, 0x5e, 0xd5, 0xad, 0xde, 0x8e,
- 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2, 0xe5,
- 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xc5, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x4b, 0x7c,
- 0xa0, 0xd9, 0x2f, 0x46, 0x6a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4, 0x9b,
- 0x78, 0x11, 0x4f, 0x52, 0xcf, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0xaf, 0xd6, 0x82, 0xe1,
- 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2e, 0xb3, 0x2f, 0x84, 0x3c, 0x5d, 0xdd, 0xd8, 0x31, 0x6d, 0xea,
- 0xee, 0xf9, 0xdf, 0xb2, 0xe0, 0x52, 0xcf, 0xe9, 0xbb, 0x06, 0x3d, 0x92, 0x94, 0xb7, 0xd0, 0xa5,
- 0x4c, 0x4f, 0xd3, 0xb5, 0x30, 0x4a, 0xca, 0xed, 0xdb, 0xcc, 0xec, 0x0e, 0xab, 0xf9, 0x85, 0xc7,
- 0x09, 0x78, 0xc6, 0x0e, 0xed, 0xea, 0x49, 0x39, 0xed, 0x5f, 0xca, 0x70, 0x6e, 0x69, 0xdb, 0x63,
- 0xae, 0x6e, 0xb0, 0x0d, 0xa7, 0xb9, 0x49, 0xbb, 0x3d, 0x4b, 0x67, 0x94, 0x74, 0xa0, 0xc4, 0xeb,
- 0xd6, 0xd4, 0x99, 0x5e, 0xcd, 0x5c, 0xce, 0x5c, 0xa9, 0x2c, 0x2e, 0xcd, 0x8f, 0xd9, 0x17, 0xf3,
- 0xeb, 0x0a, 0xa8, 0x3e, 0xbd, 0x3f, 0xa8, 0x95, 0xfc, 0x37, 0x0c, 0x14, 0x90, 0xef, 0x66, 0x60,
- 0xda, 0x76, 0x9a, 0xb4, 0x41, 0x2d, 0x6a, 0x30, 0xc7, 0xad, 0x66, 0x2f, 0xe7, 0xae, 0x54, 0x16,
- 0x5f, 0x1f, 0x5b, 0x63, 0xca, 0x17, 0xcd, 0xdf, 0x89, 0x28, 0xb8, 0x6e, 0x33, 0x77, 0xaf, 0xfe,
- 0xf4, 0x07, 0x83, 0xda, 0x53, 0xfb, 0x83, 0xda, 0x74, 0x94, 0x84, 0xb1, 0x9a, 0x90, 0x2d, 0xa8,
- 0x30, 0xc7, 0xe2, 0x4d, 0x66, 0x3a, 0xb6, 0x57, 0xcd, 0x89, 0x8a, 0xcd, 0xcd, 0xcb, 0xd6, 0xe6,
- 0xea, 0xe7, 0xf9, 0x70, 0x99, 0xdf, 0xbd, 0x3a, 0xbf, 0x19, 0xb0, 0xd5, 0xcf, 0x29, 0xe0, 0x4a,
- 0x58, 0xe6, 0x61, 0x14, 0x87, 0x50, 0x38, 0xed, 0x51, 0xa3, 0xef, 0x9a, 0x6c, 0x6f, 0xd9, 0xb1,
- 0x19, 0x7d, 0xc8, 0xaa, 0x79, 0xd1, 0xca, 0xcf, 0xa7, 0x41, 0x6f, 0x38, 0xcd, 0x46, 0x9c, 0xbb,
- 0x7e, 0x6e, 0x7f, 0x50, 0x3b, 0x9d, 0x28, 0xc4, 0x24, 0x26, 0xb1, 0xe1, 0x8c, 0xd9, 0xd5, 0xdb,
- 0x74, 0xa3, 0x6f, 0x59, 0x0d, 0x6a, 0xb8, 0x94, 0x79, 0xd5, 0x82, 0xf8, 0x84, 0x2b, 0x69, 0x7a,
- 0xd6, 0x1c, 0x43, 0xb7, 0xee, 0x6e, 0xbf, 0x49, 0x0d, 0x86, 0xb4, 0x45, 0x5d, 0x6a, 0x1b, 0xb4,
- 0x5e, 0x55, 0x1f, 0x73, 0xe6, 0x66, 0x02, 0x09, 0x87, 0xb0, 0xc9, 0x0d, 0x38, 0xdb, 0x73, 0x4d,
- 0x47, 0x54, 0xc1, 0xd2, 0x3d, 0xef, 0x8e, 0xde, 0xa5, 0xd5, 0xe2, 0xe5, 0xcc, 0x95, 0x72, 0xfd,
- 0xa2, 0x82, 0x39, 0xbb, 0x91, 0x64, 0xc0, 0x61, 0x19, 0x72, 0x05, 0x4a, 0x7e, 0x61, 0x75, 0xea,
- 0x72, 0xe6, 0x4a, 0x41, 0x8e, 0x1d, 0x5f, 0x16, 0x03, 0x2a, 0x59, 0x85, 0x92, 0xde, 0x6a, 0x99,
- 0x36, 0xe7, 0x2c, 0x89, 0x26, 0xbc, 0x94, 0xf6, 0x69, 0x4b, 0x8a, 0x47, 0xe2, 0xf8, 0x6f, 0x18,
- 0xc8, 0x92, 0x5b, 0x40, 0x3c, 0xea, 0xee, 0x9a, 0x06, 0x5d, 0x32, 0x0c, 0xa7, 0x6f, 0x33, 0x51,
- 0xf7, 0xb2, 0xa8, 0xfb, 0xac, 0xaa, 0x3b, 0x69, 0x0c, 0x71, 0x60, 0x8a, 0x14, 0x79, 0x09, 0xce,
- 0xa8, 0x69, 0x17, 0xb6, 0x02, 0x08, 0xa4, 0xa7, 0x79, 0x43, 0x62, 0x82, 0x86, 0x43, 0xdc, 0xa4,
- 0x09, 0x97, 0xf4, 0x3e, 0x73, 0xba, 0x1c, 0x32, 0xae, 0x74, 0xd3, 0xe9, 0x50, 0xbb, 0x5a, 0xb9,
- 0x9c, 0xb9, 0x52, 0xaa, 0x5f, 0xde, 0x1f, 0xd4, 0x2e, 0x2d, 0x1d, 0xc0, 0x87, 0x07, 0xa2, 0x90,
- 0xbb, 0x50, 0x6e, 0xda, 0xde, 0x86, 0x63, 0x99, 0xc6, 0x5e, 0x75, 0x5a, 0x54, 0xf0, 0xaa, 0xfa,
- 0xd4, 0xf2, 0xca, 0x9d, 0x86, 0x24, 0x3c, 0x1a, 0xd4, 0x2e, 0x0d, 0x5b, 0xc7, 0xf9, 0x80, 0x8e,
- 0x21, 0x06, 0x59, 0x17, 0x80, 0xcb, 0x8e, 0xdd, 0x32, 0xdb, 0xd5, 0x19, 0xd1, 0x1b, 0x97, 0x47,
- 0x0c, 0xe8, 0x95, 0x3b, 0x0d, 0xc9, 0x57, 0x9f, 0x51, 0xea, 0xe4, 0x2b, 0x86, 0x08, 0xb3, 0x2f,
- 0xc2, 0xd9, 0xa1, 0x59, 0x4b, 0xce, 0x40, 0xae, 0x43, 0xf7, 0x84, 0x51, 0x2a, 0x23, 0x7f, 0x24,
- 0x4f, 0x43, 0x61, 0x57, 0xb7, 0xfa, 0xb4, 0x9a, 0x15, 0x65, 0xf2, 0xe5, 0x17, 0xb3, 0xd7, 0x32,
- 0xda, 0xa0, 0x0c, 0xa7, 0x7c, 0x5b, 0x70, 0x8f, 0xba, 0x8c, 0x3e, 0x24, 0x97, 0x21, 0x6f, 0xf3,
- 0xfe, 0x10, 0xf2, 0xf5, 0x69, 0xf5, 0xb9, 0x79, 0xd1, 0x0f, 0x82, 0x42, 0x0c, 0x28, 0x4a, 0x5b,
- 0x2e, 0xf0, 0x2a, 0x8b, 0x2f, 0x8e, 0x6d, 0x86, 0x1a, 0x02, 0xa6, 0x0e, 0xfb, 0x83, 0x5a, 0x51,
- 0x3e, 0xa3, 0x82, 0x26, 0xaf, 0x41, 0xde, 0x33, 0xed, 0x4e, 0x35, 0x27, 0x54, 0x7c, 0x75, 0x7c,
- 0x15, 0xa6, 0xdd, 0xa9, 0x97, 0xf8, 0x17, 0xf0, 0x27, 0x14, 0xa0, 0xe4, 0x3e, 0xe4, 0xfa, 0xcd,
- 0x96, 0xb2, 0x28, 0xbf, 0x3c, 0x36, 0xf6, 0xd6, 0xca, 0x6a, 0x7d, 0x6a, 0x7f, 0x50, 0xcb, 0x6d,
- 0xad, 0xac, 0x22, 0x47, 0x24, 0xdf, 0xc9, 0xc0, 0x59, 0xc3, 0xb1, 0x99, 0xce, 0xd7, 0x17, 0xdf,
- 0xb2, 0x56, 0x0b, 0x42, 0xcf, 0xad, 0xb1, 0xf5, 0x2c, 0x27, 0x11, 0xeb, 0xe7, 0xb9, 0xa1, 0x18,
- 0x2a, 0xc6, 0x61, 0xdd, 0xe4, 0x7b, 0x19, 0x38, 0xcf, 0x27, 0xf0, 0x10, 0xb3, 0x30, 0x3b, 0xc7,
- 0x5b, 0xab, 0x8b, 0xfb, 0x83, 0xda, 0xf9, 0x9b, 0x69, 0xca, 0x30, 0xbd, 0x0e, 0xbc, 0x76, 0xe7,
- 0xf4, 0xe1, 0xb5, 0x48, 0x98, 0xb4, 0xca, 0xe2, 0xda, 0x71, 0xae, 0x6f, 0xf5, 0xcf, 0xa8, 0xa1,
- 0x9c, 0xb6, 0x9c, 0x63, 0x5a, 0x2d, 0xc8, 0x75, 0x98, 0xda, 0x75, 0xac, 0x7e, 0x97, 0x7a, 0xd5,
- 0x92, 0x58, 0x14, 0x66, 0xd3, 0xe6, 0xea, 0x3d, 0xc1, 0x52, 0x3f, 0xad, 0xe0, 0xa7, 0xe4, 0xbb,
- 0x87, 0xbe, 0x2c, 0x31, 0xa1, 0x68, 0x99, 0x5d, 0x93, 0x79, 0xc2, 0x5a, 0x56, 0x16, 0xaf, 0x8f,
- 0xfd, 0x59, 0x72, 0x8a, 0xae, 0x09, 0x30, 0x39, 0x6b, 0xe4, 0x33, 0x2a, 0x05, 0xc4, 0x80, 0x82,
- 0x67, 0xe8, 0x96, 0xb4, 0xa6, 0x95, 0xc5, 0xaf, 0x8d, 0x3f, 0x6d, 0x38, 0x4a, 0x7d, 0x46, 0x7d,
- 0x53, 0x41, 0xbc, 0xa2, 0xc4, 0x26, 0xbf, 0x0a, 0xa7, 0x62, 0xbd, 0xe9, 0x55, 0x2b, 0xa2, 0x75,
- 0x9e, 0x4d, 0x6b, 0x9d, 0x80, 0xab, 0x7e, 0x41, 0x81, 0x9d, 0x8a, 0x8d, 0x10, 0x0f, 0x13, 0x60,
- 0xe4, 0x36, 0x94, 0x3c, 0xb3, 0x49, 0x0d, 0xdd, 0xf5, 0xaa, 0xd3, 0x87, 0x01, 0x3e, 0xa3, 0x80,
- 0x4b, 0x0d, 0x25, 0x86, 0x01, 0x80, 0x76, 0x1f, 0x66, 0x96, 0xfa, 0x6c, 0xc7, 0x71, 0xcd, 0xb7,
- 0x85, 0x67, 0x41, 0x56, 0xa1, 0xc0, 0xc4, 0x0a, 0x21, 0x9d, 0xb6, 0xe7, 0xd2, 0xa0, 0xe5, 0x6a,
- 0x7d, 0x9b, 0xee, 0xf9, 0x86, 0xb5, 0x5e, 0xe6, 0x8d, 0x20, 0x57, 0x0c, 0x29, 0xae, 0xfd, 0x51,
- 0x06, 0xca, 0x75, 0xdd, 0x33, 0x0d, 0x0e, 0x4f, 0x96, 0x21, 0xdf, 0xf7, 0xa8, 0x7b, 0x34, 0x50,
- 0x61, 0x95, 0xb6, 0x3c, 0xea, 0xa2, 0x10, 0x26, 0x77, 0xa1, 0xd4, 0xd3, 0x3d, 0xef, 0x81, 0xe3,
- 0x36, 0x95, 0x65, 0x3d, 0x24, 0x90, 0x5c, 0xfa, 0x95, 0x28, 0x06, 0x20, 0x5a, 0x05, 0xca, 0x75,
- 0x4b, 0x37, 0x3a, 0x3b, 0x8e, 0x45, 0xb5, 0x57, 0xa1, 0x58, 0xef, 0xb7, 0x5a, 0xd4, 0x3d, 0x84,
- 0x85, 0x9f, 0x87, 0x3c, 0xdb, 0xeb, 0xa9, 0xf5, 0x22, 0x58, 0xdd, 0xf3, 0x9b, 0x7b, 0x3d, 0xfa,
- 0x68, 0x50, 0x03, 0x89, 0xc3, 0xdf, 0x50, 0xf0, 0x69, 0x3f, 0xce, 0xc0, 0x39, 0x59, 0xa8, 0x56,
- 0x51, 0xb9, 0x3e, 0x11, 0x0a, 0x05, 0x97, 0x36, 0x4d, 0x4f, 0xb5, 0xcb, 0xca, 0xd8, 0xc3, 0x11,
- 0x39, 0x8a, 0x5a, 0x0e, 0x45, 0x5f, 0x88, 0x02, 0x94, 0xe8, 0xa4, 0x0f, 0xe5, 0x37, 0x29, 0xf3,
- 0x98, 0x4b, 0xf5, 0xae, 0x6a, 0xb9, 0x97, 0xc7, 0x56, 0x75, 0x8b, 0xb2, 0x86, 0x40, 0x8a, 0xae,
- 0xbe, 0x41, 0x21, 0x86, 0x9a, 0xb4, 0x9f, 0xe4, 0xa1, 0x1c, 0x8c, 0x42, 0xf2, 0x39, 0x28, 0x08,
- 0x77, 0x4f, 0x35, 0x6b, 0x30, 0x75, 0x84, 0x57, 0x88, 0x92, 0x46, 0x9e, 0x83, 0x29, 0xc3, 0xe9,
- 0x76, 0x75, 0xbb, 0x29, 0x5c, 0xf8, 0x72, 0xbd, 0xc2, 0x2d, 0xc6, 0xb2, 0x2c, 0x42, 0x9f, 0x46,
- 0x2e, 0x41, 0x5e, 0x77, 0xdb, 0xd2, 0x9b, 0x2e, 0xcb, 0x71, 0xb2, 0xe4, 0xb6, 0x3d, 0x14, 0xa5,
- 0xe4, 0x2b, 0x90, 0xa3, 0xf6, 0x6e, 0x35, 0x3f, 0xda, 0x24, 0x5d, 0xb7, 0x77, 0xef, 0xe9, 0x6e,
- 0xbd, 0xa2, 0xea, 0x90, 0xbb, 0x6e, 0xef, 0x22, 0x97, 0x21, 0x6b, 0x30, 0x45, 0xed, 0xdd, 0x55,
- 0xd7, 0xe9, 0x2a, 0x37, 0xf7, 0xb3, 0x23, 0xc4, 0x39, 0x8b, 0x5a, 0x9d, 0x03, 0xc3, 0xa6, 0x8a,
- 0xd1, 0x87, 0x20, 0xdf, 0x80, 0x69, 0x69, 0xe3, 0xd6, 0xb9, 0xcb, 0xe4, 0x55, 0x8b, 0x02, 0xb2,
- 0x36, 0xda, 0x48, 0x0a, 0xbe, 0x70, 0x5b, 0x11, 0x29, 0xf4, 0x30, 0x06, 0x45, 0xbe, 0x01, 0x65,
- 0x7f, 0xc7, 0xe8, 0xa9, 0xd5, 0x20, 0xd5, 0x23, 0x47, 0xc5, 0x84, 0xf4, 0xad, 0xbe, 0xe9, 0xd2,
- 0x2e, 0xb5, 0x99, 0x57, 0x3f, 0xeb, 0xfb, 0x68, 0x3e, 0xd5, 0xc3, 0x10, 0x8d, 0x6c, 0x0f, 0x6f,
- 0x2d, 0xa4, 0x5f, 0xfc, 0xb9, 0x11, 0xb3, 0x6d, 0x8c, 0x7d, 0xc5, 0xeb, 0x70, 0x3a, 0xf0, 0xfd,
- 0x95, 0xfb, 0x28, 0x3d, 0xe5, 0x17, 0xb8, 0xf8, 0xcd, 0x38, 0xe9, 0xd1, 0xa0, 0xf6, 0x6c, 0x8a,
- 0x03, 0x19, 0x32, 0x60, 0x12, 0x4c, 0xfb, 0xef, 0x2c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb, 0x1c,
- 0x77, 0xa3, 0x25, 0x3f, 0x48, 0x1a, 0x87, 0x6b, 0x4a, 0x6c, 0xf2, 0x8f, 0x4a, 0xeb, 0x98, 0xdc,
- 0x71, 0x77, 0xcc, 0xf8, 0x73, 0x47, 0x7b, 0x3f, 0x0f, 0xa7, 0x56, 0x74, 0xda, 0x75, 0xec, 0xc7,
- 0xba, 0x2f, 0x99, 0x27, 0xc2, 0x7d, 0xb9, 0x02, 0x25, 0x97, 0xf6, 0x2c, 0xd3, 0xd0, 0x3d, 0xd1,
- 0x59, 0x6a, 0x8f, 0x88, 0xaa, 0x0c, 0x03, 0xea, 0x08, 0xb7, 0x35, 0xf7, 0x44, 0xba, 0xad, 0xf9,
- 0x9f, 0xbe, 0xdb, 0xaa, 0xbd, 0x93, 0x83, 0xfc, 0xf5, 0x66, 0x9b, 0xf2, 0xa5, 0xb4, 0xc5, 0x8d,
- 0x69, 0x62, 0x29, 0x15, 0x66, 0x52, 0x50, 0xc8, 0x2c, 0x64, 0x99, 0xa3, 0xe6, 0x0a, 0x28, 0x7a,
- 0x76, 0xd3, 0xc1, 0x2c, 0x73, 0xc8, 0xdb, 0x00, 0x86, 0x63, 0x37, 0x4d, 0x3f, 0x74, 0x32, 0xd9,
- 0x87, 0xad, 0x3a, 0xee, 0x03, 0xdd, 0x6d, 0x2e, 0x07, 0x88, 0xf5, 0x53, 0xfb, 0x83, 0x1a, 0x84,
- 0xef, 0x18, 0xd1, 0x46, 0xda, 0x81, 0x53, 0x2a, 0x1b, 0x74, 0x79, 0x6c, 0xbd, 0xbc, 0x21, 0x0e,
- 0x70, 0x49, 0xaf, 0x42, 0xa5, 0xa7, 0xbb, 0xba, 0x65, 0x51, 0xcb, 0xf4, 0xba, 0x62, 0x2f, 0x54,
- 0xa8, 0x9f, 0xde, 0x1f, 0xd4, 0x2a, 0x1b, 0x61, 0x31, 0x46, 0x79, 0x88, 0x06, 0x45, 0xc7, 0x5e,
- 0xed, 0x5b, 0x96, 0x0a, 0x8d, 0x08, 0xd8, 0xbb, 0xa2, 0x04, 0x15, 0x45, 0xfb, 0x9d, 0x0c, 0x40,
- 0xa8, 0x99, 0x7c, 0x15, 0x4e, 0x6f, 0x0b, 0x07, 0x64, 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb,
- 0x11, 0x7d, 0x92, 0x97, 0x66, 0xa1, 0x1e, 0x27, 0x61, 0x92, 0x97, 0xbc, 0x04, 0x67, 0x64, 0xd1,
- 0x96, 0xa7, 0x2b, 0x4c, 0xd1, 0x67, 0x33, 0x32, 0x20, 0x51, 0x4f, 0xd0, 0x70, 0x88, 0x5b, 0xd3,
- 0xa1, 0xb2, 0x6a, 0x3e, 0xa4, 0xcd, 0xfb, 0xa6, 0xdd, 0x74, 0x1e, 0x10, 0x84, 0xa2, 0x15, 0x56,
- 0xa3, 0xb2, 0x38, 0x1f, 0x31, 0x35, 0x41, 0xfc, 0x31, 0x6c, 0xd5, 0x2e, 0x65, 0x3a, 0x37, 0x3e,
- 0x2b, 0x7d, 0x15, 0x21, 0x93, 0x2d, 0x29, 0x6b, 0xab, 0x90, 0xb4, 0x17, 0xe0, 0xec, 0x50, 0x1f,
- 0x93, 0x1a, 0x14, 0x3a, 0x74, 0xef, 0x26, 0xf7, 0x67, 0xb9, 0xaf, 0x20, 0x9c, 0xa3, 0xdb, 0xbc,
- 0x00, 0x65, 0xb9, 0xf6, 0x3f, 0x19, 0x28, 0xad, 0xf6, 0x6d, 0x43, 0x78, 0xbf, 0x8f, 0x77, 0xfd,
- 0x7c, 0xd7, 0x23, 0x9b, 0xea, 0x7a, 0xf4, 0xa1, 0xd8, 0x79, 0x10, 0xb8, 0x26, 0x95, 0xc5, 0xf5,
- 0xf1, 0x47, 0xab, 0xaa, 0xd2, 0xfc, 0x6d, 0x81, 0x27, 0x03, 0x8e, 0xa7, 0x54, 0x85, 0x8a, 0xb7,
- 0xef, 0x0b, 0xa5, 0x4a, 0xd9, 0xec, 0x57, 0xa0, 0x12, 0x61, 0x3b, 0x52, 0x84, 0xe3, 0x27, 0x19,
- 0x38, 0x7d, 0x43, 0xc6, 0x74, 0x1d, 0x57, 0x7a, 0x34, 0xe4, 0x22, 0xe4, 0xdc, 0x5e, 0x5f, 0xc8,
- 0xe7, 0xe4, 0x06, 0x1e, 0x37, 0xb6, 0x90, 0x97, 0x91, 0x57, 0xa0, 0xd4, 0x54, 0x7d, 0xa0, 0x3c,
- 0xc9, 0xa3, 0xf6, 0x9c, 0xb0, 0xb1, 0xfe, 0x1b, 0x06, 0x68, 0xdc, 0xf5, 0xeb, 0x7a, 0xed, 0x86,
- 0xf9, 0xb6, 0x34, 0xac, 0x05, 0xe9, 0xfa, 0xad, 0xcb, 0x22, 0xf4, 0x69, 0xdc, 0x68, 0x77, 0xe8,
- 0xde, 0x32, 0xf7, 0x82, 0xc4, 0xcc, 0x54, 0x46, 0xfb, 0xb6, 0x2a, 0xc3, 0x80, 0xca, 0x7b, 0x5e,
- 0x7e, 0x73, 0x41, 0x0c, 0x74, 0xd1, 0xf3, 0xf7, 0x78, 0x81, 0xfa, 0x7c, 0xed, 0x3b, 0x59, 0xb8,
- 0x70, 0x83, 0x32, 0xb9, 0x66, 0xad, 0xd0, 0x9e, 0xe5, 0xec, 0xf1, 0xa5, 0x1e, 0xe9, 0x5b, 0xe4,
- 0x25, 0x00, 0xd3, 0xdb, 0x6e, 0xec, 0x1a, 0xdc, 0x89, 0x57, 0xa3, 0xe1, 0xb2, 0x6a, 0x7c, 0xb8,
- 0xd9, 0xa8, 0x2b, 0xca, 0xa3, 0xd8, 0x1b, 0x46, 0x64, 0x42, 0x77, 0x37, 0x7b, 0x80, 0xbb, 0xdb,
- 0x00, 0xe8, 0x85, 0x0e, 0x43, 0x4e, 0x70, 0xfe, 0xbc, 0xaf, 0xe6, 0x28, 0xbe, 0x42, 0x04, 0x66,
- 0x92, 0x25, 0xfc, 0x2f, 0x73, 0x30, 0x7b, 0x83, 0xb2, 0xc0, 0x9b, 0x57, 0xbb, 0x95, 0x46, 0x8f,
- 0x1a, 0xbc, 0x55, 0xde, 0xcb, 0x40, 0xd1, 0xd2, 0xb7, 0xa9, 0xe5, 0x89, 0xd9, 0x54, 0x59, 0x7c,
- 0x63, 0xec, 0xe1, 0x3d, 0x5a, 0xcb, 0xfc, 0x9a, 0xd0, 0x90, 0x18, 0xf0, 0xb2, 0x10, 0x95, 0x7a,
- 0xf2, 0x25, 0xa8, 0x18, 0x56, 0xdf, 0x63, 0xd4, 0xdd, 0x70, 0x5c, 0xa6, 0x56, 0xef, 0x20, 0x6a,
- 0xbe, 0x1c, 0x92, 0x30, 0xca, 0x47, 0x16, 0x01, 0x0c, 0xcb, 0xa4, 0x36, 0x13, 0x52, 0x72, 0x98,
- 0x11, 0xbf, 0xbd, 0x97, 0x03, 0x0a, 0x46, 0xb8, 0xb8, 0xaa, 0xae, 0x63, 0x9b, 0xcc, 0x91, 0xaa,
- 0xf2, 0x71, 0x55, 0xeb, 0x21, 0x09, 0xa3, 0x7c, 0x42, 0x8c, 0x32, 0xd7, 0x34, 0x3c, 0x21, 0x56,
- 0x48, 0x88, 0x85, 0x24, 0x8c, 0xf2, 0xf1, 0x99, 0x1c, 0xf9, 0xfe, 0x23, 0xcd, 0xe4, 0xbf, 0x2a,
- 0xc1, 0x5c, 0xac, 0x59, 0x99, 0xce, 0x68, 0xab, 0x6f, 0x35, 0x28, 0xf3, 0x3b, 0xf0, 0x4b, 0x50,
- 0x51, 0xd1, 0xe6, 0x3b, 0xa1, 0x95, 0x0b, 0x2a, 0xd5, 0x08, 0x49, 0x18, 0xe5, 0x23, 0xbf, 0x1d,
- 0xf6, 0xbb, 0x4c, 0xac, 0x18, 0xc7, 0xd3, 0xef, 0x43, 0x15, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9,
- 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33, 0x81, 0x6f, 0x7e, 0xc7, 0x27, 0x60, 0xc8, 0x43, 0x36,
- 0xe0, 0x69, 0xd5, 0xc4, 0xd7, 0x1f, 0xf6, 0x1c, 0x97, 0x51, 0x57, 0xca, 0xe6, 0x85, 0xec, 0x25,
- 0x25, 0xfb, 0xf4, 0x7a, 0x0a, 0x0f, 0xa6, 0x4a, 0x92, 0x75, 0x38, 0x67, 0xc8, 0x60, 0x33, 0xb5,
- 0x1c, 0xbd, 0xe9, 0x03, 0x16, 0x04, 0x60, 0xe0, 0x88, 0x2e, 0x0f, 0xb3, 0x60, 0x9a, 0x5c, 0x72,
- 0x34, 0x17, 0xc7, 0x1a, 0xcd, 0x53, 0xe3, 0x8c, 0xe6, 0xd2, 0x78, 0xa3, 0xb9, 0x7c, 0xb8, 0xd1,
- 0xcc, 0x5b, 0x9e, 0x8f, 0x23, 0xea, 0x2e, 0xf5, 0xd9, 0x8e, 0x8c, 0xcb, 0x44, 0x72, 0x19, 0x41,
- 0xcb, 0x37, 0x52, 0x78, 0x30, 0x55, 0x92, 0x6c, 0xc3, 0xac, 0x2c, 0xbf, 0x6e, 0x1b, 0xee, 0x5e,
- 0x8f, 0xaf, 0x1c, 0x11, 0xdc, 0x8a, 0xc0, 0xd5, 0x14, 0xee, 0x6c, 0x63, 0x24, 0x27, 0x1e, 0x80,
- 0x42, 0x7e, 0x09, 0x66, 0x64, 0x2f, 0xad, 0xeb, 0x3d, 0x01, 0x2b, 0x33, 0x1b, 0xe7, 0x15, 0xec,
- 0xcc, 0x72, 0x94, 0x88, 0x71, 0x5e, 0xb2, 0x04, 0xa7, 0x7b, 0xbb, 0x06, 0x7f, 0xbc, 0xd9, 0xba,
- 0x43, 0x69, 0x93, 0x36, 0x45, 0x1e, 0xa3, 0x5c, 0x7f, 0xc6, 0xdf, 0x08, 0x6e, 0xc4, 0xc9, 0x98,
- 0xe4, 0x27, 0xd7, 0x60, 0xda, 0x63, 0xba, 0xcb, 0x54, 0xd8, 0xa3, 0x7a, 0x4a, 0x66, 0x7e, 0xfc,
- 0xa8, 0x40, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x24, 0xd6, 0xe3, 0x91, 0x5c, 0x0c, 0x45, 0xdc, 0x28,
- 0x61, 0xf6, 0xdf, 0x4d, 0x9a, 0xfd, 0xd7, 0x26, 0x99, 0xfe, 0x29, 0x1a, 0x0e, 0x35, 0xed, 0x6f,
- 0x01, 0x71, 0x55, 0x94, 0x4b, 0xee, 0x36, 0x22, 0x96, 0x3f, 0xc8, 0xaf, 0xe1, 0x10, 0x07, 0xa6,
- 0x48, 0x91, 0x06, 0x9c, 0xf7, 0xa8, 0xcd, 0x4c, 0x9b, 0x5a, 0x71, 0x38, 0xb9, 0x24, 0x3c, 0xab,
- 0xe0, 0xce, 0x37, 0xd2, 0x98, 0x30, 0x5d, 0x76, 0x92, 0xc6, 0xff, 0xd7, 0xb2, 0x58, 0x77, 0x65,
- 0xd3, 0x1c, 0x9b, 0xd9, 0x7e, 0x2f, 0x69, 0xb6, 0xdf, 0x98, 0xbc, 0xdf, 0xc6, 0x33, 0xd9, 0x8b,
- 0x00, 0xa2, 0x17, 0xa2, 0x36, 0x3b, 0xb0, 0x54, 0x18, 0x50, 0x30, 0xc2, 0xc5, 0x67, 0xa1, 0xdf,
- 0xce, 0x51, 0x73, 0x1d, 0xcc, 0xc2, 0x46, 0x94, 0x88, 0x71, 0xde, 0x91, 0x26, 0xbf, 0x30, 0xb6,
- 0xc9, 0xbf, 0x05, 0x24, 0xb6, 0xd7, 0x95, 0x78, 0xc5, 0x78, 0x7a, 0xf7, 0xe6, 0x10, 0x07, 0xa6,
- 0x48, 0x8d, 0x18, 0xca, 0x53, 0xc7, 0x3b, 0x94, 0x4b, 0xe3, 0x0f, 0x65, 0xf2, 0x06, 0x5c, 0x14,
- 0xaa, 0x54, 0xfb, 0xc4, 0x81, 0xa5, 0xf1, 0xff, 0xac, 0x02, 0xbe, 0x88, 0xa3, 0x18, 0x71, 0x34,
- 0x06, 0xef, 0x1f, 0xc3, 0xa5, 0x4d, 0xae, 0x5c, 0xb7, 0x46, 0x2f, 0x0c, 0xcb, 0x29, 0x3c, 0x98,
- 0x2a, 0xc9, 0x87, 0x18, 0xe3, 0xc3, 0x50, 0xdf, 0xb6, 0x68, 0x53, 0xa5, 0xb7, 0x83, 0x21, 0xb6,
- 0xb9, 0xd6, 0x50, 0x14, 0x8c, 0x70, 0xa5, 0xd9, 0xea, 0xe9, 0x23, 0xda, 0xea, 0x1b, 0x22, 0x30,
- 0xd4, 0x8a, 0x2d, 0x09, 0xca, 0xe0, 0x07, 0x07, 0x16, 0x96, 0x93, 0x0c, 0x38, 0x2c, 0x23, 0x96,
- 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b, 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x3c, 0x98, 0x2a, 0xc9,
- 0x9d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c, 0x27, 0x0e, 0x78, 0x3a, 0xee, 0xa4, 0xbc, 0x3c, 0xcc, 0x82,
- 0x69, 0x72, 0x93, 0x98, 0xb7, 0x6f, 0x67, 0xe1, 0xdc, 0x0d, 0xaa, 0x12, 0xe8, 0x1b, 0x4e, 0xd3,
- 0xb7, 0x6b, 0xff, 0x4f, 0x77, 0x59, 0xef, 0x66, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d,
- 0xd2, 0x86, 0xe2, 0x03, 0x11, 0x11, 0x51, 0x71, 0x90, 0xf1, 0xcf, 0x0a, 0xc8, 0xc0, 0x4a, 0x68,
- 0x82, 0xe5, 0x3b, 0x2a, 0x78, 0xde, 0x52, 0x1d, 0xba, 0x47, 0x65, 0xe6, 0xac, 0x14, 0xb6, 0xd4,
- 0x6d, 0x5e, 0x88, 0x92, 0x46, 0xde, 0x84, 0x29, 0x8f, 0x39, 0xae, 0x6f, 0xa4, 0x27, 0x89, 0x7a,
- 0x6d, 0xd4, 0xbf, 0xde, 0x90, 0x50, 0x72, 0x23, 0xaf, 0x5e, 0xd0, 0x57, 0xa0, 0x7d, 0x3f, 0x03,
- 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0x8a, 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x83, 0x70, 0xd0, 0xea, 0xf8,
- 0xa1, 0xe1, 0x68, 0x36, 0x53, 0xc5, 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9,
- 0x15, 0x52, 0xb5, 0x43, 0x90, 0xbc, 0x51, 0xab, 0x28, 0xfa, 0x74, 0xed, 0x47, 0x59, 0xb8, 0x70,
- 0xd3, 0x66, 0xd4, 0x6d, 0x30, 0xda, 0x8b, 0x25, 0xef, 0xc8, 0xaf, 0x0d, 0x9d, 0x6d, 0xfb, 0xb9,
- 0xc3, 0x05, 0x41, 0xe4, 0xd1, 0xa8, 0x75, 0xca, 0xf4, 0xd0, 0x36, 0x85, 0x65, 0x91, 0x03, 0x6d,
- 0x7d, 0xc8, 0x7b, 0x3d, 0x6a, 0xa8, 0x10, 0x4b, 0x63, 0xec, 0xd6, 0x48, 0xff, 0x00, 0x3e, 0xff,
- 0xc2, 0xe0, 0x96, 0x98, 0x8d, 0x42, 0x1d, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0x1f, 0x6c,
- 0xdd, 0x3a, 0x6e, 0xc5, 0x02, 0x3c, 0x1c, 0xa3, 0xf2, 0x1d, 0x95, 0x52, 0xed, 0x47, 0x19, 0x98,
- 0x4d, 0x17, 0x5c, 0x33, 0x3d, 0x46, 0x7e, 0x65, 0xa8, 0xd9, 0x0f, 0x19, 0x7b, 0xe2, 0xd2, 0xa2,
- 0xd1, 0x83, 0x4c, 0xb8, 0x5f, 0x12, 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0xef, 0x2b, 0xdd,
- 0x3d, 0xe6, 0x4f, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xa8, 0x4f, 0xe6,
- 0xdd, 0x42, 0xac, 0x78, 0x82, 0xf8, 0xf6, 0x64, 0x09, 0xe2, 0x78, 0x85, 0x86, 0xf3, 0xc4, 0xbf,
- 0x31, 0x9c, 0x27, 0xbe, 0x3b, 0x79, 0x9e, 0x38, 0xd1, 0x0c, 0x23, 0xd3, 0xc5, 0xdf, 0xce, 0xc1,
- 0xa5, 0x83, 0x86, 0x0d, 0xb7, 0x95, 0x6a, 0x74, 0x4e, 0x6a, 0x2b, 0x0f, 0x1e, 0x87, 0x64, 0x11,
- 0x0a, 0xbd, 0x1d, 0xdd, 0xf3, 0x57, 0x15, 0x7f, 0xf1, 0x2d, 0x6c, 0xf0, 0xc2, 0x47, 0x83, 0x5a,
- 0x45, 0xae, 0x46, 0xe2, 0x15, 0x25, 0x2b, 0xb7, 0x2c, 0x5d, 0xea, 0x79, 0xa1, 0x7f, 0x1b, 0x58,
- 0x96, 0x75, 0x59, 0x8c, 0x3e, 0x9d, 0x30, 0x28, 0xca, 0x3d, 0xa3, 0x4a, 0x2d, 0x8c, 0x9f, 0x07,
- 0x4b, 0x39, 0x53, 0x10, 0x7e, 0x94, 0x0a, 0x3f, 0x28, 0x5d, 0xc1, 0x99, 0x85, 0x42, 0xfa, 0x99,
- 0x85, 0xc8, 0x02, 0x2b, 0xcf, 0x2c, 0xfc, 0x43, 0x09, 0x2e, 0xa4, 0xf7, 0x21, 0xff, 0xd6, 0x5d,
- 0xea, 0x7a, 0xa6, 0x63, 0xab, 0x45, 0x3b, 0x3c, 0xdb, 0x23, 0x8b, 0xd1, 0xa7, 0x7f, 0xaa, 0x73,
- 0x6c, 0x7f, 0x92, 0xe1, 0x6e, 0xb0, 0x0c, 0xd4, 0x7c, 0x12, 0x79, 0xb6, 0x67, 0xa5, 0x3b, 0x3d,
- 0x42, 0x21, 0x8e, 0xae, 0x0b, 0xf9, 0xe3, 0x0c, 0x54, 0xbb, 0x09, 0x3f, 0xfb, 0x04, 0x4f, 0xd7,
- 0x5d, 0xda, 0x1f, 0xd4, 0xaa, 0xeb, 0x23, 0xf4, 0xe1, 0xc8, 0x9a, 0x90, 0xdf, 0x84, 0x4a, 0x8f,
- 0x8f, 0x0b, 0x8f, 0x51, 0xdb, 0xf0, 0x0f, 0xd8, 0x8d, 0x3f, 0xfa, 0x37, 0x42, 0xac, 0x06, 0x73,
- 0x75, 0x46, 0xdb, 0x7b, 0x2a, 0x71, 0x16, 0x12, 0x30, 0xaa, 0xf1, 0x09, 0x3f, 0x4e, 0x77, 0x05,
- 0x4a, 0x1e, 0x65, 0xcc, 0xb4, 0xdb, 0x9e, 0xd8, 0xbd, 0x95, 0xe5, 0x5c, 0x69, 0xa8, 0x32, 0x0c,
- 0xa8, 0xe4, 0x67, 0xa1, 0x2c, 0xe2, 0x3e, 0x4b, 0x6e, 0xdb, 0xab, 0x96, 0x45, 0x26, 0x4a, 0xd8,
- 0xd5, 0x86, 0x5f, 0x88, 0x21, 0x9d, 0xbc, 0x00, 0xd3, 0x32, 0x1b, 0xa7, 0x8e, 0xd5, 0xca, 0x3d,
- 0xd6, 0x99, 0xfd, 0x41, 0x6d, 0xba, 0x1e, 0x29, 0xc7, 0x18, 0x17, 0xdf, 0x4f, 0xd1, 0x20, 0x38,
- 0x96, 0xdc, 0x4f, 0x85, 0x61, 0x33, 0x8c, 0x70, 0x91, 0x67, 0x21, 0xc7, 0x2c, 0x4f, 0xec, 0xa1,
- 0x4a, 0xa1, 0xdf, 0xbb, 0xb9, 0xd6, 0x40, 0x5e, 0xae, 0xfd, 0x6f, 0x06, 0x4e, 0x27, 0x4e, 0x0f,
- 0x71, 0x91, 0xbe, 0x6b, 0x29, 0x33, 0x12, 0x88, 0x6c, 0xe1, 0x1a, 0xf2, 0x72, 0xf2, 0x86, 0xf2,
- 0x0a, 0xb3, 0x13, 0xde, 0x20, 0xb8, 0xa3, 0x33, 0x8f, 0xbb, 0x81, 0x43, 0x0e, 0xe1, 0xb5, 0x44,
- 0xe3, 0xe4, 0xe2, 0xb1, 0xb6, 0x83, 0x1b, 0x28, 0xb2, 0xe1, 0xcc, 0x1f, 0x66, 0xc3, 0xa9, 0xfd,
- 0x5d, 0x0e, 0x2a, 0xb7, 0x9c, 0xed, 0x4f, 0xc9, 0xf9, 0x88, 0x74, 0x8b, 0x9c, 0xfd, 0x29, 0x5a,
- 0xe4, 0x2d, 0x78, 0x86, 0x31, 0xbe, 0xeb, 0x77, 0xec, 0xa6, 0xb7, 0xd4, 0x62, 0xd4, 0x5d, 0x35,
- 0x6d, 0xd3, 0xdb, 0xa1, 0x4d, 0x15, 0xb9, 0xfb, 0xcc, 0xfe, 0xa0, 0xf6, 0xcc, 0xe6, 0xe6, 0x5a,
- 0x1a, 0x0b, 0x8e, 0x92, 0x15, 0x33, 0x44, 0x37, 0x3a, 0x4e, 0xab, 0x25, 0x33, 0xdb, 0x32, 0xc7,
- 0x23, 0x67, 0x48, 0xa4, 0x1c, 0x63, 0x5c, 0xda, 0x47, 0x19, 0x28, 0xdf, 0xd6, 0x5b, 0x1d, 0xbd,
- 0x61, 0xda, 0x1d, 0xf2, 0x1c, 0x4c, 0x6d, 0xbb, 0x4e, 0x87, 0xba, 0x9e, 0xca, 0x34, 0x8b, 0x5d,
- 0x4f, 0x5d, 0x16, 0xa1, 0x4f, 0xe3, 0xdb, 0x30, 0xe6, 0xf4, 0x4c, 0x23, 0xb9, 0x61, 0xdd, 0xe4,
- 0x85, 0x28, 0x69, 0xe4, 0xbe, 0x9c, 0x47, 0xb9, 0x09, 0x8f, 0x5f, 0x6f, 0xae, 0x35, 0x64, 0xf6,
- 0xd6, 0x9f, 0x81, 0xe4, 0xf9, 0x98, 0xe7, 0x51, 0x1e, 0xe5, 0x2b, 0x68, 0xdf, 0xcb, 0x42, 0x45,
- 0x7e, 0x9a, 0xdc, 0x9c, 0x1d, 0xe7, 0xc7, 0xbd, 0x28, 0xa2, 0xeb, 0x5e, 0xbf, 0x4b, 0x5d, 0xb1,
- 0x09, 0x56, 0x53, 0x2e, 0x1a, 0x2d, 0x09, 0x89, 0x41, 0x84, 0x3d, 0x2c, 0xf2, 0x5b, 0x27, 0x7f,
- 0x82, 0xad, 0x53, 0x38, 0xb0, 0x75, 0xfe, 0x3c, 0x03, 0xe5, 0x35, 0xb3, 0x45, 0x8d, 0x3d, 0xc3,
- 0xa2, 0xe4, 0x15, 0xa8, 0x36, 0xa9, 0x45, 0x19, 0xbd, 0xe1, 0xea, 0x06, 0xdd, 0xa0, 0xae, 0x29,
- 0x2e, 0xdb, 0xf0, 0x51, 0x26, 0xe6, 0x71, 0x41, 0x2e, 0x97, 0x2b, 0x23, 0x78, 0x70, 0xa4, 0x34,
- 0xb9, 0x09, 0xd3, 0x4d, 0xea, 0x99, 0x2e, 0x6d, 0x6e, 0x44, 0xbc, 0xd1, 0xe7, 0x7c, 0xdb, 0xb4,
- 0x12, 0xa1, 0x3d, 0x1a, 0xd4, 0x66, 0x36, 0xcc, 0x1e, 0xb5, 0x4c, 0x9b, 0x4a, 0xb7, 0x34, 0x26,
- 0xaa, 0x15, 0x20, 0xb7, 0xe6, 0xb4, 0xb5, 0xf7, 0x73, 0x10, 0x5c, 0x9f, 0x22, 0xbf, 0x95, 0x81,
- 0x8a, 0x6e, 0xdb, 0x0e, 0x53, 0x57, 0x93, 0x64, 0x6c, 0x1f, 0x27, 0xbe, 0xa5, 0x35, 0xbf, 0x14,
- 0x82, 0xca, 0xb0, 0x70, 0x10, 0xaa, 0x8e, 0x50, 0x30, 0xaa, 0x9b, 0xf4, 0x13, 0x91, 0xea, 0xf5,
- 0xc9, 0x6b, 0x71, 0x88, 0xb8, 0xf4, 0xec, 0xd7, 0xe0, 0x4c, 0xb2, 0xb2, 0x47, 0x09, 0x6c, 0x4d,
- 0x12, 0x13, 0x7b, 0xb7, 0x0c, 0x95, 0x3b, 0x3a, 0x33, 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4f,
- 0xfd, 0x87, 0x19, 0xb8, 0x10, 0x8f, 0x19, 0x9f, 0xa0, 0x63, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0,
- 0x54, 0x6d, 0x38, 0xa2, 0x16, 0xc2, 0xc5, 0x1e, 0x0a, 0x41, 0x9f, 0xb4, 0x8b, 0xdd, 0x18, 0xa5,
- 0x10, 0x47, 0xd7, 0xe5, 0xd3, 0xe2, 0x62, 0x3f, 0xd9, 0xd7, 0x59, 0x12, 0x1b, 0x80, 0xa9, 0x27,
- 0x66, 0x03, 0x50, 0x7a, 0x22, 0x1c, 0xae, 0x5e, 0x64, 0x03, 0x50, 0x9e, 0x30, 0x0e, 0xaa, 0xd2,
- 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3, 0x7d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7,
- 0x4c, 0x43, 0xb9, 0x9f, 0xf5, 0xf1, 0xc3, 0x12, 0xfe, 0xbd, 0x0f, 0x19, 0x63, 0x12, 0xaf, 0x28,
- 0xb1, 0xc3, 0xfb, 0x25, 0xd9, 0x89, 0xee, 0x97, 0x90, 0x65, 0xc8, 0xdb, 0xdc, 0xd8, 0xe6, 0x8e,
- 0x7c, 0xa3, 0xe4, 0xce, 0x6d, 0xba, 0x87, 0x42, 0x58, 0xfb, 0x61, 0x16, 0x80, 0x7f, 0xbe, 0x72,
- 0x73, 0x1e, 0xb3, 0x19, 0xf9, 0x3c, 0x4c, 0x79, 0x7d, 0x11, 0xad, 0x55, 0x4b, 0x71, 0x18, 0x3c,
- 0x96, 0xc5, 0xe8, 0xd3, 0xb9, 0x27, 0xf4, 0x56, 0x9f, 0xf6, 0xfd, 0x58, 0x50, 0xe0, 0x09, 0x7d,
- 0x9d, 0x17, 0xa2, 0xa4, 0x9d, 0x9c, 0x23, 0xe3, 0xef, 0x9a, 0x0a, 0x27, 0xb4, 0x6b, 0xd2, 0xde,
- 0xc9, 0x02, 0x84, 0x01, 0x7e, 0xf2, 0xfd, 0x0c, 0x9c, 0x0f, 0x66, 0x19, 0x93, 0xb7, 0x16, 0x96,
- 0x2d, 0xdd, 0xec, 0x4e, 0xbc, 0x91, 0x49, 0x9b, 0xe1, 0xc2, 0xec, 0x6c, 0xa4, 0xa9, 0xc3, 0xf4,
- 0x5a, 0x10, 0x84, 0x12, 0xed, 0xf6, 0xd8, 0xde, 0x8a, 0xe9, 0xaa, 0x61, 0x97, 0x7a, 0xec, 0xff,
- 0xba, 0xe2, 0x91, 0xa2, 0xea, 0x76, 0x87, 0x98, 0x39, 0x3e, 0x05, 0x03, 0x1c, 0xed, 0xbb, 0x59,
- 0x38, 0x97, 0x52, 0x3b, 0xf2, 0x12, 0x9c, 0x51, 0x19, 0x8e, 0xf0, 0xea, 0x6e, 0x26, 0xbc, 0xba,
- 0xdb, 0x48, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x01, 0xa0, 0x1b, 0x06, 0xf5, 0xbc, 0x75, 0xa7, 0xe9,
- 0x3b, 0x7d, 0x2f, 0xf2, 0x4d, 0xe5, 0x52, 0x50, 0xfa, 0x68, 0x50, 0xfb, 0x62, 0x5a, 0xaa, 0x2a,
- 0xf1, 0xf5, 0xa1, 0x00, 0x46, 0x20, 0xc9, 0xeb, 0x00, 0xf2, 0x2e, 0x49, 0x70, 0xd8, 0xf2, 0x31,
- 0x91, 0xf4, 0x79, 0xff, 0x9e, 0xc3, 0xfc, 0xd7, 0xfb, 0xba, 0xcd, 0x4c, 0xb6, 0x27, 0x8f, 0x4e,
- 0xdf, 0x0b, 0x50, 0x30, 0x82, 0xa8, 0xfd, 0x4d, 0x16, 0x4a, 0xbe, 0x33, 0xfa, 0x09, 0xe4, 0x4a,
- 0xda, 0xb1, 0x5c, 0xc9, 0xf8, 0x97, 0x07, 0xfd, 0x2a, 0x8f, 0xcc, 0x8e, 0x38, 0x89, 0xec, 0xc8,
- 0x8d, 0xc9, 0x55, 0x1d, 0x9c, 0x0f, 0xf9, 0x41, 0x16, 0x4e, 0xf9, 0xac, 0xea, 0x1c, 0xf7, 0x97,
- 0x61, 0xc6, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0x63, 0x47, 0x74, 0x9f, 0x3c, 0xc5, 0x7d, 0x76, 0x7f,
- 0x50, 0x9b, 0xc1, 0x28, 0x01, 0xe3, 0x7c, 0x69, 0x07, 0xc0, 0xb3, 0x13, 0x1e, 0x00, 0xcf, 0x1d,
- 0xe5, 0x00, 0x38, 0xd1, 0xa1, 0xc2, 0x6b, 0xb4, 0x69, 0x76, 0xa9, 0xd3, 0xf7, 0xff, 0x56, 0x70,
- 0xd4, 0xc3, 0xc3, 0x62, 0x75, 0xc7, 0x10, 0x06, 0xa3, 0x98, 0xda, 0x3f, 0x66, 0x60, 0x3a, 0x6c,
- 0xaf, 0x13, 0xcf, 0x18, 0xb5, 0xe2, 0x19, 0xa3, 0xa5, 0x89, 0x87, 0xc3, 0x88, 0x1c, 0xd1, 0xef,
- 0x17, 0xc3, 0xcf, 0x12, 0x59, 0xa1, 0x6d, 0x98, 0x35, 0x53, 0x13, 0x25, 0x11, 0x6b, 0x13, 0x1c,
- 0x82, 0xbb, 0x39, 0x92, 0x13, 0x0f, 0x40, 0x21, 0x7d, 0x28, 0xed, 0x52, 0x97, 0x99, 0x06, 0xf5,
- 0xbf, 0xef, 0xc6, 0xc4, 0xde, 0x91, 0x3c, 0x00, 0x10, 0xb6, 0xe9, 0x3d, 0xa5, 0x00, 0x03, 0x55,
- 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9, 0xaf, 0x4e, 0x74, 0xeb, 0x22, 0x6c, 0x4f,
- 0xfe, 0xe6, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f, 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xbe, 0x4e,
- 0x10, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x45, 0x18, 0xea, 0x21, 0x9d, 0xe0, 0x3e, 0x49, 0xe1, 0x98,
- 0x8c, 0xc7, 0x01, 0x77, 0x4a, 0x3c, 0x28, 0x3f, 0xd0, 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x8e,
- 0xff, 0xf8, 0x5f, 0x78, 0xdf, 0x47, 0x0a, 0xbf, 0x30, 0x28, 0xc2, 0x50, 0x0f, 0x71, 0xa0, 0xcc,
- 0x94, 0x27, 0xeb, 0x5f, 0x49, 0x1c, 0x5f, 0xa9, 0xef, 0x13, 0x7b, 0x32, 0xb0, 0x1d, 0xbc, 0x62,
- 0xa8, 0x43, 0x7b, 0x94, 0x0b, 0xcd, 0xe3, 0x27, 0x9d, 0x22, 0x7c, 0x21, 0x9e, 0x22, 0x9c, 0x4b,
- 0xa6, 0x08, 0x13, 0xd1, 0x98, 0xa3, 0x27, 0x09, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xb6, 0x7a, 0x4d,
- 0x9d, 0xa9, 0xf8, 0x72, 0x65, 0xf1, 0x67, 0x0e, 0x67, 0xbd, 0xb8, 0x3d, 0x0c, 0x83, 0x2e, 0x6b,
- 0x21, 0x0c, 0x46, 0x31, 0xc9, 0x55, 0xa8, 0xec, 0x8a, 0x19, 0x29, 0x6f, 0x53, 0x14, 0x84, 0x39,
- 0x17, 0x16, 0xf6, 0x5e, 0x58, 0x8c, 0x51, 0x1e, 0x2e, 0x22, 0x3d, 0x01, 0x29, 0x52, 0x0c, 0x45,
- 0x1a, 0x61, 0x31, 0x46, 0x79, 0x44, 0xae, 0xc2, 0xb4, 0x3b, 0x52, 0x60, 0x4a, 0x08, 0xc8, 0x5c,
- 0x85, 0x5f, 0x88, 0x21, 0x9d, 0x5c, 0x81, 0x52, 0xbf, 0xd9, 0x92, 0xbc, 0x25, 0xc1, 0x2b, 0xfc,
- 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xa7, 0x6a, 0xff, 0x95, 0x01, 0x32, 0x9c, 0xd4, 0x26,
- 0x3b, 0x50, 0xb4, 0x45, 0x54, 0x65, 0xe2, 0x2b, 0xd5, 0x91, 0xe0, 0x8c, 0x9c, 0x63, 0xaa, 0x40,
- 0xe1, 0x13, 0x1b, 0x4a, 0xf4, 0x21, 0xa3, 0xae, 0xad, 0x5b, 0xca, 0xf5, 0x38, 0x9e, 0xeb, 0xdb,
- 0xd2, 0xe1, 0x54, 0xc8, 0x18, 0xe8, 0xd0, 0x7e, 0x9c, 0x85, 0x4a, 0x84, 0xef, 0x71, 0x9b, 0x15,
- 0x71, 0x66, 0x54, 0x06, 0x33, 0xb6, 0x5c, 0x4b, 0x0d, 0xd3, 0xc8, 0x99, 0x51, 0x45, 0xc2, 0x35,
- 0x8c, 0xf2, 0x91, 0x45, 0x80, 0xae, 0xee, 0x31, 0xea, 0x8a, 0xa5, 0x24, 0x71, 0x52, 0x73, 0x3d,
- 0xa0, 0x60, 0x84, 0x8b, 0x5c, 0x56, 0x97, 0xfb, 0xf3, 0xf1, 0x4b, 0x53, 0x23, 0x6e, 0xee, 0x17,
- 0x8e, 0xe1, 0xe6, 0x3e, 0x69, 0xc3, 0x19, 0xbf, 0xd6, 0x3e, 0x55, 0xd9, 0xb9, 0x43, 0x02, 0x4b,
- 0x67, 0x3c, 0x01, 0x81, 0x43, 0xa0, 0xda, 0x0f, 0x33, 0x30, 0x13, 0xdb, 0x4a, 0xf3, 0xad, 0x5d,
- 0x78, 0x24, 0x23, 0xb2, 0xb5, 0x8b, 0x9d, 0xa4, 0x78, 0x1e, 0x8a, 0xb2, 0x81, 0x54, 0xc3, 0x07,
- 0x66, 0x44, 0x36, 0x21, 0x2a, 0x2a, 0x37, 0x08, 0x2a, 0x58, 0x97, 0x34, 0x08, 0x2a, 0x9a, 0x87,
- 0x3e, 0x9d, 0x7c, 0x01, 0x4a, 0x7e, 0xed, 0x54, 0x4b, 0x87, 0xff, 0x75, 0x50, 0xe5, 0x18, 0x70,
- 0x68, 0xdf, 0x2a, 0x80, 0xfc, 0x29, 0x05, 0x97, 0x6b, 0x9a, 0x9e, 0xcc, 0x52, 0x65, 0x44, 0x96,
- 0x2a, 0x90, 0x5b, 0x51, 0xe5, 0x18, 0x70, 0x90, 0x8b, 0x90, 0xeb, 0x9a, 0xb6, 0x0a, 0x2b, 0x8a,
- 0x5d, 0xe5, 0xba, 0x69, 0x23, 0x2f, 0x13, 0x24, 0xfd, 0xa1, 0x4a, 0xb4, 0x48, 0x92, 0xfe, 0x10,
- 0x79, 0x19, 0x77, 0x2e, 0x2d, 0xc7, 0xe9, 0x6c, 0xeb, 0x46, 0xc7, 0x0f, 0x7d, 0xe7, 0xc5, 0xec,
- 0x15, 0xce, 0xe5, 0x5a, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e, 0xd5, 0x74, 0x1e, 0xd8,
- 0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8e, 0x93, 0x30, 0xc9, 0x4b, 0xb6, 0xe0, 0x99, 0xb7, 0xa9, 0xeb,
- 0xa8, 0x16, 0x6b, 0x58, 0x94, 0xf6, 0x7c, 0x18, 0x69, 0xa0, 0x44, 0x56, 0xe8, 0xd5, 0x74, 0x16,
- 0x1c, 0x25, 0x2b, 0x92, 0x4d, 0xba, 0xdb, 0xa6, 0x6c, 0xc3, 0x75, 0xf8, 0xde, 0xc9, 0xb4, 0xdb,
- 0x3e, 0xec, 0x54, 0x08, 0xbb, 0x99, 0xce, 0x82, 0xa3, 0x64, 0xc9, 0x3a, 0x9c, 0x95, 0xa4, 0x88,
- 0xcf, 0xac, 0x6c, 0x5d, 0x6d, 0x7f, 0x50, 0xfb, 0xcc, 0x0a, 0xed, 0xb9, 0xd4, 0xe0, 0x06, 0x7a,
- 0x33, 0xc9, 0x86, 0xc3, 0x92, 0xe2, 0x57, 0x51, 0x2a, 0xdc, 0xbb, 0x41, 0x5d, 0xd1, 0xe5, 0x22,
- 0x76, 0xa4, 0x1c, 0x73, 0x4c, 0xd0, 0x70, 0x88, 0x9b, 0xbc, 0x02, 0xd5, 0x28, 0xec, 0xd2, 0xae,
- 0x6e, 0x5a, 0xfa, 0xb6, 0x69, 0x99, 0x6c, 0x4f, 0xe4, 0x8a, 0x67, 0x64, 0x30, 0x72, 0x73, 0x04,
- 0x0f, 0x8e, 0x94, 0xd6, 0xfe, 0x20, 0x07, 0xe2, 0xaf, 0x42, 0xe4, 0x3e, 0xe4, 0x2c, 0xa7, 0xad,
- 0x4c, 0xf2, 0xf8, 0x91, 0x8e, 0x35, 0xa7, 0x2d, 0x07, 0xde, 0x9a, 0xd3, 0x46, 0x8e, 0x48, 0x0c,
- 0x28, 0x74, 0xf4, 0x56, 0x47, 0x57, 0x16, 0x78, 0x7c, 0x7f, 0x23, 0x48, 0xe4, 0xa9, 0x1b, 0xa2,
- 0xfc, 0x15, 0x25, 0x36, 0x77, 0x6c, 0xb6, 0xfd, 0xdf, 0x84, 0xa8, 0xad, 0xdf, 0x04, 0xb1, 0x31,
- 0x1f, 0x49, 0xae, 0x82, 0xc1, 0x2b, 0x86, 0x3a, 0x88, 0x01, 0xc5, 0x7e, 0x53, 0xfc, 0xdd, 0x29,
- 0x3f, 0xa1, 0x17, 0xb3, 0xb5, 0x22, 0xbe, 0x49, 0xac, 0x5f, 0xf2, 0x19, 0x15, 0xb4, 0xf6, 0x17,
- 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb, 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67,
- 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19, 0xbc, 0x96, 0x14, 0x25, 0x8e, 0xf6, 0xa7, 0x79,
- 0x50, 0xbf, 0xc2, 0x22, 0x7d, 0x28, 0xb7, 0xfd, 0x9b, 0xab, 0xaa, 0xca, 0x2f, 0x4f, 0x70, 0xc3,
- 0x21, 0x76, 0x07, 0x56, 0xf6, 0x4e, 0x50, 0x88, 0xa1, 0x26, 0x42, 0xe3, 0x63, 0x6e, 0x65, 0xc2,
- 0x31, 0x27, 0xd5, 0x0d, 0x8f, 0x3a, 0x1d, 0xf2, 0x3b, 0x8c, 0xf5, 0x26, 0x3e, 0x88, 0x1b, 0x9e,
- 0xb1, 0x95, 0x61, 0x3c, 0xfe, 0x8e, 0x02, 0x9a, 0xab, 0xb0, 0xf5, 0x63, 0xb8, 0xe1, 0x1e, 0x86,
- 0x50, 0x55, 0x84, 0x55, 0x67, 0x1e, 0x0a, 0x68, 0xf2, 0xeb, 0x50, 0x61, 0xae, 0x6e, 0x7b, 0x2d,
- 0xc7, 0xed, 0x52, 0x57, 0x2d, 0xfe, 0xab, 0x13, 0x8c, 0xe7, 0xcd, 0x10, 0x4d, 0x46, 0x3d, 0x62,
- 0x45, 0x18, 0xd5, 0xa6, 0x75, 0x41, 0xb9, 0xed, 0xc4, 0x88, 0xfd, 0x49, 0x40, 0x66, 0x3a, 0x17,
- 0x0e, 0x37, 0x16, 0x83, 0xbb, 0xe4, 0x91, 0xbb, 0x75, 0xa9, 0xbf, 0x0c, 0xd0, 0xfe, 0x39, 0x0b,
- 0xb9, 0xcd, 0xb5, 0x86, 0xbc, 0x2a, 0x22, 0x7e, 0xac, 0x41, 0x1b, 0x1d, 0xb3, 0x77, 0x8f, 0xba,
- 0x66, 0x6b, 0x4f, 0xad, 0xbd, 0x91, 0xab, 0x22, 0x49, 0x0e, 0x4c, 0x91, 0x22, 0xaf, 0xc1, 0xb4,
- 0xa1, 0x2f, 0x53, 0x97, 0x49, 0x17, 0xe6, 0x68, 0x51, 0x73, 0x71, 0x82, 0x61, 0x79, 0x29, 0x14,
- 0xc7, 0x18, 0x18, 0xd9, 0x02, 0x30, 0x42, 0xe8, 0x23, 0x45, 0xd2, 0xe5, 0xaf, 0x13, 0x42, 0xe0,
- 0x08, 0x10, 0x41, 0x28, 0x77, 0x38, 0xab, 0x40, 0xcd, 0x1f, 0x05, 0x55, 0x4c, 0xba, 0xdb, 0xbe,
- 0x2c, 0x86, 0x30, 0xda, 0x7f, 0x64, 0x20, 0xdc, 0x04, 0x12, 0x0f, 0x8a, 0x4d, 0x71, 0x6b, 0x5b,
- 0x4d, 0xfb, 0xf1, 0x37, 0xd3, 0xf1, 0x1f, 0x96, 0xd4, 0xc9, 0xfe, 0xa0, 0x96, 0xf8, 0x89, 0x09,
- 0x2a, 0x55, 0xa4, 0x0d, 0xb9, 0x37, 0x9d, 0xed, 0x89, 0x67, 0x7d, 0xe4, 0xfc, 0x8f, 0xdc, 0x39,
- 0x45, 0x0a, 0x90, 0x6b, 0xd0, 0xbe, 0x95, 0x85, 0x4a, 0x64, 0x4c, 0x4f, 0xfc, 0x53, 0x82, 0x87,
- 0x89, 0x9f, 0x12, 0x6c, 0x8c, 0xbf, 0x2b, 0x0f, 0x6b, 0x75, 0xd2, 0xff, 0x25, 0xf8, 0xdb, 0x2c,
- 0xe4, 0xb6, 0x56, 0x56, 0xf9, 0xe2, 0x1b, 0x9c, 0x03, 0x9a, 0x38, 0x31, 0x15, 0xfe, 0x13, 0x4d,
- 0x8c, 0xb4, 0xe0, 0x15, 0x43, 0x1d, 0x64, 0x07, 0xa6, 0xb6, 0xfb, 0xa6, 0xc5, 0x4c, 0x7b, 0xe2,
- 0x53, 0x67, 0xfe, 0x3f, 0x1c, 0xd4, 0x71, 0x19, 0x89, 0x8a, 0x3e, 0x3c, 0x69, 0xc3, 0x54, 0x5b,
- 0x5e, 0x03, 0x51, 0x73, 0xef, 0xa5, 0xf1, 0x57, 0x2f, 0x89, 0x23, 0x15, 0xa9, 0x17, 0xf4, 0xd1,
- 0xb5, 0x6f, 0x82, 0x5a, 0xfc, 0x89, 0x77, 0x32, 0xad, 0x19, 0x04, 0x86, 0xd2, 0x5a, 0x54, 0xfb,
- 0xcf, 0x0c, 0xc4, 0xad, 0xf4, 0x27, 0xdf, 0xa9, 0x9d, 0x64, 0xa7, 0xae, 0x1c, 0xc7, 0x1c, 0x48,
- 0xef, 0x57, 0xed, 0xaf, 0xb3, 0x50, 0x54, 0x3f, 0x0b, 0x3d, 0xf9, 0xec, 0x07, 0x8d, 0x65, 0x3f,
- 0x96, 0x27, 0xfc, 0x75, 0xe2, 0xc8, 0xdc, 0x47, 0x37, 0x91, 0xfb, 0x98, 0xf4, 0x1f, 0x8d, 0x8f,
- 0xc9, 0x7c, 0xfc, 0x7d, 0x06, 0x4e, 0x49, 0xc6, 0x9b, 0xb6, 0xc7, 0x74, 0xdb, 0x10, 0x4e, 0xb1,
- 0x8c, 0x44, 0x4d, 0x1c, 0xda, 0x53, 0x61, 0x68, 0xe1, 0xae, 0xca, 0x67, 0x54, 0xd0, 0x7c, 0xb3,
- 0xbc, 0xe3, 0x78, 0x4c, 0x98, 0xdb, 0x6c, 0x7c, 0x93, 0xfd, 0xb2, 0x2a, 0xc7, 0x80, 0x23, 0xb9,
- 0x7b, 0x2f, 0x8c, 0xde, 0xbd, 0x6b, 0x7f, 0x96, 0x81, 0xe9, 0xe8, 0xdf, 0x29, 0xc7, 0x4f, 0xe4,
- 0x24, 0xf2, 0x28, 0xd9, 0x13, 0xc8, 0xa3, 0x7c, 0x98, 0x01, 0xf0, 0x2b, 0x7b, 0xe2, 0x59, 0x94,
- 0x66, 0x3c, 0x8b, 0x32, 0x71, 0xb7, 0xa6, 0xe7, 0x50, 0x7e, 0x50, 0xf0, 0x3f, 0x49, 0x64, 0x50,
- 0xde, 0xcb, 0xc0, 0x29, 0x3d, 0x96, 0x95, 0x98, 0xd8, 0x93, 0x48, 0x24, 0x39, 0x82, 0xbf, 0x79,
- 0xc6, 0xcb, 0x31, 0xa1, 0x96, 0x5c, 0x83, 0xe9, 0x9e, 0x0a, 0x15, 0xdf, 0x09, 0x47, 0x5d, 0x70,
- 0x00, 0x79, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x63, 0xb2, 0x40, 0xb9, 0x63, 0xc9, 0x02, 0x45, 0x8f,
- 0x9a, 0xe5, 0x0f, 0x3c, 0x6a, 0x66, 0x43, 0xb9, 0xe5, 0x3a, 0x5d, 0x91, 0x68, 0x51, 0xff, 0x4e,
- 0x9c, 0x30, 0x79, 0x13, 0x2c, 0x2a, 0xab, 0x3e, 0x2e, 0x86, 0x2a, 0xf8, 0x32, 0xcd, 0x1c, 0xa9,
- 0xad, 0x78, 0x1c, 0xda, 0x82, 0xa9, 0xbb, 0x29, 0x51, 0xd1, 0x87, 0x8f, 0x27, 0x53, 0xa6, 0x3e,
- 0x99, 0x64, 0x8a, 0xf6, 0x4f, 0x59, 0xdf, 0x5e, 0x34, 0x12, 0x77, 0x92, 0x32, 0x23, 0xee, 0x24,
- 0xa9, 0xdb, 0xb5, 0xd1, 0x74, 0xc3, 0xf3, 0x50, 0x74, 0xa9, 0xee, 0x39, 0xb6, 0xba, 0xa7, 0x1e,
- 0x58, 0x5b, 0x14, 0xa5, 0xa8, 0xa8, 0xd1, 0xb4, 0x44, 0xf6, 0x31, 0x69, 0x89, 0x2f, 0x44, 0x06,
- 0x84, 0xcc, 0xff, 0x06, 0x73, 0x3b, 0x65, 0x50, 0x88, 0x98, 0xa5, 0xfa, 0x25, 0x7f, 0x21, 0x19,
- 0xb3, 0x54, 0xbf, 0xcb, 0x0f, 0x38, 0x48, 0x13, 0xa6, 0x2d, 0xdd, 0x63, 0x22, 0x2a, 0xd5, 0x5c,
- 0x62, 0x63, 0xe4, 0x3c, 0x82, 0x69, 0xb3, 0x16, 0xc1, 0xc1, 0x18, 0xaa, 0xf6, 0x7b, 0x19, 0x08,
- 0x9b, 0xfc, 0x88, 0xd1, 0xd1, 0x57, 0xa0, 0xd4, 0xd5, 0x1f, 0xae, 0x50, 0x4b, 0xdf, 0x9b, 0xe4,
- 0xef, 0x57, 0xeb, 0x0a, 0x03, 0x03, 0x34, 0x6d, 0x90, 0x01, 0x75, 0x63, 0x97, 0x50, 0x28, 0xb4,
- 0xcc, 0x87, 0xaa, 0x3e, 0x93, 0x78, 0x2a, 0x91, 0xff, 0xad, 0xc9, 0xf8, 0x82, 0x28, 0x40, 0x89,
- 0x4e, 0xba, 0x30, 0xe5, 0xc9, 0xf0, 0x8f, 0xfa, 0x94, 0xf1, 0x77, 0xe5, 0xb1, 0x30, 0x92, 0xba,
- 0xee, 0x2b, 0x8b, 0xd0, 0xd7, 0x51, 0x9f, 0xff, 0xe0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfc, 0x78, 0xee,
- 0xa9, 0x8f, 0x3e, 0x9e, 0x7b, 0xea, 0x9d, 0xfd, 0xb9, 0xcc, 0x07, 0xfb, 0x73, 0x99, 0x0f, 0xf7,
- 0xe7, 0x32, 0x1f, 0xed, 0xcf, 0x65, 0xfe, 0x6d, 0x7f, 0x2e, 0xf3, 0xbb, 0xff, 0x3e, 0xf7, 0xd4,
- 0xab, 0x25, 0x1f, 0xf3, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x0c, 0xe6, 0xa8, 0xb2, 0x02, 0x64,
- 0x00, 0x00,
+ // 5718 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57,
+ 0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9,
+ 0x5a, 0x25, 0xff, 0xd9, 0x3f, 0xbb, 0x36, 0x63, 0xb2, 0xec, 0x2c, 0xb0, 0x9b, 0xb8, 0xed, 0xf1,
+ 0x64, 0x66, 0xec, 0x19, 0xef, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2,
+ 0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0xf3, 0x90, 0x20, 0x16, 0x2d, 0x12,
+ 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0xe1, 0x09,
+ 0x05, 0x1e, 0x20, 0x0f, 0x48, 0x04, 0x81, 0x5a, 0xc4, 0x3c, 0xf1, 0x00, 0x5a, 0xb4, 0x2f, 0xab,
+ 0x11, 0x12, 0xe8, 0x7e, 0xd4, 0x67, 0x57, 0x7b, 0xec, 0x6e, 0x3b, 0x3b, 0x11, 0x6f, 0x55, 0xf7,
+ 0x9c, 0xf3, 0x3b, 0xb7, 0xee, 0xc7, 0xb9, 0xe7, 0x9e, 0x73, 0x6f, 0xc1, 0x8d, 0xb6, 0xc9, 0x76,
+ 0xfa, 0xdb, 0xf3, 0x86, 0xd3, 0x5d, 0xb0, 0xfb, 0x5d, 0xbd, 0xe7, 0x3a, 0x6f, 0x8a, 0x87, 0x96,
+ 0xe5, 0x3c, 0x58, 0xe8, 0x75, 0xda, 0x0b, 0x7a, 0xcf, 0xf4, 0xc2, 0x92, 0xdd, 0xab, 0xba, 0xd5,
+ 0xdb, 0xd1, 0xaf, 0x2e, 0xb4, 0xa9, 0x4d, 0x5d, 0x9d, 0xd1, 0xe6, 0x7c, 0xcf, 0x75, 0x98, 0x43,
+ 0xbe, 0x1c, 0x02, 0xcd, 0xfb, 0x40, 0xf3, 0xbe, 0xd8, 0x7c, 0xaf, 0xd3, 0x9e, 0xe7, 0x40, 0x61,
+ 0x89, 0x0f, 0x34, 0xfb, 0xc5, 0x48, 0x0d, 0xda, 0x4e, 0xdb, 0x59, 0x10, 0x78, 0xdb, 0xfd, 0x96,
+ 0x78, 0x13, 0x2f, 0xe2, 0x49, 0xea, 0x99, 0xd5, 0x3a, 0xd7, 0xbc, 0x79, 0xd3, 0xe1, 0xd5, 0x5a,
+ 0x30, 0x1c, 0x97, 0x2e, 0xec, 0x0e, 0xd5, 0x65, 0xf6, 0x85, 0x90, 0xa7, 0xab, 0x1b, 0x3b, 0xa6,
+ 0x4d, 0xdd, 0x3d, 0xff, 0x5b, 0x16, 0x5c, 0xea, 0x39, 0x7d, 0xd7, 0xa0, 0x47, 0x92, 0xf2, 0x16,
+ 0xba, 0x94, 0xe9, 0x69, 0xba, 0x16, 0x46, 0x49, 0xb9, 0x7d, 0x9b, 0x99, 0xdd, 0x61, 0x35, 0x3f,
+ 0xff, 0x38, 0x01, 0xcf, 0xd8, 0xa1, 0x5d, 0x3d, 0x29, 0xa7, 0xfd, 0x73, 0x19, 0xce, 0x2d, 0x6d,
+ 0x7b, 0xcc, 0xd5, 0x0d, 0xb6, 0xe1, 0x34, 0x37, 0x69, 0xb7, 0x67, 0xe9, 0x8c, 0x92, 0x0e, 0x94,
+ 0x78, 0xdd, 0x9a, 0x3a, 0xd3, 0xab, 0x99, 0xcb, 0x99, 0x2b, 0x95, 0xc5, 0xa5, 0xf9, 0x31, 0xfb,
+ 0x62, 0x7e, 0x5d, 0x01, 0xd5, 0xa7, 0xf7, 0x07, 0xb5, 0x92, 0xff, 0x86, 0x81, 0x02, 0xf2, 0xbd,
+ 0x0c, 0x4c, 0xdb, 0x4e, 0x93, 0x36, 0xa8, 0x45, 0x0d, 0xe6, 0xb8, 0xd5, 0xec, 0xe5, 0xdc, 0x95,
+ 0xca, 0xe2, 0xeb, 0x63, 0x6b, 0x4c, 0xf9, 0xa2, 0xf9, 0x3b, 0x11, 0x05, 0xd7, 0x6d, 0xe6, 0xee,
+ 0xd5, 0x9f, 0xfe, 0x60, 0x50, 0x7b, 0x6a, 0x7f, 0x50, 0x9b, 0x8e, 0x92, 0x30, 0x56, 0x13, 0xb2,
+ 0x05, 0x15, 0xe6, 0x58, 0xbc, 0xc9, 0x4c, 0xc7, 0xf6, 0xaa, 0x39, 0x51, 0xb1, 0xb9, 0x79, 0xd9,
+ 0xda, 0x5c, 0xfd, 0x3c, 0x1f, 0x2e, 0xf3, 0xbb, 0x57, 0xe7, 0x37, 0x03, 0xb6, 0xfa, 0x39, 0x05,
+ 0x5c, 0x09, 0xcb, 0x3c, 0x8c, 0xe2, 0x10, 0x0a, 0xa7, 0x3d, 0x6a, 0xf4, 0x5d, 0x93, 0xed, 0x2d,
+ 0x3b, 0x36, 0xa3, 0x0f, 0x59, 0x35, 0x2f, 0x5a, 0xf9, 0xf9, 0x34, 0xe8, 0x0d, 0xa7, 0xd9, 0x88,
+ 0x73, 0xd7, 0xcf, 0xed, 0x0f, 0x6a, 0xa7, 0x13, 0x85, 0x98, 0xc4, 0x24, 0x36, 0x9c, 0x31, 0xbb,
+ 0x7a, 0x9b, 0x6e, 0xf4, 0x2d, 0xab, 0x41, 0x0d, 0x97, 0x32, 0xaf, 0x5a, 0x10, 0x9f, 0x70, 0x25,
+ 0x4d, 0xcf, 0x9a, 0x63, 0xe8, 0xd6, 0xdd, 0xed, 0x37, 0xa9, 0xc1, 0x90, 0xb6, 0xa8, 0x4b, 0x6d,
+ 0x83, 0xd6, 0xab, 0xea, 0x63, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b,
+ 0xae, 0xe9, 0x88, 0x2a, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52,
+ 0xae, 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x0c, 0x38, 0x2c, 0x43, 0xae, 0x40, 0xc9, 0x2f, 0xac,
+ 0x4e, 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xcb, 0x62, 0x40, 0x25, 0xab, 0x50, 0xd2, 0x5b,
+ 0x2d, 0xd3, 0xe6, 0x9c, 0x25, 0xd1, 0x84, 0x97, 0xd2, 0x3e, 0x6d, 0x49, 0xf1, 0x48, 0x1c, 0xff,
+ 0x0d, 0x03, 0x59, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d,
+ 0x26, 0xea, 0x5e, 0x16, 0x75, 0x9f, 0x55, 0x75, 0x27, 0x8d, 0x21, 0x0e, 0x4c, 0x91, 0x22, 0x2f,
+ 0xc1, 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xd0, 0x70, 0x88,
+ 0x9b, 0x34, 0xe1, 0x92, 0xde, 0x67, 0x4e, 0x97, 0x43, 0xc6, 0x95, 0x6e, 0x3a, 0x1d, 0x6a, 0x57,
+ 0x2b, 0x97, 0x33, 0x57, 0x4a, 0xf5, 0xcb, 0xfb, 0x83, 0xda, 0xa5, 0xa5, 0x03, 0xf8, 0xf0, 0x40,
+ 0x14, 0x72, 0x17, 0xca, 0x4d, 0xdb, 0xdb, 0x70, 0x2c, 0xd3, 0xd8, 0xab, 0x4e, 0x8b, 0x0a, 0x5e,
+ 0x55, 0x9f, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x84, 0x47, 0x83, 0xda, 0xa5, 0x61, 0xeb, 0x38, 0x1f,
+ 0xd0, 0x31, 0xc4, 0x20, 0xeb, 0x02, 0x70, 0xd9, 0xb1, 0x5b, 0x66, 0xbb, 0x3a, 0x23, 0x7a, 0xe3,
+ 0xf2, 0x88, 0x01, 0xbd, 0x72, 0xa7, 0x21, 0xf9, 0xea, 0x33, 0x4a, 0x9d, 0x7c, 0xc5, 0x10, 0x61,
+ 0xf6, 0x45, 0x38, 0x3b, 0x34, 0x6b, 0xc9, 0x19, 0xc8, 0x75, 0xe8, 0x9e, 0x30, 0x4a, 0x65, 0xe4,
+ 0x8f, 0xe4, 0x69, 0x28, 0xec, 0xea, 0x56, 0x9f, 0x56, 0xb3, 0xa2, 0x4c, 0xbe, 0xfc, 0x42, 0xf6,
+ 0x5a, 0x46, 0x1b, 0x94, 0xe1, 0x94, 0x6f, 0x0b, 0xee, 0x51, 0x97, 0xd1, 0x87, 0xe4, 0x32, 0xe4,
+ 0x6d, 0xde, 0x1f, 0x42, 0xbe, 0x3e, 0xad, 0x3e, 0x37, 0x2f, 0xfa, 0x41, 0x50, 0x88, 0x01, 0x45,
+ 0x69, 0xcb, 0x05, 0x5e, 0x65, 0xf1, 0xc5, 0xb1, 0xcd, 0x50, 0x43, 0xc0, 0xd4, 0x61, 0x7f, 0x50,
+ 0x2b, 0xca, 0x67, 0x54, 0xd0, 0xe4, 0x35, 0xc8, 0x7b, 0xa6, 0xdd, 0xa9, 0xe6, 0x84, 0x8a, 0xaf,
+ 0x8e, 0xaf, 0xc2, 0xb4, 0x3b, 0xf5, 0x12, 0xff, 0x02, 0xfe, 0x84, 0x02, 0x94, 0xdc, 0x87, 0x5c,
+ 0xbf, 0xd9, 0x52, 0x16, 0xe5, 0x97, 0xc6, 0xc6, 0xde, 0x5a, 0x59, 0xad, 0x4f, 0xed, 0x0f, 0x6a,
+ 0xb9, 0xad, 0x95, 0x55, 0xe4, 0x88, 0xe4, 0xbb, 0x19, 0x38, 0x6b, 0x38, 0x36, 0xd3, 0xf9, 0xfa,
+ 0xe2, 0x5b, 0xd6, 0x6a, 0x41, 0xe8, 0xb9, 0x35, 0xb6, 0x9e, 0xe5, 0x24, 0x62, 0xfd, 0x3c, 0x37,
+ 0x14, 0x43, 0xc5, 0x38, 0xac, 0x9b, 0x7c, 0x3f, 0x03, 0xe7, 0xf9, 0x04, 0x1e, 0x62, 0x16, 0x66,
+ 0xe7, 0x78, 0x6b, 0x75, 0x71, 0x7f, 0x50, 0x3b, 0x7f, 0x33, 0x4d, 0x19, 0xa6, 0xd7, 0x81, 0xd7,
+ 0xee, 0x9c, 0x3e, 0xbc, 0x16, 0x09, 0x93, 0x56, 0x59, 0x5c, 0x3b, 0xce, 0xf5, 0xad, 0xfe, 0x19,
+ 0x35, 0x94, 0xd3, 0x96, 0x73, 0x4c, 0xab, 0x05, 0xb9, 0x0e, 0x53, 0xbb, 0x8e, 0xd5, 0xef, 0x52,
+ 0xaf, 0x5a, 0x12, 0x8b, 0xc2, 0x6c, 0xda, 0x5c, 0xbd, 0x27, 0x58, 0xea, 0xa7, 0x15, 0xfc, 0x94,
+ 0x7c, 0xf7, 0xd0, 0x97, 0x25, 0x26, 0x14, 0x2d, 0xb3, 0x6b, 0x32, 0x4f, 0x58, 0xcb, 0xca, 0xe2,
+ 0xf5, 0xb1, 0x3f, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0x7c, 0x46, 0xa5, 0x80, 0x18,
+ 0x50, 0xf0, 0x0c, 0xdd, 0x92, 0xd6, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf,
+ 0xa8, 0x6f, 0x2a, 0x88, 0x57, 0x94, 0xd8, 0xe4, 0x57, 0xe0, 0x54, 0xac, 0x37, 0xbd, 0x6a, 0x45,
+ 0xb4, 0xce, 0xb3, 0x69, 0xad, 0x13, 0x70, 0xd5, 0x2f, 0x28, 0xb0, 0x53, 0xb1, 0x11, 0xe2, 0x61,
+ 0x02, 0x8c, 0xdc, 0x86, 0x92, 0x67, 0x36, 0xa9, 0xa1, 0xbb, 0x5e, 0x75, 0xfa, 0x30, 0xc0, 0x67,
+ 0x14, 0x70, 0xa9, 0xa1, 0xc4, 0x30, 0x00, 0xd0, 0xee, 0xc3, 0xcc, 0x52, 0x9f, 0xed, 0x38, 0xae,
+ 0xf9, 0xb6, 0xf0, 0x2c, 0xc8, 0x2a, 0x14, 0x98, 0x58, 0x21, 0xa4, 0xd3, 0xf6, 0x5c, 0x1a, 0xb4,
+ 0x5c, 0xad, 0x6f, 0xd3, 0x3d, 0xdf, 0xb0, 0xd6, 0xcb, 0xbc, 0x11, 0xe4, 0x8a, 0x21, 0xc5, 0xb5,
+ 0x3f, 0xcc, 0x40, 0xb9, 0xae, 0x7b, 0xa6, 0xc1, 0xe1, 0xc9, 0x32, 0xe4, 0xfb, 0x1e, 0x75, 0x8f,
+ 0x06, 0x2a, 0xac, 0xd2, 0x96, 0x47, 0x5d, 0x14, 0xc2, 0xe4, 0x2e, 0x94, 0x7a, 0xba, 0xe7, 0x3d,
+ 0x70, 0xdc, 0xa6, 0xb2, 0xac, 0x87, 0x04, 0x92, 0x4b, 0xbf, 0x12, 0xc5, 0x00, 0x44, 0xab, 0x40,
+ 0xb9, 0x6e, 0xe9, 0x46, 0x67, 0xc7, 0xb1, 0xa8, 0xf6, 0x2a, 0x14, 0xeb, 0xfd, 0x56, 0x8b, 0xba,
+ 0x87, 0xb0, 0xf0, 0xf3, 0x90, 0x67, 0x7b, 0x3d, 0xb5, 0x5e, 0x04, 0xab, 0x7b, 0x7e, 0x73, 0xaf,
+ 0x47, 0x1f, 0x0d, 0x6a, 0x20, 0x71, 0xf8, 0x1b, 0x0a, 0x3e, 0xed, 0xc7, 0x19, 0x38, 0x27, 0x0b,
+ 0xd5, 0x2a, 0x2a, 0xd7, 0x27, 0x42, 0xa1, 0xe0, 0xd2, 0xa6, 0xe9, 0xa9, 0x76, 0x59, 0x19, 0x7b,
+ 0x38, 0x22, 0x47, 0x51, 0xcb, 0xa1, 0xe8, 0x0b, 0x51, 0x80, 0x12, 0x9d, 0xf4, 0xa1, 0xfc, 0x26,
+ 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x55, 0x2d, 0xf7, 0xf2, 0xd8, 0xaa, 0x6e, 0x51, 0xd6, 0x10, 0x48,
+ 0xd1, 0xd5, 0x37, 0x28, 0xc4, 0x50, 0x93, 0xf6, 0x93, 0x3c, 0x94, 0x83, 0x51, 0x48, 0x3e, 0x07,
+ 0x05, 0xe1, 0xee, 0xa9, 0x66, 0x0d, 0xa6, 0x8e, 0xf0, 0x0a, 0x51, 0xd2, 0xc8, 0x73, 0x30, 0x65,
+ 0x38, 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x0b, 0x5f, 0xae, 0x57, 0xb8, 0xc5, 0x58, 0x96, 0x45, 0xe8,
+ 0xd3, 0xc8, 0x25, 0xc8, 0xeb, 0x6e, 0x5b, 0x7a, 0xd3, 0x65, 0x39, 0x4e, 0x96, 0xdc, 0xb6, 0x87,
+ 0xa2, 0x94, 0x7c, 0x05, 0x72, 0xd4, 0xde, 0xad, 0xe6, 0x47, 0x9b, 0xa4, 0xeb, 0xf6, 0xee, 0x3d,
+ 0xdd, 0xad, 0x57, 0x54, 0x1d, 0x72, 0xd7, 0xed, 0x5d, 0xe4, 0x32, 0x64, 0x0d, 0xa6, 0xa8, 0xbd,
+ 0xbb, 0xea, 0x3a, 0x5d, 0xe5, 0xe6, 0x7e, 0x76, 0x84, 0x38, 0x67, 0x51, 0xab, 0x73, 0x60, 0xd8,
+ 0x54, 0x31, 0xfa, 0x10, 0xe4, 0x1b, 0x30, 0x2d, 0x6d, 0xdc, 0x3a, 0x77, 0x99, 0xbc, 0x6a, 0x51,
+ 0x40, 0xd6, 0x46, 0x1b, 0x49, 0xc1, 0x17, 0x6e, 0x2b, 0x22, 0x85, 0x1e, 0xc6, 0xa0, 0xc8, 0x37,
+ 0xa0, 0xec, 0xef, 0x18, 0x3d, 0xb5, 0x1a, 0xa4, 0x7a, 0xe4, 0xa8, 0x98, 0x90, 0xbe, 0xd5, 0x37,
+ 0x5d, 0xda, 0xa5, 0x36, 0xf3, 0xea, 0x67, 0x7d, 0x1f, 0xcd, 0xa7, 0x7a, 0x18, 0xa2, 0x91, 0xed,
+ 0xe1, 0xad, 0x85, 0xf4, 0x8b, 0x3f, 0x37, 0x62, 0xb6, 0x8d, 0xb1, 0xaf, 0x78, 0x1d, 0x4e, 0x07,
+ 0xbe, 0xbf, 0x72, 0x1f, 0xa5, 0xa7, 0xfc, 0x02, 0x17, 0xbf, 0x19, 0x27, 0x3d, 0x1a, 0xd4, 0x9e,
+ 0x4d, 0x71, 0x20, 0x43, 0x06, 0x4c, 0x82, 0x69, 0xff, 0x95, 0x85, 0xe1, 0xe5, 0x3f, 0xde, 0x68,
+ 0x99, 0xe3, 0x6e, 0xb4, 0xe4, 0x07, 0x49, 0xe3, 0x70, 0x4d, 0x89, 0x4d, 0xfe, 0x51, 0x69, 0x1d,
+ 0x93, 0x3b, 0xee, 0x8e, 0x19, 0x7f, 0xee, 0x68, 0xef, 0xe5, 0xe1, 0xd4, 0x8a, 0x4e, 0xbb, 0x8e,
+ 0xfd, 0x58, 0xf7, 0x25, 0xf3, 0x44, 0xb8, 0x2f, 0x57, 0xa0, 0xe4, 0xd2, 0x9e, 0x65, 0x1a, 0xba,
+ 0x27, 0x3a, 0x4b, 0xed, 0x11, 0x51, 0x95, 0x61, 0x40, 0x1d, 0xe1, 0xb6, 0xe6, 0x9e, 0x48, 0xb7,
+ 0x35, 0xff, 0xd3, 0x77, 0x5b, 0xb5, 0xf7, 0x73, 0x90, 0xbf, 0xde, 0x6c, 0x53, 0xbe, 0x94, 0xb6,
+ 0xb8, 0x31, 0x4d, 0x2c, 0xa5, 0xc2, 0x4c, 0x0a, 0x0a, 0x99, 0x85, 0x2c, 0x73, 0xd4, 0x5c, 0x01,
+ 0x45, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x87, 0x4e,
+ 0x26, 0xfb, 0xb0, 0x55, 0xc7, 0x7d, 0xa0, 0xbb, 0xcd, 0xe5, 0x00, 0xb1, 0x7e, 0x6a, 0x7f, 0x50,
+ 0x83, 0xf0, 0x1d, 0x23, 0xda, 0x48, 0x3b, 0x70, 0x4a, 0x65, 0x83, 0x2e, 0x8f, 0xad, 0x97, 0x37,
+ 0xc4, 0x01, 0x2e, 0xe9, 0x55, 0xa8, 0xf4, 0x74, 0x57, 0xb7, 0x2c, 0x6a, 0x99, 0x5e, 0x57, 0xec,
+ 0x85, 0x0a, 0xf5, 0xd3, 0xfb, 0x83, 0x5a, 0x65, 0x23, 0x2c, 0xc6, 0x28, 0x0f, 0x79, 0x11, 0x8a,
+ 0x8e, 0xbd, 0xda, 0xb7, 0x2c, 0x15, 0x1a, 0xf9, 0x7f, 0x1c, 0xf6, 0xae, 0x28, 0x79, 0x34, 0xa8,
+ 0x5d, 0x94, 0x9e, 0x06, 0x7f, 0xbb, 0xef, 0x9a, 0xcc, 0xb4, 0xdb, 0x0d, 0xe6, 0xea, 0x8c, 0xb6,
+ 0xf7, 0x50, 0x89, 0x69, 0xbf, 0x9d, 0x01, 0x08, 0xab, 0x45, 0xbe, 0x0a, 0xa7, 0xb7, 0x85, 0xcc,
+ 0xba, 0xfe, 0x70, 0x8d, 0xda, 0x6d, 0xb6, 0x23, 0x3a, 0x2c, 0x2f, 0x6d, 0x46, 0x3d, 0x4e, 0xc2,
+ 0x24, 0x2f, 0x79, 0x09, 0xce, 0xc8, 0xa2, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0x64, 0xb4,
+ 0xa2, 0x9e, 0xa0, 0xe1, 0x10, 0xb7, 0xa6, 0x43, 0x65, 0xd5, 0x7c, 0x48, 0x9b, 0xf7, 0x4d, 0xbb,
+ 0xe9, 0x3c, 0x20, 0x08, 0x45, 0x2b, 0xac, 0x46, 0x65, 0x71, 0x3e, 0x62, 0x87, 0x82, 0xe0, 0x64,
+ 0xd8, 0xe4, 0x5d, 0xca, 0x74, 0x6e, 0x99, 0x56, 0xfa, 0x2a, 0x7c, 0x26, 0x9b, 0x59, 0xd6, 0x56,
+ 0x21, 0x69, 0x2f, 0xc0, 0xd9, 0xa1, 0x01, 0x40, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0xd9,
+ 0xe5, 0x8e, 0x84, 0xf0, 0x9c, 0x6e, 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda,
+ 0xb7, 0x0d, 0xe1, 0x1a, 0x3f, 0xde, 0x2f, 0xf4, 0xfd, 0x92, 0x6c, 0xaa, 0x5f, 0xd2, 0x87, 0x62,
+ 0xe7, 0x41, 0xe0, 0xb7, 0x54, 0x16, 0xd7, 0xc7, 0x1f, 0xca, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e,
+ 0x8c, 0x46, 0x9e, 0x52, 0x15, 0x2a, 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a,
+ 0x84, 0xed, 0x48, 0xe1, 0x8f, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xf0, 0x75, 0x5c, 0xe9, 0xee,
+ 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0xbb, 0x7b, 0xdc, 0xd8, 0x42, 0x5e, 0x46,
+ 0x5e, 0x81, 0x52, 0x53, 0xf5, 0x81, 0x72, 0x33, 0x8f, 0xda, 0x73, 0xc2, 0x00, 0xfb, 0x6f, 0x18,
+ 0xa0, 0x71, 0xbf, 0xb0, 0xeb, 0xb5, 0x1b, 0xe6, 0xdb, 0xd2, 0xea, 0x16, 0xa4, 0x5f, 0xb8, 0x2e,
+ 0x8b, 0xd0, 0xa7, 0x71, 0x8b, 0xde, 0xa1, 0x7b, 0xcb, 0xdc, 0x45, 0x12, 0xd3, 0x56, 0x59, 0xf4,
+ 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3,
+ 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x66, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x82, 0xb6, 0x42, 0x7b, 0x96,
+ 0xb3, 0xc7, 0xfd, 0x00, 0xa4, 0x6f, 0x91, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x0f,
+ 0x5f, 0x8d, 0x86, 0xcb, 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91,
+ 0x09, 0x7d, 0xe1, 0xec, 0x01, 0xbe, 0x70, 0x03, 0xa0, 0x17, 0x7a, 0x13, 0x39, 0xc1, 0xf9, 0x73,
+ 0xbe, 0x9a, 0xa3, 0x38, 0x12, 0x11, 0x98, 0x49, 0xd6, 0xf7, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca,
+ 0x02, 0x57, 0x5f, 0x6d, 0x65, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x37, 0x03, 0x45, 0x4b, 0xdf,
+ 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65, 0xf1, 0x8d, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42,
+ 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77,
+ 0xc3, 0x71, 0x99, 0x5a, 0xda, 0x83, 0x90, 0xfa, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30,
+ 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2,
+ 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09,
+ 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72,
+ 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe,
+ 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f, 0x41, 0x45, 0x85, 0xa2, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54,
+ 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xeb, 0x62, 0x1c, 0x4f, 0xbf, 0x0f,
+ 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x8e,
+ 0xfb, 0x1d, 0x9f, 0x80, 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c,
+ 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49,
+ 0xd6, 0xe1, 0x9c, 0x21, 0x23, 0xd1, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x97,
+ 0xba, 0x3c, 0xcc, 0x82, 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a,
+ 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67,
+ 0x3b, 0x32, 0x68, 0x13, 0x49, 0x74, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d,
+ 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53,
+ 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7,
+ 0x04, 0xac, 0x4c, 0x7b, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c,
+ 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x49, 0x8e, 0x72, 0xfd,
+ 0x19, 0x7f, 0x97, 0xb8, 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53,
+ 0x31, 0x91, 0xea, 0x29, 0x99, 0x16, 0xf2, 0x43, 0x06, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58,
+ 0x8f, 0x47, 0x72, 0x31, 0x14, 0x41, 0xa5, 0x84, 0xd9, 0x7f, 0x27, 0x69, 0xf6, 0x5f, 0x9b, 0x64,
+ 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x21, 0x30, 0xb9, 0x15, 0x89, 0x58,
+ 0xfe, 0x20, 0xf9, 0x86, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d,
+ 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49,
+ 0x1a, 0xff, 0x5f, 0xca, 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xdd, 0xa4, 0xd9, 0x7e,
+ 0x63, 0xf2, 0x7e, 0x1b, 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61,
+ 0x40, 0xc1, 0x08, 0x17, 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22,
+ 0xc6, 0x79, 0x47, 0x9a, 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x46, 0x58, 0xe2, 0x15,
+ 0xe3, 0xb9, 0xdf, 0x9b, 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e,
+ 0x8d, 0x3f, 0x94, 0xc9, 0x1b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3,
+ 0x0a, 0xf8, 0x22, 0x8e, 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd,
+ 0x1a, 0xbd, 0x30, 0x2c, 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb,
+ 0xa2, 0x4d, 0x95, 0xfb, 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab,
+ 0xa7, 0x8f, 0x68, 0xab, 0x6f, 0x88, 0xa8, 0x51, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x9c, 0x66,
+ 0x58, 0x4e, 0x32, 0xe0, 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a,
+ 0xb1, 0x54, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0,
+ 0xe9, 0xb8, 0x93, 0xf2, 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x93, 0x85, 0x73,
+ 0x37, 0xa8, 0xca, 0xae, 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x93, 0x85,
+ 0xa9, 0x1b, 0xae, 0xd3, 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41,
+ 0xc6, 0x3f, 0x48, 0x20, 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8,
+ 0x1e, 0x95, 0x69, 0xb5, 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x13, 0xa6, 0x3c,
+ 0xe6, 0xb8, 0xbe, 0x91, 0x9e, 0x24, 0x24, 0xb6, 0x51, 0xff, 0x7a, 0x43, 0x42, 0xc9, 0x8d, 0xbc,
+ 0x7a, 0x41, 0x5f, 0x81, 0xf6, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42,
+ 0x5e, 0xef, 0x07, 0xe1, 0xa0, 0xd5, 0xf1, 0xe3, 0xc6, 0xd1, 0x54, 0xa7, 0x8a, 0xcf, 0xf4, 0xd9,
+ 0x0e, 0x0a, 0x74, 0xf2, 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0xb3, 0xa3, 0x56, 0x51,
+ 0xf4, 0xe9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0xcb, 0xec,
+ 0x91, 0x5f, 0x1d, 0x3a, 0xf8, 0xf6, 0xb3, 0x87, 0x0b, 0x82, 0xc8, 0x73, 0x53, 0xeb, 0x94, 0xe9,
+ 0xa1, 0x6d, 0x0a, 0xcb, 0x22, 0xa7, 0xdd, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6,
+ 0xd8, 0xad, 0x91, 0xfe, 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x4d,
+ 0x28, 0x7a, 0x4c, 0x67, 0x7d, 0x3f, 0x12, 0xbb, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5,
+ 0x3b, 0x2a, 0xa5, 0xda, 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xf2, 0x50,
+ 0xb3, 0x1f, 0x32, 0xf6, 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0x69, 0x72, 0xbf, 0x24, 0xd2, 0xe4, 0x0c,
+ 0x0a, 0x26, 0xa3, 0x5d, 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a,
+ 0x65, 0xda, 0x7b, 0xd9, 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0xec, 0xf1, 0xed, 0xc9, 0xb2,
+ 0xc7, 0xf1, 0x0a, 0x0d, 0x27, 0x91, 0x7f, 0x7d, 0x38, 0x89, 0x7c, 0x77, 0xf2, 0x24, 0x72, 0xa2,
+ 0x19, 0x46, 0xe6, 0x92, 0xbf, 0x93, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c,
+ 0xd4, 0x56, 0x1e, 0x3c, 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2,
+ 0x5b, 0xd8, 0xe0, 0x85, 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59,
+ 0xba, 0xd4, 0xf3, 0x42, 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94,
+ 0x7b, 0x46, 0x95, 0x77, 0x18, 0x3f, 0x49, 0x96, 0x72, 0xe0, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50,
+ 0xba, 0x82, 0x03, 0x0d, 0x85, 0xf4, 0x03, 0x0d, 0x91, 0x05, 0x56, 0x1e, 0x68, 0xf8, 0xfb, 0x12,
+ 0x5c, 0x48, 0xef, 0x43, 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xf0,
+ 0x47, 0x16, 0xa3, 0x4f, 0xff, 0x54, 0x27, 0xe0, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9,
+ 0x24, 0x92, 0x70, 0xcf, 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8,
+ 0x76, 0x13, 0x7e, 0xf6, 0x09, 0x1e, 0xbd, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3,
+ 0x91, 0x35, 0x21, 0xbf, 0x01, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x9f, 0xbe, 0x1b,
+ 0x7f, 0xf4, 0x6f, 0x84, 0x58, 0x7e, 0xfa, 0x4b, 0x65, 0xd5, 0x42, 0x02, 0x46, 0x35, 0x3e, 0xe1,
+ 0x67, 0xed, 0xae, 0x40, 0xc9, 0xa3, 0x8c, 0x99, 0x76, 0xdb, 0x13, 0xbb, 0xb7, 0xb2, 0x9c, 0x2b,
+ 0x0d, 0x55, 0x86, 0x01, 0x95, 0xfc, 0x0c, 0x94, 0x45, 0xdc, 0x67, 0xc9, 0x6d, 0x7b, 0xd5, 0xb2,
+ 0xc8, 0x44, 0x09, 0xbb, 0xda, 0xf0, 0x0b, 0x31, 0xa4, 0x93, 0x17, 0x60, 0x5a, 0x66, 0xe3, 0xd4,
+ 0x99, 0x5b, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe5, 0x18, 0xe3, 0xe2, 0xfb,
+ 0x29, 0x1a, 0x04, 0xc7, 0x92, 0xfb, 0xa9, 0x30, 0x6c, 0x86, 0x11, 0x2e, 0xf2, 0x2c, 0xe4, 0x98,
+ 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xf4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xcb, 0xb5, 0xff, 0xc9, 0xc0,
+ 0xe9, 0xc4, 0xd1, 0x22, 0x2e, 0xd2, 0x77, 0x2d, 0x65, 0x46, 0x02, 0x91, 0x2d, 0x5c, 0x43, 0x5e,
+ 0x4e, 0xde, 0x50, 0x5e, 0x61, 0x76, 0xc2, 0xeb, 0x05, 0x77, 0x74, 0xe6, 0x71, 0x37, 0x70, 0xc8,
+ 0x21, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0x3c, 0xd6, 0x76, 0x70, 0x03, 0x45, 0x36, 0x9c, 0xf9, 0xc3,
+ 0x6c, 0x38, 0xb5, 0xbf, 0xcd, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c, 0x91, 0x6e, 0x91,
+ 0xb3, 0x3f, 0x45, 0x8b, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd, 0xf4, 0x96, 0x5a,
+ 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x22, 0x77, 0x9f, 0xd9, 0x1f, 0xd4, 0x9e,
+ 0xd9, 0xdc, 0x5c, 0x4b, 0x63, 0xc1, 0x51, 0xb2, 0x62, 0x86, 0xe8, 0x46, 0xc7, 0x69, 0xb5, 0x64,
+ 0x66, 0x5b, 0xe6, 0x78, 0xe4, 0x0c, 0x89, 0x94, 0x63, 0x8c, 0x4b, 0xfb, 0x28, 0x03, 0xe5, 0xdb,
+ 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9, 0x50, 0xd7, 0x53,
+ 0x99, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x22, 0xf4, 0x69, 0x7c, 0x1b, 0xc6, 0x9c, 0x9e, 0x69, 0x24,
+ 0x37, 0xac, 0x9b, 0xbc, 0x10, 0x25, 0x8d, 0xdc, 0x97, 0xf3, 0x28, 0x37, 0xe1, 0xd9, 0xec, 0xcd,
+ 0xb5, 0x86, 0xcc, 0xde, 0xfa, 0x33, 0x90, 0x3c, 0x1f, 0xf3, 0x3c, 0xca, 0xa3, 0x7c, 0x05, 0xed,
+ 0xfb, 0x59, 0xa8, 0xc8, 0x4f, 0x93, 0x9b, 0xb3, 0xe3, 0xfc, 0xb8, 0x17, 0x45, 0x74, 0xdd, 0xeb,
+ 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xa3, 0x25, 0x21, 0x31, 0x88, 0xb0, 0x87, 0x45,
+ 0x7e, 0xeb, 0xe4, 0x4f, 0xb0, 0x75, 0x0a, 0x07, 0xb6, 0xce, 0x9f, 0x65, 0xa0, 0xbc, 0x66, 0xb6,
+ 0xa8, 0xb1, 0x67, 0x58, 0x94, 0xbc, 0x02, 0xd5, 0x26, 0xb5, 0x28, 0xa3, 0x37, 0x5c, 0xdd, 0xa0,
+ 0x1b, 0xd4, 0x35, 0xc5, 0x4d, 0x1c, 0x3e, 0xca, 0xc4, 0x3c, 0x2e, 0xc8, 0xe5, 0x72, 0x65, 0x04,
+ 0x0f, 0x8e, 0x94, 0x26, 0x37, 0x61, 0xba, 0x49, 0x3d, 0xd3, 0xa5, 0xcd, 0x8d, 0x88, 0x37, 0xfa,
+ 0x9c, 0x6f, 0x9b, 0x56, 0x22, 0xb4, 0x47, 0x83, 0xda, 0xcc, 0x86, 0xd9, 0xa3, 0x96, 0x69, 0x53,
+ 0xe9, 0x96, 0xc6, 0x44, 0xb5, 0x02, 0xe4, 0xd6, 0x9c, 0xb6, 0xf6, 0x5e, 0x0e, 0x82, 0xbb, 0x55,
+ 0xe4, 0x37, 0x33, 0x50, 0xd1, 0x6d, 0xdb, 0x61, 0xea, 0xde, 0x92, 0x8c, 0xed, 0xe3, 0xc4, 0x57,
+ 0xb8, 0xe6, 0x97, 0x42, 0x50, 0x19, 0x16, 0x0e, 0x42, 0xd5, 0x11, 0x0a, 0x46, 0x75, 0x93, 0x7e,
+ 0x22, 0x52, 0xbd, 0x3e, 0x79, 0x2d, 0x0e, 0x11, 0x97, 0x9e, 0xfd, 0x1a, 0x9c, 0x49, 0x56, 0xf6,
+ 0x28, 0x81, 0xad, 0x49, 0x62, 0x62, 0xef, 0x94, 0xa1, 0x72, 0x47, 0x67, 0xe6, 0x2e, 0x15, 0x5b,
+ 0xb0, 0x93, 0xf1, 0xa9, 0xff, 0x20, 0x03, 0x17, 0xe2, 0x31, 0xe3, 0x13, 0x74, 0xac, 0x67, 0xf7,
+ 0x07, 0xb5, 0x0b, 0x98, 0xaa, 0x0d, 0x47, 0xd4, 0x42, 0xb8, 0xd8, 0x43, 0x21, 0xe8, 0x93, 0x76,
+ 0xb1, 0x1b, 0xa3, 0x14, 0xe2, 0xe8, 0xba, 0x7c, 0x5a, 0x5c, 0xec, 0x27, 0xfb, 0xae, 0x4b, 0x62,
+ 0x03, 0x30, 0xf5, 0xc4, 0x6c, 0x00, 0x4a, 0x4f, 0x84, 0xc3, 0xd5, 0x8b, 0x6c, 0x00, 0xca, 0x13,
+ 0xc6, 0x41, 0x55, 0x9a, 0x55, 0xa2, 0x8d, 0xda, 0x48, 0x88, 0xc3, 0x6f, 0xbe, 0x6f, 0x4c, 0x0c,
+ 0x28, 0x6c, 0xeb, 0x9e, 0x69, 0x28, 0xf7, 0xb3, 0x3e, 0x7e, 0x58, 0xc2, 0xbf, 0x14, 0x22, 0x63,
+ 0x4c, 0xe2, 0x15, 0x25, 0x76, 0x78, 0xf9, 0x24, 0x3b, 0xd1, 0xe5, 0x13, 0xb2, 0x0c, 0x79, 0x9b,
+ 0x1b, 0xdb, 0xdc, 0x91, 0xaf, 0x9b, 0xdc, 0xb9, 0x4d, 0xf7, 0x50, 0x08, 0x6b, 0x3f, 0xcc, 0x02,
+ 0xf0, 0xcf, 0x57, 0x6e, 0xce, 0x63, 0x36, 0x23, 0x9f, 0x87, 0x29, 0xaf, 0x2f, 0xa2, 0xb5, 0x6a,
+ 0x29, 0x0e, 0x83, 0xc7, 0xb2, 0x18, 0x7d, 0x3a, 0xf7, 0x84, 0xde, 0xea, 0xd3, 0xbe, 0x1f, 0x0b,
+ 0x0a, 0x3c, 0xa1, 0xaf, 0xf3, 0x42, 0x94, 0xb4, 0x93, 0x73, 0x64, 0xfc, 0x5d, 0x53, 0xe1, 0x84,
+ 0x76, 0x4d, 0xda, 0xb7, 0xb2, 0x00, 0x61, 0x80, 0x9f, 0xbc, 0x9f, 0x81, 0xf3, 0xc1, 0x2c, 0x63,
+ 0xf2, 0x4a, 0xc3, 0xb2, 0xa5, 0x9b, 0xdd, 0x89, 0x37, 0x32, 0x69, 0x33, 0x5c, 0x98, 0x9d, 0x8d,
+ 0x34, 0x75, 0x98, 0x5e, 0x0b, 0x82, 0x50, 0xa2, 0xdd, 0x1e, 0xdb, 0x5b, 0x31, 0x5d, 0x35, 0xec,
+ 0x52, 0xef, 0x04, 0x5c, 0x57, 0x3c, 0x52, 0x54, 0x5d, 0xfd, 0x10, 0x33, 0xc7, 0xa7, 0x60, 0x80,
+ 0xa3, 0x7d, 0x2f, 0x0b, 0xe7, 0x52, 0x6a, 0x47, 0x5e, 0x82, 0x33, 0x2a, 0xc3, 0x11, 0xde, 0xeb,
+ 0xcd, 0x84, 0xf7, 0x7a, 0x1b, 0x09, 0x1a, 0x0e, 0x71, 0x93, 0x37, 0x00, 0x74, 0xc3, 0xa0, 0x9e,
+ 0xb7, 0xee, 0x34, 0x7d, 0xa7, 0xef, 0x45, 0xbe, 0xa9, 0x5c, 0x0a, 0x4a, 0x1f, 0x0d, 0x6a, 0x5f,
+ 0x4c, 0x4b, 0x55, 0x25, 0xbe, 0x3e, 0x14, 0xc0, 0x08, 0x24, 0x79, 0x1d, 0x40, 0x5e, 0x34, 0x09,
+ 0x0e, 0x5b, 0x3e, 0x26, 0x92, 0x3e, 0xef, 0x5f, 0x82, 0x98, 0xff, 0x7a, 0x5f, 0xb7, 0x99, 0xc9,
+ 0xf6, 0xe4, 0xb9, 0xea, 0x7b, 0x01, 0x0a, 0x46, 0x10, 0xb5, 0xbf, 0xce, 0x42, 0xc9, 0x77, 0x46,
+ 0x3f, 0x81, 0x5c, 0x49, 0x3b, 0x96, 0x2b, 0x19, 0xff, 0x66, 0xa1, 0x5f, 0xe5, 0x91, 0xd9, 0x11,
+ 0x27, 0x91, 0x1d, 0xb9, 0x31, 0xb9, 0xaa, 0x83, 0xf3, 0x21, 0x3f, 0xc8, 0xc2, 0x29, 0x9f, 0x55,
+ 0x9d, 0xe3, 0xfe, 0x32, 0xcc, 0xb8, 0x54, 0x6f, 0xd6, 0x75, 0x66, 0xec, 0x88, 0xee, 0x93, 0xa7,
+ 0xb8, 0xcf, 0xee, 0x0f, 0x6a, 0x33, 0x18, 0x25, 0x60, 0x9c, 0x2f, 0xed, 0x00, 0x78, 0x76, 0xc2,
+ 0x03, 0xe0, 0xb9, 0xa3, 0x1c, 0x00, 0x27, 0x3a, 0x54, 0x78, 0x8d, 0x36, 0xcd, 0x2e, 0x75, 0xfa,
+ 0xfe, 0xaf, 0x0c, 0x8e, 0x7a, 0x78, 0x58, 0xac, 0xee, 0x18, 0xc2, 0x60, 0x14, 0x53, 0xfb, 0x87,
+ 0x0c, 0x4c, 0x87, 0xed, 0x75, 0xe2, 0x19, 0xa3, 0x56, 0x3c, 0x63, 0xb4, 0x34, 0xf1, 0x70, 0x18,
+ 0x91, 0x23, 0xfa, 0xbd, 0x62, 0xf8, 0x59, 0x22, 0x2b, 0xb4, 0x0d, 0xb3, 0x66, 0x6a, 0xa2, 0x24,
+ 0x62, 0x6d, 0x82, 0x43, 0x70, 0x37, 0x47, 0x72, 0xe2, 0x01, 0x28, 0xa4, 0x0f, 0xa5, 0x5d, 0xea,
+ 0x32, 0xd3, 0xa0, 0xfe, 0xf7, 0xdd, 0x98, 0xd8, 0x3b, 0x92, 0x07, 0x00, 0xc2, 0x36, 0xbd, 0xa7,
+ 0x14, 0x60, 0xa0, 0x8a, 0x6c, 0x43, 0x81, 0x36, 0xdb, 0xd4, 0x3f, 0x3f, 0xff, 0xd5, 0x89, 0xae,
+ 0x64, 0x84, 0xed, 0xc9, 0xdf, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x6f, 0xdf, 0xd5, 0x38,
+ 0x1c, 0xdf, 0xd7, 0x09, 0x02, 0x01, 0xe1, 0x21, 0xd4, 0xa0, 0x08, 0x43, 0x3d, 0xa4, 0x13, 0x5c,
+ 0x36, 0x29, 0x1c, 0x93, 0xf1, 0x38, 0xe0, 0xc2, 0x89, 0x07, 0xe5, 0x07, 0x3a, 0xa3, 0x6e, 0x57,
+ 0x77, 0x3b, 0xca, 0xf1, 0x1f, 0xff, 0x0b, 0xef, 0xfb, 0x48, 0xe1, 0x17, 0x06, 0x45, 0x18, 0xea,
+ 0x21, 0x0e, 0x94, 0x99, 0xf2, 0x64, 0xfd, 0xfb, 0x8a, 0xe3, 0x2b, 0xf5, 0x7d, 0x62, 0x4f, 0x06,
+ 0xb6, 0x83, 0x57, 0x0c, 0x75, 0x68, 0x8f, 0x72, 0xa1, 0x79, 0xfc, 0xa4, 0x53, 0x84, 0x2f, 0xc4,
+ 0x53, 0x84, 0x73, 0xc9, 0x14, 0x61, 0x22, 0x1a, 0x73, 0xf4, 0x24, 0xa1, 0x0e, 0x15, 0x4b, 0xf7,
+ 0xd8, 0x56, 0xaf, 0xa9, 0x33, 0x15, 0x5f, 0xae, 0x2c, 0xfe, 0xff, 0xc3, 0x59, 0x2f, 0x6e, 0x0f,
+ 0xc3, 0xa0, 0xcb, 0x5a, 0x08, 0x83, 0x51, 0x4c, 0x72, 0x15, 0x2a, 0xbb, 0x62, 0x46, 0xca, 0xdb,
+ 0x14, 0x05, 0x61, 0xce, 0x85, 0x85, 0xbd, 0x17, 0x16, 0x63, 0x94, 0x87, 0x8b, 0x48, 0x4f, 0x40,
+ 0x8a, 0x14, 0x43, 0x91, 0x46, 0x58, 0x8c, 0x51, 0x1e, 0x91, 0xab, 0x30, 0xed, 0x8e, 0x14, 0x98,
+ 0x12, 0x02, 0x32, 0x57, 0xe1, 0x17, 0x62, 0x48, 0x27, 0x57, 0xa0, 0xd4, 0x6f, 0xb6, 0x24, 0x6f,
+ 0x49, 0xf0, 0x0a, 0xff, 0x6b, 0x6b, 0x65, 0x55, 0xdd, 0xee, 0xf0, 0xa9, 0xda, 0x7f, 0x66, 0x80,
+ 0x0c, 0x27, 0xb5, 0xc9, 0x0e, 0x14, 0x6d, 0x11, 0x55, 0x99, 0xf8, 0xbe, 0x75, 0x24, 0x38, 0x23,
+ 0xe7, 0x98, 0x2a, 0x50, 0xf8, 0xc4, 0x86, 0x12, 0x7d, 0xc8, 0xa8, 0x6b, 0xeb, 0x96, 0x72, 0x3d,
+ 0x8e, 0xe7, 0x6e, 0xb7, 0x74, 0x38, 0x15, 0x32, 0x06, 0x3a, 0xb4, 0x1f, 0x67, 0xa1, 0x12, 0xe1,
+ 0x7b, 0xdc, 0x66, 0x45, 0x9c, 0x19, 0x95, 0xc1, 0x8c, 0x2d, 0xd7, 0x52, 0xc3, 0x34, 0x72, 0x66,
+ 0x54, 0x91, 0x70, 0x0d, 0xa3, 0x7c, 0x64, 0x11, 0xa0, 0xab, 0x7b, 0x8c, 0xba, 0x62, 0x29, 0x49,
+ 0x9c, 0xd4, 0x5c, 0x0f, 0x28, 0x18, 0xe1, 0x22, 0x97, 0xd5, 0xcd, 0xff, 0x7c, 0xfc, 0xd2, 0xd4,
+ 0x88, 0x6b, 0xfd, 0x85, 0x63, 0xb8, 0xd6, 0x4f, 0xda, 0x70, 0xc6, 0xaf, 0xb5, 0x4f, 0x55, 0x76,
+ 0xee, 0x90, 0xc0, 0xd2, 0x19, 0x4f, 0x40, 0xe0, 0x10, 0xa8, 0xf6, 0xc3, 0x0c, 0xcc, 0xc4, 0xb6,
+ 0xd2, 0x7c, 0x6b, 0x17, 0x1e, 0xc9, 0x88, 0x6c, 0xed, 0x62, 0x27, 0x29, 0x9e, 0x87, 0xa2, 0x6c,
+ 0x20, 0xd5, 0xf0, 0x81, 0x19, 0x91, 0x4d, 0x88, 0x8a, 0xca, 0x0d, 0x82, 0x0a, 0xd6, 0x25, 0x0d,
+ 0x82, 0x8a, 0xe6, 0xa1, 0x4f, 0x27, 0x5f, 0x80, 0x92, 0x5f, 0x3b, 0xd5, 0xd2, 0xe1, 0x4f, 0x1f,
+ 0x54, 0x39, 0x06, 0x1c, 0xda, 0xb7, 0x0b, 0x20, 0xff, 0x58, 0xc1, 0xe5, 0x9a, 0xa6, 0x27, 0xb3,
+ 0x54, 0x19, 0x91, 0xa5, 0x0a, 0xe4, 0x56, 0x54, 0x39, 0x06, 0x1c, 0xe4, 0x22, 0xe4, 0xba, 0xa6,
+ 0xad, 0xc2, 0x8a, 0x62, 0x57, 0xb9, 0x6e, 0xda, 0xc8, 0xcb, 0x04, 0x49, 0x7f, 0xa8, 0x12, 0x2d,
+ 0x92, 0xa4, 0x3f, 0x44, 0x5e, 0xc6, 0x9d, 0x4b, 0xcb, 0x71, 0x3a, 0xdb, 0xba, 0xd1, 0xf1, 0x43,
+ 0xdf, 0x79, 0x31, 0x7b, 0x85, 0x73, 0xb9, 0x16, 0x27, 0x61, 0x92, 0x97, 0x8b, 0x1b, 0x8e, 0x63,
+ 0x35, 0x9d, 0x07, 0xb6, 0x2f, 0x5e, 0x08, 0xc5, 0x97, 0xe3, 0x24, 0x4c, 0xf2, 0x92, 0x2d, 0x78,
+ 0xe6, 0x6d, 0xea, 0x3a, 0xaa, 0xc5, 0x1a, 0x16, 0xa5, 0x3d, 0x1f, 0x46, 0x1a, 0x28, 0x91, 0x15,
+ 0x7a, 0x35, 0x9d, 0x05, 0x47, 0xc9, 0x8a, 0x64, 0x93, 0xee, 0xb6, 0x29, 0xdb, 0x70, 0x1d, 0xbe,
+ 0x77, 0x32, 0xed, 0xb6, 0x0f, 0x3b, 0x15, 0xc2, 0x6e, 0xa6, 0xb3, 0xe0, 0x28, 0x59, 0xb2, 0x0e,
+ 0x67, 0x25, 0x29, 0xe2, 0x33, 0x2b, 0x5b, 0x57, 0xdb, 0x1f, 0xd4, 0x3e, 0xb3, 0x42, 0x7b, 0x2e,
+ 0x35, 0xb8, 0x81, 0xde, 0x4c, 0xb2, 0xe1, 0xb0, 0xa4, 0xf8, 0x8f, 0x94, 0x0a, 0xf7, 0x6e, 0x50,
+ 0x57, 0x74, 0xb9, 0x88, 0x1d, 0x29, 0xc7, 0x1c, 0x13, 0x34, 0x1c, 0xe2, 0x26, 0xaf, 0x40, 0x35,
+ 0x0a, 0xbb, 0xb4, 0xab, 0x9b, 0x96, 0xbe, 0x6d, 0x5a, 0x26, 0xdb, 0x13, 0xb9, 0xe2, 0x19, 0x19,
+ 0x8c, 0xdc, 0x1c, 0xc1, 0x83, 0x23, 0xa5, 0xb5, 0xdf, 0xcf, 0x81, 0xf8, 0xe5, 0x10, 0xb9, 0x0f,
+ 0x39, 0xcb, 0x69, 0x2b, 0x93, 0x3c, 0x7e, 0xa4, 0x63, 0xcd, 0x69, 0xcb, 0x81, 0xb7, 0xe6, 0xb4,
+ 0x91, 0x23, 0x12, 0x03, 0x0a, 0x1d, 0xbd, 0xd5, 0xd1, 0x95, 0x05, 0x1e, 0xdf, 0xdf, 0x08, 0x12,
+ 0x79, 0xea, 0x86, 0x28, 0x7f, 0x45, 0x89, 0xcd, 0x1d, 0x9b, 0x6d, 0xff, 0x1f, 0x22, 0x6a, 0xeb,
+ 0x37, 0x41, 0x6c, 0xcc, 0x47, 0x92, 0xab, 0x60, 0xf0, 0x8a, 0xa1, 0x0e, 0x62, 0x40, 0xb1, 0xdf,
+ 0x14, 0xbf, 0x7e, 0xca, 0x4f, 0xe8, 0xc5, 0x6c, 0xad, 0x88, 0x6f, 0x12, 0xeb, 0x97, 0x7c, 0x46,
+ 0x05, 0xad, 0xfd, 0x79, 0x06, 0x66, 0x1a, 0x96, 0xd9, 0x34, 0xed, 0xf6, 0xc9, 0xdd, 0xc9, 0x25,
+ 0x77, 0xa1, 0xe0, 0x59, 0x66, 0x93, 0x8e, 0x79, 0x59, 0x54, 0x74, 0x06, 0xaf, 0x25, 0x45, 0x89,
+ 0xa3, 0xfd, 0x49, 0x1e, 0xd4, 0x7f, 0xb2, 0x48, 0x1f, 0xca, 0x6d, 0xff, 0xe6, 0xaa, 0xaa, 0xf2,
+ 0xcb, 0x13, 0xdc, 0x70, 0x88, 0xdd, 0x81, 0x95, 0xbd, 0x13, 0x14, 0x62, 0xa8, 0x89, 0xd0, 0xf8,
+ 0x98, 0x5b, 0x99, 0x70, 0xcc, 0x49, 0x75, 0xc3, 0xa3, 0x4e, 0x87, 0xfc, 0x0e, 0x63, 0xbd, 0x89,
+ 0x0f, 0xe2, 0x86, 0x67, 0x6c, 0x65, 0x18, 0x8f, 0xbf, 0xa3, 0x80, 0xe6, 0x2a, 0x6c, 0xfd, 0x18,
+ 0xae, 0xbf, 0x87, 0x21, 0x54, 0x15, 0x61, 0xd5, 0x99, 0x87, 0x02, 0x9a, 0xfc, 0x1a, 0x54, 0x98,
+ 0xab, 0xdb, 0x5e, 0xcb, 0x71, 0xbb, 0xd4, 0x55, 0x8b, 0xff, 0xea, 0x04, 0xe3, 0x79, 0x33, 0x44,
+ 0x93, 0x51, 0x8f, 0x58, 0x11, 0x46, 0xb5, 0x69, 0x5d, 0x50, 0x6e, 0x3b, 0x31, 0x62, 0xbf, 0x19,
+ 0x90, 0x99, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e, 0x5d, 0xea, 0xff, 0x04,
+ 0xb4, 0x7f, 0xca, 0x42, 0x6e, 0x73, 0xad, 0x21, 0xaf, 0x8a, 0x88, 0xbf, 0x6e, 0xd0, 0x46, 0xc7,
+ 0xec, 0xdd, 0xa3, 0xae, 0xd9, 0xda, 0x53, 0x6b, 0x6f, 0xe4, 0xaa, 0x48, 0x92, 0x03, 0x53, 0xa4,
+ 0xc8, 0x6b, 0x30, 0x6d, 0xe8, 0xcb, 0xd4, 0x65, 0xd2, 0x85, 0x39, 0x5a, 0xd4, 0x5c, 0x9c, 0x60,
+ 0x58, 0x5e, 0x0a, 0xc5, 0x31, 0x06, 0x46, 0xb6, 0x00, 0x8c, 0x10, 0xfa, 0x48, 0x91, 0x74, 0xf9,
+ 0x5f, 0x85, 0x10, 0x38, 0x02, 0x44, 0x10, 0xca, 0x1d, 0xce, 0x2a, 0x50, 0xf3, 0x47, 0x41, 0x15,
+ 0x93, 0xee, 0xb6, 0x2f, 0x8b, 0x21, 0x8c, 0xf6, 0xef, 0x19, 0x08, 0x37, 0x81, 0xc4, 0x83, 0x62,
+ 0x53, 0xdc, 0xda, 0x56, 0xd3, 0x7e, 0xfc, 0xcd, 0x74, 0xfc, 0x6f, 0x26, 0x75, 0xb2, 0x3f, 0xa8,
+ 0x25, 0xfe, 0x70, 0x82, 0x4a, 0x15, 0x69, 0x43, 0xee, 0x4d, 0x67, 0x7b, 0xe2, 0x59, 0x1f, 0x39,
+ 0xff, 0x23, 0x77, 0x4e, 0x91, 0x02, 0xe4, 0x1a, 0xb4, 0x6f, 0x67, 0xa1, 0x12, 0x19, 0xd3, 0x13,
+ 0xff, 0x94, 0xe0, 0x61, 0xe2, 0xa7, 0x04, 0x1b, 0xe3, 0xef, 0xca, 0xc3, 0x5a, 0x9d, 0xf4, 0x7f,
+ 0x09, 0xfe, 0x26, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80, 0x26, 0x4e, 0x4c,
+ 0x85, 0x3f, 0x4c, 0x13, 0x23, 0x2d, 0x78, 0xc5, 0x50, 0x07, 0xd9, 0x81, 0xa9, 0xed, 0xbe, 0x69,
+ 0x31, 0xd3, 0x9e, 0xf8, 0xd4, 0x99, 0xff, 0x0f, 0x07, 0x75, 0x5c, 0x46, 0xa2, 0xa2, 0x0f, 0x4f,
+ 0xda, 0x30, 0xd5, 0x96, 0xd7, 0x40, 0xd4, 0xdc, 0x7b, 0x69, 0xfc, 0xd5, 0x4b, 0xe2, 0x48, 0x45,
+ 0xea, 0x05, 0x7d, 0x74, 0xed, 0x9b, 0xa0, 0x16, 0x7f, 0xe2, 0x9d, 0x4c, 0x6b, 0x06, 0x81, 0xa1,
+ 0xb4, 0x16, 0xd5, 0xfe, 0x23, 0x03, 0x71, 0x2b, 0xfd, 0xc9, 0x77, 0x6a, 0x27, 0xd9, 0xa9, 0x2b,
+ 0xc7, 0x31, 0x07, 0xd2, 0xfb, 0x55, 0xfb, 0xab, 0x2c, 0x14, 0xd5, 0x9f, 0x44, 0x4f, 0x3e, 0xfb,
+ 0x41, 0x63, 0xd9, 0x8f, 0xe5, 0x09, 0xff, 0xab, 0x38, 0x32, 0xf7, 0xd1, 0x4d, 0xe4, 0x3e, 0x26,
+ 0xfd, 0x81, 0xe3, 0x63, 0x32, 0x1f, 0x7f, 0x97, 0x81, 0x53, 0x92, 0xf1, 0xa6, 0xed, 0x31, 0xdd,
+ 0x36, 0x84, 0x53, 0x2c, 0x23, 0x51, 0x13, 0x87, 0xf6, 0x54, 0x18, 0x5a, 0xb8, 0xab, 0xf2, 0x19,
+ 0x15, 0x34, 0xdf, 0x2c, 0xef, 0x38, 0x1e, 0x13, 0xe6, 0x36, 0x1b, 0xdf, 0x64, 0xbf, 0xac, 0xca,
+ 0x31, 0xe0, 0x48, 0xee, 0xde, 0x0b, 0xa3, 0x77, 0xef, 0xda, 0x9f, 0x66, 0x60, 0x3a, 0xfa, 0xeb,
+ 0xca, 0xf1, 0x13, 0x39, 0x89, 0x3c, 0x4a, 0xf6, 0x04, 0xf2, 0x28, 0x1f, 0x66, 0x00, 0xfc, 0xca,
+ 0x9e, 0x78, 0x16, 0xa5, 0x19, 0xcf, 0xa2, 0x4c, 0xdc, 0xad, 0xe9, 0x39, 0x94, 0x1f, 0x14, 0xfc,
+ 0x4f, 0x12, 0x19, 0x94, 0x77, 0x33, 0x70, 0x4a, 0x8f, 0x65, 0x25, 0x26, 0xf6, 0x24, 0x12, 0x49,
+ 0x8e, 0xe0, 0x57, 0x9f, 0xf1, 0x72, 0x4c, 0xa8, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x42, 0xc5, 0x77,
+ 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xd0, 0x30, 0xc6, 0xf9, 0x98, 0x2c, 0x50, 0xee, 0x58,
+ 0xb2, 0x40, 0xd1, 0xa3, 0x66, 0xf9, 0x03, 0x8f, 0x9a, 0xd9, 0x50, 0x6e, 0xb9, 0x4e, 0x57, 0x24,
+ 0x5a, 0xd4, 0x8f, 0x15, 0x27, 0x4c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1, 0x0a, 0xbe,
+ 0x4c, 0x33, 0x47, 0x6a, 0x2b, 0x1e, 0x87, 0xb6, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4, 0xe1, 0xe3,
+ 0xc9, 0x94, 0xa9, 0x4f, 0x26, 0x99, 0xa2, 0xfd, 0x63, 0xd6, 0xb7, 0x17, 0x8d, 0xc4, 0x9d, 0xa4,
+ 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdd, 0xf0, 0x3c, 0x14, 0x5d, 0xaa, 0x7b, 0x8e,
+ 0xad, 0xee, 0xa9, 0x07, 0xd6, 0x16, 0x45, 0x29, 0x2a, 0x6a, 0x34, 0x2d, 0x91, 0x7d, 0x4c, 0x5a,
+ 0xe2, 0x0b, 0x91, 0x01, 0x21, 0xf3, 0xbf, 0xc1, 0xdc, 0x4e, 0x19, 0x14, 0x22, 0x66, 0xa9, 0xfe,
+ 0xd7, 0x5f, 0x48, 0xc6, 0x2c, 0xd5, 0xbf, 0xf4, 0x03, 0x0e, 0xd2, 0x84, 0x69, 0x4b, 0xf7, 0x98,
+ 0x88, 0x4a, 0x35, 0x97, 0xd8, 0x18, 0x39, 0x8f, 0x60, 0xda, 0xac, 0x45, 0x70, 0x30, 0x86, 0xaa,
+ 0xfd, 0x6e, 0x06, 0xc2, 0x26, 0x3f, 0x62, 0x74, 0xf4, 0x15, 0x28, 0x75, 0xf5, 0x87, 0x2b, 0xd4,
+ 0xd2, 0xf7, 0x26, 0xf9, 0xfb, 0xd5, 0xba, 0xc2, 0xc0, 0x00, 0x4d, 0x1b, 0x64, 0x40, 0xdd, 0xd8,
+ 0x25, 0x14, 0x0a, 0x2d, 0xf3, 0xa1, 0xaa, 0xcf, 0x24, 0x9e, 0x4a, 0xe4, 0x7f, 0x6b, 0x32, 0xbe,
+ 0x20, 0x0a, 0x50, 0xa2, 0x93, 0x2e, 0x4c, 0x79, 0x32, 0xfc, 0xa3, 0x3e, 0x65, 0xfc, 0x5d, 0x79,
+ 0x2c, 0x8c, 0xa4, 0xae, 0xfb, 0xca, 0x22, 0xf4, 0x75, 0xd4, 0xe7, 0x3f, 0xf8, 0x78, 0xee, 0xa9,
+ 0x0f, 0x3f, 0x9e, 0x7b, 0xea, 0xa3, 0x8f, 0xe7, 0x9e, 0xfa, 0xd6, 0xfe, 0x5c, 0xe6, 0x83, 0xfd,
+ 0xb9, 0xcc, 0x87, 0xfb, 0x73, 0x99, 0x8f, 0xf6, 0xe7, 0x32, 0xff, 0xba, 0x3f, 0x97, 0xf9, 0x9d,
+ 0x7f, 0x9b, 0x7b, 0xea, 0xd5, 0x92, 0x8f, 0xf9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x1a,
+ 0xd1, 0x0d, 0x1f, 0x64, 0x00, 0x00,
}
func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) {
@@ -11579,7 +11580,7 @@ func (m *Edge) Unmarshal(dAtA []byte) error {
if postIndex > l {
return io.ErrUnexpectedEOF
}
- s := string(dAtA[iNdEx:postIndex])
+ s := BufferFullWritingStrategy(dAtA[iNdEx:postIndex])
m.OnFull = &s
iNdEx = postIndex
default:
diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
index 002170ce97..6616007872 100644
--- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
@@ -410,7 +410,7 @@ func (in *Edge) DeepCopyInto(out *Edge) {
}
if in.OnFull != nil {
in, out := &in.OnFull, &out.OnFull
- *out = new(string)
+ *out = new(BufferFullWritingStrategy)
**out = **in
}
return
diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go
index 8cf629445d..582574a0a5 100644
--- a/pkg/forward/forward.go
+++ b/pkg/forward/forward.go
@@ -21,6 +21,7 @@ package forward
import (
"context"
+ "errors"
"fmt"
"math"
"sync"
@@ -490,7 +491,7 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is
for idx, msg := range messages {
if err := errs[idx]; err != nil {
// ATM there are no user defined errors during write, all are InternalErrors.
- if _, ok := err.(isb.NoRetryableBufferWriteErr); ok {
+ if ok := errors.As(err, &isb.NoRetryableBufferWriteErr{}); ok {
// If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message.
dropBytes += float64(len(msg.Payload))
} else {
diff --git a/pkg/forward/forward_test.go b/pkg/forward/forward_test.go
index 2d980332ce..bc06e3b54b 100644
--- a/pkg/forward/forward_test.go
+++ b/pkg/forward/forward_test.go
@@ -622,8 +622,8 @@ func TestSourceInterStepDataForward(t *testing.T) {
<-stopped
}
-// TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages
-func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing.T) {
+// TestWriteToBufferError_BufferFullWritingStrategyIsRetryUntilSuccess explicitly tests the case of retrying failed messages
+func TestWriteToBufferError_BufferFullWritingStrategyIsRetryUntilSuccess(t *testing.T) {
fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
to1 := simplebuffer.NewInMemoryBuffer("to1", 10)
toSteps := map[string]isb.BufferWriter{
@@ -673,10 +673,10 @@ func TestWriteToBufferError_OnFullWritingStrategyIsRetryUntilSuccess(t *testing.
<-stopped
}
-// TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full
-func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) {
+// TestWriteToBufferError_BufferFullWritingStrategyIsDiscardLatest explicitly tests the case of dropping messages when buffer is full
+func TestWriteToBufferError_BufferFullWritingStrategyIsDiscardLatest(t *testing.T) {
fromStep := simplebuffer.NewInMemoryBuffer("from", 25)
- to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithOnFullWritingStrategy(dfv1.DiscardLatest))
+ to1 := simplebuffer.NewInMemoryBuffer("to1", 10, simplebuffer.WithBufferFullWritingStrategy(dfv1.DiscardLatest))
toSteps := map[string]isb.BufferWriter{
"to1": to1,
}
@@ -702,7 +702,7 @@ func TestWriteToBufferError_OnFullWritingStrategyIsDiscardLatest(t *testing.T) {
messageToStep["to1"] = make([]isb.Message, 0)
messageToStep["to1"] = append(messageToStep["to1"], writeMessages[0:11]...)
_, err = f.writeToBuffers(ctx, messageToStep)
- // although we are writing 11 messages to a buffer of size 10, since we specify actionOnFull as DiscardLatest,
+ // although we are writing 11 messages to a buffer of size 10, since we specify BufferFullWritingStrategy as DiscardLatest,
// the writeToBuffers() call should return no error.
assert.Nil(t, err)
// stop will cancel the contexts and therefore the forwarder stops without waiting
diff --git a/pkg/isb/stores/jetstream/options.go b/pkg/isb/stores/jetstream/options.go
index 49ec9da565..a0c5f84447 100644
--- a/pkg/isb/stores/jetstream/options.go
+++ b/pkg/isb/stores/jetstream/options.go
@@ -32,17 +32,17 @@ type writeOptions struct {
refreshInterval time.Duration
// useWriteInfoAsRate indicates whether to check the write sequence for rate calculation
useWriteInfoAsRate bool
- // onFullWritingStrategy is the writing strategy when buffer is full
- onFullWritingStrategy dfv1.OnFullWritingStrategy
+ // bufferFullWritingStrategy is the writing strategy when buffer is full
+ bufferFullWritingStrategy dfv1.BufferFullWritingStrategy
}
func defaultWriteOptions() *writeOptions {
return &writeOptions{
- maxLength: dfv1.DefaultBufferLength,
- bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
- refreshInterval: 1 * time.Second,
- useWriteInfoAsRate: false,
- onFullWritingStrategy: dfv1.RetryUntilSuccess,
+ maxLength: dfv1.DefaultBufferLength,
+ bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
+ refreshInterval: 1 * time.Second,
+ useWriteInfoAsRate: false,
+ bufferFullWritingStrategy: dfv1.RetryUntilSuccess,
}
}
@@ -80,10 +80,10 @@ func WithUsingWriteInfoAsRate(yes bool) WriteOption {
}
}
-// WithOnFullWritingStrategy sets the writing strategy when buffer is full
-func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) WriteOption {
+// WithBufferFullWritingStrategy sets the writing strategy when buffer is full
+func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) WriteOption {
return func(o *writeOptions) error {
- o.onFullWritingStrategy = s
+ o.bufferFullWritingStrategy = s
return nil
}
}
diff --git a/pkg/isb/stores/jetstream/writer.go b/pkg/isb/stores/jetstream/writer.go
index d6565fce43..4406b60da2 100644
--- a/pkg/isb/stores/jetstream/writer.go
+++ b/pkg/isb/stores/jetstream/writer.go
@@ -199,7 +199,7 @@ func (jw *jetStreamWriter) Write(ctx context.Context, messages []isb.Message) ([
jw.log.Debugw("Is full")
isbFull.With(map[string]string{"buffer": jw.GetName()}).Inc()
// when buffer is full, we need to decide whether to discard the message or not.
- switch jw.opts.onFullWritingStrategy {
+ switch jw.opts.bufferFullWritingStrategy {
case v1alpha1.DiscardLatest:
// user explicitly wants to discard the message when buffer if full.
// return no retryable error as a callback to let caller know that the message is discarded.
diff --git a/pkg/isb/stores/jetstream/writer_test.go b/pkg/isb/stores/jetstream/writer_test.go
index 607103928d..04c3a47708 100644
--- a/pkg/isb/stores/jetstream/writer_test.go
+++ b/pkg/isb/stores/jetstream/writer_test.go
@@ -230,7 +230,7 @@ func TestJetStreamBufferWriterBufferFull_DiscardLatest(t *testing.T) {
addStream(t, js, streamName)
defer deleteStream(js, streamName)
- bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithOnFullWritingStrategy(dfv1.DiscardLatest))
+ bw, err := NewJetStreamBufferWriter(ctx, defaultJetStreamClient, streamName, streamName, streamName, WithMaxLength(10), WithBufferUsageLimit(0.2), WithBufferFullWritingStrategy(dfv1.DiscardLatest))
assert.NoError(t, err)
jw, _ := bw.(*jetStreamWriter)
timeout := time.After(10 * time.Second)
diff --git a/pkg/isb/stores/redis/options.go b/pkg/isb/stores/redis/options.go
index 37fc071931..ecc988eb2b 100644
--- a/pkg/isb/stores/redis/options.go
+++ b/pkg/isb/stores/redis/options.go
@@ -40,8 +40,8 @@ type options struct {
bufferUsageLimit float64
// refreshBufferWriteInfo is used to determine if we refresh buffer write info
refreshBufferWriteInfo bool
- // onFullWritingStrategy is the writing strategy when buffer is full
- onFullWritingStrategy dfv1.OnFullWritingStrategy
+ // bufferFullWritingStrategy is the writing strategy when buffer is full
+ bufferFullWritingStrategy dfv1.BufferFullWritingStrategy
}
// Option to apply different options
@@ -145,14 +145,14 @@ func WithRefreshBufferWriteInfo(r bool) Option {
return refreshBufferWriteInfo(r)
}
-// WithOnFullWritingStrategy option
-type onFullWritingStrategy dfv1.OnFullWritingStrategy
+// WithBufferFullWritingStrategy option
+type bufferFullWritingStrategy dfv1.BufferFullWritingStrategy
-func (s onFullWritingStrategy) apply(o *options) {
- o.onFullWritingStrategy = dfv1.OnFullWritingStrategy(s)
+func (s bufferFullWritingStrategy) apply(o *options) {
+ o.bufferFullWritingStrategy = dfv1.BufferFullWritingStrategy(s)
}
-// WithOnFullWritingStrategy sets the OnFullWritingStrategy
-func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option {
- return onFullWritingStrategy(s)
+// WithBufferFullWritingStrategy sets the BufferFullWritingStrategy
+func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) Option {
+ return bufferFullWritingStrategy(s)
}
diff --git a/pkg/isb/stores/redis/write.go b/pkg/isb/stores/redis/write.go
index a8708ce703..297bd76aa5 100644
--- a/pkg/isb/stores/redis/write.go
+++ b/pkg/isb/stores/redis/write.go
@@ -67,13 +67,13 @@ var _ isb.BufferWriter = (*BufferWrite)(nil)
// NewBufferWrite returns a new redis queue writer.
func NewBufferWrite(ctx context.Context, client *redisclient.RedisClient, name string, group string, opts ...Option) isb.BufferWriter {
options := &options{
- pipelining: true,
- infoRefreshInterval: time.Second,
- lagDuration: time.Duration(0),
- maxLength: dfv1.DefaultBufferLength,
- bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
- refreshBufferWriteInfo: true,
- onFullWritingStrategy: dfv1.RetryUntilSuccess,
+ pipelining: true,
+ infoRefreshInterval: time.Second,
+ lagDuration: time.Duration(0),
+ maxLength: dfv1.DefaultBufferLength,
+ bufferUsageLimit: dfv1.DefaultBufferUsageLimit,
+ refreshBufferWriteInfo: true,
+ bufferFullWritingStrategy: dfv1.RetryUntilSuccess,
}
for _, o := range opts {
@@ -161,7 +161,7 @@ func (bw *BufferWrite) Write(_ context.Context, messages []isb.Message) ([]isb.O
isbIsFull.With(labels).Inc()
// when buffer is full, we need to decide whether to discard the message or not.
- switch bw.onFullWritingStrategy {
+ switch bw.bufferFullWritingStrategy {
case dfv1.DiscardLatest:
// user explicitly wants to discard the message when buffer if full.
// return no retryable error as a callback to let caller know that the message is discarded.
diff --git a/pkg/isb/stores/redis/write_test.go b/pkg/isb/stores/redis/write_test.go
index 2b071c4623..9935dffabb 100644
--- a/pkg/isb/stores/redis/write_test.go
+++ b/pkg/isb/stores/redis/write_test.go
@@ -177,14 +177,14 @@ func TestRedisQWrite_WithInfoRefreshInterval(t *testing.T) {
}
}
-func TestRedisQWrite_WithInfoRefreshInterval_DiscardMessageOnFull(t *testing.T) {
+func TestRedisQWrite_WithInfoRefreshInterval_WithBufferFullWritingStrategyIsDiscardLatest(t *testing.T) {
client := redisclient.NewRedisClient(redisOptions)
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
defer cancel()
stream := "withInfoRefreshInterval"
count := int64(10)
group := "withInfoRefreshInterval-group"
- rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithOnFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite)
+ rqw, _ := NewBufferWrite(ctx, client, stream, group, WithInfoRefreshInterval(2*time.Millisecond), WithLagDuration(2*time.Millisecond), WithMaxLength(10), WithBufferFullWritingStrategy(dfv1.DiscardLatest)).(*BufferWrite)
err := client.CreateStreamGroup(ctx, rqw.GetStreamName(), group, redisclient.ReadFromEarliest)
if err != nil {
t.Fatalf("error creating consumer group: %s", err)
diff --git a/pkg/isb/stores/simplebuffer/buffer.go b/pkg/isb/stores/simplebuffer/buffer.go
index 66acf4226d..48913e88a8 100644
--- a/pkg/isb/stores/simplebuffer/buffer.go
+++ b/pkg/isb/stores/simplebuffer/buffer.go
@@ -59,8 +59,8 @@ type elem struct {
func NewInMemoryBuffer(name string, size int64, opts ...Option) *InMemoryBuffer {
bufferOptions := &options{
- readTimeOut: time.Second, // default read time out
- onFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default on full writing strategy
+ readTimeOut: time.Second, // default read time out
+ bufferFullWritingStrategy: v1alpha1.RetryUntilSuccess, // default buffer full writing strategy
}
for _, o := range opts {
@@ -147,7 +147,7 @@ func (b *InMemoryBuffer) Write(_ context.Context, messages []isb.Message) ([]isb
// access buffer via lock
b.rwlock.Unlock()
} else {
- switch b.options.onFullWritingStrategy {
+ switch b.options.bufferFullWritingStrategy {
case v1alpha1.DiscardLatest:
errs[idx] = isb.NoRetryableBufferWriteErr{Name: b.name, Message: "Buffer full!"}
default:
diff --git a/pkg/isb/stores/simplebuffer/buffer_test.go b/pkg/isb/stores/simplebuffer/buffer_test.go
index be851dad55..4b59126453 100644
--- a/pkg/isb/stores/simplebuffer/buffer_test.go
+++ b/pkg/isb/stores/simplebuffer/buffer_test.go
@@ -80,9 +80,9 @@ func TestNewSimpleBuffer(t *testing.T) {
assert.Equal(t, true, sb.IsFull())
}
-func TestNewSimpleBuffer_DiscardOnFull(t *testing.T) {
+func TestNewSimpleBuffer_BufferFullWritingStrategyIsDiscard(t *testing.T) {
count := int64(3)
- sb := NewInMemoryBuffer("test", 2, WithOnFullWritingStrategy(v1alpha1.DiscardLatest))
+ sb := NewInMemoryBuffer("test", 2, WithBufferFullWritingStrategy(v1alpha1.DiscardLatest))
ctx := context.Background()
assert.NotEmpty(t, sb.String())
assert.Equal(t, sb.IsEmpty(), true)
diff --git a/pkg/isb/stores/simplebuffer/options.go b/pkg/isb/stores/simplebuffer/options.go
index 3df5cea89f..d88db5f397 100644
--- a/pkg/isb/stores/simplebuffer/options.go
+++ b/pkg/isb/stores/simplebuffer/options.go
@@ -26,8 +26,8 @@ import (
type options struct {
// readTimeOut is the timeout needed for read timeout
readTimeOut time.Duration
- // onFullWritingStrategy is the writing strategy when buffer is full
- onFullWritingStrategy dfv1.OnFullWritingStrategy
+ // bufferFullWritingStrategy is the writing strategy when buffer is full
+ bufferFullWritingStrategy dfv1.BufferFullWritingStrategy
}
type Option func(options *options) error
@@ -40,10 +40,10 @@ func WithReadTimeOut(timeout time.Duration) Option {
}
}
-// WithOnFullWritingStrategy sets the writing strategy when buffer is full
-func WithOnFullWritingStrategy(s dfv1.OnFullWritingStrategy) Option {
+// WithBufferFullWritingStrategy sets the writing strategy when buffer is full
+func WithBufferFullWritingStrategy(s dfv1.BufferFullWritingStrategy) Option {
return func(o *options) error {
- o.onFullWritingStrategy = s
+ o.bufferFullWritingStrategy = s
return nil
}
}
diff --git a/pkg/sources/source.go b/pkg/sources/source.go
index f8d5e6bd94..2df0ea3fe2 100644
--- a/pkg/sources/source.go
+++ b/pkg/sources/source.go
@@ -70,7 +70,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
case dfv1.ISBSvcTypeRedis:
for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges {
writeOpts := []redisisb.Option{
- redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ redisisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()),
}
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength)))
@@ -102,7 +102,7 @@ func (sp *SourceProcessor) Start(ctx context.Context) error {
for _, e := range sp.VertexInstance.Vertex.Spec.ToEdges {
writeOpts := []jetstreamisb.WriteOption{
jetstreamisb.WithUsingWriteInfoAsRate(true),
- jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ jetstreamisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()),
}
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength)))
diff --git a/pkg/udf/common.go b/pkg/udf/common.go
index 1fe89dc8c8..aa7dd89121 100644
--- a/pkg/udf/common.go
+++ b/pkg/udf/common.go
@@ -42,7 +42,7 @@ func buildRedisBufferIO(ctx context.Context, fromBufferName string, vertexInstan
for _, e := range vertexInstance.Vertex.Spec.ToEdges {
writeOpts := []redisisb.Option{
- redisisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ redisisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()),
}
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, redisisb.WithMaxLength(int64(*x.BufferMaxLength)))
@@ -76,7 +76,7 @@ func buildJetStreamBufferIO(ctx context.Context, fromBufferName string, vertexIn
for _, e := range vertexInstance.Vertex.Spec.ToEdges {
writeOpts := []jetstreamisb.WriteOption{
- jetstreamisb.WithOnFullWritingStrategy(e.OnFullWritingStrategy()),
+ jetstreamisb.WithBufferFullWritingStrategy(e.BufferFullWritingStrategy()),
}
if x := e.Limits; x != nil && x.BufferMaxLength != nil {
writeOpts = append(writeOpts, jetstreamisb.WithMaxLength(int64(*x.BufferMaxLength)))
From d576b490e7f9965e6ba933e198aad811a21d47f0 Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Tue, 28 Mar 2023 11:39:37 -0400
Subject: [PATCH 4/6] fix codegen
Signed-off-by: Keran Yang
---
pkg/apis/numaflow/v1alpha1/generated.pb.go | 708 ++++++++++-----------
1 file changed, 354 insertions(+), 354 deletions(-)
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index 213910beeb..e2aeb19d8a 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -2037,365 +2037,365 @@ func init() {
}
var fileDescriptor_9d0d1b17d3865563 = []byte{
- // 5718 bytes of a gzipped FileDescriptorProto
+ // 5719 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x5d, 0x6c, 0x24, 0x57,
0x56, 0x7f, 0xfa, 0xd3, 0xdd, 0xa7, 0xed, 0xf9, 0xb8, 0x93, 0x99, 0xf4, 0x78, 0x27, 0xee, 0xd9,
0x5a, 0x25, 0xff, 0xd9, 0x3f, 0xbb, 0x36, 0x63, 0xb2, 0xec, 0x2c, 0xb0, 0x9b, 0xb8, 0xed, 0xf1,
0x64, 0x66, 0xec, 0x19, 0xef, 0x69, 0x7b, 0x26, 0x9b, 0x40, 0x42, 0xb9, 0xfa, 0x76, 0xbb, 0xd2,
0xd5, 0x55, 0x9d, 0xaa, 0xdb, 0x9e, 0x71, 0x60, 0xc5, 0x6a, 0xf3, 0x90, 0x20, 0x16, 0x2d, 0x12,
- 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0xe1, 0x09,
- 0x05, 0x1e, 0x20, 0x0f, 0x48, 0x04, 0x81, 0x5a, 0xc4, 0x3c, 0xf1, 0x00, 0x5a, 0xb4, 0x2f, 0xab,
- 0x11, 0x12, 0xe8, 0x7e, 0xd4, 0x67, 0x57, 0x7b, 0xec, 0x6e, 0x3b, 0x3b, 0x11, 0x6f, 0x55, 0xf7,
- 0x9c, 0xf3, 0x3b, 0xb7, 0xee, 0xc7, 0xb9, 0xe7, 0x9e, 0x73, 0x6f, 0xc1, 0x8d, 0xb6, 0xc9, 0x76,
- 0xfa, 0xdb, 0xf3, 0x86, 0xd3, 0x5d, 0xb0, 0xfb, 0x5d, 0xbd, 0xe7, 0x3a, 0x6f, 0x8a, 0x87, 0x96,
- 0xe5, 0x3c, 0x58, 0xe8, 0x75, 0xda, 0x0b, 0x7a, 0xcf, 0xf4, 0xc2, 0x92, 0xdd, 0xab, 0xba, 0xd5,
- 0xdb, 0xd1, 0xaf, 0x2e, 0xb4, 0xa9, 0x4d, 0x5d, 0x9d, 0xd1, 0xe6, 0x7c, 0xcf, 0x75, 0x98, 0x43,
- 0xbe, 0x1c, 0x02, 0xcd, 0xfb, 0x40, 0xf3, 0xbe, 0xd8, 0x7c, 0xaf, 0xd3, 0x9e, 0xe7, 0x40, 0x61,
- 0x89, 0x0f, 0x34, 0xfb, 0xc5, 0x48, 0x0d, 0xda, 0x4e, 0xdb, 0x59, 0x10, 0x78, 0xdb, 0xfd, 0x96,
- 0x78, 0x13, 0x2f, 0xe2, 0x49, 0xea, 0x99, 0xd5, 0x3a, 0xd7, 0xbc, 0x79, 0xd3, 0xe1, 0xd5, 0x5a,
- 0x30, 0x1c, 0x97, 0x2e, 0xec, 0x0e, 0xd5, 0x65, 0xf6, 0x85, 0x90, 0xa7, 0xab, 0x1b, 0x3b, 0xa6,
- 0x4d, 0xdd, 0x3d, 0xff, 0x5b, 0x16, 0x5c, 0xea, 0x39, 0x7d, 0xd7, 0xa0, 0x47, 0x92, 0xf2, 0x16,
- 0xba, 0x94, 0xe9, 0x69, 0xba, 0x16, 0x46, 0x49, 0xb9, 0x7d, 0x9b, 0x99, 0xdd, 0x61, 0x35, 0x3f,
- 0xff, 0x38, 0x01, 0xcf, 0xd8, 0xa1, 0x5d, 0x3d, 0x29, 0xa7, 0xfd, 0x73, 0x19, 0xce, 0x2d, 0x6d,
- 0x7b, 0xcc, 0xd5, 0x0d, 0xb6, 0xe1, 0x34, 0x37, 0x69, 0xb7, 0x67, 0xe9, 0x8c, 0x92, 0x0e, 0x94,
- 0x78, 0xdd, 0x9a, 0x3a, 0xd3, 0xab, 0x99, 0xcb, 0x99, 0x2b, 0x95, 0xc5, 0xa5, 0xf9, 0x31, 0xfb,
- 0x62, 0x7e, 0x5d, 0x01, 0xd5, 0xa7, 0xf7, 0x07, 0xb5, 0x92, 0xff, 0x86, 0x81, 0x02, 0xf2, 0xbd,
- 0x0c, 0x4c, 0xdb, 0x4e, 0x93, 0x36, 0xa8, 0x45, 0x0d, 0xe6, 0xb8, 0xd5, 0xec, 0xe5, 0xdc, 0x95,
- 0xca, 0xe2, 0xeb, 0x63, 0x6b, 0x4c, 0xf9, 0xa2, 0xf9, 0x3b, 0x11, 0x05, 0xd7, 0x6d, 0xe6, 0xee,
- 0xd5, 0x9f, 0xfe, 0x60, 0x50, 0x7b, 0x6a, 0x7f, 0x50, 0x9b, 0x8e, 0x92, 0x30, 0x56, 0x13, 0xb2,
- 0x05, 0x15, 0xe6, 0x58, 0xbc, 0xc9, 0x4c, 0xc7, 0xf6, 0xaa, 0x39, 0x51, 0xb1, 0xb9, 0x79, 0xd9,
- 0xda, 0x5c, 0xfd, 0x3c, 0x1f, 0x2e, 0xf3, 0xbb, 0x57, 0xe7, 0x37, 0x03, 0xb6, 0xfa, 0x39, 0x05,
- 0x5c, 0x09, 0xcb, 0x3c, 0x8c, 0xe2, 0x10, 0x0a, 0xa7, 0x3d, 0x6a, 0xf4, 0x5d, 0x93, 0xed, 0x2d,
- 0x3b, 0x36, 0xa3, 0x0f, 0x59, 0x35, 0x2f, 0x5a, 0xf9, 0xf9, 0x34, 0xe8, 0x0d, 0xa7, 0xd9, 0x88,
- 0x73, 0xd7, 0xcf, 0xed, 0x0f, 0x6a, 0xa7, 0x13, 0x85, 0x98, 0xc4, 0x24, 0x36, 0x9c, 0x31, 0xbb,
- 0x7a, 0x9b, 0x6e, 0xf4, 0x2d, 0xab, 0x41, 0x0d, 0x97, 0x32, 0xaf, 0x5a, 0x10, 0x9f, 0x70, 0x25,
- 0x4d, 0xcf, 0x9a, 0x63, 0xe8, 0xd6, 0xdd, 0xed, 0x37, 0xa9, 0xc1, 0x90, 0xb6, 0xa8, 0x4b, 0x6d,
- 0x83, 0xd6, 0xab, 0xea, 0x63, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b,
- 0xae, 0xe9, 0x88, 0x2a, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52,
- 0xae, 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x0c, 0x38, 0x2c, 0x43, 0xae, 0x40, 0xc9, 0x2f, 0xac,
- 0x4e, 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xcb, 0x62, 0x40, 0x25, 0xab, 0x50, 0xd2, 0x5b,
- 0x2d, 0xd3, 0xe6, 0x9c, 0x25, 0xd1, 0x84, 0x97, 0xd2, 0x3e, 0x6d, 0x49, 0xf1, 0x48, 0x1c, 0xff,
- 0x0d, 0x03, 0x59, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d,
- 0x26, 0xea, 0x5e, 0x16, 0x75, 0x9f, 0x55, 0x75, 0x27, 0x8d, 0x21, 0x0e, 0x4c, 0x91, 0x22, 0x2f,
- 0xc1, 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xd0, 0x70, 0x88,
- 0x9b, 0x34, 0xe1, 0x92, 0xde, 0x67, 0x4e, 0x97, 0x43, 0xc6, 0x95, 0x6e, 0x3a, 0x1d, 0x6a, 0x57,
- 0x2b, 0x97, 0x33, 0x57, 0x4a, 0xf5, 0xcb, 0xfb, 0x83, 0xda, 0xa5, 0xa5, 0x03, 0xf8, 0xf0, 0x40,
- 0x14, 0x72, 0x17, 0xca, 0x4d, 0xdb, 0xdb, 0x70, 0x2c, 0xd3, 0xd8, 0xab, 0x4e, 0x8b, 0x0a, 0x5e,
- 0x55, 0x9f, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x84, 0x47, 0x83, 0xda, 0xa5, 0x61, 0xeb, 0x38, 0x1f,
- 0xd0, 0x31, 0xc4, 0x20, 0xeb, 0x02, 0x70, 0xd9, 0xb1, 0x5b, 0x66, 0xbb, 0x3a, 0x23, 0x7a, 0xe3,
- 0xf2, 0x88, 0x01, 0xbd, 0x72, 0xa7, 0x21, 0xf9, 0xea, 0x33, 0x4a, 0x9d, 0x7c, 0xc5, 0x10, 0x61,
- 0xf6, 0x45, 0x38, 0x3b, 0x34, 0x6b, 0xc9, 0x19, 0xc8, 0x75, 0xe8, 0x9e, 0x30, 0x4a, 0x65, 0xe4,
- 0x8f, 0xe4, 0x69, 0x28, 0xec, 0xea, 0x56, 0x9f, 0x56, 0xb3, 0xa2, 0x4c, 0xbe, 0xfc, 0x42, 0xf6,
- 0x5a, 0x46, 0x1b, 0x94, 0xe1, 0x94, 0x6f, 0x0b, 0xee, 0x51, 0x97, 0xd1, 0x87, 0xe4, 0x32, 0xe4,
- 0x6d, 0xde, 0x1f, 0x42, 0xbe, 0x3e, 0xad, 0x3e, 0x37, 0x2f, 0xfa, 0x41, 0x50, 0x88, 0x01, 0x45,
- 0x69, 0xcb, 0x05, 0x5e, 0x65, 0xf1, 0xc5, 0xb1, 0xcd, 0x50, 0x43, 0xc0, 0xd4, 0x61, 0x7f, 0x50,
- 0x2b, 0xca, 0x67, 0x54, 0xd0, 0xe4, 0x35, 0xc8, 0x7b, 0xa6, 0xdd, 0xa9, 0xe6, 0x84, 0x8a, 0xaf,
- 0x8e, 0xaf, 0xc2, 0xb4, 0x3b, 0xf5, 0x12, 0xff, 0x02, 0xfe, 0x84, 0x02, 0x94, 0xdc, 0x87, 0x5c,
- 0xbf, 0xd9, 0x52, 0x16, 0xe5, 0x97, 0xc6, 0xc6, 0xde, 0x5a, 0x59, 0xad, 0x4f, 0xed, 0x0f, 0x6a,
- 0xb9, 0xad, 0x95, 0x55, 0xe4, 0x88, 0xe4, 0xbb, 0x19, 0x38, 0x6b, 0x38, 0x36, 0xd3, 0xf9, 0xfa,
- 0xe2, 0x5b, 0xd6, 0x6a, 0x41, 0xe8, 0xb9, 0x35, 0xb6, 0x9e, 0xe5, 0x24, 0x62, 0xfd, 0x3c, 0x37,
- 0x14, 0x43, 0xc5, 0x38, 0xac, 0x9b, 0x7c, 0x3f, 0x03, 0xe7, 0xf9, 0x04, 0x1e, 0x62, 0x16, 0x66,
- 0xe7, 0x78, 0x6b, 0x75, 0x71, 0x7f, 0x50, 0x3b, 0x7f, 0x33, 0x4d, 0x19, 0xa6, 0xd7, 0x81, 0xd7,
- 0xee, 0x9c, 0x3e, 0xbc, 0x16, 0x09, 0x93, 0x56, 0x59, 0x5c, 0x3b, 0xce, 0xf5, 0xad, 0xfe, 0x19,
- 0x35, 0x94, 0xd3, 0x96, 0x73, 0x4c, 0xab, 0x05, 0xb9, 0x0e, 0x53, 0xbb, 0x8e, 0xd5, 0xef, 0x52,
- 0xaf, 0x5a, 0x12, 0x8b, 0xc2, 0x6c, 0xda, 0x5c, 0xbd, 0x27, 0x58, 0xea, 0xa7, 0x15, 0xfc, 0x94,
- 0x7c, 0xf7, 0xd0, 0x97, 0x25, 0x26, 0x14, 0x2d, 0xb3, 0x6b, 0x32, 0x4f, 0x58, 0xcb, 0xca, 0xe2,
- 0xf5, 0xb1, 0x3f, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0x7c, 0x46, 0xa5, 0x80, 0x18,
- 0x50, 0xf0, 0x0c, 0xdd, 0x92, 0xd6, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf,
- 0xa8, 0x6f, 0x2a, 0x88, 0x57, 0x94, 0xd8, 0xe4, 0x57, 0xe0, 0x54, 0xac, 0x37, 0xbd, 0x6a, 0x45,
- 0xb4, 0xce, 0xb3, 0x69, 0xad, 0x13, 0x70, 0xd5, 0x2f, 0x28, 0xb0, 0x53, 0xb1, 0x11, 0xe2, 0x61,
- 0x02, 0x8c, 0xdc, 0x86, 0x92, 0x67, 0x36, 0xa9, 0xa1, 0xbb, 0x5e, 0x75, 0xfa, 0x30, 0xc0, 0x67,
- 0x14, 0x70, 0xa9, 0xa1, 0xc4, 0x30, 0x00, 0xd0, 0xee, 0xc3, 0xcc, 0x52, 0x9f, 0xed, 0x38, 0xae,
- 0xf9, 0xb6, 0xf0, 0x2c, 0xc8, 0x2a, 0x14, 0x98, 0x58, 0x21, 0xa4, 0xd3, 0xf6, 0x5c, 0x1a, 0xb4,
- 0x5c, 0xad, 0x6f, 0xd3, 0x3d, 0xdf, 0xb0, 0xd6, 0xcb, 0xbc, 0x11, 0xe4, 0x8a, 0x21, 0xc5, 0xb5,
- 0x3f, 0xcc, 0x40, 0xb9, 0xae, 0x7b, 0xa6, 0xc1, 0xe1, 0xc9, 0x32, 0xe4, 0xfb, 0x1e, 0x75, 0x8f,
- 0x06, 0x2a, 0xac, 0xd2, 0x96, 0x47, 0x5d, 0x14, 0xc2, 0xe4, 0x2e, 0x94, 0x7a, 0xba, 0xe7, 0x3d,
- 0x70, 0xdc, 0xa6, 0xb2, 0xac, 0x87, 0x04, 0x92, 0x4b, 0xbf, 0x12, 0xc5, 0x00, 0x44, 0xab, 0x40,
- 0xb9, 0x6e, 0xe9, 0x46, 0x67, 0xc7, 0xb1, 0xa8, 0xf6, 0x2a, 0x14, 0xeb, 0xfd, 0x56, 0x8b, 0xba,
- 0x87, 0xb0, 0xf0, 0xf3, 0x90, 0x67, 0x7b, 0x3d, 0xb5, 0x5e, 0x04, 0xab, 0x7b, 0x7e, 0x73, 0xaf,
- 0x47, 0x1f, 0x0d, 0x6a, 0x20, 0x71, 0xf8, 0x1b, 0x0a, 0x3e, 0xed, 0xc7, 0x19, 0x38, 0x27, 0x0b,
- 0xd5, 0x2a, 0x2a, 0xd7, 0x27, 0x42, 0xa1, 0xe0, 0xd2, 0xa6, 0xe9, 0xa9, 0x76, 0x59, 0x19, 0x7b,
- 0x38, 0x22, 0x47, 0x51, 0xcb, 0xa1, 0xe8, 0x0b, 0x51, 0x80, 0x12, 0x9d, 0xf4, 0xa1, 0xfc, 0x26,
- 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x55, 0x2d, 0xf7, 0xf2, 0xd8, 0xaa, 0x6e, 0x51, 0xd6, 0x10, 0x48,
- 0xd1, 0xd5, 0x37, 0x28, 0xc4, 0x50, 0x93, 0xf6, 0x93, 0x3c, 0x94, 0x83, 0x51, 0x48, 0x3e, 0x07,
- 0x05, 0xe1, 0xee, 0xa9, 0x66, 0x0d, 0xa6, 0x8e, 0xf0, 0x0a, 0x51, 0xd2, 0xc8, 0x73, 0x30, 0x65,
- 0x38, 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x0b, 0x5f, 0xae, 0x57, 0xb8, 0xc5, 0x58, 0x96, 0x45, 0xe8,
- 0xd3, 0xc8, 0x25, 0xc8, 0xeb, 0x6e, 0x5b, 0x7a, 0xd3, 0x65, 0x39, 0x4e, 0x96, 0xdc, 0xb6, 0x87,
- 0xa2, 0x94, 0x7c, 0x05, 0x72, 0xd4, 0xde, 0xad, 0xe6, 0x47, 0x9b, 0xa4, 0xeb, 0xf6, 0xee, 0x3d,
- 0xdd, 0xad, 0x57, 0x54, 0x1d, 0x72, 0xd7, 0xed, 0x5d, 0xe4, 0x32, 0x64, 0x0d, 0xa6, 0xa8, 0xbd,
- 0xbb, 0xea, 0x3a, 0x5d, 0xe5, 0xe6, 0x7e, 0x76, 0x84, 0x38, 0x67, 0x51, 0xab, 0x73, 0x60, 0xd8,
- 0x54, 0x31, 0xfa, 0x10, 0xe4, 0x1b, 0x30, 0x2d, 0x6d, 0xdc, 0x3a, 0x77, 0x99, 0xbc, 0x6a, 0x51,
- 0x40, 0xd6, 0x46, 0x1b, 0x49, 0xc1, 0x17, 0x6e, 0x2b, 0x22, 0x85, 0x1e, 0xc6, 0xa0, 0xc8, 0x37,
- 0xa0, 0xec, 0xef, 0x18, 0x3d, 0xb5, 0x1a, 0xa4, 0x7a, 0xe4, 0xa8, 0x98, 0x90, 0xbe, 0xd5, 0x37,
- 0x5d, 0xda, 0xa5, 0x36, 0xf3, 0xea, 0x67, 0x7d, 0x1f, 0xcd, 0xa7, 0x7a, 0x18, 0xa2, 0x91, 0xed,
- 0xe1, 0xad, 0x85, 0xf4, 0x8b, 0x3f, 0x37, 0x62, 0xb6, 0x8d, 0xb1, 0xaf, 0x78, 0x1d, 0x4e, 0x07,
- 0xbe, 0xbf, 0x72, 0x1f, 0xa5, 0xa7, 0xfc, 0x02, 0x17, 0xbf, 0x19, 0x27, 0x3d, 0x1a, 0xd4, 0x9e,
- 0x4d, 0x71, 0x20, 0x43, 0x06, 0x4c, 0x82, 0x69, 0xff, 0x95, 0x85, 0xe1, 0xe5, 0x3f, 0xde, 0x68,
- 0x99, 0xe3, 0x6e, 0xb4, 0xe4, 0x07, 0x49, 0xe3, 0x70, 0x4d, 0x89, 0x4d, 0xfe, 0x51, 0x69, 0x1d,
- 0x93, 0x3b, 0xee, 0x8e, 0x19, 0x7f, 0xee, 0x68, 0xef, 0xe5, 0xe1, 0xd4, 0x8a, 0x4e, 0xbb, 0x8e,
- 0xfd, 0x58, 0xf7, 0x25, 0xf3, 0x44, 0xb8, 0x2f, 0x57, 0xa0, 0xe4, 0xd2, 0x9e, 0x65, 0x1a, 0xba,
- 0x27, 0x3a, 0x4b, 0xed, 0x11, 0x51, 0x95, 0x61, 0x40, 0x1d, 0xe1, 0xb6, 0xe6, 0x9e, 0x48, 0xb7,
- 0x35, 0xff, 0xd3, 0x77, 0x5b, 0xb5, 0xf7, 0x73, 0x90, 0xbf, 0xde, 0x6c, 0x53, 0xbe, 0x94, 0xb6,
- 0xb8, 0x31, 0x4d, 0x2c, 0xa5, 0xc2, 0x4c, 0x0a, 0x0a, 0x99, 0x85, 0x2c, 0x73, 0xd4, 0x5c, 0x01,
- 0x45, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x87, 0x4e,
- 0x26, 0xfb, 0xb0, 0x55, 0xc7, 0x7d, 0xa0, 0xbb, 0xcd, 0xe5, 0x00, 0xb1, 0x7e, 0x6a, 0x7f, 0x50,
- 0x83, 0xf0, 0x1d, 0x23, 0xda, 0x48, 0x3b, 0x70, 0x4a, 0x65, 0x83, 0x2e, 0x8f, 0xad, 0x97, 0x37,
- 0xc4, 0x01, 0x2e, 0xe9, 0x55, 0xa8, 0xf4, 0x74, 0x57, 0xb7, 0x2c, 0x6a, 0x99, 0x5e, 0x57, 0xec,
- 0x85, 0x0a, 0xf5, 0xd3, 0xfb, 0x83, 0x5a, 0x65, 0x23, 0x2c, 0xc6, 0x28, 0x0f, 0x79, 0x11, 0x8a,
- 0x8e, 0xbd, 0xda, 0xb7, 0x2c, 0x15, 0x1a, 0xf9, 0x7f, 0x1c, 0xf6, 0xae, 0x28, 0x79, 0x34, 0xa8,
- 0x5d, 0x94, 0x9e, 0x06, 0x7f, 0xbb, 0xef, 0x9a, 0xcc, 0xb4, 0xdb, 0x0d, 0xe6, 0xea, 0x8c, 0xb6,
- 0xf7, 0x50, 0x89, 0x69, 0xbf, 0x9d, 0x01, 0x08, 0xab, 0x45, 0xbe, 0x0a, 0xa7, 0xb7, 0x85, 0xcc,
- 0xba, 0xfe, 0x70, 0x8d, 0xda, 0x6d, 0xb6, 0x23, 0x3a, 0x2c, 0x2f, 0x6d, 0x46, 0x3d, 0x4e, 0xc2,
- 0x24, 0x2f, 0x79, 0x09, 0xce, 0xc8, 0xa2, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0x64, 0xb4,
- 0xa2, 0x9e, 0xa0, 0xe1, 0x10, 0xb7, 0xa6, 0x43, 0x65, 0xd5, 0x7c, 0x48, 0x9b, 0xf7, 0x4d, 0xbb,
- 0xe9, 0x3c, 0x20, 0x08, 0x45, 0x2b, 0xac, 0x46, 0x65, 0x71, 0x3e, 0x62, 0x87, 0x82, 0xe0, 0x64,
- 0xd8, 0xe4, 0x5d, 0xca, 0x74, 0x6e, 0x99, 0x56, 0xfa, 0x2a, 0x7c, 0x26, 0x9b, 0x59, 0xd6, 0x56,
- 0x21, 0x69, 0x2f, 0xc0, 0xd9, 0xa1, 0x01, 0x40, 0x6a, 0x50, 0xe8, 0xd0, 0xbd, 0x9b, 0xdc, 0xd9,
- 0xe5, 0x8e, 0x84, 0xf0, 0x9c, 0x6e, 0xf3, 0x02, 0x94, 0xe5, 0xda, 0x7f, 0x67, 0xa0, 0xb4, 0xda,
- 0xb7, 0x0d, 0xe1, 0x1a, 0x3f, 0xde, 0x2f, 0xf4, 0xfd, 0x92, 0x6c, 0xaa, 0x5f, 0xd2, 0x87, 0x62,
- 0xe7, 0x41, 0xe0, 0xb7, 0x54, 0x16, 0xd7, 0xc7, 0x1f, 0xca, 0xaa, 0x4a, 0xf3, 0xb7, 0x05, 0x9e,
- 0x8c, 0x46, 0x9e, 0x52, 0x15, 0x2a, 0xde, 0xbe, 0x2f, 0x94, 0x2a, 0x65, 0xb3, 0x5f, 0x81, 0x4a,
- 0x84, 0xed, 0x48, 0xe1, 0x8f, 0x9f, 0x64, 0xe0, 0xf4, 0x0d, 0x19, 0xf0, 0x75, 0x5c, 0xe9, 0xee,
- 0x90, 0x8b, 0x90, 0x73, 0x7b, 0x7d, 0x21, 0x9f, 0x93, 0xbb, 0x7b, 0xdc, 0xd8, 0x42, 0x5e, 0x46,
- 0x5e, 0x81, 0x52, 0x53, 0xf5, 0x81, 0x72, 0x33, 0x8f, 0xda, 0x73, 0xc2, 0x00, 0xfb, 0x6f, 0x18,
- 0xa0, 0x71, 0xbf, 0xb0, 0xeb, 0xb5, 0x1b, 0xe6, 0xdb, 0xd2, 0xea, 0x16, 0xa4, 0x5f, 0xb8, 0x2e,
- 0x8b, 0xd0, 0xa7, 0x71, 0x8b, 0xde, 0xa1, 0x7b, 0xcb, 0xdc, 0x45, 0x12, 0xd3, 0x56, 0x59, 0xf4,
- 0xdb, 0xaa, 0x0c, 0x03, 0x2a, 0xef, 0x79, 0xf9, 0xcd, 0x05, 0x31, 0xd0, 0x45, 0xcf, 0xdf, 0xe3,
- 0x05, 0xea, 0xf3, 0xb5, 0xef, 0x66, 0xe1, 0xc2, 0x0d, 0xca, 0xe4, 0x82, 0xb6, 0x42, 0x7b, 0x96,
- 0xb3, 0xc7, 0xfd, 0x00, 0xa4, 0x6f, 0x91, 0x97, 0x00, 0x4c, 0x6f, 0xbb, 0xb1, 0x6b, 0x70, 0x0f,
- 0x5f, 0x8d, 0x86, 0xcb, 0xaa, 0xf1, 0xe1, 0x66, 0xa3, 0xae, 0x28, 0x8f, 0x62, 0x6f, 0x18, 0x91,
- 0x09, 0x7d, 0xe1, 0xec, 0x01, 0xbe, 0x70, 0x03, 0xa0, 0x17, 0x7a, 0x13, 0x39, 0xc1, 0xf9, 0x73,
- 0xbe, 0x9a, 0xa3, 0x38, 0x12, 0x11, 0x98, 0x49, 0xd6, 0xf7, 0xbf, 0xc8, 0xc1, 0xec, 0x0d, 0xca,
- 0x02, 0x57, 0x5f, 0x6d, 0x65, 0x1a, 0x3d, 0x6a, 0xf0, 0x56, 0x79, 0x37, 0x03, 0x45, 0x4b, 0xdf,
- 0xa6, 0x96, 0x27, 0x66, 0x53, 0x65, 0xf1, 0x8d, 0xb1, 0x87, 0xf7, 0x68, 0x2d, 0xf3, 0x6b, 0x42,
- 0x43, 0x62, 0xc0, 0xcb, 0x42, 0x54, 0xea, 0xc9, 0x97, 0xa0, 0x62, 0x58, 0x7d, 0x8f, 0x51, 0x77,
- 0xc3, 0x71, 0x99, 0x5a, 0xda, 0x83, 0x90, 0xfa, 0x72, 0x48, 0xc2, 0x28, 0x1f, 0x59, 0x04, 0x30,
- 0x2c, 0x93, 0xda, 0x4c, 0x48, 0xc9, 0x61, 0x46, 0xfc, 0xf6, 0x5e, 0x0e, 0x28, 0x18, 0xe1, 0xe2,
- 0xaa, 0xba, 0x8e, 0x6d, 0x32, 0x47, 0xaa, 0xca, 0xc7, 0x55, 0xad, 0x87, 0x24, 0x8c, 0xf2, 0x09,
- 0x31, 0xca, 0x5c, 0xd3, 0xf0, 0x84, 0x58, 0x21, 0x21, 0x16, 0x92, 0x30, 0xca, 0xc7, 0x67, 0x72,
- 0xe4, 0xfb, 0x8f, 0x34, 0x93, 0xff, 0xb2, 0x04, 0x73, 0xb1, 0x66, 0x65, 0x3a, 0xa3, 0xad, 0xbe,
- 0xd5, 0xa0, 0xcc, 0xef, 0xc0, 0x2f, 0x41, 0x45, 0x85, 0xa2, 0xef, 0x84, 0x56, 0x2e, 0xa8, 0x54,
- 0x23, 0x24, 0x61, 0x94, 0x8f, 0xfc, 0x56, 0xd8, 0xef, 0x32, 0xeb, 0x62, 0x1c, 0x4f, 0xbf, 0x0f,
- 0x55, 0xf0, 0x50, 0x7d, 0xbf, 0x00, 0x65, 0x5b, 0x67, 0x9e, 0x98, 0x48, 0x6a, 0xce, 0x04, 0x8e,
- 0xfb, 0x1d, 0x9f, 0x80, 0x21, 0x0f, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8, 0x73, 0x5c,
- 0x46, 0x5d, 0x29, 0x9b, 0x17, 0xb2, 0x97, 0x94, 0xec, 0xd3, 0xeb, 0x29, 0x3c, 0x98, 0x2a, 0x49,
- 0xd6, 0xe1, 0x9c, 0x21, 0x23, 0xd1, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80, 0x81, 0x97,
- 0xba, 0x3c, 0xcc, 0x82, 0x69, 0x72, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d, 0x33, 0x9a,
- 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb, 0xd4, 0x67,
- 0x3b, 0x32, 0x68, 0x13, 0x49, 0x74, 0x04, 0x2d, 0xdf, 0x48, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d,
- 0xb3, 0xb2, 0xfc, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02, 0x57, 0x53,
- 0xb8, 0xb3, 0x8d, 0x91, 0x9c, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4, 0xae, 0xf7,
- 0x04, 0xac, 0x4c, 0x7b, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x12, 0x9c,
- 0xee, 0xed, 0x1a, 0xfc, 0xf1, 0x66, 0xeb, 0x0e, 0xa5, 0x4d, 0xda, 0x14, 0x49, 0x8e, 0x72, 0xfd,
- 0x19, 0x7f, 0x97, 0xb8, 0x11, 0x27, 0x63, 0x92, 0x9f, 0x5c, 0x83, 0x69, 0x8f, 0xe9, 0x2e, 0x53,
- 0x31, 0x91, 0xea, 0x29, 0x99, 0x16, 0xf2, 0x43, 0x06, 0x8d, 0x08, 0x0d, 0x63, 0x9c, 0x93, 0x58,
- 0x8f, 0x47, 0x72, 0x31, 0x14, 0x41, 0xa5, 0x84, 0xd9, 0x7f, 0x27, 0x69, 0xf6, 0x5f, 0x9b, 0x64,
- 0xfa, 0xa7, 0x68, 0x38, 0xd4, 0xb4, 0xbf, 0x05, 0xc4, 0x55, 0x21, 0x30, 0xb9, 0x15, 0x89, 0x58,
- 0xfe, 0x20, 0xf9, 0x86, 0x43, 0x1c, 0x98, 0x22, 0x45, 0x1a, 0x70, 0xde, 0xa3, 0x36, 0x33, 0x6d,
- 0x6a, 0xc5, 0xe1, 0xe4, 0x92, 0xf0, 0xac, 0x82, 0x3b, 0xdf, 0x48, 0x63, 0xc2, 0x74, 0xd9, 0x49,
- 0x1a, 0xff, 0x5f, 0xca, 0x62, 0xdd, 0x95, 0x4d, 0x73, 0x6c, 0x66, 0xfb, 0xdd, 0xa4, 0xd9, 0x7e,
- 0x63, 0xf2, 0x7e, 0x1b, 0xcf, 0x64, 0x2f, 0x02, 0x88, 0x5e, 0x88, 0xda, 0xec, 0xc0, 0x52, 0x61,
- 0x40, 0xc1, 0x08, 0x17, 0x9f, 0x85, 0x7e, 0x3b, 0x47, 0xcd, 0x75, 0x30, 0x0b, 0x1b, 0x51, 0x22,
- 0xc6, 0x79, 0x47, 0x9a, 0xfc, 0xc2, 0xd8, 0x26, 0xff, 0x16, 0x90, 0xd8, 0x46, 0x58, 0xe2, 0x15,
- 0xe3, 0xb9, 0xdf, 0x9b, 0x43, 0x1c, 0x98, 0x22, 0x35, 0x62, 0x28, 0x4f, 0x1d, 0xef, 0x50, 0x2e,
- 0x8d, 0x3f, 0x94, 0xc9, 0x1b, 0x70, 0x51, 0xa8, 0x52, 0xed, 0x13, 0x07, 0x96, 0xc6, 0xff, 0xb3,
- 0x0a, 0xf8, 0x22, 0x8e, 0x62, 0xc4, 0xd1, 0x18, 0xbc, 0x7f, 0x0c, 0x97, 0x36, 0xb9, 0x72, 0xdd,
- 0x1a, 0xbd, 0x30, 0x2c, 0xa7, 0xf0, 0x60, 0xaa, 0x24, 0x1f, 0x62, 0x8c, 0x0f, 0x43, 0x7d, 0xdb,
- 0xa2, 0x4d, 0x95, 0xfb, 0x0e, 0x86, 0xd8, 0xe6, 0x5a, 0x43, 0x51, 0x30, 0xc2, 0x95, 0x66, 0xab,
- 0xa7, 0x8f, 0x68, 0xab, 0x6f, 0x88, 0xa8, 0x51, 0x2b, 0xb6, 0x24, 0x28, 0x83, 0x1f, 0x9c, 0x66,
- 0x58, 0x4e, 0x32, 0xe0, 0xb0, 0x8c, 0x58, 0x2a, 0x0d, 0xd7, 0xec, 0x31, 0x2f, 0x8e, 0x75, 0x2a,
- 0xb1, 0x54, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0x77, 0x52, 0x76, 0xa8, 0x6e, 0xb1, 0x9d, 0x38, 0xe0,
- 0xe9, 0xb8, 0x93, 0xf2, 0xf2, 0x30, 0x0b, 0xa6, 0xc9, 0x4d, 0x62, 0xde, 0xbe, 0x93, 0x85, 0x73,
- 0x37, 0xa8, 0xca, 0xae, 0x6f, 0x38, 0x4d, 0xdf, 0xae, 0xfd, 0x1f, 0xdd, 0x65, 0xbd, 0x93, 0x85,
- 0xa9, 0x1b, 0xae, 0xd3, 0xef, 0xd5, 0xf7, 0x48, 0x1b, 0x8a, 0x0f, 0x44, 0x44, 0x44, 0xc5, 0x41,
- 0xc6, 0x3f, 0x48, 0x20, 0x03, 0x2b, 0xa1, 0x09, 0x96, 0xef, 0xa8, 0xe0, 0x79, 0x4b, 0x75, 0xe8,
- 0x1e, 0x95, 0x69, 0xb5, 0x52, 0xd8, 0x52, 0xb7, 0x79, 0x21, 0x4a, 0x1a, 0x79, 0x13, 0xa6, 0x3c,
- 0xe6, 0xb8, 0xbe, 0x91, 0x9e, 0x24, 0x24, 0xb6, 0x51, 0xff, 0x7a, 0x43, 0x42, 0xc9, 0x8d, 0xbc,
- 0x7a, 0x41, 0x5f, 0x81, 0xf6, 0x7e, 0x06, 0xe0, 0xe5, 0xcd, 0xcd, 0x0d, 0x15, 0x73, 0x68, 0x42,
- 0x5e, 0xef, 0x07, 0xe1, 0xa0, 0xd5, 0xf1, 0xe3, 0xc6, 0xd1, 0x54, 0xa7, 0x8a, 0xcf, 0xf4, 0xd9,
- 0x0e, 0x0a, 0x74, 0xf2, 0x79, 0x98, 0x52, 0x2b, 0xa4, 0x6a, 0x87, 0x20, 0xb3, 0xa3, 0x56, 0x51,
- 0xf4, 0xe9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0xcb, 0xec,
- 0x91, 0x5f, 0x1d, 0x3a, 0xf8, 0xf6, 0xb3, 0x87, 0x0b, 0x82, 0xc8, 0x73, 0x53, 0xeb, 0x94, 0xe9,
- 0xa1, 0x6d, 0x0a, 0xcb, 0x22, 0xa7, 0xdd, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50, 0x21, 0x96, 0xc6,
- 0xd8, 0xad, 0x91, 0xfe, 0x01, 0x7c, 0xfe, 0x85, 0xc1, 0x2d, 0x31, 0x1b, 0x85, 0x3a, 0xf2, 0x4d,
- 0x28, 0x7a, 0x4c, 0x67, 0x7d, 0x3f, 0x12, 0xbb, 0x75, 0xdc, 0x8a, 0x05, 0x78, 0x38, 0x46, 0xe5,
- 0x3b, 0x2a, 0xa5, 0xda, 0x8f, 0x32, 0x30, 0x9b, 0x2e, 0xb8, 0x66, 0x7a, 0x8c, 0xfc, 0xf2, 0x50,
- 0xb3, 0x1f, 0x32, 0xf6, 0xc4, 0xa5, 0x45, 0xa3, 0x07, 0x69, 0x72, 0xbf, 0x24, 0xd2, 0xe4, 0x0c,
- 0x0a, 0x26, 0xa3, 0x5d, 0xdf, 0x57, 0xba, 0x7b, 0xcc, 0x9f, 0x1e, 0xb1, 0x4d, 0x5c, 0x0b, 0x4a,
- 0x65, 0xda, 0x7b, 0xd9, 0x51, 0x9f, 0xcc, 0xbb, 0x85, 0x58, 0xf1, 0xec, 0xf1, 0xed, 0xc9, 0xb2,
- 0xc7, 0xf1, 0x0a, 0x0d, 0x27, 0x91, 0x7f, 0x7d, 0x38, 0x89, 0x7c, 0x77, 0xf2, 0x24, 0x72, 0xa2,
- 0x19, 0x46, 0xe6, 0x92, 0xbf, 0x93, 0x83, 0x4b, 0x07, 0x0d, 0x1b, 0x6e, 0x2b, 0xd5, 0xe8, 0x9c,
- 0xd4, 0x56, 0x1e, 0x3c, 0x0e, 0xc9, 0x22, 0x14, 0x7a, 0x3b, 0xba, 0xe7, 0xaf, 0x2a, 0xfe, 0xe2,
- 0x5b, 0xd8, 0xe0, 0x85, 0x8f, 0x06, 0xb5, 0x8a, 0x5c, 0x8d, 0xc4, 0x2b, 0x4a, 0x56, 0x6e, 0x59,
- 0xba, 0xd4, 0xf3, 0x42, 0xff, 0x36, 0xb0, 0x2c, 0xeb, 0xb2, 0x18, 0x7d, 0x3a, 0x61, 0x50, 0x94,
- 0x7b, 0x46, 0x95, 0x77, 0x18, 0x3f, 0x49, 0x96, 0x72, 0xe0, 0x20, 0xfc, 0x28, 0x15, 0x7e, 0x50,
- 0xba, 0x82, 0x03, 0x0d, 0x85, 0xf4, 0x03, 0x0d, 0x91, 0x05, 0x56, 0x1e, 0x68, 0xf8, 0xfb, 0x12,
- 0x5c, 0x48, 0xef, 0x43, 0xfe, 0xad, 0xbb, 0xd4, 0xf5, 0x4c, 0xc7, 0x56, 0x8b, 0x76, 0x78, 0xf0,
- 0x47, 0x16, 0xa3, 0x4f, 0xff, 0x54, 0x27, 0xe0, 0xfe, 0x38, 0xc3, 0xdd, 0x60, 0x19, 0xa8, 0xf9,
- 0x24, 0x92, 0x70, 0xcf, 0x4a, 0x77, 0x7a, 0x84, 0x42, 0x1c, 0x5d, 0x17, 0xf2, 0x47, 0x19, 0xa8,
- 0x76, 0x13, 0x7e, 0xf6, 0x09, 0x1e, 0xbd, 0xbb, 0xb4, 0x3f, 0xa8, 0x55, 0xd7, 0x47, 0xe8, 0xc3,
- 0x91, 0x35, 0x21, 0xbf, 0x01, 0x95, 0x1e, 0x1f, 0x17, 0x1e, 0xa3, 0xb6, 0xe1, 0x9f, 0xbe, 0x1b,
- 0x7f, 0xf4, 0x6f, 0x84, 0x58, 0x7e, 0xfa, 0x4b, 0x65, 0xd5, 0x42, 0x02, 0x46, 0x35, 0x3e, 0xe1,
- 0x67, 0xed, 0xae, 0x40, 0xc9, 0xa3, 0x8c, 0x99, 0x76, 0xdb, 0x13, 0xbb, 0xb7, 0xb2, 0x9c, 0x2b,
- 0x0d, 0x55, 0x86, 0x01, 0x95, 0xfc, 0x0c, 0x94, 0x45, 0xdc, 0x67, 0xc9, 0x6d, 0x7b, 0xd5, 0xb2,
- 0xc8, 0x44, 0x09, 0xbb, 0xda, 0xf0, 0x0b, 0x31, 0xa4, 0x93, 0x17, 0x60, 0x5a, 0x66, 0xe3, 0xd4,
- 0x99, 0x5b, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe5, 0x18, 0xe3, 0xe2, 0xfb,
- 0x29, 0x1a, 0x04, 0xc7, 0x92, 0xfb, 0xa9, 0x30, 0x6c, 0x86, 0x11, 0x2e, 0xf2, 0x2c, 0xe4, 0x98,
- 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xf4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xcb, 0xb5, 0xff, 0xc9, 0xc0,
- 0xe9, 0xc4, 0xd1, 0x22, 0x2e, 0xd2, 0x77, 0x2d, 0x65, 0x46, 0x02, 0x91, 0x2d, 0x5c, 0x43, 0x5e,
- 0x4e, 0xde, 0x50, 0x5e, 0x61, 0x76, 0xc2, 0xeb, 0x05, 0x77, 0x74, 0xe6, 0x71, 0x37, 0x70, 0xc8,
- 0x21, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0x3c, 0xd6, 0x76, 0x70, 0x03, 0x45, 0x36, 0x9c, 0xf9, 0xc3,
- 0x6c, 0x38, 0xb5, 0xbf, 0xcd, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c, 0x91, 0x6e, 0x91,
- 0xb3, 0x3f, 0x45, 0x8b, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd, 0xf4, 0x96, 0x5a,
- 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x22, 0x77, 0x9f, 0xd9, 0x1f, 0xd4, 0x9e,
- 0xd9, 0xdc, 0x5c, 0x4b, 0x63, 0xc1, 0x51, 0xb2, 0x62, 0x86, 0xe8, 0x46, 0xc7, 0x69, 0xb5, 0x64,
- 0x66, 0x5b, 0xe6, 0x78, 0xe4, 0x0c, 0x89, 0x94, 0x63, 0x8c, 0x4b, 0xfb, 0x28, 0x03, 0xe5, 0xdb,
- 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9, 0x50, 0xd7, 0x53,
- 0x99, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x22, 0xf4, 0x69, 0x7c, 0x1b, 0xc6, 0x9c, 0x9e, 0x69, 0x24,
- 0x37, 0xac, 0x9b, 0xbc, 0x10, 0x25, 0x8d, 0xdc, 0x97, 0xf3, 0x28, 0x37, 0xe1, 0xd9, 0xec, 0xcd,
- 0xb5, 0x86, 0xcc, 0xde, 0xfa, 0x33, 0x90, 0x3c, 0x1f, 0xf3, 0x3c, 0xca, 0xa3, 0x7c, 0x05, 0xed,
- 0xfb, 0x59, 0xa8, 0xc8, 0x4f, 0x93, 0x9b, 0xb3, 0xe3, 0xfc, 0xb8, 0x17, 0x45, 0x74, 0xdd, 0xeb,
- 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xa3, 0x25, 0x21, 0x31, 0x88, 0xb0, 0x87, 0x45,
- 0x7e, 0xeb, 0xe4, 0x4f, 0xb0, 0x75, 0x0a, 0x07, 0xb6, 0xce, 0x9f, 0x65, 0xa0, 0xbc, 0x66, 0xb6,
- 0xa8, 0xb1, 0x67, 0x58, 0x94, 0xbc, 0x02, 0xd5, 0x26, 0xb5, 0x28, 0xa3, 0x37, 0x5c, 0xdd, 0xa0,
- 0x1b, 0xd4, 0x35, 0xc5, 0x4d, 0x1c, 0x3e, 0xca, 0xc4, 0x3c, 0x2e, 0xc8, 0xe5, 0x72, 0x65, 0x04,
- 0x0f, 0x8e, 0x94, 0x26, 0x37, 0x61, 0xba, 0x49, 0x3d, 0xd3, 0xa5, 0xcd, 0x8d, 0x88, 0x37, 0xfa,
- 0x9c, 0x6f, 0x9b, 0x56, 0x22, 0xb4, 0x47, 0x83, 0xda, 0xcc, 0x86, 0xd9, 0xa3, 0x96, 0x69, 0x53,
- 0xe9, 0x96, 0xc6, 0x44, 0xb5, 0x02, 0xe4, 0xd6, 0x9c, 0xb6, 0xf6, 0x5e, 0x0e, 0x82, 0xbb, 0x55,
- 0xe4, 0x37, 0x33, 0x50, 0xd1, 0x6d, 0xdb, 0x61, 0xea, 0xde, 0x92, 0x8c, 0xed, 0xe3, 0xc4, 0x57,
- 0xb8, 0xe6, 0x97, 0x42, 0x50, 0x19, 0x16, 0x0e, 0x42, 0xd5, 0x11, 0x0a, 0x46, 0x75, 0x93, 0x7e,
- 0x22, 0x52, 0xbd, 0x3e, 0x79, 0x2d, 0x0e, 0x11, 0x97, 0x9e, 0xfd, 0x1a, 0x9c, 0x49, 0x56, 0xf6,
- 0x28, 0x81, 0xad, 0x49, 0x62, 0x62, 0xef, 0x94, 0xa1, 0x72, 0x47, 0x67, 0xe6, 0x2e, 0x15, 0x5b,
- 0xb0, 0x93, 0xf1, 0xa9, 0xff, 0x20, 0x03, 0x17, 0xe2, 0x31, 0xe3, 0x13, 0x74, 0xac, 0x67, 0xf7,
- 0x07, 0xb5, 0x0b, 0x98, 0xaa, 0x0d, 0x47, 0xd4, 0x42, 0xb8, 0xd8, 0x43, 0x21, 0xe8, 0x93, 0x76,
- 0xb1, 0x1b, 0xa3, 0x14, 0xe2, 0xe8, 0xba, 0x7c, 0x5a, 0x5c, 0xec, 0x27, 0xfb, 0xae, 0x4b, 0x62,
- 0x03, 0x30, 0xf5, 0xc4, 0x6c, 0x00, 0x4a, 0x4f, 0x84, 0xc3, 0xd5, 0x8b, 0x6c, 0x00, 0xca, 0x13,
- 0xc6, 0x41, 0x55, 0x9a, 0x55, 0xa2, 0x8d, 0xda, 0x48, 0x88, 0xc3, 0x6f, 0xbe, 0x6f, 0x4c, 0x0c,
- 0x28, 0x6c, 0xeb, 0x9e, 0x69, 0x28, 0xf7, 0xb3, 0x3e, 0x7e, 0x58, 0xc2, 0xbf, 0x14, 0x22, 0x63,
- 0x4c, 0xe2, 0x15, 0x25, 0x76, 0x78, 0xf9, 0x24, 0x3b, 0xd1, 0xe5, 0x13, 0xb2, 0x0c, 0x79, 0x9b,
- 0x1b, 0xdb, 0xdc, 0x91, 0xaf, 0x9b, 0xdc, 0xb9, 0x4d, 0xf7, 0x50, 0x08, 0x6b, 0x3f, 0xcc, 0x02,
- 0xf0, 0xcf, 0x57, 0x6e, 0xce, 0x63, 0x36, 0x23, 0x9f, 0x87, 0x29, 0xaf, 0x2f, 0xa2, 0xb5, 0x6a,
- 0x29, 0x0e, 0x83, 0xc7, 0xb2, 0x18, 0x7d, 0x3a, 0xf7, 0x84, 0xde, 0xea, 0xd3, 0xbe, 0x1f, 0x0b,
- 0x0a, 0x3c, 0xa1, 0xaf, 0xf3, 0x42, 0x94, 0xb4, 0x93, 0x73, 0x64, 0xfc, 0x5d, 0x53, 0xe1, 0x84,
- 0x76, 0x4d, 0xda, 0xb7, 0xb2, 0x00, 0x61, 0x80, 0x9f, 0xbc, 0x9f, 0x81, 0xf3, 0xc1, 0x2c, 0x63,
- 0xf2, 0x4a, 0xc3, 0xb2, 0xa5, 0x9b, 0xdd, 0x89, 0x37, 0x32, 0x69, 0x33, 0x5c, 0x98, 0x9d, 0x8d,
- 0x34, 0x75, 0x98, 0x5e, 0x0b, 0x82, 0x50, 0xa2, 0xdd, 0x1e, 0xdb, 0x5b, 0x31, 0x5d, 0x35, 0xec,
- 0x52, 0xef, 0x04, 0x5c, 0x57, 0x3c, 0x52, 0x54, 0x5d, 0xfd, 0x10, 0x33, 0xc7, 0xa7, 0x60, 0x80,
- 0xa3, 0x7d, 0x2f, 0x0b, 0xe7, 0x52, 0x6a, 0x47, 0x5e, 0x82, 0x33, 0x2a, 0xc3, 0x11, 0xde, 0xeb,
- 0xcd, 0x84, 0xf7, 0x7a, 0x1b, 0x09, 0x1a, 0x0e, 0x71, 0x93, 0x37, 0x00, 0x74, 0xc3, 0xa0, 0x9e,
- 0xb7, 0xee, 0x34, 0x7d, 0xa7, 0xef, 0x45, 0xbe, 0xa9, 0x5c, 0x0a, 0x4a, 0x1f, 0x0d, 0x6a, 0x5f,
- 0x4c, 0x4b, 0x55, 0x25, 0xbe, 0x3e, 0x14, 0xc0, 0x08, 0x24, 0x79, 0x1d, 0x40, 0x5e, 0x34, 0x09,
- 0x0e, 0x5b, 0x3e, 0x26, 0x92, 0x3e, 0xef, 0x5f, 0x82, 0x98, 0xff, 0x7a, 0x5f, 0xb7, 0x99, 0xc9,
- 0xf6, 0xe4, 0xb9, 0xea, 0x7b, 0x01, 0x0a, 0x46, 0x10, 0xb5, 0xbf, 0xce, 0x42, 0xc9, 0x77, 0x46,
- 0x3f, 0x81, 0x5c, 0x49, 0x3b, 0x96, 0x2b, 0x19, 0xff, 0x66, 0xa1, 0x5f, 0xe5, 0x91, 0xd9, 0x11,
- 0x27, 0x91, 0x1d, 0xb9, 0x31, 0xb9, 0xaa, 0x83, 0xf3, 0x21, 0x3f, 0xc8, 0xc2, 0x29, 0x9f, 0x55,
- 0x9d, 0xe3, 0xfe, 0x32, 0xcc, 0xb8, 0x54, 0x6f, 0xd6, 0x75, 0x66, 0xec, 0x88, 0xee, 0x93, 0xa7,
- 0xb8, 0xcf, 0xee, 0x0f, 0x6a, 0x33, 0x18, 0x25, 0x60, 0x9c, 0x2f, 0xed, 0x00, 0x78, 0x76, 0xc2,
- 0x03, 0xe0, 0xb9, 0xa3, 0x1c, 0x00, 0x27, 0x3a, 0x54, 0x78, 0x8d, 0x36, 0xcd, 0x2e, 0x75, 0xfa,
- 0xfe, 0xaf, 0x0c, 0x8e, 0x7a, 0x78, 0x58, 0xac, 0xee, 0x18, 0xc2, 0x60, 0x14, 0x53, 0xfb, 0x87,
- 0x0c, 0x4c, 0x87, 0xed, 0x75, 0xe2, 0x19, 0xa3, 0x56, 0x3c, 0x63, 0xb4, 0x34, 0xf1, 0x70, 0x18,
- 0x91, 0x23, 0xfa, 0xbd, 0x62, 0xf8, 0x59, 0x22, 0x2b, 0xb4, 0x0d, 0xb3, 0x66, 0x6a, 0xa2, 0x24,
- 0x62, 0x6d, 0x82, 0x43, 0x70, 0x37, 0x47, 0x72, 0xe2, 0x01, 0x28, 0xa4, 0x0f, 0xa5, 0x5d, 0xea,
- 0x32, 0xd3, 0xa0, 0xfe, 0xf7, 0xdd, 0x98, 0xd8, 0x3b, 0x92, 0x07, 0x00, 0xc2, 0x36, 0xbd, 0xa7,
- 0x14, 0x60, 0xa0, 0x8a, 0x6c, 0x43, 0x81, 0x36, 0xdb, 0xd4, 0x3f, 0x3f, 0xff, 0xd5, 0x89, 0xae,
- 0x64, 0x84, 0xed, 0xc9, 0xdf, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x6f, 0xdf, 0xd5, 0x38,
- 0x1c, 0xdf, 0xd7, 0x09, 0x02, 0x01, 0xe1, 0x21, 0xd4, 0xa0, 0x08, 0x43, 0x3d, 0xa4, 0x13, 0x5c,
- 0x36, 0x29, 0x1c, 0x93, 0xf1, 0x38, 0xe0, 0xc2, 0x89, 0x07, 0xe5, 0x07, 0x3a, 0xa3, 0x6e, 0x57,
- 0x77, 0x3b, 0xca, 0xf1, 0x1f, 0xff, 0x0b, 0xef, 0xfb, 0x48, 0xe1, 0x17, 0x06, 0x45, 0x18, 0xea,
- 0x21, 0x0e, 0x94, 0x99, 0xf2, 0x64, 0xfd, 0xfb, 0x8a, 0xe3, 0x2b, 0xf5, 0x7d, 0x62, 0x4f, 0x06,
- 0xb6, 0x83, 0x57, 0x0c, 0x75, 0x68, 0x8f, 0x72, 0xa1, 0x79, 0xfc, 0xa4, 0x53, 0x84, 0x2f, 0xc4,
- 0x53, 0x84, 0x73, 0xc9, 0x14, 0x61, 0x22, 0x1a, 0x73, 0xf4, 0x24, 0xa1, 0x0e, 0x15, 0x4b, 0xf7,
- 0xd8, 0x56, 0xaf, 0xa9, 0x33, 0x15, 0x5f, 0xae, 0x2c, 0xfe, 0xff, 0xc3, 0x59, 0x2f, 0x6e, 0x0f,
- 0xc3, 0xa0, 0xcb, 0x5a, 0x08, 0x83, 0x51, 0x4c, 0x72, 0x15, 0x2a, 0xbb, 0x62, 0x46, 0xca, 0xdb,
- 0x14, 0x05, 0x61, 0xce, 0x85, 0x85, 0xbd, 0x17, 0x16, 0x63, 0x94, 0x87, 0x8b, 0x48, 0x4f, 0x40,
- 0x8a, 0x14, 0x43, 0x91, 0x46, 0x58, 0x8c, 0x51, 0x1e, 0x91, 0xab, 0x30, 0xed, 0x8e, 0x14, 0x98,
- 0x12, 0x02, 0x32, 0x57, 0xe1, 0x17, 0x62, 0x48, 0x27, 0x57, 0xa0, 0xd4, 0x6f, 0xb6, 0x24, 0x6f,
- 0x49, 0xf0, 0x0a, 0xff, 0x6b, 0x6b, 0x65, 0x55, 0xdd, 0xee, 0xf0, 0xa9, 0xda, 0x7f, 0x66, 0x80,
- 0x0c, 0x27, 0xb5, 0xc9, 0x0e, 0x14, 0x6d, 0x11, 0x55, 0x99, 0xf8, 0xbe, 0x75, 0x24, 0x38, 0x23,
- 0xe7, 0x98, 0x2a, 0x50, 0xf8, 0xc4, 0x86, 0x12, 0x7d, 0xc8, 0xa8, 0x6b, 0xeb, 0x96, 0x72, 0x3d,
- 0x8e, 0xe7, 0x6e, 0xb7, 0x74, 0x38, 0x15, 0x32, 0x06, 0x3a, 0xb4, 0x1f, 0x67, 0xa1, 0x12, 0xe1,
- 0x7b, 0xdc, 0x66, 0x45, 0x9c, 0x19, 0x95, 0xc1, 0x8c, 0x2d, 0xd7, 0x52, 0xc3, 0x34, 0x72, 0x66,
- 0x54, 0x91, 0x70, 0x0d, 0xa3, 0x7c, 0x64, 0x11, 0xa0, 0xab, 0x7b, 0x8c, 0xba, 0x62, 0x29, 0x49,
- 0x9c, 0xd4, 0x5c, 0x0f, 0x28, 0x18, 0xe1, 0x22, 0x97, 0xd5, 0xcd, 0xff, 0x7c, 0xfc, 0xd2, 0xd4,
- 0x88, 0x6b, 0xfd, 0x85, 0x63, 0xb8, 0xd6, 0x4f, 0xda, 0x70, 0xc6, 0xaf, 0xb5, 0x4f, 0x55, 0x76,
- 0xee, 0x90, 0xc0, 0xd2, 0x19, 0x4f, 0x40, 0xe0, 0x10, 0xa8, 0xf6, 0xc3, 0x0c, 0xcc, 0xc4, 0xb6,
- 0xd2, 0x7c, 0x6b, 0x17, 0x1e, 0xc9, 0x88, 0x6c, 0xed, 0x62, 0x27, 0x29, 0x9e, 0x87, 0xa2, 0x6c,
- 0x20, 0xd5, 0xf0, 0x81, 0x19, 0x91, 0x4d, 0x88, 0x8a, 0xca, 0x0d, 0x82, 0x0a, 0xd6, 0x25, 0x0d,
- 0x82, 0x8a, 0xe6, 0xa1, 0x4f, 0x27, 0x5f, 0x80, 0x92, 0x5f, 0x3b, 0xd5, 0xd2, 0xe1, 0x4f, 0x1f,
- 0x54, 0x39, 0x06, 0x1c, 0xda, 0xb7, 0x0b, 0x20, 0xff, 0x58, 0xc1, 0xe5, 0x9a, 0xa6, 0x27, 0xb3,
- 0x54, 0x19, 0x91, 0xa5, 0x0a, 0xe4, 0x56, 0x54, 0x39, 0x06, 0x1c, 0xe4, 0x22, 0xe4, 0xba, 0xa6,
- 0xad, 0xc2, 0x8a, 0x62, 0x57, 0xb9, 0x6e, 0xda, 0xc8, 0xcb, 0x04, 0x49, 0x7f, 0xa8, 0x12, 0x2d,
- 0x92, 0xa4, 0x3f, 0x44, 0x5e, 0xc6, 0x9d, 0x4b, 0xcb, 0x71, 0x3a, 0xdb, 0xba, 0xd1, 0xf1, 0x43,
- 0xdf, 0x79, 0x31, 0x7b, 0x85, 0x73, 0xb9, 0x16, 0x27, 0x61, 0x92, 0x97, 0x8b, 0x1b, 0x8e, 0x63,
- 0x35, 0x9d, 0x07, 0xb6, 0x2f, 0x5e, 0x08, 0xc5, 0x97, 0xe3, 0x24, 0x4c, 0xf2, 0x92, 0x2d, 0x78,
- 0xe6, 0x6d, 0xea, 0x3a, 0xaa, 0xc5, 0x1a, 0x16, 0xa5, 0x3d, 0x1f, 0x46, 0x1a, 0x28, 0x91, 0x15,
- 0x7a, 0x35, 0x9d, 0x05, 0x47, 0xc9, 0x8a, 0x64, 0x93, 0xee, 0xb6, 0x29, 0xdb, 0x70, 0x1d, 0xbe,
- 0x77, 0x32, 0xed, 0xb6, 0x0f, 0x3b, 0x15, 0xc2, 0x6e, 0xa6, 0xb3, 0xe0, 0x28, 0x59, 0xb2, 0x0e,
- 0x67, 0x25, 0x29, 0xe2, 0x33, 0x2b, 0x5b, 0x57, 0xdb, 0x1f, 0xd4, 0x3e, 0xb3, 0x42, 0x7b, 0x2e,
- 0x35, 0xb8, 0x81, 0xde, 0x4c, 0xb2, 0xe1, 0xb0, 0xa4, 0xf8, 0x8f, 0x94, 0x0a, 0xf7, 0x6e, 0x50,
- 0x57, 0x74, 0xb9, 0x88, 0x1d, 0x29, 0xc7, 0x1c, 0x13, 0x34, 0x1c, 0xe2, 0x26, 0xaf, 0x40, 0x35,
- 0x0a, 0xbb, 0xb4, 0xab, 0x9b, 0x96, 0xbe, 0x6d, 0x5a, 0x26, 0xdb, 0x13, 0xb9, 0xe2, 0x19, 0x19,
- 0x8c, 0xdc, 0x1c, 0xc1, 0x83, 0x23, 0xa5, 0xb5, 0xdf, 0xcf, 0x81, 0xf8, 0xe5, 0x10, 0xb9, 0x0f,
- 0x39, 0xcb, 0x69, 0x2b, 0x93, 0x3c, 0x7e, 0xa4, 0x63, 0xcd, 0x69, 0xcb, 0x81, 0xb7, 0xe6, 0xb4,
- 0x91, 0x23, 0x12, 0x03, 0x0a, 0x1d, 0xbd, 0xd5, 0xd1, 0x95, 0x05, 0x1e, 0xdf, 0xdf, 0x08, 0x12,
- 0x79, 0xea, 0x86, 0x28, 0x7f, 0x45, 0x89, 0xcd, 0x1d, 0x9b, 0x6d, 0xff, 0x1f, 0x22, 0x6a, 0xeb,
- 0x37, 0x41, 0x6c, 0xcc, 0x47, 0x92, 0xab, 0x60, 0xf0, 0x8a, 0xa1, 0x0e, 0x62, 0x40, 0xb1, 0xdf,
- 0x14, 0xbf, 0x7e, 0xca, 0x4f, 0xe8, 0xc5, 0x6c, 0xad, 0x88, 0x6f, 0x12, 0xeb, 0x97, 0x7c, 0x46,
- 0x05, 0xad, 0xfd, 0x79, 0x06, 0x66, 0x1a, 0x96, 0xd9, 0x34, 0xed, 0xf6, 0xc9, 0xdd, 0xc9, 0x25,
- 0x77, 0xa1, 0xe0, 0x59, 0x66, 0x93, 0x8e, 0x79, 0x59, 0x54, 0x74, 0x06, 0xaf, 0x25, 0x45, 0x89,
- 0xa3, 0xfd, 0x49, 0x1e, 0xd4, 0x7f, 0xb2, 0x48, 0x1f, 0xca, 0x6d, 0xff, 0xe6, 0xaa, 0xaa, 0xf2,
- 0xcb, 0x13, 0xdc, 0x70, 0x88, 0xdd, 0x81, 0x95, 0xbd, 0x13, 0x14, 0x62, 0xa8, 0x89, 0xd0, 0xf8,
- 0x98, 0x5b, 0x99, 0x70, 0xcc, 0x49, 0x75, 0xc3, 0xa3, 0x4e, 0x87, 0xfc, 0x0e, 0x63, 0xbd, 0x89,
- 0x0f, 0xe2, 0x86, 0x67, 0x6c, 0x65, 0x18, 0x8f, 0xbf, 0xa3, 0x80, 0xe6, 0x2a, 0x6c, 0xfd, 0x18,
- 0xae, 0xbf, 0x87, 0x21, 0x54, 0x15, 0x61, 0xd5, 0x99, 0x87, 0x02, 0x9a, 0xfc, 0x1a, 0x54, 0x98,
- 0xab, 0xdb, 0x5e, 0xcb, 0x71, 0xbb, 0xd4, 0x55, 0x8b, 0xff, 0xea, 0x04, 0xe3, 0x79, 0x33, 0x44,
- 0x93, 0x51, 0x8f, 0x58, 0x11, 0x46, 0xb5, 0x69, 0x5d, 0x50, 0x6e, 0x3b, 0x31, 0x62, 0xbf, 0x19,
- 0x90, 0x99, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e, 0x5d, 0xea, 0xff, 0x04,
- 0xb4, 0x7f, 0xca, 0x42, 0x6e, 0x73, 0xad, 0x21, 0xaf, 0x8a, 0x88, 0xbf, 0x6e, 0xd0, 0x46, 0xc7,
- 0xec, 0xdd, 0xa3, 0xae, 0xd9, 0xda, 0x53, 0x6b, 0x6f, 0xe4, 0xaa, 0x48, 0x92, 0x03, 0x53, 0xa4,
- 0xc8, 0x6b, 0x30, 0x6d, 0xe8, 0xcb, 0xd4, 0x65, 0xd2, 0x85, 0x39, 0x5a, 0xd4, 0x5c, 0x9c, 0x60,
- 0x58, 0x5e, 0x0a, 0xc5, 0x31, 0x06, 0x46, 0xb6, 0x00, 0x8c, 0x10, 0xfa, 0x48, 0x91, 0x74, 0xf9,
- 0x5f, 0x85, 0x10, 0x38, 0x02, 0x44, 0x10, 0xca, 0x1d, 0xce, 0x2a, 0x50, 0xf3, 0x47, 0x41, 0x15,
- 0x93, 0xee, 0xb6, 0x2f, 0x8b, 0x21, 0x8c, 0xf6, 0xef, 0x19, 0x08, 0x37, 0x81, 0xc4, 0x83, 0x62,
- 0x53, 0xdc, 0xda, 0x56, 0xd3, 0x7e, 0xfc, 0xcd, 0x74, 0xfc, 0x6f, 0x26, 0x75, 0xb2, 0x3f, 0xa8,
- 0x25, 0xfe, 0x70, 0x82, 0x4a, 0x15, 0x69, 0x43, 0xee, 0x4d, 0x67, 0x7b, 0xe2, 0x59, 0x1f, 0x39,
- 0xff, 0x23, 0x77, 0x4e, 0x91, 0x02, 0xe4, 0x1a, 0xb4, 0x6f, 0x67, 0xa1, 0x12, 0x19, 0xd3, 0x13,
- 0xff, 0x94, 0xe0, 0x61, 0xe2, 0xa7, 0x04, 0x1b, 0xe3, 0xef, 0xca, 0xc3, 0x5a, 0x9d, 0xf4, 0x7f,
- 0x09, 0xfe, 0x26, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80, 0x26, 0x4e, 0x4c,
- 0x85, 0x3f, 0x4c, 0x13, 0x23, 0x2d, 0x78, 0xc5, 0x50, 0x07, 0xd9, 0x81, 0xa9, 0xed, 0xbe, 0x69,
- 0x31, 0xd3, 0x9e, 0xf8, 0xd4, 0x99, 0xff, 0x0f, 0x07, 0x75, 0x5c, 0x46, 0xa2, 0xa2, 0x0f, 0x4f,
- 0xda, 0x30, 0xd5, 0x96, 0xd7, 0x40, 0xd4, 0xdc, 0x7b, 0x69, 0xfc, 0xd5, 0x4b, 0xe2, 0x48, 0x45,
- 0xea, 0x05, 0x7d, 0x74, 0xed, 0x9b, 0xa0, 0x16, 0x7f, 0xe2, 0x9d, 0x4c, 0x6b, 0x06, 0x81, 0xa1,
- 0xb4, 0x16, 0xd5, 0xfe, 0x23, 0x03, 0x71, 0x2b, 0xfd, 0xc9, 0x77, 0x6a, 0x27, 0xd9, 0xa9, 0x2b,
- 0xc7, 0x31, 0x07, 0xd2, 0xfb, 0x55, 0xfb, 0xab, 0x2c, 0x14, 0xd5, 0x9f, 0x44, 0x4f, 0x3e, 0xfb,
- 0x41, 0x63, 0xd9, 0x8f, 0xe5, 0x09, 0xff, 0xab, 0x38, 0x32, 0xf7, 0xd1, 0x4d, 0xe4, 0x3e, 0x26,
- 0xfd, 0x81, 0xe3, 0x63, 0x32, 0x1f, 0x7f, 0x97, 0x81, 0x53, 0x92, 0xf1, 0xa6, 0xed, 0x31, 0xdd,
- 0x36, 0x84, 0x53, 0x2c, 0x23, 0x51, 0x13, 0x87, 0xf6, 0x54, 0x18, 0x5a, 0xb8, 0xab, 0xf2, 0x19,
- 0x15, 0x34, 0xdf, 0x2c, 0xef, 0x38, 0x1e, 0x13, 0xe6, 0x36, 0x1b, 0xdf, 0x64, 0xbf, 0xac, 0xca,
- 0x31, 0xe0, 0x48, 0xee, 0xde, 0x0b, 0xa3, 0x77, 0xef, 0xda, 0x9f, 0x66, 0x60, 0x3a, 0xfa, 0xeb,
- 0xca, 0xf1, 0x13, 0x39, 0x89, 0x3c, 0x4a, 0xf6, 0x04, 0xf2, 0x28, 0x1f, 0x66, 0x00, 0xfc, 0xca,
- 0x9e, 0x78, 0x16, 0xa5, 0x19, 0xcf, 0xa2, 0x4c, 0xdc, 0xad, 0xe9, 0x39, 0x94, 0x1f, 0x14, 0xfc,
- 0x4f, 0x12, 0x19, 0x94, 0x77, 0x33, 0x70, 0x4a, 0x8f, 0x65, 0x25, 0x26, 0xf6, 0x24, 0x12, 0x49,
- 0x8e, 0xe0, 0x57, 0x9f, 0xf1, 0x72, 0x4c, 0xa8, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x42, 0xc5, 0x77,
- 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xd0, 0x30, 0xc6, 0xf9, 0x98, 0x2c, 0x50, 0xee, 0x58,
- 0xb2, 0x40, 0xd1, 0xa3, 0x66, 0xf9, 0x03, 0x8f, 0x9a, 0xd9, 0x50, 0x6e, 0xb9, 0x4e, 0x57, 0x24,
- 0x5a, 0xd4, 0x8f, 0x15, 0x27, 0x4c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1, 0x0a, 0xbe,
- 0x4c, 0x33, 0x47, 0x6a, 0x2b, 0x1e, 0x87, 0xb6, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4, 0xe1, 0xe3,
- 0xc9, 0x94, 0xa9, 0x4f, 0x26, 0x99, 0xa2, 0xfd, 0x63, 0xd6, 0xb7, 0x17, 0x8d, 0xc4, 0x9d, 0xa4,
- 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdd, 0xf0, 0x3c, 0x14, 0x5d, 0xaa, 0x7b, 0x8e,
- 0xad, 0xee, 0xa9, 0x07, 0xd6, 0x16, 0x45, 0x29, 0x2a, 0x6a, 0x34, 0x2d, 0x91, 0x7d, 0x4c, 0x5a,
- 0xe2, 0x0b, 0x91, 0x01, 0x21, 0xf3, 0xbf, 0xc1, 0xdc, 0x4e, 0x19, 0x14, 0x22, 0x66, 0xa9, 0xfe,
- 0xd7, 0x5f, 0x48, 0xc6, 0x2c, 0xd5, 0xbf, 0xf4, 0x03, 0x0e, 0xd2, 0x84, 0x69, 0x4b, 0xf7, 0x98,
- 0x88, 0x4a, 0x35, 0x97, 0xd8, 0x18, 0x39, 0x8f, 0x60, 0xda, 0xac, 0x45, 0x70, 0x30, 0x86, 0xaa,
- 0xfd, 0x6e, 0x06, 0xc2, 0x26, 0x3f, 0x62, 0x74, 0xf4, 0x15, 0x28, 0x75, 0xf5, 0x87, 0x2b, 0xd4,
- 0xd2, 0xf7, 0x26, 0xf9, 0xfb, 0xd5, 0xba, 0xc2, 0xc0, 0x00, 0x4d, 0x1b, 0x64, 0x40, 0xdd, 0xd8,
- 0x25, 0x14, 0x0a, 0x2d, 0xf3, 0xa1, 0xaa, 0xcf, 0x24, 0x9e, 0x4a, 0xe4, 0x7f, 0x6b, 0x32, 0xbe,
- 0x20, 0x0a, 0x50, 0xa2, 0x93, 0x2e, 0x4c, 0x79, 0x32, 0xfc, 0xa3, 0x3e, 0x65, 0xfc, 0x5d, 0x79,
- 0x2c, 0x8c, 0xa4, 0xae, 0xfb, 0xca, 0x22, 0xf4, 0x75, 0xd4, 0xe7, 0x3f, 0xf8, 0x78, 0xee, 0xa9,
- 0x0f, 0x3f, 0x9e, 0x7b, 0xea, 0xa3, 0x8f, 0xe7, 0x9e, 0xfa, 0xd6, 0xfe, 0x5c, 0xe6, 0x83, 0xfd,
- 0xb9, 0xcc, 0x87, 0xfb, 0x73, 0x99, 0x8f, 0xf6, 0xe7, 0x32, 0xff, 0xba, 0x3f, 0x97, 0xf9, 0x9d,
- 0x7f, 0x9b, 0x7b, 0xea, 0xd5, 0x92, 0x8f, 0xf9, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x4d, 0x1a,
- 0xd1, 0x0d, 0x1f, 0x64, 0x00, 0x00,
+ 0x42, 0x5a, 0xb1, 0x0a, 0x12, 0x12, 0x12, 0x02, 0x69, 0x25, 0x1e, 0xd8, 0x17, 0x78, 0x80, 0x27,
+ 0x14, 0x78, 0x80, 0x3c, 0x20, 0x11, 0x04, 0x6a, 0x11, 0xf3, 0xc4, 0x03, 0x68, 0xa5, 0x7d, 0x59,
+ 0x8d, 0x90, 0x40, 0xf7, 0xa3, 0x3e, 0xbb, 0xda, 0x63, 0x77, 0xdb, 0xd9, 0x89, 0x78, 0xab, 0xba,
+ 0xf7, 0x9c, 0xdf, 0xb9, 0x9f, 0xe7, 0x9e, 0x7b, 0xce, 0xbd, 0x17, 0x6e, 0xb4, 0x4d, 0xb6, 0xd3,
+ 0xdf, 0x9e, 0x37, 0x9c, 0xee, 0x82, 0xdd, 0xef, 0xea, 0x3d, 0xd7, 0x79, 0x53, 0x7c, 0xb4, 0x2c,
+ 0xe7, 0xc1, 0x42, 0xaf, 0xd3, 0x5e, 0xd0, 0x7b, 0xa6, 0x17, 0xa6, 0xec, 0x5e, 0xd5, 0xad, 0xde,
+ 0x8e, 0x7e, 0x75, 0xa1, 0x4d, 0x6d, 0xea, 0xea, 0x8c, 0x36, 0xe7, 0x7b, 0xae, 0xc3, 0x1c, 0xf2,
+ 0xe5, 0x10, 0x68, 0xde, 0x07, 0x9a, 0xf7, 0xd9, 0xe6, 0x7b, 0x9d, 0xf6, 0x3c, 0x07, 0x0a, 0x53,
+ 0x7c, 0xa0, 0xd9, 0x2f, 0x46, 0x4a, 0xd0, 0x76, 0xda, 0xce, 0x82, 0xc0, 0xdb, 0xee, 0xb7, 0xc4,
+ 0x9f, 0xf8, 0x11, 0x5f, 0x52, 0xce, 0xac, 0xd6, 0xb9, 0xe6, 0xcd, 0x9b, 0x0e, 0x2f, 0xd6, 0x82,
+ 0xe1, 0xb8, 0x74, 0x61, 0x77, 0xa8, 0x2c, 0xb3, 0x2f, 0x84, 0x34, 0x5d, 0xdd, 0xd8, 0x31, 0x6d,
+ 0xea, 0xee, 0xf9, 0x75, 0x59, 0x70, 0xa9, 0xe7, 0xf4, 0x5d, 0x83, 0x1e, 0x89, 0xcb, 0x5b, 0xe8,
+ 0x52, 0xa6, 0xa7, 0xc9, 0x5a, 0x18, 0xc5, 0xe5, 0xf6, 0x6d, 0x66, 0x76, 0x87, 0xc5, 0xfc, 0xfc,
+ 0xe3, 0x18, 0x3c, 0x63, 0x87, 0x76, 0xf5, 0x24, 0x9f, 0xf6, 0x2f, 0x65, 0x38, 0xb7, 0xb4, 0xed,
+ 0x31, 0x57, 0x37, 0xd8, 0x86, 0xd3, 0xdc, 0xa4, 0xdd, 0x9e, 0xa5, 0x33, 0x4a, 0x3a, 0x50, 0xe2,
+ 0x65, 0x6b, 0xea, 0x4c, 0xaf, 0x66, 0x2e, 0x67, 0xae, 0x54, 0x16, 0x97, 0xe6, 0xc7, 0xec, 0x8b,
+ 0xf9, 0x75, 0x05, 0x54, 0x9f, 0xde, 0x1f, 0xd4, 0x4a, 0xfe, 0x1f, 0x06, 0x02, 0xc8, 0xf7, 0x32,
+ 0x30, 0x6d, 0x3b, 0x4d, 0xda, 0xa0, 0x16, 0x35, 0x98, 0xe3, 0x56, 0xb3, 0x97, 0x73, 0x57, 0x2a,
+ 0x8b, 0xaf, 0x8f, 0x2d, 0x31, 0xa5, 0x46, 0xf3, 0x77, 0x22, 0x02, 0xae, 0xdb, 0xcc, 0xdd, 0xab,
+ 0x3f, 0xfd, 0xc1, 0xa0, 0xf6, 0xd4, 0xfe, 0xa0, 0x36, 0x1d, 0xcd, 0xc2, 0x58, 0x49, 0xc8, 0x16,
+ 0x54, 0x98, 0x63, 0xf1, 0x26, 0x33, 0x1d, 0xdb, 0xab, 0xe6, 0x44, 0xc1, 0xe6, 0xe6, 0x65, 0x6b,
+ 0x73, 0xf1, 0xf3, 0x7c, 0xb8, 0xcc, 0xef, 0x5e, 0x9d, 0xdf, 0x0c, 0xc8, 0xea, 0xe7, 0x14, 0x70,
+ 0x25, 0x4c, 0xf3, 0x30, 0x8a, 0x43, 0x28, 0x9c, 0xf6, 0xa8, 0xd1, 0x77, 0x4d, 0xb6, 0xb7, 0xec,
+ 0xd8, 0x8c, 0x3e, 0x64, 0xd5, 0xbc, 0x68, 0xe5, 0xe7, 0xd3, 0xa0, 0x37, 0x9c, 0x66, 0x23, 0x4e,
+ 0x5d, 0x3f, 0xb7, 0x3f, 0xa8, 0x9d, 0x4e, 0x24, 0x62, 0x12, 0x93, 0xd8, 0x70, 0xc6, 0xec, 0xea,
+ 0x6d, 0xba, 0xd1, 0xb7, 0xac, 0x06, 0x35, 0x5c, 0xca, 0xbc, 0x6a, 0x41, 0x54, 0xe1, 0x4a, 0x9a,
+ 0x9c, 0x35, 0xc7, 0xd0, 0xad, 0xbb, 0xdb, 0x6f, 0x52, 0x83, 0x21, 0x6d, 0x51, 0x97, 0xda, 0x06,
+ 0xad, 0x57, 0x55, 0x65, 0xce, 0xdc, 0x4c, 0x20, 0xe1, 0x10, 0x36, 0xb9, 0x01, 0x67, 0x7b, 0xae,
+ 0xe9, 0x88, 0x22, 0x58, 0xba, 0xe7, 0xdd, 0xd1, 0xbb, 0xb4, 0x5a, 0xbc, 0x9c, 0xb9, 0x52, 0xae,
+ 0x5f, 0x54, 0x30, 0x67, 0x37, 0x92, 0x04, 0x38, 0xcc, 0x43, 0xae, 0x40, 0xc9, 0x4f, 0xac, 0x4e,
+ 0x5d, 0xce, 0x5c, 0x29, 0xc8, 0xb1, 0xe3, 0xf3, 0x62, 0x90, 0x4b, 0x56, 0xa1, 0xa4, 0xb7, 0x5a,
+ 0xa6, 0xcd, 0x29, 0x4b, 0xa2, 0x09, 0x2f, 0xa5, 0x55, 0x6d, 0x49, 0xd1, 0x48, 0x1c, 0xff, 0x0f,
+ 0x03, 0x5e, 0x72, 0x0b, 0x88, 0x47, 0xdd, 0x5d, 0xd3, 0xa0, 0x4b, 0x86, 0xe1, 0xf4, 0x6d, 0x26,
+ 0xca, 0x5e, 0x16, 0x65, 0x9f, 0x55, 0x65, 0x27, 0x8d, 0x21, 0x0a, 0x4c, 0xe1, 0x22, 0x2f, 0xc1,
+ 0x19, 0x35, 0xed, 0xc2, 0x56, 0x00, 0x81, 0xf4, 0x34, 0x6f, 0x48, 0x4c, 0xe4, 0xe1, 0x10, 0x35,
+ 0x69, 0xc2, 0x25, 0xbd, 0xcf, 0x9c, 0x2e, 0x87, 0x8c, 0x0b, 0xdd, 0x74, 0x3a, 0xd4, 0xae, 0x56,
+ 0x2e, 0x67, 0xae, 0x94, 0xea, 0x97, 0xf7, 0x07, 0xb5, 0x4b, 0x4b, 0x07, 0xd0, 0xe1, 0x81, 0x28,
+ 0xe4, 0x2e, 0x94, 0x9b, 0xb6, 0xb7, 0xe1, 0x58, 0xa6, 0xb1, 0x57, 0x9d, 0x16, 0x05, 0xbc, 0xaa,
+ 0xaa, 0x5a, 0x5e, 0xb9, 0xd3, 0x90, 0x19, 0x8f, 0x06, 0xb5, 0x4b, 0xc3, 0xda, 0x71, 0x3e, 0xc8,
+ 0xc7, 0x10, 0x83, 0xac, 0x0b, 0xc0, 0x65, 0xc7, 0x6e, 0x99, 0xed, 0xea, 0x8c, 0xe8, 0x8d, 0xcb,
+ 0x23, 0x06, 0xf4, 0xca, 0x9d, 0x86, 0xa4, 0xab, 0xcf, 0x28, 0x71, 0xf2, 0x17, 0x43, 0x84, 0xd9,
+ 0x17, 0xe1, 0xec, 0xd0, 0xac, 0x25, 0x67, 0x20, 0xd7, 0xa1, 0x7b, 0x42, 0x29, 0x95, 0x91, 0x7f,
+ 0x92, 0xa7, 0xa1, 0xb0, 0xab, 0x5b, 0x7d, 0x5a, 0xcd, 0x8a, 0x34, 0xf9, 0xf3, 0x0b, 0xd9, 0x6b,
+ 0x19, 0x6d, 0x50, 0x86, 0x53, 0xbe, 0x2e, 0xb8, 0x47, 0x5d, 0x46, 0x1f, 0x92, 0xcb, 0x90, 0xb7,
+ 0x79, 0x7f, 0x08, 0xfe, 0xfa, 0xb4, 0xaa, 0x6e, 0x5e, 0xf4, 0x83, 0xc8, 0x21, 0x06, 0x14, 0xa5,
+ 0x2e, 0x17, 0x78, 0x95, 0xc5, 0x17, 0xc7, 0x56, 0x43, 0x0d, 0x01, 0x53, 0x87, 0xfd, 0x41, 0xad,
+ 0x28, 0xbf, 0x51, 0x41, 0x93, 0xd7, 0x20, 0xef, 0x99, 0x76, 0xa7, 0x9a, 0x13, 0x22, 0xbe, 0x3a,
+ 0xbe, 0x08, 0xd3, 0xee, 0xd4, 0x4b, 0xbc, 0x06, 0xfc, 0x0b, 0x05, 0x28, 0xb9, 0x0f, 0xb9, 0x7e,
+ 0xb3, 0xa5, 0x34, 0xca, 0x2f, 0x8d, 0x8d, 0xbd, 0xb5, 0xb2, 0x5a, 0x9f, 0xda, 0x1f, 0xd4, 0x72,
+ 0x5b, 0x2b, 0xab, 0xc8, 0x11, 0xc9, 0x77, 0x33, 0x70, 0xd6, 0x70, 0x6c, 0xa6, 0xf3, 0xf5, 0xc5,
+ 0xd7, 0xac, 0xd5, 0x82, 0x90, 0x73, 0x6b, 0x6c, 0x39, 0xcb, 0x49, 0xc4, 0xfa, 0x79, 0xae, 0x28,
+ 0x86, 0x92, 0x71, 0x58, 0x36, 0xf9, 0x7e, 0x06, 0xce, 0xf3, 0x09, 0x3c, 0x44, 0x2c, 0xd4, 0xce,
+ 0xf1, 0x96, 0xea, 0xe2, 0xfe, 0xa0, 0x76, 0xfe, 0x66, 0x9a, 0x30, 0x4c, 0x2f, 0x03, 0x2f, 0xdd,
+ 0x39, 0x7d, 0x78, 0x2d, 0x12, 0x2a, 0xad, 0xb2, 0xb8, 0x76, 0x9c, 0xeb, 0x5b, 0xfd, 0x33, 0x6a,
+ 0x28, 0xa7, 0x2d, 0xe7, 0x98, 0x56, 0x0a, 0x72, 0x1d, 0xa6, 0x76, 0x1d, 0xab, 0xdf, 0xa5, 0x5e,
+ 0xb5, 0x24, 0x16, 0x85, 0xd9, 0xb4, 0xb9, 0x7a, 0x4f, 0x90, 0xd4, 0x4f, 0x2b, 0xf8, 0x29, 0xf9,
+ 0xef, 0xa1, 0xcf, 0x4b, 0x4c, 0x28, 0x5a, 0x66, 0xd7, 0x64, 0x9e, 0xd0, 0x96, 0x95, 0xc5, 0xeb,
+ 0x63, 0x57, 0x4b, 0x4e, 0xd1, 0x35, 0x01, 0x26, 0x67, 0x8d, 0xfc, 0x46, 0x25, 0x80, 0x18, 0x50,
+ 0xf0, 0x0c, 0xdd, 0x92, 0xda, 0xb4, 0xb2, 0xf8, 0xb5, 0xf1, 0xa7, 0x0d, 0x47, 0xa9, 0xcf, 0xa8,
+ 0x3a, 0x15, 0xc4, 0x2f, 0x4a, 0x6c, 0xf2, 0x2b, 0x70, 0x2a, 0xd6, 0x9b, 0x5e, 0xb5, 0x22, 0x5a,
+ 0xe7, 0xd9, 0xb4, 0xd6, 0x09, 0xa8, 0xea, 0x17, 0x14, 0xd8, 0xa9, 0xd8, 0x08, 0xf1, 0x30, 0x01,
+ 0x46, 0x6e, 0x43, 0xc9, 0x33, 0x9b, 0xd4, 0xd0, 0x5d, 0xaf, 0x3a, 0x7d, 0x18, 0xe0, 0x33, 0x0a,
+ 0xb8, 0xd4, 0x50, 0x6c, 0x18, 0x00, 0x68, 0xf7, 0x61, 0x66, 0xa9, 0xcf, 0x76, 0x1c, 0xd7, 0x7c,
+ 0x5b, 0x58, 0x16, 0x64, 0x15, 0x0a, 0x4c, 0xac, 0x10, 0xd2, 0x68, 0x7b, 0x2e, 0x0d, 0x5a, 0xae,
+ 0xd6, 0xb7, 0xe9, 0x9e, 0xaf, 0x58, 0xeb, 0x65, 0xde, 0x08, 0x72, 0xc5, 0x90, 0xec, 0xda, 0x1f,
+ 0x66, 0xa0, 0x5c, 0xd7, 0x3d, 0xd3, 0xe0, 0xf0, 0x64, 0x19, 0xf2, 0x7d, 0x8f, 0xba, 0x47, 0x03,
+ 0x15, 0x5a, 0x69, 0xcb, 0xa3, 0x2e, 0x0a, 0x66, 0x72, 0x17, 0x4a, 0x3d, 0xdd, 0xf3, 0x1e, 0x38,
+ 0x6e, 0x53, 0x69, 0xd6, 0x43, 0x02, 0xc9, 0xa5, 0x5f, 0xb1, 0x62, 0x00, 0xa2, 0x55, 0xa0, 0x5c,
+ 0xb7, 0x74, 0xa3, 0xb3, 0xe3, 0x58, 0x54, 0x7b, 0x15, 0x8a, 0xf5, 0x7e, 0xab, 0x45, 0xdd, 0x43,
+ 0x68, 0xf8, 0x79, 0xc8, 0xb3, 0xbd, 0x9e, 0x5a, 0x2f, 0x82, 0xd5, 0x3d, 0xbf, 0xb9, 0xd7, 0xa3,
+ 0x8f, 0x06, 0x35, 0x90, 0x38, 0xfc, 0x0f, 0x05, 0x9d, 0xf6, 0xe3, 0x0c, 0x9c, 0x93, 0x89, 0x6a,
+ 0x15, 0x95, 0xeb, 0x13, 0xa1, 0x50, 0x70, 0x69, 0xd3, 0xf4, 0x54, 0xbb, 0xac, 0x8c, 0x3d, 0x1c,
+ 0x91, 0xa3, 0xa8, 0xe5, 0x50, 0xf4, 0x85, 0x48, 0x40, 0x89, 0x4e, 0xfa, 0x50, 0x7e, 0x93, 0x32,
+ 0x8f, 0xb9, 0x54, 0xef, 0xaa, 0x96, 0x7b, 0x79, 0x6c, 0x51, 0xb7, 0x28, 0x6b, 0x08, 0xa4, 0xe8,
+ 0xea, 0x1b, 0x24, 0x62, 0x28, 0x49, 0xfb, 0x49, 0x1e, 0xca, 0xc1, 0x28, 0x24, 0x9f, 0x83, 0x82,
+ 0x30, 0xf7, 0x54, 0xb3, 0x06, 0x53, 0x47, 0x58, 0x85, 0x28, 0xf3, 0xc8, 0x73, 0x30, 0x65, 0x38,
+ 0xdd, 0xae, 0x6e, 0x37, 0x85, 0x09, 0x5f, 0xae, 0x57, 0xb8, 0xc6, 0x58, 0x96, 0x49, 0xe8, 0xe7,
+ 0x91, 0x4b, 0x90, 0xd7, 0xdd, 0xb6, 0xb4, 0xa6, 0xcb, 0x72, 0x9c, 0x2c, 0xb9, 0x6d, 0x0f, 0x45,
+ 0x2a, 0xf9, 0x0a, 0xe4, 0xa8, 0xbd, 0x5b, 0xcd, 0x8f, 0x56, 0x49, 0xd7, 0xed, 0xdd, 0x7b, 0xba,
+ 0x5b, 0xaf, 0xa8, 0x32, 0xe4, 0xae, 0xdb, 0xbb, 0xc8, 0x79, 0xc8, 0x1a, 0x4c, 0x51, 0x7b, 0x77,
+ 0xd5, 0x75, 0xba, 0xca, 0xcc, 0xfd, 0xec, 0x08, 0x76, 0x4e, 0xa2, 0x56, 0xe7, 0x40, 0xb1, 0xa9,
+ 0x64, 0xf4, 0x21, 0xc8, 0x37, 0x60, 0x5a, 0xea, 0xb8, 0x75, 0x6e, 0x32, 0x79, 0xd5, 0xa2, 0x80,
+ 0xac, 0x8d, 0x56, 0x92, 0x82, 0x2e, 0xdc, 0x56, 0x44, 0x12, 0x3d, 0x8c, 0x41, 0x91, 0x6f, 0x40,
+ 0xd9, 0xdf, 0x31, 0x7a, 0x6a, 0x35, 0x48, 0xb5, 0xc8, 0x51, 0x11, 0x21, 0x7d, 0xab, 0x6f, 0xba,
+ 0xb4, 0x4b, 0x6d, 0xe6, 0xd5, 0xcf, 0xfa, 0x36, 0x9a, 0x9f, 0xeb, 0x61, 0x88, 0x46, 0xb6, 0x87,
+ 0xb7, 0x16, 0xd2, 0x2e, 0xfe, 0xdc, 0x88, 0xd9, 0x36, 0xc6, 0xbe, 0xe2, 0x75, 0x38, 0x1d, 0xd8,
+ 0xfe, 0xca, 0x7c, 0x94, 0x96, 0xf2, 0x0b, 0x9c, 0xfd, 0x66, 0x3c, 0xeb, 0xd1, 0xa0, 0xf6, 0x6c,
+ 0x8a, 0x01, 0x19, 0x12, 0x60, 0x12, 0x4c, 0xfb, 0xab, 0x1c, 0x0c, 0x2f, 0xff, 0xf1, 0x46, 0xcb,
+ 0x1c, 0x77, 0xa3, 0x25, 0x2b, 0x24, 0x95, 0xc3, 0x35, 0xc5, 0x36, 0x79, 0xa5, 0xd2, 0x3a, 0x26,
+ 0x77, 0xdc, 0x1d, 0xf3, 0xa4, 0xcc, 0x1d, 0xed, 0xbd, 0x3c, 0x9c, 0x5a, 0xd1, 0x69, 0xd7, 0xb1,
+ 0x1f, 0x6b, 0x0c, 0x65, 0x9e, 0x08, 0x63, 0xe8, 0x0a, 0x94, 0x5c, 0xda, 0xb3, 0x4c, 0x43, 0xf7,
+ 0x44, 0xd7, 0xab, 0x1d, 0x27, 0xaa, 0x34, 0x0c, 0x72, 0x47, 0x18, 0xc1, 0xb9, 0x27, 0xd2, 0x08,
+ 0xce, 0xff, 0xf4, 0x8d, 0x60, 0xed, 0xfd, 0x1c, 0xe4, 0xaf, 0x37, 0xdb, 0x94, 0x2f, 0xcc, 0x2d,
+ 0x3e, 0xbc, 0x12, 0x0b, 0xb3, 0x18, 0x38, 0x22, 0x87, 0xcc, 0x42, 0x96, 0x39, 0x6a, 0xe6, 0x81,
+ 0xca, 0xcf, 0x6e, 0x3a, 0x98, 0x65, 0x0e, 0x79, 0x1b, 0xc0, 0x70, 0xec, 0xa6, 0xe9, 0x3b, 0x62,
+ 0x26, 0xab, 0xd8, 0xaa, 0xe3, 0x3e, 0xd0, 0xdd, 0xe6, 0x72, 0x80, 0x58, 0x3f, 0xb5, 0x3f, 0xa8,
+ 0x41, 0xf8, 0x8f, 0x11, 0x69, 0xa4, 0x1d, 0x98, 0xb8, 0xb2, 0x41, 0x97, 0xc7, 0x96, 0xcb, 0x1b,
+ 0xe2, 0x00, 0x03, 0xf7, 0x2a, 0x54, 0x7a, 0xba, 0xab, 0x5b, 0x16, 0xb5, 0x4c, 0xaf, 0x2b, 0x76,
+ 0x56, 0x85, 0xfa, 0xe9, 0xfd, 0x41, 0xad, 0xb2, 0x11, 0x26, 0x63, 0x94, 0x86, 0xbc, 0x08, 0x45,
+ 0xc7, 0x5e, 0xed, 0x5b, 0x96, 0x72, 0xb4, 0xfc, 0x3f, 0x0e, 0x7b, 0x57, 0xa4, 0x3c, 0x1a, 0xd4,
+ 0x2e, 0x4a, 0xbb, 0x85, 0xff, 0xdd, 0x77, 0x4d, 0x66, 0xda, 0xed, 0x06, 0x73, 0x75, 0x46, 0xdb,
+ 0x7b, 0xa8, 0xd8, 0xb4, 0xdf, 0xce, 0x00, 0x84, 0xc5, 0x22, 0x5f, 0x85, 0xd3, 0xdb, 0x82, 0x67,
+ 0x5d, 0x7f, 0xb8, 0x46, 0xed, 0x36, 0xdb, 0x11, 0x1d, 0x96, 0x97, 0x1a, 0xa8, 0x1e, 0xcf, 0xc2,
+ 0x24, 0x2d, 0x79, 0x09, 0xce, 0xc8, 0xa4, 0x2d, 0x4f, 0x57, 0x98, 0xa2, 0x43, 0x67, 0xa4, 0xef,
+ 0xa3, 0x9e, 0xc8, 0xc3, 0x21, 0x6a, 0x4d, 0x87, 0xca, 0xaa, 0xf9, 0x90, 0x36, 0xef, 0x9b, 0x76,
+ 0xd3, 0x79, 0x40, 0x10, 0x8a, 0x56, 0x58, 0x8c, 0xca, 0xe2, 0x7c, 0x44, 0x2d, 0x05, 0xae, 0xce,
+ 0xb0, 0xc9, 0xbb, 0x94, 0xe9, 0x5c, 0x51, 0xad, 0xf4, 0x95, 0x33, 0x4e, 0x36, 0xb3, 0x2c, 0xad,
+ 0x42, 0xd2, 0x5e, 0x80, 0xb3, 0x43, 0x03, 0x80, 0xd4, 0xa0, 0xd0, 0xa1, 0x7b, 0x37, 0xb9, 0xe9,
+ 0xcc, 0xcd, 0x12, 0x61, 0x87, 0xdd, 0xe6, 0x09, 0x28, 0xd3, 0xb5, 0xff, 0xce, 0x40, 0x69, 0xb5,
+ 0x6f, 0x1b, 0xc2, 0xd0, 0x7e, 0xbc, 0x95, 0xe9, 0x5b, 0x39, 0xd9, 0x54, 0x2b, 0xa7, 0x0f, 0xc5,
+ 0xce, 0x83, 0xc0, 0x0a, 0xaa, 0x2c, 0xae, 0x8f, 0x3f, 0x94, 0x55, 0x91, 0xe6, 0x6f, 0x0b, 0x3c,
+ 0xe9, 0xdb, 0x3c, 0xa5, 0x0a, 0x54, 0xbc, 0x7d, 0x5f, 0x08, 0x55, 0xc2, 0x66, 0xbf, 0x02, 0x95,
+ 0x08, 0xd9, 0x91, 0x9c, 0x29, 0x3f, 0xc9, 0xc0, 0xe9, 0x1b, 0xd2, 0x7d, 0xec, 0xb8, 0x72, 0x01,
+ 0x20, 0x17, 0x21, 0xe7, 0xf6, 0xfa, 0x82, 0x3f, 0x27, 0x7d, 0x05, 0xb8, 0xb1, 0x85, 0x3c, 0x8d,
+ 0xbc, 0x02, 0xa5, 0xa6, 0xea, 0x03, 0x65, 0xb4, 0x1e, 0xb5, 0xe7, 0x84, 0x02, 0xf6, 0xff, 0x30,
+ 0x40, 0xe3, 0x56, 0x66, 0xd7, 0x6b, 0x37, 0xcc, 0xb7, 0xa5, 0xd6, 0x2d, 0x48, 0x2b, 0x73, 0x5d,
+ 0x26, 0xa1, 0x9f, 0xc7, 0x35, 0x7a, 0x87, 0xee, 0x2d, 0x73, 0x83, 0x4b, 0x4c, 0x5b, 0xa5, 0xd1,
+ 0x6f, 0xab, 0x34, 0x0c, 0x72, 0x79, 0xcf, 0xcb, 0x3a, 0x17, 0xc4, 0x40, 0x17, 0x3d, 0x7f, 0x8f,
+ 0x27, 0xa8, 0xea, 0x6b, 0xdf, 0xcd, 0xc2, 0x85, 0x1b, 0x94, 0xc9, 0x05, 0x6d, 0x85, 0xf6, 0x2c,
+ 0x67, 0x8f, 0x5b, 0x15, 0x48, 0xdf, 0x22, 0x2f, 0x01, 0x98, 0xde, 0x76, 0x63, 0xd7, 0xe0, 0xfb,
+ 0x05, 0x35, 0x1a, 0x2e, 0xab, 0xc6, 0x87, 0x9b, 0x8d, 0xba, 0xca, 0x79, 0x14, 0xfb, 0xc3, 0x08,
+ 0x4f, 0x68, 0x59, 0x67, 0x0f, 0xb0, 0xac, 0x1b, 0x00, 0xbd, 0xd0, 0x36, 0xc9, 0x09, 0xca, 0x9f,
+ 0xf3, 0xc5, 0x1c, 0xc5, 0x2c, 0x89, 0xc0, 0x4c, 0x60, 0x2d, 0x68, 0x7f, 0x91, 0x83, 0xd9, 0x1b,
+ 0x94, 0x05, 0x1b, 0x07, 0xb5, 0x31, 0x6a, 0xf4, 0xa8, 0xc1, 0x5b, 0xe5, 0xdd, 0x0c, 0x14, 0x2d,
+ 0x7d, 0x9b, 0x5a, 0x9e, 0x98, 0x4d, 0x95, 0xc5, 0x37, 0xc6, 0x1e, 0xde, 0xa3, 0xa5, 0xcc, 0xaf,
+ 0x09, 0x09, 0x89, 0x01, 0x2f, 0x13, 0x51, 0x89, 0x27, 0x5f, 0x82, 0x8a, 0x61, 0xf5, 0x3d, 0x46,
+ 0xdd, 0x0d, 0xc7, 0x65, 0x6a, 0x69, 0x0f, 0x1c, 0xf4, 0xcb, 0x61, 0x16, 0x46, 0xe9, 0xc8, 0x22,
+ 0x80, 0x61, 0x99, 0xd4, 0x66, 0x82, 0x4b, 0x0e, 0x33, 0xe2, 0xb7, 0xf7, 0x72, 0x90, 0x83, 0x11,
+ 0x2a, 0x2e, 0xaa, 0xeb, 0xd8, 0x26, 0x73, 0xa4, 0xa8, 0x7c, 0x5c, 0xd4, 0x7a, 0x98, 0x85, 0x51,
+ 0x3a, 0xc1, 0x46, 0x99, 0x6b, 0x1a, 0x9e, 0x60, 0x2b, 0x24, 0xd8, 0xc2, 0x2c, 0x8c, 0xd2, 0xf1,
+ 0x99, 0x1c, 0xa9, 0xff, 0x91, 0x66, 0xf2, 0x5f, 0x96, 0x60, 0x2e, 0xd6, 0xac, 0x4c, 0x67, 0xb4,
+ 0xd5, 0xb7, 0x1a, 0x94, 0xf9, 0x1d, 0xf8, 0x25, 0xa8, 0x28, 0xc7, 0xf6, 0x9d, 0x50, 0xcb, 0x05,
+ 0x85, 0x6a, 0x84, 0x59, 0x18, 0xa5, 0x23, 0xbf, 0x15, 0xf6, 0xbb, 0x8c, 0xe1, 0x18, 0xc7, 0xd3,
+ 0xef, 0x43, 0x05, 0x3c, 0x54, 0xdf, 0x2f, 0x40, 0xd9, 0xd6, 0x99, 0x27, 0x26, 0x92, 0x9a, 0x33,
+ 0xc1, 0x36, 0xe0, 0x8e, 0x9f, 0x81, 0x21, 0x0d, 0xd9, 0x80, 0xa7, 0x55, 0x13, 0x5f, 0x7f, 0xd8,
+ 0x73, 0x5c, 0x46, 0x5d, 0xc9, 0x9b, 0x17, 0xbc, 0x97, 0x14, 0xef, 0xd3, 0xeb, 0x29, 0x34, 0x98,
+ 0xca, 0x49, 0xd6, 0xe1, 0x9c, 0x21, 0xfd, 0xda, 0xd4, 0x72, 0xf4, 0xa6, 0x0f, 0x58, 0x10, 0x80,
+ 0x81, 0x95, 0xba, 0x3c, 0x4c, 0x82, 0x69, 0x7c, 0xc9, 0xd1, 0x5c, 0x1c, 0x6b, 0x34, 0x4f, 0x8d,
+ 0x33, 0x9a, 0x4b, 0xe3, 0x8d, 0xe6, 0xf2, 0xe1, 0x46, 0x33, 0x6f, 0x79, 0x3e, 0x8e, 0xa8, 0xbb,
+ 0xd4, 0x67, 0x3b, 0xd2, 0x05, 0x14, 0x09, 0x9b, 0x04, 0x2d, 0xdf, 0x48, 0xa1, 0xc1, 0x54, 0x4e,
+ 0xb2, 0x0d, 0xb3, 0x32, 0xfd, 0xba, 0x6d, 0xb8, 0x7b, 0x3d, 0xbe, 0x72, 0x44, 0x70, 0x2b, 0x02,
+ 0x57, 0x53, 0xb8, 0xb3, 0x8d, 0x91, 0x94, 0x78, 0x00, 0x0a, 0xf9, 0x45, 0x98, 0x91, 0xbd, 0xb4,
+ 0xae, 0xf7, 0x04, 0xac, 0x0c, 0xa2, 0x9c, 0x57, 0xb0, 0x33, 0xcb, 0xd1, 0x4c, 0x8c, 0xd3, 0x92,
+ 0x25, 0x38, 0xdd, 0xdb, 0x35, 0xf8, 0xe7, 0xcd, 0xd6, 0x1d, 0x4a, 0x9b, 0xb4, 0x29, 0x42, 0x26,
+ 0xe5, 0xfa, 0x33, 0xfe, 0x9e, 0x73, 0x23, 0x9e, 0x8d, 0x49, 0x7a, 0x72, 0x0d, 0xa6, 0x3d, 0xa6,
+ 0xbb, 0x4c, 0x79, 0x58, 0xaa, 0xa7, 0x64, 0x90, 0xc9, 0x77, 0x40, 0x34, 0x22, 0x79, 0x18, 0xa3,
+ 0x9c, 0x44, 0x7b, 0x3c, 0x92, 0x8b, 0xa1, 0x70, 0x51, 0x25, 0xd4, 0xfe, 0x3b, 0x49, 0xb5, 0xff,
+ 0xda, 0x24, 0xd3, 0x3f, 0x45, 0xc2, 0xa1, 0xa6, 0xfd, 0x2d, 0x20, 0xae, 0x72, 0xa8, 0xc9, 0xad,
+ 0x48, 0x44, 0xf3, 0x07, 0xa1, 0x3c, 0x1c, 0xa2, 0xc0, 0x14, 0x2e, 0xd2, 0x80, 0xf3, 0x1e, 0xb5,
+ 0x99, 0x69, 0x53, 0x2b, 0x0e, 0x27, 0x97, 0x84, 0x67, 0x15, 0xdc, 0xf9, 0x46, 0x1a, 0x11, 0xa6,
+ 0xf3, 0x4e, 0xd2, 0xf8, 0xff, 0x5a, 0x16, 0xeb, 0xae, 0x6c, 0x9a, 0x63, 0x53, 0xdb, 0xef, 0x26,
+ 0xd5, 0xf6, 0x1b, 0x93, 0xf7, 0xdb, 0x78, 0x2a, 0x7b, 0x11, 0x40, 0xf4, 0x42, 0x54, 0x67, 0x07,
+ 0x9a, 0x0a, 0x83, 0x1c, 0x8c, 0x50, 0xf1, 0x59, 0xe8, 0xb7, 0x73, 0x54, 0x5d, 0x07, 0xb3, 0xb0,
+ 0x11, 0xcd, 0xc4, 0x38, 0xed, 0x48, 0x95, 0x5f, 0x18, 0x5b, 0xe5, 0xdf, 0x02, 0x12, 0xdb, 0x08,
+ 0x4b, 0xbc, 0x62, 0x3c, 0x92, 0x7c, 0x73, 0x88, 0x02, 0x53, 0xb8, 0x46, 0x0c, 0xe5, 0xa9, 0xe3,
+ 0x1d, 0xca, 0xa5, 0xf1, 0x87, 0x32, 0x79, 0x03, 0x2e, 0x0a, 0x51, 0xaa, 0x7d, 0xe2, 0xc0, 0x52,
+ 0xf9, 0x7f, 0x56, 0x01, 0x5f, 0xc4, 0x51, 0x84, 0x38, 0x1a, 0x83, 0xf7, 0x8f, 0xe1, 0xd2, 0x26,
+ 0x17, 0xae, 0x5b, 0xa3, 0x17, 0x86, 0xe5, 0x14, 0x1a, 0x4c, 0xe5, 0xe4, 0x43, 0x8c, 0xf1, 0x61,
+ 0xa8, 0x6f, 0x5b, 0xb4, 0xa9, 0x22, 0xe9, 0xc1, 0x10, 0xdb, 0x5c, 0x6b, 0xa8, 0x1c, 0x8c, 0x50,
+ 0xa5, 0xe9, 0xea, 0xe9, 0x23, 0xea, 0xea, 0x1b, 0xc2, 0x6b, 0xd4, 0x8a, 0x2d, 0x09, 0x4a, 0xe1,
+ 0x07, 0x67, 0x23, 0x96, 0x93, 0x04, 0x38, 0xcc, 0x23, 0x96, 0x4a, 0xc3, 0x35, 0x7b, 0xcc, 0x8b,
+ 0x63, 0x9d, 0x4a, 0x2c, 0x95, 0x29, 0x34, 0x98, 0xca, 0xc9, 0x8d, 0x94, 0x1d, 0xaa, 0x5b, 0x6c,
+ 0x27, 0x0e, 0x78, 0x3a, 0x6e, 0xa4, 0xbc, 0x3c, 0x4c, 0x82, 0x69, 0x7c, 0x93, 0xa8, 0xb7, 0xef,
+ 0x64, 0xe1, 0xdc, 0x0d, 0xaa, 0x62, 0xf5, 0x1b, 0x4e, 0xd3, 0xd7, 0x6b, 0xff, 0x47, 0x77, 0x59,
+ 0xef, 0x64, 0x61, 0xea, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x3d, 0xd2, 0x86, 0xe2, 0x03, 0xe1, 0x11,
+ 0x51, 0x7e, 0x90, 0xf1, 0x8f, 0x25, 0x48, 0xc7, 0x4a, 0xa8, 0x82, 0xe5, 0x3f, 0x2a, 0x78, 0xde,
+ 0x52, 0x1d, 0xba, 0x47, 0x65, 0x90, 0xae, 0x14, 0xb6, 0xd4, 0x6d, 0x9e, 0x88, 0x32, 0x8f, 0xbc,
+ 0x09, 0x53, 0x1e, 0x73, 0x5c, 0x5f, 0x49, 0x4f, 0xe2, 0x12, 0xdb, 0xa8, 0x7f, 0xbd, 0x21, 0xa1,
+ 0xe4, 0x46, 0x5e, 0xfd, 0xa0, 0x2f, 0x40, 0x7b, 0x3f, 0x03, 0xf0, 0xf2, 0xe6, 0xe6, 0x86, 0xf2,
+ 0x39, 0x34, 0x21, 0xaf, 0xf7, 0x03, 0x77, 0xd0, 0xea, 0xf8, 0x7e, 0xe3, 0x68, 0xe0, 0x54, 0xf9,
+ 0x67, 0xfa, 0x6c, 0x07, 0x05, 0x3a, 0xf9, 0x3c, 0x4c, 0xa9, 0x15, 0x52, 0xb5, 0x43, 0xe0, 0xeb,
+ 0x56, 0xab, 0x28, 0xfa, 0xf9, 0xda, 0x8f, 0xb2, 0x70, 0xe1, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4,
+ 0x17, 0x8b, 0x13, 0x92, 0x5f, 0x1d, 0x3a, 0x46, 0xf7, 0xb3, 0x87, 0x73, 0x82, 0xc8, 0x53, 0x58,
+ 0xeb, 0x94, 0xe9, 0xa1, 0x6e, 0x0a, 0xd3, 0x22, 0x67, 0xe7, 0xfa, 0x90, 0xf7, 0x7a, 0xd4, 0x50,
+ 0x2e, 0x96, 0xc6, 0xd8, 0xad, 0x91, 0x5e, 0x01, 0x3e, 0xff, 0x42, 0xe7, 0x96, 0x98, 0x8d, 0x42,
+ 0x1c, 0xf9, 0x26, 0x14, 0x3d, 0xa6, 0xb3, 0xbe, 0xef, 0x89, 0xdd, 0x3a, 0x6e, 0xc1, 0x02, 0x3c,
+ 0x1c, 0xa3, 0xf2, 0x1f, 0x95, 0x50, 0xed, 0x47, 0x19, 0x98, 0x4d, 0x67, 0x5c, 0x33, 0x3d, 0x46,
+ 0x7e, 0x79, 0xa8, 0xd9, 0x0f, 0xe9, 0x7b, 0xe2, 0xdc, 0xa2, 0xd1, 0x83, 0xa0, 0xbb, 0x9f, 0x12,
+ 0x69, 0x72, 0x06, 0x05, 0x93, 0xd1, 0xae, 0x6f, 0x2b, 0xdd, 0x3d, 0xe6, 0xaa, 0x47, 0x74, 0x13,
+ 0x97, 0x82, 0x52, 0x98, 0xf6, 0x5e, 0x76, 0x54, 0x95, 0x79, 0xb7, 0x10, 0x2b, 0x1e, 0x8b, 0xbe,
+ 0x3d, 0x59, 0x2c, 0x3a, 0x5e, 0xa0, 0xe1, 0x90, 0xf4, 0xaf, 0x0f, 0x87, 0xa4, 0xef, 0x4e, 0x1e,
+ 0x92, 0x4e, 0x34, 0xc3, 0xc8, 0xc8, 0xf4, 0x77, 0x72, 0x70, 0xe9, 0xa0, 0x61, 0xc3, 0x75, 0xa5,
+ 0x1a, 0x9d, 0x93, 0xea, 0xca, 0x83, 0xc7, 0x21, 0x59, 0x84, 0x42, 0x6f, 0x47, 0xf7, 0xfc, 0x55,
+ 0xc5, 0x5f, 0x7c, 0x0b, 0x1b, 0x3c, 0xf1, 0xd1, 0xa0, 0x56, 0x91, 0xab, 0x91, 0xf8, 0x45, 0x49,
+ 0xca, 0x35, 0x4b, 0x97, 0x7a, 0x5e, 0x68, 0xdf, 0x06, 0x9a, 0x65, 0x5d, 0x26, 0xa3, 0x9f, 0x4f,
+ 0x18, 0x14, 0xe5, 0x9e, 0x51, 0xc5, 0x1d, 0xc6, 0x0f, 0x92, 0xa5, 0x1c, 0x5f, 0x08, 0x2b, 0xa5,
+ 0xdc, 0x0f, 0x4a, 0x56, 0x70, 0x3c, 0xa2, 0x90, 0x7e, 0x3c, 0x22, 0xb2, 0xc0, 0xca, 0xe3, 0x11,
+ 0xff, 0x50, 0x82, 0x0b, 0xe9, 0x7d, 0xc8, 0xeb, 0xba, 0x4b, 0x5d, 0xcf, 0x74, 0x6c, 0xb5, 0x68,
+ 0x87, 0xc7, 0x88, 0x64, 0x32, 0xfa, 0xf9, 0x9f, 0xea, 0x00, 0xdc, 0x1f, 0x67, 0xb8, 0x19, 0x2c,
+ 0x1d, 0x35, 0x9f, 0x44, 0x10, 0xee, 0x59, 0x69, 0x4e, 0x8f, 0x10, 0x88, 0xa3, 0xcb, 0x42, 0xfe,
+ 0x28, 0x03, 0xd5, 0x6e, 0xc2, 0xce, 0x3e, 0xc1, 0x83, 0x7c, 0x97, 0xf6, 0x07, 0xb5, 0xea, 0xfa,
+ 0x08, 0x79, 0x38, 0xb2, 0x24, 0xe4, 0x37, 0xa0, 0xd2, 0xe3, 0xe3, 0xc2, 0x63, 0xd4, 0x36, 0xfc,
+ 0xb3, 0x7c, 0xe3, 0x8f, 0xfe, 0x8d, 0x10, 0xcb, 0x0f, 0x7f, 0xa9, 0xa8, 0x5a, 0x98, 0x81, 0x51,
+ 0x89, 0x4f, 0xf8, 0xc9, 0xbd, 0x2b, 0x50, 0xf2, 0x28, 0x63, 0xa6, 0xdd, 0xf6, 0xc4, 0xee, 0xad,
+ 0x2c, 0xe7, 0x4a, 0x43, 0xa5, 0x61, 0x90, 0x4b, 0x7e, 0x06, 0xca, 0xc2, 0xef, 0xb3, 0xe4, 0xb6,
+ 0xbd, 0x6a, 0x59, 0x44, 0xa2, 0x84, 0x5e, 0x6d, 0xf8, 0x89, 0x18, 0xe6, 0x93, 0x17, 0x60, 0x5a,
+ 0x46, 0xe3, 0xd4, 0x09, 0x5e, 0xb9, 0xc7, 0x3a, 0xb3, 0x3f, 0xa8, 0x4d, 0xd7, 0x23, 0xe9, 0x18,
+ 0xa3, 0xe2, 0xfb, 0x29, 0x1a, 0x38, 0xc7, 0x92, 0xfb, 0xa9, 0xd0, 0x6d, 0x86, 0x11, 0x2a, 0xf2,
+ 0x2c, 0xe4, 0x98, 0xe5, 0x89, 0x3d, 0x54, 0x29, 0xb4, 0x7b, 0x37, 0xd7, 0x1a, 0xc8, 0xd3, 0xb5,
+ 0xff, 0xc9, 0xc0, 0xe9, 0xc4, 0x41, 0x25, 0xce, 0xd2, 0x77, 0x2d, 0xa5, 0x46, 0x02, 0x96, 0x2d,
+ 0x5c, 0x43, 0x9e, 0x4e, 0xde, 0x50, 0x56, 0x61, 0x76, 0xc2, 0xcb, 0x0a, 0x77, 0x74, 0xe6, 0x71,
+ 0x33, 0x70, 0xc8, 0x20, 0xbc, 0x96, 0x68, 0x9c, 0x5c, 0xdc, 0xd7, 0x76, 0x70, 0x03, 0x45, 0x36,
+ 0x9c, 0xf9, 0xc3, 0x6c, 0x38, 0xb5, 0xbf, 0xcb, 0x41, 0xe5, 0x96, 0xb3, 0xfd, 0x29, 0x39, 0x3c,
+ 0x91, 0xae, 0x91, 0xb3, 0x3f, 0x45, 0x8d, 0xbc, 0x05, 0xcf, 0x30, 0xc6, 0x77, 0xfd, 0x8e, 0xdd,
+ 0xf4, 0x96, 0x5a, 0x8c, 0xba, 0xab, 0xa6, 0x6d, 0x7a, 0x3b, 0xb4, 0xa9, 0x3c, 0x77, 0x9f, 0xd9,
+ 0x1f, 0xd4, 0x9e, 0xd9, 0xdc, 0x5c, 0x4b, 0x23, 0xc1, 0x51, 0xbc, 0x62, 0x86, 0xe8, 0x46, 0xc7,
+ 0x69, 0xb5, 0x64, 0x64, 0x5b, 0xc6, 0x78, 0xe4, 0x0c, 0x89, 0xa4, 0x63, 0x8c, 0x4a, 0xfb, 0x28,
+ 0x03, 0xe5, 0xdb, 0x7a, 0xab, 0xa3, 0x37, 0x4c, 0xbb, 0x43, 0x9e, 0x83, 0xa9, 0x6d, 0xd7, 0xe9,
+ 0x50, 0xd7, 0x53, 0x91, 0x66, 0xb1, 0xeb, 0xa9, 0xcb, 0x24, 0xf4, 0xf3, 0xf8, 0x36, 0x8c, 0x39,
+ 0x3d, 0xd3, 0x48, 0x6e, 0x58, 0x37, 0x79, 0x22, 0xca, 0x3c, 0x72, 0x5f, 0xce, 0xa3, 0xdc, 0x84,
+ 0x27, 0xbd, 0x37, 0xd7, 0x1a, 0x32, 0x7a, 0xeb, 0xcf, 0x40, 0xf2, 0x7c, 0xcc, 0xf2, 0x28, 0x8f,
+ 0xb2, 0x15, 0xb4, 0xef, 0x67, 0xa1, 0x22, 0xab, 0x26, 0x37, 0x67, 0xc7, 0x59, 0xb9, 0x17, 0x85,
+ 0x77, 0xdd, 0xeb, 0x77, 0xa9, 0x2b, 0x36, 0xc1, 0x6a, 0xca, 0x45, 0xbd, 0x25, 0x61, 0x66, 0xe0,
+ 0x61, 0x0f, 0x93, 0xfc, 0xd6, 0xc9, 0x9f, 0x60, 0xeb, 0x14, 0x0e, 0x6c, 0x9d, 0x3f, 0xcb, 0x40,
+ 0x79, 0xcd, 0x6c, 0x51, 0x63, 0xcf, 0xb0, 0x28, 0x79, 0x05, 0xaa, 0x4d, 0x6a, 0x51, 0x46, 0x6f,
+ 0xb8, 0xba, 0x41, 0x37, 0xa8, 0x6b, 0x8a, 0x7b, 0x3d, 0x7c, 0x94, 0x89, 0x79, 0x5c, 0x90, 0xcb,
+ 0xe5, 0xca, 0x08, 0x1a, 0x1c, 0xc9, 0x4d, 0x6e, 0xc2, 0x74, 0x93, 0x7a, 0xa6, 0x4b, 0x9b, 0x1b,
+ 0x11, 0x6b, 0xf4, 0x39, 0x5f, 0x37, 0xad, 0x44, 0xf2, 0x1e, 0x0d, 0x6a, 0x33, 0x1b, 0x66, 0x8f,
+ 0x5a, 0xa6, 0x4d, 0xa5, 0x59, 0x1a, 0x63, 0xd5, 0x0a, 0x90, 0x5b, 0x73, 0xda, 0xda, 0x7b, 0x39,
+ 0x08, 0x6e, 0x6a, 0x91, 0xdf, 0xcc, 0x40, 0x45, 0xb7, 0x6d, 0x87, 0xa9, 0x5b, 0x50, 0xd2, 0xb7,
+ 0x8f, 0x13, 0x5f, 0x08, 0x9b, 0x5f, 0x0a, 0x41, 0xa5, 0x5b, 0x38, 0x70, 0x55, 0x47, 0x72, 0x30,
+ 0x2a, 0x9b, 0xf4, 0x13, 0x9e, 0xea, 0xf5, 0xc9, 0x4b, 0x71, 0x08, 0xbf, 0xf4, 0xec, 0xd7, 0xe0,
+ 0x4c, 0xb2, 0xb0, 0x47, 0x71, 0x6c, 0x4d, 0xe2, 0x13, 0x7b, 0xa7, 0x0c, 0x95, 0x3b, 0x3a, 0x33,
+ 0x77, 0xa9, 0xd8, 0x82, 0x9d, 0x8c, 0x4d, 0xfd, 0x07, 0x19, 0xb8, 0x10, 0xf7, 0x19, 0x9f, 0xa0,
+ 0x61, 0x3d, 0xbb, 0x3f, 0xa8, 0x5d, 0xc0, 0x54, 0x69, 0x38, 0xa2, 0x14, 0xc2, 0xc4, 0x1e, 0x72,
+ 0x41, 0x9f, 0xb4, 0x89, 0xdd, 0x18, 0x25, 0x10, 0x47, 0x97, 0xe5, 0xd3, 0x62, 0x62, 0x3f, 0xd9,
+ 0x37, 0x67, 0x12, 0x1b, 0x80, 0xa9, 0x27, 0x66, 0x03, 0x50, 0x7a, 0x22, 0x0c, 0xae, 0x5e, 0x64,
+ 0x03, 0x50, 0x9e, 0xd0, 0x0f, 0xaa, 0xc2, 0xac, 0x12, 0x6d, 0xd4, 0x46, 0x42, 0x1c, 0x7e, 0xf3,
+ 0x6d, 0x63, 0x62, 0x40, 0x61, 0x5b, 0xf7, 0x4c, 0x43, 0x99, 0x9f, 0xf5, 0xf1, 0xdd, 0x12, 0xfe,
+ 0x15, 0x13, 0xe9, 0x63, 0x12, 0xbf, 0x28, 0xb1, 0xc3, 0xab, 0x2c, 0xd9, 0x89, 0xae, 0xb2, 0x90,
+ 0x65, 0xc8, 0xdb, 0x5c, 0xd9, 0xe6, 0x8e, 0x7c, 0x79, 0xe5, 0xce, 0x6d, 0xba, 0x87, 0x82, 0x59,
+ 0xfb, 0x61, 0x16, 0x80, 0x57, 0x5f, 0x99, 0x39, 0x8f, 0xd9, 0x8c, 0x7c, 0x1e, 0xa6, 0xbc, 0xbe,
+ 0xf0, 0xd6, 0xaa, 0xa5, 0x38, 0x74, 0x1e, 0xcb, 0x64, 0xf4, 0xf3, 0xb9, 0x25, 0xf4, 0x56, 0x9f,
+ 0xf6, 0x7d, 0x5f, 0x50, 0x60, 0x09, 0x7d, 0x9d, 0x27, 0xa2, 0xcc, 0x3b, 0x39, 0x43, 0xc6, 0xdf,
+ 0x35, 0x15, 0x4e, 0x68, 0xd7, 0xa4, 0x7d, 0x2b, 0x0b, 0x10, 0x3a, 0xf8, 0xc9, 0xfb, 0x19, 0x38,
+ 0x1f, 0xcc, 0x32, 0x26, 0x2f, 0x48, 0x2c, 0x5b, 0xba, 0xd9, 0x9d, 0x78, 0x23, 0x93, 0x36, 0xc3,
+ 0x85, 0xda, 0xd9, 0x48, 0x13, 0x87, 0xe9, 0xa5, 0x20, 0x08, 0x25, 0xda, 0xed, 0xb1, 0xbd, 0x15,
+ 0xd3, 0x55, 0xc3, 0x2e, 0xf5, 0x86, 0xc1, 0x75, 0x45, 0x23, 0x59, 0xd5, 0x61, 0x78, 0x31, 0x73,
+ 0xfc, 0x1c, 0x0c, 0x70, 0xb4, 0xef, 0x65, 0xe1, 0x5c, 0x4a, 0xe9, 0xc8, 0x4b, 0x70, 0x46, 0x45,
+ 0x38, 0xc2, 0x5b, 0xc2, 0x99, 0xf0, 0x96, 0x70, 0x23, 0x91, 0x87, 0x43, 0xd4, 0xe4, 0x0d, 0x00,
+ 0xdd, 0x30, 0xa8, 0xe7, 0xad, 0x3b, 0x4d, 0xdf, 0xe8, 0x7b, 0x91, 0x6f, 0x2a, 0x97, 0x82, 0xd4,
+ 0x47, 0x83, 0xda, 0x17, 0xd3, 0x42, 0x55, 0x89, 0xda, 0x87, 0x0c, 0x18, 0x81, 0x24, 0xaf, 0x03,
+ 0xc8, 0x6b, 0x2b, 0xc1, 0x61, 0xcb, 0xc7, 0x78, 0xd2, 0xe7, 0xfd, 0x2b, 0x15, 0xf3, 0x5f, 0xef,
+ 0xeb, 0x36, 0x33, 0xd9, 0x9e, 0x3c, 0x57, 0x7d, 0x2f, 0x40, 0xc1, 0x08, 0xa2, 0xf6, 0x37, 0x59,
+ 0x28, 0xf9, 0xc6, 0xe8, 0x27, 0x10, 0x2b, 0x69, 0xc7, 0x62, 0x25, 0xe3, 0xdf, 0x53, 0xf4, 0x8b,
+ 0x3c, 0x32, 0x3a, 0xe2, 0x24, 0xa2, 0x23, 0x37, 0x26, 0x17, 0x75, 0x70, 0x3c, 0xe4, 0x07, 0x59,
+ 0x38, 0xe5, 0x93, 0xaa, 0x73, 0xdc, 0x5f, 0x86, 0x19, 0x97, 0xea, 0xcd, 0xba, 0xce, 0x8c, 0x1d,
+ 0xd1, 0x7d, 0xf2, 0x14, 0xf7, 0xd9, 0xfd, 0x41, 0x6d, 0x06, 0xa3, 0x19, 0x18, 0xa7, 0x4b, 0x3b,
+ 0x00, 0x9e, 0x9d, 0xf0, 0x00, 0x78, 0xee, 0x28, 0x07, 0xc0, 0x89, 0x0e, 0x15, 0x5e, 0xa2, 0x4d,
+ 0xb3, 0x4b, 0x9d, 0xbe, 0xff, 0x30, 0xc2, 0x51, 0x0f, 0x0f, 0x8b, 0xd5, 0x1d, 0x43, 0x18, 0x8c,
+ 0x62, 0x6a, 0xff, 0x98, 0x81, 0xe9, 0xb0, 0xbd, 0x4e, 0x3c, 0x62, 0xd4, 0x8a, 0x47, 0x8c, 0x96,
+ 0x26, 0x1e, 0x0e, 0x23, 0x62, 0x44, 0xbf, 0x57, 0x0c, 0xab, 0x25, 0xa2, 0x42, 0xdb, 0x30, 0x6b,
+ 0xa6, 0x06, 0x4a, 0x22, 0xda, 0x26, 0x38, 0x04, 0x77, 0x73, 0x24, 0x25, 0x1e, 0x80, 0x42, 0xfa,
+ 0x50, 0xda, 0xa5, 0x2e, 0x33, 0x0d, 0xea, 0xd7, 0xef, 0xc6, 0xc4, 0xd6, 0x91, 0x3c, 0x00, 0x10,
+ 0xb6, 0xe9, 0x3d, 0x25, 0x00, 0x03, 0x51, 0x64, 0x1b, 0x0a, 0xb4, 0xd9, 0xa6, 0xfe, 0xf9, 0xf9,
+ 0xaf, 0x4e, 0x74, 0x25, 0x23, 0x6c, 0x4f, 0xfe, 0xe7, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x7f,
+ 0xfb, 0xae, 0xc6, 0xe1, 0xf8, 0xb6, 0x4e, 0xe0, 0x08, 0x08, 0x0f, 0xa1, 0x06, 0x49, 0x18, 0xca,
+ 0x21, 0x9d, 0xe0, 0xb2, 0x49, 0xe1, 0x98, 0x94, 0xc7, 0x01, 0x17, 0x4e, 0x3c, 0x28, 0x3f, 0xd0,
+ 0x19, 0x75, 0xbb, 0xba, 0xdb, 0x51, 0x86, 0xff, 0xf8, 0x35, 0xbc, 0xef, 0x23, 0x85, 0x35, 0x0c,
+ 0x92, 0x30, 0x94, 0x43, 0x1c, 0x28, 0x33, 0x65, 0xc9, 0xfa, 0xb7, 0x1f, 0xc7, 0x17, 0xea, 0xdb,
+ 0xc4, 0x9e, 0x74, 0x6c, 0x07, 0xbf, 0x18, 0xca, 0xd0, 0x1e, 0xe5, 0x42, 0xf5, 0xf8, 0x49, 0x87,
+ 0x08, 0x5f, 0x88, 0x87, 0x08, 0xe7, 0x92, 0x21, 0xc2, 0x84, 0x37, 0xe6, 0xe8, 0x41, 0x42, 0x1d,
+ 0x2a, 0x96, 0xee, 0xb1, 0xad, 0x5e, 0x53, 0x67, 0xca, 0xbf, 0x5c, 0x59, 0xfc, 0xff, 0x87, 0xd3,
+ 0x5e, 0x5c, 0x1f, 0x86, 0x4e, 0x97, 0xb5, 0x10, 0x06, 0xa3, 0x98, 0xe4, 0x2a, 0x54, 0x76, 0xc5,
+ 0x8c, 0x94, 0xb7, 0x29, 0x0a, 0x42, 0x9d, 0x0b, 0x0d, 0x7b, 0x2f, 0x4c, 0xc6, 0x28, 0x0d, 0x67,
+ 0x91, 0x96, 0x80, 0x64, 0x29, 0x86, 0x2c, 0x8d, 0x30, 0x19, 0xa3, 0x34, 0x22, 0x56, 0x61, 0xda,
+ 0x1d, 0xc9, 0x30, 0x25, 0x18, 0x64, 0xac, 0xc2, 0x4f, 0xc4, 0x30, 0x9f, 0x5c, 0x81, 0x52, 0xbf,
+ 0xd9, 0x92, 0xb4, 0x25, 0x41, 0x2b, 0xec, 0xaf, 0xad, 0x95, 0x55, 0x75, 0xbb, 0xc3, 0xcf, 0xd5,
+ 0xfe, 0x2b, 0x03, 0x64, 0x38, 0xa8, 0x4d, 0x76, 0xa0, 0x68, 0x0b, 0xaf, 0xca, 0xc4, 0xb7, 0xb7,
+ 0x23, 0xce, 0x19, 0x39, 0xc7, 0x54, 0x82, 0xc2, 0x27, 0x36, 0x94, 0xe8, 0x43, 0x46, 0x5d, 0x5b,
+ 0xb7, 0x94, 0xe9, 0x71, 0x3c, 0x37, 0xc5, 0xa5, 0xc1, 0xa9, 0x90, 0x31, 0x90, 0xa1, 0xfd, 0x38,
+ 0x0b, 0x95, 0x08, 0xdd, 0xe3, 0x36, 0x2b, 0xe2, 0xcc, 0xa8, 0x74, 0x66, 0x6c, 0xb9, 0x96, 0x1a,
+ 0xa6, 0x91, 0x33, 0xa3, 0x2a, 0x0b, 0xd7, 0x30, 0x4a, 0x47, 0x16, 0x01, 0xba, 0xba, 0xc7, 0xa8,
+ 0x2b, 0x96, 0x92, 0xc4, 0x49, 0xcd, 0xf5, 0x20, 0x07, 0x23, 0x54, 0xe4, 0xb2, 0x7a, 0x47, 0x20,
+ 0x1f, 0xbf, 0x34, 0x35, 0xe2, 0x91, 0x80, 0xc2, 0x31, 0x3c, 0x12, 0x40, 0xda, 0x70, 0xc6, 0x2f,
+ 0xb5, 0x9f, 0xab, 0xf4, 0xdc, 0x21, 0x81, 0xa5, 0x31, 0x9e, 0x80, 0xc0, 0x21, 0x50, 0xed, 0x87,
+ 0x19, 0x98, 0x89, 0x6d, 0xa5, 0xf9, 0xd6, 0x2e, 0x3c, 0x92, 0x11, 0xd9, 0xda, 0xc5, 0x4e, 0x52,
+ 0x3c, 0x0f, 0x45, 0xd9, 0x40, 0xaa, 0xe1, 0x03, 0x35, 0x22, 0x9b, 0x10, 0x55, 0x2e, 0x57, 0x08,
+ 0xca, 0x59, 0x97, 0x54, 0x08, 0xca, 0x9b, 0x87, 0x7e, 0x3e, 0xf9, 0x02, 0x94, 0xfc, 0xd2, 0xa9,
+ 0x96, 0x0e, 0x9f, 0x90, 0x50, 0xe9, 0x18, 0x50, 0x68, 0xdf, 0x2e, 0x80, 0x7c, 0xff, 0x82, 0xf3,
+ 0x35, 0x4d, 0x4f, 0x46, 0xa9, 0x32, 0x22, 0x4a, 0x15, 0xf0, 0xad, 0xa8, 0x74, 0x0c, 0x28, 0xc8,
+ 0x45, 0xc8, 0x75, 0x4d, 0x5b, 0xb9, 0x15, 0xc5, 0xae, 0x72, 0xdd, 0xb4, 0x91, 0xa7, 0x89, 0x2c,
+ 0xfd, 0xa1, 0x0a, 0xb4, 0xc8, 0x2c, 0xfd, 0x21, 0xf2, 0x34, 0x6e, 0x5c, 0x5a, 0x8e, 0xd3, 0xd9,
+ 0xd6, 0x8d, 0x8e, 0xef, 0xfa, 0xce, 0x8b, 0xd9, 0x2b, 0x8c, 0xcb, 0xb5, 0x78, 0x16, 0x26, 0x69,
+ 0x39, 0xbb, 0xe1, 0x38, 0x56, 0xd3, 0x79, 0x60, 0xfb, 0xec, 0x85, 0x90, 0x7d, 0x39, 0x9e, 0x85,
+ 0x49, 0x5a, 0xb2, 0x05, 0xcf, 0xbc, 0x4d, 0x5d, 0x47, 0xb5, 0x58, 0xc3, 0xa2, 0xb4, 0xe7, 0xc3,
+ 0x48, 0x05, 0x25, 0xa2, 0x42, 0xaf, 0xa6, 0x93, 0xe0, 0x28, 0x5e, 0x11, 0x6c, 0xd2, 0xdd, 0x36,
+ 0x65, 0x1b, 0xae, 0xc3, 0xf7, 0x4e, 0xa6, 0xdd, 0xf6, 0x61, 0xa7, 0x42, 0xd8, 0xcd, 0x74, 0x12,
+ 0x1c, 0xc5, 0x4b, 0xd6, 0xe1, 0xac, 0xcc, 0x8a, 0xd8, 0xcc, 0x4a, 0xd7, 0xd5, 0xf6, 0x07, 0xb5,
+ 0xcf, 0xac, 0xd0, 0x9e, 0x4b, 0x0d, 0xae, 0xa0, 0x37, 0x93, 0x64, 0x38, 0xcc, 0x29, 0x5e, 0xa5,
+ 0x52, 0xee, 0xde, 0x0d, 0xea, 0x8a, 0x2e, 0x17, 0xbe, 0x23, 0x65, 0x98, 0x63, 0x22, 0x0f, 0x87,
+ 0xa8, 0xc9, 0x2b, 0x50, 0x8d, 0xc2, 0x2e, 0xed, 0xea, 0xa6, 0xa5, 0x6f, 0x9b, 0x96, 0xc9, 0xf6,
+ 0x44, 0xac, 0x78, 0x46, 0x3a, 0x23, 0x37, 0x47, 0xd0, 0xe0, 0x48, 0x6e, 0xed, 0xf7, 0x73, 0x20,
+ 0x1e, 0x30, 0x22, 0xf7, 0x21, 0x67, 0x39, 0x6d, 0xa5, 0x92, 0xc7, 0xf7, 0x74, 0xac, 0x39, 0x6d,
+ 0x39, 0xf0, 0xd6, 0x9c, 0x36, 0x72, 0x44, 0x62, 0x40, 0xa1, 0xa3, 0xb7, 0x3a, 0xba, 0xd2, 0xc0,
+ 0xe3, 0xdb, 0x1b, 0x41, 0x20, 0x4f, 0xdd, 0x10, 0xe5, 0xbf, 0x28, 0xb1, 0xb9, 0x61, 0xb3, 0xed,
+ 0xbf, 0x48, 0xa2, 0xb6, 0x7e, 0x13, 0xf8, 0xc6, 0x7c, 0x24, 0xb9, 0x0a, 0x06, 0xbf, 0x18, 0xca,
+ 0x20, 0x06, 0x14, 0xfb, 0x4d, 0xf1, 0x90, 0x54, 0x7e, 0x42, 0x2b, 0x66, 0x6b, 0x45, 0xd4, 0x49,
+ 0xac, 0x5f, 0xf2, 0x1b, 0x15, 0xb4, 0xf6, 0xe7, 0x19, 0x98, 0x69, 0x58, 0x66, 0xd3, 0xb4, 0xdb,
+ 0x27, 0x77, 0x27, 0x97, 0xdc, 0x85, 0x82, 0x67, 0x99, 0x4d, 0x3a, 0xe6, 0x65, 0x51, 0xd1, 0x19,
+ 0xbc, 0x94, 0x14, 0x25, 0x8e, 0xf6, 0x27, 0x79, 0x50, 0xaf, 0x6e, 0x91, 0x3e, 0x94, 0xdb, 0xfe,
+ 0xcd, 0x55, 0x55, 0xe4, 0x97, 0x27, 0xb8, 0xe1, 0x10, 0xbb, 0x03, 0x2b, 0x7b, 0x27, 0x48, 0xc4,
+ 0x50, 0x12, 0xa1, 0xf1, 0x31, 0xb7, 0x32, 0xe1, 0x98, 0x93, 0xe2, 0x86, 0x47, 0x9d, 0x0e, 0xf9,
+ 0x1d, 0xc6, 0x7a, 0x13, 0x1f, 0xc4, 0x0d, 0xcf, 0xd8, 0x4a, 0x37, 0x1e, 0xff, 0x47, 0x01, 0xcd,
+ 0x45, 0xd8, 0xfa, 0x31, 0x5c, 0x7f, 0x0f, 0x5d, 0xa8, 0xca, 0xc3, 0xaa, 0x33, 0x0f, 0x05, 0x34,
+ 0xf9, 0x35, 0xa8, 0x30, 0x57, 0xb7, 0xbd, 0x96, 0xe3, 0x76, 0xa9, 0xab, 0x16, 0xff, 0xd5, 0x09,
+ 0xc6, 0xf3, 0x66, 0x88, 0x26, 0xbd, 0x1e, 0xb1, 0x24, 0x8c, 0x4a, 0xd3, 0xba, 0xa0, 0xcc, 0x76,
+ 0x62, 0xc4, 0x9e, 0x19, 0x90, 0x91, 0xce, 0x85, 0xc3, 0x8d, 0xc5, 0xe0, 0x2e, 0x79, 0xe4, 0x6e,
+ 0x5d, 0xea, 0x7b, 0x02, 0xda, 0x3f, 0x67, 0x21, 0xb7, 0xb9, 0xd6, 0x90, 0x57, 0x45, 0xc4, 0x1b,
+ 0x1e, 0xb4, 0xd1, 0x31, 0x7b, 0xf7, 0xa8, 0x6b, 0xb6, 0xf6, 0xd4, 0xda, 0x1b, 0xb9, 0x2a, 0x92,
+ 0xa4, 0xc0, 0x14, 0x2e, 0xf2, 0x1a, 0x4c, 0x1b, 0xfa, 0x32, 0x75, 0x99, 0x34, 0x61, 0x8e, 0xe6,
+ 0x35, 0x17, 0x27, 0x18, 0x96, 0x97, 0x42, 0x76, 0x8c, 0x81, 0x91, 0x2d, 0x00, 0x23, 0x84, 0x3e,
+ 0x92, 0x27, 0x5d, 0xbe, 0xab, 0x10, 0x02, 0x47, 0x80, 0x08, 0x42, 0xb9, 0xc3, 0x49, 0x05, 0x6a,
+ 0xfe, 0x28, 0xa8, 0x62, 0xd2, 0xdd, 0xf6, 0x79, 0x31, 0x84, 0xd1, 0xfe, 0x23, 0x03, 0xe1, 0x26,
+ 0x90, 0x78, 0x50, 0x6c, 0x8a, 0x5b, 0xdb, 0x6a, 0xda, 0x8f, 0xbf, 0x99, 0x8e, 0xbf, 0x66, 0x52,
+ 0x27, 0xfb, 0x83, 0x5a, 0xe2, 0x85, 0x13, 0x54, 0xa2, 0x48, 0x1b, 0x72, 0x6f, 0x3a, 0xdb, 0x13,
+ 0xcf, 0xfa, 0xc8, 0xf9, 0x1f, 0xb9, 0x73, 0x8a, 0x24, 0x20, 0x97, 0xa0, 0x7d, 0x3b, 0x0b, 0x95,
+ 0xc8, 0x98, 0x9e, 0xf8, 0x51, 0x82, 0x87, 0x89, 0x47, 0x09, 0x36, 0xc6, 0xdf, 0x95, 0x87, 0xa5,
+ 0x3a, 0xe9, 0x77, 0x09, 0xfe, 0x36, 0x0b, 0xb9, 0xad, 0x95, 0x55, 0xbe, 0xf8, 0x06, 0xe7, 0x80,
+ 0x26, 0x0e, 0x4c, 0x85, 0xcf, 0xaf, 0x89, 0x91, 0x16, 0xfc, 0x62, 0x28, 0x83, 0xec, 0xc0, 0xd4,
+ 0x76, 0xdf, 0xb4, 0x98, 0x69, 0x4f, 0x7c, 0xea, 0xcc, 0x7f, 0xc3, 0x41, 0x1d, 0x97, 0x91, 0xa8,
+ 0xe8, 0xc3, 0x93, 0x36, 0x4c, 0xb5, 0xe5, 0x35, 0x10, 0x35, 0xf7, 0x5e, 0x1a, 0x7f, 0xf5, 0x92,
+ 0x38, 0x52, 0x90, 0xfa, 0x41, 0x1f, 0x5d, 0xfb, 0x26, 0xa8, 0xc5, 0x9f, 0x78, 0x27, 0xd3, 0x9a,
+ 0x81, 0x63, 0x28, 0xad, 0x45, 0xb5, 0xff, 0xcc, 0x40, 0x5c, 0x4b, 0x7f, 0xf2, 0x9d, 0xda, 0x49,
+ 0x76, 0xea, 0xca, 0x71, 0xcc, 0x81, 0xf4, 0x7e, 0xd5, 0xfe, 0x3a, 0x0b, 0x45, 0xf5, 0x2e, 0xe9,
+ 0xc9, 0x47, 0x3f, 0x68, 0x2c, 0xfa, 0xb1, 0x3c, 0xe1, 0x2b, 0x8d, 0x23, 0x63, 0x1f, 0xdd, 0x44,
+ 0xec, 0x63, 0xd2, 0xe7, 0x20, 0x1f, 0x13, 0xf9, 0xf8, 0xfb, 0x0c, 0x9c, 0x92, 0x84, 0x37, 0x6d,
+ 0x8f, 0xe9, 0xb6, 0x21, 0x8c, 0x62, 0xe9, 0x89, 0x9a, 0xd8, 0xb5, 0xa7, 0xdc, 0xd0, 0xc2, 0x5c,
+ 0x95, 0xdf, 0xa8, 0xa0, 0xf9, 0x66, 0x79, 0xc7, 0xf1, 0x98, 0x50, 0xb7, 0xd9, 0xf8, 0x26, 0xfb,
+ 0x65, 0x95, 0x8e, 0x01, 0x45, 0x72, 0xf7, 0x5e, 0x18, 0xbd, 0x7b, 0xd7, 0xfe, 0x34, 0x03, 0xd3,
+ 0xd1, 0x87, 0x30, 0xc7, 0x0f, 0xe4, 0x24, 0xe2, 0x28, 0xd9, 0x13, 0x88, 0xa3, 0x7c, 0x98, 0x01,
+ 0xf0, 0x0b, 0x7b, 0xe2, 0x51, 0x94, 0x66, 0x3c, 0x8a, 0x32, 0x71, 0xb7, 0xa6, 0xc7, 0x50, 0x7e,
+ 0x50, 0xf0, 0xab, 0x24, 0x22, 0x28, 0xef, 0x66, 0xe0, 0x94, 0x1e, 0x8b, 0x4a, 0x4c, 0x6c, 0x49,
+ 0x24, 0x82, 0x1c, 0xc1, 0xc3, 0xa1, 0xf1, 0x74, 0x4c, 0x88, 0x25, 0xd7, 0x60, 0xba, 0xa7, 0x5c,
+ 0xc5, 0x77, 0xc2, 0x51, 0x17, 0x1c, 0x40, 0xde, 0x88, 0xe4, 0x61, 0x8c, 0xf2, 0x31, 0x51, 0xa0,
+ 0xdc, 0xb1, 0x44, 0x81, 0xa2, 0x47, 0xcd, 0xf2, 0x07, 0x1e, 0x35, 0xb3, 0xa1, 0xdc, 0x72, 0x9d,
+ 0xae, 0x08, 0xb4, 0xa8, 0xa7, 0xe6, 0x26, 0x0c, 0xde, 0x04, 0x8b, 0xca, 0xaa, 0x8f, 0x8b, 0xa1,
+ 0x08, 0xbe, 0x4c, 0x33, 0x47, 0x4a, 0x2b, 0x1e, 0x87, 0xb4, 0x60, 0xea, 0x6e, 0x4a, 0x54, 0xf4,
+ 0xe1, 0xe3, 0xc1, 0x94, 0xa9, 0x4f, 0x26, 0x98, 0xa2, 0xfd, 0x53, 0xd6, 0xd7, 0x17, 0x8d, 0xc4,
+ 0x9d, 0xa4, 0xcc, 0x88, 0x3b, 0x49, 0xea, 0x76, 0x6d, 0x34, 0xdc, 0xf0, 0x3c, 0x14, 0x5d, 0xaa,
+ 0x7b, 0x8e, 0xad, 0xee, 0xa9, 0x07, 0xda, 0x16, 0x45, 0x2a, 0xaa, 0xdc, 0x68, 0x58, 0x22, 0xfb,
+ 0x98, 0xb0, 0xc4, 0x17, 0x22, 0x03, 0x42, 0xc6, 0x7f, 0x83, 0xb9, 0x9d, 0x32, 0x28, 0x84, 0xcf,
+ 0x52, 0xbd, 0xfe, 0x5f, 0x48, 0xfa, 0x2c, 0xd5, 0xcb, 0xfc, 0x01, 0x05, 0x69, 0xc2, 0xb4, 0xa5,
+ 0x7b, 0x4c, 0x78, 0xa5, 0x9a, 0x4b, 0x6c, 0x8c, 0x98, 0x47, 0x30, 0x6d, 0xd6, 0x22, 0x38, 0x18,
+ 0x43, 0xd5, 0x7e, 0x37, 0x03, 0x61, 0x93, 0x1f, 0xd1, 0x3b, 0xfa, 0x0a, 0x94, 0xba, 0xfa, 0xc3,
+ 0x15, 0x6a, 0xe9, 0x7b, 0x93, 0xbc, 0x7e, 0xb5, 0xae, 0x30, 0x30, 0x40, 0xd3, 0x06, 0x19, 0x50,
+ 0x37, 0x76, 0x09, 0x85, 0x42, 0xcb, 0x7c, 0xa8, 0xca, 0x33, 0x89, 0xa5, 0x12, 0x79, 0x6f, 0x4d,
+ 0xfa, 0x17, 0x44, 0x02, 0x4a, 0x74, 0xd2, 0x85, 0x29, 0x4f, 0xba, 0x7f, 0x54, 0x55, 0xc6, 0xdf,
+ 0x95, 0xc7, 0xdc, 0x48, 0xea, 0xba, 0xaf, 0x4c, 0x42, 0x5f, 0x46, 0x7d, 0xfe, 0x83, 0x8f, 0xe7,
+ 0x9e, 0xfa, 0xf0, 0xe3, 0xb9, 0xa7, 0x3e, 0xfa, 0x78, 0xee, 0xa9, 0x6f, 0xed, 0xcf, 0x65, 0x3e,
+ 0xd8, 0x9f, 0xcb, 0x7c, 0xb8, 0x3f, 0x97, 0xf9, 0x68, 0x7f, 0x2e, 0xf3, 0x6f, 0xfb, 0x73, 0x99,
+ 0xdf, 0xf9, 0xf7, 0xb9, 0xa7, 0x5e, 0x2d, 0xf9, 0x98, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x9a,
+ 0x20, 0x59, 0x9b, 0x6d, 0x64, 0x00, 0x00,
}
func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) {
From a0e33e4dbe950750494675193fd8029a34322015 Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Tue, 28 Mar 2023 14:27:19 -0400
Subject: [PATCH 5/6] .
Signed-off-by: Keran Yang
---
pkg/apis/numaflow/v1alpha1/const.go | 2 --
pkg/apis/numaflow/v1alpha1/edge_types.go | 2 ++
pkg/forward/forward.go | 2 +-
test/e2e-suite-2/functional_test.go | 5 +++--
4 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index d8694de32e..8b50516d49 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -24,8 +24,6 @@ import (
"k8s.io/apimachinery/pkg/api/resource"
)
-type BufferFullWritingStrategy string
-
const (
Project = "numaflow"
diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go
index 8bcb61a4b7..34b3a7508b 100644
--- a/pkg/apis/numaflow/v1alpha1/edge_types.go
+++ b/pkg/apis/numaflow/v1alpha1/edge_types.go
@@ -64,3 +64,5 @@ func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy {
return RetryUntilSuccess
}
}
+
+type BufferFullWritingStrategy string
diff --git a/pkg/forward/forward.go b/pkg/forward/forward.go
index 582574a0a5..2954ff2191 100644
--- a/pkg/forward/forward.go
+++ b/pkg/forward/forward.go
@@ -491,7 +491,7 @@ func (isdf *InterStepDataForward) writeToBuffer(ctx context.Context, toBuffer is
for idx, msg := range messages {
if err := errs[idx]; err != nil {
// ATM there are no user defined errors during write, all are InternalErrors.
- if ok := errors.As(err, &isb.NoRetryableBufferWriteErr{}); ok {
+ if errors.As(err, &isb.NoRetryableBufferWriteErr{}) {
// If toBuffer returns us a NoRetryableBufferWriteErr, we drop the message.
dropBytes += float64(len(msg.Payload))
} else {
diff --git a/test/e2e-suite-2/functional_test.go b/test/e2e-suite-2/functional_test.go
index 2552452cb6..86a7821556 100644
--- a/test/e2e-suite-2/functional_test.go
+++ b/test/e2e-suite-2/functional_test.go
@@ -51,8 +51,9 @@ func (s *FunctionalSuite) TestDropOnFull() {
VertexSizeScaledTo("drop-sink", 0)
w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("1")))
- // give buffer writer 2 seconds to update it's isFull attribute.
- time.Sleep(time.Second * 2)
+ // give buffer writer some time to update the isFull attribute.
+ // 5s is a carefully chosen number to create a stable buffer full scenario, it is a bit higher than the buffer writer's refresh interval.
+ time.Sleep(time.Second * 5)
w.SendMessageTo(pipelineName, "in", NewHttpPostRequest().WithBody([]byte("2")))
// scale the sinks up to 1 pod to process the message from the buffer.
From fd006d882ad00dbcbd8fd0ba876ad206056e5bd0 Mon Sep 17 00:00:00 2001
From: Keran Yang
Date: Tue, 28 Mar 2023 14:37:59 -0400
Subject: [PATCH 6/6] .
Signed-off-by: Keran Yang
---
pkg/apis/numaflow/v1alpha1/const.go | 3 ---
pkg/apis/numaflow/v1alpha1/edge_types.go | 5 +++++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index 8b50516d49..dcfcb76fd0 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -122,9 +122,6 @@ const (
DefaultBufferUsageLimit = 0.8
DefaultReadBatchSize = 500
- RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess"
- DiscardLatest BufferFullWritingStrategy = "discardLatest"
-
// Auto scaling
DefaultLookbackSeconds = 180 // Default lookback seconds for calculating avg rate and pending
DefaultCooldownSeconds = 90 // Default cooldown seconds after a scaling operation
diff --git a/pkg/apis/numaflow/v1alpha1/edge_types.go b/pkg/apis/numaflow/v1alpha1/edge_types.go
index 34b3a7508b..52d6c08399 100644
--- a/pkg/apis/numaflow/v1alpha1/edge_types.go
+++ b/pkg/apis/numaflow/v1alpha1/edge_types.go
@@ -66,3 +66,8 @@ func (e Edge) BufferFullWritingStrategy() BufferFullWritingStrategy {
}
type BufferFullWritingStrategy string
+
+const (
+ RetryUntilSuccess BufferFullWritingStrategy = "retryUntilSuccess"
+ DiscardLatest BufferFullWritingStrategy = "discardLatest"
+)