Repository: armadaproject/armada
Pull request #2068 (2023-01-29 08:15:10)

Ingest Partition Markers
When trying to get the next scheduler e2e tests working, I immediately realised that I hadn't persisted the partition markers to the DB (doh!).  This PR addresses that.  Summary is:

- Partition Markers are now `EventMessageEvents` so that they can be handled by the `SchedulerIngester`.  
- Code In Scheduler Ingester to insert these into the db.
- Code in other event handlers to ensure these messages are ignored without triggering warnings etc.

codecov-commenter: # [Codecov](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject) Report
Base: **46.80**% // Head: **46.86**% // Increases project coverage by **`+0.06%`** :tada:
> Coverage data is based on head [(`b1dcab6`)](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject) compared to base [(`92fcbb6`)](https://codecov.io/gh/armadaproject/armada/commit/92fcbb6fd58753d2fcb67a9657aaccff95c3b069?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject).
> Patch coverage: 81.48% of modified lines in pull request are covered.

:mega: This organization is not using Codecov’s [GitHub App Integration](https://github.com/apps/codecov). We recommend you install it so Codecov can continue to function properly for your repositories. [Learn more](https://about.codecov.io/blog/codecov-is-updating-its-github-integration/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject)

<details><summary>Additional details and impacted files</summary>


```diff
@@            Coverage Diff             @@
##           master    #2068      +/-   ##
==========================================
+ Coverage   46.80%   46.86%   +0.06%     
==========================================
  Files         229      229              
  Lines       30186    30234      +48     
==========================================
+ Hits        14129    14170      +41     
- Misses      15012    15019       +7     
  Partials     1045     1045              
```

| Flag | Coverage Δ | |
|---|---|---|
| airflow-operator | `89.13% <ø> (ø)` | |
| armada-server | `45.85% <81.48%> (+0.06%)` | :arrow_up: |
| python-client | `93.83% <ø> (ø)` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject) | Coverage Δ | |
|---|---|---|
| [...ernal/lookoutingester/instructions/instructions.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvbG9va291dGluZ2VzdGVyL2luc3RydWN0aW9ucy9pbnN0cnVjdGlvbnMuZ28=) | `70.20% <ø> (ø)` | |
| [...nal/lookoutingesterv2/instructions/instructions.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvbG9va291dGluZ2VzdGVydjIvaW5zdHJ1Y3Rpb25zL2luc3RydWN0aW9ucy5nbw==) | `75.95% <0.00%> (-0.19%)` | :arrow_down: |
| [internal/scheduler/database/query.sql.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvc2NoZWR1bGVyL2RhdGFiYXNlL3F1ZXJ5LnNxbC5nbw==) | `28.44% <0.00%> (-0.27%)` | :arrow_down: |
| [internal/scheduleringester/dbops.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvc2NoZWR1bGVyaW5nZXN0ZXIvZGJvcHMuZ28=) | `79.61% <66.66%> (-0.79%)` | :arrow_down: |
| [internal/scheduleringester/schedulerdb.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvc2NoZWR1bGVyaW5nZXN0ZXIvc2NoZWR1bGVyZGIuZ28=) | `59.71% <75.00%> (+2.46%)` | :arrow_up: |
| [...ernal/armada/repository/apimessages/conversions.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvYXJtYWRhL3JlcG9zaXRvcnkvYXBpbWVzc2FnZXMvY29udmVyc2lvbnMuZ28=) | `82.09% <100.00%> (ø)` | |
| [internal/scheduler/publisher.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvc2NoZWR1bGVyL3B1Ymxpc2hlci5nbw==) | `84.42% <100.00%> (+2.18%)` | :arrow_up: |
| [internal/scheduleringester/instructions.go](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject#diff-aW50ZXJuYWwvc2NoZWR1bGVyaW5nZXN0ZXIvaW5zdHJ1Y3Rpb25zLmdv) | `69.95% <100.00%> (+1.63%)` | :arrow_up: |

Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject)

</details>

[:umbrella: View full report at Codecov](https://codecov.io/gh/armadaproject/armada/pull/2068?src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject).   
:loudspeaker: Do you have feedback about the report comment? [Let us know in this issue](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=armadaproject).


Patch:
diff --git a/internal/armada/repository/apimessages/conversions.go b/internal/armada/repository/apimessages/conversions.go
index fec61ef4..fe9a82f9 100644
--- a/internal/armada/repository/apimessages/conversions.go
+++ b/internal/armada/repository/apimessages/conversions.go
@@ -53,7 +53,8 @@ func FromEventSequence(es *armadaevents.EventSequence) ([]*api.EventMessage, err
 			convertedEvents, err = FromInternalJobRunPreempted(es.Queue, es.JobSetName, *event.Created, esEvent.JobRunPreempted)
 		case *armadaevents.EventSequence_Event_ReprioritiseJobSet,
 			*armadaevents.EventSequence_Event_CancelJobSet,
-			*armadaevents.EventSequence_Event_JobRunSucceeded:
+			*armadaevents.EventSequence_Event_JobRunSucceeded,
+			*armadaevents.EventSequence_Event_PartitionMarker:
 			// These events have no api analog right now, so we ignore
 			log.Debugf("Ignoring event")
 		default:
diff --git a/internal/lookoutingester/instructions/instructions.go b/internal/lookoutingester/instructions/instructions.go
index c7613e8e..ab4673d5 100644
--- a/internal/lookoutingester/instructions/instructions.go
+++ b/internal/lookoutingester/instructions/instructions.go
@@ -87,6 +87,7 @@ func (c *InstructionConverter) convertSequence(es *armadaevents.EventSequence, u
 			*armadaevents.EventSequence_Event_ReprioritiseJobSet,
 			*armadaevents.EventSequence_Event_CancelJobSet,
 			*armadaevents.EventSequence_Event_ResourceUtilisation,
+			*armadaevents.EventSequence_Event_PartitionMarker,
 			*armadaevents.EventSequence_Event_StandaloneIngressInfo:
 			log.Debugf("Ignoring event type %T", event)
 		default:
diff --git a/internal/lookoutingesterv2/instructions/instructions.go b/internal/lookoutingesterv2/instructions/instructions.go
index c2e86369..55732bb2 100644
--- a/internal/lookoutingesterv2/instructions/instructions.go
+++ b/internal/lookoutingesterv2/instructions/instructions.go
@@ -109,6 +109,7 @@ func (c *InstructionConverter) convertSequence(
 		case *armadaevents.EventSequence_Event_ResourceUtilisation:
 		case *armadaevents.EventSequence_Event_StandaloneIngressInfo:
 		case *armadaevents.EventSequence_Event_JobRunPreempted:
+		case *armadaevents.EventSequence_Event_PartitionMarker:
 			log.Debugf("Ignoring event type %T", event)
 		default:
 			log.Warnf("Ignoring unknown event type %T", event)
diff --git a/internal/scheduler/database/query.sql.go b/internal/scheduler/database/query.sql.go
index b802bec5..af7ed0c8 100644
--- a/internal/scheduler/database/query.sql.go
+++ b/internal/scheduler/database/query.sql.go
@@ -57,6 +57,21 @@ func (q *Queries) FindActiveRuns(ctx context.Context, runIds []uuid.UUID) ([]uui
 	return items, nil
 }
 
+const insertMarker = `-- name: InsertMarker :exec
+INSERT INTO markers (group_id, partition_id, created) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING
+`
+
+type InsertMarkerParams struct {
+	GroupID     uuid.UUID `db:"group_id"`
+	PartitionID int32     `db:"partition_id"`
+	Created     time.Time `db:"created"`
+}
+
+func (q *Queries) InsertMarker(ctx context.Context, arg InsertMarkerParams) error {
+	_, err := q.db.Exec(ctx, insertMarker, arg.GroupID, arg.PartitionID, arg.Created)
+	return err
+}
+
 const markJobRunsFailedById = `-- name: MarkJobRunsFailedById :exec
 UPDATE runs SET failed = true WHERE run_id = ANY($1::UUID[])
 `
diff --git a/internal/scheduler/database/query/query.sql b/internal/scheduler/database/query/query.sql
index 5030f21a..e7239a70 100644
--- a/internal/scheduler/database/query/query.sql
+++ b/internal/scheduler/database/query/query.sql
@@ -71,6 +71,9 @@ DELETE FROM markers WHERE created < sqlc.arg(cutoff)::timestamptz;
 -- name: SelectAllMarkers :many
 SELECT * FROM markers;
 
+-- name: InsertMarker :exec
+INSERT INTO markers (group_id, partition_id, created) VALUES ($1, $2, $3) ON CONFLICT DO NOTHING;
+
 -- Run errors
 -- name: SelectRunErrorsById :many
 SELECT * FROM job_run_errors WHERE run_id = ANY(sqlc.arg(run_ids)::UUID[]);
diff --git a/internal/scheduler/publisher.go b/internal/scheduler/publisher.go
index 38d00d5f..6cf73a54 100644
--- a/internal/scheduler/publisher.go
+++ b/internal/scheduler/publisher.go
@@ -125,7 +125,19 @@ func (p *PulsarPublisher) PublishMarkers(ctx context.Context, groupId uuid.UUID)
 			GroupId:   armadaevents.ProtoUuidFromUuid(groupId),
 			Partition: uint32(i),
 		}
-		bytes, err := proto.Marshal(pm)
+		es := &armadaevents.EventSequence{
+			Queue:      "armada-scheduler",
+			JobSetName: "armada-scheduler",
+			Events: []*armadaevents.EventSequence_Event{
+				{
+					Created: now(),
+					Event: &armadaevents.EventSequence_Event_PartitionMarker{
+						PartitionMarker: pm,
+					},
+				},
+			},
+		}
+		bytes, err := proto.Marshal(es)
 		if err != nil {
 			return 0, err
 		}
@@ -173,6 +185,11 @@ func createMessageRouter(options pulsar.ProducerOptions) func(*pulsar.ProducerMe
 	}
 }
 
+func now() *time.Time {
+	t := time.Now()
+	return &t
+}
+
 // JavaStringHash is the default hashing algorithm used by Pulsar
 // copied from https://github.com/apache/pulsar-client-go/blob/master/pulsar/internal/hash.go
 func JavaStringHash(s string) uint32 {
diff --git a/internal/scheduleringester/dbops.go b/internal/scheduleringester/dbops.go
index b6f68e8f..2461d19e 100644
--- a/internal/scheduleringester/dbops.go
+++ b/internal/scheduleringester/dbops.go
@@ -101,6 +101,9 @@ type (
 	MarkRunsFailed             map[uuid.UUID]*JobRunFailed
 	MarkRunsRunning            map[uuid.UUID]bool
 	InsertJobRunErrors         map[uuid.UUID]*schedulerdb.JobRunError
+	InsertPartitionMarker      struct {
+		markers []*schedulerdb.Marker
+	}
 )
 
 type JobSetOperation interface {
@@ -169,6 +172,15 @@ func (a InsertJobRunErrors) Merge(b DbOperation) bool {
 	return mergeInMap(a, b)
 }
 
+func (a InsertPartitionMarker) Merge(b DbOperation) bool {
+	switch op := b.(type) {
+	case InsertPartitionMarker:
+		a.markers = append(a.markers, op.markers...)
+		return true
+	}
+	return false
+}
+
 // mergeInMap merges an op b into a, provided that b is of the same type as a.
 // For example, if a is of type MarkJobSetsCancelRequested, b is only merged if also of type MarkJobsCancelRequested.
 // Returns true if the ops were merged and false otherwise.
@@ -259,6 +271,11 @@ func (a MarkRunsRunning) CanBeAppliedBefore(b DbOperation) bool {
 	return !definesRun(a, b)
 }
 
+func (a InsertPartitionMarker) CanBeAppliedBefore(b DbOperation) bool {
+	// Partition markers can never be brought forward
+	return false
+}
+
 func (a InsertJobRunErrors) CanBeAppliedBefore(_ DbOperation) bool {
 	// Inserting errors before a run has been marked as failed is ok.
 	// We only require that errors are written to the schedulerdb before the run is marked as failed.
diff --git a/internal/scheduleringester/instructions.go b/internal/scheduleringester/instructions.go
index 11abfa77..0f72178c 100644
--- a/internal/scheduleringester/instructions.go
+++ b/internal/scheduleringester/instructions.go
@@ -2,6 +2,7 @@ package scheduleringester
 
 import (
 	"context"
+	"time"
 
 	"github.com/gogo/protobuf/proto"
 	"github.com/pkg/errors"
@@ -97,6 +98,8 @@ func (c *InstructionConverter) convertSequence(es *armadaevents.EventSequence) [
 				operationsFromEvent, err = c.handleCancelJobSet(meta.jobset)
 			case *armadaevents.EventSequence_Event_CancelledJob:
 				operationsFromEvent, err = c.handleCancelledJob(event.GetCancelledJob())
+			case *armadaevents.EventSequence_Event_PartitionMarker:
+				operationsFromEvent, err = c.handlePartitionMarker(event.GetPartitionMarker(), *event.Created)
 			case *armadaevents.EventSequence_Event_ReprioritisedJob,
 				*armadaevents.EventSequence_Event_JobDuplicateDetected,
 				*armadaevents.EventSequence_Event_ResourceUtilisation,
@@ -281,6 +284,18 @@ func (c *InstructionConverter) handleCancelledJob(cancelledJob *armadaevents.Can
 	}}, nil
 }
 
+func (c *InstructionConverter) handlePartitionMarker(pm *armadaevents.PartitionMarker, created time.Time) ([]DbOperation, error) {
+	return []DbOperation{InsertPartitionMarker{
+		markers: []*schedulerdb.Marker{
+			{
+				GroupID:     armadaevents.UuidFromProtoUuid(pm.GroupId),
+				PartitionID: int32(pm.Partition),
+				Created:     created,
+			},
+		},
+	}}, nil
+}
+
 // schedulingInfoFromSubmitJob returns a minimal representation of a job
 // containing only the info needed by the scheduler.
 func (c *InstructionConverter) schedulingInfoFromSubmitJob(submitJob *armadaevents.SubmitJob) (*schedulerobjects.JobSchedulingInfo, error) {
diff --git a/internal/scheduleringester/schedulerdb.go b/internal/scheduleringester/schedulerdb.go
index a3f8c72a..acbe2169 100644
--- a/internal/scheduleringester/schedulerdb.go
+++ b/internal/scheduleringester/schedulerdb.go
@@ -158,10 +158,19 @@ func (s *SchedulerDb) WriteDbOp(ctx context.Context, op DbOperation) error {
 			records[i] = *v
 			i++
 		}
-		err := database.Upsert(ctx, s.db, "job_run_errors", records)
-		if err != nil {
-			return err
+		return database.Upsert(ctx, s.db, "job_run_errors", records)
+	case InsertPartitionMarker:
+		for _, marker := range o.markers {
+			err := queries.InsertMarker(ctx, schedulerdb.InsertMarkerParams{
+				GroupID:     marker.GroupID,
+				PartitionID: marker.PartitionID,
+				Created:     marker.Created,
+			})
+			if err != nil {
+				return errors.Wrapf(err, "error inserting partition marker")
+			}
 		}
+		return nil
 	default:
 		return errors.Errorf("received unexpected op %+v", op)
 	}
diff --git a/pkg/armadaevents/events.pb.go b/pkg/armadaevents/events.pb.go
index 35d0727d..400ddf52 100644
--- a/pkg/armadaevents/events.pb.go
+++ b/pkg/armadaevents/events.pb.go
@@ -139,6 +139,7 @@ type EventSequence_Event struct {
 	//	*EventSequence_Event_StandaloneIngressInfo
 	//	*EventSequence_Event_ResourceUtilisation
 	//	*EventSequence_Event_JobRunPreempted
+	//	*EventSequence_Event_PartitionMarker
 	Event isEventSequence_Event_Event `protobuf_oneof:"event"`
 }
 
@@ -235,6 +236,9 @@ type EventSequence_Event_ResourceUtilisation struct {
 type EventSequence_Event_JobRunPreempted struct {
 	JobRunPreempted *JobRunPreempted `protobuf:"bytes,19,opt,name=jobRunPreempted,proto3,oneof" json:"jobRunPreempted,omitempty"`
 }
+type EventSequence_Event_PartitionMarker struct {
+	PartitionMarker *PartitionMarker `protobuf:"bytes,20,opt,name=partitionMarker,proto3,oneof" json:"partitionMarker,omitempty"`
+}
 
 func (*EventSequence_Event_SubmitJob) isEventSequence_Event_Event()             {}
 func (*EventSequence_Event_ReprioritiseJob) isEventSequence_Event_Event()       {}
@@ -254,6 +258,7 @@ func (*EventSequence_Event_JobDuplicateDetected) isEventSequence_Event_Event()
 func (*EventSequence_Event_StandaloneIngressInfo) isEventSequence_Event_Event() {}
 func (*EventSequence_Event_ResourceUtilisation) isEventSequence_Event_Event()   {}
 func (*EventSequence_Event_JobRunPreempted) isEventSequence_Event_Event()       {}
+func (*EventSequence_Event_PartitionMarker) isEventSequence_Event_Event()       {}
 
 func (m *EventSequence_Event) GetEvent() isEventSequence_Event_Event {
 	if m != nil {
@@ -395,6 +400,13 @@ func (m *EventSequence_Event) GetJobRunPreempted() *JobRunPreempted {
 	return nil
 }
 
+func (m *EventSequence_Event) GetPartitionMarker() *PartitionMarker {
+	if x, ok := m.GetEvent().(*EventSequence_Event_PartitionMarker); ok {
+		return x.PartitionMarker
+	}
+	return nil
+}
+
 // XXX_OneofWrappers is for the internal use of the proto package.
 func (*EventSequence_Event) XXX_OneofWrappers() []interface{} {
 	return []interface{}{
@@ -416,6 +428,7 @@ func (*EventSequence_Event) XXX_OneofWrappers() []interface{} {
 		(*EventSequence_Event_StandaloneIngressInfo)(nil),
 		(*EventSequence_Event_ResourceUtilisation)(nil),
 		(*EventSequence_Event_JobRunPreempted)(nil),
+		(*EventSequence_Event_PartitionMarker)(nil),
 	}
 }
 
@@ -3250,203 +3263,204 @@ func init() {
 func init() { proto.RegisterFile("pkg/armadaevents/events.proto", fileDescriptor_6aab92ca59e015f8) }
 
 var fileDescriptor_6aab92ca59e015f8 = []byte{
-	// 3134 bytes of a gzipped FileDescriptorProto
+	// 3152 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x5b, 0x49, 0x8c, 0x1b, 0xc7,
-	0xd5, 0x56, 0x0f, 0x87, 0xe4, 0xf0, 0x71, 0x38, 0xa4, 0x4a, 0x8b, 0x29, 0x5a, 0x1a, 0xca, 0x6d,
-	0xff, 0x3f, 0x64, 0xc0, 0x26, 0x6d, 0x79, 0x81, 0x97, 0x1f, 0xf6, 0x3f, 0x94, 0xe6, 0xff, 0x25,
-	0x59, 0x63, 0x29, 0x1c, 0xc9, 0x76, 0x0c, 0x07, 0x74, 0xb3, 0xbb, 0x86, 0xd3, 0x1a, 0xb2, 0x8b,
-	0xee, 0x65, 0x34, 0x83, 0xf8, 0x90, 0x00, 0x89, 0x73, 0x4b, 0x8c, 0x20, 0x87, 0xdc, 0x9c, 0x6b,
-	0x0c, 0xe4, 0x1c, 0xe4, 0x98, 0x9b, 0x83, 0x2c, 0x70, 0x6e, 0x39, 0x31, 0x81, 0x75, 0xe3, 0x21,
-	0xd7, 0x2c, 0xa7, 0xa0, 0xb6, 0xee, 0xaa, 0x66, 0x53, 0x1a, 0x68, 0x89, 0x1c, 0xe8, 0x34, 0xd3,
-	0xdf, 0x7b, 0xef, 0x7b, 0xd5, 0xf5, 0xaa, 0x5e, 0xbd, 0xaa, 0x6a, 0xc2, 0xa9, 0xf1, 0xce, 0xa0,
-	0x6d, 0xf9, 0x23, 0xcb, 0xb1, 0xf0, 0x2e, 0xf6, 0xc2, 0xa0, 0xcd, 0xff, 0xb4, 0xc6, 0x3e, 0x09,
-	0x09, 0x5a, 0x56, 0x45, 0x0d, 0x73, 0xe7, 0x95, 0xa0, 0xe5, 0x92, 0xb6, 0x35, 0x76, 0xdb, 0x36,
-	0xf1, 0x71, 0x7b, 0xf7, 0xf9, 0xf6, 0x00, 0x7b, 0xd8, 0xb7, 0x42, 0xec, 0x70, 0x8b, 0xc6, 0x19,
-	0x45, 0xc7, 0xc3, 0xe1, 0x4d, 0xe2, 0xef, 0xb8, 0xde, 0x20, 0x4b, 0xb3, 0x39, 0x20, 0x64, 0x30,
-	0xc4, 0x6d, 0xf6, 0xd4, 0x8f, 0xb6, 0xda, 0xa1, 0x3b, 0xc2, 0x41, 0x68, 0x8d, 0xc6, 0x42, 0xe1,
-	0xc5, 0x84, 0x6a, 0x64, 0xd9, 0xdb, 0xae, 0x87, 0xfd, 0xfd, 0x36, 0x6b, 0xef, 0xd8, 0x6d, 0xfb,
-	0x38, 0x20, 0x91, 0x6f, 0xe3, 0x19, 0xda, 0x67, 0x07, 0x6e, 0xb8, 0x1d, 0xf5, 0x5b, 0x36, 0x19,
-	0xb5, 0x07, 0x64, 0x40, 0x12, 0x7e, 0xfa, 0xc4, 0x1e, 0xd8, 0x7f, 0x5c, 0xdd, 0xfc, 0xd5, 0x61,
-	0xa8, 0xac, 0xd3, 0xd7, 0xdb, 0xc4, 0x1f, 0x45, 0xd8, 0xb3, 0x31, 0x7a, 0x1a, 0xf2, 0x1f, 0x45,
-	0x38, 0xc2, 0x75, 0xe3, 0xb4, 0x71, 0xa6, 0xd4, 0x39, 0x32, 0x9d, 0x34, 0xab, 0x0c, 0x78, 0x86,
-	0x8c, 0xdc, 0x10, 0x8f, 0xc6, 0xe1, 0x7e, 0x97, 0x6b, 0xa0, 0xd7, 0x60, 0xf9, 0x06, 0xe9, 0xf7,
-	0x02, 0x1c, 0xf6, 0x3c, 0x6b, 0x84, 0xeb, 0x0b, 0xcc, 0xa2, 0x3e, 0x9d, 0x34, 0x8f, 0xde, 0x20,
-	0xfd, 0x4d, 0x1c, 0xbe, 0x6d, 0x8d, 0x54, 0x33, 0x48, 0x50, 0xf4, 0x2c, 0x14, 0xa3, 0x00, 0xfb,
-	0x3d, 0xd7, 0xa9, 0xe7, 0x98, 0xd9, 0xd1, 0xe9, 0xa4, 0x59, 0xa3, 0xd0, 0x45, 0x47, 0x31, 0x29,
-	0x70, 0x04, 0x3d, 0x03, 0x85, 0x81, 0x4f, 0xa2, 0x71, 0x50, 0x5f, 0x3c, 0x9d, 0x93, 0xda, 0x1c,
-	0x51, 0xb5, 0x39, 0x82, 0xae, 0x40, 0x81, 0xc7, 0xac, 0x9e, 0x3f, 0x9d, 0x3b, 0x53, 0x3e, 0xfb,
-	0x44, 0x4b, 0x0d, 0x64, 0x4b, 0x7b, 0x61, 0xfe, 0xc4, 0x09, 0xb9, 0x5c, 0x25, 0x14, 0xa1, 0xff,
-	0x71, 0x15, 0xf2, 0x4c, 0x0f, 0x5d, 0x81, 0xa2, 0xed, 0x63, 0xda, 0xe1, 0x75, 0x74, 0xda, 0x38,
-	0x53, 0x3e, 0xdb, 0x68, 0xf1, 0x40, 0xb6, 0x64, 0x47, 0xb7, 0xae, 0xc9, 0x40, 0x76, 0x4e, 0x4c,
-	0x27, 0xcd, 0xc3, 0x42, 0x3d, 0x61, 0xfd, 0xf4, 0xcf, 0x4d, 0xa3, 0x2b, 0x59, 0xd0, 0x55, 0x28,
-	0x05, 0x51, 0x7f, 0xe4, 0x86, 0x97, 0x48, 0x9f, 0xf5, 0x79, 0xf9, 0xec, 0x63, 0x7a, 0x73, 0x37,
-	0xa5, 0xb8, 0xf3, 0xd8, 0x74, 0xd2, 0x3c, 0x12, 0x6b, 0x27, 0x8c, 0x17, 0x0e, 0x75, 0x13, 0x12,
-	0xb4, 0x0d, 0x55, 0x1f, 0x8f, 0x7d, 0x97, 0xf8, 0x6e, 0xe8, 0x06, 0x98, 0xf2, 0x2e, 0x30, 0xde,
-	0x53, 0x3a, 0x6f, 0x57, 0x57, 0xea, 0x9c, 0x9a, 0x4e, 0x9a, 0x27, 0x52, 0x96, 0x9a, 0x8f, 0x34,
-	0x2d, 0x0a, 0x01, 0xa5, 0xa0, 0x4d, 0x1c, 0xb2, 0x78, 0x96, 0xcf, 0x9e, 0xbe, 0xad, 0xb3, 0x4d,
-	0x1c, 0x76, 0x4e, 0x4f, 0x27, 0xcd, 0x93, 0xb3, 0xf6, 0x9a, 0xcb, 0x0c, 0x7e, 0x34, 0x84, 0x9a,
-	0x8a, 0x3a, 0xf4, 0x05, 0x17, 0x99, 0xcf, 0xd5, 0xf9, 0x3e, 0xa9, 0x56, 0x67, 0x75, 0x3a, 0x69,
-	0x36, 0xd2, 0xb6, 0x9a, 0xbf, 0x19, 0x66, 0x1a, 0x1f, 0xdb, 0xf2, 0x6c, 0x3c, 0xa4, 0x6e, 0xf2,
-	0x59, 0xf1, 0x39, 0x27, 0xc5, 0x3c, 0x3e, 0xb1, 0xb6, 0x1e, 0x9f, 0x18, 0x46, 0x1f, 0xc0, 0x72,
-	0xfc, 0x40, 0xfb, 0xab, 0x20, 0xc6, 0x51, 0x36, 0x29, 0xed, 0xa9, 0xc6, 0x74, 0xd2, 0x3c, 0xae,
-	0xda, 0x68, 0xd4, 0x1a, 0x5b, 0xc2, 0x3e, 0xe4, 0x3d, 0x53, 0x9c, 0xcf, 0xce, 0x35, 0x54, 0xf6,
-	0xe1, 0x6c, 0x8f, 0x68, 0x6c, 0x94, 0x9d, 0x4e, 0xe2, 0xc8, 0xb6, 0x31, 0x76, 0xb0, 0x53, 0x5f,
-	0xca, 0x62, 0xbf, 0xa4, 0x68, 0x70, 0x76, 0xd5, 0x46, 0x67, 0x57, 0x25, 0xb4, 0xaf, 0x6f, 0x90,
-	0xfe, 0xba, 0xef, 0x13, 0x3f, 0xa8, 0x97, 0xb2, 0xfa, 0xfa, 0x92, 0x14, 0xf3, 0xbe, 0x8e, 0xb5,
-	0xf5, 0xbe, 0x8e, 0x61, 0xd1, 0xde, 0x6e, 0xe4, 0x5d, 0xc6, 0x56, 0x80, 0x9d, 0x3a, 0xcc, 0x69,
-	0x6f, 0xac, 0x11, 0xb7, 0x37, 0x46, 0x66, 0xda, 0x1b, 0x4b, 0x90, 0x03, 0x2b, 0xfc, 0x79, 0x2d,
-	0x08, 0xdc, 0x81, 0x87, 0x9d, 0x7a, 0x99, 0xf1, 0x9f, 0xcc, 0xe2, 0x97, 0x3a, 0x9d, 0x93, 0xd3,
-	0x49, 0xb3, 0xae, 0xdb, 0x69, 0x3e, 0x52, 0x9c, 0xe8, 0x43, 0xa8, 0x70, 0xa4, 0x1b, 0x79, 0x9e,
-	0xeb, 0x0d, 0xea, 0xcb, 0xcc, 0xc9, 0xe3, 0x59, 0x4e, 0x84, 0x4a, 0xe7, 0xf1, 0xe9, 0xa4, 0xf9,
-	0x98, 0x66, 0xa5, 0xb9, 0xd0, 0x09, 0x69, 0xc6, 0xe0, 0x40, 0x12, 0xd8, 0x4a, 0x56, 0xc6, 0xb8,
-	0xa4, 0x2b, 0xf1, 0x8c, 0x91, 0xb2, 0xd4, 0x33, 0x46, 0x4a, 0x98, 0xc4, 0x43, 0x04, 0x79, 0x65,
-	0x7e, 0x3c, 0x44, 0x9c, 0x95, 0x78, 0x64, 0x84, 0x5a, 0x63, 0x43, 0x1f, 0x03, 0x5d, 0x78, 0xce,
-	0x47, 0xe3, 0xa1, 0x6b, 0x5b, 0x21, 0x3e, 0x8f, 0x43, 0x6c, 0xd3, 0x4c, 0x5d, 0x65, 0x5e, 0xcc,
-	0x19, 0x2f, 0x33, 0x9a, 0x1d, 0x73, 0x3a, 0x69, 0xae, 0x66, 0x71, 0x68, 0x5e, 0x33, 0xbd, 0xa0,
-	0xef, 0x18, 0x70, 0x2c, 0x08, 0x2d, 0xcf, 0xb1, 0x86, 0xc4, 0xc3, 0x17, 0xbd, 0x81, 0x8f, 0x83,
-	0xe0, 0xa2, 0xb7, 0x45, 0xea, 0x35, 0xe6, 0xff, 0xc9, 0x54, 0x5a, 0xcf, 0x52, 0xed, 0x3c, 0x39,
-	0x9d, 0x34, 0x9b, 0x99, 0x2c, 0x5a, 0x0b, 0xb2, 0x1d, 0xa1, 0x3d, 0x38, 0x22, 0x2b, 0x83, 0xeb,
-	0xa1, 0x3b, 0x74, 0x03, 0x2b, 0x74, 0x89, 0x57, 0x3f, 0xcc, 0xfc, 0x3f, 0x91, 0xce, 0x8e, 0x33,
-	0x8a, 0x9d, 0x27, 0xa6, 0x93, 0xe6, 0xa9, 0x0c, 0x06, 0xcd, 0x77, 0x96, 0x8b, 0x64, 0x08, 0x5d,
-	0xf5, 0x31, 0x55, 0xc4, 0x4e, 0xfd, 0xc8, 0xfc, 0x21, 0x14, 0x2b, 0xa9, 0x43, 0x28, 0x06, 0xb3,
-	0x86, 0x50, 0x62, 0x51, 0x84, 0x3c, 0xe3, 0x32, 0xa7, 0x05, 0x38, 0x92, 0xf1, 0x12, 0xe8, 0x0d,
-	0x28, 0xf8, 0x91, 0x47, 0x2b, 0x0b, 0xbe, 0x9c, 0x22, 0xbd, 0x05, 0xd7, 0x23, 0xd7, 0xe1, 0x65,
-	0x8d, 0x1f, 0x79, 0x5a, 0xb1, 0x91, 0x67, 0x00, 0xb5, 0xa7, 0x65, 0x8d, 0xeb, 0x88, 0x65, 0x73,
-	0xae, 0xfd, 0x0d, 0xd2, 0xd7, 0xed, 0x19, 0x80, 0x30, 0x54, 0x64, 0x0f, 0xf5, 0x5c, 0x1a, 0x7e,
-	0xbe, 0x20, 0x3e, 0xa5, 0xd3, 0xbc, 0x15, 0xf5, 0xb1, 0xef, 0xe1, 0x10, 0x07, 0xf2, 0x1d, 0x58,
-	0xfc, 0xd9, 0x70, 0xf7, 0x15, 0x44, 0xe1, 0x5f, 0x56, 0x71, 0xf4, 0x13, 0x03, 0xea, 0x23, 0x6b,
-	0xaf, 0x27, 0xc1, 0xa0, 0xb7, 0x45, 0xfc, 0xde, 0x18, 0xfb, 0x2e, 0x71, 0x58, 0x95, 0x54, 0x3e,
-	0xfb, 0x3f, 0x77, 0x8c, 0x78, 0x6b, 0xc3, 0xda, 0x93, 0x70, 0xf0, 0x7f, 0xc4, 0xbf, 0xca, 0xcc,
-	0xd7, 0xbd, 0xd0, 0xdf, 0xef, 0x9c, 0xfa, 0x62, 0xd2, 0x3c, 0x34, 0x9d, 0x34, 0x8f, 0x8d, 0xb2,
-	0x74, 0xba, 0xd9, 0x30, 0xfa, 0x91, 0x01, 0xc7, 0x43, 0x12, 0x5a, 0xc3, 0x9e, 0x1d, 0x8d, 0xa2,
-	0xa1, 0x15, 0xba, 0xbb, 0xb8, 0x17, 0x05, 0xd6, 0x00, 0x8b, 0x62, 0xec, 0xf5, 0x3b, 0x37, 0xea,
-	0x1a, 0xb5, 0x3f, 0x17, 0x9b, 0x5f, 0xa7, 0xd6, 0xbc, 0x4d, 0x27, 0x45, 0x9b, 0x8e, 0x86, 0x19,
-	0x2a, 0xdd, 0x4c, 0xb4, 0xf1, 0x33, 0x03, 0x1a, 0xf3, 0x5f, 0x13, 0x3d, 0x09, 0xb9, 0x1d, 0xbc,
-	0x2f, 0xca, 0xdd, 0xc3, 0xd3, 0x49, 0xb3, 0xb2, 0x83, 0xf7, 0x95, 0x5e, 0xa7, 0x52, 0xf4, 0x4d,
-	0xc8, 0xef, 0x5a, 0xc3, 0x08, 0x8b, 0x21, 0xd1, 0x6a, 0xf1, 0xe2, 0xbc, 0xa5, 0x16, 0xe7, 0xad,
-	0xf1, 0xce, 0x80, 0x02, 0x2d, 0x19, 0x91, 0xd6, 0x37, 0x22, 0xcb, 0x0b, 0xdd, 0x70, 0x9f, 0x0f,
-	0x17, 0x46, 0xa0, 0x0e, 0x17, 0x06, 0xbc, 0xb6, 0xf0, 0x8a, 0xd1, 0xf8, 0xcc, 0x80, 0x13, 0x73,
-	0x5f, 0xfa, 0xeb, 0xd0, 0x42, 0xb3, 0x07, 0x8b, 0x74, 0xe0, 0xd3, 0x42, 0x7c, 0xdb, 0x1d, 0x6c,
-	0xbf, 0xfc, 0x22, 0x6b, 0x4e, 0x81, 0xd7, 0xcd, 0x1c, 0x51, 0xeb, 0x66, 0x8e, 0xd0, 0xcd, 0xc4,
-	0x90, 0xdc, 0x7c, 0xf9, 0x45, 0xd6, 0xa8, 0x02, 0x77, 0xc2, 0x00, 0xd5, 0x09, 0x03, 0xcc, 0xbf,
-	0xe5, 0xa1, 0x14, 0x57, 0xba, 0xca, 0x1c, 0x34, 0xee, 0x6a, 0x0e, 0x5e, 0x80, 0x9a, 0x83, 0x1d,
-	0x91, 0xa2, 0x5d, 0xe2, 0xc9, 0xd9, 0x5c, 0xe2, 0x09, 0x47, 0x93, 0x69, 0xf6, 0xd5, 0x94, 0x08,
-	0x9d, 0x85, 0x25, 0x51, 0x11, 0xee, 0xb3, 0x89, 0x5c, 0xe9, 0x1c, 0x9f, 0x4e, 0x9a, 0x48, 0x62,
-	0x8a, 0x69, 0xac, 0x87, 0xba, 0x00, 0xa4, 0x7f, 0x03, 0xdb, 0xe1, 0x06, 0x0e, 0x2d, 0x51, 0x9b,
-	0xd6, 0xf5, 0x37, 0xb8, 0x12, 0xcb, 0xf9, 0x86, 0x29, 0xd1, 0x57, 0x37, 0x4c, 0x09, 0x8a, 0x3e,
-	0x00, 0x18, 0x59, 0xae, 0xc7, 0xed, 0x44, 0x21, 0x6a, 0xce, 0x4b, 0x29, 0x1b, 0xb1, 0x26, 0x67,
-	0x4f, 0x2c, 0x55, 0xf6, 0x04, 0xa5, 0xdb, 0x1a, 0xee, 0x2b, 0xa8, 0x17, 0xd8, 0x2c, 0x5d, 0x9d,
-	0x47, 0x2d, 0x68, 0x8f, 0xd1, 0xad, 0x8d, 0x30, 0x51, 0x38, 0x25, 0x0b, 0xed, 0xb6, 0xa1, 0xbb,
-	0x85, 0xe9, 0xa6, 0x96, 0x95, 0xa0, 0xa2, 0xdb, 0x24, 0xa6, 0x76, 0x9b, 0xc4, 0xd0, 0x2b, 0x00,
-	0x56, 0xb8, 0x41, 0x82, 0xf0, 0x8a, 0x67, 0x63, 0x56, 0x5a, 0x2e, 0xf1, 0xe6, 0x27, 0xa8, 0xda,
-	0xfc, 0x04, 0x45, 0xaf, 0x43, 0x79, 0xcc, 0x17, 0x08, 0xb7, 0x3f, 0xc4, 0xac, 0x74, 0x5c, 0x62,
-	0xbb, 0xaf, 0x63, 0x0a, 0xac, 0xd8, 0xaa, 0xda, 0xe8, 0xff, 0xa1, 0x6a, 0x13, 0xcf, 0x8e, 0x7c,
-	0x1f, 0x7b, 0xf6, 0xfe, 0xa6, 0xb5, 0x85, 0x59, 0x99, 0xb8, 0xc4, 0x87, 0x4a, 0x4a, 0xa4, 0x0e,
-	0x95, 0x94, 0x08, 0xbd, 0x04, 0xa5, 0xc0, 0xde, 0xc6, 0x4e, 0x34, 0xc4, 0x3e, 0xab, 0x04, 0x4b,
-	0x62, 0xc7, 0x26, 0x41, 0xc5, 0x38, 0xd1, 0x34, 0x7f, 0x67, 0xc0, 0xd1, 0xac, 0xd0, 0xa5, 0x86,
-	0x91, 0x71, 0x5f, 0x86, 0xd1, 0x3b, 0xb0, 0x34, 0x26, 0x4e, 0x2f, 0x18, 0x63, 0x5b, 0x64, 0x8a,
-	0xd4, 0x20, 0xba, 0x4a, 0x9c, 0xcd, 0x31, 0xb6, 0xdf, 0x75, 0xc3, 0xed, 0xb5, 0x5d, 0xe2, 0x3a,
-	0x97, 0xdd, 0x40, 0x44, 0x7b, 0xcc, 0x25, 0xda, 0xea, 0x5c, 0x14, 0x60, 0x67, 0x09, 0x0a, 0xdc,
-	0x8b, 0xf9, 0x87, 0x1c, 0xd4, 0xd2, 0xc3, 0xe5, 0x3f, 0xe9, 0x55, 0xd0, 0x7b, 0x50, 0x74, 0x79,
-	0x4d, 0x25, 0x56, 0xee, 0xff, 0x52, 0x72, 0x69, 0x2b, 0x39, 0xd5, 0x69, 0xed, 0x3e, 0xdf, 0x12,
-	0xc5, 0x17, 0xeb, 0x02, 0xc6, 0x2c, 0x2c, 0x75, 0x66, 0x01, 0xa2, 0x2e, 0x14, 0x03, 0xec, 0xef,
-	0xba, 0x36, 0x16, 0x49, 0xa1, 0xa9, 0x32, 0xdb, 0xc4, 0xc7, 0x94, 0x73, 0x93, 0xab, 0x24, 0x9c,
-	0xc2, 0x46, 0xe7, 0x14, 0x20, 0x7a, 0x07, 0x4a, 0x36, 0xf1, 0xb6, 0xdc, 0xc1, 0x86, 0x35, 0x16,
-	0x69, 0xe1, 0x54, 0x16, 0xeb, 0x39, 0xa9, 0x24, 0x76, 0xa9, 0xf2, 0x31, 0xb5, 0x4b, 0x8d, 0xb5,
-	0x92, 0x80, 0xfe, 0x75, 0x11, 0x20, 0x09, 0x0e, 0x7a, 0x15, 0xca, 0x78, 0x0f, 0xdb, 0x51, 0x48,
-	0x7c, 0x99, 0x9f, 0xc5, 0xa1, 0x8f, 0x84, 0xb5, 0x84, 0x0a, 0x09, 0x4a, 0x27, 0x88, 0x67, 0x8d,
-	0x70, 0x30, 0xb6, 0x6c, 0x79, 0x5a, 0xc4, 0x1a, 0x13, 0x83, 0xea, 0x04, 0x89, 0x41, 0xf4, 0xdf,
-	0xb0, 0xc8, 0xce, 0x97, 0xf8, 0x41, 0x11, 0x9a, 0x4e, 0x9a, 0x2b, 0x9e, 0x7e, 0xb2, 0xc4, 0xe4,
-	0xe8, 0x4d, 0xa8, 0xec, 0xc4, 0x03, 0x8f, 0xb6, 0x6d, 0x91, 0x19, 0xb0, 0x92, 0x2a, 0x11, 0x68,
-	0xad, 0x5b, 0x56, 0x71, 0xb4, 0x05, 0x65, 0xcb, 0xf3, 0x48, 0xc8, 0x72, 0xbf, 0x3c, 0x3c, 0x7a,
-	0x7a, 0xde, 0x30, 0x6d, 0xad, 0x25, 0xba, 0xbc, 0x3a, 0x61, 0x19, 0x47, 0x61, 0x50, 0x33, 0x8e,
-	0x02, 0xa3, 0x2e, 0x14, 0x86, 0x56, 0x1f, 0x0f, 0x65, 0xb2, 0x7d, 0x6a, 0xae, 0x8b, 0xcb, 0x4c,
-	0x8d, 0xb3, 0xb3, 0xa5, 0x96, 0xdb, 0xa9, 0x4b, 0x2d, 0x47, 0x1a, 0x5b, 0x50, 0x4b, 0xb7, 0xe7,
-	0x60, 0x85, 0xc3, 0xd3, 0x6a, 0xe1, 0x50, 0xba, 0x63, 0xa9, 0x62, 0x41, 0x59, 0x69, 0xd4, 0x83,
-	0x70, 0x61, 0xfe, 0xdc, 0x80, 0xa3, 0x59, 0x73, 0x17, 0x6d, 0x28, 0x33, 0xde, 0x10, 0x9b, 0xe0,
-	0x8c, 0xa1, 0x2e, 0x6c, 0xe7, 0x4c, 0xf5, 0x64, 0xa2, 0x77, 0x60, 0xc5, 0x23, 0x0e, 0xee, 0x59,
-	0xd4, 0xc1, 0xd0, 0x0d, 0xc2, 0xfa, 0x02, 0x3b, 0x5c, 0x64, 0x9b, 0x67, 0x2a, 0x59, 0x93, 0x02,
-	0xc5, 0xba, 0xa2, 0x09, 0xcc, 0xef, 0x1b, 0x50, 0x4d, 0x9d, 0x6d, 0xdd, 0x73, 0xf1, 0xa2, 0x96,
-	0x1c, 0x0b, 0x07, 0x2b, 0x39, 0xcc, 0x0b, 0x80, 0x66, 0x8f, 0xd8, 0x34, 0x26, 0xe3, 0x80, 0x4c,
-	0x9f, 0x18, 0x50, 0x4b, 0x9f, 0x9c, 0x3d, 0x94, 0x57, 0x7a, 0x0b, 0x4a, 0xf1, 0x29, 0xd8, 0xbd,
-	0x36, 0xc0, 0x5c, 0x81, 0x65, 0xf5, 0x48, 0xcd, 0x7c, 0x5b, 0x3e, 0x0f, 0xef, 0xcb, 0x0b, 0x9a,
-	0xbf, 0x34, 0x60, 0x59, 0x3d, 0xf7, 0xba, 0xe7, 0x1e, 0x1b, 0x24, 0xbb, 0x48, 0xba, 0xdd, 0x0b,
-	0xd8, 0xd8, 0x3c, 0xe8, 0x2e, 0x92, 0x8d, 0x60, 0xcd, 0x5c, 0x1d, 0xc1, 0x9a, 0xc0, 0xfc, 0x0d,
-	0x6f, 0x79, 0x72, 0xaa, 0xf5, 0xb0, 0xf7, 0xcf, 0xa9, 0x05, 0x26, 0x77, 0xf0, 0x05, 0xc6, 0xfc,
-	0x87, 0x01, 0x2b, 0xfa, 0x69, 0xdb, 0x43, 0x7f, 0x9b, 0x99, 0x38, 0xe6, 0x1e, 0x50, 0x1c, 0xff,
-	0x6e, 0x40, 0x45, 0x3b, 0x04, 0x7c, 0x74, 0x5e, 0xfd, 0xa7, 0x0b, 0x70, 0x3c, 0x9b, 0xe6, 0x81,
-	0x14, 0x9e, 0x17, 0x80, 0x2e, 0x21, 0xec, 0x64, 0x8f, 0x77, 0xcc, 0xb1, 0x99, 0xba, 0x93, 0xbd,
-	0x82, 0x5c, 0x7f, 0x66, 0x4e, 0xef, 0xa4, 0x39, 0x7a, 0x0f, 0xca, 0xae, 0x72, 0x4e, 0xc8, 0xcb,
-	0xcd, 0x13, 0x3a, 0x9b, 0x7a, 0x3a, 0xc8, 0x0a, 0x0c, 0x77, 0xce, 0x99, 0xa0, 0x4a, 0xd5, 0x29,
-	0xc0, 0xa2, 0xeb, 0x6d, 0x11, 0x73, 0x17, 0x8a, 0xa2, 0x39, 0xe8, 0x05, 0x28, 0xb1, 0xe5, 0x8e,
-	0xd5, 0x52, 0x7c, 0xc1, 0x66, 0x49, 0x98, 0x82, 0xa9, 0x9b, 0xba, 0x25, 0x89, 0xa1, 0x97, 0x01,
-	0xe8, 0x92, 0xeb, 0x45, 0xa3, 0x3e, 0xf6, 0xd9, 0xeb, 0xe6, 0x79, 0xcd, 0x36, 0x26, 0xce, 0xdb,
-	0x0c, 0x54, 0x6b, 0xb6, 0x18, 0x34, 0x7f, 0xb1, 0x00, 0x65, 0xf5, 0x64, 0xf2, 0xae, 0x9c, 0x7f,
-	0x0c, 0xb2, 0x9e, 0xee, 0x59, 0x8e, 0x43, 0xff, 0x62, 0x99, 0x07, 0xdb, 0x73, 0x3b, 0x49, 0xfe,
-	0xbf, 0x26, 0x2d, 0x78, 0xf5, 0xc4, 0xee, 0x7e, 0xdc, 0x94, 0x48, 0xf1, 0x5a, 0x4b, 0xcb, 0x1a,
-	0x3b, 0x70, 0x2c, 0x93, 0x4a, 0xad, 0x79, 0xf2, 0xf7, 0xab, 0xe6, 0xf9, 0x75, 0x1e, 0x8e, 0x65,
-	0x9e, 0x08, 0x3f, 0xf4, 0x59, 0xac, 0xcf, 0xa0, 0xdc, 0x7d, 0x99, 0x41, 0x9f, 0x18, 0x59, 0x91,
-	0xe5, 0x87, 0x96, 0xaf, 0x1e, 0xe0, 0x98, 0xfc, 0x7e, 0xc5, 0x58, 0x1f, 0x96, 0xf9, 0xbb, 0x9a,
-	0x13, 0x85, 0x83, 0xce, 0x09, 0xf4, 0x1c, 0x2f, 0x5f, 0x99, 0xaf, 0x22, 0xf3, 0x25, 0x33, 0x44,
-	0xca, 0x55, 0x51, 0x40, 0x74, 0x47, 0x23, 0x2d, 0xf8, 0xa6, 0x69, 0x29, 0xd9, 0xd1, 0x08, 0x9d,
-	0xf4, 0xbe, 0x69, 0x59, 0xc5, 0xff, 0xbd, 0x63, 0xf8, 0x9f, 0x06, 0x54, 0x53, 0x57, 0x44, 0x8f,
-	0xce, 0x1a, 0xf4, 0x43, 0x03, 0x4a, 0xf1, 0xed, 0xe4, 0x3d, 0x57, 0x7f, 0x6b, 0x50, 0xc0, 0xfc,
-	0x86, 0x8c, 0xa7, 0xbb, 0x23, 0xa9, 0x2f, 0x18, 0xa8, 0x4c, 0x7c, 0xb3, 0x90, 0xba, 0x14, 0xeb,
-	0x0a, 0x43, 0xf3, 0x8f, 0x71, 0x5d, 0x97, 0xb4, 0xe9, 0xa1, 0x86, 0x22, 0x79, 0xa7, 0xdc, 0xdd,
-	0xbe, 0xd3, 0x6f, 0x8b, 0x90, 0x67, 0x7a, 0x74, 0x43, 0x11, 0x62, 0x7f, 0xe4, 0x7a, 0xd6, 0x90,
-	0xbd, 0xce, 0x12, 0x9f, 0xb7, 0x12, 0x53, 0xe7, 0xad, 0xc4, 0xd0, 0x36, 0x54, 0x93, 0xed, 0x3e,
-	0xa3, 0xc9, 0xfe, 0x30, 0xe2, 0x2d, 0x5d, 0x89, 0x9f, 0x03, 0xa6, 0x2c, 0xf5, 0x3b, 0xaa, 0x94,
-	0x10, 0x39, 0xb0, 0x62, 0x13, 0x2f, 0xb4, 0x5c, 0x0f, 0xfb, 0xdc, 0x51, 0x2e, 0xeb, 0x62, 0xf8,
-	0x9c, 0xa6, 0xc3, 0x2f, 0x86, 0x75, 0x3b, 0xfd, 0x62, 0x58, 0x97, 0xa1, 0x0f, 0xa1, 0x22, 0x6b,
-	0x5f, 0xee, 0x64, 0x31, 0xeb, 0x62, 0x78, 0x5d, 0x55, 0xe1, 0x43, 0x5a, 0xb3, 0xd2, 0x2f, 0x86,
-	0x35, 0x11, 0x1a, 0x42, 0x6d, 0x4c, 0x9c, 0xeb, 0x9e, 0x38, 0xac, 0xb4, 0xfa, 0x43, 0x2c, 0xce,
-	0x98, 0x56, 0x67, 0x4a, 0x1e, 0x4d, 0x8b, 0xa7, 0xe2, 0xb4, 0xad, 0xfe, 0xa9, 0x45, 0x5a, 0x8a,
-	0x3e, 0x80, 0xe5, 0x21, 0xdd, 0x82, 0xac, 0xef, 0x8d, 0x5d, 0x1f, 0x3b, 0xd9, 0x1f, 0x46, 0x5c,
-	0x56, 0x34, 0x78, 0x22, 0x54, 0x6d, 0xf4, 0xcb, 0x61, 0x55, 0x42, 0xa3, 0x3f, 0xb2, 0xf6, 0xba,
-	0x91, 0x17, 0xac, 0xef, 0x89, 0x4b, 0xee, 0x62, 0x56, 0xf4, 0x37, 0x74, 0x25, 0x1e, 0xfd, 0x94,
-	0xa5, 0x1e, 0xfd, 0x94, 0x10, 0x5d, 0x66, 0x79, 0x9e, 0x87, 0x84, 0x7f, 0x20, 0x71, 0x7c, 0xa6,
-	0xb7, 0x78, 0x34, 0xf8, 0x26, 0x58, 0x3c, 0x69, 0xa4, 0x31, 0x83, 0x88, 0x01, 0x7b, 0xed, 0x2e,
-	0x0e, 0x23, 0xdf, 0xc3, 0x8e, 0xf8, 0x36, 0x62, 0x36, 0x06, 0x9a, 0x56, 0x1c, 0x03, 0x0d, 0x9d,
-	0x89, 0x81, 0x26, 0xa5, 0x63, 0x6a, 0x4c, 0x9c, 0x6b, 0x7c, 0xca, 0x84, 0xf1, 0x17, 0x13, 0x8f,
-	0xcf, 0xb8, 0x4a, 0x54, 0xf8, 0x98, 0xd2, 0xac, 0xf4, 0x31, 0xa5, 0x89, 0x3a, 0x4b, 0x50, 0xf0,
-	0xb1, 0x15, 0x10, 0xcf, 0xfc, 0xcc, 0x80, 0x6a, 0x6a, 0xae, 0xa1, 0x37, 0x20, 0xbe, 0xe5, 0xbc,
-	0xb6, 0x3f, 0x96, 0xa5, 0xa2, 0x76, 0x2b, 0x4a, 0xf1, 0xac, 0x5b, 0x51, 0x8a, 0xa3, 0xcb, 0x00,
-	0x71, 0x5e, 0xbe, 0x5d, 0xa2, 0x62, 0x75, 0x4a, 0xa2, 0xa9, 0xd6, 0x29, 0x09, 0x6a, 0xde, 0x5a,
-	0x80, 0x25, 0x19, 0xac, 0x07, 0xb2, 0x95, 0x68, 0x43, 0x71, 0x84, 0x03, 0x76, 0x3b, 0xba, 0x90,
-	0x54, 0x04, 0x02, 0x52, 0x2b, 0x02, 0x01, 0xe9, 0x05, 0x4b, 0xee, 0xae, 0x0a, 0x96, 0xc5, 0x03,
-	0x17, 0x2c, 0x98, 0xdd, 0x8c, 0x28, 0x29, 0x47, 0x9e, 0x89, 0xde, 0x3e, 0x8f, 0xc9, 0x7b, 0x13,
-	0xd5, 0x30, 0x75, 0x6f, 0xa2, 0x8a, 0xcc, 0xdf, 0xe7, 0x61, 0x45, 0xa7, 0x78, 0x20, 0x7d, 0xfd,
-	0x02, 0x94, 0xf0, 0x9e, 0x1b, 0xf6, 0x6c, 0xe2, 0x60, 0xb1, 0x93, 0x61, 0x5d, 0x47, 0xc1, 0x73,
-	0xc4, 0xd1, 0xba, 0x4e, 0x62, 0x6a, 0x80, 0x72, 0x07, 0x0a, 0xd0, 0x33, 0x72, 0x78, 0x8b, 0xd3,
-	0x67, 0xb6, 0xa0, 0x71, 0x44, 0x5d, 0xd0, 0x38, 0x82, 0x06, 0x50, 0x26, 0x51, 0x78, 0x65, 0x6b,
-	0x03, 0x8f, 0x88, 0xbf, 0x2f, 0x72, 0xeb, 0x99, 0xdb, 0xf5, 0x6e, 0xeb, 0x4a, 0xa2, 0xcf, 0xf7,
-	0x83, 0x0a, 0x81, 0xbe, 0x1f, 0x54, 0x04, 0xe8, 0x7f, 0x21, 0xcf, 0xd6, 0x50, 0x91, 0x54, 0x33,
-	0xd7, 0x5e, 0xb6, 0x78, 0xe3, 0x99, 0x54, 0xc4, 0x0d, 0xd1, 0xbb, 0x50, 0xc4, 0xbb, 0x2e, 0xfb,
-	0x9e, 0xa6, 0x98, 0xf5, 0x41, 0x43, 0xaa, 0x99, 0xeb, 0x5c, 0x97, 0xf7, 0x97, 0x30, 0xd4, 0x37,
-	0xc1, 0x02, 0x44, 0xdf, 0x86, 0x9a, 0x83, 0x2d, 0x67, 0xe8, 0x7a, 0x38, 0xce, 0xcc, 0x3c, 0x6d,
-	0x3e, 0x7b, 0x5b, 0x0f, 0xe7, 0x53, 0x46, 0x3c, 0xdf, 0xa5, 0xa9, 0xf4, 0x7c, 0x97, 0x96, 0x36,
-	0x2a, 0x50, 0x56, 0x3a, 0xb4, 0x51, 0x4b, 0x8f, 0xc4, 0x46, 0x09, 0x8a, 0xe2, 0x55, 0x1a, 0x08,
-	0x6a, 0x33, 0x3e, 0x91, 0x7a, 0xd9, 0xd5, 0xe5, 0x79, 0xed, 0xd3, 0x05, 0xa8, 0xa5, 0x93, 0xf1,
-	0xd7, 0x23, 0x7b, 0xe8, 0x89, 0x20, 0x77, 0xe0, 0x44, 0xf0, 0x26, 0x54, 0x68, 0xe9, 0x68, 0x85,
-	0xa1, 0xf8, 0xb6, 0x67, 0x91, 0x95, 0x5c, 0x3c, 0x2d, 0x47, 0xde, 0x9a, 0xc4, 0xb5, 0xb4, 0xac,
-	0xe0, 0xe6, 0x77, 0x17, 0xa0, 0xa2, 0x2d, 0x1a, 0x8f, 0x5e, 0x36, 0x35, 0xab, 0x50, 0xd1, 0x6a,
-	0x31, 0xf3, 0x7b, 0x7c, 0x9c, 0xe8, 0x45, 0xd0, 0xa3, 0xd7, 0x2f, 0x2b, 0xb0, 0xac, 0x16, 0x75,
-	0xe6, 0x61, 0xa8, 0xa6, 0x6a, 0x30, 0xf3, 0x73, 0x03, 0x8e, 0x66, 0x7d, 0xaf, 0x87, 0x2e, 0x00,
-	0x78, 0xf8, 0x66, 0xef, 0x8e, 0x7b, 0x2d, 0xde, 0x7a, 0x7c, 0xf3, 0x52, 0x6a, 0x6b, 0xb2, 0x24,
-	0x31, 0xca, 0x44, 0x86, 0x4e, 0xef, 0x8e, 0x3b, 0x1c, 0xc6, 0x44, 0x86, 0xce, 0x0c, 0x93, 0xc4,
-	0xcc, 0x1f, 0xe4, 0xe4, 0x36, 0x38, 0xfe, 0x68, 0x0d, 0xbd, 0x0f, 0xb5, 0xb1, 0x7c, 0xb8, 0x73,
-	0x6b, 0xd9, 0x46, 0x20, 0xd6, 0x4f, 0x7b, 0x5a, 0xd1, 0x25, 0x3a, 0xb7, 0xd8, 0xe1, 0x2d, 0x1c,
-	0x90, 0xbb, 0x9b, 0xda, 0xea, 0xad, 0xe8, 0x12, 0xf4, 0x2d, 0x38, 0x2c, 0x3f, 0x95, 0xd8, 0xc5,
-	0xb2, 0xe1, 0xb9, 0xb9, 0xe4, 0x6c, 0xe5, 0x4f, 0x0c, 0xd2, 0x2d, 0xaf, 0xa6, 0x44, 0x29, 0x7a,
-	0xd1, 0xf6, 0xc5, 0x83, 0xd2, 0xa7, 0x1b, 0x5f, 0x4d, 0x89, 0xe8, 0x9e, 0xbc, 0x7a, 0xd5, 0xf2,
-	0x43, 0x37, 0x74, 0x89, 0xb7, 0x61, 0xf9, 0x3b, 0xd8, 0x47, 0xe7, 0x61, 0x89, 0xfd, 0x4a, 0xe0,
-	0xf6, 0x11, 0x60, 0x13, 0x84, 0xe9, 0x69, 0x1e, 0x8a, 0x02, 0x42, 0x2f, 0x41, 0x69, 0x2c, 0x89,
-	0xc5, 0x85, 0x16, 0x1f, 0xea, 0x12, 0xd4, 0x86, 0xba, 0x04, 0x3b, 0x37, 0xbe, 0xf8, 0x6a, 0xd5,
-	0xf8, 0xf2, 0xab, 0x55, 0xe3, 0x2f, 0x5f, 0xad, 0x1a, 0x9f, 0xde, 0x5a, 0x3d, 0xf4, 0xe5, 0xad,
-	0xd5, 0x43, 0x7f, 0xba, 0xb5, 0x7a, 0xe8, 0xfd, 0xe7, 0x94, 0xdf, 0x6d, 0xf0, 0xe6, 0x8c, 0x7d,
-	0x42, 0x27, 0xb0, 0x78, 0x6a, 0xa7, 0x7f, 0xa9, 0xf2, 0xf9, 0xc2, 0xa9, 0x35, 0xf6, 0x78, 0x95,
-	0xeb, 0xb5, 0x2e, 0x92, 0x16, 0x07, 0xd8, 0x0f, 0x15, 0x82, 0x7e, 0x81, 0xfd, 0x20, 0xe1, 0x85,
-	0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0x61, 0x21, 0x2f, 0x48, 0xe4, 0x32, 0x00, 0x00,
+	0xb9, 0x56, 0x0f, 0x87, 0xe4, 0xf0, 0xe7, 0x70, 0x48, 0x95, 0x16, 0x53, 0xb4, 0x34, 0x94, 0xdb,
+	0x7e, 0x0f, 0x32, 0x60, 0x93, 0xb6, 0xbc, 0xc0, 0xcb, 0x83, 0xfd, 0x86, 0xd2, 0xbc, 0x27, 0xc9,
+	0x1a, 0x4b, 0xe1, 0x48, 0xb6, 0x63, 0x38, 0xa0, 0x9b, 0xdd, 0x35, 0x9c, 0xd6, 0x90, 0xdd, 0x74,
+	0x2f, 0xa3, 0x19, 0xc4, 0x87, 0x04, 0x48, 0x9c, 0x5b, 0xe2, 0x43, 0x0e, 0xb9, 0x39, 0x40, 0x4e,
+	0x31, 0x90, 0x73, 0xce, 0xb9, 0x39, 0xc8, 0x02, 0xe7, 0x96, 0x13, 0x13, 0x58, 0x37, 0x1e, 0x72,
+	0xcd, 0x82, 0x1c, 0x82, 0xda, 0xba, 0xab, 0x8a, 0x4d, 0x69, 0xa0, 0x25, 0x72, 0xa0, 0xd3, 0x4c,
+	0x7f, 0xff, 0x56, 0x55, 0x7f, 0xd5, 0x5f, 0xff, 0x5f, 0x55, 0x84, 0x53, 0xe3, 0x9d, 0x41, 0xdb,
+	0x0a, 0x46, 0x96, 0x63, 0xe1, 0x5d, 0xec, 0x45, 0x61, 0x9b, 0xfd, 0x69, 0x8d, 0x03, 0x3f, 0xf2,
+	0xd1, 0xb2, 0x4c, 0x6a, 0x98, 0x3b, 0xaf, 0x84, 0x2d, 0xd7, 0x6f, 0x5b, 0x63, 0xb7, 0x6d, 0xfb,
+	0x01, 0x6e, 0xef, 0x3e, 0xdf, 0x1e, 0x60, 0x0f, 0x07, 0x56, 0x84, 0x1d, 0x26, 0xd1, 0x38, 0x23,
+	0xf1, 0x78, 0x38, 0xba, 0xe9, 0x07, 0x3b, 0xae, 0x37, 0xc8, 0xe2, 0x6c, 0x0e, 0x7c, 0x7f, 0x30,
+	0xc4, 0x6d, 0xfa, 0xd5, 0x8f, 0xb7, 0xda, 0x91, 0x3b, 0xc2, 0x61, 0x64, 0x8d, 0xc6, 0x9c, 0xe1,
+	0xc5, 0x54, 0xd5, 0xc8, 0xb2, 0xb7, 0x5d, 0x0f, 0x07, 0xfb, 0x6d, 0xda, 0xde, 0xb1, 0xdb, 0x0e,
+	0x70, 0xe8, 0xc7, 0x81, 0x8d, 0x67, 0xd4, 0x3e, 0x3b, 0x70, 0xa3, 0xed, 0xb8, 0xdf, 0xb2, 0xfd,
+	0x51, 0x7b, 0xe0, 0x0f, 0xfc, 0x54, 0x3f, 0xf9, 0xa2, 0x1f, 0xf4, 0x3f, 0xc6, 0x6e, 0xfe, 0x0c,
+	0x41, 0x65, 0x9d, 0x74, 0x6f, 0x13, 0x7f, 0x14, 0x63, 0xcf, 0xc6, 0xe8, 0x69, 0xc8, 0x7f, 0x14,
+	0xe3, 0x18, 0xd7, 0x8d, 0xd3, 0xc6, 0x99, 0x52, 0xe7, 0xc8, 0x74, 0xd2, 0xac, 0x52, 0xe0, 0x19,
+	0x7f, 0xe4, 0x46, 0x78, 0x34, 0x8e, 0xf6, 0xbb, 0x8c, 0x03, 0xbd, 0x06, 0xcb, 0x37, 0xfc, 0x7e,
+	0x2f, 0xc4, 0x51, 0xcf, 0xb3, 0x46, 0xb8, 0xbe, 0x40, 0x25, 0xea, 0xd3, 0x49, 0xf3, 0xe8, 0x0d,
+	0xbf, 0xbf, 0x89, 0xa3, 0xb7, 0xad, 0x91, 0x2c, 0x06, 0x29, 0x8a, 0x9e, 0x85, 0x62, 0x1c, 0xe2,
+	0xa0, 0xe7, 0x3a, 0xf5, 0x1c, 0x15, 0x3b, 0x3a, 0x9d, 0x34, 0x6b, 0x04, 0xba, 0xe8, 0x48, 0x22,
+	0x05, 0x86, 0xa0, 0x67, 0xa0, 0x30, 0x08, 0xfc, 0x78, 0x1c, 0xd6, 0x17, 0x4f, 0xe7, 0x04, 0x37,
+	0x43, 0x64, 0x6e, 0x86, 0xa0, 0x2b, 0x50, 0x60, 0x3e, 0xab, 0xe7, 0x4f, 0xe7, 0xce, 0x94, 0xcf,
+	0x3e, 0xd1, 0x92, 0x1d, 0xd9, 0x52, 0x3a, 0xcc, 0xbe, 0x98, 0x42, 0x46, 0x97, 0x15, 0x72, 0xd7,
+	0xff, 0xb3, 0x0a, 0x79, 0xca, 0x87, 0xae, 0x40, 0xd1, 0x0e, 0x30, 0x19, 0xf0, 0x3a, 0x3a, 0x6d,
+	0x9c, 0x29, 0x9f, 0x6d, 0xb4, 0x98, 0x23, 0x5b, 0x62, 0xa0, 0x5b, 0xd7, 0x84, 0x23, 0x3b, 0x27,
+	0xa6, 0x93, 0xe6, 0x61, 0xce, 0x9e, 0x6a, 0xfd, 0xf4, 0x4f, 0x4d, 0xa3, 0x2b, 0xb4, 0xa0, 0xab,
+	0x50, 0x0a, 0xe3, 0xfe, 0xc8, 0x8d, 0x2e, 0xf9, 0x7d, 0x3a, 0xe6, 0xe5, 0xb3, 0x8f, 0xa9, 0xcd,
+	0xdd, 0x14, 0xe4, 0xce, 0x63, 0xd3, 0x49, 0xf3, 0x48, 0xc2, 0x9d, 0x6a, 0xbc, 0x70, 0xa8, 0x9b,
+	0x2a, 0x41, 0xdb, 0x50, 0x0d, 0xf0, 0x38, 0x70, 0xfd, 0xc0, 0x8d, 0xdc, 0x10, 0x13, 0xbd, 0x0b,
+	0x54, 0xef, 0x29, 0x55, 0x6f, 0x57, 0x65, 0xea, 0x9c, 0x9a, 0x4e, 0x9a, 0x27, 0x34, 0x49, 0xc5,
+	0x86, 0xae, 0x16, 0x45, 0x80, 0x34, 0x68, 0x13, 0x47, 0xd4, 0x9f, 0xe5, 0xb3, 0xa7, 0x6f, 0x6b,
+	0x6c, 0x13, 0x47, 0x9d, 0xd3, 0xd3, 0x49, 0xf3, 0xe4, 0xac, 0xbc, 0x62, 0x32, 0x43, 0x3f, 0x1a,
+	0x42, 0x4d, 0x46, 0x1d, 0xd2, 0xc1, 0x45, 0x6a, 0x73, 0x75, 0xbe, 0x4d, 0xc2, 0xd5, 0x59, 0x9d,
+	0x4e, 0x9a, 0x0d, 0x5d, 0x56, 0xb1, 0x37, 0xa3, 0x99, 0xf8, 0xc7, 0xb6, 0x3c, 0x1b, 0x0f, 0x89,
+	0x99, 0x7c, 0x96, 0x7f, 0xce, 0x09, 0x32, 0xf3, 0x4f, 0xc2, 0xad, 0xfa, 0x27, 0x81, 0xd1, 0x07,
+	0xb0, 0x9c, 0x7c, 0x90, 0xf1, 0x2a, 0xf0, 0x79, 0x94, 0xad, 0x94, 0x8c, 0x54, 0x63, 0x3a, 0x69,
+	0x1e, 0x97, 0x65, 0x14, 0xd5, 0x8a, 0xb6, 0x54, 0xfb, 0x90, 0x8d, 0x4c, 0x71, 0xbe, 0x76, 0xc6,
+	0x21, 0x6b, 0x1f, 0xce, 0x8e, 0x88, 0xa2, 0x8d, 0x68, 0x27, 0x8b, 0x38, 0xb6, 0x6d, 0x8c, 0x1d,
+	0xec, 0xd4, 0x97, 0xb2, 0xb4, 0x5f, 0x92, 0x38, 0x98, 0x76, 0x59, 0x46, 0xd5, 0x2e, 0x53, 0xc8,
+	0x58, 0xdf, 0xf0, 0xfb, 0xeb, 0x41, 0xe0, 0x07, 0x61, 0xbd, 0x94, 0x35, 0xd6, 0x97, 0x04, 0x99,
+	0x8d, 0x75, 0xc2, 0xad, 0x8e, 0x75, 0x02, 0xf3, 0xf6, 0x76, 0x63, 0xef, 0x32, 0xb6, 0x42, 0xec,
+	0xd4, 0x61, 0x4e, 0x7b, 0x13, 0x8e, 0xa4, 0xbd, 0x09, 0x32, 0xd3, 0xde, 0x84, 0x82, 0x1c, 0x58,
+	0x61, 0xdf, 0x6b, 0x61, 0xe8, 0x0e, 0x3c, 0xec, 0xd4, 0xcb, 0x54, 0xff, 0xc9, 0x2c, 0xfd, 0x82,
+	0xa7, 0x73, 0x72, 0x3a, 0x69, 0xd6, 0x55, 0x39, 0xc5, 0x86, 0xa6, 0x13, 0x7d, 0x08, 0x15, 0x86,
+	0x74, 0x63, 0xcf, 0x73, 0xbd, 0x41, 0x7d, 0x99, 0x1a, 0x79, 0x3c, 0xcb, 0x08, 0x67, 0xe9, 0x3c,
+	0x3e, 0x9d, 0x34, 0x1f, 0x53, 0xa4, 0x14, 0x13, 0xaa, 0x42, 0x12, 0x31, 0x18, 0x90, 0x3a, 0xb6,
+	0x92, 0x15, 0x31, 0x2e, 0xa9, 0x4c, 0x2c, 0x62, 0x68, 0x92, 0x6a, 0xc4, 0xd0, 0x88, 0xa9, 0x3f,
+	0xb8, 0x93, 0x57, 0xe6, 0xfb, 0x83, 0xfb, 0x59, 0xf2, 0x47, 0x86, 0xab, 0x15, 0x6d, 0xe8, 0x63,
+	0x20, 0x1b, 0xcf, 0xf9, 0x78, 0x3c, 0x74, 0x6d, 0x2b, 0xc2, 0xe7, 0x71, 0x84, 0x6d, 0x12, 0xa9,
+	0xab, 0xd4, 0x8a, 0x39, 0x63, 0x65, 0x86, 0xb3, 0x63, 0x4e, 0x27, 0xcd, 0xd5, 0x2c, 0x1d, 0x8a,
+	0xd5, 0x4c, 0x2b, 0xe8, 0x3b, 0x06, 0x1c, 0x0b, 0x23, 0xcb, 0x73, 0xac, 0xa1, 0xef, 0xe1, 0x8b,
+	0xde, 0x20, 0xc0, 0x61, 0x78, 0xd1, 0xdb, 0xf2, 0xeb, 0x35, 0x6a, 0xff, 0x49, 0x2d, 0xac, 0x67,
+	0xb1, 0x76, 0x9e, 0x9c, 0x4e, 0x9a, 0xcd, 0x4c, 0x2d, 0x4a, 0x0b, 0xb2, 0x0d, 0xa1, 0x3d, 0x38,
+	0x22, 0x32, 0x83, 0xeb, 0x91, 0x3b, 0x74, 0x43, 0x2b, 0x72, 0x7d, 0xaf, 0x7e, 0x98, 0xda, 0x7f,
+	0x42, 0x8f, 0x8e, 0x33, 0x8c, 0x9d, 0x27, 0xa6, 0x93, 0xe6, 0xa9, 0x0c, 0x0d, 0x8a, 0xed, 0x2c,
+	0x13, 0xe9, 0x14, 0xba, 0x1a, 0x60, 0xc2, 0x88, 0x9d, 0xfa, 0x91, 0xf9, 0x53, 0x28, 0x61, 0x92,
+	0xa7, 0x50, 0x02, 0x66, 0x4d, 0xa1, 0x84, 0x48, 0x2c, 0x8d, 0xad, 0x20, 0x72, 0x89, 0xd9, 0x0d,
+	0x2b, 0xd8, 0xc1, 0x41, 0xfd, 0x68, 0x96, 0xa5, 0xab, 0x2a, 0x13, 0xb3, 0xa4, 0x49, 0xaa, 0x96,
+	0x34, 0x62, 0xa7, 0x08, 0x79, 0xaa, 0xcb, 0x9c, 0x16, 0xe0, 0x48, 0xc6, 0x70, 0xa1, 0x37, 0xa0,
+	0x10, 0xc4, 0x1e, 0xc9, 0x61, 0xd8, 0xc6, 0x8d, 0xd4, 0x16, 0x5c, 0x8f, 0x5d, 0x87, 0x25, 0x50,
+	0x41, 0xec, 0x29, 0x69, 0x4d, 0x9e, 0x02, 0x44, 0x9e, 0x24, 0x50, 0xae, 0xc3, 0x37, 0xe8, 0xb9,
+	0xf2, 0x37, 0xfc, 0xbe, 0x2a, 0x4f, 0x01, 0x84, 0xa1, 0x22, 0x7c, 0xd1, 0x73, 0xc9, 0x44, 0x63,
+	0x5b, 0xef, 0x53, 0xaa, 0x9a, 0xb7, 0xe2, 0x3e, 0x0e, 0x3c, 0x1c, 0xe1, 0x50, 0xf4, 0x81, 0xce,
+	0x34, 0xba, 0xb0, 0x02, 0x09, 0x91, 0xf4, 0x2f, 0xcb, 0x38, 0xfa, 0xb1, 0x01, 0xf5, 0x91, 0xb5,
+	0xd7, 0x13, 0x60, 0xd8, 0xdb, 0xf2, 0x83, 0xde, 0x18, 0x07, 0xae, 0xef, 0xd0, 0x7c, 0xac, 0x7c,
+	0xf6, 0x7f, 0xee, 0x38, 0xb7, 0x5a, 0x1b, 0xd6, 0x9e, 0x80, 0xc3, 0xff, 0xf3, 0x83, 0xab, 0x54,
+	0x7c, 0xdd, 0x8b, 0x82, 0xfd, 0xce, 0xa9, 0x2f, 0x26, 0xcd, 0x43, 0xd3, 0x49, 0xf3, 0xd8, 0x28,
+	0x8b, 0xa7, 0x9b, 0x0d, 0xa3, 0x1f, 0x19, 0x70, 0x3c, 0xf2, 0x23, 0x6b, 0xd8, 0xb3, 0xe3, 0x51,
+	0x3c, 0xb4, 0x22, 0x77, 0x17, 0xf7, 0xe2, 0xd0, 0x1a, 0x60, 0x9e, 0xf6, 0xbd, 0x7e, 0xe7, 0x46,
+	0x5d, 0x23, 0xf2, 0xe7, 0x12, 0xf1, 0xeb, 0x44, 0x9a, 0xb5, 0xe9, 0x24, 0x6f, 0xd3, 0xd1, 0x28,
+	0x83, 0xa5, 0x9b, 0x89, 0x36, 0x7e, 0x6a, 0x40, 0x63, 0x7e, 0x37, 0xd1, 0x93, 0x90, 0xdb, 0xc1,
+	0xfb, 0x3c, 0xb1, 0x3e, 0x3c, 0x9d, 0x34, 0x2b, 0x3b, 0x78, 0x5f, 0x1a, 0x75, 0x42, 0x45, 0xdf,
+	0x84, 0xfc, 0xae, 0x35, 0x8c, 0x31, 0x9f, 0x12, 0xad, 0x16, 0x2b, 0x03, 0x5a, 0x72, 0x19, 0xd0,
+	0x1a, 0xef, 0x0c, 0x08, 0xd0, 0x12, 0x1e, 0x69, 0x7d, 0x23, 0xb6, 0xbc, 0xc8, 0x8d, 0xf6, 0xd9,
+	0x74, 0xa1, 0x0a, 0xe4, 0xe9, 0x42, 0x81, 0xd7, 0x16, 0x5e, 0x31, 0x1a, 0x9f, 0x19, 0x70, 0x62,
+	0x6e, 0xa7, 0xbf, 0x0e, 0x2d, 0x34, 0x7b, 0xb0, 0x48, 0x26, 0x3e, 0x49, 0xf9, 0xb7, 0xdd, 0xc1,
+	0xf6, 0xcb, 0x2f, 0xd2, 0xe6, 0x14, 0x58, 0x86, 0xce, 0x10, 0x39, 0x43, 0x67, 0x08, 0x29, 0x5b,
+	0x86, 0xfe, 0xcd, 0x97, 0x5f, 0xa4, 0x8d, 0x2a, 0x30, 0x23, 0x14, 0x90, 0x8d, 0x50, 0xc0, 0xfc,
+	0x6b, 0x1e, 0x4a, 0x49, 0x4e, 0x2d, 0xad, 0x41, 0xe3, 0xae, 0xd6, 0xe0, 0x05, 0xa8, 0x39, 0xd8,
+	0xe1, 0x9b, 0x81, 0xeb, 0x7b, 0x62, 0x35, 0x97, 0x58, 0xc0, 0x51, 0x68, 0x8a, 0x7c, 0x55, 0x23,
+	0xa1, 0xb3, 0xb0, 0xc4, 0x73, 0xcf, 0x7d, 0xba, 0x90, 0x2b, 0x9d, 0xe3, 0xd3, 0x49, 0x13, 0x09,
+	0x4c, 0x12, 0x4d, 0xf8, 0x50, 0x17, 0xc0, 0xef, 0xdf, 0xc0, 0x76, 0xb4, 0x81, 0x23, 0x8b, 0x67,
+	0xc1, 0x75, 0xb5, 0x07, 0x57, 0x12, 0x3a, 0x2b, 0xcd, 0x52, 0x7e, 0xb9, 0x34, 0x4b, 0x51, 0xf4,
+	0x01, 0xc0, 0xc8, 0x72, 0x3d, 0x26, 0xc7, 0x53, 0x5e, 0x73, 0x5e, 0x48, 0xd9, 0x48, 0x38, 0x99,
+	0xf6, 0x54, 0x52, 0xd6, 0x9e, 0xa2, 0xa4, 0x80, 0x62, 0xb6, 0xc2, 0x7a, 0x81, 0xae, 0xd2, 0xd5,
+	0x79, 0xaa, 0xb9, 0xda, 0x63, 0xa4, 0x88, 0xe2, 0x22, 0x92, 0x4e, 0xa1, 0x85, 0x0c, 0xdb, 0xd0,
+	0xdd, 0xc2, 0xa4, 0x7c, 0xa6, 0xc9, 0x2e, 0x1f, 0x36, 0x81, 0xc9, 0xc3, 0x26, 0x30, 0xf4, 0x0a,
+	0x80, 0x15, 0x6d, 0xf8, 0x61, 0x74, 0xc5, 0xb3, 0x31, 0x4d, 0x62, 0x97, 0x58, 0xf3, 0x53, 0x54,
+	0x6e, 0x7e, 0x8a, 0xa2, 0xd7, 0xa1, 0x3c, 0x66, 0x5b, 0x91, 0xdb, 0x1f, 0x62, 0x9a, 0xa4, 0x2e,
+	0xd1, 0x3a, 0xef, 0x98, 0x04, 0x4b, 0xb2, 0x32, 0x37, 0xfa, 0x7f, 0xa8, 0xda, 0xbe, 0x67, 0xc7,
+	0x41, 0x80, 0x3d, 0x7b, 0x7f, 0xd3, 0xda, 0xc2, 0x34, 0x21, 0x5d, 0x62, 0x53, 0x45, 0x23, 0xc9,
+	0x53, 0x45, 0x23, 0xa1, 0x97, 0xa0, 0x14, 0xda, 0xdb, 0xd8, 0x89, 0x87, 0x38, 0xa0, 0x39, 0x67,
+	0x89, 0xd7, 0x86, 0x02, 0x94, 0x84, 0x53, 0x4e, 0xf3, 0xb7, 0x06, 0x1c, 0xcd, 0x72, 0x9d, 0x36,
+	0x8d, 0x8c, 0xfb, 0x32, 0x8d, 0xde, 0x81, 0xa5, 0xb1, 0xef, 0xf4, 0xc2, 0x31, 0xb6, 0x79, 0xa4,
+	0xd0, 0x26, 0xd1, 0x55, 0xdf, 0xd9, 0x1c, 0x63, 0xfb, 0x5d, 0x37, 0xda, 0x5e, 0xdb, 0xf5, 0x5d,
+	0xe7, 0xb2, 0x1b, 0x72, 0x6f, 0x8f, 0x19, 0x45, 0xd9, 0x9d, 0x8b, 0x1c, 0xec, 0x2c, 0x41, 0x81,
+	0x59, 0x31, 0x7f, 0x9f, 0x83, 0x9a, 0x3e, 0x5d, 0xfe, 0x93, 0xba, 0x82, 0xde, 0x83, 0xa2, 0xcb,
+	0xb2, 0x37, 0xbe, 0x73, 0xff, 0x97, 0x14, 0x4b, 0x5b, 0xe9, 0xf9, 0x51, 0x6b, 0xf7, 0xf9, 0x16,
+	0x4f, 0xf3, 0xe8, 0x10, 0x50, 0xcd, 0x5c, 0x52, 0xd5, 0xcc, 0x41, 0xd4, 0x85, 0x62, 0x88, 0x83,
+	0x5d, 0xd7, 0xc6, 0x3c, 0x28, 0x34, 0x65, 0xcd, 0xb6, 0x1f, 0x60, 0xa2, 0x73, 0x93, 0xb1, 0xa4,
+	0x3a, 0xb9, 0x8c, 0xaa, 0x93, 0x83, 0xe8, 0x1d, 0x28, 0xd9, 0xbe, 0xb7, 0xe5, 0x0e, 0x36, 0xac,
+	0x31, 0x0f, 0x0b, 0xa7, 0xb2, 0xb4, 0x9e, 0x13, 0x4c, 0xbc, 0x1e, 0x16, 0x9f, 0x5a, 0x3d, 0x9c,
+	0x70, 0xa5, 0x0e, 0xfd, 0xcb, 0x22, 0x40, 0xea, 0x1c, 0xf4, 0x2a, 0x94, 0xf1, 0x1e, 0xb6, 0xe3,
+	0xc8, 0x0f, 0x44, 0x7c, 0xe6, 0xc7, 0x4b, 0x02, 0x56, 0x02, 0x2a, 0xa4, 0x28, 0x59, 0x20, 0x9e,
+	0x35, 0xc2, 0xe1, 0xd8, 0xb2, 0xc5, 0xb9, 0x14, 0x6d, 0x4c, 0x02, 0xca, 0x0b, 0x24, 0x01, 0xd1,
+	0x7f, 0xc3, 0x22, 0x3d, 0xc9, 0x62, 0x47, 0x52, 0x68, 0x3a, 0x69, 0xae, 0x78, 0xea, 0x19, 0x16,
+	0xa5, 0xa3, 0x37, 0xa1, 0xb2, 0x93, 0x4c, 0x3c, 0xd2, 0xb6, 0x45, 0x2a, 0x40, 0x53, 0xaa, 0x94,
+	0xa0, 0xb4, 0x6e, 0x59, 0xc6, 0xd1, 0x16, 0x94, 0x2d, 0xcf, 0xf3, 0x23, 0x1a, 0xfb, 0xc5, 0x31,
+	0xd5, 0xd3, 0xf3, 0xa6, 0x69, 0x6b, 0x2d, 0xe5, 0x65, 0xd9, 0x09, 0x8d, 0x38, 0x92, 0x06, 0x39,
+	0xe2, 0x48, 0x30, 0xea, 0x42, 0x61, 0x68, 0xf5, 0xf1, 0x50, 0x04, 0xdb, 0xa7, 0xe6, 0x9a, 0xb8,
+	0x4c, 0xd9, 0x98, 0x76, 0xba, 0xd5, 0x32, 0x39, 0x79, 0xab, 0x65, 0x48, 0x63, 0x0b, 0x6a, 0x7a,
+	0x7b, 0x0e, 0x96, 0x38, 0x3c, 0x2d, 0x27, 0x0e, 0xa5, 0x3b, 0xa6, 0x2a, 0x16, 0x94, 0xa5, 0x46,
+	0x3d, 0x08, 0x13, 0xe6, 0xcf, 0x0d, 0x38, 0x9a, 0xb5, 0x76, 0xd1, 0x86, 0xb4, 0xe2, 0x0d, 0x5e,
+	0x6e, 0x67, 0x4c, 0x75, 0x2e, 0x3b, 0x67, 0xa9, 0xa7, 0x0b, 0xbd, 0x03, 0x2b, 0x9e, 0xef, 0xe0,
+	0x9e, 0x45, 0x0c, 0x0c, 0xdd, 0x30, 0xaa, 0x2f, 0xd0, 0x63, 0x4c, 0x5a, 0xa6, 0x13, 0xca, 0x9a,
+	0x20, 0x48, 0xd2, 0x15, 0x85, 0x60, 0x7e, 0xdf, 0x80, 0xaa, 0x76, 0x8a, 0x76, 0xcf, 0xc9, 0x8b,
+	0x9c, 0x72, 0x2c, 0x1c, 0x2c, 0xe5, 0x30, 0x2f, 0x00, 0x9a, 0x3d, 0xcc, 0x53, 0x34, 0x19, 0x07,
+	0xd4, 0xf4, 0x89, 0x01, 0x35, 0xfd, 0x8c, 0xee, 0xa1, 0x74, 0xe9, 0x2d, 0x28, 0x25, 0xe7, 0x6d,
+	0xf7, 0xda, 0x00, 0x73, 0x05, 0x96, 0xe5, 0xc3, 0x3b, 0xf3, 0x6d, 0xf1, 0x3d, 0xbc, 0x2f, 0x1d,
+	0x34, 0x7f, 0x69, 0xc0, 0xb2, 0x7c, 0xc2, 0x76, 0xcf, 0x23, 0x36, 0x48, 0xab, 0x48, 0x52, 0xee,
+	0x85, 0x74, 0x6e, 0x1e, 0xb4, 0x8a, 0xa4, 0x33, 0x58, 0x11, 0x97, 0x67, 0xb0, 0x42, 0x30, 0x7f,
+	0xcd, 0x5a, 0x9e, 0x9e, 0x9f, 0x3d, 0xec, 0xfa, 0x59, 0xdb, 0x60, 0x72, 0x07, 0xdf, 0x60, 0xcc,
+	0xbf, 0x1b, 0xb0, 0xa2, 0x9e, 0xeb, 0x3d, 0xf4, 0xde, 0xcc, 0xf8, 0x31, 0xf7, 0x80, 0xfc, 0xf8,
+	0x37, 0x03, 0x2a, 0xca, 0x71, 0xe3, 0xa3, 0xd3, 0xf5, 0x9f, 0x2c, 0xc0, 0xf1, 0x6c, 0x35, 0x0f,
+	0x24, 0xf1, 0xbc, 0x00, 0x64, 0x0b, 0xa1, 0x67, 0x88, 0x6c, 0x60, 0x8e, 0xcd, 0xe4, 0x9d, 0xb4,
+	0x0b, 0x62, 0xff, 0x99, 0x39, 0x27, 0x14, 0xe2, 0xe8, 0x3d, 0x28, 0xbb, 0xd2, 0x89, 0x24, 0x4b,
+	0x37, 0x4f, 0xa8, 0xda, 0xe4, 0x73, 0x48, 0x9a, 0x60, 0xb8, 0x73, 0x4e, 0x1f, 0x65, 0x55, 0x9d,
+	0x02, 0x2c, 0xba, 0xde, 0x96, 0x6f, 0xee, 0x42, 0x91, 0x37, 0x07, 0xbd, 0x00, 0x25, 0xba, 0xdd,
+	0xd1, 0x5c, 0x8a, 0x6d, 0xd8, 0x34, 0x08, 0x13, 0x50, 0xbb, 0x13, 0x5c, 0x12, 0x18, 0x7a, 0x19,
+	0x80, 0x6c, 0xb9, 0x5e, 0x3c, 0xea, 0xe3, 0x80, 0x76, 0x37, 0xcf, 0x72, 0xb6, 0xb1, 0xef, 0xbc,
+	0x4d, 0x41, 0x39, 0x67, 0x4b, 0x40, 0xf3, 0x17, 0x0b, 0x50, 0x96, 0xcf, 0x40, 0xef, 0xca, 0xf8,
+	0xc7, 0x20, 0xf2, 0xe9, 0x9e, 0xe5, 0x38, 0xe4, 0x2f, 0x16, 0x71, 0xb0, 0x3d, 0x77, 0x90, 0xc4,
+	0xff, 0x6b, 0x42, 0x82, 0x65, 0x4f, 0xf4, 0x96, 0xc9, 0xd5, 0x48, 0x92, 0xd5, 0x9a, 0x4e, 0x6b,
+	0xec, 0xc0, 0xb1, 0x4c, 0x55, 0x72, 0xce, 0x93, 0xbf, 0x5f, 0x39, 0xcf, 0xaf, 0xf2, 0x70, 0x2c,
+	0xf3, 0xec, 0xf9, 0xa1, 0xaf, 0x62, 0x75, 0x05, 0xe5, 0xee, 0xcb, 0x0a, 0xfa, 0xc4, 0xc8, 0xf2,
+	0x2c, 0x3b, 0xb4, 0x7c, 0xf5, 0x00, 0x07, 0xf2, 0xf7, 0xcb, 0xc7, 0xea, 0xb4, 0xcc, 0xdf, 0xd5,
+	0x9a, 0x28, 0x1c, 0x74, 0x4d, 0xa0, 0xe7, 0x58, 0xfa, 0x4a, 0x6d, 0x15, 0xa9, 0x2d, 0x11, 0x21,
+	0x34, 0x53, 0x45, 0x0e, 0x91, 0x8a, 0x46, 0x48, 0xb0, 0xa2, 0x69, 0x29, 0xad, 0x68, 0x38, 0x8f,
+	0x5e, 0x37, 0x2d, 0xcb, 0xf8, 0xbf, 0x77, 0x0e, 0xff, 0xc3, 0x80, 0xaa, 0x76, 0x19, 0xf5, 0xe8,
+	0xec, 0x41, 0x3f, 0x34, 0xa0, 0x94, 0xdc, 0x83, 0xde, 0x73, 0xf6, 0xb7, 0x06, 0x05, 0xcc, 0xee,
+	0xe2, 0x58, 0xb8, 0x3b, 0xa2, 0xbd, 0x95, 0x20, 0x34, 0xfe, 0x3a, 0x42, 0xbb, 0x7e, 0xeb, 0x72,
+	0x41, 0xf3, 0x0f, 0x49, 0x5e, 0x97, 0xb6, 0xe9, 0xa1, 0xba, 0x22, 0xed, 0x53, 0xee, 0x6e, 0xfb,
+	0xf4, 0x9b, 0x22, 0xe4, 0x29, 0x1f, 0x29, 0x28, 0x22, 0x1c, 0x8c, 0x5c, 0xcf, 0x1a, 0xd2, 0xee,
+	0x2c, 0xb1, 0x75, 0x2b, 0x30, 0x79, 0xdd, 0x0a, 0x0c, 0x6d, 0x43, 0x35, 0x2d, 0xf7, 0xa9, 0x9a,
+	0xec, 0x27, 0x18, 0x6f, 0xa9, 0x4c, 0xec, 0x1c, 0x50, 0x93, 0x54, 0xef, 0xa8, 0x34, 0x22, 0x72,
+	0x60, 0xc5, 0xf6, 0xbd, 0xc8, 0x72, 0x3d, 0x1c, 0x30, 0x43, 0xb9, 0xac, 0x2b, 0xe8, 0x73, 0x0a,
+	0x0f, 0xbb, 0x82, 0x56, 0xe5, 0xd4, 0x2b, 0x68, 0x95, 0x86, 0x3e, 0x84, 0x8a, 0xc8, 0x7d, 0x99,
+	0x91, 0xc5, 0xac, 0x2b, 0xe8, 0x75, 0x99, 0x85, 0x4d, 0x69, 0x45, 0x4a, 0xbd, 0x82, 0x56, 0x48,
+	0x68, 0x08, 0xb5, 0xb1, 0xef, 0x5c, 0xf7, 0xf8, 0x61, 0xa5, 0xd5, 0x1f, 0x62, 0x7e, 0xc6, 0xb4,
+	0x3a, 0x93, 0xf2, 0x28, 0x5c, 0x2c, 0x14, 0xeb, 0xb2, 0xea, 0xa3, 0x0e, 0x9d, 0x8a, 0x3e, 0x80,
+	0xe5, 0x21, 0x29, 0x41, 0xd6, 0xf7, 0xc6, 0x6e, 0x80, 0x9d, 0xec, 0x27, 0x18, 0x97, 0x25, 0x0e,
+	0x16, 0x08, 0x65, 0x19, 0xf5, 0x1a, 0x5a, 0xa6, 0x10, 0xef, 0x8f, 0xac, 0xbd, 0x6e, 0xec, 0x85,
+	0xeb, 0x7b, 0xfc, 0x3a, 0xbd, 0x98, 0xe5, 0xfd, 0x0d, 0x95, 0x89, 0x79, 0x5f, 0x93, 0x54, 0xbd,
+	0xaf, 0x11, 0xd1, 0x65, 0x1a, 0xe7, 0x99, 0x4b, 0xd8, 0x53, 0x8c, 0xe3, 0x33, 0xa3, 0xc5, 0xbc,
+	0xc1, 0x8a, 0x60, 0xfe, 0xa5, 0x28, 0x4d, 0x34, 0x70, 0x1f, 0xd0, 0x6e, 0x77, 0x71, 0x14, 0x07,
+	0x1e, 0x76, 0xf8, 0x2b, 0x8c, 0x59, 0x1f, 0x28, 0x5c, 0x89, 0x0f, 0x14, 0x74, 0xc6, 0x07, 0x0a,
+	0x95, 0xcc, 0xa9, 0xb1, 0xef, 0x5c, 0x63, 0x4b, 0x26, 0x4a, 0xde, 0x66, 0x3c, 0x3e, 0x63, 0x2a,
+	0x65, 0x61, 0x73, 0x4a, 0x91, 0x52, 0xe7, 0x94, 0x42, 0xea, 0x2c, 0x41, 0x21, 0xc0, 0x56, 0xe8,
+	0x7b, 0xe6, 0x67, 0x06, 0x54, 0xb5, 0xb5, 0x86, 0xde, 0x80, 0xe4, 0x96, 0xf3, 0xda, 0xfe, 0x58,
+	0xa4, 0x8a, 0xca, 0xad, 0x28, 0xc1, 0xb3, 0x6e, 0x45, 0x09, 0x8e, 0x2e, 0x03, 0x24, 0x71, 0xf9,
+	0x76, 0x81, 0x8a, 0xe6, 0x29, 0x29, 0xa7, 0x9c, 0xa7, 0xa4, 0xa8, 0x79, 0x6b, 0x01, 0x96, 0x84,
+	0xb3, 0x1e, 0x48, 0x29, 0xd1, 0x86, 0xe2, 0x08, 0x87, 0xf4, 0x76, 0x74, 0x21, 0xcd, 0x08, 0x38,
+	0x24, 0x67, 0x04, 0x1c, 0x52, 0x13, 0x96, 0xdc, 0x5d, 0x25, 0x2c, 0x8b, 0x07, 0x4e, 0x58, 0x30,
+	0xbd, 0x19, 0x91, 0x42, 0x8e, 0x38, 0x13, 0xbd, 0x7d, 0x1c, 0x13, 0xf7, 0x26, 0xb2, 0xa0, 0x76,
+	0x6f, 0x22, 0x93, 0xcc, 0xdf, 0xe5, 0x61, 0x45, 0x55, 0xf1, 0x40, 0xc6, 0xfa, 0x05, 0x28, 0xe1,
+	0x3d, 0x37, 0xea, 0xd9, 0xbe, 0x83, 0x79, 0x25, 0x43, 0x87, 0x8e, 0x80, 0xe7, 0x7c, 0x47, 0x19,
+	0x3a, 0x81, 0xc9, 0x0e, 0xca, 0x1d, 0xc8, 0x41, 0xcf, 0x88, 0xe9, 0xcd, 0x4f, 0x9f, 0xe9, 0x86,
+	0xc6, 0x10, 0x79, 0x43, 0x63, 0x08, 0x1a, 0x40, 0xd9, 0x8f, 0xa3, 0x2b, 0x5b, 0x1b, 0x78, 0xe4,
+	0x07, 0xfb, 0x3c, 0xb6, 0x9e, 0xb9, 0xdd, 0xe8, 0xb6, 0xae, 0xa4, 0xfc, 0xac, 0x1e, 0x94, 0x14,
+	0xa8, 0xf5, 0xa0, 0x44, 0x40, 0xff, 0x0b, 0x79, 0xba, 0x87, 0xf2, 0xa0, 0x9a, 0xb9, 0xf7, 0xd2,
+	0xcd, 0x1b, 0xcf, 0x84, 0x22, 0x26, 0x88, 0xde, 0x85, 0x22, 0xde, 0x75, 0xe9, 0xcb, 0x9d, 0x62,
+	0xd6, 0x83, 0x06, 0xad, 0x99, 0xeb, 0x8c, 0x97, 0x8d, 0x17, 0x17, 0x54, 0x8b, 0x60, 0x0e, 0xa2,
+	0x6f, 0x43, 0xcd, 0xc1, 0x96, 0x33, 0x74, 0x3d, 0x9c, 0x44, 0x66, 0x16, 0x36, 0x9f, 0xbd, 0xad,
+	0x85, 0xf3, 0x9a, 0x10, 0x8b, 0x77, 0xba, 0x2a, 0x35, 0xde, 0xe9, 0xd4, 0x46, 0x05, 0xca, 0xd2,
+	0x80, 0x36, 0x6a, 0xfa, 0x4c, 0x6c, 0x94, 0xa0, 0xc8, 0xbb, 0xd2, 0x40, 0x50, 0x9b, 0xb1, 0x89,
+	0xe4, 0xcb, 0xae, 0x2e, 0x8b, 0x6b, 0x9f, 0x2e, 0x40, 0x4d, 0x0f, 0xc6, 0x5f, 0x8f, 0xe8, 0xa1,
+	0x06, 0x82, 0xdc, 0x81, 0x03, 0xc1, 0x9b, 0x50, 0x21, 0xa9, 0xa3, 0x15, 0x45, 0xfc, 0x15, 0xd1,
+	0x22, 0x4d, 0xb9, 0x58, 0x58, 0x8e, 0xbd, 0x35, 0x81, 0x2b, 0x61, 0x59, 0xc2, 0xcd, 0xef, 0x2e,
+	0x40, 0x45, 0xd9, 0x34, 0x1e, 0xbd, 0x68, 0x6a, 0x56, 0xa1, 0xa2, 0xe4, 0x62, 0xe6, 0xf7, 0xd8,
+	0x3c, 0x51, 0x93, 0xa0, 0x47, 0x6f, 0x5c, 0x56, 0x60, 0x59, 0x4e, 0xea, 0xcc, 0xc3, 0x50, 0xd5,
+	0x72, 0x30, 0xf3, 0x73, 0x03, 0x8e, 0x66, 0xbd, 0x0c, 0x44, 0x17, 0x00, 0x3c, 0x7c, 0xb3, 0x77,
+	0xc7, 0x5a, 0x8b, 0xb5, 0x1e, 0xdf, 0xbc, 0xa4, 0x95, 0x26, 0x4b, 0x02, 0x23, 0x9a, 0xfc, 0xa1,
+	0xd3, 0xbb, 0x63, 0x85, 0x43, 0x35, 0xf9, 0x43, 0x67, 0x46, 0x93, 0xc0, 0xcc, 0x1f, 0xe4, 0x44,
+	0x19, 0x9c, 0x3e, 0x8f, 0x7b, 0x1f, 0x6a, 0x63, 0xf1, 0x71, 0xe7, 0xd6, 0xd2, 0x42, 0x20, 0xe1,
+	0xd7, 0x2d, 0xad, 0xa8, 0x14, 0x55, 0x37, 0xaf, 0xf0, 0x16, 0x0e, 0xa8, 0xbb, 0xab, 0x95, 0x7a,
+	0x2b, 0x2a, 0x05, 0x7d, 0x0b, 0x0e, 0x8b, 0xa7, 0x12, 0xbb, 0x58, 0x34, 0x3c, 0x37, 0x57, 0x39,
+	0x7b, 0xcd, 0x97, 0x08, 0xe8, 0x2d, 0xaf, 0x6a, 0x24, 0x4d, 0x3d, 0x6f, 0xfb, 0xe2, 0x41, 0xd5,
+	0xeb, 0x8d, 0xaf, 0x6a, 0x24, 0x52, 0x93, 0x57, 0xb5, 0x07, 0x87, 0xe8, 0x3c, 0x2c, 0xd1, 0xdf,
+	0x23, 0xdc, 0xde, 0x03, 0x74, 0x81, 0x50, 0x3e, 0xc5, 0x42, 0x91, 0x43, 0xe8, 0x25, 0x28, 0x25,
+	0xef, 0x12, 0xf9, 0x85, 0x16, 0x9b, 0xea, 0x02, 0x54, 0xa6, 0xba, 0x00, 0x3b, 0x37, 0xbe, 0xf8,
+	0x6a, 0xd5, 0xf8, 0xf2, 0xab, 0x55, 0xe3, 0xcf, 0x5f, 0xad, 0x1a, 0x9f, 0xde, 0x5a, 0x3d, 0xf4,
+	0xe5, 0xad, 0xd5, 0x43, 0x7f, 0xbc, 0xb5, 0x7a, 0xe8, 0xfd, 0xe7, 0xa4, 0x5f, 0x88, 0xb0, 0xe6,
+	0x8c, 0x03, 0x9f, 0x2c, 0x60, 0xfe, 0xd5, 0xd6, 0x7f, 0x13, 0xf3, 0xf9, 0xc2, 0xa9, 0x35, 0xfa,
+	0x79, 0x95, 0xf1, 0xb5, 0x2e, 0xfa, 0x2d, 0x06, 0xd0, 0x9f, 0x44, 0x84, 0xfd, 0x02, 0xfd, 0xe9,
+	0xc3, 0x0b, 0xff, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa2, 0x12, 0xae, 0x4e, 0x33, 0x00, 0x00,
 }
 
 func (m *EventSequence) Marshal() (dAtA []byte, err error) {
@@ -3944,6 +3958,29 @@ func (m *EventSequence_Event_JobRunPreempted) MarshalToSizedBuffer(dAtA []byte)
 	}
 	return len(dAtA) - i, nil
 }
+func (m *EventSequence_Event_PartitionMarker) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *EventSequence_Event_PartitionMarker) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	if m.PartitionMarker != nil {
+		{
+			size, err := m.PartitionMarker.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintEvents(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x1
+		i--
+		dAtA[i] = 0xa2
+	}
+	return len(dAtA) - i, nil
+}
 func (m *ResourceUtilisation) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -6654,6 +6691,18 @@ func (m *EventSequence_Event_JobRunPreempted) Size() (n int) {
 	}
 	return n
 }
+func (m *EventSequence_Event_PartitionMarker) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.PartitionMarker != nil {
+		l = m.PartitionMarker.Size()
+		n += 2 + l + sovEvents(uint64(l))
+	}
+	return n
+}
 func (m *ResourceUtilisation) Size() (n int) {
 	if m == nil {
 		return 0
@@ -8611,6 +8660,41 @@ func (m *EventSequence_Event) Unmarshal(dAtA []byte) error {
 			}
 			m.Event = &EventSequence_Event_JobRunPreempted{v}
 			iNdEx = postIndex
+		case 20:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field PartitionMarker", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowEvents
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthEvents
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthEvents
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			v := &PartitionMarker{}
+			if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			m.Event = &EventSequence_Event_PartitionMarker{v}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipEvents(dAtA[iNdEx:])
diff --git a/pkg/armadaevents/events.proto b/pkg/armadaevents/events.proto
index 2028783d..85424f1c 100644
--- a/pkg/armadaevents/events.proto
+++ b/pkg/armadaevents/events.proto
@@ -86,6 +86,7 @@ message EventSequence {
             StandaloneIngressInfo standaloneIngressInfo = 16;
             ResourceUtilisation resourceUtilisation = 17;
             JobRunPreempted jobRunPreempted = 19;
+            PartitionMarker partitionMarker = 20;
         }
     }
     // The system is namespaced by queue, and all events are associated with a job set.


Test patch:
diff --git a/internal/common/ingest/testfixtures/event.go b/internal/common/ingest/testfixtures/event.go
index 6d50bcec..c660dd4f 100644
--- a/internal/common/ingest/testfixtures/event.go
+++ b/internal/common/ingest/testfixtures/event.go
@@ -15,21 +15,24 @@ import (
 
 // Standard Set of events for common tests
 const (
-	JobIdString = "01f3j0g1md4qx7z5qb148qnh4r"
-	RunIdString = "123e4567-e89b-12d3-a456-426614174000"
+	JobIdString                  = "01f3j0g1md4qx7z5qb148qnh4r"
+	RunIdString                  = "123e4567-e89b-12d3-a456-426614174000"
+	PartitionMarkerGroupIdString = "223e4567-e89b-12d3-a456-426614174000"
 )
 
 var (
-	JobIdProto, _      = armadaevents.ProtoUuidFromUlidString(JobIdString)
-	RunIdProto         = armadaevents.ProtoUuidFromUuid(uuid.MustParse(RunIdString))
-	JobIdUuid          = armadaevents.UuidFromProtoUuid(JobIdProto)
-	RunIdUuid          = armadaevents.UuidFromProtoUuid(RunIdProto)
-	PriorityClassName  = "test-priority"
-	PriorityClassValue = int32(100)
-	PriorityClasses    = map[string]configuration.PriorityClass{PriorityClassName: {Priority: PriorityClassValue}}
-	Groups             = []string{"group1", "group2"}
-	NodeSelector       = map[string]string{"foo": "bar"}
-	Tolerations        = []v1.Toleration{{
+	JobIdProto, _               = armadaevents.ProtoUuidFromUlidString(JobIdString)
+	RunIdProto                  = armadaevents.ProtoUuidFromUuid(uuid.MustParse(RunIdString))
+	PartitionMarkerGroupIdProto = armadaevents.ProtoUuidFromUuid(uuid.MustParse(PartitionMarkerGroupIdString))
+	JobIdUuid                   = armadaevents.UuidFromProtoUuid(JobIdProto)
+	RunIdUuid                   = armadaevents.UuidFromProtoUuid(RunIdProto)
+	PartitionMarkerGroupIdUuid  = armadaevents.UuidFromProtoUuid(PartitionMarkerGroupIdProto)
+	PriorityClassName           = "test-priority"
+	PriorityClassValue          = int32(100)
+	PriorityClasses             = map[string]configuration.PriorityClass{PriorityClassName: {Priority: PriorityClassValue}}
+	Groups                      = []string{"group1", "group2"}
+	NodeSelector                = map[string]string{"foo": "bar"}
+	Tolerations                 = []v1.Toleration{{
 		Key:      "fish",
 		Operator: "exists",
 	}}
@@ -37,21 +40,22 @@ var (
 )
 
 const (
-	JobSetName       = "testJobset"
-	ExecutorId       = "testCluster"
-	NodeName         = "testNode"
-	PodName          = "test-pod"
-	Queue            = "test-Queue"
-	UserId           = "testUser"
-	Namespace        = "test-ns"
-	Priority         = 3
-	NewPriority      = 4
-	PodNumber        = 6
-	ExitCode         = 322
-	ErrMsg           = "sample error message"
-	LeaseReturnedMsg = "lease returned error message"
-	TerminatedMsg    = "test pod terminated message"
-	UnschedulableMsg = "test pod is unschedulable"
+	JobSetName                 = "testJobset"
+	ExecutorId                 = "testCluster"
+	NodeName                   = "testNode"
+	PodName                    = "test-pod"
+	Queue                      = "test-Queue"
+	UserId                     = "testUser"
+	Namespace                  = "test-ns"
+	Priority                   = 3
+	NewPriority                = 4
+	PodNumber                  = 6
+	ExitCode                   = 322
+	ErrMsg                     = "sample error message"
+	LeaseReturnedMsg           = "lease returned error message"
+	TerminatedMsg              = "test pod terminated message"
+	UnschedulableMsg           = "test pod is unschedulable"
+	PartitionMarkerPartitionId = 456
 )
 
 var Submit = &armadaevents.EventSequence_Event{
@@ -211,6 +215,16 @@ var JobCancelled = &armadaevents.EventSequence_Event{
 	},
 }
 
+var PartitionMarker = &armadaevents.EventSequence_Event{
+	Created: &BaseTime,
+	Event: &armadaevents.EventSequence_Event_PartitionMarker{
+		PartitionMarker: &armadaevents.PartitionMarker{
+			GroupId:   PartitionMarkerGroupIdProto,
+			Partition: PartitionMarkerPartitionId,
+		},
+	},
+}
+
 var JobReprioritiseRequested = &armadaevents.EventSequence_Event{
 	Created: &BaseTime,
 	Event: &armadaevents.EventSequence_Event_ReprioritiseJob{
diff --git a/internal/scheduleringester/dbops_test.go b/internal/scheduleringester/dbops_test.go
index c97aa5e7..7a219509 100644
--- a/internal/scheduleringester/dbops_test.go
+++ b/internal/scheduleringester/dbops_test.go
@@ -140,6 +140,12 @@ func TestDbOperationOptimisation(t *testing.T) {
 			MarkRunsRunning{runIds[1]: true},                                            // 3
 			InsertJobs{jobIds[2]: &schedulerdb.Job{JobID: jobIds[2]}},                   // 3
 		}},
+		"InsertPartitionMarker": {N: 2, Ops: []DbOperation{
+			InsertJobs{jobIds[0]: &schedulerdb.Job{JobID: jobIds[0]}}, // 1
+			InsertPartitionMarker{markers: []*schedulerdb.Marker{}},   // 2
+			InsertJobs{jobIds[1]: &schedulerdb.Job{JobID: jobIds[1]}}, // 1
+			InsertJobs{jobIds[2]: &schedulerdb.Job{JobID: jobIds[2]}}, // 1
+		}},
 	}
 	for name, tc := range tests {
 		t.Run(name, func(t *testing.T) {
diff --git a/internal/scheduleringester/instructions_test.go b/internal/scheduleringester/instructions_test.go
index 07b8bc49..cbff5df9 100644
--- a/internal/scheduleringester/instructions_test.go
+++ b/internal/scheduleringester/instructions_test.go
@@ -151,6 +151,18 @@ func TestConvertSequence(t *testing.T) {
 				MarkJobsCancelled{f.JobIdString: true},
 			},
 		},
+		"PositionMarker": {
+			events: []*armadaevents.EventSequence_Event{f.PartitionMarker},
+			expected: []DbOperation{
+				InsertPartitionMarker{markers: []*schedulerdb.Marker{
+					{
+						GroupID:     f.PartitionMarkerGroupIdUuid,
+						PartitionID: f.PartitionMarkerPartitionId,
+						Created:     f.BaseTime,
+					},
+				}},
+			},
+		},
 		"multiple events": {
 			events: []*armadaevents.EventSequence_Event{f.JobSetCancelRequested, f.Running, f.JobSucceeded},
 			expected: []DbOperation{
diff --git a/internal/scheduleringester/schedulerdb_test.go b/internal/scheduleringester/schedulerdb_test.go
index 98e6ab53..d52a5cfb 100644
--- a/internal/scheduleringester/schedulerdb_test.go
+++ b/internal/scheduleringester/schedulerdb_test.go
@@ -9,6 +9,7 @@ import (
 	"github.com/jackc/pgx/v4/pgxpool"
 	"github.com/pkg/errors"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 	"golang.org/x/exp/constraints"
 	"golang.org/x/exp/maps"
 
@@ -200,6 +201,24 @@ func TestWriteOps(t *testing.T) {
 				runIds[1]: true,
 			},
 		}},
+		"Insert PositionMarkers": {Ops: []DbOperation{
+			InsertPartitionMarker{
+				markers: []*schedulerdb.Marker{
+					{
+						GroupID:     uuid.New(),
+						PartitionID: 1,
+					},
+					{
+						GroupID:     uuid.New(),
+						PartitionID: 3,
+					},
+					{
+						GroupID:     uuid.New(),
+						PartitionID: 2,
+					},
+				},
+			},
+		}},
 	}
 	for name, tc := range tests {
 		t.Run(name, func(t *testing.T) {
@@ -490,6 +509,16 @@ func assertOpSuccess(t *testing.T, schedulerDb *SchedulerDb, serials map[string]
 			}
 		}
 		assert.Equal(t, expected, actual)
+	case InsertPartitionMarker:
+		actual, err := queries.SelectAllMarkers(ctx)
+		require.NoError(t, err)
+		require.Equal(t, len(expected.markers), len(actual))
+		for i, expectedMarker := range actual {
+			actualMarker := actual[i]
+			assert.Equal(t, expectedMarker.GroupID, actualMarker.GroupID)
+			assert.Equal(t, expectedMarker.PartitionID, actualMarker.PartitionID)
+			assert.Equal(t, expectedMarker.Created, actualMarker.Created)
+		}
 	default:
 		return errors.Errorf("received unexpected op %+v", op)
 	}