diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json
index 5ef2dadd77..310c905f8a 100644
--- a/api/json-schema/schema.json
+++ b/api/json-schema/schema.json
@@ -18788,6 +18788,10 @@
"job": {
"$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.JobTemplate",
"description": "JobTemplate is used to customize Jobs"
+ },
+ "vertex": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.VertexTemplate",
+ "description": "VertexTemplate is used to customize Vertices"
}
},
"type": "object"
@@ -19054,6 +19058,65 @@
],
"type": "object"
},
+ "io.numaproj.numaflow.v1alpha1.VertexTemplate": {
+ "properties": {
+ "affinity": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.Affinity",
+ "description": "The pod's scheduling constraints More info: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/"
+ },
+ "containerTemplate": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.ContainerTemplate"
+ },
+ "imagePullSecrets": {
+ "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod",
+ "items": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference"
+ },
+ "type": "array",
+ "x-kubernetes-patch-merge-key": "name",
+ "x-kubernetes-patch-strategy": "merge"
+ },
+ "initContainerTemplate": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.ContainerTemplate"
+ },
+ "metadata": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Metadata",
+ "description": "Metadata sets the pods's metadata, i.e. annotations and labels"
+ },
+ "nodeSelector": {
+ "additionalProperties": {
+ "type": "string"
+ },
+ "description": "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/",
+ "type": "object"
+ },
+ "priority": {
+ "description": "The priority value. Various system components use this field to find the priority of the Redis pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ "format": "int32",
+ "type": "integer"
+ },
+ "priorityClassName": {
+ "description": "If specified, indicates the Redis pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ "type": "string"
+ },
+ "securityContext": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.PodSecurityContext",
+ "description": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field."
+ },
+ "serviceAccountName": {
+ "description": "ServiceAccountName applied to the pod",
+ "type": "string"
+ },
+ "tolerations": {
+ "description": "If specified, the pod's tolerations.",
+ "items": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.Toleration"
+ },
+ "type": "array"
+ }
+ },
+ "type": "object"
+ },
"io.numaproj.numaflow.v1alpha1.Watermark": {
"properties": {
"disabled": {
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index 2ab0874eae..b8db4e43ce 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -18775,6 +18775,10 @@
"job": {
"description": "JobTemplate is used to customize Jobs",
"$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.JobTemplate"
+ },
+ "vertex": {
+ "description": "VertexTemplate is used to customize Vertices",
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.VertexTemplate"
}
}
},
@@ -19031,6 +19035,65 @@
}
}
},
+ "io.numaproj.numaflow.v1alpha1.VertexTemplate": {
+ "type": "object",
+ "properties": {
+ "affinity": {
+ "description": "The pod's scheduling constraints More info: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/",
+ "$ref": "#/definitions/io.k8s.api.core.v1.Affinity"
+ },
+ "containerTemplate": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.ContainerTemplate"
+ },
+ "imagePullSecrets": {
+ "description": "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.LocalObjectReference"
+ },
+ "x-kubernetes-patch-merge-key": "name",
+ "x-kubernetes-patch-strategy": "merge"
+ },
+ "initContainerTemplate": {
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.ContainerTemplate"
+ },
+ "metadata": {
+ "description": "Metadata sets the pods's metadata, i.e. annotations and labels",
+ "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Metadata"
+ },
+ "nodeSelector": {
+ "description": "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/",
+ "type": "object",
+ "additionalProperties": {
+ "type": "string"
+ }
+ },
+ "priority": {
+ "description": "The priority value. Various system components use this field to find the priority of the Redis pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ "type": "integer",
+ "format": "int32"
+ },
+ "priorityClassName": {
+ "description": "If specified, indicates the Redis pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ "type": "string"
+ },
+ "securityContext": {
+ "description": "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.",
+ "$ref": "#/definitions/io.k8s.api.core.v1.PodSecurityContext"
+ },
+ "serviceAccountName": {
+ "description": "ServiceAccountName applied to the pod",
+ "type": "string"
+ },
+ "tolerations": {
+ "description": "If specified, the pod's tolerations.",
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/io.k8s.api.core.v1.Toleration"
+ }
+ }
+ }
+ },
"io.numaproj.numaflow.v1alpha1.Watermark": {
"type": "object",
"properties": {
diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
index 5a857887e3..3da9ad0819 100644
--- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
@@ -1510,6 +1510,762 @@ spec:
format: int32
type: integer
type: object
+ vertex:
+ properties:
+ affinity:
+ properties:
+ nodeAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ preference:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ properties:
+ nodeSelectorTerms:
+ items:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ type: object
+ podAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ containerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ imagePullSecrets:
+ items:
+ properties:
+ name:
+ type: string
+ type: object
+ type: array
+ initContainerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ metadata:
+ properties:
+ annotations:
+ additionalProperties:
+ type: string
+ type: object
+ labels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ nodeSelector:
+ additionalProperties:
+ type: string
+ type: object
+ priority:
+ format: int32
+ type: integer
+ priorityClassName:
+ type: string
+ securityContext:
+ properties:
+ fsGroup:
+ format: int64
+ type: integer
+ fsGroupChangePolicy:
+ type: string
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ supplementalGroups:
+ items:
+ format: int64
+ type: integer
+ type: array
+ sysctls:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ required:
+ - name
+ - value
+ type: object
+ type: array
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ serviceAccountName:
+ type: string
+ tolerations:
+ items:
+ properties:
+ effect:
+ type: string
+ key:
+ type: string
+ operator:
+ type: string
+ tolerationSeconds:
+ format: int64
+ type: integer
+ value:
+ type: string
+ type: object
+ type: array
+ type: object
type: object
vertices:
items:
diff --git a/config/install.yaml b/config/install.yaml
index b76d3a896b..95dd11bda3 100644
--- a/config/install.yaml
+++ b/config/install.yaml
@@ -3731,6 +3731,762 @@ spec:
format: int32
type: integer
type: object
+ vertex:
+ properties:
+ affinity:
+ properties:
+ nodeAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ preference:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ properties:
+ nodeSelectorTerms:
+ items:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ type: object
+ podAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ containerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ imagePullSecrets:
+ items:
+ properties:
+ name:
+ type: string
+ type: object
+ type: array
+ initContainerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ metadata:
+ properties:
+ annotations:
+ additionalProperties:
+ type: string
+ type: object
+ labels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ nodeSelector:
+ additionalProperties:
+ type: string
+ type: object
+ priority:
+ format: int32
+ type: integer
+ priorityClassName:
+ type: string
+ securityContext:
+ properties:
+ fsGroup:
+ format: int64
+ type: integer
+ fsGroupChangePolicy:
+ type: string
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ supplementalGroups:
+ items:
+ format: int64
+ type: integer
+ type: array
+ sysctls:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ required:
+ - name
+ - value
+ type: object
+ type: array
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ serviceAccountName:
+ type: string
+ tolerations:
+ items:
+ properties:
+ effect:
+ type: string
+ key:
+ type: string
+ operator:
+ type: string
+ tolerationSeconds:
+ format: int64
+ type: integer
+ value:
+ type: string
+ type: object
+ type: array
+ type: object
type: object
vertices:
items:
diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml
index df11587de6..a76be7761c 100644
--- a/config/namespace-install.yaml
+++ b/config/namespace-install.yaml
@@ -3731,6 +3731,762 @@ spec:
format: int32
type: integer
type: object
+ vertex:
+ properties:
+ affinity:
+ properties:
+ nodeAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ preference:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - preference
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ properties:
+ nodeSelectorTerms:
+ items:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchFields:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ type: object
+ type: array
+ required:
+ - nodeSelectorTerms
+ type: object
+ type: object
+ podAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ podAntiAffinity:
+ properties:
+ preferredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ podAffinityTerm:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ weight:
+ format: int32
+ type: integer
+ required:
+ - podAffinityTerm
+ - weight
+ type: object
+ type: array
+ requiredDuringSchedulingIgnoredDuringExecution:
+ items:
+ properties:
+ labelSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaceSelector:
+ properties:
+ matchExpressions:
+ items:
+ properties:
+ key:
+ type: string
+ operator:
+ type: string
+ values:
+ items:
+ type: string
+ type: array
+ required:
+ - key
+ - operator
+ type: object
+ type: array
+ matchLabels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ namespaces:
+ items:
+ type: string
+ type: array
+ topologyKey:
+ type: string
+ required:
+ - topologyKey
+ type: object
+ type: array
+ type: object
+ type: object
+ containerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ imagePullSecrets:
+ items:
+ properties:
+ name:
+ type: string
+ type: object
+ type: array
+ initContainerTemplate:
+ properties:
+ env:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ valueFrom:
+ properties:
+ configMapKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ fieldRef:
+ properties:
+ apiVersion:
+ type: string
+ fieldPath:
+ type: string
+ required:
+ - fieldPath
+ type: object
+ resourceFieldRef:
+ properties:
+ containerName:
+ type: string
+ divisor:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ resource:
+ type: string
+ required:
+ - resource
+ type: object
+ secretKeyRef:
+ properties:
+ key:
+ type: string
+ name:
+ type: string
+ optional:
+ type: boolean
+ required:
+ - key
+ type: object
+ type: object
+ required:
+ - name
+ type: object
+ type: array
+ imagePullPolicy:
+ type: string
+ resources:
+ properties:
+ limits:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ requests:
+ additionalProperties:
+ anyOf:
+ - type: integer
+ - type: string
+ pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+ x-kubernetes-int-or-string: true
+ type: object
+ type: object
+ securityContext:
+ properties:
+ allowPrivilegeEscalation:
+ type: boolean
+ capabilities:
+ properties:
+ add:
+ items:
+ type: string
+ type: array
+ drop:
+ items:
+ type: string
+ type: array
+ type: object
+ privileged:
+ type: boolean
+ procMount:
+ type: string
+ readOnlyRootFilesystem:
+ type: boolean
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ type: object
+ metadata:
+ properties:
+ annotations:
+ additionalProperties:
+ type: string
+ type: object
+ labels:
+ additionalProperties:
+ type: string
+ type: object
+ type: object
+ nodeSelector:
+ additionalProperties:
+ type: string
+ type: object
+ priority:
+ format: int32
+ type: integer
+ priorityClassName:
+ type: string
+ securityContext:
+ properties:
+ fsGroup:
+ format: int64
+ type: integer
+ fsGroupChangePolicy:
+ type: string
+ runAsGroup:
+ format: int64
+ type: integer
+ runAsNonRoot:
+ type: boolean
+ runAsUser:
+ format: int64
+ type: integer
+ seLinuxOptions:
+ properties:
+ level:
+ type: string
+ role:
+ type: string
+ type:
+ type: string
+ user:
+ type: string
+ type: object
+ seccompProfile:
+ properties:
+ localhostProfile:
+ type: string
+ type:
+ type: string
+ required:
+ - type
+ type: object
+ supplementalGroups:
+ items:
+ format: int64
+ type: integer
+ type: array
+ sysctls:
+ items:
+ properties:
+ name:
+ type: string
+ value:
+ type: string
+ required:
+ - name
+ - value
+ type: object
+ type: array
+ windowsOptions:
+ properties:
+ gmsaCredentialSpec:
+ type: string
+ gmsaCredentialSpecName:
+ type: string
+ hostProcess:
+ type: boolean
+ runAsUserName:
+ type: string
+ type: object
+ type: object
+ serviceAccountName:
+ type: string
+ tolerations:
+ items:
+ properties:
+ effect:
+ type: string
+ key:
+ type: string
+ operator:
+ type: string
+ tolerationSeconds:
+ format: int64
+ type: integer
+ value:
+ type: string
+ type: object
+ type: array
+ type: object
type: object
vertices:
items:
diff --git a/docs/APIs.md b/docs/APIs.md
index f3541e59b2..399b2c5e51 100644
--- a/docs/APIs.md
+++ b/docs/APIs.md
@@ -23,7 +23,8 @@ AbstractPodTemplate
DaemonTemplate,
JetStreamBufferService,
JobTemplate,
-NativeRedis)
+NativeRedis,
+VertexTemplate)
@@ -536,7 +537,8 @@ ContainerTemplate
DaemonTemplate,
JetStreamBufferService,
JobTemplate,
-NativeRedis)
+NativeRedis,
+VertexTemplate)
@@ -3548,6 +3550,19 @@ JobTemplate is used to customize Jobs
+
+
+vertex
+ VertexTemplate
+
+ |
+
+(Optional)
+
+VertexTemplate is used to customize Vertices
+
+ |
+
@@ -3990,6 +4005,63 @@ Kubernetes meta/v1.Time
+
+VertexTemplate
+
+
+(Appears on:
+Templates)
+
+
+
+
+
+
+
+Field
+ |
+
+Description
+ |
+
+
+
+
+
+AbstractPodTemplate
+
+AbstractPodTemplate
+ |
+
+
+(Members of AbstractPodTemplate are embedded into this
+type.)
+
+(Optional)
+ |
+
+
+
+containerTemplate
+
+ContainerTemplate
+ |
+
+(Optional)
+ |
+
+
+
+initContainerTemplate
+
+ContainerTemplate
+ |
+
+(Optional)
+ |
+
+
+
VertexType (string
alias)
diff --git a/docs/controller-configmap.md b/docs/controller-configmap.md
index 0f4161cef3..18b4b8eff3 100644
--- a/docs/controller-configmap.md
+++ b/docs/controller-configmap.md
@@ -6,7 +6,8 @@ For a detailed example, please see [`numaflow-controller-config.yaml`](./numaflo
## Configuration Structure
-The configuration should be under `controller-config.yaml` key in the ConfigMap, as a string in `yaml` format:
+The configuration should be under `controller-config.yaml` key in the ConfigMap, as a string in `yaml` format.
+Additionally, pipeline templates can be provided be under `pipeline-templates.yaml`.
```yaml
apiVersion: v1
@@ -18,6 +19,10 @@ data:
isbsvc:
jetstream:
...
+ # optional
+ pipeline-templates.yaml: |
+ vertex:
+ ...
```
### ISB Service Configuration
@@ -42,3 +47,46 @@ data:
configReloaderImage: natsio/nats-server-config-reloader:0.7.0
startCommand: /nats-server
```
+
+### Pipeline Templates Configuration
+
+Pipeline Templates are used to customize Pipeline components and can be specified in 2 places:
+* **In the controller ConfigMap** (described here), which affect all pipelines managed by the controller. The
+ logs will show `Successfully loaded pipeline templates file` if it detects pipeline templates.
+* **In each Pipeline** (described in [Pipeline customization](./pipeline-customization.md)), which affect that
+ individual pipeline and takes precedence over what is specified in the controller configmap.
+
+In either case the configuration is the same, the only difference being where it is specified.
+The ConfigMap expects a string in `yaml` format under `.data."pipeline-templates.yaml"`, whereas a Pipeline expects
+yaml under `.spec.templates`.
+
+The example below shows how to populate the ConfigMap.
+For more details about pipeline templates, see [Pipeline customization](./pipeline-customization.md).
+
+```yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: numaflow-controller-config
+data:
+ controller-config.yaml: |
+ ...
+ pipeline-templates.yaml: |
+ daemon:
+ replicas: 2
+ job:
+ ttlSecondsAfterFinished: 600
+ vertex:
+ metadata:
+ annotations:
+ key1: value1
+ priorityClassName: my-priority-class-name
+ containerTemplate:
+ resources:
+ requests:
+ cpu: 200m
+ initContainerTemplate:
+ resources:
+ limits:
+ memory: 256Mi
+```
diff --git a/docs/pipeline-customization.md b/docs/pipeline-customization.md
index b58c2e0851..68df80db9b 100644
--- a/docs/pipeline-customization.md
+++ b/docs/pipeline-customization.md
@@ -1,14 +1,14 @@
# Pipeline Customization
There is an optional `.spec.templates` field in the `Pipeline` resource which may be used to customize kubernetes resources owned by the Pipeline.
+This takes precedence over anything specified in the [Controller ConfigMap](./controller-configmap.md#pipeline-templates-configuration).
-Vertex customization is described separately in more detail (i.e. [Environment Variables](./environment-variables.md), [Container Resources](./container-resources.md), etc.).
+Vertex customization is described separately (i.e. [Environment Variables](./environment-variables.md), [Container Resources](./container-resources.md), etc.)
+and takes precedence over any vertex templates.
-## Daemon Deployment
+## Component customization
-The following example shows how to configure a Daemon Deployment with all currently supported fields.
-
-The `.spec.templates.daemon` field and all fields directly under it are optional.
+The following example shows all currently supported fields. The `.spec.templates.` field and all fields directly under it are optional.
```yaml
apiVersion: numaflow.numaproj.io/v1alpha1
@@ -17,18 +17,17 @@ metadata:
name: my-pipeline
spec:
templates:
+ # can be "daemon", "job" or "vertex"
daemon:
- # Deployment spec
- replicas: 3
# Pod metadata
metadata:
labels:
- my-label-name: my-label-value
+ my-label-key: my-label-value
annotations:
- my-annotation-name: my-annotation-value
+ my-annotation-key: my-annotation-value
# Pod spec
nodeSelector:
- my-node-label-name: my-node-label-value
+ my-node-label-key: my-node-label-value
tolerations:
- key: "my-example-key"
operator: "Exists"
@@ -70,11 +69,24 @@ spec:
memory: 500Mi
```
-## Jobs
+## Daemon customization
+
+In addition to the `Component customization` described above, the Pipeline daemon has the following additional fields available.
+
+```yaml
+apiVersion: numaflow.numaproj.io/v1alpha1
+kind: Pipeline
+metadata:
+ name: my-pipeline
+spec:
+ templates:
+ daemon:
+ replicas: 3
+```
-The following example shows how to configure kubernetes Jobs owned by a Pipeline with all currently supported fields.
+## Job customization
-The `.spec.templates.job` field and all fields directly under it are optional.
+In addition to the `Component customization` described above, Pipeline jobs have the following additional fields available.
```yaml
apiVersion: numaflow.numaproj.io/v1alpha1
@@ -84,35 +96,10 @@ metadata:
spec:
templates:
job:
- # Job spec
ttlSecondsAfterFinished: 600 # numaflow defaults to 30
backoffLimit: 5 # numaflow defaults to 20
- # Pod metadata
- metadata:
- labels:
- my-label-name: my-label-value
- annotations:
- my-annotation-name: my-annotation-value
- # Pod spec
- nodeSelector:
- my-node-label-name: my-node-label-value
- tolerations:
- - key: "my-example-key"
- operator: "Exists"
- effect: "NoSchedule"
- securityContext: {}
- imagePullSecrets:
- - name: regcred
- priorityClassName: my-priority-class-name
- priority: 50
- serviceAccountName: my-service-account
- affinity: {}
- # Container
- containerTemplate:
- env:
- - name: MY_ENV_NAME
- value: my-env-value
- resources:
- limits:
- memory: 500Mi
```
+
+## Vertex customization
+
+See `Component customization` described above.
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index 4ba76866f1..4fe9e242e9 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -1728,10 +1728,38 @@ func (m *VertexStatus) XXX_DiscardUnknown() {
var xxx_messageInfo_VertexStatus proto.InternalMessageInfo
+func (m *VertexTemplate) Reset() { *m = VertexTemplate{} }
+func (*VertexTemplate) ProtoMessage() {}
+func (*VertexTemplate) Descriptor() ([]byte, []int) {
+ return fileDescriptor_9d0d1b17d3865563, []int{60}
+}
+func (m *VertexTemplate) XXX_Unmarshal(b []byte) error {
+ return m.Unmarshal(b)
+}
+func (m *VertexTemplate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ b = b[:cap(b)]
+ n, err := m.MarshalToSizedBuffer(b)
+ if err != nil {
+ return nil, err
+ }
+ return b[:n], nil
+}
+func (m *VertexTemplate) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_VertexTemplate.Merge(m, src)
+}
+func (m *VertexTemplate) XXX_Size() int {
+ return m.Size()
+}
+func (m *VertexTemplate) XXX_DiscardUnknown() {
+ xxx_messageInfo_VertexTemplate.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_VertexTemplate proto.InternalMessageInfo
+
func (m *Watermark) Reset() { *m = Watermark{} }
func (*Watermark) ProtoMessage() {}
func (*Watermark) Descriptor() ([]byte, []int) {
- return fileDescriptor_9d0d1b17d3865563, []int{60}
+ return fileDescriptor_9d0d1b17d3865563, []int{61}
}
func (m *Watermark) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1759,7 +1787,7 @@ var xxx_messageInfo_Watermark proto.InternalMessageInfo
func (m *Window) Reset() { *m = Window{} }
func (*Window) ProtoMessage() {}
func (*Window) Descriptor() ([]byte, []int) {
- return fileDescriptor_9d0d1b17d3865563, []int{61}
+ return fileDescriptor_9d0d1b17d3865563, []int{62}
}
func (m *Window) XXX_Unmarshal(b []byte) error {
return m.Unmarshal(b)
@@ -1853,6 +1881,7 @@ func init() {
proto.RegisterType((*VertexList)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.VertexList")
proto.RegisterType((*VertexSpec)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.VertexSpec")
proto.RegisterType((*VertexStatus)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.VertexStatus")
+ proto.RegisterType((*VertexTemplate)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.VertexTemplate")
proto.RegisterType((*Watermark)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.Watermark")
proto.RegisterType((*Window)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.Window")
}
@@ -1862,328 +1891,330 @@ func init() {
}
var fileDescriptor_9d0d1b17d3865563 = []byte{
- // 5126 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, 0x7f, 0x66, 0xee, 0x64, 0x26, 0x1e, 0x6f, 0xe2, 0x1e, 0x6a,
- 0x95, 0x68, 0x80, 0xdd, 0x36, 0x31, 0x59, 0x76, 0x16, 0xd8, 0x4d, 0xdc, 0xf6, 0xd8, 0xf1, 0x8c,
- 0x3d, 0xe9, 0x3d, 0x6d, 0xcf, 0x64, 0x13, 0xd8, 0x50, 0xae, 0xbe, 0xdd, 0xae, 0x74, 0x75, 0x55,
- 0x6f, 0xd5, 0x6d, 0xcf, 0x38, 0x62, 0x05, 0x52, 0x1e, 0x12, 0xc4, 0xa2, 0x05, 0xad, 0x90, 0x56,
- 0x5a, 0xed, 0x8a, 0x07, 0x24, 0x04, 0x62, 0x25, 0x5e, 0x90, 0x10, 0xbc, 0xf0, 0x84, 0x02, 0x0f,
- 0x90, 0x07, 0x24, 0x82, 0xb4, 0xb2, 0x88, 0x91, 0x90, 0x78, 0x41, 0x8b, 0xf6, 0x6d, 0x84, 0x04,
- 0xba, 0x3f, 0xf5, 0xdb, 0xd5, 0x1e, 0xbb, 0xdb, 0x93, 0x9d, 0x88, 0xb7, 0xae, 0x7b, 0xce, 0xf9,
- 0xce, 0xad, 0x5b, 0xf7, 0x9e, 0x7b, 0x7e, 0xee, 0x6d, 0xd8, 0xe8, 0x98, 0x6c, 0x7f, 0xb0, 0x57,
- 0x33, 0x9c, 0xde, 0x92, 0x3d, 0xe8, 0xe9, 0x7d, 0xd7, 0x79, 0x5b, 0xfc, 0x68, 0x5b, 0xce, 0xfd,
- 0xa5, 0x7e, 0xb7, 0xb3, 0xa4, 0xf7, 0x4d, 0x2f, 0x6c, 0x39, 0x78, 0x51, 0xb7, 0xfa, 0xfb, 0xfa,
- 0x8b, 0x4b, 0x1d, 0x6a, 0x53, 0x57, 0x67, 0xb4, 0x55, 0xeb, 0xbb, 0x0e, 0x73, 0xc8, 0x17, 0x43,
- 0xa0, 0x9a, 0x0f, 0x54, 0xf3, 0xc5, 0x6a, 0xfd, 0x6e, 0xa7, 0xc6, 0x81, 0xc2, 0x16, 0x1f, 0x68,
- 0xe1, 0xf3, 0x91, 0x1e, 0x74, 0x9c, 0x8e, 0xb3, 0x24, 0xf0, 0xf6, 0x06, 0x6d, 0xf1, 0x24, 0x1e,
- 0xc4, 0x2f, 0xa9, 0x67, 0x41, 0xeb, 0xde, 0xf0, 0x6a, 0xa6, 0xc3, 0xbb, 0xb5, 0x64, 0x38, 0x2e,
- 0x5d, 0x3a, 0x18, 0xea, 0xcb, 0xc2, 0x4b, 0x21, 0x4f, 0x4f, 0x37, 0xf6, 0x4d, 0x9b, 0xba, 0x87,
- 0xfe, 0xbb, 0x2c, 0xb9, 0xd4, 0x73, 0x06, 0xae, 0x41, 0xcf, 0x24, 0xe5, 0x2d, 0xf5, 0x28, 0xd3,
- 0xd3, 0x74, 0x2d, 0x8d, 0x92, 0x72, 0x07, 0x36, 0x33, 0x7b, 0xc3, 0x6a, 0x7e, 0xe9, 0x51, 0x02,
- 0x9e, 0xb1, 0x4f, 0x7b, 0x7a, 0x52, 0x4e, 0xfb, 0xce, 0x14, 0x5c, 0x5a, 0xd9, 0xf3, 0x98, 0xab,
- 0x1b, 0xac, 0xe1, 0xb4, 0x76, 0x68, 0xaf, 0x6f, 0xe9, 0x8c, 0x92, 0x2e, 0x94, 0x78, 0xdf, 0x5a,
- 0x3a, 0xd3, 0xe7, 0x33, 0xd7, 0x32, 0xd7, 0x2b, 0xcb, 0x2b, 0xb5, 0x31, 0xbf, 0x45, 0x6d, 0x5b,
- 0x01, 0xd5, 0xa7, 0x8f, 0x8f, 0xaa, 0x25, 0xff, 0x09, 0x03, 0x05, 0xe4, 0xbb, 0x19, 0x98, 0xb6,
- 0x9d, 0x16, 0x6d, 0x52, 0x8b, 0x1a, 0xcc, 0x71, 0xe7, 0xb3, 0xd7, 0x72, 0xd7, 0x2b, 0xcb, 0x5f,
- 0x1f, 0x5b, 0x63, 0xca, 0x1b, 0xd5, 0xee, 0x44, 0x14, 0xdc, 0xb4, 0x99, 0x7b, 0x58, 0x7f, 0xfa,
- 0x83, 0xa3, 0xea, 0x53, 0xc7, 0x47, 0xd5, 0xe9, 0x28, 0x09, 0x63, 0x3d, 0x21, 0xbb, 0x50, 0x61,
- 0x8e, 0xc5, 0x87, 0xcc, 0x74, 0x6c, 0x6f, 0x3e, 0x27, 0x3a, 0xb6, 0x58, 0x93, 0xa3, 0xcd, 0xd5,
- 0xd7, 0xf8, 0x74, 0xa9, 0x1d, 0xbc, 0x58, 0xdb, 0x09, 0xd8, 0xea, 0x97, 0x14, 0x70, 0x25, 0x6c,
- 0xf3, 0x30, 0x8a, 0x43, 0x28, 0xcc, 0x79, 0xd4, 0x18, 0xb8, 0x26, 0x3b, 0x5c, 0x75, 0x6c, 0x46,
- 0x1f, 0xb0, 0xf9, 0xbc, 0x18, 0xe5, 0x17, 0xd2, 0xa0, 0x1b, 0x4e, 0xab, 0x19, 0xe7, 0xae, 0x5f,
- 0x3a, 0x3e, 0xaa, 0xce, 0x25, 0x1a, 0x31, 0x89, 0x49, 0x6c, 0xb8, 0x60, 0xf6, 0xf4, 0x0e, 0x6d,
- 0x0c, 0x2c, 0xab, 0x49, 0x0d, 0x97, 0x32, 0x6f, 0xbe, 0x20, 0x5e, 0xe1, 0x7a, 0x9a, 0x9e, 0x2d,
- 0xc7, 0xd0, 0xad, 0xd7, 0xf6, 0xde, 0xa6, 0x06, 0x43, 0xda, 0xa6, 0x2e, 0xb5, 0x0d, 0x5a, 0x9f,
- 0x57, 0x2f, 0x73, 0x61, 0x33, 0x81, 0x84, 0x43, 0xd8, 0x64, 0x03, 0x2e, 0xf6, 0x5d, 0xd3, 0x11,
- 0x5d, 0xb0, 0x74, 0xcf, 0xbb, 0xa3, 0xf7, 0xe8, 0x7c, 0xf1, 0x5a, 0xe6, 0x7a, 0xb9, 0x7e, 0x55,
- 0xc1, 0x5c, 0x6c, 0x24, 0x19, 0x70, 0x58, 0x86, 0x5c, 0x87, 0x92, 0xdf, 0x38, 0x3f, 0x75, 0x2d,
- 0x73, 0xbd, 0x20, 0xe7, 0x8e, 0x2f, 0x8b, 0x01, 0x95, 0xac, 0x43, 0x49, 0x6f, 0xb7, 0x4d, 0x9b,
- 0x73, 0x96, 0xc4, 0x10, 0x3e, 0x9b, 0xf6, 0x6a, 0x2b, 0x8a, 0x47, 0xe2, 0xf8, 0x4f, 0x18, 0xc8,
- 0x92, 0x5b, 0x40, 0x3c, 0xea, 0x1e, 0x98, 0x06, 0x5d, 0x31, 0x0c, 0x67, 0x60, 0x33, 0xd1, 0xf7,
- 0xb2, 0xe8, 0xfb, 0x82, 0xea, 0x3b, 0x69, 0x0e, 0x71, 0x60, 0x8a, 0xd4, 0xc2, 0xcb, 0x70, 0x71,
- 0x68, 0xb6, 0x91, 0x0b, 0x90, 0xeb, 0xd2, 0x43, 0xb1, 0x98, 0xca, 0xc8, 0x7f, 0x92, 0xa7, 0xa1,
- 0x70, 0xa0, 0x5b, 0x03, 0x3a, 0x9f, 0x15, 0x6d, 0xf2, 0xe1, 0x97, 0xb3, 0x37, 0x32, 0xda, 0x1f,
- 0x94, 0x61, 0xd6, 0x9f, 0xc3, 0x77, 0xa9, 0xcb, 0xe8, 0x03, 0x72, 0x0d, 0xf2, 0x36, 0xef, 0x91,
- 0x90, 0xaf, 0x4f, 0xab, 0x1e, 0xe5, 0x45, 0x1f, 0x04, 0x85, 0x18, 0x50, 0x94, 0x36, 0x48, 0xe0,
- 0x55, 0x96, 0x5f, 0x1e, 0x7b, 0xf9, 0x34, 0x05, 0x4c, 0x1d, 0x8e, 0x8f, 0xaa, 0x45, 0xf9, 0x1b,
- 0x15, 0x34, 0x79, 0x13, 0xf2, 0x9e, 0x69, 0x77, 0xe7, 0x73, 0x42, 0xc5, 0x97, 0xc7, 0x57, 0x61,
- 0xda, 0xdd, 0x7a, 0x89, 0xbf, 0x01, 0xff, 0x85, 0x02, 0x94, 0xdc, 0x83, 0xdc, 0xa0, 0xd5, 0x56,
- 0x2b, 0xe1, 0x57, 0xc7, 0xc6, 0xde, 0x5d, 0x5b, 0xaf, 0x4f, 0x1d, 0x1f, 0x55, 0x73, 0xbb, 0x6b,
- 0xeb, 0xc8, 0x11, 0xc9, 0xb7, 0x33, 0x70, 0xd1, 0x70, 0x6c, 0xa6, 0x73, 0xbb, 0xe8, 0x5b, 0x84,
- 0xf9, 0x82, 0xd0, 0x73, 0x6b, 0x6c, 0x3d, 0xab, 0x49, 0xc4, 0xfa, 0x65, 0x3e, 0xc1, 0x87, 0x9a,
- 0x71, 0x58, 0x37, 0xf9, 0x5e, 0x06, 0x2e, 0xf3, 0x89, 0x37, 0xc4, 0x2c, 0x96, 0xcb, 0xf9, 0xf6,
- 0xea, 0xea, 0xf1, 0x51, 0xf5, 0xf2, 0x66, 0x9a, 0x32, 0x4c, 0xef, 0x03, 0xef, 0xdd, 0x25, 0x7d,
- 0xd8, 0x86, 0x8a, 0xa5, 0x58, 0x59, 0xde, 0x3a, 0x4f, 0xbb, 0x5c, 0xff, 0x8c, 0x9a, 0xca, 0x69,
- 0xdb, 0x10, 0xa6, 0xf5, 0x82, 0xdc, 0x84, 0xa9, 0x03, 0xc7, 0x1a, 0xf4, 0xa8, 0x37, 0x5f, 0x12,
- 0xc6, 0x6c, 0x21, 0x6d, 0xc5, 0xdf, 0x15, 0x2c, 0xf5, 0x39, 0x05, 0x3f, 0x25, 0x9f, 0x3d, 0xf4,
- 0x65, 0x89, 0x09, 0x45, 0xcb, 0xec, 0x99, 0xcc, 0x13, 0xab, 0xbc, 0xb2, 0x7c, 0x73, 0xec, 0xd7,
- 0x92, 0x4b, 0x74, 0x4b, 0x80, 0xc9, 0x55, 0x23, 0x7f, 0xa3, 0x52, 0x40, 0x0c, 0x28, 0x78, 0x86,
- 0x6e, 0xd1, 0x79, 0x10, 0x9a, 0xbe, 0x32, 0xfe, 0xb2, 0xe1, 0x28, 0xf5, 0x19, 0xf5, 0x4e, 0x05,
- 0xf1, 0x88, 0x12, 0x9b, 0xfc, 0x3a, 0xcc, 0xc6, 0xbe, 0xa6, 0x37, 0x5f, 0x11, 0xa3, 0xf3, 0x5c,
- 0xda, 0xe8, 0x04, 0x5c, 0xf5, 0x2b, 0x0a, 0x6c, 0x36, 0x36, 0x43, 0x3c, 0x4c, 0x80, 0x69, 0xf7,
- 0x60, 0x66, 0x65, 0xc0, 0xf6, 0x1d, 0xd7, 0x7c, 0x47, 0x6c, 0x62, 0x64, 0x1d, 0x0a, 0xcc, 0xe9,
- 0x52, 0x5b, 0xf9, 0x07, 0xcf, 0xa7, 0xa9, 0x91, 0x1b, 0xc3, 0x6d, 0x7a, 0xe8, 0xdb, 0xc2, 0x7a,
- 0x99, 0xf7, 0x7b, 0x87, 0xcb, 0xa1, 0x14, 0xd7, 0xde, 0x80, 0x62, 0x7d, 0xd0, 0x6e, 0x53, 0xf7,
- 0x14, 0x36, 0xae, 0x06, 0x79, 0x76, 0xd8, 0x57, 0x16, 0x33, 0xb0, 0xcb, 0xf9, 0x9d, 0xc3, 0x3e,
- 0x7d, 0x78, 0x54, 0x05, 0x89, 0xc3, 0x9f, 0x50, 0xf0, 0x69, 0x3f, 0xc9, 0xc0, 0x25, 0xd9, 0xa8,
- 0x4c, 0xf7, 0xaa, 0x63, 0xb7, 0xcd, 0x0e, 0xa1, 0x50, 0x70, 0x69, 0xcb, 0xf4, 0x54, 0xdf, 0xd7,
- 0xc6, 0xfe, 0x20, 0xc8, 0x51, 0x24, 0xa8, 0x7c, 0x35, 0xd1, 0x80, 0x12, 0x9d, 0x0c, 0xa0, 0xfc,
- 0x36, 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x53, 0x56, 0xf9, 0xd5, 0xb1, 0x55, 0xdd, 0xa2, 0xac, 0x29,
- 0x90, 0x94, 0xba, 0x99, 0xe3, 0xa3, 0x6a, 0x39, 0x68, 0xc4, 0x50, 0x93, 0xf6, 0x1f, 0x59, 0x28,
- 0x07, 0x5f, 0x8e, 0x7c, 0x16, 0x0a, 0x62, 0xa3, 0x56, 0xc3, 0x1a, 0x4c, 0x1e, 0xb1, 0x9f, 0xa3,
- 0xa4, 0x91, 0xe7, 0x61, 0xca, 0x70, 0x7a, 0x3d, 0xdd, 0x6e, 0x09, 0xe7, 0xab, 0x5c, 0xaf, 0xf0,
- 0x35, 0xb3, 0x2a, 0x9b, 0xd0, 0xa7, 0x91, 0x67, 0x21, 0xaf, 0xbb, 0x1d, 0xe9, 0x07, 0x95, 0xa5,
- 0xfd, 0x5e, 0x71, 0x3b, 0x1e, 0x8a, 0x56, 0xf2, 0x25, 0xc8, 0x51, 0xfb, 0x60, 0x3e, 0x3f, 0x7a,
- 0x51, 0xde, 0xb4, 0x0f, 0xee, 0xea, 0x6e, 0xbd, 0xa2, 0xfa, 0x90, 0xbb, 0x69, 0x1f, 0x20, 0x97,
- 0x21, 0x5f, 0x83, 0x69, 0xb9, 0x2e, 0xb7, 0xf9, 0x2e, 0xea, 0x7b, 0x29, 0xd5, 0xd1, 0x0b, 0x5b,
- 0xf0, 0x85, 0x2e, 0x5c, 0xa4, 0xd1, 0xc3, 0x18, 0x14, 0xf9, 0x1a, 0x94, 0x7d, 0xef, 0xdc, 0x53,
- 0xd6, 0x35, 0xd5, 0xfb, 0x41, 0xc5, 0x84, 0xf4, 0x1b, 0x03, 0xd3, 0xa5, 0x3d, 0x6a, 0x33, 0xaf,
- 0x7e, 0x51, 0x29, 0x28, 0xfb, 0x54, 0x0f, 0x43, 0x34, 0xed, 0xbf, 0xb3, 0x30, 0x6c, 0xee, 0xe3,
- 0x0a, 0x33, 0xe7, 0xa9, 0x90, 0xec, 0xc1, 0x5c, 0xe0, 0x74, 0x35, 0x1c, 0xcb, 0x34, 0x0e, 0xd5,
- 0x52, 0xb8, 0xa1, 0xc4, 0xe6, 0x36, 0xe3, 0xe4, 0x87, 0x47, 0xd5, 0xe7, 0x86, 0x63, 0x9b, 0x5a,
- 0xc8, 0x80, 0x49, 0x40, 0xae, 0x23, 0xe9, 0x9b, 0xca, 0xdd, 0xfe, 0xb3, 0x23, 0x56, 0xf8, 0x18,
- 0x8e, 0xe9, 0xf8, 0x33, 0x45, 0x7b, 0x3f, 0x0f, 0xb3, 0x6b, 0x3a, 0xed, 0x39, 0xf6, 0x23, 0xb7,
- 0xab, 0xcc, 0x13, 0xb1, 0x5d, 0x5d, 0x87, 0x92, 0x4b, 0xfb, 0x96, 0x69, 0xe8, 0x9e, 0xf8, 0x58,
- 0xca, 0x97, 0x45, 0xd5, 0x86, 0x01, 0x75, 0x84, 0x9b, 0x92, 0x7b, 0x22, 0xdd, 0x94, 0xfc, 0x4f,
- 0xdf, 0x4d, 0xd1, 0x7e, 0x94, 0x85, 0xfc, 0xcd, 0x56, 0x87, 0xf2, 0x8d, 0xa3, 0xed, 0x3a, 0xbd,
- 0xe4, 0xc6, 0xb1, 0xee, 0x3a, 0x3d, 0x14, 0x14, 0xb2, 0x00, 0x59, 0xe6, 0xa8, 0xb5, 0x02, 0x8a,
- 0x9e, 0xdd, 0x71, 0x30, 0xcb, 0x1c, 0xf2, 0x0e, 0x80, 0xe1, 0xd8, 0x2d, 0xd3, 0x0f, 0xf1, 0x26,
- 0x7b, 0xb1, 0x75, 0xc7, 0xbd, 0xaf, 0xbb, 0xad, 0xd5, 0x00, 0xb1, 0x3e, 0x7b, 0x7c, 0x54, 0x85,
- 0xf0, 0x19, 0x23, 0xda, 0x48, 0x27, 0x70, 0x42, 0xe4, 0x80, 0xae, 0x8e, 0xad, 0x97, 0x0f, 0xc4,
- 0x09, 0x2e, 0xc8, 0x8b, 0x50, 0xe9, 0xeb, 0xae, 0x6e, 0x59, 0xd4, 0x32, 0xbd, 0x9e, 0xf0, 0x7d,
- 0x0b, 0xf5, 0x39, 0x1e, 0xa4, 0x36, 0xc2, 0x66, 0x8c, 0xf2, 0x68, 0xbf, 0x97, 0x01, 0x08, 0x51,
- 0xc9, 0x97, 0x61, 0x6e, 0x4f, 0x6c, 0xa5, 0xdb, 0xfa, 0x83, 0x2d, 0x6a, 0x77, 0xd8, 0xbe, 0x18,
- 0xef, 0xbc, 0x5c, 0xf2, 0xf5, 0x38, 0x09, 0x93, 0xbc, 0xe4, 0x15, 0xb8, 0x20, 0x9b, 0x76, 0x3d,
- 0x5d, 0x61, 0x8a, 0xef, 0x31, 0x53, 0x7f, 0x9a, 0x47, 0x97, 0xf5, 0x04, 0x0d, 0x87, 0xb8, 0x35,
- 0x1d, 0x2a, 0xeb, 0xe6, 0x03, 0xda, 0xba, 0x67, 0xda, 0x2d, 0xe7, 0x3e, 0x41, 0x28, 0x5a, 0x61,
- 0x37, 0x2a, 0xcb, 0xb5, 0x88, 0x19, 0x09, 0x72, 0x20, 0xe1, 0x88, 0xf5, 0x28, 0xd3, 0xb9, 0x61,
- 0x59, 0x1b, 0xa8, 0x28, 0x5d, 0x8e, 0x92, 0xec, 0xad, 0x42, 0xd2, 0x5e, 0x82, 0x8b, 0x43, 0xdf,
- 0x8f, 0x54, 0xa1, 0xd0, 0xa5, 0x87, 0x9b, 0xdc, 0xd1, 0xe1, 0xbb, 0x9e, 0xd8, 0xe6, 0x6f, 0xf3,
- 0x06, 0x94, 0xed, 0xda, 0xff, 0x64, 0xa0, 0xb4, 0x3e, 0xb0, 0x0d, 0xe1, 0x16, 0x3d, 0xda, 0x89,
- 0xf1, 0x37, 0xd1, 0x6c, 0xea, 0x26, 0x3a, 0x80, 0x62, 0xf7, 0x7e, 0xb0, 0xc9, 0x56, 0x96, 0xb7,
- 0xc7, 0x9f, 0x89, 0xaa, 0x4b, 0xb5, 0xdb, 0x02, 0x4f, 0x26, 0x3d, 0x66, 0x55, 0x87, 0x8a, 0xb7,
- 0xef, 0x09, 0xa5, 0x4a, 0xd9, 0xc2, 0x97, 0xa0, 0x12, 0x61, 0x3b, 0x53, 0xb4, 0xfa, 0xc3, 0x0c,
- 0xcc, 0x6d, 0xc8, 0xbc, 0x92, 0xe3, 0xca, 0x78, 0x91, 0x5c, 0x85, 0x9c, 0xdb, 0x1f, 0x08, 0xf9,
- 0x9c, 0x0c, 0xc6, 0xb0, 0xb1, 0x8b, 0xbc, 0x8d, 0xbc, 0x0e, 0xa5, 0x96, 0xfa, 0x06, 0xca, 0x27,
- 0x3a, 0xeb, 0x97, 0x13, 0xf6, 0xd3, 0x7f, 0xc2, 0x00, 0x8d, 0x3b, 0x31, 0x3d, 0xaf, 0xd3, 0x34,
- 0xdf, 0x91, 0x46, 0xb3, 0x20, 0x9d, 0x98, 0x6d, 0xd9, 0x84, 0x3e, 0x4d, 0xfb, 0x76, 0x16, 0xae,
- 0x6c, 0x50, 0x26, 0x37, 0x91, 0x35, 0xda, 0xb7, 0x9c, 0x43, 0xbe, 0xf7, 0x22, 0xfd, 0x06, 0x79,
- 0x05, 0xc0, 0xf4, 0xf6, 0x9a, 0x07, 0x06, 0xf7, 0x21, 0xd5, 0x27, 0xbc, 0xa6, 0x46, 0x0c, 0x36,
- 0x9b, 0x75, 0x45, 0x79, 0x18, 0x7b, 0xc2, 0x88, 0x4c, 0xe8, 0x6d, 0x65, 0x4f, 0xf0, 0xb6, 0x9a,
- 0x00, 0xfd, 0x70, 0x07, 0xcf, 0x09, 0xce, 0x5f, 0xf4, 0xd5, 0x9c, 0x65, 0xf3, 0x8e, 0xc0, 0x4c,
- 0xb2, 0xa7, 0xfe, 0x75, 0x0e, 0x16, 0x36, 0x28, 0x0b, 0x9c, 0x49, 0xe5, 0x2c, 0x37, 0xfb, 0xd4,
- 0xe0, 0xa3, 0xf2, 0x5e, 0x06, 0x8a, 0x96, 0xbe, 0x47, 0x2d, 0x4f, 0x2c, 0x81, 0xca, 0xf2, 0x5b,
- 0x63, 0xcf, 0xc9, 0xd1, 0x5a, 0x6a, 0x5b, 0x42, 0x43, 0x62, 0x96, 0xca, 0x46, 0x54, 0xea, 0xc9,
- 0x17, 0xa0, 0x62, 0x58, 0x03, 0x8f, 0x51, 0xb7, 0xe1, 0xb8, 0x4c, 0x6d, 0xa7, 0x41, 0xba, 0x6d,
- 0x35, 0x24, 0x61, 0x94, 0x8f, 0x2c, 0x03, 0x18, 0x96, 0x49, 0x6d, 0x26, 0xa4, 0xe4, 0xdc, 0x20,
- 0xfe, 0x78, 0xaf, 0x06, 0x14, 0x8c, 0x70, 0x71, 0x55, 0x3d, 0xc7, 0x36, 0x99, 0x23, 0x55, 0xe5,
- 0xe3, 0xaa, 0xb6, 0x43, 0x12, 0x46, 0xf9, 0x84, 0x18, 0x65, 0xae, 0x69, 0x78, 0x42, 0xac, 0x90,
- 0x10, 0x0b, 0x49, 0x18, 0xe5, 0xe3, 0xcb, 0x2f, 0xf2, 0xfe, 0x67, 0x5a, 0x7e, 0x7f, 0x53, 0x82,
- 0xc5, 0xd8, 0xb0, 0x32, 0x9d, 0xd1, 0xf6, 0xc0, 0x6a, 0x52, 0xe6, 0x7f, 0xc0, 0x2f, 0x40, 0x45,
- 0xa5, 0xa9, 0xee, 0x84, 0xa6, 0x29, 0xe8, 0x54, 0x33, 0x24, 0x61, 0x94, 0x8f, 0xfc, 0x6e, 0xf8,
- 0xdd, 0x65, 0x46, 0xd6, 0x38, 0x9f, 0xef, 0x3e, 0xd4, 0xc1, 0x53, 0x7d, 0xfb, 0x25, 0x28, 0xdb,
- 0x3a, 0xf3, 0xc4, 0x42, 0x52, 0x6b, 0x26, 0x70, 0x96, 0xef, 0xf8, 0x04, 0x0c, 0x79, 0x48, 0x03,
- 0x9e, 0x56, 0x43, 0x7c, 0xf3, 0x41, 0xdf, 0x71, 0x19, 0x75, 0xa5, 0x6c, 0x5e, 0xc8, 0x3e, 0xab,
- 0x64, 0x9f, 0xde, 0x4e, 0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0x97, 0x0c, 0x11, 0x7c, 0x21, 0xb5,
- 0x1c, 0xbd, 0xe5, 0x03, 0x16, 0x04, 0x60, 0xe0, 0x19, 0xae, 0x0e, 0xb3, 0x60, 0x9a, 0x5c, 0x72,
- 0x36, 0x17, 0xc7, 0x9a, 0xcd, 0x53, 0xe3, 0xcc, 0xe6, 0xd2, 0x78, 0xb3, 0xb9, 0x7c, 0xba, 0xd9,
- 0xcc, 0x47, 0x9e, 0xcf, 0x23, 0xea, 0xae, 0x0c, 0xd8, 0xbe, 0xcc, 0x01, 0x88, 0x89, 0x07, 0xf1,
- 0x91, 0x6f, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0xd9, 0x83, 0x05, 0xd9, 0x7e, 0xd3, 0x36, 0xdc, 0xc3,
- 0x3e, 0x37, 0xf7, 0x11, 0xdc, 0x8a, 0xc0, 0xd5, 0x14, 0xee, 0x42, 0x73, 0x24, 0x27, 0x9e, 0x80,
- 0x42, 0x7e, 0x05, 0x66, 0xe4, 0x57, 0xda, 0xd6, 0xfb, 0x02, 0x76, 0x5a, 0xc0, 0x5e, 0x56, 0xb0,
- 0x33, 0xab, 0x51, 0x22, 0xc6, 0x79, 0xc9, 0x0a, 0xcc, 0xf5, 0x0f, 0x0c, 0xfe, 0x73, 0xb3, 0x7d,
- 0x87, 0xd2, 0x16, 0x6d, 0xcd, 0xcf, 0x08, 0xf1, 0x67, 0xfc, 0xc8, 0xac, 0x11, 0x27, 0x63, 0x92,
- 0x9f, 0xdc, 0x80, 0x69, 0x8f, 0xe9, 0x2e, 0x53, 0x51, 0xf7, 0xfc, 0xac, 0x90, 0x0f, 0x42, 0xdc,
- 0x66, 0x84, 0x86, 0x31, 0xce, 0x49, 0xac, 0xc7, 0x43, 0xb9, 0x19, 0x8a, 0xb4, 0x45, 0xc2, 0xec,
- 0xbf, 0x9b, 0x34, 0xfb, 0x6f, 0x4e, 0xb2, 0xfc, 0x53, 0x34, 0x9c, 0x6a, 0xd9, 0xdf, 0x02, 0xe2,
- 0xaa, 0x24, 0x8b, 0x74, 0xff, 0x23, 0x96, 0x3f, 0x48, 0xcc, 0xe3, 0x10, 0x07, 0xa6, 0x48, 0x91,
- 0x26, 0x5c, 0xf6, 0xa8, 0xcd, 0x4c, 0x9b, 0x5a, 0x71, 0x38, 0xb9, 0x25, 0x3c, 0xa7, 0xe0, 0x2e,
- 0x37, 0xd3, 0x98, 0x30, 0x5d, 0x76, 0x92, 0xc1, 0xff, 0x51, 0x59, 0xec, 0xbb, 0x72, 0x68, 0xce,
- 0xcd, 0x6c, 0xbf, 0x97, 0x34, 0xdb, 0x6f, 0x4d, 0xfe, 0xdd, 0xc6, 0x33, 0xd9, 0xcb, 0x00, 0xe2,
- 0x2b, 0x44, 0x6d, 0x76, 0x60, 0xa9, 0x30, 0xa0, 0x60, 0x84, 0x8b, 0xaf, 0x42, 0x7f, 0x9c, 0xa3,
- 0xe6, 0x3a, 0x58, 0x85, 0xcd, 0x28, 0x11, 0xe3, 0xbc, 0x23, 0x4d, 0x7e, 0x61, 0x6c, 0x93, 0x7f,
- 0x0b, 0x48, 0x2c, 0xf8, 0x94, 0x78, 0xc5, 0x78, 0x5d, 0x68, 0x73, 0x88, 0x03, 0x53, 0xa4, 0x46,
- 0x4c, 0xe5, 0xa9, 0xf3, 0x9d, 0xca, 0xa5, 0xf1, 0xa7, 0x32, 0x79, 0x0b, 0xae, 0x0a, 0x55, 0x6a,
- 0x7c, 0xe2, 0xc0, 0xd2, 0xf8, 0xff, 0x8c, 0x02, 0xbe, 0x8a, 0xa3, 0x18, 0x71, 0x34, 0x06, 0xff,
- 0x3e, 0x86, 0x4b, 0x5b, 0x5c, 0xb9, 0x6e, 0x8d, 0xde, 0x18, 0x56, 0x53, 0x78, 0x30, 0x55, 0x92,
- 0x4f, 0x31, 0xc6, 0xa7, 0xa1, 0xbe, 0x67, 0xd1, 0x96, 0xd8, 0x08, 0x4a, 0xe1, 0x14, 0xdb, 0xd9,
- 0x6a, 0x2a, 0x0a, 0x46, 0xb8, 0xd2, 0x6c, 0xf5, 0xf4, 0x19, 0x6d, 0xf5, 0x86, 0xc8, 0xd4, 0xb4,
- 0x63, 0x5b, 0x82, 0x32, 0xf8, 0x41, 0xa5, 0x73, 0x35, 0xc9, 0x80, 0xc3, 0x32, 0x62, 0xab, 0x34,
- 0x5c, 0xb3, 0xcf, 0xbc, 0x38, 0xd6, 0x6c, 0x62, 0xab, 0x4c, 0xe1, 0xc1, 0x54, 0x49, 0xee, 0xa4,
- 0xec, 0x53, 0xdd, 0x62, 0xfb, 0x71, 0xc0, 0xb9, 0xb8, 0x93, 0xf2, 0xea, 0x30, 0x0b, 0xa6, 0xc9,
- 0x4d, 0x62, 0xde, 0xbe, 0x95, 0x85, 0x4b, 0x1b, 0x54, 0x55, 0x30, 0x1b, 0x4e, 0xcb, 0xb7, 0x6b,
- 0xff, 0x4f, 0xa3, 0xac, 0x77, 0xb3, 0x30, 0xb5, 0xe1, 0x3a, 0x83, 0x7e, 0xfd, 0x90, 0x74, 0xa0,
- 0x78, 0x5f, 0xa4, 0x31, 0x54, 0xf2, 0x62, 0xfc, 0x62, 0xad, 0xcc, 0x86, 0x84, 0x26, 0x58, 0x3e,
- 0xa3, 0x82, 0xe7, 0x23, 0xd5, 0xa5, 0x87, 0xb4, 0x25, 0x46, 0xaa, 0x14, 0x8e, 0xd4, 0x6d, 0xde,
- 0x88, 0x92, 0x46, 0xde, 0x86, 0x29, 0x8f, 0x39, 0xae, 0x6f, 0xa4, 0x27, 0x49, 0x43, 0x35, 0xea,
- 0x5f, 0x6d, 0x4a, 0x28, 0x19, 0x7d, 0xab, 0x07, 0xf4, 0x15, 0x68, 0xdf, 0xcf, 0x00, 0xbc, 0xba,
- 0xb3, 0xd3, 0x50, 0x89, 0x82, 0x16, 0xe4, 0xf5, 0x41, 0x90, 0xc3, 0x59, 0x1f, 0x3f, 0x57, 0x1b,
- 0xad, 0x4d, 0xa9, 0xa4, 0xca, 0x80, 0xed, 0xa3, 0x40, 0x27, 0x3f, 0x0b, 0x53, 0x6a, 0x87, 0x54,
- 0xe3, 0x10, 0x94, 0x05, 0xd5, 0x2e, 0x8a, 0x3e, 0x5d, 0xfb, 0x71, 0x16, 0xae, 0x6c, 0xda, 0x8c,
- 0xba, 0x4d, 0x46, 0xfb, 0xb1, 0xda, 0x11, 0xf9, 0x8d, 0xa1, 0x43, 0x31, 0xbf, 0x70, 0xba, 0xcc,
- 0x85, 0x3c, 0x53, 0xb1, 0x4d, 0x99, 0x1e, 0xda, 0xa6, 0xb0, 0x2d, 0x72, 0x12, 0x66, 0x00, 0x79,
- 0xaf, 0x4f, 0x0d, 0x95, 0x17, 0x69, 0x8e, 0x3d, 0x1a, 0xe9, 0x2f, 0xc0, 0xd7, 0x5f, 0x98, 0x91,
- 0x12, 0xab, 0x51, 0xa8, 0x23, 0xdf, 0x84, 0xa2, 0xc7, 0x74, 0x36, 0xf0, 0xb3, 0x9f, 0xbb, 0xe7,
- 0xad, 0x58, 0x80, 0x87, 0x73, 0x54, 0x3e, 0xa3, 0x52, 0xaa, 0xfd, 0x38, 0x03, 0x0b, 0xe9, 0x82,
- 0x5b, 0xa6, 0xc7, 0xc8, 0xaf, 0x0d, 0x0d, 0xfb, 0x29, 0x13, 0x46, 0x5c, 0x5a, 0x0c, 0xfa, 0x05,
- 0xa5, 0xb8, 0xe4, 0xb7, 0x44, 0x86, 0x9c, 0x41, 0xc1, 0x64, 0xb4, 0xe7, 0xfb, 0x4a, 0xaf, 0x9d,
- 0xf3, 0xab, 0x47, 0x6c, 0x13, 0xd7, 0x82, 0x52, 0x99, 0xf6, 0x7e, 0x76, 0xd4, 0x2b, 0xf3, 0xcf,
- 0x42, 0xac, 0x78, 0x7d, 0xf2, 0xf6, 0x64, 0xf5, 0xc9, 0x78, 0x87, 0x86, 0xcb, 0x94, 0xbf, 0x39,
- 0x5c, 0xa6, 0x7c, 0x6d, 0xf2, 0x32, 0x65, 0x62, 0x18, 0x46, 0x56, 0x2b, 0xbf, 0x95, 0x83, 0x67,
- 0x4f, 0x9a, 0x36, 0xdc, 0x56, 0xaa, 0xd9, 0x39, 0xa9, 0xad, 0x3c, 0x79, 0x1e, 0x92, 0x65, 0x28,
- 0xf4, 0xf7, 0x75, 0xcf, 0xdf, 0x55, 0xfc, 0xcd, 0xb7, 0xd0, 0xe0, 0x8d, 0x0f, 0x8f, 0xaa, 0x15,
+ // 5158 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x5d, 0x6c, 0x24, 0x57,
+ 0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x3d, 0x3f, 0x77, 0x32, 0x13, 0x8f, 0x37, 0x71, 0x0f, 0xb5,
+ 0x4a, 0x34, 0xc0, 0x6e, 0x9b, 0x98, 0x2c, 0x3b, 0x0b, 0xec, 0x26, 0x6e, 0x7b, 0xec, 0x78, 0xc6,
+ 0x9e, 0xf4, 0x9e, 0xb6, 0x67, 0xb2, 0x09, 0x6c, 0x28, 0x57, 0xdf, 0x6e, 0x57, 0xba, 0xba, 0xaa,
+ 0xb7, 0xea, 0xb6, 0x67, 0x1c, 0xb1, 0x02, 0x29, 0x0f, 0x09, 0x62, 0xd1, 0x82, 0x56, 0x48, 0x2b,
+ 0xad, 0x76, 0xc5, 0x03, 0x12, 0x02, 0xb1, 0x12, 0x2f, 0x48, 0x08, 0x5e, 0x78, 0x42, 0x81, 0x07,
+ 0xc8, 0x03, 0x12, 0x41, 0x5a, 0xb5, 0x88, 0x91, 0x78, 0x44, 0x8b, 0xf6, 0x6d, 0x84, 0x04, 0xba,
+ 0x3f, 0xf5, 0xdb, 0xd5, 0x1e, 0xbb, 0xdb, 0x93, 0x9d, 0x08, 0xde, 0xba, 0xee, 0x39, 0xe7, 0x3b,
+ 0xb7, 0x6e, 0xdd, 0x7b, 0xee, 0xf9, 0xb9, 0xb7, 0x61, 0xa3, 0x63, 0xb2, 0xfd, 0xc1, 0x5e, 0xcd,
+ 0x70, 0x7a, 0x4b, 0xf6, 0xa0, 0xa7, 0xf7, 0x5d, 0xe7, 0x6d, 0xf1, 0xa3, 0x6d, 0x39, 0xf7, 0x97,
+ 0xfa, 0xdd, 0xce, 0x92, 0xde, 0x37, 0xbd, 0xb0, 0xe5, 0xe0, 0x45, 0xdd, 0xea, 0xef, 0xeb, 0x2f,
+ 0x2e, 0x75, 0xa8, 0x4d, 0x5d, 0x9d, 0xd1, 0x56, 0xad, 0xef, 0x3a, 0xcc, 0x21, 0x5f, 0x0c, 0x81,
+ 0x6a, 0x3e, 0x50, 0xcd, 0x17, 0xab, 0xf5, 0xbb, 0x9d, 0x1a, 0x07, 0x0a, 0x5b, 0x7c, 0xa0, 0x85,
+ 0xcf, 0x47, 0x7a, 0xd0, 0x71, 0x3a, 0xce, 0x92, 0xc0, 0xdb, 0x1b, 0xb4, 0xc5, 0x93, 0x78, 0x10,
+ 0xbf, 0xa4, 0x9e, 0x05, 0xad, 0x7b, 0xc3, 0xab, 0x99, 0x0e, 0xef, 0xd6, 0x92, 0xe1, 0xb8, 0x74,
+ 0xe9, 0x60, 0xa4, 0x2f, 0x0b, 0x2f, 0x85, 0x3c, 0x3d, 0xdd, 0xd8, 0x37, 0x6d, 0xea, 0x1e, 0xfa,
+ 0xef, 0xb2, 0xe4, 0x52, 0xcf, 0x19, 0xb8, 0x06, 0x3d, 0x95, 0x94, 0xb7, 0xd4, 0xa3, 0x4c, 0x4f,
+ 0xd3, 0xb5, 0x34, 0x4e, 0xca, 0x1d, 0xd8, 0xcc, 0xec, 0x8d, 0xaa, 0xf9, 0xa5, 0x47, 0x09, 0x78,
+ 0xc6, 0x3e, 0xed, 0xe9, 0x49, 0x39, 0xed, 0x3b, 0x33, 0x70, 0x69, 0x65, 0xcf, 0x63, 0xae, 0x6e,
+ 0xb0, 0x86, 0xd3, 0xda, 0xa1, 0xbd, 0xbe, 0xa5, 0x33, 0x4a, 0xba, 0x50, 0xe2, 0x7d, 0x6b, 0xe9,
+ 0x4c, 0x9f, 0xcf, 0x5c, 0xcb, 0x5c, 0xaf, 0x2c, 0xaf, 0xd4, 0x26, 0xfc, 0x16, 0xb5, 0x6d, 0x05,
+ 0x54, 0x9f, 0x3d, 0x1a, 0x56, 0x4b, 0xfe, 0x13, 0x06, 0x0a, 0xc8, 0x77, 0x33, 0x30, 0x6b, 0x3b,
+ 0x2d, 0xda, 0xa4, 0x16, 0x35, 0x98, 0xe3, 0xce, 0x67, 0xaf, 0xe5, 0xae, 0x57, 0x96, 0xbf, 0x3e,
+ 0xb1, 0xc6, 0x94, 0x37, 0xaa, 0xdd, 0x89, 0x28, 0xb8, 0x69, 0x33, 0xf7, 0xb0, 0xfe, 0xf4, 0x07,
+ 0xc3, 0xea, 0x53, 0x47, 0xc3, 0xea, 0x6c, 0x94, 0x84, 0xb1, 0x9e, 0x90, 0x5d, 0xa8, 0x30, 0xc7,
+ 0xe2, 0x43, 0x66, 0x3a, 0xb6, 0x37, 0x9f, 0x13, 0x1d, 0x5b, 0xac, 0xc9, 0xd1, 0xe6, 0xea, 0x6b,
+ 0x7c, 0xba, 0xd4, 0x0e, 0x5e, 0xac, 0xed, 0x04, 0x6c, 0xf5, 0x4b, 0x0a, 0xb8, 0x12, 0xb6, 0x79,
+ 0x18, 0xc5, 0x21, 0x14, 0xce, 0x7b, 0xd4, 0x18, 0xb8, 0x26, 0x3b, 0x5c, 0x75, 0x6c, 0x46, 0x1f,
+ 0xb0, 0xf9, 0xbc, 0x18, 0xe5, 0x17, 0xd2, 0xa0, 0x1b, 0x4e, 0xab, 0x19, 0xe7, 0xae, 0x5f, 0x3a,
+ 0x1a, 0x56, 0xcf, 0x27, 0x1a, 0x31, 0x89, 0x49, 0x6c, 0xb8, 0x60, 0xf6, 0xf4, 0x0e, 0x6d, 0x0c,
+ 0x2c, 0xab, 0x49, 0x0d, 0x97, 0x32, 0x6f, 0xbe, 0x20, 0x5e, 0xe1, 0x7a, 0x9a, 0x9e, 0x2d, 0xc7,
+ 0xd0, 0xad, 0xd7, 0xf6, 0xde, 0xa6, 0x06, 0x43, 0xda, 0xa6, 0x2e, 0xb5, 0x0d, 0x5a, 0x9f, 0x57,
+ 0x2f, 0x73, 0x61, 0x33, 0x81, 0x84, 0x23, 0xd8, 0x64, 0x03, 0x2e, 0xf6, 0x5d, 0xd3, 0x11, 0x5d,
+ 0xb0, 0x74, 0xcf, 0xbb, 0xa3, 0xf7, 0xe8, 0x7c, 0xf1, 0x5a, 0xe6, 0x7a, 0xb9, 0x7e, 0x55, 0xc1,
+ 0x5c, 0x6c, 0x24, 0x19, 0x70, 0x54, 0x86, 0x5c, 0x87, 0x92, 0xdf, 0x38, 0x3f, 0x73, 0x2d, 0x73,
+ 0xbd, 0x20, 0xe7, 0x8e, 0x2f, 0x8b, 0x01, 0x95, 0xac, 0x43, 0x49, 0x6f, 0xb7, 0x4d, 0x9b, 0x73,
+ 0x96, 0xc4, 0x10, 0x3e, 0x9b, 0xf6, 0x6a, 0x2b, 0x8a, 0x47, 0xe2, 0xf8, 0x4f, 0x18, 0xc8, 0x92,
+ 0x5b, 0x40, 0x3c, 0xea, 0x1e, 0x98, 0x06, 0x5d, 0x31, 0x0c, 0x67, 0x60, 0x33, 0xd1, 0xf7, 0xb2,
+ 0xe8, 0xfb, 0x82, 0xea, 0x3b, 0x69, 0x8e, 0x70, 0x60, 0x8a, 0xd4, 0xc2, 0xcb, 0x70, 0x71, 0x64,
+ 0xb6, 0x91, 0x0b, 0x90, 0xeb, 0xd2, 0x43, 0xb1, 0x98, 0xca, 0xc8, 0x7f, 0x92, 0xa7, 0xa1, 0x70,
+ 0xa0, 0x5b, 0x03, 0x3a, 0x9f, 0x15, 0x6d, 0xf2, 0xe1, 0x97, 0xb3, 0x37, 0x32, 0xda, 0x1f, 0x94,
+ 0xe1, 0x9c, 0x3f, 0x87, 0xef, 0x52, 0x97, 0xd1, 0x07, 0xe4, 0x1a, 0xe4, 0x6d, 0xde, 0x23, 0x21,
+ 0x5f, 0x9f, 0x55, 0x3d, 0xca, 0x8b, 0x3e, 0x08, 0x0a, 0x31, 0xa0, 0x28, 0x6d, 0x90, 0xc0, 0xab,
+ 0x2c, 0xbf, 0x3c, 0xf1, 0xf2, 0x69, 0x0a, 0x98, 0x3a, 0x1c, 0x0d, 0xab, 0x45, 0xf9, 0x1b, 0x15,
+ 0x34, 0x79, 0x13, 0xf2, 0x9e, 0x69, 0x77, 0xe7, 0x73, 0x42, 0xc5, 0x97, 0x27, 0x57, 0x61, 0xda,
+ 0xdd, 0x7a, 0x89, 0xbf, 0x01, 0xff, 0x85, 0x02, 0x94, 0xdc, 0x83, 0xdc, 0xa0, 0xd5, 0x56, 0x2b,
+ 0xe1, 0x57, 0x27, 0xc6, 0xde, 0x5d, 0x5b, 0xaf, 0xcf, 0x1c, 0x0d, 0xab, 0xb9, 0xdd, 0xb5, 0x75,
+ 0xe4, 0x88, 0xe4, 0xdb, 0x19, 0xb8, 0x68, 0x38, 0x36, 0xd3, 0xb9, 0x5d, 0xf4, 0x2d, 0xc2, 0x7c,
+ 0x41, 0xe8, 0xb9, 0x35, 0xb1, 0x9e, 0xd5, 0x24, 0x62, 0xfd, 0x32, 0x9f, 0xe0, 0x23, 0xcd, 0x38,
+ 0xaa, 0x9b, 0x7c, 0x2f, 0x03, 0x97, 0xf9, 0xc4, 0x1b, 0x61, 0x16, 0xcb, 0xe5, 0x6c, 0x7b, 0x75,
+ 0xf5, 0x68, 0x58, 0xbd, 0xbc, 0x99, 0xa6, 0x0c, 0xd3, 0xfb, 0xc0, 0x7b, 0x77, 0x49, 0x1f, 0xb5,
+ 0xa1, 0x62, 0x29, 0x56, 0x96, 0xb7, 0xce, 0xd2, 0x2e, 0xd7, 0x3f, 0xa3, 0xa6, 0x72, 0xda, 0x36,
+ 0x84, 0x69, 0xbd, 0x20, 0x37, 0x61, 0xe6, 0xc0, 0xb1, 0x06, 0x3d, 0xea, 0xcd, 0x97, 0x84, 0x31,
+ 0x5b, 0x48, 0x5b, 0xf1, 0x77, 0x05, 0x4b, 0xfd, 0xbc, 0x82, 0x9f, 0x91, 0xcf, 0x1e, 0xfa, 0xb2,
+ 0xc4, 0x84, 0xa2, 0x65, 0xf6, 0x4c, 0xe6, 0x89, 0x55, 0x5e, 0x59, 0xbe, 0x39, 0xf1, 0x6b, 0xc9,
+ 0x25, 0xba, 0x25, 0xc0, 0xe4, 0xaa, 0x91, 0xbf, 0x51, 0x29, 0x20, 0x06, 0x14, 0x3c, 0x43, 0xb7,
+ 0xe8, 0x3c, 0x08, 0x4d, 0x5f, 0x99, 0x7c, 0xd9, 0x70, 0x94, 0xfa, 0x9c, 0x7a, 0xa7, 0x82, 0x78,
+ 0x44, 0x89, 0x4d, 0x7e, 0x1d, 0xce, 0xc5, 0xbe, 0xa6, 0x37, 0x5f, 0x11, 0xa3, 0xf3, 0x5c, 0xda,
+ 0xe8, 0x04, 0x5c, 0xf5, 0x2b, 0x0a, 0xec, 0x5c, 0x6c, 0x86, 0x78, 0x98, 0x00, 0xd3, 0xee, 0xc1,
+ 0xdc, 0xca, 0x80, 0xed, 0x3b, 0xae, 0xf9, 0x8e, 0xd8, 0xc4, 0xc8, 0x3a, 0x14, 0x98, 0xd3, 0xa5,
+ 0xb6, 0xf2, 0x0f, 0x9e, 0x4f, 0x53, 0x23, 0x37, 0x86, 0xdb, 0xf4, 0xd0, 0xb7, 0x85, 0xf5, 0x32,
+ 0xef, 0xf7, 0x0e, 0x97, 0x43, 0x29, 0xae, 0xbd, 0x01, 0xc5, 0xfa, 0xa0, 0xdd, 0xa6, 0xee, 0x09,
+ 0x6c, 0x5c, 0x0d, 0xf2, 0xec, 0xb0, 0xaf, 0x2c, 0x66, 0x60, 0x97, 0xf3, 0x3b, 0x87, 0x7d, 0xfa,
+ 0x70, 0x58, 0x05, 0x89, 0xc3, 0x9f, 0x50, 0xf0, 0x69, 0x3f, 0xc9, 0xc0, 0x25, 0xd9, 0xa8, 0x4c,
+ 0xf7, 0xaa, 0x63, 0xb7, 0xcd, 0x0e, 0xa1, 0x50, 0x70, 0x69, 0xcb, 0xf4, 0x54, 0xdf, 0xd7, 0x26,
+ 0xfe, 0x20, 0xc8, 0x51, 0x24, 0xa8, 0x7c, 0x35, 0xd1, 0x80, 0x12, 0x9d, 0x0c, 0xa0, 0xfc, 0x36,
+ 0x65, 0x1e, 0x73, 0xa9, 0xde, 0x53, 0x56, 0xf9, 0xd5, 0x89, 0x55, 0xdd, 0xa2, 0xac, 0x29, 0x90,
+ 0x94, 0xba, 0xb9, 0xa3, 0x61, 0xb5, 0x1c, 0x34, 0x62, 0xa8, 0x49, 0xfb, 0x8f, 0x2c, 0x94, 0x83,
+ 0x2f, 0x47, 0x3e, 0x0b, 0x05, 0xb1, 0x51, 0xab, 0x61, 0x0d, 0x26, 0x8f, 0xd8, 0xcf, 0x51, 0xd2,
+ 0xc8, 0xf3, 0x30, 0x63, 0x38, 0xbd, 0x9e, 0x6e, 0xb7, 0x84, 0xf3, 0x55, 0xae, 0x57, 0xf8, 0x9a,
+ 0x59, 0x95, 0x4d, 0xe8, 0xd3, 0xc8, 0xb3, 0x90, 0xd7, 0xdd, 0x8e, 0xf4, 0x83, 0xca, 0xd2, 0x7e,
+ 0xaf, 0xb8, 0x1d, 0x0f, 0x45, 0x2b, 0xf9, 0x12, 0xe4, 0xa8, 0x7d, 0x30, 0x9f, 0x1f, 0xbf, 0x28,
+ 0x6f, 0xda, 0x07, 0x77, 0x75, 0xb7, 0x5e, 0x51, 0x7d, 0xc8, 0xdd, 0xb4, 0x0f, 0x90, 0xcb, 0x90,
+ 0xaf, 0xc1, 0xac, 0x5c, 0x97, 0xdb, 0x7c, 0x17, 0xf5, 0xbd, 0x94, 0xea, 0xf8, 0x85, 0x2d, 0xf8,
+ 0x42, 0x17, 0x2e, 0xd2, 0xe8, 0x61, 0x0c, 0x8a, 0x7c, 0x0d, 0xca, 0xbe, 0x77, 0xee, 0x29, 0xeb,
+ 0x9a, 0xea, 0xfd, 0xa0, 0x62, 0x42, 0xfa, 0x8d, 0x81, 0xe9, 0xd2, 0x1e, 0xb5, 0x99, 0x57, 0xbf,
+ 0xa8, 0x14, 0x94, 0x7d, 0xaa, 0x87, 0x21, 0x9a, 0xf6, 0x5f, 0x59, 0x18, 0x35, 0xf7, 0x71, 0x85,
+ 0x99, 0xb3, 0x54, 0x48, 0xf6, 0xe0, 0x7c, 0xe0, 0x74, 0x35, 0x1c, 0xcb, 0x34, 0x0e, 0xd5, 0x52,
+ 0xb8, 0xa1, 0xc4, 0xce, 0x6f, 0xc6, 0xc9, 0x0f, 0x87, 0xd5, 0xe7, 0x46, 0x63, 0x9b, 0x5a, 0xc8,
+ 0x80, 0x49, 0x40, 0xae, 0x23, 0xe9, 0x9b, 0xca, 0xdd, 0xfe, 0xb3, 0x63, 0x56, 0xf8, 0x04, 0x8e,
+ 0xe9, 0xe4, 0x33, 0x45, 0x7b, 0x3f, 0x0f, 0xe7, 0xd6, 0x74, 0xda, 0x73, 0xec, 0x47, 0x6e, 0x57,
+ 0x99, 0x27, 0x62, 0xbb, 0xba, 0x0e, 0x25, 0x97, 0xf6, 0x2d, 0xd3, 0xd0, 0x3d, 0xf1, 0xb1, 0x94,
+ 0x2f, 0x8b, 0xaa, 0x0d, 0x03, 0xea, 0x18, 0x37, 0x25, 0xf7, 0x44, 0xba, 0x29, 0xf9, 0x9f, 0xbe,
+ 0x9b, 0xa2, 0xfd, 0x28, 0x0b, 0xf9, 0x9b, 0xad, 0x0e, 0xe5, 0x1b, 0x47, 0xdb, 0x75, 0x7a, 0xc9,
+ 0x8d, 0x63, 0xdd, 0x75, 0x7a, 0x28, 0x28, 0x64, 0x01, 0xb2, 0xcc, 0x51, 0x6b, 0x05, 0x14, 0x3d,
+ 0xbb, 0xe3, 0x60, 0x96, 0x39, 0xe4, 0x1d, 0x00, 0xc3, 0xb1, 0x5b, 0xa6, 0x1f, 0xe2, 0x4d, 0xf7,
+ 0x62, 0xeb, 0x8e, 0x7b, 0x5f, 0x77, 0x5b, 0xab, 0x01, 0x62, 0xfd, 0xdc, 0xd1, 0xb0, 0x0a, 0xe1,
+ 0x33, 0x46, 0xb4, 0x91, 0x4e, 0xe0, 0x84, 0xc8, 0x01, 0x5d, 0x9d, 0x58, 0x2f, 0x1f, 0x88, 0x63,
+ 0x5c, 0x90, 0x17, 0xa1, 0xd2, 0xd7, 0x5d, 0xdd, 0xb2, 0xa8, 0x65, 0x7a, 0x3d, 0xe1, 0xfb, 0x16,
+ 0xea, 0xe7, 0x79, 0x90, 0xda, 0x08, 0x9b, 0x31, 0xca, 0xa3, 0xfd, 0x5e, 0x06, 0x20, 0x44, 0x25,
+ 0x5f, 0x86, 0xf3, 0x7b, 0x62, 0x2b, 0xdd, 0xd6, 0x1f, 0x6c, 0x51, 0xbb, 0xc3, 0xf6, 0xc5, 0x78,
+ 0xe7, 0xe5, 0x92, 0xaf, 0xc7, 0x49, 0x98, 0xe4, 0x25, 0xaf, 0xc0, 0x05, 0xd9, 0xb4, 0xeb, 0xe9,
+ 0x0a, 0x53, 0x7c, 0x8f, 0xb9, 0xfa, 0xd3, 0x3c, 0xba, 0xac, 0x27, 0x68, 0x38, 0xc2, 0xad, 0xe9,
+ 0x50, 0x59, 0x37, 0x1f, 0xd0, 0xd6, 0x3d, 0xd3, 0x6e, 0x39, 0xf7, 0x09, 0x42, 0xd1, 0x0a, 0xbb,
+ 0x51, 0x59, 0xae, 0x45, 0xcc, 0x48, 0x90, 0x03, 0x09, 0x47, 0xac, 0x47, 0x99, 0xce, 0x0d, 0xcb,
+ 0xda, 0x40, 0x45, 0xe9, 0x72, 0x94, 0x64, 0x6f, 0x15, 0x92, 0xf6, 0x12, 0x5c, 0x1c, 0xf9, 0x7e,
+ 0xa4, 0x0a, 0x85, 0x2e, 0x3d, 0xdc, 0xe4, 0x8e, 0x0e, 0xdf, 0xf5, 0xc4, 0x36, 0x7f, 0x9b, 0x37,
+ 0xa0, 0x6c, 0xd7, 0xfe, 0x3b, 0x03, 0xa5, 0xf5, 0x81, 0x6d, 0x08, 0xb7, 0xe8, 0xd1, 0x4e, 0x8c,
+ 0xbf, 0x89, 0x66, 0x53, 0x37, 0xd1, 0x01, 0x14, 0xbb, 0xf7, 0x83, 0x4d, 0xb6, 0xb2, 0xbc, 0x3d,
+ 0xf9, 0x4c, 0x54, 0x5d, 0xaa, 0xdd, 0x16, 0x78, 0x32, 0xe9, 0x71, 0x4e, 0x75, 0xa8, 0x78, 0xfb,
+ 0x9e, 0x50, 0xaa, 0x94, 0x2d, 0x7c, 0x09, 0x2a, 0x11, 0xb6, 0x53, 0x45, 0xab, 0x3f, 0xcc, 0xc0,
+ 0xf9, 0x0d, 0x99, 0x57, 0x72, 0x5c, 0x19, 0x2f, 0x92, 0xab, 0x90, 0x73, 0xfb, 0x03, 0x21, 0x9f,
+ 0x93, 0xc1, 0x18, 0x36, 0x76, 0x91, 0xb7, 0x91, 0xd7, 0xa1, 0xd4, 0x52, 0xdf, 0x40, 0xf9, 0x44,
+ 0xa7, 0xfd, 0x72, 0xc2, 0x7e, 0xfa, 0x4f, 0x18, 0xa0, 0x71, 0x27, 0xa6, 0xe7, 0x75, 0x9a, 0xe6,
+ 0x3b, 0xd2, 0x68, 0x16, 0xa4, 0x13, 0xb3, 0x2d, 0x9b, 0xd0, 0xa7, 0x69, 0xdf, 0xce, 0xc2, 0x95,
+ 0x0d, 0xca, 0xe4, 0x26, 0xb2, 0x46, 0xfb, 0x96, 0x73, 0xc8, 0xf7, 0x5e, 0xa4, 0xdf, 0x20, 0xaf,
+ 0x00, 0x98, 0xde, 0x5e, 0xf3, 0xc0, 0xe0, 0x3e, 0xa4, 0xfa, 0x84, 0xd7, 0xd4, 0x88, 0xc1, 0x66,
+ 0xb3, 0xae, 0x28, 0x0f, 0x63, 0x4f, 0x18, 0x91, 0x09, 0xbd, 0xad, 0xec, 0x31, 0xde, 0x56, 0x13,
+ 0xa0, 0x1f, 0xee, 0xe0, 0x39, 0xc1, 0xf9, 0x8b, 0xbe, 0x9a, 0xd3, 0x6c, 0xde, 0x11, 0x98, 0x69,
+ 0xf6, 0xd4, 0xbf, 0xce, 0xc1, 0xc2, 0x06, 0x65, 0x81, 0x33, 0xa9, 0x9c, 0xe5, 0x66, 0x9f, 0x1a,
+ 0x7c, 0x54, 0xde, 0xcb, 0x40, 0xd1, 0xd2, 0xf7, 0xa8, 0xe5, 0x89, 0x25, 0x50, 0x59, 0x7e, 0x6b,
+ 0xe2, 0x39, 0x39, 0x5e, 0x4b, 0x6d, 0x4b, 0x68, 0x48, 0xcc, 0x52, 0xd9, 0x88, 0x4a, 0x3d, 0xf9,
+ 0x02, 0x54, 0x0c, 0x6b, 0xe0, 0x31, 0xea, 0x36, 0x1c, 0x97, 0xa9, 0xed, 0x34, 0x48, 0xb7, 0xad,
+ 0x86, 0x24, 0x8c, 0xf2, 0x91, 0x65, 0x00, 0xc3, 0x32, 0xa9, 0xcd, 0x84, 0x94, 0x9c, 0x1b, 0xc4,
+ 0x1f, 0xef, 0xd5, 0x80, 0x82, 0x11, 0x2e, 0xae, 0xaa, 0xe7, 0xd8, 0x26, 0x73, 0xa4, 0xaa, 0x7c,
+ 0x5c, 0xd5, 0x76, 0x48, 0xc2, 0x28, 0x9f, 0x10, 0xa3, 0xcc, 0x35, 0x0d, 0x4f, 0x88, 0x15, 0x12,
+ 0x62, 0x21, 0x09, 0xa3, 0x7c, 0x7c, 0xf9, 0x45, 0xde, 0xff, 0x54, 0xcb, 0xef, 0x6f, 0x4a, 0xb0,
+ 0x18, 0x1b, 0x56, 0xa6, 0x33, 0xda, 0x1e, 0x58, 0x4d, 0xca, 0xfc, 0x0f, 0xf8, 0x05, 0xa8, 0xa8,
+ 0x34, 0xd5, 0x9d, 0xd0, 0x34, 0x05, 0x9d, 0x6a, 0x86, 0x24, 0x8c, 0xf2, 0x91, 0xdf, 0x0d, 0xbf,
+ 0xbb, 0xcc, 0xc8, 0x1a, 0x67, 0xf3, 0xdd, 0x47, 0x3a, 0x78, 0xa2, 0x6f, 0xbf, 0x04, 0x65, 0x5b,
+ 0x67, 0x9e, 0x58, 0x48, 0x6a, 0xcd, 0x04, 0xce, 0xf2, 0x1d, 0x9f, 0x80, 0x21, 0x0f, 0x69, 0xc0,
+ 0xd3, 0x6a, 0x88, 0x6f, 0x3e, 0xe8, 0x3b, 0x2e, 0xa3, 0xae, 0x94, 0xcd, 0x0b, 0xd9, 0x67, 0x95,
+ 0xec, 0xd3, 0xdb, 0x29, 0x3c, 0x98, 0x2a, 0x49, 0xb6, 0xe1, 0x92, 0x21, 0x82, 0x2f, 0xa4, 0x96,
+ 0xa3, 0xb7, 0x7c, 0xc0, 0x82, 0x00, 0x0c, 0x3c, 0xc3, 0xd5, 0x51, 0x16, 0x4c, 0x93, 0x4b, 0xce,
+ 0xe6, 0xe2, 0x44, 0xb3, 0x79, 0x66, 0x92, 0xd9, 0x5c, 0x9a, 0x6c, 0x36, 0x97, 0x4f, 0x36, 0x9b,
+ 0xf9, 0xc8, 0xf3, 0x79, 0x44, 0xdd, 0x95, 0x01, 0xdb, 0x97, 0x39, 0x00, 0x31, 0xf1, 0x20, 0x3e,
+ 0xf2, 0xcd, 0x14, 0x1e, 0x4c, 0x95, 0x24, 0x7b, 0xb0, 0x20, 0xdb, 0x6f, 0xda, 0x86, 0x7b, 0xd8,
+ 0xe7, 0xe6, 0x3e, 0x82, 0x5b, 0x11, 0xb8, 0x9a, 0xc2, 0x5d, 0x68, 0x8e, 0xe5, 0xc4, 0x63, 0x50,
+ 0xc8, 0xaf, 0xc0, 0x9c, 0xfc, 0x4a, 0xdb, 0x7a, 0x5f, 0xc0, 0xce, 0x0a, 0xd8, 0xcb, 0x0a, 0x76,
+ 0x6e, 0x35, 0x4a, 0xc4, 0x38, 0x2f, 0x59, 0x81, 0xf3, 0xfd, 0x03, 0x83, 0xff, 0xdc, 0x6c, 0xdf,
+ 0xa1, 0xb4, 0x45, 0x5b, 0xf3, 0x73, 0x42, 0xfc, 0x19, 0x3f, 0x32, 0x6b, 0xc4, 0xc9, 0x98, 0xe4,
+ 0x27, 0x37, 0x60, 0xd6, 0x63, 0xba, 0xcb, 0x54, 0xd4, 0x3d, 0x7f, 0x4e, 0xc8, 0x07, 0x21, 0x6e,
+ 0x33, 0x42, 0xc3, 0x18, 0xe7, 0x34, 0xd6, 0xe3, 0xa1, 0xdc, 0x0c, 0x45, 0xda, 0x22, 0x61, 0xf6,
+ 0xdf, 0x4d, 0x9a, 0xfd, 0x37, 0xa7, 0x59, 0xfe, 0x29, 0x1a, 0x4e, 0xb4, 0xec, 0x6f, 0x01, 0x71,
+ 0x55, 0x92, 0x45, 0xba, 0xff, 0x11, 0xcb, 0x1f, 0x24, 0xe6, 0x71, 0x84, 0x03, 0x53, 0xa4, 0x48,
+ 0x13, 0x2e, 0x7b, 0xd4, 0x66, 0xa6, 0x4d, 0xad, 0x38, 0x9c, 0xdc, 0x12, 0x9e, 0x53, 0x70, 0x97,
+ 0x9b, 0x69, 0x4c, 0x98, 0x2e, 0x3b, 0xcd, 0xe0, 0xff, 0xa8, 0x2c, 0xf6, 0x5d, 0x39, 0x34, 0x67,
+ 0x66, 0xb6, 0xdf, 0x4b, 0x9a, 0xed, 0xb7, 0xa6, 0xff, 0x6e, 0x93, 0x99, 0xec, 0x65, 0x00, 0xf1,
+ 0x15, 0xa2, 0x36, 0x3b, 0xb0, 0x54, 0x18, 0x50, 0x30, 0xc2, 0xc5, 0x57, 0xa1, 0x3f, 0xce, 0x51,
+ 0x73, 0x1d, 0xac, 0xc2, 0x66, 0x94, 0x88, 0x71, 0xde, 0xb1, 0x26, 0xbf, 0x30, 0xb1, 0xc9, 0xbf,
+ 0x05, 0x24, 0x16, 0x7c, 0x4a, 0xbc, 0x62, 0xbc, 0x2e, 0xb4, 0x39, 0xc2, 0x81, 0x29, 0x52, 0x63,
+ 0xa6, 0xf2, 0xcc, 0xd9, 0x4e, 0xe5, 0xd2, 0xe4, 0x53, 0x99, 0xbc, 0x05, 0x57, 0x85, 0x2a, 0x35,
+ 0x3e, 0x71, 0x60, 0x69, 0xfc, 0x7f, 0x46, 0x01, 0x5f, 0xc5, 0x71, 0x8c, 0x38, 0x1e, 0x83, 0x7f,
+ 0x1f, 0xc3, 0xa5, 0x2d, 0xae, 0x5c, 0xb7, 0xc6, 0x6f, 0x0c, 0xab, 0x29, 0x3c, 0x98, 0x2a, 0xc9,
+ 0xa7, 0x18, 0xe3, 0xd3, 0x50, 0xdf, 0xb3, 0x68, 0x4b, 0x6c, 0x04, 0xa5, 0x70, 0x8a, 0xed, 0x6c,
+ 0x35, 0x15, 0x05, 0x23, 0x5c, 0x69, 0xb6, 0x7a, 0xf6, 0x94, 0xb6, 0x7a, 0x43, 0x64, 0x6a, 0xda,
+ 0xb1, 0x2d, 0x41, 0x19, 0xfc, 0xa0, 0xd2, 0xb9, 0x9a, 0x64, 0xc0, 0x51, 0x19, 0xb1, 0x55, 0x1a,
+ 0xae, 0xd9, 0x67, 0x5e, 0x1c, 0xeb, 0x5c, 0x62, 0xab, 0x4c, 0xe1, 0xc1, 0x54, 0x49, 0xee, 0xa4,
+ 0xec, 0x53, 0xdd, 0x62, 0xfb, 0x71, 0xc0, 0xf3, 0x71, 0x27, 0xe5, 0xd5, 0x51, 0x16, 0x4c, 0x93,
+ 0x9b, 0xc6, 0xbc, 0x7d, 0x2b, 0x0b, 0x97, 0x36, 0xa8, 0xaa, 0x60, 0x36, 0x9c, 0x96, 0x6f, 0xd7,
+ 0xfe, 0x8f, 0x46, 0x59, 0xef, 0x66, 0x61, 0x66, 0xc3, 0x75, 0x06, 0xfd, 0xfa, 0x21, 0xe9, 0x40,
+ 0xf1, 0xbe, 0x48, 0x63, 0xa8, 0xe4, 0xc5, 0xe4, 0xc5, 0x5a, 0x99, 0x0d, 0x09, 0x4d, 0xb0, 0x7c,
+ 0x46, 0x05, 0xcf, 0x47, 0xaa, 0x4b, 0x0f, 0x69, 0x4b, 0x8c, 0x54, 0x29, 0x1c, 0xa9, 0xdb, 0xbc,
+ 0x11, 0x25, 0x8d, 0xbc, 0x0d, 0x33, 0x1e, 0x73, 0x5c, 0xdf, 0x48, 0x4f, 0x93, 0x86, 0x6a, 0xd4,
+ 0xbf, 0xda, 0x94, 0x50, 0x32, 0xfa, 0x56, 0x0f, 0xe8, 0x2b, 0xd0, 0xbe, 0x9f, 0x01, 0x78, 0x75,
+ 0x67, 0xa7, 0xa1, 0x12, 0x05, 0x2d, 0xc8, 0xeb, 0x83, 0x20, 0x87, 0xb3, 0x3e, 0x79, 0xae, 0x36,
+ 0x5a, 0x9b, 0x52, 0x49, 0x95, 0x01, 0xdb, 0x47, 0x81, 0x4e, 0x7e, 0x16, 0x66, 0xd4, 0x0e, 0xa9,
+ 0xc6, 0x21, 0x28, 0x0b, 0xaa, 0x5d, 0x14, 0x7d, 0xba, 0xf6, 0xe3, 0x2c, 0x5c, 0xd9, 0xb4, 0x19,
+ 0x75, 0x9b, 0x8c, 0xf6, 0x63, 0xb5, 0x23, 0xf2, 0x1b, 0x23, 0x87, 0x62, 0x7e, 0xe1, 0x64, 0x99,
+ 0x0b, 0x79, 0xa6, 0x62, 0x9b, 0x32, 0x3d, 0xb4, 0x4d, 0x61, 0x5b, 0xe4, 0x24, 0xcc, 0x00, 0xf2,
+ 0x5e, 0x9f, 0x1a, 0x2a, 0x2f, 0xd2, 0x9c, 0x78, 0x34, 0xd2, 0x5f, 0x80, 0xaf, 0xbf, 0x30, 0x23,
+ 0x25, 0x56, 0xa3, 0x50, 0x47, 0xbe, 0x09, 0x45, 0x8f, 0xe9, 0x6c, 0xe0, 0x67, 0x3f, 0x77, 0xcf,
+ 0x5a, 0xb1, 0x00, 0x0f, 0xe7, 0xa8, 0x7c, 0x46, 0xa5, 0x54, 0xfb, 0x71, 0x06, 0x16, 0xd2, 0x05,
+ 0xb7, 0x4c, 0x8f, 0x91, 0x5f, 0x1b, 0x19, 0xf6, 0x13, 0x26, 0x8c, 0xb8, 0xb4, 0x18, 0xf4, 0x0b,
+ 0x4a, 0x71, 0xc9, 0x6f, 0x89, 0x0c, 0x39, 0x83, 0x82, 0xc9, 0x68, 0xcf, 0xf7, 0x95, 0x5e, 0x3b,
+ 0xe3, 0x57, 0x8f, 0xd8, 0x26, 0xae, 0x05, 0xa5, 0x32, 0xed, 0xfd, 0xec, 0xb8, 0x57, 0xe6, 0x9f,
+ 0x85, 0x58, 0xf1, 0xfa, 0xe4, 0xed, 0xe9, 0xea, 0x93, 0xf1, 0x0e, 0x8d, 0x96, 0x29, 0x7f, 0x73,
+ 0xb4, 0x4c, 0xf9, 0xda, 0xf4, 0x65, 0xca, 0xc4, 0x30, 0x8c, 0xad, 0x56, 0x7e, 0x2b, 0x07, 0xcf,
+ 0x1e, 0x37, 0x6d, 0xb8, 0xad, 0x54, 0xb3, 0x73, 0x5a, 0x5b, 0x79, 0xfc, 0x3c, 0x24, 0xcb, 0x50,
+ 0xe8, 0xef, 0xeb, 0x9e, 0xbf, 0xab, 0xf8, 0x9b, 0x6f, 0xa1, 0xc1, 0x1b, 0x1f, 0x0e, 0xab, 0x15,
0xb9, 0x1b, 0x89, 0x47, 0x94, 0xac, 0xdc, 0xb2, 0xf4, 0xa8, 0xe7, 0x85, 0xfe, 0x6d, 0x60, 0x59,
- 0xb6, 0x65, 0x33, 0xfa, 0x74, 0xc2, 0xa0, 0x28, 0x63, 0x46, 0x95, 0xeb, 0x1f, 0xbf, 0x30, 0x95,
+ 0xb6, 0x65, 0x33, 0xfa, 0x74, 0xc2, 0xa0, 0x28, 0x63, 0x46, 0x95, 0xeb, 0x9f, 0xbc, 0x30, 0x95,
0x52, 0xd2, 0x0e, 0x5f, 0x4a, 0xa5, 0x1f, 0x94, 0xae, 0xa0, 0x64, 0x5e, 0x48, 0x2f, 0x99, 0x47,
0x36, 0x58, 0x59, 0x32, 0xff, 0xa7, 0x12, 0x5c, 0x49, 0xff, 0x86, 0xfc, 0x5d, 0x0f, 0xa8, 0xeb,
0x99, 0x8e, 0xad, 0x36, 0xed, 0xf0, 0x70, 0x85, 0x6c, 0x46, 0x9f, 0xfe, 0xa9, 0x2e, 0x7a, 0xfd,
- 0x49, 0x86, 0xbb, 0xc1, 0x32, 0x51, 0xf3, 0x49, 0x14, 0xbe, 0x9e, 0x93, 0xee, 0xf4, 0x08, 0x85,
- 0x38, 0xba, 0x2f, 0xe4, 0x8f, 0x33, 0x30, 0xdf, 0x4b, 0xf8, 0xd9, 0x8f, 0xf1, 0x78, 0xd3, 0xb3,
- 0xc7, 0x47, 0xd5, 0xf9, 0xed, 0x11, 0xfa, 0x70, 0x64, 0x4f, 0xc8, 0x6f, 0x41, 0xa5, 0xcf, 0xe7,
- 0x85, 0xc7, 0xa8, 0x6d, 0xf8, 0x27, 0x9c, 0xc6, 0x9f, 0xfd, 0x8d, 0x10, 0xab, 0xc9, 0x5c, 0x9d,
- 0xd1, 0xce, 0xa1, 0xaa, 0x64, 0x85, 0x04, 0x8c, 0x6a, 0x7c, 0xc2, 0xcf, 0x33, 0x5d, 0x87, 0x92,
- 0x47, 0x19, 0x33, 0xed, 0x8e, 0x27, 0xa2, 0xb7, 0xb2, 0x5c, 0x2b, 0x4d, 0xd5, 0x86, 0x01, 0x95,
- 0xfc, 0x3c, 0x94, 0x45, 0xde, 0x67, 0xc5, 0xed, 0x78, 0xf3, 0x65, 0x51, 0x3e, 0x12, 0x76, 0xb5,
- 0xe9, 0x37, 0x62, 0x48, 0x27, 0x2f, 0xc1, 0xb4, 0x2c, 0xa1, 0x49, 0x83, 0xa0, 0x62, 0xac, 0x0b,
- 0xc7, 0x47, 0xd5, 0xe9, 0x7a, 0xa4, 0x1d, 0x63, 0x5c, 0x3c, 0x9e, 0xa2, 0x41, 0x72, 0x2c, 0x19,
- 0x4f, 0x85, 0x69, 0x33, 0x8c, 0x70, 0x91, 0xe7, 0x20, 0xc7, 0x2c, 0x4f, 0xc4, 0x50, 0xa5, 0xd0,
- 0xef, 0xdd, 0xd9, 0x6a, 0x22, 0x6f, 0xd7, 0xfe, 0x37, 0x03, 0x73, 0x89, 0xc3, 0x2b, 0x5c, 0x64,
- 0xe0, 0x5a, 0xca, 0x8c, 0x04, 0x22, 0xbb, 0xb8, 0x85, 0xbc, 0x9d, 0xbc, 0xa5, 0xbc, 0xc2, 0xec,
- 0x84, 0x47, 0x8f, 0xef, 0xac, 0xec, 0x34, 0xb9, 0x1b, 0x38, 0xe4, 0x10, 0xde, 0x48, 0x0c, 0x4e,
- 0x2e, 0x9e, 0x6b, 0x3b, 0x79, 0x80, 0x22, 0x01, 0x67, 0xfe, 0x34, 0x01, 0xa7, 0xf6, 0x0f, 0x39,
- 0xa8, 0xdc, 0x72, 0xf6, 0x3e, 0x25, 0x07, 0x16, 0xd2, 0x2d, 0x72, 0xf6, 0xa7, 0x68, 0x91, 0x77,
- 0xe1, 0x19, 0xc6, 0x78, 0xd4, 0xef, 0xd8, 0x2d, 0x6f, 0xa5, 0xcd, 0xa8, 0xbb, 0x6e, 0xda, 0xa6,
- 0xb7, 0x4f, 0x5b, 0x2a, 0x73, 0xf7, 0x99, 0xe3, 0xa3, 0xea, 0x33, 0x3b, 0x3b, 0x5b, 0x69, 0x2c,
- 0x38, 0x4a, 0x56, 0xac, 0x10, 0xdd, 0xe8, 0x3a, 0xed, 0xb6, 0x2c, 0x47, 0xcb, 0x1a, 0x8f, 0x5c,
- 0x21, 0x91, 0x76, 0x8c, 0x71, 0x69, 0x1f, 0x65, 0xa0, 0x7c, 0x5b, 0x6f, 0x77, 0xf5, 0xa6, 0x69,
- 0x77, 0xc9, 0xf3, 0x30, 0xb5, 0xe7, 0x3a, 0x5d, 0xea, 0x7a, 0xaa, 0x3c, 0x2c, 0xa2, 0x9e, 0xba,
- 0x6c, 0x42, 0x9f, 0xc6, 0xc3, 0x30, 0xe6, 0xf4, 0x4d, 0x23, 0x19, 0xb0, 0xee, 0xf0, 0x46, 0x94,
- 0x34, 0x72, 0x4f, 0xae, 0xa3, 0xdc, 0x84, 0xe7, 0x5f, 0x77, 0xb6, 0x9a, 0xb2, 0xe4, 0xea, 0xaf,
- 0x40, 0xf2, 0x42, 0xcc, 0xf3, 0x28, 0x8f, 0xf2, 0x15, 0xb4, 0xef, 0x65, 0xa1, 0x22, 0x5f, 0x4d,
- 0x06, 0x67, 0xe7, 0xf9, 0x72, 0x2f, 0x8b, 0xec, 0xba, 0x37, 0xe8, 0x51, 0x57, 0x04, 0xc1, 0x6a,
- 0xc9, 0x45, 0xb3, 0x25, 0x21, 0x31, 0xc8, 0xb0, 0x87, 0x4d, 0xfe, 0xe8, 0xe4, 0x1f, 0xe3, 0xe8,
- 0x14, 0x4e, 0x1c, 0x9d, 0xbf, 0xc8, 0x40, 0x79, 0xcb, 0x6c, 0x53, 0xe3, 0xd0, 0xb0, 0x28, 0x79,
- 0x1d, 0xe6, 0x5b, 0xd4, 0xa2, 0x8c, 0x6e, 0xb8, 0xba, 0x41, 0x1b, 0xd4, 0x35, 0xc5, 0x29, 0x7d,
- 0x3e, 0xcb, 0xc4, 0x3a, 0x2e, 0xc8, 0xed, 0x72, 0x6d, 0x04, 0x0f, 0x8e, 0x94, 0x26, 0x9b, 0x30,
- 0xdd, 0xa2, 0x9e, 0xe9, 0xd2, 0x56, 0x23, 0xe2, 0x8d, 0x3e, 0xef, 0xdb, 0xa6, 0xb5, 0x08, 0xed,
- 0xe1, 0x51, 0x75, 0xa6, 0x61, 0xf6, 0xa9, 0x65, 0xda, 0x54, 0xba, 0xa5, 0x31, 0x51, 0xad, 0x00,
- 0xb9, 0x2d, 0xa7, 0xa3, 0xbd, 0x9f, 0x83, 0xe0, 0xde, 0x05, 0xf9, 0x9d, 0x0c, 0x54, 0x74, 0xdb,
- 0x76, 0x98, 0xba, 0xd3, 0x20, 0x73, 0xfb, 0x38, 0xf1, 0xf5, 0x8e, 0xda, 0x4a, 0x08, 0x2a, 0xd3,
- 0xc2, 0x41, 0xaa, 0x3a, 0x42, 0xc1, 0xa8, 0x6e, 0x32, 0x48, 0x64, 0xaa, 0xb7, 0x27, 0xef, 0xc5,
- 0x29, 0xf2, 0xd2, 0x0b, 0x5f, 0x81, 0x0b, 0xc9, 0xce, 0x9e, 0x25, 0xb1, 0x35, 0x49, 0x4e, 0xec,
- 0x8f, 0x32, 0x50, 0xf2, 0x77, 0x25, 0xb2, 0x0a, 0xf9, 0x81, 0x47, 0xdd, 0xb3, 0x9d, 0xa0, 0x15,
- 0x5b, 0xd9, 0xae, 0x47, 0x5d, 0x14, 0xc2, 0xe4, 0x35, 0x28, 0xf5, 0x75, 0xcf, 0xbb, 0xef, 0xb8,
- 0x2d, 0x65, 0xa4, 0x4f, 0x09, 0x24, 0xaf, 0x54, 0x28, 0x51, 0x0c, 0x40, 0xb4, 0x77, 0xcb, 0x50,
- 0xb9, 0xa3, 0x33, 0xf3, 0x80, 0x8a, 0x28, 0xf1, 0xf1, 0xb8, 0xfd, 0x3f, 0xc8, 0xc0, 0x95, 0x78,
- 0x5a, 0xfb, 0x31, 0xfa, 0xfe, 0x0b, 0xc7, 0x47, 0xd5, 0x2b, 0x98, 0xaa, 0x0d, 0x47, 0xf4, 0x42,
- 0x44, 0x01, 0x43, 0x59, 0xf2, 0xc7, 0x1d, 0x05, 0x34, 0x47, 0x29, 0xc4, 0xd1, 0x7d, 0xf9, 0xb4,
- 0x44, 0x01, 0x4f, 0xf6, 0x95, 0x87, 0x44, 0x8c, 0x32, 0xf5, 0xc4, 0xc4, 0x28, 0xa5, 0x27, 0xc2,
- 0x27, 0xec, 0x47, 0x62, 0x94, 0xf2, 0x84, 0xa9, 0x5a, 0x55, 0x09, 0x96, 0x68, 0xa3, 0x62, 0x1d,
- 0xed, 0xcf, 0x33, 0x00, 0x61, 0x32, 0x99, 0x7c, 0x3f, 0x03, 0x97, 0x83, 0xe1, 0x62, 0xf2, 0xb8,
- 0xf7, 0xaa, 0xa5, 0x9b, 0xbd, 0x89, 0x9d, 0xe6, 0xb4, 0x4f, 0x25, 0xe6, 0x4f, 0x23, 0x4d, 0x1d,
- 0xa6, 0xf7, 0x42, 0xfb, 0x6e, 0x16, 0x2e, 0xa5, 0x20, 0x91, 0x57, 0xe0, 0x82, 0xca, 0x7c, 0x87,
- 0x37, 0xe2, 0xa4, 0x15, 0x15, 0xc7, 0x1e, 0x9b, 0x09, 0x1a, 0x0e, 0x71, 0x93, 0xb7, 0x00, 0x74,
- 0xc3, 0xa0, 0x9e, 0xb7, 0xed, 0xb4, 0x7c, 0x67, 0xe0, 0x65, 0x1e, 0x6c, 0xac, 0x04, 0xad, 0x0f,
- 0x8f, 0xaa, 0x9f, 0x4f, 0x2b, 0x61, 0x24, 0x7a, 0x1a, 0x0a, 0x60, 0x04, 0x92, 0x7c, 0x1d, 0x40,
- 0x1e, 0x98, 0x0f, 0x4e, 0xce, 0x3d, 0x22, 0xc3, 0x5a, 0xf3, 0x0f, 0xa4, 0xd7, 0xbe, 0x3a, 0xd0,
- 0x6d, 0x66, 0xb2, 0x43, 0x79, 0xc6, 0xf5, 0x6e, 0x80, 0x82, 0x11, 0x44, 0xed, 0xef, 0xb2, 0x50,
- 0xf2, 0x9d, 0x94, 0x4f, 0x20, 0x87, 0xde, 0x89, 0xe5, 0xd0, 0xc7, 0xbf, 0xd5, 0xe3, 0x77, 0x79,
- 0x64, 0xd6, 0xdc, 0x49, 0x64, 0xcd, 0x37, 0x26, 0x57, 0x75, 0x72, 0x9e, 0xfc, 0x87, 0x59, 0x98,
- 0xf5, 0x59, 0xd5, 0xa1, 0xdc, 0x2f, 0xc2, 0x8c, 0x4b, 0xf5, 0x56, 0x5d, 0x67, 0xc6, 0xbe, 0xf8,
- 0x7c, 0xf2, 0x48, 0xee, 0xc5, 0xe3, 0xa3, 0xea, 0x0c, 0x46, 0x09, 0x18, 0xe7, 0x4b, 0x3b, 0xcd,
- 0x9b, 0x9d, 0xf0, 0x34, 0x6f, 0xee, 0x2c, 0xa7, 0x79, 0x89, 0x0e, 0x15, 0xde, 0xa3, 0x1d, 0xb3,
- 0x47, 0x9d, 0x81, 0x7f, 0xfd, 0xf5, 0xac, 0x27, 0x41, 0x85, 0x49, 0xc5, 0x10, 0x06, 0xa3, 0x98,
- 0xda, 0x3f, 0x67, 0x60, 0x3a, 0x1c, 0xaf, 0xc7, 0x5e, 0x49, 0x68, 0xc7, 0x2b, 0x09, 0x2b, 0x13,
- 0x4f, 0x87, 0x11, 0xb5, 0x83, 0x3f, 0x2c, 0x86, 0xaf, 0x25, 0xaa, 0x05, 0x7b, 0xb0, 0x60, 0xa6,
- 0x26, 0xd0, 0x23, 0xd6, 0x26, 0x38, 0x1c, 0xb5, 0x39, 0x92, 0x13, 0x4f, 0x40, 0x21, 0x03, 0x28,
- 0x1d, 0x50, 0x97, 0x99, 0x06, 0xf5, 0xdf, 0x6f, 0x63, 0xe2, 0x2d, 0x49, 0x16, 0x86, 0xc3, 0x31,
- 0xbd, 0xab, 0x14, 0x60, 0xa0, 0x8a, 0xec, 0x41, 0x81, 0xb6, 0x3a, 0xd4, 0x3f, 0x0c, 0xfd, 0xe5,
- 0x89, 0x8e, 0xc7, 0x87, 0xe3, 0xc9, 0x9f, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x87, 0x75,
- 0x6a, 0x1e, 0xd6, 0xc7, 0xd6, 0x13, 0x04, 0x88, 0xe1, 0xe1, 0xc4, 0xa0, 0x09, 0x43, 0x3d, 0xa4,
- 0x1b, 0x1c, 0xfc, 0x2f, 0x9c, 0x93, 0xf1, 0x38, 0xe1, 0xf0, 0xbf, 0x07, 0xe5, 0xfb, 0x3a, 0xa3,
- 0x6e, 0x4f, 0x77, 0xbb, 0xca, 0xdb, 0x1a, 0xff, 0x0d, 0xef, 0xf9, 0x48, 0xe1, 0x1b, 0x06, 0x4d,
- 0x18, 0xea, 0x21, 0x0e, 0x94, 0x99, 0x72, 0x1f, 0x3c, 0xe5, 0x4f, 0x8d, 0xaf, 0xd4, 0x77, 0x44,
- 0x3c, 0x99, 0xf0, 0x0c, 0x1e, 0x31, 0xd4, 0xa1, 0x3d, 0xcc, 0x85, 0xe6, 0xf1, 0x93, 0x2e, 0x1d,
- 0xbd, 0x14, 0x2f, 0x1d, 0x2d, 0x26, 0x4b, 0x47, 0x89, 0x28, 0xfd, 0xec, 0xc5, 0x23, 0x1d, 0x2a,
- 0x96, 0xee, 0xb1, 0xdd, 0x7e, 0x4b, 0x67, 0x2a, 0xef, 0x58, 0x59, 0xfe, 0xb9, 0xd3, 0x59, 0x2f,
- 0x6e, 0x0f, 0xc3, 0x60, 0x7c, 0x2b, 0x84, 0xc1, 0x28, 0x26, 0x79, 0x11, 0x2a, 0x07, 0x62, 0x45,
- 0xae, 0x3a, 0x03, 0x5b, 0x1e, 0x5d, 0x9e, 0x91, 0x16, 0xf6, 0x6e, 0xd8, 0x8c, 0x51, 0x1e, 0x2e,
- 0x22, 0x3d, 0x01, 0x29, 0x52, 0x0c, 0x45, 0x9a, 0x61, 0x33, 0x46, 0x79, 0x44, 0x0e, 0xdb, 0xb4,
- 0xbb, 0x52, 0x60, 0x4a, 0x08, 0xc8, 0x1c, 0xb6, 0xdf, 0x88, 0x21, 0x9d, 0xc7, 0x93, 0x83, 0x56,
- 0x5b, 0xf2, 0x96, 0x04, 0xaf, 0x70, 0x17, 0x77, 0xd7, 0xd6, 0x25, 0x6b, 0x40, 0xd5, 0xfe, 0x2b,
- 0x03, 0x64, 0xb8, 0xd8, 0x49, 0xf6, 0xa1, 0x68, 0x8b, 0x50, 0x76, 0xe2, 0x9b, 0x9e, 0x91, 0x88,
- 0x58, 0xae, 0x31, 0xd5, 0xa0, 0xf0, 0x89, 0x0d, 0x25, 0xfa, 0x80, 0x51, 0xd7, 0xd6, 0x2d, 0xe5,
- 0x7a, 0x9c, 0xcf, 0xad, 0x52, 0xf1, 0xc2, 0x37, 0x15, 0x32, 0x06, 0x3a, 0xb4, 0x9f, 0x64, 0xa1,
- 0x12, 0xe1, 0x7b, 0x54, 0x46, 0x5d, 0x9c, 0x25, 0x94, 0x11, 0xe4, 0xae, 0x6b, 0xa9, 0x69, 0x1a,
- 0x39, 0x4b, 0xa8, 0x48, 0xb8, 0x85, 0x51, 0x3e, 0xb2, 0x0c, 0xd0, 0xd3, 0x3d, 0x46, 0x5d, 0xb1,
- 0x95, 0x24, 0x4e, 0xf0, 0x6d, 0x07, 0x14, 0x8c, 0x70, 0x91, 0x6b, 0x2a, 0xab, 0x91, 0x8f, 0xdf,
- 0x80, 0x19, 0x91, 0xb2, 0x28, 0x9c, 0x43, 0xca, 0x82, 0x74, 0xe0, 0x82, 0xdf, 0x6b, 0x9f, 0xaa,
- 0xec, 0xdc, 0x29, 0x81, 0xa5, 0x33, 0x9e, 0x80, 0xc0, 0x21, 0x50, 0xed, 0x2f, 0x33, 0x30, 0x13,
- 0x8b, 0x5f, 0xc8, 0x67, 0xa3, 0xa5, 0xfa, 0x48, 0xf2, 0x33, 0x56, 0x61, 0x7f, 0x01, 0x8a, 0x72,
- 0x80, 0xd4, 0xc0, 0x07, 0x66, 0x44, 0x0e, 0x21, 0x2a, 0x2a, 0x37, 0x08, 0x2a, 0x43, 0x92, 0x34,
- 0x08, 0x2a, 0x85, 0x82, 0x3e, 0x9d, 0x7c, 0x8e, 0x47, 0x64, 0xb2, 0x77, 0x6a, 0xa4, 0x83, 0x7d,
- 0xd4, 0x7f, 0x0f, 0x0c, 0x38, 0xb4, 0x1f, 0xe4, 0x41, 0xde, 0x16, 0xe7, 0x72, 0x2d, 0xd3, 0x93,
- 0xd5, 0x8b, 0x8c, 0xa8, 0x5e, 0x04, 0x72, 0x6b, 0xaa, 0x1d, 0x03, 0x0e, 0x72, 0x15, 0x72, 0x3d,
- 0xd3, 0x56, 0xb9, 0x1c, 0x91, 0x36, 0xdd, 0x36, 0x6d, 0xe4, 0x6d, 0x82, 0xa4, 0x3f, 0x50, 0x09,
- 0x78, 0x49, 0xd2, 0x1f, 0x20, 0x6f, 0xe3, 0xce, 0xa5, 0xe5, 0x38, 0xdd, 0x3d, 0xdd, 0xe8, 0xfa,
- 0x29, 0xd1, 0xbc, 0x58, 0xbd, 0xc2, 0xb9, 0xdc, 0x8a, 0x93, 0x30, 0xc9, 0xcb, 0xc5, 0x0d, 0xc7,
- 0xb1, 0x5a, 0xce, 0x7d, 0xdb, 0x17, 0x2f, 0x84, 0xe2, 0xab, 0x71, 0x12, 0x26, 0x79, 0xc9, 0x2e,
- 0x3c, 0xf3, 0x0e, 0x75, 0x1d, 0x35, 0x62, 0x4d, 0x8b, 0xd2, 0xbe, 0x0f, 0x23, 0x0d, 0x94, 0xa8,
- 0x16, 0xbc, 0x91, 0xce, 0x82, 0xa3, 0x64, 0x45, 0x11, 0x42, 0x77, 0x3b, 0x94, 0x35, 0x5c, 0x87,
- 0xc7, 0x4e, 0xa6, 0xdd, 0xf1, 0x61, 0xa7, 0x42, 0xd8, 0x9d, 0x74, 0x16, 0x1c, 0x25, 0x4b, 0x56,
- 0xe1, 0xa2, 0x24, 0x45, 0x7c, 0x66, 0x65, 0xeb, 0x44, 0x81, 0x64, 0x27, 0x49, 0xc4, 0x61, 0x7e,
- 0xee, 0x8e, 0xfb, 0x99, 0xb5, 0x06, 0x75, 0xc5, 0x87, 0x16, 0x61, 0xba, 0x72, 0xc7, 0x31, 0x41,
- 0xc3, 0x21, 0x6e, 0xed, 0x4f, 0xb3, 0x20, 0xfe, 0x8a, 0x83, 0xdc, 0x83, 0x9c, 0xe5, 0x74, 0x94,
- 0xb9, 0x1c, 0x3f, 0xcd, 0xbe, 0xe5, 0x74, 0xe4, 0xa4, 0xd8, 0x72, 0x3a, 0xc8, 0x11, 0x89, 0x01,
- 0x85, 0xae, 0xde, 0xee, 0xea, 0xca, 0x3a, 0x8e, 0xef, 0x0b, 0x04, 0xc5, 0x17, 0x75, 0x15, 0x8f,
- 0x3f, 0xa2, 0xc4, 0x26, 0x06, 0x14, 0x07, 0xad, 0xc8, 0x3f, 0x94, 0xbc, 0x3c, 0xc1, 0xbf, 0x88,
- 0x08, 0x15, 0xc2, 0xd4, 0xcb, 0xdf, 0xa8, 0xa0, 0xb5, 0xbf, 0xcf, 0x82, 0xfa, 0x5f, 0x14, 0x32,
- 0x80, 0x72, 0xc7, 0xbf, 0xfa, 0xa6, 0xc6, 0xec, 0xd5, 0x09, 0x4e, 0x5b, 0xc7, 0x2e, 0xd1, 0xc9,
- 0x7d, 0x31, 0x68, 0xc4, 0x50, 0x13, 0xa1, 0xf1, 0xb1, 0x5c, 0x9b, 0x70, 0x2c, 0xa5, 0xba, 0xe1,
- 0xd1, 0xd4, 0x21, 0xbf, 0xcf, 0x58, 0x7f, 0xe2, 0x43, 0x81, 0xe1, 0x79, 0x3f, 0x99, 0xbd, 0xe6,
- 0xcf, 0x28, 0xa0, 0xb5, 0x1e, 0x28, 0x57, 0x8a, 0x18, 0xb1, 0x6b, 0xb8, 0xb2, 0x2a, 0xb1, 0x74,
- 0x3a, 0x07, 0x27, 0xb8, 0xac, 0x19, 0xb9, 0x07, 0x93, 0x7a, 0xdf, 0x56, 0xfb, 0xd7, 0x2c, 0xe4,
- 0x76, 0xb6, 0x9a, 0xf2, 0x58, 0xb7, 0xb8, 0x95, 0x4e, 0x9b, 0x5d, 0xb3, 0x7f, 0x97, 0xba, 0x66,
- 0xfb, 0x50, 0xd9, 0xc3, 0xc8, 0xb1, 0xee, 0x24, 0x07, 0xa6, 0x48, 0x91, 0x37, 0x61, 0xda, 0xd0,
- 0x57, 0xa9, 0xcb, 0xe4, 0xb6, 0x72, 0xb6, 0x24, 0xbc, 0xa8, 0x36, 0xae, 0xae, 0x84, 0xe2, 0x18,
- 0x03, 0x23, 0xbb, 0x00, 0x46, 0x08, 0x9d, 0x3b, 0x0b, 0xb4, 0xbc, 0x77, 0x1c, 0x02, 0x47, 0x80,
- 0x08, 0x42, 0xb9, 0xcb, 0x59, 0x05, 0x6a, 0xfe, 0x2c, 0xa8, 0x62, 0x52, 0xde, 0xf6, 0x65, 0x31,
- 0x84, 0xd1, 0xfe, 0x33, 0x03, 0xa1, 0x63, 0x4e, 0x3c, 0x28, 0xb6, 0xc4, 0x0d, 0x4b, 0xb5, 0x2c,
- 0xc6, 0x0f, 0x70, 0xe2, 0xb7, 0xfd, 0xeb, 0xe4, 0xf8, 0xa8, 0x9a, 0xf8, 0x07, 0x00, 0x54, 0xaa,
- 0x48, 0x07, 0x72, 0x6f, 0x3b, 0x7b, 0x13, 0xaf, 0x8a, 0x48, 0xad, 0x5e, 0x7a, 0xb3, 0x91, 0x06,
- 0xe4, 0x1a, 0xb8, 0x09, 0xc8, 0xed, 0xae, 0xad, 0xf3, 0x20, 0x27, 0x28, 0x57, 0xab, 0x17, 0xad,
- 0x4f, 0x9e, 0xc7, 0x96, 0x83, 0x1c, 0x3c, 0x62, 0xa8, 0x83, 0xec, 0xc3, 0xd4, 0xde, 0xc0, 0xb4,
- 0x98, 0x69, 0x4f, 0x7c, 0x38, 0xc2, 0xbf, 0x1f, 0xac, 0xaa, 0xba, 0x12, 0x15, 0x7d, 0x78, 0xd2,
- 0x81, 0xa9, 0x8e, 0x3c, 0xad, 0xac, 0xa6, 0xdd, 0x2b, 0xe3, 0x1b, 0x36, 0x89, 0x23, 0x15, 0xa9,
- 0x07, 0xf4, 0xd1, 0xb5, 0x6f, 0x82, 0x32, 0xb0, 0x3c, 0x4e, 0x7d, 0x1c, 0xa3, 0x19, 0xc4, 0xa9,
- 0x69, 0x23, 0xaa, 0xfd, 0x6d, 0x16, 0x8a, 0xea, 0x4f, 0xb6, 0x1e, 0x7f, 0x72, 0x92, 0xc6, 0x92,
- 0x93, 0xab, 0x13, 0xfe, 0xe5, 0xd0, 0xc8, 0xd4, 0x64, 0x2f, 0x91, 0x9a, 0x9c, 0xf4, 0xbf, 0x8d,
- 0x1e, 0x91, 0x98, 0xfc, 0xc7, 0x0c, 0xcc, 0x4a, 0xc6, 0x4d, 0xdb, 0x63, 0xba, 0x6d, 0x88, 0x7f,
- 0x23, 0x93, 0x81, 0xe2, 0xc4, 0x91, 0xb7, 0xca, 0x12, 0x89, 0x8d, 0x58, 0xfe, 0x46, 0x05, 0xcd,
- 0x7d, 0xd9, 0x7d, 0xc7, 0x63, 0xe2, 0xbe, 0x7d, 0x36, 0xee, 0x03, 0xbf, 0xaa, 0xda, 0x31, 0xe0,
- 0x48, 0x3a, 0xd7, 0x85, 0xd1, 0xce, 0xb5, 0xf6, 0x67, 0x19, 0x98, 0x8e, 0xfe, 0xab, 0xd3, 0xf8,
- 0x79, 0xd6, 0x44, 0x9a, 0x33, 0xfb, 0x18, 0xd2, 0x9c, 0x1f, 0x66, 0x00, 0xfc, 0xce, 0x3e, 0xf6,
- 0x24, 0x67, 0x2b, 0x9e, 0xe4, 0x9c, 0xf8, 0xb3, 0xa6, 0xa7, 0x38, 0xff, 0x2a, 0xef, 0xbf, 0x92,
- 0x48, 0x70, 0xbe, 0x97, 0x81, 0x59, 0x3d, 0x96, 0x34, 0x9c, 0x78, 0x53, 0x49, 0xe4, 0x20, 0x83,
- 0x7f, 0xc1, 0x8a, 0xb7, 0x63, 0x42, 0x2d, 0xb9, 0x01, 0xd3, 0x7d, 0x95, 0xc9, 0xb9, 0x13, 0xce,
- 0xba, 0xe0, 0xdc, 0x58, 0x23, 0x42, 0xc3, 0x18, 0xe7, 0x23, 0x92, 0xb4, 0xb9, 0x73, 0x49, 0xd2,
- 0x46, 0xcb, 0xef, 0xf9, 0x13, 0xcb, 0xef, 0x36, 0x94, 0xdb, 0xae, 0xd3, 0x13, 0x79, 0x50, 0xf5,
- 0x67, 0x4b, 0x13, 0xe6, 0x56, 0x03, 0x23, 0xbb, 0xee, 0xe3, 0x62, 0xa8, 0x82, 0x6f, 0x5b, 0xcc,
- 0x91, 0xda, 0x8a, 0xe7, 0xa1, 0x2d, 0x58, 0xba, 0x3b, 0x12, 0x15, 0x7d, 0x78, 0xed, 0x5f, 0xb2,
- 0xfe, 0xd2, 0x6d, 0x26, 0x4e, 0x75, 0x67, 0x46, 0x9c, 0xea, 0x56, 0xf7, 0x93, 0xa2, 0x89, 0xb9,
- 0x17, 0xa0, 0xe8, 0x52, 0xdd, 0x73, 0x6c, 0x75, 0xd3, 0x2f, 0x30, 0x7c, 0x28, 0x5a, 0x51, 0x51,
- 0xa3, 0x09, 0xbc, 0xec, 0x23, 0x12, 0x78, 0x9f, 0x8b, 0x7c, 0x1b, 0x59, 0x29, 0x09, 0x96, 0x59,
- 0xca, 0xf7, 0x11, 0xd1, 0xbd, 0xfa, 0x37, 0xd4, 0x42, 0x32, 0xba, 0x57, 0xff, 0x54, 0x1a, 0x70,
- 0x90, 0x16, 0x4c, 0x5b, 0xba, 0xc7, 0x44, 0x24, 0xd7, 0x5a, 0x61, 0x63, 0x64, 0x07, 0x83, 0x19,
- 0xbc, 0x15, 0xc1, 0xc1, 0x18, 0xaa, 0xf6, 0x9d, 0x0c, 0x84, 0x99, 0xde, 0x33, 0xe6, 0x11, 0x5e,
- 0x87, 0x52, 0x4f, 0x7f, 0xb0, 0x46, 0x2d, 0xfd, 0x70, 0x92, 0x3f, 0xfd, 0xd8, 0x56, 0x18, 0x18,
- 0xa0, 0x69, 0x0e, 0xa8, 0x2b, 0x4f, 0x3c, 0x28, 0x6a, 0x9b, 0x0f, 0x54, 0x77, 0x26, 0x71, 0xff,
- 0x22, 0xff, 0x32, 0x23, 0x83, 0x22, 0xd1, 0x80, 0x12, 0xbd, 0x5e, 0xfb, 0xe0, 0xe3, 0xc5, 0xa7,
- 0x3e, 0xfc, 0x78, 0xf1, 0xa9, 0x8f, 0x3e, 0x5e, 0x7c, 0xea, 0xb7, 0x8f, 0x17, 0x33, 0x1f, 0x1c,
- 0x2f, 0x66, 0x3e, 0x3c, 0x5e, 0xcc, 0x7c, 0x74, 0xbc, 0x98, 0xf9, 0xb7, 0xe3, 0xc5, 0xcc, 0xef,
- 0xff, 0xfb, 0xe2, 0x53, 0x6f, 0x94, 0x7c, 0xb4, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xca,
- 0x57, 0x00, 0x0d, 0x59, 0x00, 0x00,
+ 0x49, 0x86, 0xbb, 0xc1, 0x32, 0x51, 0xf3, 0x49, 0x14, 0xbe, 0x9e, 0x93, 0xee, 0xf4, 0x18, 0x85,
+ 0x38, 0xbe, 0x2f, 0xe4, 0x8f, 0x33, 0x30, 0xdf, 0x4b, 0xf8, 0xd9, 0x8f, 0xf1, 0x78, 0xd3, 0xb3,
+ 0x47, 0xc3, 0xea, 0xfc, 0xf6, 0x18, 0x7d, 0x38, 0xb6, 0x27, 0xe4, 0xb7, 0xa0, 0xd2, 0xe7, 0xf3,
+ 0xc2, 0x63, 0xd4, 0x36, 0xfc, 0x13, 0x4e, 0x93, 0xcf, 0xfe, 0x46, 0x88, 0xd5, 0x64, 0xae, 0xce,
+ 0x68, 0xe7, 0x50, 0x55, 0xb2, 0x42, 0x02, 0x46, 0x35, 0x3e, 0xe1, 0xe7, 0x99, 0xae, 0x43, 0xc9,
+ 0xa3, 0x8c, 0x99, 0x76, 0xc7, 0x13, 0xd1, 0x5b, 0x59, 0xae, 0x95, 0xa6, 0x6a, 0xc3, 0x80, 0x4a,
+ 0x7e, 0x1e, 0xca, 0x22, 0xef, 0xb3, 0xe2, 0x76, 0xbc, 0xf9, 0xb2, 0x28, 0x1f, 0x09, 0xbb, 0xda,
+ 0xf4, 0x1b, 0x31, 0xa4, 0x93, 0x97, 0x60, 0x56, 0x96, 0xd0, 0xa4, 0x41, 0x50, 0x31, 0xd6, 0x85,
+ 0xa3, 0x61, 0x75, 0xb6, 0x1e, 0x69, 0xc7, 0x18, 0x17, 0x8f, 0xa7, 0x68, 0x90, 0x1c, 0x4b, 0xc6,
+ 0x53, 0x61, 0xda, 0x0c, 0x23, 0x5c, 0xe4, 0x39, 0xc8, 0x31, 0xcb, 0x13, 0x31, 0x54, 0x29, 0xf4,
+ 0x7b, 0x77, 0xb6, 0x9a, 0xc8, 0xdb, 0xb5, 0xff, 0xc9, 0xc0, 0xf9, 0xc4, 0xe1, 0x15, 0x2e, 0x32,
+ 0x70, 0x2d, 0x65, 0x46, 0x02, 0x91, 0x5d, 0xdc, 0x42, 0xde, 0x4e, 0xde, 0x52, 0x5e, 0x61, 0x76,
+ 0xca, 0xa3, 0xc7, 0x77, 0x56, 0x76, 0x9a, 0xdc, 0x0d, 0x1c, 0x71, 0x08, 0x6f, 0x24, 0x06, 0x27,
+ 0x17, 0xcf, 0xb5, 0x1d, 0x3f, 0x40, 0x91, 0x80, 0x33, 0x7f, 0x92, 0x80, 0x53, 0xfb, 0x87, 0x1c,
+ 0x54, 0x6e, 0x39, 0x7b, 0x9f, 0x92, 0x03, 0x0b, 0xe9, 0x16, 0x39, 0xfb, 0x53, 0xb4, 0xc8, 0xbb,
+ 0xf0, 0x0c, 0x63, 0x3c, 0xea, 0x77, 0xec, 0x96, 0xb7, 0xd2, 0x66, 0xd4, 0x5d, 0x37, 0x6d, 0xd3,
+ 0xdb, 0xa7, 0x2d, 0x95, 0xb9, 0xfb, 0xcc, 0xd1, 0xb0, 0xfa, 0xcc, 0xce, 0xce, 0x56, 0x1a, 0x0b,
+ 0x8e, 0x93, 0x15, 0x2b, 0x44, 0x37, 0xba, 0x4e, 0xbb, 0x2d, 0xcb, 0xd1, 0xb2, 0xc6, 0x23, 0x57,
+ 0x48, 0xa4, 0x1d, 0x63, 0x5c, 0xda, 0x47, 0x19, 0x28, 0xdf, 0xd6, 0xdb, 0x5d, 0xbd, 0x69, 0xda,
+ 0x5d, 0xf2, 0x3c, 0xcc, 0xec, 0xb9, 0x4e, 0x97, 0xba, 0x9e, 0x2a, 0x0f, 0x8b, 0xa8, 0xa7, 0x2e,
+ 0x9b, 0xd0, 0xa7, 0xf1, 0x30, 0x8c, 0x39, 0x7d, 0xd3, 0x48, 0x06, 0xac, 0x3b, 0xbc, 0x11, 0x25,
+ 0x8d, 0xdc, 0x93, 0xeb, 0x28, 0x37, 0xe5, 0xf9, 0xd7, 0x9d, 0xad, 0xa6, 0x2c, 0xb9, 0xfa, 0x2b,
+ 0x90, 0xbc, 0x10, 0xf3, 0x3c, 0xca, 0xe3, 0x7c, 0x05, 0xed, 0x7b, 0x59, 0xa8, 0xc8, 0x57, 0x93,
+ 0xc1, 0xd9, 0x59, 0xbe, 0xdc, 0xcb, 0x22, 0xbb, 0xee, 0x0d, 0x7a, 0xd4, 0x15, 0x41, 0xb0, 0x5a,
+ 0x72, 0xd1, 0x6c, 0x49, 0x48, 0x0c, 0x32, 0xec, 0x61, 0x93, 0x3f, 0x3a, 0xf9, 0xc7, 0x38, 0x3a,
+ 0x85, 0x63, 0x47, 0xe7, 0x2f, 0x32, 0x50, 0xde, 0x32, 0xdb, 0xd4, 0x38, 0x34, 0x2c, 0x4a, 0x5e,
+ 0x87, 0xf9, 0x16, 0xb5, 0x28, 0xa3, 0x1b, 0xae, 0x6e, 0xd0, 0x06, 0x75, 0x4d, 0x71, 0x4a, 0x9f,
+ 0xcf, 0x32, 0xb1, 0x8e, 0x0b, 0x72, 0xbb, 0x5c, 0x1b, 0xc3, 0x83, 0x63, 0xa5, 0xc9, 0x26, 0xcc,
+ 0xb6, 0xa8, 0x67, 0xba, 0xb4, 0xd5, 0x88, 0x78, 0xa3, 0xcf, 0xfb, 0xb6, 0x69, 0x2d, 0x42, 0x7b,
+ 0x38, 0xac, 0xce, 0x35, 0xcc, 0x3e, 0xb5, 0x4c, 0x9b, 0x4a, 0xb7, 0x34, 0x26, 0xaa, 0x15, 0x20,
+ 0xb7, 0xe5, 0x74, 0xb4, 0xf7, 0x73, 0x10, 0xdc, 0xbb, 0x20, 0xbf, 0x93, 0x81, 0x8a, 0x6e, 0xdb,
+ 0x0e, 0x53, 0x77, 0x1a, 0x64, 0x6e, 0x1f, 0xa7, 0xbe, 0xde, 0x51, 0x5b, 0x09, 0x41, 0x65, 0x5a,
+ 0x38, 0x48, 0x55, 0x47, 0x28, 0x18, 0xd5, 0x4d, 0x06, 0x89, 0x4c, 0xf5, 0xf6, 0xf4, 0xbd, 0x38,
+ 0x41, 0x5e, 0x7a, 0xe1, 0x2b, 0x70, 0x21, 0xd9, 0xd9, 0xd3, 0x24, 0xb6, 0xa6, 0xc9, 0x89, 0xfd,
+ 0x51, 0x06, 0x4a, 0xfe, 0xae, 0x44, 0x56, 0x21, 0x3f, 0xf0, 0xa8, 0x7b, 0xba, 0x13, 0xb4, 0x62,
+ 0x2b, 0xdb, 0xf5, 0xa8, 0x8b, 0x42, 0x98, 0xbc, 0x06, 0xa5, 0xbe, 0xee, 0x79, 0xf7, 0x1d, 0xb7,
+ 0xa5, 0x8c, 0xf4, 0x09, 0x81, 0xe4, 0x95, 0x0a, 0x25, 0x8a, 0x01, 0x88, 0xf6, 0x6e, 0x19, 0x2a,
+ 0x77, 0x74, 0x66, 0x1e, 0x50, 0x11, 0x25, 0x3e, 0x1e, 0xb7, 0xff, 0x07, 0x19, 0xb8, 0x12, 0x4f,
+ 0x6b, 0x3f, 0x46, 0xdf, 0x7f, 0xe1, 0x68, 0x58, 0xbd, 0x82, 0xa9, 0xda, 0x70, 0x4c, 0x2f, 0x44,
+ 0x14, 0x30, 0x92, 0x25, 0x7f, 0xdc, 0x51, 0x40, 0x73, 0x9c, 0x42, 0x1c, 0xdf, 0x97, 0x4f, 0x4b,
+ 0x14, 0xf0, 0x64, 0x5f, 0x79, 0x48, 0xc4, 0x28, 0x33, 0x4f, 0x4c, 0x8c, 0x52, 0x7a, 0x22, 0x7c,
+ 0xc2, 0x7e, 0x24, 0x46, 0x29, 0x4f, 0x99, 0xaa, 0x55, 0x95, 0x60, 0x89, 0x36, 0x2e, 0xd6, 0xd1,
+ 0xfe, 0x3c, 0x03, 0x10, 0x26, 0x93, 0xc9, 0xf7, 0x33, 0x70, 0x39, 0x18, 0x2e, 0x26, 0x8f, 0x7b,
+ 0xaf, 0x5a, 0xba, 0xd9, 0x9b, 0xda, 0x69, 0x4e, 0xfb, 0x54, 0x62, 0xfe, 0x34, 0xd2, 0xd4, 0x61,
+ 0x7a, 0x2f, 0xb4, 0xef, 0x66, 0xe1, 0x52, 0x0a, 0x12, 0x79, 0x05, 0x2e, 0xa8, 0xcc, 0x77, 0x78,
+ 0x23, 0x4e, 0x5a, 0x51, 0x71, 0xec, 0xb1, 0x99, 0xa0, 0xe1, 0x08, 0x37, 0x79, 0x0b, 0x40, 0x37,
+ 0x0c, 0xea, 0x79, 0xdb, 0x4e, 0xcb, 0x77, 0x06, 0x5e, 0xe6, 0xc1, 0xc6, 0x4a, 0xd0, 0xfa, 0x70,
+ 0x58, 0xfd, 0x7c, 0x5a, 0x09, 0x23, 0xd1, 0xd3, 0x50, 0x00, 0x23, 0x90, 0xe4, 0xeb, 0x00, 0xf2,
+ 0xc0, 0x7c, 0x70, 0x72, 0xee, 0x11, 0x19, 0xd6, 0x9a, 0x7f, 0x20, 0xbd, 0xf6, 0xd5, 0x81, 0x6e,
+ 0x33, 0x93, 0x1d, 0xca, 0x33, 0xae, 0x77, 0x03, 0x14, 0x8c, 0x20, 0x6a, 0x7f, 0x97, 0x85, 0x92,
+ 0xef, 0xa4, 0x7c, 0x02, 0x39, 0xf4, 0x4e, 0x2c, 0x87, 0x3e, 0xf9, 0xad, 0x1e, 0xbf, 0xcb, 0x63,
+ 0xb3, 0xe6, 0x4e, 0x22, 0x6b, 0xbe, 0x31, 0xbd, 0xaa, 0xe3, 0xf3, 0xe4, 0x3f, 0xcc, 0xc2, 0x39,
+ 0x9f, 0x55, 0x1d, 0xca, 0xfd, 0x22, 0xcc, 0xb9, 0x54, 0x6f, 0xd5, 0x75, 0x66, 0xec, 0x8b, 0xcf,
+ 0x27, 0x8f, 0xe4, 0x5e, 0x3c, 0x1a, 0x56, 0xe7, 0x30, 0x4a, 0xc0, 0x38, 0x5f, 0xda, 0x69, 0xde,
+ 0xec, 0x94, 0xa7, 0x79, 0x73, 0xa7, 0x39, 0xcd, 0x4b, 0x74, 0xa8, 0xf0, 0x1e, 0xed, 0x98, 0x3d,
+ 0xea, 0x0c, 0xfc, 0xeb, 0xaf, 0xa7, 0x3d, 0x09, 0x2a, 0x4c, 0x2a, 0x86, 0x30, 0x18, 0xc5, 0xd4,
+ 0xfe, 0x39, 0x03, 0xb3, 0xe1, 0x78, 0x3d, 0xf6, 0x4a, 0x42, 0x3b, 0x5e, 0x49, 0x58, 0x99, 0x7a,
+ 0x3a, 0x8c, 0xa9, 0x1d, 0xfc, 0x61, 0x31, 0x7c, 0x2d, 0x51, 0x2d, 0xd8, 0x83, 0x05, 0x33, 0x35,
+ 0x81, 0x1e, 0xb1, 0x36, 0xc1, 0xe1, 0xa8, 0xcd, 0xb1, 0x9c, 0x78, 0x0c, 0x0a, 0x19, 0x40, 0xe9,
+ 0x80, 0xba, 0xcc, 0x34, 0xa8, 0xff, 0x7e, 0x1b, 0x53, 0x6f, 0x49, 0xb2, 0x30, 0x1c, 0x8e, 0xe9,
+ 0x5d, 0xa5, 0x00, 0x03, 0x55, 0x64, 0x0f, 0x0a, 0xb4, 0xd5, 0xa1, 0xfe, 0x61, 0xe8, 0x2f, 0x4f,
+ 0x75, 0x3c, 0x3e, 0x1c, 0x4f, 0xfe, 0xe4, 0xa1, 0x84, 0x26, 0x1e, 0x94, 0x2d, 0x3f, 0xac, 0x53,
+ 0xf3, 0xb0, 0x3e, 0xb1, 0x9e, 0x20, 0x40, 0x0c, 0x0f, 0x27, 0x06, 0x4d, 0x18, 0xea, 0x21, 0xdd,
+ 0xe0, 0xe0, 0x7f, 0xe1, 0x8c, 0x8c, 0xc7, 0x31, 0x87, 0xff, 0x3d, 0x28, 0xdf, 0xd7, 0x19, 0x75,
+ 0x7b, 0xba, 0xdb, 0x55, 0xde, 0xd6, 0xe4, 0x6f, 0x78, 0xcf, 0x47, 0x0a, 0xdf, 0x30, 0x68, 0xc2,
+ 0x50, 0x0f, 0x71, 0xa0, 0xcc, 0x94, 0xfb, 0xe0, 0x29, 0x7f, 0x6a, 0x72, 0xa5, 0xbe, 0x23, 0xe2,
+ 0xc9, 0x84, 0x67, 0xf0, 0x88, 0xa1, 0x0e, 0xed, 0x61, 0x2e, 0x34, 0x8f, 0x9f, 0x74, 0xe9, 0xe8,
+ 0xa5, 0x78, 0xe9, 0x68, 0x31, 0x59, 0x3a, 0x4a, 0x44, 0xe9, 0xa7, 0x2f, 0x1e, 0xe9, 0x50, 0xb1,
+ 0x74, 0x8f, 0xed, 0xf6, 0x5b, 0x3a, 0x53, 0x79, 0xc7, 0xca, 0xf2, 0xcf, 0x9d, 0xcc, 0x7a, 0x71,
+ 0x7b, 0x18, 0x06, 0xe3, 0x5b, 0x21, 0x0c, 0x46, 0x31, 0xc9, 0x8b, 0x50, 0x39, 0x10, 0x2b, 0x72,
+ 0xd5, 0x19, 0xd8, 0xf2, 0xe8, 0xf2, 0x9c, 0xb4, 0xb0, 0x77, 0xc3, 0x66, 0x8c, 0xf2, 0x70, 0x11,
+ 0xe9, 0x09, 0x48, 0x91, 0x62, 0x28, 0xd2, 0x0c, 0x9b, 0x31, 0xca, 0x23, 0x72, 0xd8, 0xa6, 0xdd,
+ 0x95, 0x02, 0x33, 0x42, 0x40, 0xe6, 0xb0, 0xfd, 0x46, 0x0c, 0xe9, 0x3c, 0x9e, 0x1c, 0xb4, 0xda,
+ 0x92, 0xb7, 0x24, 0x78, 0x85, 0xbb, 0xb8, 0xbb, 0xb6, 0x2e, 0x59, 0x03, 0xaa, 0xf6, 0x9f, 0x19,
+ 0x20, 0xa3, 0xc5, 0x4e, 0xb2, 0x0f, 0x45, 0x5b, 0x84, 0xb2, 0x53, 0xdf, 0xf4, 0x8c, 0x44, 0xc4,
+ 0x72, 0x8d, 0xa9, 0x06, 0x85, 0x4f, 0x6c, 0x28, 0xd1, 0x07, 0x8c, 0xba, 0xb6, 0x6e, 0x29, 0xd7,
+ 0xe3, 0x6c, 0x6e, 0x95, 0x8a, 0x17, 0xbe, 0xa9, 0x90, 0x31, 0xd0, 0xa1, 0xfd, 0x24, 0x0b, 0x95,
+ 0x08, 0xdf, 0xa3, 0x32, 0xea, 0xe2, 0x2c, 0xa1, 0x8c, 0x20, 0x77, 0x5d, 0x4b, 0x4d, 0xd3, 0xc8,
+ 0x59, 0x42, 0x45, 0xc2, 0x2d, 0x8c, 0xf2, 0x91, 0x65, 0x80, 0x9e, 0xee, 0x31, 0xea, 0x8a, 0xad,
+ 0x24, 0x71, 0x82, 0x6f, 0x3b, 0xa0, 0x60, 0x84, 0x8b, 0x5c, 0x53, 0x59, 0x8d, 0x7c, 0xfc, 0x06,
+ 0xcc, 0x98, 0x94, 0x45, 0xe1, 0x0c, 0x52, 0x16, 0xa4, 0x03, 0x17, 0xfc, 0x5e, 0xfb, 0x54, 0x65,
+ 0xe7, 0x4e, 0x08, 0x2c, 0x9d, 0xf1, 0x04, 0x04, 0x8e, 0x80, 0x6a, 0x7f, 0x99, 0x81, 0xb9, 0x58,
+ 0xfc, 0x42, 0x3e, 0x1b, 0x2d, 0xd5, 0x47, 0x92, 0x9f, 0xb1, 0x0a, 0xfb, 0x0b, 0x50, 0x94, 0x03,
+ 0xa4, 0x06, 0x3e, 0x30, 0x23, 0x72, 0x08, 0x51, 0x51, 0xb9, 0x41, 0x50, 0x19, 0x92, 0xa4, 0x41,
+ 0x50, 0x29, 0x14, 0xf4, 0xe9, 0xe4, 0x73, 0x3c, 0x22, 0x93, 0xbd, 0x53, 0x23, 0x1d, 0xec, 0xa3,
+ 0xfe, 0x7b, 0x60, 0xc0, 0xa1, 0xfd, 0x20, 0x0f, 0xf2, 0xb6, 0x38, 0x97, 0x6b, 0x99, 0x9e, 0xac,
+ 0x5e, 0x64, 0x44, 0xf5, 0x22, 0x90, 0x5b, 0x53, 0xed, 0x18, 0x70, 0x90, 0xab, 0x90, 0xeb, 0x99,
+ 0xb6, 0xca, 0xe5, 0x88, 0xb4, 0xe9, 0xb6, 0x69, 0x23, 0x6f, 0x13, 0x24, 0xfd, 0x81, 0x4a, 0xc0,
+ 0x4b, 0x92, 0xfe, 0x00, 0x79, 0x1b, 0x77, 0x2e, 0x2d, 0xc7, 0xe9, 0xee, 0xe9, 0x46, 0xd7, 0x4f,
+ 0x89, 0xe6, 0xc5, 0xea, 0x15, 0xce, 0xe5, 0x56, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e,
+ 0xd5, 0x72, 0xee, 0xdb, 0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8d, 0x93, 0x30, 0xc9, 0x4b, 0x76, 0xe1,
+ 0x99, 0x77, 0xa8, 0xeb, 0xa8, 0x11, 0x6b, 0x5a, 0x94, 0xf6, 0x7d, 0x18, 0x69, 0xa0, 0x44, 0xb5,
+ 0xe0, 0x8d, 0x74, 0x16, 0x1c, 0x27, 0x2b, 0x8a, 0x10, 0xba, 0xdb, 0xa1, 0xac, 0xe1, 0x3a, 0x3c,
+ 0x76, 0x32, 0xed, 0x8e, 0x0f, 0x3b, 0x13, 0xc2, 0xee, 0xa4, 0xb3, 0xe0, 0x38, 0x59, 0xb2, 0x0a,
+ 0x17, 0x25, 0x29, 0xe2, 0x33, 0x2b, 0x5b, 0x27, 0x0a, 0x24, 0x3b, 0x49, 0x22, 0x8e, 0xf2, 0x73,
+ 0x77, 0xdc, 0xcf, 0xac, 0x35, 0xa8, 0x2b, 0x3e, 0xb4, 0x08, 0xd3, 0x95, 0x3b, 0x8e, 0x09, 0x1a,
+ 0x8e, 0x70, 0x6b, 0x7f, 0x9a, 0x05, 0xf1, 0x57, 0x1c, 0xe4, 0x1e, 0xe4, 0x2c, 0xa7, 0xa3, 0xcc,
+ 0xe5, 0xe4, 0x69, 0xf6, 0x2d, 0xa7, 0x23, 0x27, 0xc5, 0x96, 0xd3, 0x41, 0x8e, 0x48, 0x0c, 0x28,
+ 0x74, 0xf5, 0x76, 0x57, 0x57, 0xd6, 0x71, 0x72, 0x5f, 0x20, 0x28, 0xbe, 0xa8, 0xab, 0x78, 0xfc,
+ 0x11, 0x25, 0x36, 0x31, 0xa0, 0x38, 0x68, 0x45, 0xfe, 0xa1, 0xe4, 0xe5, 0x29, 0xfe, 0x45, 0x44,
+ 0xa8, 0x10, 0xa6, 0x5e, 0xfe, 0x46, 0x05, 0xad, 0xfd, 0x7d, 0x16, 0xd4, 0xff, 0xa2, 0x90, 0x01,
+ 0x94, 0x3b, 0xfe, 0xd5, 0x37, 0x35, 0x66, 0xaf, 0x4e, 0x71, 0xda, 0x3a, 0x76, 0x89, 0x4e, 0xee,
+ 0x8b, 0x41, 0x23, 0x86, 0x9a, 0x08, 0x8d, 0x8f, 0xe5, 0xda, 0x94, 0x63, 0x29, 0xd5, 0x8d, 0x8e,
+ 0xa6, 0x0e, 0xf9, 0x7d, 0xc6, 0xfa, 0x53, 0x1f, 0x0a, 0x0c, 0xcf, 0xfb, 0xc9, 0xec, 0x35, 0x7f,
+ 0x46, 0x01, 0xad, 0xf5, 0x40, 0xb9, 0x52, 0xc4, 0x88, 0x5d, 0xc3, 0x95, 0x55, 0x89, 0xa5, 0x93,
+ 0x39, 0x38, 0xc1, 0x65, 0xcd, 0xc8, 0x3d, 0x98, 0xd4, 0xfb, 0xb6, 0xda, 0xbf, 0x66, 0x21, 0xb7,
+ 0xb3, 0xd5, 0x94, 0xc7, 0xba, 0xc5, 0xad, 0x74, 0xda, 0xec, 0x9a, 0xfd, 0xbb, 0xd4, 0x35, 0xdb,
+ 0x87, 0xca, 0x1e, 0x46, 0x8e, 0x75, 0x27, 0x39, 0x30, 0x45, 0x8a, 0xbc, 0x09, 0xb3, 0x86, 0xbe,
+ 0x4a, 0x5d, 0x26, 0xb7, 0x95, 0xd3, 0x25, 0xe1, 0x45, 0xb5, 0x71, 0x75, 0x25, 0x14, 0xc7, 0x18,
+ 0x18, 0xd9, 0x05, 0x30, 0x42, 0xe8, 0xdc, 0x69, 0xa0, 0xe5, 0xbd, 0xe3, 0x10, 0x38, 0x02, 0x44,
+ 0x10, 0xca, 0x5d, 0xce, 0x2a, 0x50, 0xf3, 0xa7, 0x41, 0x15, 0x93, 0xf2, 0xb6, 0x2f, 0x8b, 0x21,
+ 0x8c, 0x36, 0xcc, 0x42, 0xe8, 0x98, 0x13, 0x0f, 0x8a, 0x2d, 0x71, 0xc3, 0x52, 0x2d, 0x8b, 0xc9,
+ 0x03, 0x9c, 0xf8, 0x6d, 0xff, 0x3a, 0x39, 0x1a, 0x56, 0x13, 0xff, 0x00, 0x80, 0x4a, 0x15, 0xe9,
+ 0x40, 0xee, 0x6d, 0x67, 0x6f, 0xea, 0x55, 0x11, 0xa9, 0xd5, 0x4b, 0x6f, 0x36, 0xd2, 0x80, 0x5c,
+ 0x03, 0x7f, 0x3b, 0xe9, 0x07, 0x4f, 0x9d, 0xfb, 0x91, 0xbe, 0x75, 0xfc, 0xed, 0xe2, 0x6d, 0xa8,
+ 0x54, 0x71, 0xbb, 0x93, 0xdb, 0x5d, 0x5b, 0xe7, 0x91, 0x55, 0x50, 0x23, 0x57, 0xa3, 0x5b, 0x9f,
+ 0x3e, 0x79, 0x2e, 0xbf, 0x6c, 0xf0, 0x88, 0xa1, 0x0e, 0xb2, 0x0f, 0x33, 0x7b, 0x03, 0xd3, 0x62,
+ 0xa6, 0x3d, 0xf5, 0x89, 0x0c, 0xff, 0x52, 0xb2, 0x2a, 0x25, 0x4b, 0x54, 0xf4, 0xe1, 0x49, 0x07,
+ 0x66, 0x3a, 0xf2, 0x88, 0xb4, 0x1a, 0xd8, 0x57, 0x26, 0xb7, 0xa6, 0x12, 0x47, 0x2a, 0x52, 0x0f,
+ 0xe8, 0xa3, 0x6b, 0xdf, 0x04, 0x65, 0xd5, 0x79, 0x70, 0xfc, 0x38, 0x46, 0x33, 0x08, 0x8e, 0xd3,
+ 0x46, 0x54, 0xfb, 0xdb, 0x2c, 0x14, 0xd5, 0x3f, 0x7b, 0x3d, 0xfe, 0x8c, 0x28, 0x8d, 0x65, 0x44,
+ 0x57, 0xa7, 0x9c, 0xaa, 0x63, 0xf3, 0xa1, 0xbd, 0x44, 0x3e, 0x74, 0xda, 0x3f, 0x54, 0x7a, 0x44,
+ 0x36, 0xf4, 0x1f, 0x33, 0xa0, 0x16, 0xca, 0xa6, 0xed, 0x31, 0xdd, 0x36, 0xc4, 0x5f, 0xa0, 0xa9,
+ 0x55, 0x39, 0x6d, 0xb8, 0xaf, 0x52, 0x53, 0x62, 0xf7, 0x97, 0xbf, 0xfd, 0x55, 0xc8, 0x1d, 0xe8,
+ 0x7d, 0xc7, 0x63, 0xe2, 0x92, 0x7f, 0x36, 0xee, 0x78, 0xbf, 0xaa, 0xda, 0x31, 0xe0, 0x48, 0x7a,
+ 0xf4, 0x85, 0xf1, 0x1e, 0xbd, 0xf6, 0x67, 0x19, 0x98, 0x8d, 0xfe, 0x95, 0xd4, 0xe4, 0xc9, 0xdd,
+ 0x44, 0x6e, 0x35, 0xfb, 0x18, 0x72, 0xab, 0x1f, 0x66, 0x00, 0xfc, 0xce, 0x3e, 0xf6, 0xcc, 0x6a,
+ 0x2b, 0x9e, 0x59, 0x9d, 0xfa, 0xb3, 0xa6, 0xe7, 0x55, 0xff, 0x2a, 0xef, 0xbf, 0x92, 0xc8, 0xaa,
+ 0xbe, 0x97, 0x81, 0x73, 0x7a, 0x2c, 0x53, 0x39, 0xf5, 0x4e, 0x96, 0x48, 0x7c, 0x06, 0x7f, 0xbd,
+ 0x15, 0x6f, 0xc7, 0x84, 0x5a, 0x72, 0x03, 0x66, 0xfb, 0x2a, 0x7d, 0x74, 0x27, 0x9c, 0x75, 0xc1,
+ 0x61, 0xb5, 0x46, 0x84, 0x86, 0x31, 0xce, 0x47, 0x64, 0x86, 0x73, 0x67, 0x92, 0x19, 0x8e, 0xd6,
+ 0xfc, 0xf3, 0xc7, 0xd6, 0xfc, 0x6d, 0x28, 0xb7, 0x5d, 0xa7, 0x27, 0x92, 0xaf, 0xea, 0x1f, 0x9e,
+ 0xa6, 0x4c, 0xe8, 0x06, 0x46, 0x76, 0xdd, 0xc7, 0xc5, 0x50, 0x05, 0xdf, 0xb6, 0x98, 0x23, 0xb5,
+ 0x15, 0xcf, 0x42, 0x5b, 0xb0, 0x74, 0x77, 0x24, 0x2a, 0xfa, 0xf0, 0xda, 0xbf, 0x64, 0xfd, 0xa5,
+ 0xdb, 0x4c, 0x1c, 0x25, 0xcf, 0x8c, 0x39, 0x4a, 0xae, 0x2e, 0x45, 0x45, 0xb3, 0x81, 0x2f, 0x40,
+ 0xd1, 0xa5, 0xba, 0xe7, 0xd8, 0xea, 0x7a, 0x61, 0x60, 0xf8, 0x50, 0xb4, 0xa2, 0xa2, 0x46, 0xb3,
+ 0x86, 0xd9, 0x47, 0x64, 0x0d, 0x3f, 0x17, 0xf9, 0x36, 0xb2, 0x3c, 0x13, 0x2c, 0xb3, 0x94, 0xef,
+ 0x23, 0x52, 0x0a, 0xea, 0x2f, 0x58, 0x0b, 0xc9, 0x94, 0x82, 0xfa, 0x7b, 0xd4, 0x80, 0x83, 0xb4,
+ 0x60, 0xd6, 0xd2, 0x3d, 0x26, 0xc2, 0xc7, 0xd6, 0x0a, 0x9b, 0x20, 0x25, 0x19, 0xcc, 0xe0, 0xad,
+ 0x08, 0x0e, 0xc6, 0x50, 0xb5, 0x61, 0x0e, 0x12, 0xee, 0xd0, 0xff, 0x9f, 0x9e, 0x3c, 0xb3, 0x3f,
+ 0x71, 0xca, 0x3d, 0x01, 0x7f, 0xe2, 0xf4, 0x9d, 0x0c, 0x84, 0xf5, 0x83, 0x53, 0x66, 0xa7, 0x5e,
+ 0x87, 0x52, 0x4f, 0x7f, 0xb0, 0x46, 0x2d, 0xfd, 0x70, 0x9a, 0xbf, 0x92, 0xd9, 0x56, 0x18, 0x18,
+ 0xa0, 0x69, 0x0e, 0xa8, 0x8b, 0x74, 0x3c, 0xd4, 0x6e, 0x9b, 0x0f, 0x54, 0x77, 0xa6, 0x09, 0x2a,
+ 0x22, 0xff, 0x5d, 0x24, 0x43, 0x6d, 0xd1, 0x80, 0x12, 0xbd, 0x5e, 0xfb, 0xe0, 0xe3, 0xc5, 0xa7,
+ 0x3e, 0xfc, 0x78, 0xf1, 0xa9, 0x8f, 0x3e, 0x5e, 0x7c, 0xea, 0xb7, 0x8f, 0x16, 0x33, 0x1f, 0x1c,
+ 0x2d, 0x66, 0x3e, 0x3c, 0x5a, 0xcc, 0x7c, 0x74, 0xb4, 0x98, 0xf9, 0xb7, 0xa3, 0xc5, 0xcc, 0xef,
+ 0xff, 0xfb, 0xe2, 0x53, 0x6f, 0x94, 0x7c, 0xb4, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x62, 0x56,
+ 0xd4, 0xb6, 0x63, 0x5b, 0x00, 0x00,
}
func (m *AbstractPodTemplate) Marshal() (dAtA []byte, err error) {
@@ -5305,6 +5336,18 @@ func (m *Templates) MarshalToSizedBuffer(dAtA []byte) (int, error) {
_ = i
var l int
_ = l
+ if m.VertexTemplate != nil {
+ {
+ size, err := m.VertexTemplate.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
+ }
if m.JobTemplate != nil {
{
size, err := m.JobTemplate.MarshalToSizedBuffer(dAtA[:i])
@@ -5739,6 +5782,63 @@ func (m *VertexStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) {
return len(dAtA) - i, nil
}
+func (m *VertexTemplate) Marshal() (dAtA []byte, err error) {
+ size := m.Size()
+ dAtA = make([]byte, size)
+ n, err := m.MarshalToSizedBuffer(dAtA[:size])
+ if err != nil {
+ return nil, err
+ }
+ return dAtA[:n], nil
+}
+
+func (m *VertexTemplate) MarshalTo(dAtA []byte) (int, error) {
+ size := m.Size()
+ return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *VertexTemplate) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+ i := len(dAtA)
+ _ = i
+ var l int
+ _ = l
+ if m.InitContainerTemplate != nil {
+ {
+ size, err := m.InitContainerTemplate.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x1a
+ }
+ if m.ContainerTemplate != nil {
+ {
+ size, err := m.ContainerTemplate.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0x12
+ }
+ {
+ size, err := m.AbstractPodTemplate.MarshalToSizedBuffer(dAtA[:i])
+ if err != nil {
+ return 0, err
+ }
+ i -= size
+ i = encodeVarintGenerated(dAtA, i, uint64(size))
+ }
+ i--
+ dAtA[i] = 0xa
+ return len(dAtA) - i, nil
+}
+
func (m *Watermark) Marshal() (dAtA []byte, err error) {
size := m.Size()
dAtA = make([]byte, size)
@@ -7001,6 +7101,10 @@ func (m *Templates) Size() (n int) {
l = m.JobTemplate.Size()
n += 1 + l + sovGenerated(uint64(l))
}
+ if m.VertexTemplate != nil {
+ l = m.VertexTemplate.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
return n
}
@@ -7150,6 +7254,25 @@ func (m *VertexStatus) Size() (n int) {
return n
}
+func (m *VertexTemplate) Size() (n int) {
+ if m == nil {
+ return 0
+ }
+ var l int
+ _ = l
+ l = m.AbstractPodTemplate.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ if m.ContainerTemplate != nil {
+ l = m.ContainerTemplate.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ if m.InitContainerTemplate != nil {
+ l = m.InitContainerTemplate.Size()
+ n += 1 + l + sovGenerated(uint64(l))
+ }
+ return n
+}
+
func (m *Watermark) Size() (n int) {
if m == nil {
return 0
@@ -8019,6 +8142,7 @@ func (this *Templates) String() string {
s := strings.Join([]string{`&Templates{`,
`DaemonTemplate:` + strings.Replace(this.DaemonTemplate.String(), "DaemonTemplate", "DaemonTemplate", 1) + `,`,
`JobTemplate:` + strings.Replace(this.JobTemplate.String(), "JobTemplate", "JobTemplate", 1) + `,`,
+ `VertexTemplate:` + strings.Replace(this.VertexTemplate.String(), "VertexTemplate", "VertexTemplate", 1) + `,`,
`}`,
}, "")
return s
@@ -8136,6 +8260,18 @@ func (this *VertexStatus) String() string {
}, "")
return s
}
+func (this *VertexTemplate) String() string {
+ if this == nil {
+ return "nil"
+ }
+ s := strings.Join([]string{`&VertexTemplate{`,
+ `AbstractPodTemplate:` + strings.Replace(strings.Replace(this.AbstractPodTemplate.String(), "AbstractPodTemplate", "AbstractPodTemplate", 1), `&`, ``, 1) + `,`,
+ `ContainerTemplate:` + strings.Replace(this.ContainerTemplate.String(), "ContainerTemplate", "ContainerTemplate", 1) + `,`,
+ `InitContainerTemplate:` + strings.Replace(this.InitContainerTemplate.String(), "ContainerTemplate", "ContainerTemplate", 1) + `,`,
+ `}`,
+ }, "")
+ return s
+}
func (this *Watermark) String() string {
if this == nil {
return "nil"
@@ -18310,6 +18446,42 @@ func (m *Templates) Unmarshal(dAtA []byte) error {
return err
}
iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field VertexTemplate", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.VertexTemplate == nil {
+ m.VertexTemplate = &VertexTemplate{}
+ }
+ if err := m.VertexTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
default:
iNdEx = preIndex
skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -19546,6 +19718,161 @@ func (m *VertexStatus) Unmarshal(dAtA []byte) error {
}
return nil
}
+func (m *VertexTemplate) Unmarshal(dAtA []byte) error {
+ l := len(dAtA)
+ iNdEx := 0
+ for iNdEx < l {
+ preIndex := iNdEx
+ var wire uint64
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ wire |= uint64(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ fieldNum := int32(wire >> 3)
+ wireType := int(wire & 0x7)
+ if wireType == 4 {
+ return fmt.Errorf("proto: VertexTemplate: wiretype end group for non-group")
+ }
+ if fieldNum <= 0 {
+ return fmt.Errorf("proto: VertexTemplate: illegal tag %d (wire type %d)", fieldNum, wire)
+ }
+ switch fieldNum {
+ case 1:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field AbstractPodTemplate", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if err := m.AbstractPodTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 2:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field ContainerTemplate", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.ContainerTemplate == nil {
+ m.ContainerTemplate = &ContainerTemplate{}
+ }
+ if err := m.ContainerTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ case 3:
+ if wireType != 2 {
+ return fmt.Errorf("proto: wrong wireType = %d for field InitContainerTemplate", wireType)
+ }
+ var msglen int
+ for shift := uint(0); ; shift += 7 {
+ if shift >= 64 {
+ return ErrIntOverflowGenerated
+ }
+ if iNdEx >= l {
+ return io.ErrUnexpectedEOF
+ }
+ b := dAtA[iNdEx]
+ iNdEx++
+ msglen |= int(b&0x7F) << shift
+ if b < 0x80 {
+ break
+ }
+ }
+ if msglen < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ postIndex := iNdEx + msglen
+ if postIndex < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if postIndex > l {
+ return io.ErrUnexpectedEOF
+ }
+ if m.InitContainerTemplate == nil {
+ m.InitContainerTemplate = &ContainerTemplate{}
+ }
+ if err := m.InitContainerTemplate.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+ return err
+ }
+ iNdEx = postIndex
+ default:
+ iNdEx = preIndex
+ skippy, err := skipGenerated(dAtA[iNdEx:])
+ if err != nil {
+ return err
+ }
+ if (skippy < 0) || (iNdEx+skippy) < 0 {
+ return ErrInvalidLengthGenerated
+ }
+ if (iNdEx + skippy) > l {
+ return io.ErrUnexpectedEOF
+ }
+ iNdEx += skippy
+ }
+ }
+
+ if iNdEx > l {
+ return io.ErrUnexpectedEOF
+ }
+ return nil
+}
func (m *Watermark) Unmarshal(dAtA []byte) error {
l := len(dAtA)
iNdEx := 0
diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto
index b0e6c20dbb..03c2e1e7e9 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.proto
+++ b/pkg/apis/numaflow/v1alpha1/generated.proto
@@ -902,6 +902,10 @@ message Templates {
// JobTemplate is used to customize Jobs
// +optional
optional JobTemplate job = 2;
+
+ // VertexTemplate is used to customize Vertices
+ // +optional
+ optional VertexTemplate vertex = 3;
}
message UDF {
@@ -1002,6 +1006,17 @@ message VertexStatus {
optional k8s.io.apimachinery.pkg.apis.meta.v1.Time lastScaledAt = 4;
}
+message VertexTemplate {
+ // +optional
+ optional AbstractPodTemplate abstractPodTemplate = 1;
+
+ // +optional
+ optional ContainerTemplate containerTemplate = 2;
+
+ // +optional
+ optional ContainerTemplate initContainerTemplate = 3;
+}
+
message Watermark {
// Disabled toggles the watermark propagation, defaults to false.
// +kubebuilder:default=false
diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
index f6a2685b7b..682485f93a 100644
--- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go
+++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
@@ -90,6 +90,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexList": schema_pkg_apis_numaflow_v1alpha1_VertexList(ref),
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexSpec": schema_pkg_apis_numaflow_v1alpha1_VertexSpec(ref),
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexStatus": schema_pkg_apis_numaflow_v1alpha1_VertexStatus(ref),
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexTemplate": schema_pkg_apis_numaflow_v1alpha1_VertexTemplate(ref),
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Watermark": schema_pkg_apis_numaflow_v1alpha1_Watermark(ref),
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Window": schema_pkg_apis_numaflow_v1alpha1_Window(ref),
"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.containerBuilder": schema_pkg_apis_numaflow_v1alpha1_containerBuilder(ref),
@@ -2976,11 +2977,17 @@ func schema_pkg_apis_numaflow_v1alpha1_Templates(ref common.ReferenceCallback) c
Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.JobTemplate"),
},
},
+ "vertex": {
+ SchemaProps: spec.SchemaProps{
+ Description: "VertexTemplate is used to customize Vertices",
+ Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexTemplate"),
+ },
+ },
},
},
},
Dependencies: []string{
- "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.DaemonTemplate", "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.JobTemplate"},
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.DaemonTemplate", "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.JobTemplate", "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.VertexTemplate"},
}
}
@@ -3469,6 +3476,119 @@ func schema_pkg_apis_numaflow_v1alpha1_VertexStatus(ref common.ReferenceCallback
}
}
+func schema_pkg_apis_numaflow_v1alpha1_VertexTemplate(ref common.ReferenceCallback) common.OpenAPIDefinition {
+ return common.OpenAPIDefinition{
+ Schema: spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Type: []string{"object"},
+ Properties: map[string]spec.Schema{
+ "metadata": {
+ SchemaProps: spec.SchemaProps{
+ Description: "Metadata sets the pods's metadata, i.e. annotations and labels",
+ Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Metadata"),
+ },
+ },
+ "nodeSelector": {
+ SchemaProps: spec.SchemaProps{
+ Description: "NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/",
+ Type: []string{"object"},
+ AdditionalProperties: &spec.SchemaOrBool{
+ Allows: true,
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: "",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ },
+ },
+ },
+ "tolerations": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If specified, the pod's tolerations.",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/api/core/v1.Toleration"),
+ },
+ },
+ },
+ },
+ },
+ "securityContext": {
+ SchemaProps: spec.SchemaProps{
+ Description: "SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.",
+ Ref: ref("k8s.io/api/core/v1.PodSecurityContext"),
+ },
+ },
+ "imagePullSecrets": {
+ VendorExtensible: spec.VendorExtensible{
+ Extensions: spec.Extensions{
+ "x-kubernetes-patch-merge-key": "name",
+ "x-kubernetes-patch-strategy": "merge",
+ },
+ },
+ SchemaProps: spec.SchemaProps{
+ Description: "ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod",
+ Type: []string{"array"},
+ Items: &spec.SchemaOrArray{
+ Schema: &spec.Schema{
+ SchemaProps: spec.SchemaProps{
+ Default: map[string]interface{}{},
+ Ref: ref("k8s.io/api/core/v1.LocalObjectReference"),
+ },
+ },
+ },
+ },
+ },
+ "priorityClassName": {
+ SchemaProps: spec.SchemaProps{
+ Description: "If specified, indicates the Redis pod's priority. \"system-node-critical\" and \"system-cluster-critical\" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "priority": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The priority value. Various system components use this field to find the priority of the Redis pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. More info: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/",
+ Type: []string{"integer"},
+ Format: "int32",
+ },
+ },
+ "affinity": {
+ SchemaProps: spec.SchemaProps{
+ Description: "The pod's scheduling constraints More info: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/",
+ Ref: ref("k8s.io/api/core/v1.Affinity"),
+ },
+ },
+ "serviceAccountName": {
+ SchemaProps: spec.SchemaProps{
+ Description: "ServiceAccountName applied to the pod",
+ Type: []string{"string"},
+ Format: "",
+ },
+ },
+ "containerTemplate": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.ContainerTemplate"),
+ },
+ },
+ "initContainerTemplate": {
+ SchemaProps: spec.SchemaProps{
+ Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.ContainerTemplate"),
+ },
+ },
+ },
+ },
+ },
+ Dependencies: []string{
+ "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.ContainerTemplate", "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Metadata", "k8s.io/api/core/v1.Affinity", "k8s.io/api/core/v1.LocalObjectReference", "k8s.io/api/core/v1.PodSecurityContext", "k8s.io/api/core/v1.Toleration"},
+ }
+}
+
func schema_pkg_apis_numaflow_v1alpha1_Watermark(ref common.ReferenceCallback) common.OpenAPIDefinition {
return common.OpenAPIDefinition{
Schema: spec.Schema{
diff --git a/pkg/apis/numaflow/v1alpha1/pipeline_types.go b/pkg/apis/numaflow/v1alpha1/pipeline_types.go
index 7f9bb691ca..9fbd7a6c21 100644
--- a/pkg/apis/numaflow/v1alpha1/pipeline_types.go
+++ b/pkg/apis/numaflow/v1alpha1/pipeline_types.go
@@ -28,6 +28,7 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/intstr"
+ "k8s.io/apimachinery/pkg/util/strategicpatch"
"k8s.io/utils/pointer"
)
@@ -408,6 +409,37 @@ type Templates struct {
// JobTemplate is used to customize Jobs
// +optional
JobTemplate *JobTemplate `json:"job,omitempty" protobuf:"bytes,2,opt,name=job"`
+ // VertexTemplate is used to customize Vertices
+ // +optional
+ VertexTemplate *VertexTemplate `json:"vertex,omitempty" protobuf:"bytes,3,opt,name=vertex"`
+}
+
+// UpdateWithDefaultsFrom updates the template by doing a strategic merge patch, defaulting to the templates argument
+func (tpl *Templates) UpdateWithDefaultsFrom(defaultTemplate *Templates) error {
+ if defaultTemplate == nil {
+ return nil
+ }
+ if tpl == nil {
+ *tpl = *defaultTemplate.DeepCopy()
+ return nil
+ }
+ tplBytes, err := json.Marshal(tpl)
+ if err != nil {
+ return err
+ }
+ defaultTemplateBytes, err := json.Marshal(defaultTemplate)
+ if err != nil {
+ return err
+ }
+ updatedBytes, err := strategicpatch.StrategicMergePatch(defaultTemplateBytes, tplBytes, Templates{})
+ if err != nil {
+ return err
+ }
+ err = json.Unmarshal(updatedBytes, tpl)
+ if err != nil {
+ return err
+ }
+ return nil
}
type PipelineLimits struct {
diff --git a/pkg/apis/numaflow/v1alpha1/pipeline_types_test.go b/pkg/apis/numaflow/v1alpha1/pipeline_types_test.go
index fc6b6485ce..4593afb003 100644
--- a/pkg/apis/numaflow/v1alpha1/pipeline_types_test.go
+++ b/pkg/apis/numaflow/v1alpha1/pipeline_types_test.go
@@ -17,11 +17,13 @@ limitations under the License.
package v1alpha1
import (
+ "reflect"
"testing"
"time"
"github.com/stretchr/testify/assert"
corev1 "k8s.io/api/core/v1"
+ "k8s.io/apimachinery/pkg/api/equality"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/utils/pointer"
)
@@ -226,6 +228,66 @@ func TestGetDaemonDeploy(t *testing.T) {
})
}
+func Test_UpdateWithDefaultsFrom(t *testing.T) {
+ var nilTpl Templates
+ tpl := Templates{
+ DaemonTemplate: &DaemonTemplate{
+ AbstractPodTemplate: AbstractPodTemplate{
+ Metadata: &Metadata{
+ Labels: map[string]string{"k": "v"},
+ },
+ },
+ Replicas: pointer.Int32(3),
+ ContainerTemplate: &ContainerTemplate{
+ Env: []corev1.EnvVar{{Name: "n", Value: "v"}},
+ },
+ },
+ }
+ t.Run("both nil", func(t *testing.T) {
+ t1 := nilTpl.DeepCopy()
+ t2 := nilTpl.DeepCopy()
+ err := t1.UpdateWithDefaultsFrom(t2)
+ assert.NoError(t, err)
+ assert.True(t, reflect.DeepEqual(nilTpl, *t1))
+ })
+ t.Run("nil override", func(t *testing.T) {
+ t1 := nilTpl.DeepCopy()
+ t2 := tpl.DeepCopy()
+ err := t1.UpdateWithDefaultsFrom(t2)
+ assert.NoError(t, err)
+ assert.True(t, equality.Semantic.DeepEqual(tpl, *t1))
+ })
+ t.Run("nil source", func(t *testing.T) {
+ t1 := tpl.DeepCopy()
+ t2 := nilTpl.DeepCopy()
+ err := t1.UpdateWithDefaultsFrom(t2)
+ assert.NoError(t, err)
+ assert.True(t, equality.Semantic.DeepEqual(tpl, *t1))
+ })
+ t.Run("both same", func(t *testing.T) {
+ t1 := tpl.DeepCopy()
+ t2 := tpl.DeepCopy()
+ err := t1.UpdateWithDefaultsFrom(t2)
+ assert.NoError(t, err)
+ assert.True(t, equality.Semantic.DeepEqual(tpl, *t1))
+ })
+ t.Run("override and merge", func(t *testing.T) {
+ t1 := tpl.DeepCopy()
+ t2 := tpl.DeepCopy()
+ t1.DaemonTemplate.Metadata.Annotations = map[string]string{"k2": "v2"}
+ t1.DaemonTemplate.Replicas = pointer.Int32(1)
+ t1.DaemonTemplate.ContainerTemplate.Resources = testResources
+ err := t1.UpdateWithDefaultsFrom(t2)
+ assert.NoError(t, err)
+ assert.Equal(t, testResources, t1.DaemonTemplate.ContainerTemplate.Resources)
+ assert.Len(t, t1.DaemonTemplate.ContainerTemplate.Env, 1)
+ assert.Len(t, t1.DaemonTemplate.Metadata.Labels, 1)
+ assert.Len(t, t1.DaemonTemplate.Metadata.Annotations, 1)
+ assert.NotNil(t, t1.DaemonTemplate.Replicas)
+ assert.Equal(t, int32(1), *t1.DaemonTemplate.Replicas)
+ })
+}
+
func Test_PipelineVertexCounts(t *testing.T) {
s := PipelineStatus{}
s.SetVertexCounts(testPipeline.Spec.Vertices)
diff --git a/pkg/apis/numaflow/v1alpha1/vertex_template.go b/pkg/apis/numaflow/v1alpha1/vertex_template.go
new file mode 100644
index 0000000000..72881bcd77
--- /dev/null
+++ b/pkg/apis/numaflow/v1alpha1/vertex_template.go
@@ -0,0 +1,48 @@
+/*
+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 v1alpha1
+
+type VertexTemplate struct {
+ // +optional
+ AbstractPodTemplate `json:",inline" protobuf:"bytes,1,opt,name=abstractPodTemplate"`
+ // +optional
+ ContainerTemplate *ContainerTemplate `json:"containerTemplate,omitempty" protobuf:"bytes,2,opt,name=containerTemplate"`
+ // +optional
+ InitContainerTemplate *ContainerTemplate `json:"initContainerTemplate,omitempty" protobuf:"bytes,3,opt,name=initContainerTemplate"`
+}
+
+// ApplyToAbstractVertex updates the AbstractVertex with the values in the VertexTemplate
+func (vt *VertexTemplate) ApplyToAbstractVertex(av *AbstractVertex) error {
+ vtTemplate := Templates{
+ VertexTemplate: vt,
+ }
+ avTemplate := Templates{
+ VertexTemplate: &VertexTemplate{
+ AbstractPodTemplate: av.AbstractPodTemplate,
+ ContainerTemplate: av.ContainerTemplate,
+ InitContainerTemplate: av.InitContainerTemplate,
+ },
+ }
+ err := avTemplate.UpdateWithDefaultsFrom(&vtTemplate)
+ if err != nil {
+ return err
+ }
+ av.AbstractPodTemplate = avTemplate.VertexTemplate.AbstractPodTemplate
+ av.ContainerTemplate = avTemplate.VertexTemplate.ContainerTemplate
+ av.InitContainerTemplate = avTemplate.VertexTemplate.InitContainerTemplate
+ return nil
+}
diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
index 4a48e75fa5..2f65b13dca 100644
--- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
@@ -1542,6 +1542,11 @@ func (in *Templates) DeepCopyInto(out *Templates) {
*out = new(JobTemplate)
(*in).DeepCopyInto(*out)
}
+ if in.VertexTemplate != nil {
+ in, out := &in.VertexTemplate, &out.VertexTemplate
+ *out = new(VertexTemplate)
+ (*in).DeepCopyInto(*out)
+ }
return
}
@@ -1764,6 +1769,33 @@ func (in *VertexStatus) DeepCopy() *VertexStatus {
return out
}
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *VertexTemplate) DeepCopyInto(out *VertexTemplate) {
+ *out = *in
+ in.AbstractPodTemplate.DeepCopyInto(&out.AbstractPodTemplate)
+ if in.ContainerTemplate != nil {
+ in, out := &in.ContainerTemplate, &out.ContainerTemplate
+ *out = new(ContainerTemplate)
+ (*in).DeepCopyInto(*out)
+ }
+ if in.InitContainerTemplate != nil {
+ in, out := &in.InitContainerTemplate, &out.InitContainerTemplate
+ *out = new(ContainerTemplate)
+ (*in).DeepCopyInto(*out)
+ }
+ return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new VertexTemplate.
+func (in *VertexTemplate) DeepCopy() *VertexTemplate {
+ if in == nil {
+ return nil
+ }
+ out := new(VertexTemplate)
+ in.DeepCopyInto(out)
+ return out
+}
+
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
func (in *Watermark) DeepCopyInto(out *Watermark) {
*out = *in
diff --git a/pkg/reconciler/cmd/start.go b/pkg/reconciler/cmd/start.go
index 3279682178..79b23ba47c 100644
--- a/pkg/reconciler/cmd/start.go
+++ b/pkg/reconciler/cmd/start.go
@@ -43,11 +43,18 @@ import (
func Start(namespaced bool, managedNamespace string) {
logger := logging.NewLogger().Named("controller-manager")
config, err := reconciler.LoadConfig(func(err error) {
- logger.Errorf("Failed to reload global configuration file", zap.Error(err))
+ logger.Errorw("Failed to reload global configuration file", zap.Error(err))
})
if err != nil {
logger.Fatalw("Failed to load global configuration file", zap.Error(err))
}
+ pipelineTemplates, err := reconciler.LoadPipelineTemplates()
+ if err != nil {
+ logger.Fatalw("Failed to load pipeline templates file", zap.Error(err))
+ }
+ if pipelineTemplates != nil {
+ logger.Info("Successfully loaded pipeline templates file")
+ }
image := sharedutil.LookupEnvStringOr(dfv1.EnvImage, "")
if image == "" {
@@ -115,7 +122,7 @@ func Start(namespaced bool, managedNamespace string) {
// Pipeline controller
pipelineController, err := controller.New(dfv1.ControllerPipeline, mgr, controller.Options{
- Reconciler: plctrl.NewReconciler(mgr.GetClient(), mgr.GetScheme(), config, image, logger),
+ Reconciler: plctrl.NewReconciler(mgr.GetClient(), mgr.GetScheme(), config, pipelineTemplates, image, logger),
})
if err != nil {
logger.Fatalw("Unable to set up Pipeline controller", zap.Error(err))
diff --git a/pkg/reconciler/pipeline/controller.go b/pkg/reconciler/pipeline/controller.go
index bc84f9eafe..7e13c73572 100644
--- a/pkg/reconciler/pipeline/controller.go
+++ b/pkg/reconciler/pipeline/controller.go
@@ -55,13 +55,14 @@ type pipelineReconciler struct {
client client.Client
scheme *runtime.Scheme
- config *reconciler.GlobalConfig
- image string
- logger *zap.SugaredLogger
+ config *reconciler.GlobalConfig
+ templates *dfv1.Templates
+ image string
+ logger *zap.SugaredLogger
}
-func NewReconciler(client client.Client, scheme *runtime.Scheme, config *reconciler.GlobalConfig, image string, logger *zap.SugaredLogger) reconcile.Reconciler {
- return &pipelineReconciler{client: client, scheme: scheme, config: config, image: image, logger: logger}
+func NewReconciler(client client.Client, scheme *runtime.Scheme, config *reconciler.GlobalConfig, templates *dfv1.Templates, image string, logger *zap.SugaredLogger) reconcile.Reconciler {
+ return &pipelineReconciler{client: client, scheme: scheme, config: config, templates: templates, image: image, logger: logger}
}
func (r *pipelineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
@@ -76,11 +77,16 @@ func (r *pipelineReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
log := r.logger.With("namespace", pl.Namespace).With("pipeline", pl.Name)
plCopy := pl.DeepCopy()
ctx = logging.WithLogger(ctx, log)
+ if err := plCopy.Spec.Templates.UpdateWithDefaultsFrom(r.templates); err != nil {
+ r.logger.Errorw("Unable to create merged pipeline templates", err)
+ return ctrl.Result{}, err
+ }
result, reconcileErr := r.reconcile(ctx, plCopy)
if reconcileErr != nil {
log.Errorw("Reconcile error", zap.Error(reconcileErr))
}
+ plCopy.Spec.Templates = pl.Spec.Templates.DeepCopy()
plCopy.Status.LastUpdated = metav1.Now()
if needsUpdate(pl, plCopy) {
if err := r.client.Update(ctx, plCopy); err != nil {
@@ -207,7 +213,10 @@ func (r *pipelineReconciler) reconcileNonLifecycleChanges(ctx context.Context, p
newBuffers[b.Name] = b
}
}
- newObjs := buildVertices(pl)
+ newObjs, err := buildVertices(pl)
+ if err != nil {
+ return ctrl.Result{}, fmt.Errorf("failed to build vertices, err: %w", err)
+ }
for vertexName, newObj := range newObjs {
if oldObj, existing := existingObjs[vertexName]; !existing {
if err := r.client.Create(ctx, &newObj); err != nil {
@@ -417,7 +426,7 @@ func needsUpdate(old, new *dfv1.Pipeline) bool {
return false
}
-func buildVertices(pl *dfv1.Pipeline) map[string]dfv1.Vertex {
+func buildVertices(pl *dfv1.Pipeline) (map[string]dfv1.Vertex, error) {
result := make(map[string]dfv1.Vertex)
for _, v := range pl.Spec.Vertices {
vertexFullName := pl.Name + "-" + v.Name
@@ -444,6 +453,11 @@ func buildVertices(pl *dfv1.Pipeline) map[string]dfv1.Vertex {
replicas = *x.Max
}
}
+ if pl.Spec.Templates != nil && pl.Spec.Templates.VertexTemplate != nil {
+ if err := pl.Spec.Templates.VertexTemplate.ApplyToAbstractVertex(vCopy); err != nil {
+ return nil, err
+ }
+ }
spec := dfv1.VertexSpec{
AbstractVertex: *vCopy,
PipelineName: pl.Name,
@@ -469,7 +483,7 @@ func buildVertices(pl *dfv1.Pipeline) map[string]dfv1.Vertex {
}
result[obj.Name] = obj
}
- return result
+ return result, nil
}
func copyVertexLimits(pl *dfv1.Pipeline, v *dfv1.AbstractVertex) {
diff --git a/pkg/reconciler/pipeline/controller_test.go b/pkg/reconciler/pipeline/controller_test.go
index f70841d830..b3e5ebdd87 100644
--- a/pkg/reconciler/pipeline/controller_test.go
+++ b/pkg/reconciler/pipeline/controller_test.go
@@ -107,7 +107,7 @@ func init() {
func Test_NewReconciler(t *testing.T) {
cl := fake.NewClientBuilder().Build()
- r := NewReconciler(cl, scheme.Scheme, fakeConfig, testFlowImage, zaptest.NewLogger(t).Sugar())
+ r := NewReconciler(cl, scheme.Scheme, fakeConfig, nil, testFlowImage, zaptest.NewLogger(t).Sugar())
_, ok := r.(*pipelineReconciler)
assert.True(t, ok)
}
@@ -144,10 +144,46 @@ func Test_reconcile(t *testing.T) {
}
func Test_buildVertices(t *testing.T) {
- r := buildVertices(testPipeline)
- assert.Equal(t, 3, len(r))
- _, existing := r[testPipeline.Name+"-"+testPipeline.Spec.Vertices[0].Name]
- assert.True(t, existing)
+ t.Run("test build vertices", func(t *testing.T) {
+ r, err := buildVertices(testPipeline)
+ assert.NoError(t, err)
+ assert.Equal(t, 3, len(r))
+ _, existing := r[testPipeline.Name+"-"+testPipeline.Spec.Vertices[0].Name]
+ assert.True(t, existing)
+ })
+ t.Run("test build vertices with vertex template", func(t *testing.T) {
+ req := corev1.ResourceRequirements{
+ Limits: corev1.ResourceList{
+ "memory": resource.MustParse("256Mi"),
+ },
+ }
+ pl := testPipeline.DeepCopy()
+ pl.Spec.Vertices[0].ContainerTemplate = &dfv1.ContainerTemplate{
+ Resources: corev1.ResourceRequirements{
+ Limits: corev1.ResourceList{
+ "cpu": resource.MustParse("100m"),
+ },
+ },
+ }
+ pl.Spec.Templates = &dfv1.Templates{
+ VertexTemplate: &dfv1.VertexTemplate{
+ ContainerTemplate: &dfv1.ContainerTemplate{
+ Resources: req,
+ },
+ },
+ }
+ r, err := buildVertices(pl)
+ assert.NoError(t, err)
+ assert.Equal(t, 3, len(r))
+ r0, existing := r[pl.Name+"-"+pl.Spec.Vertices[0].Name]
+ assert.True(t, existing)
+ r1, existing := r[pl.Name+"-"+pl.Spec.Vertices[1].Name]
+ assert.True(t, existing)
+ assert.NotNil(t, r0.Spec.ContainerTemplate)
+ assert.NotNil(t, r1.Spec.ContainerTemplate)
+ assert.NotEqual(t, req, r0.Spec.ContainerTemplate.Resources)
+ assert.Equal(t, req, r1.Spec.ContainerTemplate.Resources)
+ })
}
func Test_copyVertexLimits(t *testing.T) {
diff --git a/pkg/reconciler/pipeline_templates.go b/pkg/reconciler/pipeline_templates.go
new file mode 100644
index 0000000000..d3c1733c3d
--- /dev/null
+++ b/pkg/reconciler/pipeline_templates.go
@@ -0,0 +1,42 @@
+/*
+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 reconciler
+
+import (
+ "bytes"
+ "fmt"
+ "os"
+
+ "k8s.io/apimachinery/pkg/util/yaml"
+
+ dfv1 "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1"
+)
+
+func LoadPipelineTemplates() (*dfv1.Templates, error) {
+ tplBytes, err := os.ReadFile("/etc/numaflow/pipeline-templates.yaml")
+ if err != nil {
+ if os.IsNotExist(err) {
+ return nil, nil
+ }
+ return nil, fmt.Errorf("failed to load pipeline templates file. %w", err)
+ }
+ tpl := &dfv1.Templates{}
+ if err = yaml.NewYAMLToJSONDecoder(bytes.NewReader(tplBytes)).Decode(tpl); err != nil {
+ return nil, fmt.Errorf("failed to parse pipeline templates file. %w", err)
+ }
+ return tpl, nil
+}