diff --git a/api/jsonschema/schema.json b/api/jsonschema/schema.json index dc42d1f406ca..6d46c91c8d71 100644 --- a/api/jsonschema/schema.json +++ b/api/jsonschema/schema.json @@ -6157,6 +6157,9 @@ }, "phase": { "type": "string" + }, + "progress": { + "type": "string" } }, "type": "object" diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json index 258cfa58599a..9db9cbab2387 100644 --- a/api/openapi-spec/swagger.json +++ b/api/openapi-spec/swagger.json @@ -10420,6 +10420,9 @@ }, "phase": { "type": "string" + }, + "progress": { + "type": "string" } } }, diff --git a/cmd/argoexec/commands/root.go b/cmd/argoexec/commands/root.go index f33867afab14..f6bcba54927a 100644 --- a/cmd/argoexec/commands/root.go +++ b/cmd/argoexec/commands/root.go @@ -10,12 +10,14 @@ import ( kubecli "github.com/argoproj/pkg/kube/cli" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "github.com/argoproj/argo-workflows/v3" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned" "github.com/argoproj/argo-workflows/v3/util" "github.com/argoproj/argo-workflows/v3/util/cmd" "github.com/argoproj/argo-workflows/v3/util/logs" @@ -125,7 +127,22 @@ func initExecutor() *executor.WorkflowExecutor { } checkErr(err) - wfExecutor := executor.NewExecutor(clientset, restClient, podName, namespace, cre, *tmpl, includeScriptOutput, deadline, annotationPatchTickDuration, progressFileTickDuration) + wfExecutor := executor.NewExecutor( + clientset, + versioned.NewForConfigOrDie(config).ArgoprojV1alpha1().WorkflowTaskResults(namespace), + restClient, + podName, + os.Getenv(common.EnvVarWorkflowName), + os.Getenv(common.EnvVarNodeID), + namespace, + types.UID(os.Getenv(common.EnvVarWorkflowUID)), + cre, + *tmpl, + includeScriptOutput, + deadline, + annotationPatchTickDuration, + progressFileTickDuration, + ) log. WithField("version", version.String()). diff --git a/cmd/argoexec/commands/wait.go b/cmd/argoexec/commands/wait.go index 045580e060d4..075c4a1ab2fc 100644 --- a/cmd/argoexec/commands/wait.go +++ b/cmd/argoexec/commands/wait.go @@ -62,7 +62,7 @@ func waitContainer(ctx context.Context) error { wfExecutor.AddError(err) } // Annotating pod with output - err = wfExecutor.AnnotateOutputs(ctx, logArt) + err = wfExecutor.ReportOutputs(ctx, logArt) if err != nil { wfExecutor.AddError(err) } diff --git a/docs/workflow-rbac.md b/docs/workflow-rbac.md index d48634b3ee18..672c24d15146 100644 --- a/docs/workflow-rbac.md +++ b/docs/workflow-rbac.md @@ -10,6 +10,25 @@ permissions added to it you do not want. Instead, create a service account only The minimum for the executor to function: +For >= v3.4: + +```yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: executor +rules: + - apiGroups: + - argoproj.io + resources: + - workflowtaskresult + verbs: + - create + - patch +``` + +For <= v3.3 use. + ```yaml apiVersion: rbac.authorization.k8s.io/v1 kind: Role @@ -25,6 +44,8 @@ rules: - patch ``` +Warning: For many organisations, it may not be acceptable to give a workflow the `pod patch` permission, see [#3961](https://github.com/argoproj/argo-workflows/issues/3961) + If you are not using the emissary, you'll need additional permissions. See [executor](https://github.com/argoproj/argo-workflows/tree/master/manifests/quick-start/base/executor) for suitable permissions. diff --git a/hack/crds.go b/hack/crds.go index 618866669862..223fcd1448f8 100644 --- a/hack/crds.go +++ b/hack/crds.go @@ -35,12 +35,6 @@ func cleanCRD(filename string) { properties := schema["properties"].(obj)["spec"].(obj)["properties"].(obj)["templates"].(obj)["items"].(obj)["properties"] properties.(obj)["container"].(obj)["required"] = []string{"image"} properties.(obj)["script"].(obj)["required"] = []string{"image", "source"} - case "workfloweventbindings.argoproj.io": - // noop - case "workflowtasksets.argoproj.io": - // noop - default: - panic(name) } data, err = yaml.Marshal(crd) if err != nil { diff --git a/manifests/base/crds/full/argoproj.io_workflowtaskresults.yaml b/manifests/base/crds/full/argoproj.io_workflowtaskresults.yaml new file mode 100644 index 000000000000..4b3409e40930 --- /dev/null +++ b/manifests/base/crds/full/argoproj.io_workflowtaskresults.yaml @@ -0,0 +1,426 @@ +# This is an auto-generated file. DO NOT EDIT +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true diff --git a/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml b/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml index 4c94fe880b8e..cdb321b1a600 100644 --- a/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml +++ b/manifests/base/crds/full/argoproj.io_workflowtasksets.yaml @@ -7089,6 +7089,8 @@ spec: type: object phase: type: string + progress: + type: string type: object type: object type: object diff --git a/manifests/base/crds/full/kustomization.yaml b/manifests/base/crds/full/kustomization.yaml index 5be775734758..a59214c5bb7d 100644 --- a/manifests/base/crds/full/kustomization.yaml +++ b/manifests/base/crds/full/kustomization.yaml @@ -8,3 +8,4 @@ resources: - argoproj.io_workflowtemplates.yaml - argoproj.io_workfloweventbindings.yaml - argoproj.io_workflowtasksets.yaml +- argoproj.io_workflowtaskresults.yaml diff --git a/manifests/base/crds/minimal/argoproj.io_workflowtaskresults.yaml b/manifests/base/crds/minimal/argoproj.io_workflowtaskresults.yaml new file mode 100644 index 000000000000..84d60f3e7ea6 --- /dev/null +++ b/manifests/base/crds/minimal/argoproj.io_workflowtaskresults.yaml @@ -0,0 +1,425 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true diff --git a/manifests/base/crds/minimal/kustomization.yaml b/manifests/base/crds/minimal/kustomization.yaml index 5be775734758..a59214c5bb7d 100644 --- a/manifests/base/crds/minimal/kustomization.yaml +++ b/manifests/base/crds/minimal/kustomization.yaml @@ -8,3 +8,4 @@ resources: - argoproj.io_workflowtemplates.yaml - argoproj.io_workfloweventbindings.yaml - argoproj.io_workflowtasksets.yaml +- argoproj.io_workflowtaskresults.yaml diff --git a/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml b/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml index cd7b150236e9..3d6b5a39539d 100644 --- a/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml +++ b/manifests/cluster-install/workflow-controller-rbac/workflow-controller-clusterrole.yaml @@ -60,6 +60,14 @@ rules: - get - list - watch +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection - apiGroups: - "" resources: diff --git a/manifests/install.yaml b/manifests/install.yaml index 6eb946ab1f2b..16b38e506c2d 100644 --- a/manifests/install.yaml +++ b/manifests/install.yaml @@ -166,6 +166,432 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: name: workflowtasksets.argoproj.io spec: @@ -421,6 +847,14 @@ rules: - get - list - watch +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection - apiGroups: - "" resources: diff --git a/manifests/namespace-install.yaml b/manifests/namespace-install.yaml index c6d51dff64c4..e95dc825c390 100644 --- a/manifests/namespace-install.yaml +++ b/manifests/namespace-install.yaml @@ -166,6 +166,432 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: name: workflowtasksets.argoproj.io spec: @@ -327,6 +753,21 @@ rules: verbs: - get - list +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get + - list - apiGroups: - "" resources: diff --git a/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml b/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml index 0e85191a3c6e..c467ae17fbed 100644 --- a/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml +++ b/manifests/namespace-install/workflow-controller-rbac/workflow-controller-role.yaml @@ -73,6 +73,21 @@ rules: verbs: - get - list + - apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection + - apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get + - list - apiGroups: - "" resources: diff --git a/manifests/quick-start-minimal.yaml b/manifests/quick-start-minimal.yaml index baa5ce4e723c..313025ca3cbd 100644 --- a/manifests/quick-start-minimal.yaml +++ b/manifests/quick-start-minimal.yaml @@ -166,6 +166,432 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: name: workflowtasksets.argoproj.io spec: @@ -356,6 +782,21 @@ rules: verbs: - get - list +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get + - list - apiGroups: - "" resources: @@ -467,10 +908,11 @@ metadata: name: executor rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: + - create - patch --- apiVersion: rbac.authorization.k8s.io/v1 @@ -489,6 +931,7 @@ rules: verbs: - create - get + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/manifests/quick-start-mysql.yaml b/manifests/quick-start-mysql.yaml index b94b85b0f868..ae14889b42bf 100644 --- a/manifests/quick-start-mysql.yaml +++ b/manifests/quick-start-mysql.yaml @@ -166,6 +166,432 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: name: workflowtasksets.argoproj.io spec: @@ -356,6 +782,21 @@ rules: verbs: - get - list +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get + - list - apiGroups: - "" resources: @@ -467,10 +908,11 @@ metadata: name: executor rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: + - create - patch --- apiVersion: rbac.authorization.k8s.io/v1 @@ -489,6 +931,7 @@ rules: verbs: - create - get + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/manifests/quick-start-postgres.yaml b/manifests/quick-start-postgres.yaml index 288ad57727d0..6455ad32b139 100644 --- a/manifests/quick-start-postgres.yaml +++ b/manifests/quick-start-postgres.yaml @@ -166,6 +166,432 @@ spec: --- apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition +metadata: + name: workflowtaskresults.argoproj.io +spec: + group: argoproj.io + names: + kind: WorkflowTaskResult + listKind: WorkflowTaskResultList + plural: workflowtaskresults + singular: workflowtaskresult + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + message: + type: string + metadata: + type: object + outputs: + properties: + artifacts: + items: + properties: + archive: + properties: + none: + type: object + tar: + properties: + compressionLevel: + format: int32 + type: integer + type: object + zip: + type: object + type: object + archiveLogs: + type: boolean + artifactory: + properties: + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + url: + type: string + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - url + type: object + from: + type: string + fromExpression: + type: string + gcs: + properties: + bucket: + type: string + key: + type: string + serviceAccountKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - key + type: object + git: + properties: + depth: + format: int64 + type: integer + disableSubmodules: + type: boolean + fetch: + items: + type: string + type: array + insecureIgnoreHostKey: + type: boolean + passwordSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + repo: + type: string + revision: + type: string + sshPrivateKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + usernameSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + required: + - repo + type: object + globalName: + type: string + hdfs: + properties: + addresses: + items: + type: string + type: array + force: + type: boolean + hdfsUser: + type: string + krbCCacheSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbConfigConfigMap: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbKeytabSecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + krbRealm: + type: string + krbServicePrincipalName: + type: string + krbUsername: + type: string + path: + type: string + required: + - path + type: object + http: + properties: + headers: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + url: + type: string + required: + - url + type: object + mode: + format: int32 + type: integer + name: + type: string + optional: + type: boolean + oss: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + type: boolean + endpoint: + type: string + key: + type: string + lifecycleRule: + properties: + markDeletionAfterDays: + format: int32 + type: integer + markInfrequentAccessAfterDays: + format: int32 + type: integer + type: object + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + securityToken: + type: string + required: + - key + type: object + path: + type: string + raw: + properties: + data: + type: string + required: + - data + type: object + recurseMode: + type: boolean + s3: + properties: + accessKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + bucket: + type: string + createBucketIfNotPresent: + properties: + objectLocking: + type: boolean + type: object + encryptionOptions: + properties: + enableEncryption: + type: boolean + kmsEncryptionContext: + type: string + kmsKeyId: + type: string + serverSideCustomerKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + type: object + endpoint: + type: string + insecure: + type: boolean + key: + type: string + region: + type: string + roleARN: + type: string + secretKeySecret: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + useSDKCreds: + type: boolean + type: object + subPath: + type: string + required: + - name + type: object + type: array + exitCode: + type: string + parameters: + items: + properties: + default: + type: string + description: + type: string + enum: + items: + type: string + type: array + globalName: + type: string + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + type: string + optional: + type: boolean + required: + - key + type: object + default: + type: string + event: + type: string + expression: + type: string + jqFilter: + type: string + jsonPath: + type: string + parameter: + type: string + path: + type: string + supplied: + type: object + type: object + required: + - name + type: object + type: array + result: + type: string + type: object + phase: + type: string + progress: + type: string + required: + - metadata + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition metadata: name: workflowtasksets.argoproj.io spec: @@ -356,6 +782,21 @@ rules: verbs: - get - list +- apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - list + - watch + - deletecollection +- apiGroups: + - "" + resources: + - serviceaccounts + verbs: + - get + - list - apiGroups: - "" resources: @@ -467,10 +908,11 @@ metadata: name: executor rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: + - create - patch --- apiVersion: rbac.authorization.k8s.io/v1 @@ -489,6 +931,7 @@ rules: verbs: - create - get + - patch --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role diff --git a/manifests/quick-start/base/executor/docker/executor-role.yaml b/manifests/quick-start/base/executor/docker/executor-role.yaml index 77706a6cce0e..3ee284a9c0d7 100644 --- a/manifests/quick-start/base/executor/docker/executor-role.yaml +++ b/manifests/quick-start/base/executor/docker/executor-role.yaml @@ -9,8 +9,9 @@ metadata: This executor is superseded by the `emmisary` executor, so we do not recommend you use it anymore. rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: + - create - patch diff --git a/manifests/quick-start/base/executor/emissary/executor-role.yaml b/manifests/quick-start/base/executor/emissary/executor-role.yaml index 8f93206cf310..df92fbc93726 100644 --- a/manifests/quick-start/base/executor/emissary/executor-role.yaml +++ b/manifests/quick-start/base/executor/emissary/executor-role.yaml @@ -7,8 +7,9 @@ metadata: Recomended minimum permissions for the `emissary` executor. rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: + - create - patch diff --git a/manifests/quick-start/base/executor/k8sapi/executor-role.yaml b/manifests/quick-start/base/executor/k8sapi/executor-role.yaml index 88c113b2194a..a7c9e2ac4f04 100644 --- a/manifests/quick-start/base/executor/k8sapi/executor-role.yaml +++ b/manifests/quick-start/base/executor/k8sapi/executor-role.yaml @@ -8,13 +8,19 @@ metadata: This executor is superseded by the `emmisary` executor, so we do not recommend you use it anymore. rules: + - apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - create + - patch - apiGroups: - "" resources: - pods verbs: - get - - patch - watch - apiGroups: - "" diff --git a/manifests/quick-start/base/executor/kubelet/executor-role.yaml b/manifests/quick-start/base/executor/kubelet/executor-role.yaml index d3d2e11d3a8f..94ada0b5279e 100644 --- a/manifests/quick-start/base/executor/kubelet/executor-role.yaml +++ b/manifests/quick-start/base/executor/kubelet/executor-role.yaml @@ -9,8 +9,9 @@ metadata: This executor is superseded by the `emmisary` executor, so we do not recommend you use it anymore. rules: - apiGroups: - - "" + - argoproj.io resources: - - pods + - workflowtaskresults verbs: - - patch \ No newline at end of file + - create + - patch diff --git a/manifests/quick-start/base/executor/pns/executor-role.yaml b/manifests/quick-start/base/executor/pns/executor-role.yaml index 392999f5855a..27d506bc5b00 100644 --- a/manifests/quick-start/base/executor/pns/executor-role.yaml +++ b/manifests/quick-start/base/executor/pns/executor-role.yaml @@ -6,12 +6,18 @@ metadata: workflows.argoproj.io/description: | Recomended minimum permissions for `pns` executor. rules: + - apiGroups: + - argoproj.io + resources: + - workflowtaskresults + verbs: + - create + - patch - apiGroups: - "" resources: - pods verbs: - - patch - watch - apiGroups: - "" diff --git a/manifests/quick-start/base/pod-manager-role.yaml b/manifests/quick-start/base/pod-manager-role.yaml index e9196fffad25..7674ff6fe803 100644 --- a/manifests/quick-start/base/pod-manager-role.yaml +++ b/manifests/quick-start/base/pod-manager-role.yaml @@ -13,4 +13,5 @@ rules: - pods verbs: - create - - get \ No newline at end of file + - get + - patch diff --git a/pkg/apis/workflow/register.go b/pkg/apis/workflow/register.go index 3da0cf926ef2..50e3e3b61c5e 100644 --- a/pkg/apis/workflow/register.go +++ b/pkg/apis/workflow/register.go @@ -32,4 +32,5 @@ const ( WorkflowTaskSetPlural string = "workflowtasksets" WorkflowTaskSetShortName string = "wfts" WorkflowTaskSetFullName string = WorkflowTaskSetPlural + "." + Group + WorkflowTaskResultKind string = "WorkflowTaskResult" ) diff --git a/pkg/apis/workflow/v1alpha1/generated.pb.go b/pkg/apis/workflow/v1alpha1/generated.pb.go index f3d35613fba7..5bc97476653a 100644 --- a/pkg/apis/workflow/v1alpha1/generated.pb.go +++ b/pkg/apis/workflow/v1alpha1/generated.pb.go @@ -3284,10 +3284,66 @@ func (m *WorkflowStep) XXX_DiscardUnknown() { var xxx_messageInfo_WorkflowStep proto.InternalMessageInfo +func (m *WorkflowTaskResult) Reset() { *m = WorkflowTaskResult{} } +func (*WorkflowTaskResult) ProtoMessage() {} +func (*WorkflowTaskResult) Descriptor() ([]byte, []int) { + return fileDescriptor_724696e352c3df5f, []int{116} +} +func (m *WorkflowTaskResult) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WorkflowTaskResult) 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 *WorkflowTaskResult) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkflowTaskResult.Merge(m, src) +} +func (m *WorkflowTaskResult) XXX_Size() int { + return m.Size() +} +func (m *WorkflowTaskResult) XXX_DiscardUnknown() { + xxx_messageInfo_WorkflowTaskResult.DiscardUnknown(m) +} + +var xxx_messageInfo_WorkflowTaskResult proto.InternalMessageInfo + +func (m *WorkflowTaskResultList) Reset() { *m = WorkflowTaskResultList{} } +func (*WorkflowTaskResultList) ProtoMessage() {} +func (*WorkflowTaskResultList) Descriptor() ([]byte, []int) { + return fileDescriptor_724696e352c3df5f, []int{117} +} +func (m *WorkflowTaskResultList) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *WorkflowTaskResultList) 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 *WorkflowTaskResultList) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkflowTaskResultList.Merge(m, src) +} +func (m *WorkflowTaskResultList) XXX_Size() int { + return m.Size() +} +func (m *WorkflowTaskResultList) XXX_DiscardUnknown() { + xxx_messageInfo_WorkflowTaskResultList.DiscardUnknown(m) +} + +var xxx_messageInfo_WorkflowTaskResultList proto.InternalMessageInfo + func (m *WorkflowTaskSet) Reset() { *m = WorkflowTaskSet{} } func (*WorkflowTaskSet) ProtoMessage() {} func (*WorkflowTaskSet) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{116} + return fileDescriptor_724696e352c3df5f, []int{118} } func (m *WorkflowTaskSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3315,7 +3371,7 @@ var xxx_messageInfo_WorkflowTaskSet proto.InternalMessageInfo func (m *WorkflowTaskSetList) Reset() { *m = WorkflowTaskSetList{} } func (*WorkflowTaskSetList) ProtoMessage() {} func (*WorkflowTaskSetList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{117} + return fileDescriptor_724696e352c3df5f, []int{119} } func (m *WorkflowTaskSetList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3343,7 +3399,7 @@ var xxx_messageInfo_WorkflowTaskSetList proto.InternalMessageInfo func (m *WorkflowTaskSetSpec) Reset() { *m = WorkflowTaskSetSpec{} } func (*WorkflowTaskSetSpec) ProtoMessage() {} func (*WorkflowTaskSetSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{118} + return fileDescriptor_724696e352c3df5f, []int{120} } func (m *WorkflowTaskSetSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3427,7 @@ var xxx_messageInfo_WorkflowTaskSetSpec proto.InternalMessageInfo func (m *WorkflowTaskSetStatus) Reset() { *m = WorkflowTaskSetStatus{} } func (*WorkflowTaskSetStatus) ProtoMessage() {} func (*WorkflowTaskSetStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{119} + return fileDescriptor_724696e352c3df5f, []int{121} } func (m *WorkflowTaskSetStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3399,7 +3455,7 @@ var xxx_messageInfo_WorkflowTaskSetStatus proto.InternalMessageInfo func (m *WorkflowTemplate) Reset() { *m = WorkflowTemplate{} } func (*WorkflowTemplate) ProtoMessage() {} func (*WorkflowTemplate) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{120} + return fileDescriptor_724696e352c3df5f, []int{122} } func (m *WorkflowTemplate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3427,7 +3483,7 @@ var xxx_messageInfo_WorkflowTemplate proto.InternalMessageInfo func (m *WorkflowTemplateList) Reset() { *m = WorkflowTemplateList{} } func (*WorkflowTemplateList) ProtoMessage() {} func (*WorkflowTemplateList) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{121} + return fileDescriptor_724696e352c3df5f, []int{123} } func (m *WorkflowTemplateList) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3455,7 +3511,7 @@ var xxx_messageInfo_WorkflowTemplateList proto.InternalMessageInfo func (m *WorkflowTemplateRef) Reset() { *m = WorkflowTemplateRef{} } func (*WorkflowTemplateRef) ProtoMessage() {} func (*WorkflowTemplateRef) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{122} + return fileDescriptor_724696e352c3df5f, []int{124} } func (m *WorkflowTemplateRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3483,7 +3539,7 @@ var xxx_messageInfo_WorkflowTemplateRef proto.InternalMessageInfo func (m *ZipStrategy) Reset() { *m = ZipStrategy{} } func (*ZipStrategy) ProtoMessage() {} func (*ZipStrategy) Descriptor() ([]byte, []int) { - return fileDescriptor_724696e352c3df5f, []int{123} + return fileDescriptor_724696e352c3df5f, []int{125} } func (m *ZipStrategy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3639,6 +3695,8 @@ func init() { proto.RegisterMapType((map[string]Template)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowStatus.StoredTemplatesEntry") proto.RegisterType((*WorkflowStep)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowStep") proto.RegisterMapType((LifecycleHooks)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowStep.HooksEntry") + proto.RegisterType((*WorkflowTaskResult)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowTaskResult") + proto.RegisterType((*WorkflowTaskResultList)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowTaskResultList") proto.RegisterType((*WorkflowTaskSet)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowTaskSet") proto.RegisterType((*WorkflowTaskSetList)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowTaskSetList") proto.RegisterType((*WorkflowTaskSetSpec)(nil), "github.com.argoproj.argo_workflows.v3.pkg.apis.workflow.v1alpha1.WorkflowTaskSetSpec") @@ -3656,586 +3714,590 @@ func init() { } var fileDescriptor_724696e352c3df5f = []byte{ - // 9262 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0xbd, 0x6b, 0x6c, 0x24, 0xd9, - 0x75, 0x18, 0xbc, 0xd5, 0x64, 0x93, 0xdd, 0x87, 0xe4, 0x90, 0x73, 0xe7, 0xd5, 0xcb, 0xdd, 0x1d, - 0xae, 0x6a, 0xbd, 0xfb, 0xed, 0xd8, 0x2b, 0xd2, 0x3b, 0xa3, 0xfd, 0xb2, 0x91, 0x10, 0x59, 0x6c, - 0x72, 0xf8, 0x58, 0x3e, 0xf7, 0x36, 0x67, 0x26, 0xbb, 0xda, 0xac, 0x55, 0xec, 0xbe, 0xec, 0xae, - 0x65, 0x77, 0x55, 0x6f, 0x55, 0x35, 0x39, 0xdc, 0x87, 0xa4, 0xc8, 0xb6, 0xa4, 0x8d, 0x15, 0x2b, - 0x0f, 0x47, 0x96, 0x95, 0x04, 0x30, 0x14, 0x2b, 0x16, 0x1c, 0x23, 0x81, 0x80, 0x20, 0x3f, 0x9c, - 0xbf, 0x41, 0xa0, 0x20, 0x01, 0xe2, 0xc0, 0x4a, 0x2c, 0x20, 0x09, 0x15, 0x31, 0xb1, 0xfe, 0x04, - 0x02, 0x02, 0x23, 0x52, 0x84, 0x49, 0x7e, 0x04, 0xf7, 0x59, 0xf7, 0x56, 0x57, 0x73, 0x9a, 0x33, - 0x45, 0xce, 0x22, 0xfe, 0xd7, 0x7d, 0xee, 0xb9, 0xe7, 0xdc, 0xe7, 0xb9, 0xe7, 0x9e, 0x73, 0xee, - 0x29, 0xd8, 0xac, 0xbb, 0x51, 0xa3, 0xb3, 0x3d, 0x5d, 0xf5, 0x5b, 0x33, 0x4e, 0x50, 0xf7, 0xdb, - 0x81, 0xff, 0x16, 0xfb, 0xf1, 0xd1, 0x7d, 0x3f, 0xd8, 0xdd, 0x69, 0xfa, 0xfb, 0xe1, 0xcc, 0xde, - 0x8d, 0x99, 0xf6, 0x6e, 0x7d, 0xc6, 0x69, 0xbb, 0xe1, 0x8c, 0x84, 0xce, 0xec, 0xbd, 0xe8, 0x34, - 0xdb, 0x0d, 0xe7, 0xc5, 0x99, 0x3a, 0xf1, 0x48, 0xe0, 0x44, 0xa4, 0x36, 0xdd, 0x0e, 0xfc, 0xc8, - 0x47, 0x9f, 0x8a, 0x29, 0x4e, 0x4b, 0x8a, 0xec, 0xc7, 0x2f, 0x2b, 0x8a, 0xd3, 0x7b, 0x37, 0xa6, - 0xdb, 0xbb, 0xf5, 0x69, 0x4a, 0x71, 0x5a, 0x42, 0xa7, 0x25, 0xc5, 0xc9, 0x8f, 0x6a, 0x6d, 0xaa, - 0xfb, 0x75, 0x7f, 0x86, 0x11, 0xde, 0xee, 0xec, 0xb0, 0x7f, 0xec, 0x0f, 0xfb, 0xc5, 0x19, 0x4e, - 0xda, 0xbb, 0x2f, 0x87, 0xd3, 0xae, 0x4f, 0xdb, 0x37, 0x53, 0xf5, 0x03, 0x32, 0xb3, 0xd7, 0xd5, - 0xa8, 0xc9, 0x6b, 0x1a, 0x4e, 0xdb, 0x6f, 0xba, 0xd5, 0x83, 0x99, 0xbd, 0x17, 0xb7, 0x49, 0xd4, - 0xdd, 0xfe, 0xc9, 0x8f, 0xc5, 0xa8, 0x2d, 0xa7, 0xda, 0x70, 0x3d, 0x12, 0x1c, 0xc4, 0xfd, 0x6f, - 0x91, 0xc8, 0x49, 0x63, 0x30, 0xd3, 0xab, 0x56, 0xd0, 0xf1, 0x22, 0xb7, 0x45, 0xba, 0x2a, 0xfc, - 0xff, 0xf7, 0xab, 0x10, 0x56, 0x1b, 0xa4, 0xe5, 0x74, 0xd5, 0xbb, 0xd1, 0xab, 0x5e, 0x27, 0x72, - 0x9b, 0x33, 0xae, 0x17, 0x85, 0x51, 0x90, 0xac, 0x64, 0xdf, 0x84, 0xa1, 0xd9, 0x96, 0xdf, 0xf1, - 0x22, 0xf4, 0x09, 0xc8, 0xef, 0x39, 0xcd, 0x0e, 0x29, 0x59, 0x4f, 0x5b, 0xcf, 0x17, 0xcb, 0xcf, - 0x7e, 0xf7, 0x70, 0xea, 0xb1, 0xa3, 0xc3, 0xa9, 0xfc, 0x6d, 0x0a, 0xbc, 0x77, 0x38, 0x75, 0x91, - 0x78, 0x55, 0xbf, 0xe6, 0x7a, 0xf5, 0x99, 0xb7, 0x42, 0xdf, 0x9b, 0x5e, 0xef, 0xb4, 0xb6, 0x49, - 0x80, 0x79, 0x1d, 0xfb, 0x8f, 0x73, 0x30, 0x3e, 0x1b, 0x54, 0x1b, 0xee, 0x1e, 0xa9, 0x44, 0x94, - 0x7e, 0xfd, 0x00, 0x35, 0x60, 0x20, 0x72, 0x02, 0x46, 0x6e, 0xe4, 0xfa, 0xda, 0xf4, 0xc3, 0x4e, - 0xfe, 0xf4, 0x96, 0x13, 0x48, 0xda, 0xe5, 0xe1, 0xa3, 0xc3, 0xa9, 0x81, 0x2d, 0x27, 0xc0, 0x94, - 0x05, 0x6a, 0xc2, 0xa0, 0xe7, 0x7b, 0xa4, 0x94, 0x63, 0xac, 0xd6, 0x1f, 0x9e, 0xd5, 0xba, 0xef, - 0xa9, 0x7e, 0x94, 0x0b, 0x47, 0x87, 0x53, 0x83, 0x14, 0x82, 0x19, 0x17, 0xda, 0xaf, 0x77, 0xdc, - 0x76, 0x69, 0x20, 0xab, 0x7e, 0xbd, 0xee, 0xb6, 0xcd, 0x7e, 0xbd, 0xee, 0xb6, 0x31, 0x65, 0x61, - 0x7f, 0x90, 0x83, 0xe2, 0x6c, 0x50, 0xef, 0xb4, 0x88, 0x17, 0x85, 0xe8, 0x73, 0x00, 0x6d, 0x27, - 0x70, 0x5a, 0x24, 0x22, 0x41, 0x58, 0xb2, 0x9e, 0x1e, 0x78, 0x7e, 0xe4, 0xfa, 0xca, 0xc3, 0xb3, - 0xdf, 0x94, 0x34, 0xcb, 0x48, 0x4c, 0x39, 0x28, 0x50, 0x88, 0x35, 0x96, 0xe8, 0x5d, 0x28, 0x3a, - 0x41, 0xe4, 0xee, 0x38, 0xd5, 0x28, 0x2c, 0xe5, 0x18, 0xff, 0x57, 0x1e, 0x9e, 0xff, 0xac, 0x20, - 0x59, 0x3e, 0x2f, 0xd8, 0x17, 0x25, 0x24, 0xc4, 0x31, 0x3f, 0xfb, 0xf7, 0xf2, 0x50, 0x90, 0x05, - 0xe8, 0x69, 0x18, 0xf4, 0x9c, 0x96, 0x5c, 0xaa, 0xa3, 0xa2, 0xe2, 0xe0, 0xba, 0xd3, 0xa2, 0x93, - 0xe4, 0xb4, 0x08, 0xc5, 0x68, 0x3b, 0x51, 0x83, 0x2d, 0x09, 0x0d, 0x63, 0xd3, 0x89, 0x1a, 0x98, - 0x95, 0xa0, 0x27, 0x61, 0xb0, 0xe5, 0xd7, 0x08, 0x9b, 0xc7, 0x3c, 0x9f, 0xe4, 0x35, 0xbf, 0x46, - 0x30, 0x83, 0xd2, 0xfa, 0x3b, 0x81, 0xdf, 0x2a, 0x0d, 0x9a, 0xf5, 0x17, 0x02, 0xbf, 0x85, 0x59, - 0x09, 0xfa, 0xba, 0x05, 0x13, 0xb2, 0x79, 0xab, 0x7e, 0xd5, 0x89, 0x5c, 0xdf, 0x2b, 0xe5, 0xd9, - 0xa2, 0xc0, 0xd9, 0x8d, 0x8a, 0xa4, 0x5c, 0x2e, 0x89, 0x26, 0x4c, 0x24, 0x4b, 0x70, 0x57, 0x2b, - 0xd0, 0x75, 0x80, 0x7a, 0xd3, 0xdf, 0x76, 0x9a, 0x74, 0x40, 0x4a, 0x43, 0xac, 0x0b, 0x6a, 0x72, - 0x17, 0x55, 0x09, 0xd6, 0xb0, 0xd0, 0x5d, 0x18, 0x76, 0xf8, 0x06, 0x2e, 0x0d, 0xb3, 0x4e, 0xbc, - 0x9a, 0x45, 0x27, 0x0c, 0x89, 0x50, 0x1e, 0x39, 0x3a, 0x9c, 0x1a, 0x16, 0x40, 0x2c, 0xd9, 0xa1, - 0x17, 0xa0, 0xe0, 0xb7, 0x69, 0xbb, 0x9d, 0x66, 0xa9, 0xf0, 0xb4, 0xf5, 0x7c, 0xa1, 0x3c, 0x21, - 0xda, 0x5a, 0xd8, 0x10, 0x70, 0xac, 0x30, 0xd0, 0x35, 0x18, 0x0e, 0x3b, 0xdb, 0x74, 0x1e, 0x4b, - 0x45, 0xd6, 0xb1, 0x71, 0x81, 0x3c, 0x5c, 0xe1, 0x60, 0x2c, 0xcb, 0xd1, 0x4b, 0x30, 0x12, 0x90, - 0x6a, 0x27, 0x08, 0x09, 0x9d, 0xd8, 0x12, 0x30, 0xda, 0x17, 0x04, 0xfa, 0x08, 0x8e, 0x8b, 0xb0, - 0x8e, 0x87, 0x3e, 0x09, 0xe7, 0xe8, 0x04, 0xdf, 0xbc, 0xdb, 0x0e, 0x48, 0x18, 0xd2, 0x59, 0x1d, - 0x61, 0x8c, 0x2e, 0x8b, 0x9a, 0xe7, 0x16, 0x8c, 0x52, 0x9c, 0xc0, 0xb6, 0xff, 0x70, 0x18, 0xba, - 0x26, 0x09, 0xbd, 0x08, 0x23, 0xa2, 0xbf, 0xab, 0x7e, 0x3d, 0x64, 0x0b, 0xb7, 0x50, 0x1e, 0xa7, - 0xed, 0x98, 0x8d, 0xc1, 0x58, 0xc7, 0x41, 0x35, 0xc8, 0x85, 0x37, 0x84, 0x4c, 0x5b, 0x7d, 0xf8, - 0xc9, 0xa8, 0xdc, 0x50, 0x3b, 0x6d, 0xe8, 0xe8, 0x70, 0x2a, 0x57, 0xb9, 0x81, 0x73, 0xe1, 0x0d, - 0x2a, 0xcd, 0xea, 0x6e, 0x94, 0x9d, 0x34, 0x5b, 0x74, 0x23, 0xc5, 0x87, 0x49, 0xb3, 0x45, 0x37, - 0xc2, 0x94, 0x05, 0x95, 0xd2, 0x8d, 0x28, 0x6a, 0xb3, 0x2d, 0x95, 0x89, 0x94, 0x5e, 0xda, 0xda, - 0xda, 0x54, 0xbc, 0xd8, 0x06, 0xa6, 0x10, 0xcc, 0xb8, 0xa0, 0x2f, 0x5b, 0x74, 0xc4, 0x79, 0xa1, - 0x1f, 0x1c, 0x88, 0x9d, 0x79, 0x2b, 0xbb, 0x9d, 0xe9, 0x07, 0x07, 0x8a, 0xb9, 0x98, 0x48, 0x55, - 0x80, 0x75, 0xd6, 0xac, 0xe3, 0xb5, 0x9d, 0x90, 0x6d, 0xc4, 0x6c, 0x3a, 0x3e, 0xbf, 0x50, 0x49, - 0x74, 0x7c, 0x7e, 0xa1, 0x82, 0x19, 0x17, 0x3a, 0xa1, 0x81, 0xb3, 0x2f, 0x36, 0x71, 0x06, 0x13, - 0x8a, 0x9d, 0x7d, 0x73, 0x42, 0xb1, 0xb3, 0x8f, 0x29, 0x0b, 0xca, 0xc9, 0x0f, 0x43, 0xb6, 0x67, - 0x33, 0xe1, 0xb4, 0x51, 0xa9, 0x98, 0x9c, 0x36, 0x2a, 0x15, 0x4c, 0x59, 0xb0, 0x45, 0x5a, 0x0d, - 0xd9, 0x86, 0xcf, 0x66, 0x91, 0xce, 0x25, 0x38, 0x2d, 0xce, 0x55, 0x30, 0x65, 0x61, 0x7f, 0x60, - 0xc1, 0x98, 0x2c, 0xa2, 0x42, 0x24, 0x44, 0x77, 0xa1, 0x20, 0x27, 0x53, 0xe8, 0x32, 0x59, 0x1e, - 0x7a, 0x4a, 0xd4, 0x49, 0x08, 0x56, 0xdc, 0xec, 0x3f, 0xc8, 0x03, 0x52, 0x60, 0xd2, 0xf6, 0x43, - 0x97, 0x2d, 0xa7, 0x07, 0x10, 0x25, 0x9e, 0x26, 0x4a, 0x6e, 0x67, 0x29, 0x4a, 0xe2, 0x66, 0x19, - 0x42, 0xe5, 0x6f, 0x25, 0x36, 0x1f, 0x97, 0x2e, 0xbf, 0x7c, 0x2a, 0x9b, 0x4f, 0x6b, 0xc2, 0xf1, - 0xdb, 0x70, 0x4f, 0x6c, 0x43, 0x2e, 0x7f, 0xfe, 0x72, 0xb6, 0xdb, 0x50, 0x6b, 0x45, 0x72, 0x43, - 0x06, 0x7c, 0x9b, 0x70, 0x01, 0x74, 0x27, 0xd3, 0x6d, 0xa2, 0x71, 0x35, 0x37, 0x4c, 0xc0, 0x37, - 0xcc, 0x50, 0x56, 0x3c, 0xb5, 0x0d, 0x93, 0xe4, 0xa9, 0xb6, 0xce, 0xdb, 0x70, 0xa9, 0x1b, 0x07, - 0x93, 0x1d, 0x34, 0x03, 0xc5, 0xaa, 0xef, 0xed, 0xb8, 0xf5, 0x35, 0xa7, 0x2d, 0x54, 0x36, 0xa5, - 0xeb, 0xcd, 0xc9, 0x02, 0x1c, 0xe3, 0xa0, 0xa7, 0x60, 0x60, 0x97, 0x1c, 0x08, 0xdd, 0x6d, 0x44, - 0xa0, 0x0e, 0xac, 0x90, 0x03, 0x4c, 0xe1, 0x1f, 0x2f, 0x7c, 0xfd, 0x77, 0xa6, 0x1e, 0xfb, 0xfc, - 0x7f, 0x7a, 0xfa, 0x31, 0xfb, 0xdf, 0x0d, 0xc0, 0x13, 0xa9, 0x3c, 0x2b, 0x91, 0x13, 0x75, 0x42, - 0xf4, 0x07, 0x16, 0x5c, 0x72, 0xd2, 0xca, 0xc5, 0x4e, 0xbe, 0x93, 0xdd, 0x8a, 0x34, 0xc8, 0x97, - 0x9f, 0x12, 0x8d, 0x4e, 0x1f, 0x11, 0x9c, 0xde, 0x28, 0x3a, 0x50, 0x54, 0x79, 0x0d, 0xdb, 0x4e, - 0x95, 0x88, 0xde, 0xab, 0x81, 0x5a, 0x97, 0x05, 0x38, 0xc6, 0xa1, 0xca, 0x50, 0x8d, 0xec, 0x38, - 0x9d, 0x26, 0x3f, 0xc0, 0x0b, 0xb1, 0x32, 0x34, 0xcf, 0xc1, 0x58, 0x96, 0xa3, 0xbf, 0x67, 0x01, - 0xea, 0xe6, 0x2a, 0x36, 0xc3, 0xd6, 0x69, 0x8c, 0x43, 0xf9, 0xf2, 0xd1, 0xe1, 0x54, 0x8a, 0x00, - 0xc3, 0x29, 0xed, 0xd0, 0xe6, 0xf4, 0x5f, 0x5b, 0x70, 0x21, 0x65, 0x9b, 0xd3, 0x45, 0xd1, 0x09, - 0x9a, 0x62, 0xfd, 0xa8, 0x45, 0x71, 0x0b, 0xaf, 0x62, 0x0a, 0x47, 0xbf, 0x69, 0xc1, 0xb8, 0xb6, - 0xdb, 0x67, 0x3b, 0x42, 0xf9, 0xcf, 0x48, 0x91, 0x35, 0x08, 0x97, 0xaf, 0x08, 0xf6, 0xe3, 0x89, - 0x02, 0x9c, 0x6c, 0x82, 0xfd, 0x43, 0x0b, 0x9e, 0x3a, 0x56, 0x68, 0xa5, 0x36, 0xdc, 0x7a, 0xe4, - 0x0d, 0xa7, 0x4b, 0x2b, 0x20, 0x6d, 0xff, 0x16, 0x5e, 0x15, 0x2b, 0x51, 0x2d, 0x2d, 0xcc, 0xc1, - 0x58, 0x96, 0xdb, 0x7f, 0x62, 0x41, 0x92, 0x1e, 0x72, 0xe0, 0x5c, 0x27, 0x24, 0x01, 0x5d, 0xaa, - 0x15, 0x52, 0x0d, 0x88, 0x3c, 0x3b, 0x9f, 0x9d, 0xe6, 0x56, 0x0a, 0xda, 0xe0, 0xe9, 0xaa, 0x1f, - 0x90, 0xe9, 0xbd, 0x17, 0xa7, 0x39, 0xc6, 0x0a, 0x39, 0xa8, 0x90, 0x26, 0xa1, 0x34, 0xca, 0x88, - 0xea, 0xd9, 0xb7, 0x0c, 0x02, 0x38, 0x41, 0x90, 0xb2, 0x68, 0x3b, 0x61, 0xb8, 0xef, 0x07, 0x35, - 0xc1, 0x22, 0x77, 0x62, 0x16, 0x9b, 0x06, 0x01, 0x9c, 0x20, 0x68, 0xff, 0x0b, 0x0b, 0x86, 0xcb, - 0x4e, 0x75, 0xd7, 0xdf, 0xd9, 0xa1, 0xd7, 0x94, 0x5a, 0x27, 0xe0, 0xd7, 0x3c, 0xbe, 0x08, 0xd5, - 0xd9, 0x3d, 0x2f, 0xe0, 0x58, 0x61, 0xa0, 0x2d, 0x18, 0xe2, 0xc3, 0x21, 0x1a, 0xf5, 0x8b, 0x5a, - 0xa3, 0x94, 0x75, 0x86, 0xcd, 0x5c, 0x27, 0x72, 0x9b, 0xd3, 0xdc, 0x3a, 0x33, 0xbd, 0xec, 0x45, - 0x1b, 0x41, 0x25, 0x0a, 0x5c, 0xaf, 0x5e, 0x86, 0xa3, 0xc3, 0xa9, 0xa1, 0x05, 0x46, 0x03, 0x0b, - 0x5a, 0xf4, 0x46, 0xd3, 0x72, 0xee, 0x4a, 0x76, 0x6c, 0xcf, 0x17, 0xe3, 0x1b, 0xcd, 0x5a, 0x5c, - 0x84, 0x75, 0x3c, 0xfb, 0x4d, 0xc8, 0xcf, 0x39, 0xd5, 0x06, 0x41, 0xb7, 0x92, 0x92, 0x78, 0xe4, - 0xfa, 0xf3, 0x69, 0xa3, 0xa5, 0xa4, 0xb2, 0x3e, 0x60, 0x63, 0xbd, 0xe4, 0xb5, 0xfd, 0x63, 0x0b, - 0xae, 0xcc, 0x35, 0x3b, 0x61, 0x44, 0x82, 0x3b, 0x62, 0x09, 0x6e, 0x91, 0x56, 0xbb, 0xe9, 0x44, - 0x04, 0x7d, 0x06, 0x0a, 0x2d, 0x12, 0x39, 0x35, 0x27, 0x72, 0x04, 0xc7, 0xde, 0x43, 0xc1, 0x16, - 0x31, 0xc5, 0xa6, 0x6d, 0xd8, 0xd8, 0x7e, 0x8b, 0x54, 0xa3, 0x35, 0x12, 0x39, 0xf1, 0xdd, 0x35, - 0x86, 0x61, 0x45, 0x15, 0xb5, 0x61, 0x30, 0x6c, 0x93, 0x6a, 0x76, 0xd6, 0x1f, 0xd9, 0x87, 0x4a, - 0x9b, 0x54, 0xe3, 0xab, 0x3f, 0xfd, 0x87, 0x19, 0x27, 0xfb, 0x7f, 0x5b, 0xf0, 0x44, 0x8f, 0xfe, - 0xae, 0xba, 0x61, 0x84, 0xde, 0xe8, 0xea, 0xf3, 0x74, 0x7f, 0x7d, 0xa6, 0xb5, 0x59, 0x8f, 0xd5, - 0xd2, 0x92, 0x10, 0xad, 0xbf, 0x9f, 0x85, 0xbc, 0x1b, 0x91, 0x96, 0x34, 0xc1, 0xbc, 0xf6, 0xf0, - 0x1d, 0xee, 0xd1, 0x97, 0xf2, 0x98, 0xb4, 0x01, 0x2e, 0x53, 0x7e, 0x98, 0xb3, 0xb5, 0xff, 0x95, - 0x05, 0x74, 0x19, 0xd4, 0x5c, 0x71, 0xb1, 0x1d, 0x8c, 0x0e, 0xda, 0xd2, 0x14, 0x23, 0xcf, 0xbd, - 0xc1, 0xad, 0x83, 0x36, 0xb9, 0x77, 0x38, 0x35, 0xa6, 0x10, 0x29, 0x00, 0x33, 0x54, 0xf4, 0x26, - 0x0c, 0x85, 0xec, 0x7c, 0x16, 0x92, 0x65, 0x41, 0x54, 0x1a, 0xe2, 0xa7, 0xf6, 0xbd, 0xc3, 0xa9, - 0xbe, 0x2c, 0xad, 0xd3, 0x8a, 0x36, 0xaf, 0x87, 0x05, 0x55, 0x2a, 0xba, 0x5a, 0x24, 0x0c, 0x9d, - 0x3a, 0x11, 0x3b, 0x44, 0x89, 0xae, 0x35, 0x0e, 0xc6, 0xb2, 0xdc, 0xfe, 0x3b, 0x16, 0xd0, 0x26, - 0x46, 0x0e, 0x65, 0xb1, 0x4e, 0x6f, 0xff, 0xeb, 0x6c, 0x8b, 0x70, 0x80, 0x98, 0xbc, 0xa7, 0x7a, - 0x6c, 0x11, 0x8e, 0x64, 0xe8, 0x32, 0x1c, 0x84, 0x63, 0x12, 0xe8, 0x63, 0x30, 0x5a, 0x23, 0x6d, - 0xe2, 0xd5, 0x88, 0x57, 0x75, 0x09, 0x9f, 0xb4, 0x62, 0x79, 0xe2, 0xe8, 0x70, 0x6a, 0x74, 0x5e, - 0x83, 0x63, 0x03, 0xcb, 0xfe, 0xa6, 0x05, 0x8f, 0x2b, 0x72, 0x15, 0x12, 0x61, 0x12, 0x05, 0x07, - 0xca, 0xb2, 0x7a, 0x32, 0x51, 0x74, 0x87, 0x4a, 0xf2, 0x28, 0xe0, 0xcc, 0x1f, 0x4c, 0x16, 0x8d, - 0x70, 0xb9, 0xcf, 0x88, 0x60, 0x49, 0xcd, 0xfe, 0x8d, 0x01, 0xb8, 0xa8, 0x37, 0x52, 0xed, 0xf9, - 0x5f, 0xb1, 0x00, 0xd4, 0x08, 0x50, 0x85, 0x9b, 0xae, 0xd3, 0x8d, 0x0c, 0xd6, 0xa9, 0x3e, 0x53, - 0xb1, 0x54, 0x50, 0xe0, 0x10, 0x6b, 0x6c, 0xd1, 0x6b, 0x30, 0xba, 0xe7, 0x37, 0x3b, 0x2d, 0xb2, - 0xe6, 0x77, 0xbc, 0x28, 0x2c, 0x0d, 0xb0, 0x66, 0x4c, 0xa5, 0x4d, 0xe6, 0xed, 0x18, 0xaf, 0x7c, - 0x51, 0x90, 0x1d, 0xd5, 0x80, 0x21, 0x36, 0x48, 0xd1, 0x33, 0x7b, 0x2c, 0xd0, 0xa7, 0x44, 0x68, - 0xf7, 0x9f, 0xce, 0xb0, 0x8f, 0xc9, 0x59, 0x2f, 0x9f, 0x3f, 0x3a, 0x9c, 0x1a, 0x33, 0x40, 0xd8, - 0x6c, 0x84, 0xfd, 0x1a, 0xb0, 0xb1, 0x70, 0xbd, 0x0e, 0xd9, 0xf0, 0xd0, 0x33, 0x90, 0x27, 0x41, - 0xe0, 0x07, 0xe2, 0x86, 0xa8, 0x36, 0xf3, 0x4d, 0x0a, 0xc4, 0xbc, 0x0c, 0x3d, 0x47, 0xcf, 0x29, - 0xb7, 0x49, 0x6a, 0x6c, 0x6d, 0x14, 0xca, 0xe7, 0xe4, 0x5e, 0x5c, 0x60, 0x50, 0x2c, 0x4a, 0xed, - 0x69, 0x18, 0x9e, 0xa3, 0x7d, 0x27, 0x01, 0xa5, 0xab, 0x3b, 0x0a, 0xc6, 0x0c, 0x47, 0x81, 0x74, - 0x08, 0x6c, 0xc1, 0xa5, 0xb9, 0x80, 0x38, 0x11, 0xa9, 0xdc, 0x28, 0x77, 0xaa, 0xbb, 0x24, 0xe2, - 0xa6, 0xbc, 0x10, 0x7d, 0x02, 0xc6, 0x7c, 0x26, 0xc5, 0x57, 0xfd, 0xea, 0xae, 0xeb, 0xd5, 0x85, - 0xe2, 0x7a, 0x49, 0x50, 0x19, 0xdb, 0xd0, 0x0b, 0xb1, 0x89, 0x6b, 0xff, 0xb7, 0x1c, 0x8c, 0xce, - 0x05, 0xbe, 0x27, 0x25, 0xd5, 0x19, 0x9c, 0x2e, 0x91, 0x71, 0xba, 0x64, 0x60, 0xd9, 0xd5, 0xdb, - 0xdf, 0xeb, 0x84, 0x41, 0xef, 0x29, 0x11, 0x39, 0x90, 0x95, 0x82, 0x6e, 0xf0, 0x65, 0xb4, 0xe3, - 0xc9, 0x36, 0x05, 0xa8, 0xfd, 0xa7, 0x16, 0x4c, 0xe8, 0xe8, 0x67, 0x70, 0xa8, 0x85, 0xe6, 0xa1, - 0xb6, 0x9e, 0x6d, 0x7f, 0x7b, 0x9c, 0x64, 0x1f, 0x0c, 0x99, 0xfd, 0xa4, 0x13, 0x80, 0xbe, 0x6e, - 0xc1, 0xe8, 0xbe, 0x06, 0x10, 0x9d, 0xcd, 0x5a, 0xaf, 0xf8, 0x39, 0x29, 0x66, 0x74, 0xe8, 0xbd, - 0xc4, 0x7f, 0x6c, 0xb4, 0x84, 0xca, 0xfd, 0xb0, 0xda, 0x20, 0xb5, 0x4e, 0x53, 0x5e, 0x0f, 0xd5, - 0x90, 0x56, 0x04, 0x1c, 0x2b, 0x0c, 0xf4, 0x06, 0x9c, 0xaf, 0xfa, 0x5e, 0xb5, 0x13, 0x04, 0xc4, - 0xab, 0x1e, 0x6c, 0x32, 0xdf, 0xa6, 0x38, 0x10, 0xa7, 0x45, 0xb5, 0xf3, 0x73, 0x49, 0x84, 0x7b, - 0x69, 0x40, 0xdc, 0x4d, 0x88, 0xdb, 0xe1, 0x43, 0x7a, 0x64, 0xb1, 0x3b, 0x64, 0x41, 0xb7, 0xc3, - 0x33, 0x30, 0x96, 0xe5, 0xe8, 0x16, 0x5c, 0x09, 0x23, 0x7a, 0xbf, 0xf0, 0xea, 0xf3, 0xc4, 0xa9, - 0x35, 0x5d, 0x8f, 0xaa, 0xf0, 0xbe, 0x57, 0xe3, 0x46, 0x91, 0x81, 0xf2, 0x13, 0x47, 0x87, 0x53, - 0x57, 0x2a, 0xe9, 0x28, 0xb8, 0x57, 0x5d, 0xf4, 0x26, 0x4c, 0x86, 0x9d, 0x6a, 0x95, 0x84, 0xe1, - 0x4e, 0xa7, 0xf9, 0x8a, 0xbf, 0x1d, 0x2e, 0xb9, 0x21, 0xbd, 0x7f, 0xac, 0xba, 0x2d, 0x37, 0x62, - 0xa6, 0x8f, 0x7c, 0xf9, 0xea, 0xd1, 0xe1, 0xd4, 0x64, 0xa5, 0x27, 0x16, 0x3e, 0x86, 0x02, 0xc2, - 0x70, 0x99, 0x0b, 0xbf, 0x2e, 0xda, 0xc3, 0x8c, 0xf6, 0xe4, 0xd1, 0xe1, 0xd4, 0xe5, 0x85, 0x54, - 0x0c, 0xdc, 0xa3, 0x26, 0x9d, 0xc1, 0xc8, 0x6d, 0x91, 0x77, 0x7c, 0x8f, 0x30, 0xbb, 0xa9, 0x36, - 0x83, 0x5b, 0x02, 0x8e, 0x15, 0x06, 0x7a, 0x2b, 0x5e, 0x89, 0x74, 0xbb, 0x08, 0xfb, 0xe7, 0xc9, - 0x25, 0xdc, 0xc5, 0xa3, 0xc3, 0xa9, 0x89, 0x3b, 0x1a, 0x25, 0xba, 0xe5, 0xb0, 0x41, 0xdb, 0xfe, - 0xe3, 0x1c, 0xa0, 0x6e, 0x11, 0x81, 0x56, 0x60, 0xc8, 0xa9, 0x46, 0xee, 0x1e, 0x11, 0x0e, 0xc7, - 0x67, 0xd2, 0x8e, 0x4f, 0xce, 0x0a, 0x93, 0x1d, 0x42, 0x57, 0x08, 0x89, 0xe5, 0xca, 0x2c, 0xab, - 0x8a, 0x05, 0x09, 0xe4, 0xc3, 0xf9, 0xa6, 0x13, 0x46, 0x72, 0xad, 0xd6, 0x68, 0x97, 0x85, 0x60, - 0xfd, 0xf9, 0xfe, 0x3a, 0x45, 0x6b, 0x94, 0x2f, 0xd1, 0x95, 0xbb, 0x9a, 0x24, 0x84, 0xbb, 0x69, - 0xa3, 0xcf, 0x31, 0x3d, 0x84, 0x2b, 0x89, 0x52, 0x01, 0x58, 0xc9, 0xe4, 0x8c, 0xe6, 0x34, 0x0d, - 0x1d, 0x44, 0xb0, 0xc1, 0x1a, 0x4b, 0xfb, 0xdf, 0x00, 0x0c, 0xcf, 0xcf, 0x2e, 0x6e, 0x39, 0xe1, - 0x6e, 0x1f, 0x4e, 0x4b, 0xba, 0x3a, 0x84, 0x0e, 0x95, 0xdc, 0xdf, 0x52, 0xb7, 0xc2, 0x0a, 0x03, - 0x79, 0x30, 0xe4, 0x7a, 0x74, 0x43, 0x94, 0xce, 0x65, 0x65, 0x96, 0x56, 0x9a, 0x3f, 0xbb, 0x7c, - 0x2e, 0x33, 0xea, 0x58, 0x70, 0x41, 0xef, 0x41, 0xd1, 0x91, 0xce, 0x68, 0x71, 0x2c, 0xad, 0x64, - 0x61, 0xa1, 0x10, 0x24, 0x75, 0xff, 0xaf, 0x00, 0xe1, 0x98, 0x21, 0xfa, 0xbc, 0x05, 0x23, 0xb2, - 0xeb, 0x98, 0xec, 0x08, 0xc3, 0xd5, 0x5a, 0x76, 0x7d, 0xc6, 0x64, 0x87, 0x1b, 0x90, 0x35, 0x00, - 0xd6, 0x59, 0x76, 0xa9, 0xf2, 0xf9, 0x7e, 0x54, 0x79, 0xb4, 0x0f, 0xc5, 0x7d, 0x37, 0x6a, 0xb0, - 0x83, 0xa7, 0x34, 0xc4, 0x96, 0xe0, 0xc2, 0xc3, 0xb7, 0x9a, 0x92, 0x8b, 0x47, 0xec, 0x8e, 0x64, - 0x80, 0x63, 0x5e, 0x68, 0x86, 0x33, 0x66, 0xce, 0x7c, 0x26, 0xb2, 0x8a, 0x66, 0x05, 0x56, 0x80, - 0x63, 0x1c, 0x3a, 0xc4, 0xa3, 0xf4, 0x5f, 0x85, 0xbc, 0xdd, 0xa1, 0xfb, 0x58, 0x78, 0x76, 0x32, - 0x58, 0x57, 0x92, 0x22, 0x1f, 0xac, 0x3b, 0x1a, 0x0f, 0x6c, 0x70, 0xa4, 0x7b, 0x64, 0xbf, 0x41, - 0x3c, 0xe1, 0xda, 0x55, 0x7b, 0xe4, 0x4e, 0x83, 0x78, 0x98, 0x95, 0xa0, 0xf7, 0xf8, 0xd5, 0x82, - 0xeb, 0xb8, 0xcc, 0xa7, 0x9b, 0x89, 0x77, 0x34, 0xd6, 0x9b, 0xcb, 0xe7, 0xe4, 0x9d, 0x82, 0xff, - 0xc7, 0x1a, 0x3f, 0xaa, 0x2e, 0xfb, 0xde, 0xcd, 0xbb, 0x6e, 0x24, 0x7c, 0xc2, 0x4a, 0xd2, 0x6d, - 0x30, 0x28, 0x16, 0xa5, 0xdc, 0x30, 0x4b, 0x17, 0x41, 0x58, 0x1a, 0x35, 0xaf, 0xa0, 0x7c, 0xa5, - 0x84, 0x58, 0x96, 0xa3, 0xbf, 0x6f, 0x41, 0xbe, 0xe1, 0xfb, 0xbb, 0x61, 0x69, 0x8c, 0x2d, 0x8e, - 0x0c, 0x54, 0x3d, 0x21, 0x71, 0xa6, 0x97, 0x28, 0xd9, 0x9b, 0x5e, 0x14, 0x1c, 0x94, 0x5f, 0x94, - 0x0a, 0x10, 0x83, 0xdd, 0x3b, 0x9c, 0x3a, 0xb7, 0xea, 0xee, 0x90, 0xea, 0x41, 0xb5, 0x49, 0x18, - 0xe4, 0x0b, 0x3f, 0xd0, 0x20, 0x37, 0xf7, 0x88, 0x17, 0x61, 0xde, 0xaa, 0xc9, 0x0f, 0x2c, 0x80, - 0x98, 0x10, 0x9a, 0xe0, 0xb6, 0x79, 0x26, 0xc4, 0x98, 0x39, 0x1e, 0x11, 0x79, 0x1f, 0xe0, 0x92, - 0x3c, 0x83, 0x7b, 0x9e, 0xd1, 0x34, 0x71, 0xa3, 0xf8, 0x78, 0xee, 0x65, 0xcb, 0xfe, 0xb7, 0x16, - 0x8c, 0xd0, 0xce, 0x49, 0x11, 0xf8, 0x1c, 0x0c, 0x45, 0x4e, 0x50, 0x17, 0xd6, 0x45, 0x6d, 0x3a, - 0xb6, 0x18, 0x14, 0x8b, 0x52, 0xe4, 0x41, 0x3e, 0x72, 0xc2, 0x5d, 0xa9, 0x5d, 0x2e, 0x67, 0x36, - 0xc4, 0xb1, 0x62, 0x49, 0xff, 0x85, 0x98, 0xb3, 0x41, 0xcf, 0x43, 0x81, 0x2a, 0x00, 0x0b, 0x4e, - 0x28, 0x0d, 0xf3, 0xa3, 0x54, 0x88, 0x2f, 0x08, 0x18, 0x56, 0xa5, 0xf6, 0xdf, 0xce, 0xc1, 0xe0, - 0x3c, 0xbf, 0x67, 0x0c, 0x85, 0x7e, 0x27, 0xa8, 0x12, 0xa1, 0x6f, 0x66, 0xb0, 0xa6, 0x29, 0xdd, - 0x0a, 0xa3, 0xa9, 0x69, 0xfa, 0xec, 0x3f, 0x16, 0xbc, 0xe8, 0x45, 0xf6, 0x5c, 0x14, 0x38, 0x5e, - 0xb8, 0xe3, 0x07, 0x2d, 0x6e, 0x50, 0xc8, 0x65, 0xb5, 0x0a, 0xb7, 0x0c, 0xba, 0x95, 0x88, 0xb4, - 0xe3, 0x10, 0x0a, 0xb3, 0x0c, 0x27, 0xda, 0x60, 0xff, 0x96, 0x05, 0x10, 0xb7, 0x1e, 0x7d, 0xd9, - 0x82, 0x31, 0x47, 0x77, 0xca, 0x8a, 0x31, 0xda, 0xc8, 0xce, 0x40, 0xce, 0xc8, 0xf2, 0x2b, 0xb6, - 0x01, 0xc2, 0x26, 0x63, 0xfb, 0x25, 0xc8, 0xb3, 0xdd, 0xc1, 0x74, 0x71, 0x61, 0x19, 0x4d, 0xda, - 0x60, 0xa4, 0xc5, 0x14, 0x2b, 0x0c, 0xfb, 0x0d, 0x38, 0x77, 0xf3, 0x2e, 0xa9, 0x76, 0x22, 0x3f, - 0xe0, 0x16, 0x54, 0xf4, 0x0a, 0xa0, 0x90, 0x04, 0x7b, 0x6e, 0x95, 0xcc, 0x56, 0xab, 0xf4, 0x66, - 0xbd, 0x1e, 0xeb, 0x06, 0x93, 0x82, 0x12, 0xaa, 0x74, 0x61, 0xe0, 0x94, 0x5a, 0xf6, 0xef, 0x5b, - 0x30, 0xa2, 0x79, 0xe8, 0xe8, 0x49, 0x5d, 0x9f, 0xab, 0xf0, 0x7b, 0xb7, 0x18, 0xaa, 0x95, 0x4c, - 0x7c, 0x80, 0x9c, 0x64, 0x7c, 0x8c, 0x28, 0x10, 0x8e, 0x19, 0xde, 0xc7, 0x7b, 0x67, 0xff, 0x4b, - 0x0b, 0x2e, 0xa5, 0xba, 0x13, 0x1f, 0x71, 0xb3, 0x67, 0xa0, 0xb8, 0x4b, 0x0e, 0x16, 0xd8, 0x1a, - 0x4c, 0x3a, 0xdf, 0x56, 0x64, 0x01, 0x8e, 0x71, 0xec, 0xef, 0x58, 0x10, 0x53, 0xa2, 0xa2, 0x68, - 0x3b, 0x6e, 0xb9, 0x26, 0x8a, 0x04, 0x27, 0x51, 0x8a, 0xde, 0x83, 0x2b, 0xe6, 0x0c, 0x32, 0x13, - 0xfb, 0xc9, 0xdd, 0x17, 0xfc, 0xce, 0x94, 0x4e, 0x09, 0xf7, 0x62, 0x61, 0xdf, 0x86, 0xfc, 0xa2, - 0xd3, 0xa9, 0x93, 0xbe, 0x8c, 0x38, 0x54, 0x8c, 0x05, 0xc4, 0x69, 0x46, 0x52, 0x4d, 0x17, 0x62, - 0x0c, 0x0b, 0x18, 0x56, 0xa5, 0xf6, 0x4f, 0x06, 0x61, 0x44, 0x8b, 0xfc, 0xa1, 0xe7, 0x78, 0x40, - 0xda, 0x7e, 0x52, 0xd7, 0xa5, 0x93, 0x8d, 0x59, 0x09, 0xdd, 0x3f, 0x01, 0xd9, 0x73, 0x43, 0x2e, - 0x72, 0x8c, 0xfd, 0x83, 0x05, 0x1c, 0x2b, 0x0c, 0x34, 0x05, 0xf9, 0x1a, 0x69, 0x47, 0x0d, 0x26, - 0x4d, 0x07, 0xcb, 0x45, 0xda, 0xd4, 0x79, 0x0a, 0xc0, 0x1c, 0x4e, 0x11, 0x76, 0x48, 0x54, 0x6d, - 0x30, 0x63, 0x63, 0x91, 0x23, 0x2c, 0x50, 0x00, 0xe6, 0xf0, 0x14, 0x87, 0x54, 0xfe, 0xf4, 0x1d, - 0x52, 0x43, 0x19, 0x3b, 0xa4, 0x50, 0x1b, 0x2e, 0x84, 0x61, 0x63, 0x33, 0x70, 0xf7, 0x9c, 0x88, - 0xc4, 0x2b, 0x67, 0xf8, 0x24, 0x7c, 0xae, 0x1c, 0x1d, 0x4e, 0x5d, 0xa8, 0x54, 0x96, 0x92, 0x54, - 0x70, 0x1a, 0x69, 0x54, 0x81, 0x4b, 0xae, 0x17, 0x92, 0x6a, 0x27, 0x20, 0xcb, 0x75, 0xcf, 0x0f, - 0xc8, 0x92, 0x1f, 0x52, 0x72, 0x22, 0x54, 0x4f, 0x39, 0xba, 0x97, 0xd3, 0x90, 0x70, 0x7a, 0x5d, - 0xb4, 0x08, 0xe7, 0x6b, 0x6e, 0xe8, 0x6c, 0x37, 0x49, 0xa5, 0xb3, 0xdd, 0xf2, 0xe9, 0x85, 0x8d, - 0x47, 0xf7, 0x14, 0xca, 0x8f, 0x4b, 0xd3, 0xc4, 0x7c, 0x12, 0x01, 0x77, 0xd7, 0xb1, 0xbf, 0x6f, - 0xc1, 0xa8, 0x1e, 0x86, 0x41, 0x75, 0x58, 0x68, 0xcc, 0x2f, 0x54, 0xb8, 0x94, 0xcd, 0xee, 0x2c, - 0x5d, 0x52, 0x34, 0xe3, 0x3b, 0x5f, 0x0c, 0xc3, 0x1a, 0xcf, 0x3e, 0x42, 0x4f, 0x9f, 0x81, 0xfc, - 0x8e, 0x4f, 0x8f, 0xfa, 0x01, 0xd3, 0x32, 0xbb, 0x40, 0x81, 0x98, 0x97, 0xd9, 0xff, 0xd3, 0x82, - 0xcb, 0xe9, 0x11, 0x26, 0x1f, 0x86, 0x4e, 0x5e, 0x07, 0xa0, 0x5d, 0x31, 0xc4, 0xa5, 0x16, 0x3f, - 0x2c, 0x4b, 0xb0, 0x86, 0xd5, 0x5f, 0xb7, 0x7f, 0x4a, 0xd5, 0xcd, 0x98, 0xcf, 0x57, 0x2c, 0x18, - 0xa3, 0x6c, 0x57, 0x82, 0x6d, 0xa3, 0xb7, 0x1b, 0xd9, 0xf4, 0x56, 0x91, 0x8d, 0x0d, 0xd0, 0x06, - 0x18, 0x9b, 0xcc, 0xd1, 0x2f, 0x40, 0xd1, 0xa9, 0xd5, 0x02, 0x12, 0x86, 0xca, 0x95, 0xc3, 0xdc, - 0xa2, 0xb3, 0x12, 0x88, 0xe3, 0x72, 0x2a, 0xe2, 0x1a, 0xb5, 0x9d, 0x90, 0x4a, 0x0d, 0x61, 0x77, - 0x53, 0x22, 0x8e, 0x32, 0xa1, 0x70, 0xac, 0x30, 0xec, 0xbf, 0x3e, 0x08, 0x26, 0x6f, 0x54, 0x83, - 0xf1, 0xdd, 0x60, 0x7b, 0x8e, 0xb9, 0x6e, 0x1f, 0xc4, 0x89, 0x7e, 0xe1, 0xe8, 0x70, 0x6a, 0x7c, - 0xc5, 0xa4, 0x80, 0x93, 0x24, 0x05, 0x97, 0x15, 0x72, 0x10, 0x39, 0xdb, 0x0f, 0x72, 0x10, 0x49, - 0x2e, 0x3a, 0x05, 0x9c, 0x24, 0x89, 0x5e, 0x82, 0x91, 0xdd, 0x60, 0x5b, 0x0a, 0xd0, 0xa4, 0xe7, - 0x7a, 0x25, 0x2e, 0xc2, 0x3a, 0x1e, 0x1d, 0xc2, 0xdd, 0x60, 0x9b, 0x1e, 0x38, 0x32, 0x14, 0x5b, - 0x0d, 0xe1, 0x8a, 0x80, 0x63, 0x85, 0x81, 0xda, 0x80, 0x76, 0xe5, 0xe8, 0x29, 0x47, 0xb5, 0x90, - 0xf3, 0xfd, 0xfb, 0xb9, 0x59, 0xd8, 0xca, 0x4a, 0x17, 0x1d, 0x9c, 0x42, 0x1b, 0xbd, 0x06, 0x57, - 0x76, 0x83, 0x6d, 0x71, 0x0c, 0x6f, 0x06, 0xae, 0x57, 0x75, 0xdb, 0x46, 0xd8, 0xf5, 0x94, 0x68, - 0xee, 0x95, 0x95, 0x74, 0x34, 0xdc, 0xab, 0xbe, 0xfd, 0xcf, 0x06, 0x80, 0xc5, 0xb3, 0x52, 0xcd, - 0xa2, 0x45, 0xa2, 0x86, 0x5f, 0x4b, 0x6a, 0x16, 0x6b, 0x0c, 0x8a, 0x45, 0xa9, 0x0c, 0x90, 0xc9, - 0xf5, 0x08, 0x90, 0xd9, 0x87, 0xe1, 0x06, 0x71, 0x6a, 0x24, 0x90, 0x86, 0xb0, 0xd5, 0x6c, 0x22, - 0x70, 0x97, 0x18, 0xd1, 0xf8, 0x82, 0xcb, 0xff, 0x87, 0x58, 0x72, 0x43, 0x1f, 0x87, 0x73, 0x54, - 0x47, 0xf0, 0x3b, 0x91, 0xb4, 0xfa, 0x0e, 0x32, 0xab, 0x2f, 0x3b, 0xef, 0xb6, 0x8c, 0x12, 0x9c, - 0xc0, 0x44, 0xf3, 0x30, 0x21, 0x2c, 0xb4, 0xca, 0xc0, 0x26, 0x06, 0x56, 0xc5, 0xc3, 0x57, 0x12, - 0xe5, 0xb8, 0xab, 0x06, 0x95, 0xc8, 0xdb, 0x7e, 0x8d, 0x3b, 0xe9, 0x34, 0x89, 0x5c, 0xf6, 0x6b, - 0x07, 0x98, 0x95, 0x50, 0x6d, 0x5c, 0x9e, 0x54, 0x95, 0x5d, 0xb7, 0x7d, 0x9b, 0x04, 0xee, 0xce, - 0x01, 0x3b, 0x56, 0x0b, 0xb1, 0x36, 0xbe, 0xdc, 0x85, 0x81, 0x53, 0x6a, 0xd9, 0xdf, 0xa4, 0x67, - 0x92, 0x16, 0x9a, 0x7c, 0xbf, 0xc8, 0xa5, 0x30, 0x9e, 0x18, 0x7e, 0xf7, 0x5a, 0xca, 0x60, 0x62, - 0xee, 0x33, 0x29, 0xf6, 0xf7, 0xa8, 0x98, 0x55, 0xb3, 0xd7, 0x87, 0x6d, 0xf2, 0x19, 0xfd, 0x96, - 0xdf, 0x4b, 0x61, 0xfc, 0x1c, 0x14, 0xd9, 0x8f, 0x85, 0xc0, 0x6f, 0x09, 0x13, 0x21, 0xce, 0x72, - 0x95, 0x89, 0xdb, 0x2c, 0x13, 0xb9, 0xb7, 0x25, 0x23, 0x1c, 0xf3, 0xb4, 0x7d, 0x98, 0x48, 0x62, - 0xa3, 0x4f, 0xc3, 0x68, 0x28, 0xa5, 0x56, 0x1c, 0xfa, 0xd7, 0xa7, 0x74, 0x63, 0x06, 0xab, 0x8a, - 0x56, 0x1d, 0x1b, 0xc4, 0xec, 0x0d, 0x18, 0xca, 0x74, 0x08, 0xed, 0x6f, 0x59, 0x50, 0x64, 0x2e, - 0x83, 0x7a, 0xe0, 0xb4, 0xe2, 0x2a, 0x03, 0xc7, 0x8c, 0x7a, 0x08, 0xc3, 0xfc, 0x72, 0x21, 0x5d, - 0xed, 0x19, 0x2c, 0x20, 0xfe, 0x28, 0x2c, 0x5e, 0x40, 0xfc, 0x16, 0x13, 0x62, 0xc9, 0xc9, 0xfe, - 0x62, 0x0e, 0x86, 0x96, 0xbd, 0x76, 0xe7, 0xcf, 0xfd, 0xc3, 0xa4, 0x35, 0x18, 0x5c, 0x8e, 0x48, - 0xcb, 0x7c, 0x3f, 0x37, 0x5a, 0x7e, 0x56, 0x7f, 0x3b, 0x57, 0x32, 0xdf, 0xce, 0x61, 0x67, 0x5f, - 0x46, 0xa2, 0x08, 0xe3, 0x56, 0x1c, 0xfe, 0xf8, 0x02, 0x14, 0x57, 0x9d, 0x6d, 0xd2, 0x5c, 0x21, - 0x07, 0x21, 0xbd, 0xd5, 0x70, 0xaf, 0xa8, 0x15, 0xdf, 0x6a, 0x0c, 0x0f, 0xe6, 0x3c, 0x9c, 0x63, - 0xd8, 0x6a, 0x33, 0x50, 0xc5, 0x8c, 0xc4, 0x2f, 0x57, 0x2c, 0x53, 0x31, 0xd3, 0x5e, 0xad, 0x68, - 0x58, 0xf6, 0x34, 0x8c, 0xc4, 0x54, 0xfa, 0xe0, 0xfa, 0x67, 0x39, 0x18, 0x33, 0x6c, 0x74, 0x86, - 0xe7, 0xc2, 0xba, 0xaf, 0xe7, 0xc2, 0xf0, 0x24, 0xe4, 0x1e, 0xb5, 0x27, 0x61, 0xe0, 0xec, 0x3d, - 0x09, 0xe6, 0x24, 0x0d, 0xf6, 0x35, 0x49, 0x4d, 0x18, 0x5c, 0x75, 0xbd, 0xdd, 0xfe, 0xe4, 0x4c, - 0x58, 0xf5, 0xdb, 0x5d, 0x72, 0xa6, 0x42, 0x81, 0x98, 0x97, 0xc9, 0x43, 0x69, 0x20, 0xfd, 0x50, - 0xb2, 0xbf, 0x60, 0xc1, 0xf9, 0x35, 0xd2, 0xf2, 0xdd, 0x77, 0x9c, 0x38, 0xc2, 0x8a, 0x56, 0x6a, - 0xb8, 0x91, 0x08, 0x28, 0x51, 0x95, 0x96, 0xdc, 0x08, 0x53, 0xf8, 0x7d, 0x2c, 0x3f, 0x2c, 0x0e, - 0x9c, 0x2a, 0x9e, 0xeb, 0xb1, 0x06, 0x18, 0xc7, 0x4e, 0xc9, 0x02, 0x1c, 0xe3, 0xd8, 0x7f, 0x68, - 0xc1, 0x30, 0x6f, 0x04, 0x91, 0xb4, 0xad, 0x1e, 0xb4, 0x1b, 0x90, 0x67, 0xf5, 0xc4, 0x72, 0x5a, - 0xcc, 0xc0, 0x23, 0x40, 0xc9, 0xf1, 0xc5, 0xcf, 0x7e, 0x62, 0xce, 0x80, 0xa9, 0x63, 0xce, 0xdd, - 0x59, 0x15, 0x5c, 0x16, 0xab, 0x63, 0x0c, 0x8a, 0x45, 0xa9, 0xfd, 0x8d, 0x01, 0x28, 0x48, 0x5f, - 0x2b, 0x7f, 0x10, 0xe1, 0x79, 0x7e, 0xe4, 0x70, 0x57, 0x24, 0x17, 0x92, 0x19, 0x84, 0x0b, 0x49, - 0x0e, 0xd3, 0xb3, 0x31, 0x75, 0x6e, 0xf1, 0x57, 0xca, 0xb5, 0x56, 0x82, 0xf5, 0x46, 0xa0, 0xcf, - 0xc2, 0x50, 0x93, 0x6e, 0x7b, 0x29, 0x33, 0x6f, 0x67, 0xd8, 0x1c, 0x26, 0x4f, 0x44, 0x4b, 0xd4, - 0x08, 0x71, 0x20, 0x16, 0x5c, 0x27, 0x3f, 0x09, 0x13, 0xc9, 0x56, 0xa7, 0xb8, 0x17, 0x2e, 0x1a, - 0xa7, 0xa6, 0xe6, 0x0d, 0x98, 0xfc, 0x8b, 0x42, 0x6c, 0x9d, 0xbc, 0xaa, 0xfd, 0x2a, 0x8c, 0xac, - 0x91, 0x28, 0x70, 0xab, 0x8c, 0xc0, 0xfd, 0x16, 0x57, 0x5f, 0x07, 0xf7, 0x97, 0xd8, 0x62, 0xa5, - 0x34, 0x43, 0xf4, 0x1e, 0x40, 0x3b, 0xf0, 0xa9, 0x5e, 0x4e, 0x3a, 0x72, 0xb2, 0x33, 0x50, 0xb7, - 0x37, 0x15, 0x4d, 0xee, 0xa4, 0x8a, 0xff, 0x63, 0x8d, 0x9f, 0x7d, 0x0d, 0xf2, 0x6b, 0x9d, 0x88, - 0xdc, 0xbd, 0xbf, 0xa8, 0xb0, 0x3f, 0x0d, 0xa3, 0x0c, 0x75, 0xc9, 0x6f, 0xd2, 0xe3, 0x89, 0xf6, - 0xb4, 0x45, 0xff, 0x27, 0xcd, 0x82, 0x0c, 0x09, 0xf3, 0x32, 0xba, 0x03, 0x1a, 0x7e, 0xb3, 0x46, - 0x02, 0x31, 0x1e, 0x6a, 0x7e, 0x97, 0x18, 0x14, 0x8b, 0x52, 0xfb, 0x57, 0x72, 0x30, 0xc2, 0x2a, - 0x0a, 0xe9, 0x71, 0x00, 0xc3, 0x0d, 0xce, 0x47, 0x0c, 0x49, 0x06, 0x31, 0x35, 0x7a, 0xeb, 0x35, - 0x75, 0x97, 0x03, 0xb0, 0xe4, 0x47, 0x59, 0xef, 0x3b, 0x6e, 0x44, 0x59, 0xe7, 0x4e, 0x97, 0xf5, - 0x1d, 0xce, 0x06, 0x4b, 0x7e, 0xf6, 0x7f, 0xb4, 0x00, 0xd6, 0xfd, 0x1a, 0xc1, 0x24, 0xec, 0x34, - 0x23, 0xf4, 0x8b, 0x90, 0x6f, 0x37, 0x9c, 0x30, 0x69, 0xea, 0xcf, 0x6f, 0x52, 0xe0, 0xbd, 0xc3, - 0xa9, 0x22, 0xc5, 0x65, 0x7f, 0x30, 0x47, 0xd4, 0xc3, 0x59, 0x73, 0xc7, 0x87, 0xb3, 0xa2, 0x36, - 0x0c, 0xfb, 0x9d, 0x88, 0x2a, 0x65, 0xe2, 0x54, 0xcb, 0xc0, 0xd3, 0xb5, 0xc1, 0x09, 0xf2, 0x18, - 0x50, 0xf1, 0x07, 0x4b, 0x36, 0xf6, 0x8f, 0xc6, 0x79, 0xef, 0xc4, 0x14, 0x4f, 0x42, 0xce, 0x95, - 0xf7, 0x54, 0x10, 0xcd, 0xcc, 0x2d, 0xcf, 0xe3, 0x9c, 0x5b, 0x53, 0xab, 0x31, 0xd7, 0xf3, 0xe0, - 0x7a, 0x09, 0x46, 0x6a, 0x6e, 0xd8, 0x6e, 0x3a, 0x07, 0xeb, 0x29, 0x46, 0x82, 0xf9, 0xb8, 0x08, - 0xeb, 0x78, 0xe8, 0x05, 0x11, 0x82, 0x3c, 0x68, 0x5c, 0x0c, 0x65, 0x08, 0x72, 0x81, 0x36, 0x4f, - 0x8b, 0x3e, 0x7e, 0x19, 0x46, 0xe5, 0x51, 0xcc, 0xb8, 0xf0, 0x4b, 0xa1, 0x8a, 0xfa, 0xdc, 0xd2, - 0xca, 0xb0, 0x81, 0xd9, 0xa5, 0x38, 0x0c, 0x9d, 0xbd, 0xe2, 0xf0, 0x09, 0x18, 0x93, 0x7f, 0xd9, - 0x69, 0x5e, 0xba, 0xc8, 0x5a, 0xaf, 0x8c, 0x57, 0x5b, 0x7a, 0x21, 0x36, 0x71, 0xe3, 0xa5, 0x37, - 0xdc, 0xef, 0xd2, 0xbb, 0x0e, 0xb0, 0xed, 0x77, 0xbc, 0x9a, 0x13, 0x1c, 0x2c, 0xcf, 0x8b, 0x80, - 0x25, 0xa5, 0xa7, 0x94, 0x55, 0x09, 0xd6, 0xb0, 0xf4, 0xe5, 0x5a, 0xbc, 0xcf, 0x72, 0xfd, 0x34, - 0x14, 0x59, 0x70, 0x17, 0xa9, 0xcd, 0x46, 0xc2, 0x95, 0x7f, 0x92, 0x38, 0x20, 0xa5, 0x3c, 0x54, - 0x24, 0x11, 0x1c, 0xd3, 0x43, 0x6f, 0x02, 0xec, 0xb8, 0x9e, 0x1b, 0x36, 0x18, 0xf5, 0x91, 0x13, - 0x53, 0x57, 0xfd, 0x5c, 0x50, 0x54, 0xb0, 0x46, 0x11, 0xbd, 0x01, 0xe7, 0x49, 0x18, 0xb9, 0x2d, - 0x27, 0x22, 0x35, 0xf5, 0x22, 0xa3, 0xc4, 0x2c, 0x1b, 0x2a, 0xbc, 0xee, 0x66, 0x12, 0xe1, 0x5e, - 0x1a, 0x10, 0x77, 0x13, 0x42, 0x2f, 0x43, 0xa1, 0x1d, 0xf8, 0x75, 0xaa, 0xfc, 0x95, 0x26, 0xd9, - 0x30, 0x3e, 0x29, 0x15, 0xea, 0x4d, 0x01, 0xbf, 0xa7, 0xfd, 0xc6, 0x0a, 0x1b, 0xfd, 0xcc, 0x82, - 0xf3, 0x01, 0xe1, 0xfe, 0xdd, 0x50, 0x35, 0xec, 0x12, 0x93, 0x7a, 0xd5, 0x2c, 0x52, 0x63, 0xc8, - 0xcd, 0x3e, 0x8d, 0x93, 0x5c, 0xf8, 0x71, 0x4f, 0x64, 0xef, 0xbb, 0xca, 0xef, 0xa5, 0x01, 0xbf, - 0xf0, 0x83, 0xa9, 0xa9, 0xee, 0x3c, 0x2d, 0x8a, 0x38, 0xdd, 0x79, 0x7f, 0xed, 0x07, 0x53, 0x13, - 0xf2, 0x7f, 0x3c, 0x68, 0x5d, 0x9d, 0xa4, 0xa7, 0x57, 0xdb, 0xaf, 0x2d, 0x6f, 0x8a, 0x98, 0x0b, - 0x75, 0x7a, 0x6d, 0x52, 0x20, 0xe6, 0x65, 0xe8, 0x79, 0x28, 0xd4, 0x1c, 0xd2, 0xf2, 0x3d, 0x52, - 0x2b, 0x8d, 0xc5, 0x4e, 0xad, 0x79, 0x01, 0xc3, 0xaa, 0x14, 0x35, 0x61, 0xc8, 0x65, 0x37, 0x5c, - 0x11, 0x60, 0x95, 0xc1, 0xb5, 0x9a, 0xdf, 0x98, 0x65, 0x78, 0x15, 0x13, 0xa5, 0x82, 0x87, 0x2e, - 0xbb, 0xc7, 0xcf, 0x44, 0x76, 0xd3, 0x91, 0xa8, 0x36, 0xdc, 0x66, 0x2d, 0x20, 0x5e, 0x69, 0x82, - 0x5d, 0xf5, 0xd8, 0x48, 0xcc, 0x09, 0x18, 0x56, 0xa5, 0xe8, 0x2f, 0xc0, 0x98, 0xdf, 0x89, 0xd8, - 0x26, 0xa7, 0xf3, 0x1f, 0x96, 0xce, 0x33, 0x74, 0xe6, 0x2e, 0xdf, 0xd0, 0x0b, 0xb0, 0x89, 0x47, - 0x85, 0x6d, 0xc3, 0x0f, 0x23, 0xfa, 0x87, 0x09, 0xdb, 0xcb, 0xa6, 0xb0, 0x5d, 0xd2, 0xca, 0xb0, - 0x81, 0x89, 0xbe, 0x6e, 0xc1, 0xf9, 0x56, 0xf2, 0x02, 0x52, 0xba, 0xc2, 0x46, 0xa6, 0x92, 0x85, - 0xa2, 0x9a, 0x20, 0xcd, 0xa3, 0x0a, 0xbb, 0xc0, 0xb8, 0xbb, 0x11, 0xec, 0x55, 0x69, 0x78, 0xe0, - 0x55, 0x1b, 0x81, 0xef, 0x99, 0xcd, 0x7b, 0x3c, 0xab, 0x57, 0x00, 0x6c, 0x97, 0xa5, 0xb1, 0x28, - 0x3f, 0x7e, 0x74, 0x38, 0x75, 0x29, 0xb5, 0x08, 0xa7, 0x37, 0x6a, 0x72, 0x1e, 0x2e, 0xa7, 0xef, - 0xd4, 0xfb, 0x69, 0xcc, 0x03, 0xba, 0xc6, 0xbc, 0x00, 0x8f, 0xf7, 0x6c, 0x14, 0x95, 0xf9, 0x52, - 0xbd, 0xb2, 0x4c, 0x99, 0xdf, 0xa5, 0x0e, 0x9d, 0x83, 0x51, 0x3d, 0xbb, 0x0e, 0x8b, 0x5d, 0xd0, - 0x5e, 0x34, 0xa3, 0xf7, 0xa0, 0xe8, 0x57, 0x32, 0x0f, 0x02, 0xd8, 0xa8, 0x74, 0x05, 0x01, 0x28, - 0x10, 0x8e, 0x19, 0xf6, 0x13, 0xbb, 0x90, 0xfa, 0xfc, 0xfa, 0x11, 0x37, 0xfb, 0xc4, 0xb1, 0x0b, - 0xff, 0x61, 0x10, 0x62, 0x4a, 0xe8, 0x05, 0x28, 0x10, 0xaf, 0xd6, 0xf6, 0x5d, 0x2f, 0x4a, 0x5a, - 0x6f, 0x6e, 0x0a, 0x38, 0x56, 0x18, 0x5a, 0xa4, 0x43, 0xee, 0xd8, 0x48, 0x87, 0x1a, 0x8c, 0x3b, - 0xcc, 0x10, 0x1f, 0xfb, 0xa9, 0x07, 0x4e, 0xec, 0x58, 0x9a, 0x35, 0x29, 0xe0, 0x24, 0x49, 0xca, - 0x25, 0x8c, 0xab, 0x32, 0x2e, 0x83, 0x27, 0xe6, 0x52, 0x31, 0x29, 0xe0, 0x24, 0x49, 0xf4, 0x06, - 0x94, 0xaa, 0xec, 0x39, 0x0b, 0xef, 0xe3, 0xf2, 0xce, 0xba, 0x1f, 0x6d, 0x06, 0x24, 0x24, 0x1e, - 0x8f, 0x23, 0x28, 0x94, 0x9f, 0x16, 0xa3, 0x50, 0x9a, 0xeb, 0x81, 0x87, 0x7b, 0x52, 0xa0, 0x5a, - 0x1d, 0xf3, 0x22, 0xb8, 0xd1, 0xc1, 0x96, 0xbf, 0x4b, 0xa4, 0x8b, 0x43, 0x69, 0x75, 0x15, 0xbd, - 0x10, 0x9b, 0xb8, 0xe8, 0xd7, 0x2d, 0x18, 0x6b, 0x4a, 0x63, 0x1c, 0xee, 0x34, 0x65, 0xfe, 0x1e, - 0x9c, 0xc9, 0xf2, 0x5b, 0xd5, 0x29, 0x73, 0x81, 0x6f, 0x80, 0xb0, 0xc9, 0xdb, 0xfe, 0x9e, 0x05, - 0x13, 0xc9, 0x6a, 0x68, 0x17, 0x9e, 0x6a, 0x39, 0xc1, 0xee, 0xb2, 0xb7, 0x13, 0xb0, 0x40, 0xcf, - 0x88, 0xcf, 0xea, 0xec, 0x4e, 0x44, 0x82, 0x79, 0xe7, 0x80, 0x87, 0x73, 0xe5, 0x55, 0xca, 0xb1, - 0xa7, 0xd6, 0x8e, 0x43, 0xc6, 0xc7, 0xd3, 0x42, 0x15, 0xb8, 0x44, 0x11, 0xe6, 0x49, 0x93, 0x50, - 0x09, 0x15, 0x33, 0xc9, 0x31, 0x26, 0x2a, 0x60, 0x61, 0x2d, 0x0d, 0x09, 0xa7, 0xd7, 0xb5, 0x0b, - 0x30, 0xc4, 0x83, 0xdc, 0xed, 0x7f, 0x9f, 0x03, 0x79, 0x92, 0xfe, 0xf9, 0x36, 0x7c, 0x23, 0x1b, - 0x86, 0x02, 0x76, 0xa7, 0x15, 0x17, 0x35, 0xa6, 0xd4, 0xf0, 0x5b, 0x2e, 0x16, 0x25, 0x54, 0xc5, - 0x20, 0x77, 0xdd, 0x68, 0xce, 0xaf, 0xc9, 0xeb, 0x19, 0x53, 0x31, 0x6e, 0x0a, 0x18, 0x56, 0xa5, - 0xf6, 0xaf, 0x5a, 0x30, 0x46, 0x7b, 0xd9, 0x6c, 0x92, 0x66, 0x25, 0x22, 0xed, 0x10, 0x85, 0x90, - 0x0f, 0xe9, 0x8f, 0xec, 0x8c, 0x05, 0xf1, 0xdb, 0x06, 0xd2, 0xd6, 0xcc, 0xa2, 0x94, 0x09, 0xe6, - 0xbc, 0xec, 0x6f, 0x0f, 0x40, 0x51, 0x0d, 0x76, 0x1f, 0xb6, 0xd6, 0xeb, 0x71, 0x06, 0x06, 0x2e, - 0x0d, 0x4b, 0x5a, 0xf6, 0x05, 0x7a, 0xa7, 0x9a, 0xf5, 0x0e, 0xf8, 0x23, 0xca, 0x38, 0x15, 0xc3, - 0x0b, 0xa6, 0x53, 0xe7, 0xb2, 0xee, 0x29, 0xd0, 0xf0, 0x85, 0x77, 0xe7, 0xae, 0xee, 0x53, 0x1b, - 0xcc, 0xea, 0x64, 0x51, 0x0e, 0x83, 0xde, 0xce, 0xb4, 0x44, 0x1a, 0xb1, 0x7c, 0x5f, 0x69, 0xc4, - 0xae, 0xc1, 0x20, 0xf1, 0x3a, 0x2d, 0x16, 0xe8, 0x5e, 0x64, 0x3a, 0xd5, 0xe0, 0x4d, 0xaf, 0xd3, - 0x32, 0x7b, 0xc6, 0x50, 0xd0, 0x27, 0x61, 0xa4, 0x46, 0xc2, 0x6a, 0xe0, 0xb2, 0x97, 0x81, 0xe2, - 0x52, 0xfa, 0x24, 0xbb, 0xe9, 0xc7, 0x60, 0xb3, 0xa2, 0x5e, 0xc1, 0x7e, 0x07, 0x86, 0x36, 0x9b, - 0x9d, 0xba, 0xeb, 0xa1, 0x36, 0x0c, 0xf1, 0x77, 0x82, 0xe2, 0xe4, 0xcd, 0x40, 0x51, 0xe7, 0xbb, - 0x5d, 0x8b, 0xef, 0xe6, 0x4f, 0x5c, 0x04, 0x1f, 0xfb, 0x9f, 0x5a, 0x40, 0x6f, 0x15, 0x8b, 0x73, - 0xe8, 0x2f, 0x41, 0x21, 0x94, 0x8f, 0x40, 0xf9, 0x32, 0xf9, 0x88, 0x8a, 0x03, 0x15, 0xf0, 0x7b, - 0x87, 0x53, 0x63, 0x0c, 0x59, 0xbd, 0xdb, 0x54, 0x55, 0x50, 0x13, 0xc6, 0x98, 0x35, 0x54, 0x9e, - 0x47, 0xc2, 0x7e, 0x7d, 0xa3, 0xcf, 0xa7, 0x75, 0x7a, 0x55, 0x21, 0x9d, 0x75, 0x10, 0x36, 0x89, - 0xdb, 0xff, 0x7c, 0x10, 0x34, 0xa3, 0x61, 0x1f, 0xcb, 0xfb, 0xed, 0x84, 0x89, 0x78, 0x2d, 0x13, - 0x13, 0xb1, 0xb4, 0xbb, 0x72, 0x91, 0x61, 0x5a, 0x85, 0x69, 0xa3, 0x1a, 0xa4, 0xd9, 0x16, 0x9b, - 0x43, 0x35, 0x6a, 0x89, 0x34, 0xdb, 0x98, 0x95, 0xa8, 0x47, 0x02, 0x83, 0x3d, 0x1f, 0x09, 0x34, - 0x20, 0x5f, 0x77, 0x3a, 0x75, 0x22, 0x62, 0x3f, 0x32, 0xf0, 0x06, 0xb0, 0xa8, 0x49, 0xee, 0x0d, - 0x60, 0x3f, 0x31, 0x67, 0x40, 0x77, 0x67, 0x43, 0x7a, 0x6b, 0x85, 0x41, 0x28, 0x83, 0xdd, 0xa9, - 0x1c, 0xc0, 0x7c, 0x77, 0xaa, 0xbf, 0x38, 0x66, 0x46, 0xef, 0x8b, 0x55, 0xfe, 0x22, 0x57, 0x1c, - 0xf8, 0xcb, 0x59, 0xbc, 0x82, 0x60, 0x04, 0xf9, 0x7d, 0x51, 0xfc, 0xc1, 0x92, 0x8d, 0x3d, 0x03, - 0x23, 0x5a, 0x32, 0x30, 0x3a, 0x0d, 0xea, 0x31, 0xa8, 0x36, 0x0d, 0xf3, 0x4e, 0xe4, 0x60, 0x56, - 0x62, 0xff, 0xdd, 0x01, 0x50, 0xf7, 0x76, 0x3d, 0x66, 0xdf, 0xa9, 0x6a, 0x4f, 0xd7, 0x8d, 0xc7, - 0x62, 0xbe, 0x87, 0x45, 0x29, 0x55, 0x8a, 0x5a, 0x24, 0xa8, 0xab, 0x9b, 0x82, 0x90, 0xaf, 0x4a, - 0x29, 0x5a, 0xd3, 0x0b, 0xb1, 0x89, 0x4b, 0x35, 0xda, 0x96, 0xe3, 0xb9, 0x3b, 0x24, 0x8c, 0x92, - 0xa1, 0x57, 0x6b, 0x02, 0x8e, 0x15, 0x06, 0x5a, 0x84, 0xf3, 0x21, 0x89, 0x36, 0xf6, 0x3d, 0x12, - 0xa8, 0x47, 0x6c, 0xe2, 0x55, 0xa3, 0x0a, 0x47, 0xac, 0x24, 0x11, 0x70, 0x77, 0x9d, 0xd4, 0x70, - 0x95, 0xfc, 0x89, 0xc3, 0x55, 0xe6, 0x61, 0x62, 0xc7, 0x71, 0x9b, 0x9d, 0x80, 0xf4, 0x0c, 0x7a, - 0x59, 0x48, 0x94, 0xe3, 0xae, 0x1a, 0x2c, 0x22, 0xb6, 0xe9, 0xd4, 0xc3, 0xd2, 0xb0, 0x16, 0x11, - 0x4b, 0x01, 0x98, 0xc3, 0xed, 0x7f, 0x64, 0x01, 0x7f, 0x4e, 0x3e, 0xbb, 0xb3, 0xe3, 0x7a, 0x6e, - 0x74, 0x80, 0x7e, 0xdb, 0x82, 0x09, 0xcf, 0xaf, 0x91, 0x59, 0x2f, 0x72, 0x25, 0x30, 0xbb, 0x4c, - 0x49, 0x8c, 0xd7, 0x7a, 0x82, 0x3c, 0x7f, 0x9b, 0x98, 0x84, 0xe2, 0xae, 0x66, 0xd8, 0x57, 0xe0, - 0x52, 0x2a, 0x01, 0xfb, 0x7b, 0x03, 0x60, 0xbe, 0x8a, 0x47, 0xaf, 0x42, 0xbe, 0xc9, 0xde, 0x69, - 0x5a, 0x0f, 0x98, 0xee, 0x80, 0x8d, 0x15, 0x7f, 0xc8, 0xc9, 0x29, 0xa1, 0x79, 0x18, 0x61, 0x4f, - 0xed, 0xc5, 0x2b, 0x5a, 0xbe, 0x14, 0xed, 0x38, 0x95, 0xa4, 0x2a, 0xba, 0x67, 0xfe, 0xc5, 0x7a, - 0x35, 0xf4, 0x2e, 0x0c, 0x6f, 0xf3, 0x6c, 0x32, 0xd9, 0x99, 0xe7, 0x45, 0x7a, 0x1a, 0xa6, 0x45, - 0xc8, 0x5c, 0x35, 0xf7, 0xe2, 0x9f, 0x58, 0x72, 0x44, 0x07, 0x50, 0x70, 0xe4, 0x9c, 0x0e, 0x66, - 0x15, 0x43, 0x69, 0xac, 0x1f, 0xae, 0xdb, 0xa9, 0x39, 0x54, 0xec, 0x12, 0xee, 0xee, 0x7c, 0x5f, - 0xee, 0xee, 0x6f, 0x59, 0x00, 0x71, 0x9e, 0x39, 0x74, 0x17, 0x0a, 0xe1, 0x0d, 0xe3, 0x7a, 0x9d, - 0xc5, 0xb3, 0x34, 0x41, 0x51, 0x7b, 0xba, 0x21, 0x20, 0x58, 0x71, 0xbb, 0x9f, 0x49, 0xe0, 0xcf, - 0x2c, 0xb8, 0x98, 0x96, 0x0f, 0xef, 0x11, 0xb6, 0xf8, 0xa4, 0xd6, 0x00, 0x51, 0x61, 0x33, 0x20, - 0x3b, 0xee, 0xdd, 0xa4, 0x63, 0x7e, 0x45, 0x16, 0xe0, 0x18, 0xc7, 0xfe, 0xce, 0x10, 0x28, 0xc6, - 0xa7, 0x64, 0x3d, 0x78, 0x8e, 0xde, 0x2e, 0xea, 0x71, 0x96, 0x23, 0x85, 0x87, 0x19, 0x14, 0x8b, - 0x52, 0x7a, 0xc3, 0x90, 0x31, 0x78, 0x42, 0x64, 0xb3, 0x55, 0x28, 0x63, 0xf5, 0xb0, 0x2a, 0x4d, - 0xb3, 0x47, 0xe4, 0xcf, 0xc4, 0x1e, 0x31, 0x94, 0xbd, 0x3d, 0xe2, 0x1a, 0x0c, 0x07, 0x7e, 0x93, - 0xcc, 0xe2, 0x75, 0xa1, 0x37, 0xc7, 0xd9, 0xb9, 0x38, 0x18, 0xcb, 0x72, 0xf4, 0x12, 0x8c, 0x74, - 0x42, 0x52, 0x99, 0x5f, 0x99, 0x0b, 0x48, 0x2d, 0x14, 0x61, 0xfb, 0xca, 0xa9, 0x76, 0x2b, 0x2e, - 0xc2, 0x3a, 0x1e, 0xfa, 0x8e, 0x75, 0x8c, 0xc9, 0xa3, 0x98, 0xd5, 0x99, 0x90, 0x9a, 0x23, 0x84, - 0x5d, 0x02, 0x1e, 0xc4, 0x8e, 0xf2, 0x0d, 0x0b, 0xce, 0x13, 0xaf, 0x1a, 0x1c, 0x30, 0x3a, 0x82, - 0x9a, 0x70, 0x2c, 0xdd, 0xca, 0x62, 0xf3, 0xdd, 0x4c, 0x12, 0xe7, 0x56, 0xe3, 0x2e, 0x30, 0xee, - 0x6e, 0x86, 0xfd, 0xa3, 0x1c, 0x5c, 0x48, 0xa1, 0xc0, 0x42, 0x9c, 0x5b, 0x74, 0x01, 0x2d, 0xd7, - 0x92, 0xdb, 0x67, 0x45, 0xc0, 0xb1, 0xc2, 0x40, 0x9b, 0x70, 0x71, 0xb7, 0x15, 0xc6, 0x54, 0xe6, - 0x7c, 0x2f, 0x22, 0x77, 0xe5, 0x66, 0x92, 0x3e, 0xa2, 0x8b, 0x2b, 0x29, 0x38, 0x38, 0xb5, 0x26, - 0xd5, 0x36, 0x88, 0xe7, 0x6c, 0x37, 0x49, 0x5c, 0x24, 0x02, 0xf4, 0x95, 0xb6, 0x71, 0x33, 0x51, - 0x8e, 0xbb, 0x6a, 0xa0, 0x2f, 0x5b, 0xf0, 0x44, 0x48, 0x82, 0x3d, 0x12, 0x54, 0xdc, 0x1a, 0x99, - 0xeb, 0x84, 0x91, 0xdf, 0x22, 0xc1, 0x03, 0xda, 0xe4, 0xa6, 0x8e, 0x0e, 0xa7, 0x9e, 0xa8, 0xf4, - 0xa6, 0x86, 0x8f, 0x63, 0x65, 0x7f, 0xd9, 0x82, 0x73, 0x15, 0x76, 0x4b, 0x54, 0x3a, 0x67, 0xd6, - 0x49, 0x9d, 0x9e, 0x53, 0x8f, 0x35, 0x13, 0x42, 0xcc, 0x7c, 0x5e, 0x69, 0xbf, 0x05, 0x13, 0x15, - 0xd2, 0x72, 0xda, 0x0d, 0xf6, 0xf6, 0x85, 0x87, 0x22, 0xcc, 0x40, 0x31, 0x94, 0xb0, 0x64, 0x36, - 0x4c, 0x85, 0x8c, 0x63, 0x1c, 0xf4, 0x2c, 0x0f, 0x9b, 0x90, 0xf1, 0xc1, 0x45, 0xae, 0x9d, 0xf3, - 0x58, 0x8b, 0x10, 0xcb, 0x32, 0x7b, 0x1f, 0x46, 0xe3, 0xea, 0x64, 0x07, 0xd5, 0x61, 0xbc, 0xaa, - 0x85, 0xb7, 0xc7, 0x91, 0xaf, 0xfd, 0x47, 0xc2, 0x33, 0x59, 0x34, 0x67, 0x12, 0xc1, 0x49, 0xaa, - 0xf6, 0x57, 0x73, 0x30, 0xae, 0x38, 0x0b, 0x87, 0xc0, 0xfb, 0xc9, 0x50, 0x0f, 0x9c, 0xc5, 0x23, - 0x72, 0x73, 0x24, 0x8f, 0x09, 0xf7, 0x78, 0x3f, 0x19, 0xee, 0x71, 0xaa, 0xec, 0xbb, 0x7c, 0x1c, - 0xdf, 0xca, 0x41, 0x41, 0x3d, 0x69, 0x7f, 0x15, 0xf2, 0xec, 0x02, 0xf5, 0x70, 0xda, 0x28, 0xbb, - 0x8c, 0x61, 0x4e, 0x89, 0x92, 0x64, 0x7e, 0xee, 0x07, 0xce, 0xe7, 0x55, 0xe4, 0x76, 0x2f, 0x27, - 0x88, 0x30, 0xa7, 0x84, 0x56, 0x60, 0x80, 0x78, 0x35, 0xa1, 0x96, 0x9e, 0x9c, 0x20, 0xcb, 0x04, - 0x7b, 0xd3, 0xab, 0x61, 0x4a, 0x85, 0x25, 0x95, 0xe2, 0xda, 0xc7, 0xa0, 0xb9, 0x3d, 0x84, 0xea, - 0x21, 0x4a, 0xed, 0x5f, 0x1f, 0x80, 0xa1, 0x4a, 0x67, 0x9b, 0x2a, 0xd8, 0xbf, 0x6b, 0xc1, 0x85, - 0xfd, 0x44, 0xfe, 0xb9, 0x78, 0xc9, 0xde, 0xca, 0xce, 0xf6, 0xa7, 0xc7, 0x5a, 0x3c, 0x21, 0xda, - 0x75, 0x21, 0xa5, 0x10, 0xa7, 0x35, 0xc7, 0xc8, 0x37, 0x35, 0x70, 0x2a, 0xf9, 0xa6, 0xee, 0x9e, - 0x72, 0x6c, 0xec, 0x58, 0xaf, 0xb8, 0x58, 0xfb, 0x67, 0x79, 0x00, 0x3e, 0x1b, 0x1b, 0xed, 0xa8, - 0x1f, 0xe3, 0xd0, 0xcb, 0x30, 0x2a, 0x3f, 0x27, 0xb2, 0x1e, 0x07, 0xf6, 0x28, 0xe7, 0xee, 0xa2, - 0x56, 0x86, 0x0d, 0x4c, 0x76, 0x21, 0xf0, 0xa2, 0xe0, 0x80, 0x2b, 0x8d, 0xc9, 0xf8, 0x57, 0x55, - 0x82, 0x35, 0x2c, 0x34, 0x6d, 0x18, 0xdb, 0x79, 0xee, 0x8d, 0x73, 0xc7, 0xd8, 0xc6, 0x3f, 0x01, - 0x63, 0xea, 0xdf, 0x82, 0xdb, 0x24, 0x49, 0xa7, 0xca, 0xa6, 0x5e, 0x88, 0x4d, 0x5c, 0xf4, 0x49, - 0x38, 0x67, 0x3e, 0xa1, 0x15, 0x6a, 0x96, 0x7a, 0xc0, 0x6e, 0xbe, 0xbc, 0xc5, 0x09, 0x6c, 0xba, - 0x03, 0x6a, 0xc1, 0x01, 0xee, 0x78, 0x42, 0xdf, 0x52, 0x3b, 0x60, 0x9e, 0x41, 0xb1, 0x28, 0xa5, - 0x43, 0xc8, 0x8f, 0x32, 0x0e, 0x17, 0x6f, 0x20, 0xd5, 0x10, 0x56, 0xb4, 0x32, 0x6c, 0x60, 0x52, - 0x0e, 0xc2, 0x32, 0x07, 0xe6, 0x1e, 0x4b, 0x98, 0xd3, 0xda, 0x70, 0xce, 0x37, 0x0d, 0x1b, 0x3c, - 0x14, 0xe6, 0x63, 0x7d, 0xae, 0x5b, 0xa3, 0x2e, 0x7f, 0xb3, 0x93, 0xb0, 0x83, 0x24, 0xe8, 0x53, - 0x85, 0x53, 0x0f, 0x75, 0x1d, 0x35, 0xa3, 0xb8, 0x7a, 0x46, 0xa3, 0x6e, 0xc2, 0xc5, 0xb6, 0x5f, - 0xdb, 0x0c, 0x5c, 0x3f, 0x70, 0xa3, 0x83, 0xb9, 0xa6, 0x13, 0x86, 0x6c, 0x55, 0x8d, 0x99, 0x9a, - 0xcd, 0x66, 0x0a, 0x0e, 0x4e, 0xad, 0x49, 0xaf, 0x06, 0x6d, 0x01, 0x64, 0x11, 0x1c, 0x79, 0x7e, - 0x35, 0x90, 0x88, 0x58, 0x95, 0xda, 0x17, 0xe0, 0x7c, 0xa5, 0xd3, 0x6e, 0x37, 0x5d, 0x52, 0x53, - 0x96, 0x70, 0xfb, 0x97, 0x60, 0x5c, 0xa4, 0xb2, 0x52, 0x7a, 0xc4, 0x89, 0x12, 0x2f, 0xda, 0x3f, - 0xb3, 0x60, 0x3c, 0xe1, 0x2f, 0x47, 0xef, 0x26, 0x4f, 0xff, 0x4c, 0x1c, 0x1b, 0xfa, 0xc1, 0xcf, - 0x77, 0x78, 0xaa, 0x26, 0xd1, 0x90, 0xd1, 0x9d, 0x99, 0x05, 0x49, 0xb3, 0x18, 0x48, 0x7e, 0x9c, - 0xe8, 0x21, 0xa2, 0xf6, 0x97, 0x72, 0x90, 0x1e, 0xa4, 0x80, 0x3e, 0xdb, 0x3d, 0x00, 0xaf, 0x66, - 0x38, 0x00, 0x22, 0x4a, 0xa2, 0xf7, 0x18, 0x78, 0xe6, 0x18, 0xac, 0x65, 0x34, 0x06, 0x82, 0x6f, - 0xf7, 0x48, 0xfc, 0x2f, 0x0b, 0x46, 0xb6, 0xb6, 0x56, 0x95, 0x71, 0x0a, 0xc3, 0xe5, 0x90, 0x3f, - 0x6e, 0x63, 0xde, 0xc5, 0x39, 0xbf, 0xd5, 0xe6, 0xce, 0x46, 0xe1, 0x04, 0x65, 0x59, 0xc5, 0x2a, - 0xa9, 0x18, 0xb8, 0x47, 0x4d, 0xb4, 0x0c, 0x17, 0xf4, 0x12, 0x61, 0x62, 0x14, 0x0e, 0x4f, 0xfe, - 0xdc, 0xbb, 0xbb, 0x18, 0xa7, 0xd5, 0x49, 0x92, 0x12, 0x76, 0x46, 0xf1, 0x91, 0x9c, 0x2e, 0x52, - 0xa2, 0x18, 0xa7, 0xd5, 0xb1, 0x37, 0x60, 0x44, 0xfb, 0x64, 0x13, 0xfa, 0x14, 0x4c, 0x54, 0xfd, - 0x96, 0xb4, 0xef, 0xac, 0x92, 0x3d, 0xd2, 0x14, 0x5d, 0x66, 0x26, 0xc0, 0xb9, 0x44, 0x19, 0xee, - 0xc2, 0xb6, 0xff, 0xc7, 0x55, 0x50, 0xaf, 0x49, 0xfa, 0x38, 0x9e, 0xda, 0x2a, 0x7c, 0x2b, 0x9f, - 0x71, 0xf8, 0x96, 0x92, 0xb5, 0x89, 0x10, 0xae, 0x28, 0x0e, 0xe1, 0x1a, 0xca, 0x3a, 0x84, 0x4b, - 0x69, 0x9b, 0x5d, 0x61, 0x5c, 0x5f, 0xb3, 0x60, 0xd4, 0xf3, 0x6b, 0x44, 0xb9, 0x90, 0x86, 0x99, - 0xca, 0xfb, 0x46, 0x76, 0x71, 0xa9, 0x3c, 0x1c, 0x49, 0x90, 0xe7, 0x41, 0x7e, 0xea, 0x88, 0xd2, - 0x8b, 0xb0, 0xd1, 0x0e, 0xb4, 0xa0, 0x59, 0x1c, 0x79, 0x2a, 0xa9, 0x27, 0xd3, 0xae, 0x1e, 0xf7, - 0x35, 0x1f, 0xde, 0xd5, 0x94, 0xae, 0x62, 0x56, 0x96, 0x34, 0xf9, 0x52, 0x41, 0x73, 0x0c, 0xc8, - 0xc4, 0x78, 0xb1, 0x32, 0x66, 0xc3, 0x10, 0x8f, 0x06, 0x14, 0x1f, 0x0f, 0x62, 0xfe, 0x2a, 0x1e, - 0x29, 0x88, 0x45, 0x09, 0x8a, 0xa4, 0x9b, 0x7a, 0x24, 0xab, 0x34, 0xb7, 0x86, 0x1b, 0x3c, 0xdd, - 0x4f, 0x8d, 0x5e, 0xd1, 0x6f, 0xb4, 0xa3, 0xfd, 0xdc, 0x68, 0xc7, 0x7a, 0xde, 0x66, 0xbf, 0x62, - 0xc1, 0x68, 0x55, 0x4b, 0x3b, 0x5b, 0x7a, 0x3e, 0xab, 0x0f, 0x85, 0xa4, 0x65, 0x07, 0xe6, 0x4f, - 0x2a, 0x8d, 0x34, 0xb7, 0x06, 0x77, 0x96, 0x09, 0x89, 0x5d, 0xdf, 0xd9, 0xd1, 0x3f, 0x72, 0x7d, - 0x33, 0x83, 0xe3, 0xc1, 0x30, 0x07, 0xf0, 0x69, 0xe4, 0x30, 0x2c, 0x78, 0xa1, 0xf7, 0xa0, 0x20, - 0x03, 0x4a, 0x45, 0xb8, 0x27, 0xce, 0xc2, 0x3c, 0x6e, 0x3a, 0xbf, 0x64, 0xfe, 0x14, 0x0e, 0xc5, - 0x8a, 0x23, 0x6a, 0xc0, 0x40, 0xcd, 0xa9, 0x8b, 0xc0, 0xcf, 0xb5, 0x6c, 0xd2, 0x53, 0x49, 0x9e, - 0xec, 0x6e, 0x36, 0x3f, 0xbb, 0x88, 0x29, 0x0b, 0x74, 0x37, 0xce, 0xdb, 0x39, 0x91, 0xd9, 0xe9, - 0x6b, 0xaa, 0x49, 0xdc, 0x40, 0xd1, 0x95, 0x06, 0xb4, 0x26, 0xfc, 0x85, 0xff, 0x1f, 0x63, 0xbb, - 0x90, 0x4d, 0x7e, 0x2b, 0xfe, 0xb5, 0x95, 0xd8, 0xe7, 0x48, 0xb9, 0xb0, 0xaf, 0x4c, 0xfd, 0x7c, - 0x56, 0x5c, 0x96, 0xb6, 0xb6, 0x36, 0xbb, 0xbe, 0x2e, 0xd5, 0x84, 0xa1, 0x36, 0x8b, 0x3d, 0x28, - 0xfd, 0x42, 0x56, 0x67, 0x0b, 0x8f, 0x65, 0xe0, 0x6b, 0x93, 0xff, 0xc6, 0x82, 0x07, 0xba, 0x09, - 0xc3, 0x3c, 0xfd, 0x34, 0x0f, 0xbc, 0x1d, 0xb9, 0x3e, 0xd9, 0x3b, 0x89, 0x75, 0x7c, 0x50, 0xf0, - 0xff, 0x21, 0x96, 0x75, 0xd1, 0x57, 0x2d, 0x38, 0x47, 0x25, 0x6a, 0x9c, 0x2f, 0xbb, 0x84, 0xb2, - 0x92, 0x59, 0xb7, 0x42, 0xaa, 0x91, 0x48, 0x59, 0xa3, 0xae, 0x49, 0xcb, 0x06, 0x3b, 0x9c, 0x60, - 0x8f, 0xde, 0x87, 0x42, 0xe8, 0xd6, 0x48, 0xd5, 0x09, 0xc2, 0xd2, 0x85, 0xd3, 0x69, 0x4a, 0xec, - 0x28, 0x11, 0x8c, 0xb0, 0x62, 0x89, 0xfe, 0x26, 0xfb, 0xf4, 0x86, 0xf8, 0x4c, 0x92, 0xf8, 0x82, - 0xdf, 0xc5, 0x53, 0xfb, 0x82, 0x1f, 0xf7, 0x1f, 0x98, 0xec, 0x70, 0x92, 0x3f, 0xfa, 0xab, 0x16, - 0x5c, 0xe2, 0xe9, 0x52, 0x93, 0xb9, 0x72, 0x2f, 0x3d, 0xa0, 0x6d, 0x86, 0x45, 0x0c, 0xcf, 0xa6, - 0x91, 0xc4, 0xe9, 0x9c, 0x58, 0xbe, 0x35, 0x33, 0xbd, 0xf9, 0xe5, 0x4c, 0x1d, 0x86, 0xfd, 0xa7, - 0x34, 0x47, 0x2f, 0xc2, 0x48, 0x5b, 0x1c, 0x87, 0x6e, 0xd8, 0x62, 0xf1, 0xdf, 0x03, 0xfc, 0x8d, - 0xcc, 0x66, 0x0c, 0xc6, 0x3a, 0x8e, 0x91, 0x7c, 0xef, 0xda, 0x71, 0xc9, 0xf7, 0xd0, 0x2d, 0x18, - 0x89, 0xfc, 0x26, 0x09, 0xc4, 0x4d, 0xb5, 0xc4, 0x56, 0xe0, 0xd5, 0xb4, 0xbd, 0xb5, 0xa5, 0xd0, - 0xe2, 0x9b, 0x6c, 0x0c, 0x0b, 0xb1, 0x4e, 0x87, 0x85, 0x73, 0x8a, 0x34, 0xb4, 0x01, 0xbb, 0xc2, - 0x3e, 0x9e, 0x08, 0xe7, 0xd4, 0x0b, 0xb1, 0x89, 0x8b, 0x16, 0xe1, 0x7c, 0xbb, 0xeb, 0x0e, 0xcc, - 0x5f, 0x80, 0xa8, 0x58, 0x84, 0xee, 0x0b, 0x70, 0x77, 0x1d, 0xe3, 0xf6, 0xfb, 0xc4, 0x71, 0xb7, - 0xdf, 0x1e, 0xa9, 0xe8, 0x9e, 0x7c, 0x90, 0x54, 0x74, 0xa8, 0x06, 0x4f, 0x3a, 0x9d, 0xc8, 0x67, - 0xd9, 0x03, 0xcc, 0x2a, 0x3c, 0xb2, 0xf5, 0x69, 0x1e, 0x2c, 0x7b, 0x74, 0x38, 0xf5, 0xe4, 0xec, - 0x31, 0x78, 0xf8, 0x58, 0x2a, 0xe8, 0x1d, 0x28, 0x10, 0x91, 0x4e, 0xaf, 0xf4, 0x91, 0xac, 0x94, - 0x04, 0x33, 0x41, 0x9f, 0x0c, 0x54, 0xe4, 0x30, 0xac, 0xf8, 0xa1, 0x2d, 0x18, 0x69, 0xf8, 0x61, - 0x34, 0xdb, 0x74, 0x9d, 0x90, 0x84, 0xa5, 0xa7, 0xd8, 0xa2, 0x49, 0xd5, 0xbd, 0x96, 0x24, 0x5a, - 0xbc, 0x66, 0x96, 0xe2, 0x9a, 0x58, 0x27, 0x83, 0x08, 0x73, 0x1b, 0xb2, 0xb0, 0x5e, 0xe9, 0xd2, - 0xb9, 0xca, 0x3a, 0xf6, 0x5c, 0x1a, 0xe5, 0x4d, 0xbf, 0x56, 0x31, 0xb1, 0x95, 0xdf, 0x50, 0x07, - 0xe2, 0x24, 0x4d, 0xf4, 0x32, 0x8c, 0xb6, 0xfd, 0x5a, 0xa5, 0x4d, 0xaa, 0x9b, 0x4e, 0x54, 0x6d, - 0x94, 0xa6, 0x4c, 0x93, 0xdd, 0xa6, 0x56, 0x86, 0x0d, 0x4c, 0xd4, 0x86, 0xe1, 0x16, 0x7f, 0xdd, - 0x5a, 0x7a, 0x26, 0xab, 0xbb, 0x8d, 0x78, 0x2e, 0xcb, 0xf5, 0x05, 0xf1, 0x07, 0x4b, 0x36, 0xe8, - 0x1f, 0x58, 0x30, 0x9e, 0x78, 0xd1, 0x50, 0xfa, 0xb9, 0xcc, 0x54, 0x16, 0x93, 0x70, 0xf9, 0x39, - 0x36, 0x7c, 0x26, 0xf0, 0x5e, 0x37, 0x08, 0x27, 0x5b, 0xc4, 0xc7, 0x85, 0x3d, 0x51, 0x2f, 0x3d, - 0x9b, 0xdd, 0xb8, 0x30, 0x82, 0x72, 0x5c, 0xd8, 0x1f, 0x2c, 0xd9, 0xa0, 0x6b, 0x30, 0x2c, 0xb2, - 0xe4, 0x94, 0x9e, 0x33, 0x7d, 0xbf, 0x22, 0x99, 0x0e, 0x96, 0xe5, 0x93, 0xbf, 0x04, 0xe7, 0xbb, - 0xae, 0x6e, 0x27, 0x7a, 0x27, 0xfd, 0x5b, 0x16, 0xe8, 0x8f, 0x11, 0x33, 0xcf, 0x61, 0xfd, 0x32, - 0x8c, 0x56, 0xf9, 0xc7, 0x67, 0xf8, 0x73, 0xc6, 0x41, 0xd3, 0xfe, 0x39, 0xa7, 0x95, 0x61, 0x03, - 0xd3, 0x5e, 0x02, 0xd4, 0x9d, 0x60, 0xf4, 0x81, 0xb2, 0x5f, 0xfc, 0x9e, 0x05, 0x63, 0x86, 0xce, - 0x90, 0xb9, 0xbb, 0x70, 0x01, 0x50, 0xcb, 0x0d, 0x02, 0x3f, 0xd0, 0x3f, 0x29, 0x22, 0x32, 0x2a, - 0xb2, 0x6c, 0x53, 0x6b, 0x5d, 0xa5, 0x38, 0xa5, 0x86, 0xfd, 0x4f, 0x06, 0x21, 0x8e, 0xd4, 0x55, - 0x79, 0xe6, 0xac, 0x9e, 0x79, 0xe6, 0x5e, 0x80, 0xc2, 0x5b, 0xa1, 0xef, 0x6d, 0xc6, 0xd9, 0xe8, - 0xd4, 0x5c, 0xbc, 0x52, 0xd9, 0x58, 0x67, 0x98, 0x0a, 0x83, 0x61, 0xbf, 0xbd, 0xe0, 0x36, 0xa3, - 0xee, 0x74, 0x65, 0xaf, 0xbc, 0xca, 0xe1, 0x58, 0x61, 0xb0, 0xaf, 0x8b, 0xec, 0x11, 0x65, 0x18, - 0x8f, 0xbf, 0x2e, 0xc2, 0x73, 0x07, 0xb3, 0x32, 0x34, 0x03, 0x45, 0x65, 0x57, 0x17, 0x66, 0x7e, - 0x35, 0x52, 0xca, 0xfe, 0x8e, 0x63, 0x1c, 0xa6, 0x10, 0x0a, 0x43, 0xac, 0x30, 0xa1, 0x54, 0xb2, - 0xb8, 0x9e, 0x24, 0x4c, 0xbb, 0x5c, 0xb6, 0x4b, 0x30, 0x56, 0x2c, 0xd3, 0x7c, 0xa6, 0xc5, 0xd3, - 0xf0, 0x99, 0xea, 0x61, 0xe3, 0xf9, 0x7e, 0xc3, 0xc6, 0xcd, 0xb5, 0x5d, 0xe8, 0x6b, 0x6d, 0xff, - 0xda, 0x00, 0x0c, 0xdf, 0x26, 0x01, 0xcb, 0xa1, 0x79, 0x0d, 0x86, 0xf7, 0xf8, 0xcf, 0xe4, 0x23, - 0x2d, 0x81, 0x81, 0x65, 0x39, 0x9d, 0xb7, 0xed, 0x8e, 0xdb, 0xac, 0xcd, 0xc7, 0xbb, 0x58, 0xcd, - 0x5b, 0x59, 0x16, 0xe0, 0x18, 0x87, 0x56, 0xa8, 0x53, 0xcd, 0xbe, 0xd5, 0x72, 0xa3, 0x64, 0x04, - 0xd1, 0xa2, 0x2c, 0xc0, 0x31, 0x0e, 0x7a, 0x0e, 0x86, 0xea, 0x6e, 0xb4, 0xe5, 0xd4, 0x93, 0x2e, - 0xc2, 0x45, 0x06, 0xc5, 0xa2, 0x94, 0xf9, 0x98, 0xdc, 0x68, 0x2b, 0x20, 0xcc, 0xb2, 0xdb, 0xf5, - 0x5a, 0x7b, 0x51, 0x2b, 0xc3, 0x06, 0x26, 0x6b, 0x92, 0x2f, 0x7a, 0x26, 0x7c, 0x3f, 0x71, 0x93, - 0x64, 0x01, 0x8e, 0x71, 0xe8, 0xfa, 0xaf, 0xfa, 0xad, 0xb6, 0xdb, 0x14, 0x11, 0xb5, 0xda, 0xfa, - 0x9f, 0x13, 0x70, 0xac, 0x30, 0x28, 0x36, 0x15, 0x61, 0x54, 0xfc, 0x24, 0xbf, 0xe4, 0xb0, 0x29, - 0xe0, 0x58, 0x61, 0xd8, 0xb7, 0x61, 0x8c, 0xef, 0xe4, 0xb9, 0xa6, 0xe3, 0xb6, 0x16, 0xe7, 0xd0, - 0xcd, 0xae, 0xb0, 0xf1, 0x6b, 0x29, 0x61, 0xe3, 0x97, 0x8c, 0x4a, 0xdd, 0xe1, 0xe3, 0xf6, 0xf7, - 0x73, 0x50, 0x38, 0xc3, 0x8f, 0xe1, 0x9c, 0xf9, 0xa7, 0xd6, 0xd0, 0xdd, 0xc4, 0x87, 0x70, 0x36, - 0xb3, 0x7c, 0x05, 0x72, 0xec, 0x47, 0x70, 0x7e, 0x6a, 0xc1, 0x45, 0x89, 0xca, 0x84, 0x5a, 0xd9, - 0xf5, 0x58, 0x70, 0xc1, 0xe9, 0x0f, 0xf3, 0x7b, 0xc6, 0x30, 0xbf, 0x9e, 0x5d, 0x97, 0xf5, 0x7e, - 0xf4, 0xfc, 0xba, 0xdd, 0x4f, 0x2c, 0x28, 0xa5, 0x55, 0x38, 0x83, 0xaf, 0x00, 0xbd, 0x6b, 0x7e, - 0x05, 0xe8, 0xf6, 0xe9, 0xf4, 0xbc, 0xc7, 0xd7, 0x80, 0x7e, 0xda, 0xa3, 0xdf, 0xec, 0xd3, 0x3b, - 0x4d, 0x79, 0xdc, 0x59, 0x59, 0xb9, 0xce, 0x38, 0x8b, 0xf4, 0x73, 0xb3, 0x09, 0x43, 0x21, 0xf3, - 0xc4, 0x8b, 0x25, 0xb0, 0x94, 0xc5, 0x21, 0x48, 0xe9, 0x09, 0xd3, 0x27, 0xfb, 0x8d, 0x05, 0x0f, - 0xfb, 0x3f, 0x5b, 0x30, 0x7a, 0x86, 0x9f, 0x7a, 0xf2, 0xcd, 0x49, 0x7e, 0x25, 0xbb, 0x49, 0xee, - 0x31, 0xb1, 0x87, 0x79, 0xe8, 0xfa, 0xfa, 0x0d, 0xfa, 0xa2, 0xa5, 0x1c, 0xe8, 0x3c, 0x42, 0xe9, - 0xcd, 0xec, 0xda, 0x71, 0x92, 0x2c, 0x48, 0xe8, 0x1b, 0x89, 0xd4, 0x50, 0xb9, 0xac, 0x32, 0x35, - 0x74, 0xb5, 0xe6, 0x01, 0x52, 0x44, 0x7d, 0xcd, 0x02, 0xe0, 0xed, 0x14, 0x29, 0x1d, 0x69, 0xdb, - 0xb6, 0x4f, 0x6d, 0xa4, 0x28, 0x13, 0xde, 0x34, 0x25, 0x20, 0xe3, 0x02, 0xac, 0xb5, 0xe4, 0x21, - 0x72, 0x3f, 0x3d, 0x74, 0xda, 0xa9, 0xaf, 0x5a, 0x30, 0x9e, 0x68, 0x6e, 0x4a, 0xfd, 0x1d, 0xf3, - 0xab, 0x18, 0x19, 0x9c, 0x5b, 0x66, 0xa2, 0x3f, 0xfd, 0x96, 0xf6, 0xa7, 0x1f, 0x01, 0xe3, 0xb3, - 0x61, 0xe8, 0x5d, 0x28, 0xca, 0x2b, 0x96, 0x5c, 0xde, 0x59, 0x7e, 0x1d, 0x48, 0xe9, 0x51, 0x12, - 0x12, 0xe2, 0x98, 0x5f, 0x22, 0xb8, 0x27, 0xd7, 0x57, 0x70, 0xcf, 0xa3, 0xfd, 0xb6, 0x50, 0xba, - 0x01, 0x6c, 0xf0, 0x54, 0x0c, 0x60, 0x4f, 0x66, 0x6e, 0x00, 0x7b, 0xea, 0x8c, 0x0d, 0x60, 0x9a, - 0x37, 0x22, 0xff, 0x10, 0xde, 0x88, 0x77, 0xe1, 0xe2, 0x5e, 0xac, 0xdd, 0xaa, 0x95, 0x24, 0x3e, - 0x91, 0x74, 0x2d, 0xd5, 0xec, 0x45, 0x35, 0xf5, 0x30, 0x22, 0x5e, 0xa4, 0xe9, 0xc5, 0x71, 0x68, - 0xd0, 0xed, 0x14, 0x72, 0x38, 0x95, 0x49, 0xd2, 0xac, 0x3c, 0xdc, 0x87, 0x59, 0xf9, 0xdb, 0x3d, - 0xbf, 0x25, 0x5f, 0x38, 0xdd, 0x6f, 0xc9, 0x3f, 0x7e, 0xe2, 0xef, 0xc8, 0x3f, 0x1b, 0xfb, 0xf8, - 0x78, 0x40, 0x59, 0xba, 0x43, 0xee, 0x1b, 0xc9, 0xc0, 0x01, 0x60, 0x43, 0xff, 0x99, 0x6c, 0xd5, - 0xfa, 0x0c, 0x82, 0x07, 0x46, 0x1e, 0x22, 0x78, 0x20, 0x61, 0xe3, 0x1f, 0xcd, 0xc8, 0xc6, 0xef, - 0xc1, 0x84, 0xdb, 0x72, 0xea, 0x64, 0xb3, 0xd3, 0x6c, 0xf2, 0xb8, 0x73, 0xf9, 0xfd, 0xa6, 0x54, - 0x53, 0xc1, 0xaa, 0x5f, 0x75, 0x9a, 0xc9, 0xcf, 0xe4, 0xa9, 0xf8, 0xfa, 0xe5, 0x04, 0x25, 0xdc, - 0x45, 0x9b, 0x2e, 0x58, 0x96, 0x1e, 0x87, 0x44, 0x74, 0xb4, 0x99, 0x87, 0xba, 0xc0, 0x17, 0xec, - 0x52, 0x0c, 0xc6, 0x3a, 0x0e, 0x5a, 0x81, 0x62, 0xcd, 0x0b, 0xc5, 0x8b, 0xb5, 0x71, 0x26, 0xcc, - 0x3e, 0x4a, 0x45, 0xe0, 0xfc, 0x7a, 0x45, 0xbd, 0x55, 0x7b, 0x32, 0x25, 0xf3, 0x92, 0x2a, 0xc7, - 0x71, 0x7d, 0xb4, 0xc6, 0x88, 0x89, 0x14, 0xfc, 0xdc, 0x71, 0xfc, 0x74, 0x0f, 0xcb, 0xf4, 0xfc, - 0xba, 0xfc, 0x88, 0xc0, 0x98, 0x60, 0x27, 0x72, 0xe9, 0xc7, 0x14, 0xb4, 0xef, 0x68, 0x9d, 0x3f, - 0xf6, 0x3b, 0x5a, 0x2c, 0xe5, 0x5a, 0xd4, 0x54, 0x7e, 0xa8, 0xab, 0x99, 0xa5, 0x5c, 0x8b, 0x43, - 0xb2, 0x44, 0xca, 0xb5, 0x18, 0x80, 0x75, 0x96, 0x68, 0xa3, 0x97, 0x3f, 0xee, 0x02, 0x13, 0x1a, - 0x27, 0xf7, 0xae, 0xe9, 0x8e, 0x99, 0x8b, 0xc7, 0x3a, 0x66, 0xba, 0x1c, 0x49, 0x97, 0x4e, 0xe0, - 0x48, 0x6a, 0xb0, 0x64, 0x58, 0x8b, 0x73, 0xc2, 0x77, 0x97, 0xc1, 0x8d, 0x85, 0xbd, 0x61, 0xe7, - 0x21, 0x6e, 0xec, 0x27, 0xe6, 0x0c, 0x7a, 0x46, 0x6e, 0x5e, 0x79, 0xe0, 0xc8, 0x4d, 0x2a, 0x9e, - 0x63, 0x38, 0xcb, 0xaa, 0x96, 0x17, 0xe2, 0x39, 0x06, 0x63, 0x1d, 0x27, 0xe9, 0x96, 0x79, 0xfc, - 0xd4, 0xdc, 0x32, 0x93, 0x67, 0xe0, 0x96, 0x79, 0xa2, 0x6f, 0xb7, 0xcc, 0xfb, 0x70, 0xa1, 0xed, - 0xd7, 0xe6, 0xdd, 0x30, 0xe8, 0xb0, 0x87, 0x38, 0xe5, 0x4e, 0xad, 0x4e, 0x22, 0xe6, 0xd7, 0x19, - 0xb9, 0x7e, 0x5d, 0x6f, 0x64, 0x9b, 0x6d, 0xe4, 0xe9, 0xbd, 0x17, 0xb7, 0x49, 0xc4, 0x27, 0x33, - 0x59, 0x8b, 0x59, 0x04, 0x58, 0x8c, 0x5f, 0x4a, 0x21, 0x4e, 0xe3, 0xa3, 0x7b, 0x85, 0x9e, 0x3e, - 0x1b, 0xaf, 0xd0, 0xa7, 0xa0, 0x10, 0x36, 0x3a, 0x51, 0xcd, 0xdf, 0xf7, 0x98, 0xeb, 0xaf, 0xa8, - 0xbe, 0xa4, 0x5b, 0xa8, 0x08, 0xf8, 0xbd, 0xc3, 0xa9, 0x09, 0xf9, 0x5b, 0xb3, 0x99, 0x09, 0x08, - 0xfa, 0x9d, 0x1e, 0x4f, 0x0d, 0xec, 0xd3, 0x7c, 0x6a, 0x70, 0xe5, 0x44, 0xcf, 0x0c, 0xd2, 0x5c, - 0x5f, 0xcf, 0x7c, 0xe8, 0x5c, 0x5f, 0xbf, 0x6d, 0xc1, 0xd8, 0x9e, 0x6e, 0xa0, 0x14, 0xee, 0xb9, - 0x0c, 0xc2, 0x04, 0x0c, 0xbb, 0x67, 0xd9, 0xa6, 0xc2, 0xce, 0x00, 0xdd, 0x4b, 0x02, 0xb0, 0xd9, - 0x92, 0x94, 0x10, 0x86, 0x67, 0x1f, 0x55, 0x08, 0xc3, 0xfb, 0x4c, 0x98, 0xc9, 0x9b, 0x2e, 0xf3, - 0xd9, 0x65, 0x1b, 0xc1, 0x28, 0x05, 0xa3, 0x0a, 0x60, 0xd4, 0xf9, 0xa1, 0xaf, 0x58, 0x30, 0x21, - 0x2f, 0x67, 0xc2, 0xc1, 0x10, 0x8a, 0x18, 0xac, 0x2c, 0xef, 0x84, 0x2c, 0x88, 0x77, 0x2b, 0xc1, - 0x07, 0x77, 0x71, 0xa6, 0xa2, 0x5d, 0x85, 0xbc, 0xd4, 0x43, 0x16, 0x6a, 0x28, 0x14, 0x99, 0xd9, - 0x18, 0x8c, 0x75, 0x1c, 0xf4, 0x4d, 0xf5, 0x85, 0xcc, 0x6b, 0x4c, 0xaa, 0xbf, 0x96, 0xb1, 0x82, - 0x9a, 0xc5, 0x67, 0x32, 0xd1, 0x6f, 0x5a, 0x30, 0xb1, 0x9f, 0xb0, 0x6a, 0x88, 0x20, 0x34, 0x9c, - 0xbd, 0xbd, 0xa4, 0xc7, 0x27, 0x9d, 0xbb, 0x5a, 0xf0, 0xd0, 0x1e, 0xe0, 0x0f, 0xd5, 0xe7, 0x3f, - 0xff, 0x04, 0xc1, 0xb9, 0xc4, 0xf7, 0xa9, 0x3f, 0x66, 0xa6, 0x53, 0xbe, 0x9a, 0xcc, 0x69, 0x3b, - 0x26, 0xf1, 0x8d, 0xbc, 0xb6, 0x46, 0xe2, 0xd9, 0xdc, 0xa9, 0x26, 0x9e, 0x1d, 0x38, 0x9b, 0xc4, - 0xb3, 0x13, 0xa7, 0x91, 0x78, 0xf6, 0xfc, 0x89, 0x12, 0xcf, 0x6a, 0x89, 0x7f, 0x07, 0xef, 0x93, - 0xf8, 0x77, 0x16, 0xc6, 0x65, 0x74, 0x3f, 0x11, 0x19, 0x45, 0xb9, 0x63, 0xef, 0x8a, 0xa8, 0x32, - 0x3e, 0x67, 0x16, 0xe3, 0x24, 0x3e, 0xfa, 0xc0, 0x82, 0xbc, 0xc7, 0x6a, 0x0e, 0x65, 0x95, 0x4b, - 0xdf, 0x5c, 0x5a, 0xec, 0xde, 0x2a, 0xc4, 0x82, 0x8c, 0x67, 0xcc, 0x33, 0xd8, 0x3d, 0xf9, 0x03, - 0xf3, 0x16, 0xa0, 0x37, 0xa0, 0xe4, 0xef, 0xec, 0x34, 0x7d, 0xa7, 0x16, 0x67, 0xc7, 0x95, 0x9e, - 0x47, 0xfe, 0x3a, 0x4b, 0x65, 0x07, 0xdc, 0xe8, 0x81, 0x87, 0x7b, 0x52, 0x40, 0xdf, 0xa6, 0xca, - 0x40, 0xe4, 0x07, 0xa4, 0x16, 0x1b, 0x49, 0x8a, 0xac, 0xcf, 0x24, 0xf3, 0x3e, 0x57, 0x4c, 0x3e, - 0xbc, 0xf7, 0x6a, 0x52, 0x12, 0xa5, 0x38, 0xd9, 0x2c, 0x14, 0xc0, 0xe5, 0x76, 0x9a, 0x8d, 0x26, - 0x14, 0x6f, 0x12, 0x8e, 0xb3, 0x14, 0xc9, 0xad, 0x7b, 0x39, 0xd5, 0xca, 0x13, 0xe2, 0x1e, 0x94, - 0xf5, 0xbc, 0xb9, 0x85, 0xb3, 0xc9, 0x9b, 0x6b, 0x7e, 0x55, 0x7e, 0xec, 0xcc, 0xbf, 0x2a, 0x8f, - 0xfe, 0x4f, 0x6a, 0x8a, 0x67, 0x6e, 0xda, 0xa8, 0x67, 0xbe, 0x26, 0x3e, 0x74, 0x69, 0x9e, 0xff, - 0xa1, 0x05, 0x93, 0x7c, 0xe5, 0x25, 0x15, 0x6a, 0x7a, 0x9c, 0x8b, 0xe8, 0xfd, 0xac, 0x9d, 0xd3, - 0x2c, 0x4e, 0xa7, 0x62, 0x70, 0x65, 0x3e, 0xd3, 0x63, 0x5a, 0x82, 0xbe, 0x96, 0xa2, 0xc6, 0x8f, - 0x67, 0x65, 0x2c, 0x4c, 0x4f, 0x0f, 0x7c, 0xe1, 0xa8, 0x1f, 0xcd, 0xfd, 0x1f, 0xf7, 0xb4, 0x65, - 0x22, 0xd6, 0xbc, 0xbf, 0x72, 0x4a, 0xb6, 0x4c, 0x3d, 0x87, 0xf1, 0x49, 0x2c, 0x9a, 0x93, 0x5f, - 0x14, 0x1f, 0x51, 0xe8, 0xa9, 0x85, 0x6c, 0x9b, 0x5a, 0xc8, 0x6a, 0x96, 0x89, 0xce, 0x75, 0x75, - 0xe8, 0x37, 0x2c, 0xb8, 0x98, 0x26, 0x24, 0x53, 0x9a, 0xf4, 0x19, 0xb3, 0x49, 0x19, 0x2a, 0xdb, - 0x7a, 0x83, 0xb2, 0xc9, 0xee, 0xfc, 0x93, 0xa2, 0xe6, 0x41, 0x8a, 0x48, 0x3b, 0xf3, 0x40, 0x3f, - 0x0f, 0x86, 0x5c, 0xaf, 0xe9, 0x7a, 0x44, 0x3c, 0xea, 0xc9, 0xf2, 0xea, 0x21, 0xb2, 0xa9, 0x53, - 0xea, 0x58, 0x70, 0x79, 0xc4, 0x0e, 0xa5, 0xe4, 0x97, 0x22, 0x06, 0xcf, 0xfe, 0x4b, 0x11, 0xfb, - 0x50, 0xdc, 0x77, 0xa3, 0x06, 0x73, 0x84, 0x0b, 0x3f, 0x4d, 0x06, 0x8f, 0x61, 0x28, 0xb9, 0xb8, - 0xef, 0x77, 0x24, 0x03, 0x1c, 0xf3, 0x42, 0x33, 0x9c, 0x31, 0x0b, 0xef, 0x4b, 0xc6, 0x5d, 0xdd, - 0x91, 0x05, 0x38, 0xc6, 0xa1, 0x83, 0x35, 0x4a, 0xff, 0xc9, 0x8c, 0x19, 0x22, 0x9d, 0x61, 0x16, - 0xd9, 0xb2, 0x04, 0x45, 0xfe, 0xe4, 0xec, 0x8e, 0xc6, 0x03, 0x1b, 0x1c, 0x55, 0x46, 0xc9, 0x42, - 0xcf, 0x8c, 0x92, 0xef, 0xb1, 0x33, 0x3f, 0x72, 0xbd, 0x0e, 0xd9, 0xf0, 0x44, 0x50, 0xe0, 0x6a, - 0x36, 0x0f, 0xe4, 0x38, 0x4d, 0x9e, 0xcb, 0x20, 0xfe, 0x8f, 0x35, 0x7e, 0x9a, 0xb9, 0x7c, 0xe4, - 0x58, 0x73, 0x79, 0x7c, 0x53, 0x1e, 0xcd, 0xfc, 0xa6, 0x1c, 0x91, 0x76, 0x26, 0x37, 0xe5, 0x0f, - 0xd5, 0x8d, 0xf2, 0xc7, 0x39, 0x18, 0x57, 0x47, 0xb7, 0x13, 0xee, 0x56, 0x48, 0x74, 0x06, 0xf1, - 0x5d, 0xfb, 0x46, 0x7c, 0x57, 0x96, 0x16, 0x47, 0xde, 0x85, 0x9e, 0xd1, 0x74, 0x9f, 0x4b, 0x44, - 0xd3, 0xdd, 0xc9, 0x9e, 0xf5, 0xf1, 0x41, 0x75, 0xff, 0xdd, 0x82, 0x0b, 0x89, 0x1a, 0x67, 0x10, - 0x71, 0xb4, 0x67, 0x46, 0x1c, 0xbd, 0x9a, 0x79, 0xaf, 0x7b, 0x04, 0x1e, 0xfd, 0x6e, 0xae, 0xab, - 0xb7, 0x4c, 0x2f, 0xfc, 0x35, 0x0b, 0xf2, 0x91, 0x13, 0xee, 0xca, 0xd8, 0x8c, 0xcf, 0x9c, 0xca, - 0x0a, 0x98, 0xa6, 0xbf, 0xc5, 0x6e, 0x55, 0xed, 0x63, 0x30, 0xcc, 0xb9, 0x4f, 0xfe, 0xaa, 0x05, - 0x10, 0x23, 0x3d, 0x2a, 0x15, 0xc6, 0xfe, 0xfd, 0x1c, 0x5c, 0x4a, 0x5d, 0x46, 0xe8, 0x4b, 0xea, - 0x92, 0x6f, 0x65, 0x1d, 0x79, 0x64, 0x30, 0xd2, 0xef, 0xfa, 0x63, 0xc6, 0x5d, 0x5f, 0x5c, 0xf1, - 0x1f, 0x95, 0x02, 0x2a, 0xd2, 0xa9, 0x6b, 0x83, 0xf5, 0x23, 0x2b, 0x0e, 0x66, 0x53, 0xc9, 0x10, - 0xfe, 0x1f, 0x8c, 0xfc, 0xb5, 0x7f, 0xac, 0xc5, 0xdf, 0xca, 0x8e, 0x9e, 0x81, 0xac, 0xd8, 0x37, - 0x65, 0x05, 0xce, 0xde, 0x1d, 0xd4, 0x43, 0x58, 0xbc, 0x0d, 0x69, 0xfe, 0xa1, 0xfe, 0xd2, 0x30, - 0x19, 0x6f, 0x68, 0x72, 0x7d, 0xbf, 0xa1, 0x19, 0x83, 0x91, 0xd7, 0xdd, 0xb6, 0x72, 0x65, 0x4c, - 0x7f, 0xf7, 0x87, 0x57, 0x1f, 0xfb, 0xa3, 0x1f, 0x5e, 0x7d, 0xec, 0xfb, 0x3f, 0xbc, 0xfa, 0xd8, - 0xe7, 0x8f, 0xae, 0x5a, 0xdf, 0x3d, 0xba, 0x6a, 0xfd, 0xd1, 0xd1, 0x55, 0xeb, 0xfb, 0x47, 0x57, - 0xad, 0xff, 0x72, 0x74, 0xd5, 0xfa, 0x1b, 0xff, 0xf5, 0xea, 0x63, 0xaf, 0x17, 0x64, 0xc7, 0xfe, - 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xc1, 0xd1, 0x6a, 0x47, 0x22, 0xb0, 0x00, 0x00, + // 9318 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7d, 0x5b, 0x70, 0x24, 0xd7, + 0x75, 0x18, 0x7b, 0x80, 0x01, 0x66, 0x0e, 0x80, 0x05, 0xf6, 0xee, 0x6b, 0x08, 0x92, 0x0b, 0xaa, + 0x69, 0x32, 0x5c, 0x9b, 0x02, 0xcc, 0x5d, 0x29, 0x61, 0xa4, 0x8a, 0x2c, 0x0c, 0xb0, 0x78, 0x10, + 0x4f, 0xde, 0xc1, 0xee, 0x86, 0x14, 0x43, 0xab, 0x31, 0x73, 0x31, 0xd3, 0xc4, 0x4c, 0xf7, 0xb0, + 0xbb, 0x07, 0x58, 0xf0, 0x21, 0x29, 0xb2, 0x2d, 0x89, 0xb1, 0x62, 0xe5, 0x61, 0xcb, 0xb2, 0x92, + 0x54, 0xb9, 0x14, 0x2b, 0x56, 0x39, 0xae, 0xa4, 0x54, 0x95, 0xca, 0x87, 0xf3, 0x9b, 0x4a, 0x29, + 0x95, 0x54, 0xc5, 0x29, 0x2b, 0xb1, 0x3e, 0x12, 0x28, 0x42, 0x62, 0xfd, 0xa4, 0x54, 0x95, 0xb8, + 0x22, 0x45, 0xd9, 0xe4, 0x23, 0x75, 0x9f, 0x7d, 0x6f, 0x4f, 0x0f, 0x76, 0xb0, 0xdb, 0xc0, 0xb2, + 0xec, 0xbf, 0x99, 0x73, 0xcf, 0x3d, 0xe7, 0x3e, 0xcf, 0x3d, 0xf7, 0x9c, 0x73, 0x4f, 0xc3, 0x66, + 0xdd, 0x8d, 0x1a, 0x9d, 0xed, 0xe9, 0xaa, 0xdf, 0x9a, 0x71, 0x82, 0xba, 0xdf, 0x0e, 0xfc, 0x37, + 0xd9, 0x8f, 0x0f, 0xef, 0xfb, 0xc1, 0xee, 0x4e, 0xd3, 0xdf, 0x0f, 0x67, 0xf6, 0x6e, 0xcc, 0xb4, + 0x77, 0xeb, 0x33, 0x4e, 0xdb, 0x0d, 0x67, 0x24, 0x74, 0x66, 0xef, 0x45, 0xa7, 0xd9, 0x6e, 0x38, + 0x2f, 0xce, 0xd4, 0x89, 0x47, 0x02, 0x27, 0x22, 0xb5, 0xe9, 0x76, 0xe0, 0x47, 0x3e, 0xfa, 0x64, + 0x4c, 0x71, 0x5a, 0x52, 0x64, 0x3f, 0x7e, 0x51, 0x51, 0x9c, 0xde, 0xbb, 0x31, 0xdd, 0xde, 0xad, + 0x4f, 0x53, 0x8a, 0xd3, 0x12, 0x3a, 0x2d, 0x29, 0x4e, 0x7e, 0x58, 0x6b, 0x53, 0xdd, 0xaf, 0xfb, + 0x33, 0x8c, 0xf0, 0x76, 0x67, 0x87, 0xfd, 0x63, 0x7f, 0xd8, 0x2f, 0xce, 0x70, 0xd2, 0xde, 0x7d, + 0x29, 0x9c, 0x76, 0x7d, 0xda, 0xbe, 0x99, 0xaa, 0x1f, 0x90, 0x99, 0xbd, 0xae, 0x46, 0x4d, 0x5e, + 0xd3, 0x70, 0xda, 0x7e, 0xd3, 0xad, 0x1e, 0xcc, 0xec, 0xbd, 0xb8, 0x4d, 0xa2, 0xee, 0xf6, 0x4f, + 0x7e, 0x24, 0x46, 0x6d, 0x39, 0xd5, 0x86, 0xeb, 0x91, 0xe0, 0x20, 0xee, 0x7f, 0x8b, 0x44, 0x4e, + 0x1a, 0x83, 0x99, 0x5e, 0xb5, 0x82, 0x8e, 0x17, 0xb9, 0x2d, 0xd2, 0x55, 0xe1, 0x2f, 0xde, 0xaf, + 0x42, 0x58, 0x6d, 0x90, 0x96, 0xd3, 0x55, 0xef, 0x46, 0xaf, 0x7a, 0x9d, 0xc8, 0x6d, 0xce, 0xb8, + 0x5e, 0x14, 0x46, 0x41, 0xb2, 0x92, 0x7d, 0x13, 0x86, 0x66, 0x5b, 0x7e, 0xc7, 0x8b, 0xd0, 0xc7, + 0x21, 0xbf, 0xe7, 0x34, 0x3b, 0xa4, 0x64, 0x3d, 0x6d, 0x3d, 0x5f, 0x2c, 0x3f, 0xfb, 0x9d, 0xc3, + 0xa9, 0xc7, 0x8e, 0x0e, 0xa7, 0xf2, 0xb7, 0x29, 0xf0, 0xde, 0xe1, 0xd4, 0x45, 0xe2, 0x55, 0xfd, + 0x9a, 0xeb, 0xd5, 0x67, 0xde, 0x0c, 0x7d, 0x6f, 0x7a, 0xbd, 0xd3, 0xda, 0x26, 0x01, 0xe6, 0x75, + 0xec, 0x3f, 0xca, 0xc1, 0xf8, 0x6c, 0x50, 0x6d, 0xb8, 0x7b, 0xa4, 0x12, 0x51, 0xfa, 0xf5, 0x03, + 0xd4, 0x80, 0x81, 0xc8, 0x09, 0x18, 0xb9, 0x91, 0xeb, 0x6b, 0xd3, 0x0f, 0x3b, 0xf9, 0xd3, 0x5b, + 0x4e, 0x20, 0x69, 0x97, 0x87, 0x8f, 0x0e, 0xa7, 0x06, 0xb6, 0x9c, 0x00, 0x53, 0x16, 0xa8, 0x09, + 0x83, 0x9e, 0xef, 0x91, 0x52, 0x8e, 0xb1, 0x5a, 0x7f, 0x78, 0x56, 0xeb, 0xbe, 0xa7, 0xfa, 0x51, + 0x2e, 0x1c, 0x1d, 0x4e, 0x0d, 0x52, 0x08, 0x66, 0x5c, 0x68, 0xbf, 0xde, 0x76, 0xdb, 0xa5, 0x81, + 0xac, 0xfa, 0xf5, 0x9a, 0xdb, 0x36, 0xfb, 0xf5, 0x9a, 0xdb, 0xc6, 0x94, 0x85, 0xfd, 0x7e, 0x0e, + 0x8a, 0xb3, 0x41, 0xbd, 0xd3, 0x22, 0x5e, 0x14, 0xa2, 0xcf, 0x02, 0xb4, 0x9d, 0xc0, 0x69, 0x91, + 0x88, 0x04, 0x61, 0xc9, 0x7a, 0x7a, 0xe0, 0xf9, 0x91, 0xeb, 0x2b, 0x0f, 0xcf, 0x7e, 0x53, 0xd2, + 0x2c, 0x23, 0x31, 0xe5, 0xa0, 0x40, 0x21, 0xd6, 0x58, 0xa2, 0x77, 0xa0, 0xe8, 0x04, 0x91, 0xbb, + 0xe3, 0x54, 0xa3, 0xb0, 0x94, 0x63, 0xfc, 0x5f, 0x7e, 0x78, 0xfe, 0xb3, 0x82, 0x64, 0xf9, 0xbc, + 0x60, 0x5f, 0x94, 0x90, 0x10, 0xc7, 0xfc, 0xec, 0xdf, 0xcd, 0x43, 0x41, 0x16, 0xa0, 0xa7, 0x61, + 0xd0, 0x73, 0x5a, 0x72, 0xa9, 0x8e, 0x8a, 0x8a, 0x83, 0xeb, 0x4e, 0x8b, 0x4e, 0x92, 0xd3, 0x22, + 0x14, 0xa3, 0xed, 0x44, 0x0d, 0xb6, 0x24, 0x34, 0x8c, 0x4d, 0x27, 0x6a, 0x60, 0x56, 0x82, 0x9e, + 0x84, 0xc1, 0x96, 0x5f, 0x23, 0x6c, 0x1e, 0xf3, 0x7c, 0x92, 0xd7, 0xfc, 0x1a, 0xc1, 0x0c, 0x4a, + 0xeb, 0xef, 0x04, 0x7e, 0xab, 0x34, 0x68, 0xd6, 0x5f, 0x08, 0xfc, 0x16, 0x66, 0x25, 0xe8, 0x6b, + 0x16, 0x4c, 0xc8, 0xe6, 0xad, 0xfa, 0x55, 0x27, 0x72, 0x7d, 0xaf, 0x94, 0x67, 0x8b, 0x02, 0x67, + 0x37, 0x2a, 0x92, 0x72, 0xb9, 0x24, 0x9a, 0x30, 0x91, 0x2c, 0xc1, 0x5d, 0xad, 0x40, 0xd7, 0x01, + 0xea, 0x4d, 0x7f, 0xdb, 0x69, 0xd2, 0x01, 0x29, 0x0d, 0xb1, 0x2e, 0xa8, 0xc9, 0x5d, 0x54, 0x25, + 0x58, 0xc3, 0x42, 0x77, 0x61, 0xd8, 0xe1, 0x1b, 0xb8, 0x34, 0xcc, 0x3a, 0xf1, 0x4a, 0x16, 0x9d, + 0x30, 0x24, 0x42, 0x79, 0xe4, 0xe8, 0x70, 0x6a, 0x58, 0x00, 0xb1, 0x64, 0x87, 0x5e, 0x80, 0x82, + 0xdf, 0xa6, 0xed, 0x76, 0x9a, 0xa5, 0xc2, 0xd3, 0xd6, 0xf3, 0x85, 0xf2, 0x84, 0x68, 0x6b, 0x61, + 0x43, 0xc0, 0xb1, 0xc2, 0x40, 0xd7, 0x60, 0x38, 0xec, 0x6c, 0xd3, 0x79, 0x2c, 0x15, 0x59, 0xc7, + 0xc6, 0x05, 0xf2, 0x70, 0x85, 0x83, 0xb1, 0x2c, 0x47, 0x1f, 0x85, 0x91, 0x80, 0x54, 0x3b, 0x41, + 0x48, 0xe8, 0xc4, 0x96, 0x80, 0xd1, 0xbe, 0x20, 0xd0, 0x47, 0x70, 0x5c, 0x84, 0x75, 0x3c, 0xf4, + 0x09, 0x38, 0x47, 0x27, 0xf8, 0xe6, 0xdd, 0x76, 0x40, 0xc2, 0x90, 0xce, 0xea, 0x08, 0x63, 0x74, + 0x59, 0xd4, 0x3c, 0xb7, 0x60, 0x94, 0xe2, 0x04, 0xb6, 0xfd, 0x07, 0xc3, 0xd0, 0x35, 0x49, 0xe8, + 0x45, 0x18, 0x11, 0xfd, 0x5d, 0xf5, 0xeb, 0x21, 0x5b, 0xb8, 0x85, 0xf2, 0x38, 0x6d, 0xc7, 0x6c, + 0x0c, 0xc6, 0x3a, 0x0e, 0xaa, 0x41, 0x2e, 0xbc, 0x21, 0x64, 0xda, 0xea, 0xc3, 0x4f, 0x46, 0xe5, + 0x86, 0xda, 0x69, 0x43, 0x47, 0x87, 0x53, 0xb9, 0xca, 0x0d, 0x9c, 0x0b, 0x6f, 0x50, 0x69, 0x56, + 0x77, 0xa3, 0xec, 0xa4, 0xd9, 0xa2, 0x1b, 0x29, 0x3e, 0x4c, 0x9a, 0x2d, 0xba, 0x11, 0xa6, 0x2c, + 0xa8, 0x94, 0x6e, 0x44, 0x51, 0x9b, 0x6d, 0xa9, 0x4c, 0xa4, 0xf4, 0xd2, 0xd6, 0xd6, 0xa6, 0xe2, + 0xc5, 0x36, 0x30, 0x85, 0x60, 0xc6, 0x05, 0x7d, 0xc9, 0xa2, 0x23, 0xce, 0x0b, 0xfd, 0xe0, 0x40, + 0xec, 0xcc, 0x5b, 0xd9, 0xed, 0x4c, 0x3f, 0x38, 0x50, 0xcc, 0xc5, 0x44, 0xaa, 0x02, 0xac, 0xb3, + 0x66, 0x1d, 0xaf, 0xed, 0x84, 0x6c, 0x23, 0x66, 0xd3, 0xf1, 0xf9, 0x85, 0x4a, 0xa2, 0xe3, 0xf3, + 0x0b, 0x15, 0xcc, 0xb8, 0xd0, 0x09, 0x0d, 0x9c, 0x7d, 0xb1, 0x89, 0x33, 0x98, 0x50, 0xec, 0xec, + 0x9b, 0x13, 0x8a, 0x9d, 0x7d, 0x4c, 0x59, 0x50, 0x4e, 0x7e, 0x18, 0xb2, 0x3d, 0x9b, 0x09, 0xa7, + 0x8d, 0x4a, 0xc5, 0xe4, 0xb4, 0x51, 0xa9, 0x60, 0xca, 0x82, 0x2d, 0xd2, 0x6a, 0xc8, 0x36, 0x7c, + 0x36, 0x8b, 0x74, 0x2e, 0xc1, 0x69, 0x71, 0xae, 0x82, 0x29, 0x0b, 0xfb, 0x7d, 0x0b, 0xc6, 0x64, + 0x11, 0x15, 0x22, 0x21, 0xba, 0x0b, 0x05, 0x39, 0x99, 0x42, 0x97, 0xc9, 0xf2, 0xd0, 0x53, 0xa2, + 0x4e, 0x42, 0xb0, 0xe2, 0x66, 0xff, 0x7e, 0x1e, 0x90, 0x02, 0x93, 0xb6, 0x1f, 0xba, 0x6c, 0x39, + 0x3d, 0x80, 0x28, 0xf1, 0x34, 0x51, 0x72, 0x3b, 0x4b, 0x51, 0x12, 0x37, 0xcb, 0x10, 0x2a, 0x7f, + 0x27, 0xb1, 0xf9, 0xb8, 0x74, 0xf9, 0xc5, 0x53, 0xd9, 0x7c, 0x5a, 0x13, 0x8e, 0xdf, 0x86, 0x7b, + 0x62, 0x1b, 0x72, 0xf9, 0xf3, 0x57, 0xb3, 0xdd, 0x86, 0x5a, 0x2b, 0x92, 0x1b, 0x32, 0xe0, 0xdb, + 0x84, 0x0b, 0xa0, 0x3b, 0x99, 0x6e, 0x13, 0x8d, 0xab, 0xb9, 0x61, 0x02, 0xbe, 0x61, 0x86, 0xb2, + 0xe2, 0xa9, 0x6d, 0x98, 0x24, 0x4f, 0xb5, 0x75, 0xde, 0x82, 0x4b, 0xdd, 0x38, 0x98, 0xec, 0xa0, + 0x19, 0x28, 0x56, 0x7d, 0x6f, 0xc7, 0xad, 0xaf, 0x39, 0x6d, 0xa1, 0xb2, 0x29, 0x5d, 0x6f, 0x4e, + 0x16, 0xe0, 0x18, 0x07, 0x3d, 0x05, 0x03, 0xbb, 0xe4, 0x40, 0xe8, 0x6e, 0x23, 0x02, 0x75, 0x60, + 0x85, 0x1c, 0x60, 0x0a, 0xff, 0x58, 0xe1, 0x6b, 0xbf, 0x3d, 0xf5, 0xd8, 0xe7, 0xfe, 0xd3, 0xd3, + 0x8f, 0xd9, 0xff, 0x7e, 0x00, 0x9e, 0x48, 0xe5, 0x59, 0x89, 0x9c, 0xa8, 0x13, 0xa2, 0xdf, 0xb7, + 0xe0, 0x92, 0x93, 0x56, 0x2e, 0x76, 0xf2, 0x9d, 0xec, 0x56, 0xa4, 0x41, 0xbe, 0xfc, 0x94, 0x68, + 0x74, 0xfa, 0x88, 0xe0, 0xf4, 0x46, 0xd1, 0x81, 0xa2, 0xca, 0x6b, 0xd8, 0x76, 0xaa, 0x44, 0xf4, + 0x5e, 0x0d, 0xd4, 0xba, 0x2c, 0xc0, 0x31, 0x0e, 0x55, 0x86, 0x6a, 0x64, 0xc7, 0xe9, 0x34, 0xf9, + 0x01, 0x5e, 0x88, 0x95, 0xa1, 0x79, 0x0e, 0xc6, 0xb2, 0x1c, 0xfd, 0x7d, 0x0b, 0x50, 0x37, 0x57, + 0xb1, 0x19, 0xb6, 0x4e, 0x63, 0x1c, 0xca, 0x97, 0x8f, 0x0e, 0xa7, 0x52, 0x04, 0x18, 0x4e, 0x69, + 0x87, 0x36, 0xa7, 0xff, 0xc6, 0x82, 0x0b, 0x29, 0xdb, 0x9c, 0x2e, 0x8a, 0x4e, 0xd0, 0x14, 0xeb, + 0x47, 0x2d, 0x8a, 0x5b, 0x78, 0x15, 0x53, 0x38, 0xfa, 0x75, 0x0b, 0xc6, 0xb5, 0xdd, 0x3e, 0xdb, + 0x11, 0xca, 0x7f, 0x46, 0x8a, 0xac, 0x41, 0xb8, 0x7c, 0x45, 0xb0, 0x1f, 0x4f, 0x14, 0xe0, 0x64, + 0x13, 0xec, 0x1f, 0x58, 0xf0, 0xd4, 0xb1, 0x42, 0x2b, 0xb5, 0xe1, 0xd6, 0x23, 0x6f, 0x38, 0x5d, + 0x5a, 0x01, 0x69, 0xfb, 0xb7, 0xf0, 0xaa, 0x58, 0x89, 0x6a, 0x69, 0x61, 0x0e, 0xc6, 0xb2, 0xdc, + 0xfe, 0x63, 0x0b, 0x92, 0xf4, 0x90, 0x03, 0xe7, 0x3a, 0x21, 0x09, 0xe8, 0x52, 0xad, 0x90, 0x6a, + 0x40, 0xe4, 0xd9, 0xf9, 0xec, 0x34, 0xb7, 0x52, 0xd0, 0x06, 0x4f, 0x57, 0xfd, 0x80, 0x4c, 0xef, + 0xbd, 0x38, 0xcd, 0x31, 0x56, 0xc8, 0x41, 0x85, 0x34, 0x09, 0xa5, 0x51, 0x46, 0x54, 0xcf, 0xbe, + 0x65, 0x10, 0xc0, 0x09, 0x82, 0x94, 0x45, 0xdb, 0x09, 0xc3, 0x7d, 0x3f, 0xa8, 0x09, 0x16, 0xb9, + 0x13, 0xb3, 0xd8, 0x34, 0x08, 0xe0, 0x04, 0x41, 0xfb, 0x5f, 0x5a, 0x30, 0x5c, 0x76, 0xaa, 0xbb, + 0xfe, 0xce, 0x0e, 0xbd, 0xa6, 0xd4, 0x3a, 0x01, 0xbf, 0xe6, 0xf1, 0x45, 0xa8, 0xce, 0xee, 0x79, + 0x01, 0xc7, 0x0a, 0x03, 0x6d, 0xc1, 0x10, 0x1f, 0x0e, 0xd1, 0xa8, 0x9f, 0xd7, 0x1a, 0xa5, 0xac, + 0x33, 0x6c, 0xe6, 0x3a, 0x91, 0xdb, 0x9c, 0xe6, 0xd6, 0x99, 0xe9, 0x65, 0x2f, 0xda, 0x08, 0x2a, + 0x51, 0xe0, 0x7a, 0xf5, 0x32, 0x1c, 0x1d, 0x4e, 0x0d, 0x2d, 0x30, 0x1a, 0x58, 0xd0, 0xa2, 0x37, + 0x9a, 0x96, 0x73, 0x57, 0xb2, 0x63, 0x7b, 0xbe, 0x18, 0xdf, 0x68, 0xd6, 0xe2, 0x22, 0xac, 0xe3, + 0xd9, 0x6f, 0x40, 0x7e, 0xce, 0xa9, 0x36, 0x08, 0xba, 0x95, 0x94, 0xc4, 0x23, 0xd7, 0x9f, 0x4f, + 0x1b, 0x2d, 0x25, 0x95, 0xf5, 0x01, 0x1b, 0xeb, 0x25, 0xaf, 0xed, 0x1f, 0x59, 0x70, 0x65, 0xae, + 0xd9, 0x09, 0x23, 0x12, 0xdc, 0x11, 0x4b, 0x70, 0x8b, 0xb4, 0xda, 0x4d, 0x27, 0x22, 0xe8, 0xd3, + 0x50, 0x68, 0x91, 0xc8, 0xa9, 0x39, 0x91, 0x23, 0x38, 0xf6, 0x1e, 0x0a, 0xb6, 0x88, 0x29, 0x36, + 0x6d, 0xc3, 0xc6, 0xf6, 0x9b, 0xa4, 0x1a, 0xad, 0x91, 0xc8, 0x89, 0xef, 0xae, 0x31, 0x0c, 0x2b, + 0xaa, 0xa8, 0x0d, 0x83, 0x61, 0x9b, 0x54, 0xb3, 0xb3, 0xfe, 0xc8, 0x3e, 0x54, 0xda, 0xa4, 0x1a, + 0x5f, 0xfd, 0xe9, 0x3f, 0xcc, 0x38, 0xd9, 0xff, 0xd7, 0x82, 0x27, 0x7a, 0xf4, 0x77, 0xd5, 0x0d, + 0x23, 0xf4, 0x7a, 0x57, 0x9f, 0xa7, 0xfb, 0xeb, 0x33, 0xad, 0xcd, 0x7a, 0xac, 0x96, 0x96, 0x84, + 0x68, 0xfd, 0xfd, 0x0c, 0xe4, 0xdd, 0x88, 0xb4, 0xa4, 0x09, 0xe6, 0xd5, 0x87, 0xef, 0x70, 0x8f, + 0xbe, 0x94, 0xc7, 0xa4, 0x0d, 0x70, 0x99, 0xf2, 0xc3, 0x9c, 0xad, 0xfd, 0xaf, 0x2d, 0xa0, 0xcb, + 0xa0, 0xe6, 0x8a, 0x8b, 0xed, 0x60, 0x74, 0xd0, 0x96, 0xa6, 0x18, 0x79, 0xee, 0x0d, 0x6e, 0x1d, + 0xb4, 0xc9, 0xbd, 0xc3, 0xa9, 0x31, 0x85, 0x48, 0x01, 0x98, 0xa1, 0xa2, 0x37, 0x60, 0x28, 0x64, + 0xe7, 0xb3, 0x90, 0x2c, 0x0b, 0xa2, 0xd2, 0x10, 0x3f, 0xb5, 0xef, 0x1d, 0x4e, 0xf5, 0x65, 0x69, + 0x9d, 0x56, 0xb4, 0x79, 0x3d, 0x2c, 0xa8, 0x52, 0xd1, 0xd5, 0x22, 0x61, 0xe8, 0xd4, 0x89, 0xd8, + 0x21, 0x4a, 0x74, 0xad, 0x71, 0x30, 0x96, 0xe5, 0xf6, 0x6f, 0x58, 0x40, 0x9b, 0x18, 0x39, 0x94, + 0xc5, 0x3a, 0xbd, 0xfd, 0xaf, 0xb3, 0x2d, 0xc2, 0x01, 0x62, 0xf2, 0x9e, 0xea, 0xb1, 0x45, 0x38, + 0x92, 0xa1, 0xcb, 0x70, 0x10, 0x8e, 0x49, 0xa0, 0x8f, 0xc0, 0x68, 0x8d, 0xb4, 0x89, 0x57, 0x23, + 0x5e, 0xd5, 0x25, 0x7c, 0xd2, 0x8a, 0xe5, 0x89, 0xa3, 0xc3, 0xa9, 0xd1, 0x79, 0x0d, 0x8e, 0x0d, + 0x2c, 0xfb, 0x1b, 0x16, 0x3c, 0xae, 0xc8, 0x55, 0x48, 0x84, 0x49, 0x14, 0x1c, 0x28, 0xcb, 0xea, + 0xc9, 0x44, 0xd1, 0x1d, 0x2a, 0xc9, 0xa3, 0x80, 0x33, 0x7f, 0x30, 0x59, 0x34, 0xc2, 0xe5, 0x3e, + 0x23, 0x82, 0x25, 0x35, 0xfb, 0xd7, 0x06, 0xe0, 0xa2, 0xde, 0x48, 0xb5, 0xe7, 0x7f, 0xc9, 0x02, + 0x50, 0x23, 0x40, 0x15, 0x6e, 0xba, 0x4e, 0x37, 0x32, 0x58, 0xa7, 0xfa, 0x4c, 0xc5, 0x52, 0x41, + 0x81, 0x43, 0xac, 0xb1, 0x45, 0xaf, 0xc2, 0xe8, 0x9e, 0xdf, 0xec, 0xb4, 0xc8, 0x9a, 0xdf, 0xf1, + 0xa2, 0xb0, 0x34, 0xc0, 0x9a, 0x31, 0x95, 0x36, 0x99, 0xb7, 0x63, 0xbc, 0xf2, 0x45, 0x41, 0x76, + 0x54, 0x03, 0x86, 0xd8, 0x20, 0x45, 0xcf, 0xec, 0xb1, 0x40, 0x9f, 0x12, 0xa1, 0xdd, 0x7f, 0x2a, + 0xc3, 0x3e, 0x26, 0x67, 0xbd, 0x7c, 0xfe, 0xe8, 0x70, 0x6a, 0xcc, 0x00, 0x61, 0xb3, 0x11, 0xf6, + 0xab, 0xc0, 0xc6, 0xc2, 0xf5, 0x3a, 0x64, 0xc3, 0x43, 0xcf, 0x40, 0x9e, 0x04, 0x81, 0x1f, 0x88, + 0x1b, 0xa2, 0xda, 0xcc, 0x37, 0x29, 0x10, 0xf3, 0x32, 0xf4, 0x1c, 0x3d, 0xa7, 0xdc, 0x26, 0xa9, + 0xb1, 0xb5, 0x51, 0x28, 0x9f, 0x93, 0x7b, 0x71, 0x81, 0x41, 0xb1, 0x28, 0xb5, 0xa7, 0x61, 0x78, + 0x8e, 0xf6, 0x9d, 0x04, 0x94, 0xae, 0xee, 0x28, 0x18, 0x33, 0x1c, 0x05, 0xd2, 0x21, 0xb0, 0x05, + 0x97, 0xe6, 0x02, 0xe2, 0x44, 0xa4, 0x72, 0xa3, 0xdc, 0xa9, 0xee, 0x92, 0x88, 0x9b, 0xf2, 0x42, + 0xf4, 0x71, 0x18, 0xf3, 0x99, 0x14, 0x5f, 0xf5, 0xab, 0xbb, 0xae, 0x57, 0x17, 0x8a, 0xeb, 0x25, + 0x41, 0x65, 0x6c, 0x43, 0x2f, 0xc4, 0x26, 0xae, 0xfd, 0xdf, 0x72, 0x30, 0x3a, 0x17, 0xf8, 0x9e, + 0x94, 0x54, 0x67, 0x70, 0xba, 0x44, 0xc6, 0xe9, 0x92, 0x81, 0x65, 0x57, 0x6f, 0x7f, 0xaf, 0x13, + 0x06, 0xbd, 0xab, 0x44, 0xe4, 0x40, 0x56, 0x0a, 0xba, 0xc1, 0x97, 0xd1, 0x8e, 0x27, 0xdb, 0x14, + 0xa0, 0xf6, 0x9f, 0x58, 0x30, 0xa1, 0xa3, 0x9f, 0xc1, 0xa1, 0x16, 0x9a, 0x87, 0xda, 0x7a, 0xb6, + 0xfd, 0xed, 0x71, 0x92, 0xbd, 0x3f, 0x64, 0xf6, 0x93, 0x4e, 0x00, 0xfa, 0x9a, 0x05, 0xa3, 0xfb, + 0x1a, 0x40, 0x74, 0x36, 0x6b, 0xbd, 0xe2, 0x67, 0xa4, 0x98, 0xd1, 0xa1, 0xf7, 0x12, 0xff, 0xb1, + 0xd1, 0x12, 0x2a, 0xf7, 0xc3, 0x6a, 0x83, 0xd4, 0x3a, 0x4d, 0x79, 0x3d, 0x54, 0x43, 0x5a, 0x11, + 0x70, 0xac, 0x30, 0xd0, 0xeb, 0x70, 0xbe, 0xea, 0x7b, 0xd5, 0x4e, 0x10, 0x10, 0xaf, 0x7a, 0xb0, + 0xc9, 0x7c, 0x9b, 0xe2, 0x40, 0x9c, 0x16, 0xd5, 0xce, 0xcf, 0x25, 0x11, 0xee, 0xa5, 0x01, 0x71, + 0x37, 0x21, 0x6e, 0x87, 0x0f, 0xe9, 0x91, 0xc5, 0xee, 0x90, 0x05, 0xdd, 0x0e, 0xcf, 0xc0, 0x58, + 0x96, 0xa3, 0x5b, 0x70, 0x25, 0x8c, 0xe8, 0xfd, 0xc2, 0xab, 0xcf, 0x13, 0xa7, 0xd6, 0x74, 0x3d, + 0xaa, 0xc2, 0xfb, 0x5e, 0x8d, 0x1b, 0x45, 0x06, 0xca, 0x4f, 0x1c, 0x1d, 0x4e, 0x5d, 0xa9, 0xa4, + 0xa3, 0xe0, 0x5e, 0x75, 0xd1, 0x1b, 0x30, 0x19, 0x76, 0xaa, 0x55, 0x12, 0x86, 0x3b, 0x9d, 0xe6, + 0xcb, 0xfe, 0x76, 0xb8, 0xe4, 0x86, 0xf4, 0xfe, 0xb1, 0xea, 0xb6, 0xdc, 0x88, 0x99, 0x3e, 0xf2, + 0xe5, 0xab, 0x47, 0x87, 0x53, 0x93, 0x95, 0x9e, 0x58, 0xf8, 0x18, 0x0a, 0x08, 0xc3, 0x65, 0x2e, + 0xfc, 0xba, 0x68, 0x0f, 0x33, 0xda, 0x93, 0x47, 0x87, 0x53, 0x97, 0x17, 0x52, 0x31, 0x70, 0x8f, + 0x9a, 0x74, 0x06, 0x23, 0xb7, 0x45, 0xde, 0xf6, 0x3d, 0xc2, 0xec, 0xa6, 0xda, 0x0c, 0x6e, 0x09, + 0x38, 0x56, 0x18, 0xe8, 0xcd, 0x78, 0x25, 0xd2, 0xed, 0x22, 0xec, 0x9f, 0x27, 0x97, 0x70, 0x17, + 0x8f, 0x0e, 0xa7, 0x26, 0xee, 0x68, 0x94, 0xe8, 0x96, 0xc3, 0x06, 0x6d, 0xfb, 0x8f, 0x72, 0x80, + 0xba, 0x45, 0x04, 0x5a, 0x81, 0x21, 0xa7, 0x1a, 0xb9, 0x7b, 0x44, 0x38, 0x1c, 0x9f, 0x49, 0x3b, + 0x3e, 0x39, 0x2b, 0x4c, 0x76, 0x08, 0x5d, 0x21, 0x24, 0x96, 0x2b, 0xb3, 0xac, 0x2a, 0x16, 0x24, + 0x90, 0x0f, 0xe7, 0x9b, 0x4e, 0x18, 0xc9, 0xb5, 0x5a, 0xa3, 0x5d, 0x16, 0x82, 0xf5, 0x67, 0xfb, + 0xeb, 0x14, 0xad, 0x51, 0xbe, 0x44, 0x57, 0xee, 0x6a, 0x92, 0x10, 0xee, 0xa6, 0x8d, 0x3e, 0xcb, + 0xf4, 0x10, 0xae, 0x24, 0x4a, 0x05, 0x60, 0x25, 0x93, 0x33, 0x9a, 0xd3, 0x34, 0x74, 0x10, 0xc1, + 0x06, 0x6b, 0x2c, 0xed, 0x7f, 0x0b, 0x30, 0x3c, 0x3f, 0xbb, 0xb8, 0xe5, 0x84, 0xbb, 0x7d, 0x38, + 0x2d, 0xe9, 0xea, 0x10, 0x3a, 0x54, 0x72, 0x7f, 0x4b, 0xdd, 0x0a, 0x2b, 0x0c, 0xe4, 0xc1, 0x90, + 0xeb, 0xd1, 0x0d, 0x51, 0x3a, 0x97, 0x95, 0x59, 0x5a, 0x69, 0xfe, 0xec, 0xf2, 0xb9, 0xcc, 0xa8, + 0x63, 0xc1, 0x05, 0xbd, 0x0b, 0x45, 0x47, 0x3a, 0xa3, 0xc5, 0xb1, 0xb4, 0x92, 0x85, 0x85, 0x42, + 0x90, 0xd4, 0xfd, 0xbf, 0x02, 0x84, 0x63, 0x86, 0xe8, 0x73, 0x16, 0x8c, 0xc8, 0xae, 0x63, 0xb2, + 0x23, 0x0c, 0x57, 0x6b, 0xd9, 0xf5, 0x19, 0x93, 0x1d, 0x6e, 0x40, 0xd6, 0x00, 0x58, 0x67, 0xd9, + 0xa5, 0xca, 0xe7, 0xfb, 0x51, 0xe5, 0xd1, 0x3e, 0x14, 0xf7, 0xdd, 0xa8, 0xc1, 0x0e, 0x9e, 0xd2, + 0x10, 0x5b, 0x82, 0x0b, 0x0f, 0xdf, 0x6a, 0x4a, 0x2e, 0x1e, 0xb1, 0x3b, 0x92, 0x01, 0x8e, 0x79, + 0xa1, 0x19, 0xce, 0x98, 0x39, 0xf3, 0x99, 0xc8, 0x2a, 0x9a, 0x15, 0x58, 0x01, 0x8e, 0x71, 0xe8, + 0x10, 0x8f, 0xd2, 0x7f, 0x15, 0xf2, 0x56, 0x87, 0xee, 0x63, 0xe1, 0xd9, 0xc9, 0x60, 0x5d, 0x49, + 0x8a, 0x7c, 0xb0, 0xee, 0x68, 0x3c, 0xb0, 0xc1, 0x91, 0xee, 0x91, 0xfd, 0x06, 0xf1, 0x84, 0x6b, + 0x57, 0xed, 0x91, 0x3b, 0x0d, 0xe2, 0x61, 0x56, 0x82, 0xde, 0xe5, 0x57, 0x0b, 0xae, 0xe3, 0x32, + 0x9f, 0x6e, 0x26, 0xde, 0xd1, 0x58, 0x6f, 0x2e, 0x9f, 0x93, 0x77, 0x0a, 0xfe, 0x1f, 0x6b, 0xfc, + 0xa8, 0xba, 0xec, 0x7b, 0x37, 0xef, 0xba, 0x91, 0xf0, 0x09, 0x2b, 0x49, 0xb7, 0xc1, 0xa0, 0x58, + 0x94, 0x72, 0xc3, 0x2c, 0x5d, 0x04, 0x61, 0x69, 0xd4, 0xbc, 0x82, 0xf2, 0x95, 0x12, 0x62, 0x59, + 0x8e, 0xfe, 0x81, 0x05, 0xf9, 0x86, 0xef, 0xef, 0x86, 0xa5, 0x31, 0xb6, 0x38, 0x32, 0x50, 0xf5, + 0x84, 0xc4, 0x99, 0x5e, 0xa2, 0x64, 0x6f, 0x7a, 0x51, 0x70, 0x50, 0x7e, 0x51, 0x2a, 0x40, 0x0c, + 0x76, 0xef, 0x70, 0xea, 0xdc, 0xaa, 0xbb, 0x43, 0xaa, 0x07, 0xd5, 0x26, 0x61, 0x90, 0xcf, 0x7f, + 0x5f, 0x83, 0xdc, 0xdc, 0x23, 0x5e, 0x84, 0x79, 0xab, 0x26, 0xdf, 0xb7, 0x00, 0x62, 0x42, 0x68, + 0x82, 0xdb, 0xe6, 0x99, 0x10, 0x63, 0xe6, 0x78, 0x44, 0xe4, 0x7d, 0x80, 0x4b, 0xf2, 0x0c, 0xee, + 0x79, 0x46, 0xd3, 0xc4, 0x8d, 0xe2, 0x63, 0xb9, 0x97, 0x2c, 0xfb, 0xdf, 0x59, 0x30, 0x42, 0x3b, + 0x27, 0x45, 0xe0, 0x73, 0x30, 0x14, 0x39, 0x41, 0x5d, 0x58, 0x17, 0xb5, 0xe9, 0xd8, 0x62, 0x50, + 0x2c, 0x4a, 0x91, 0x07, 0xf9, 0xc8, 0x09, 0x77, 0xa5, 0x76, 0xb9, 0x9c, 0xd9, 0x10, 0xc7, 0x8a, + 0x25, 0xfd, 0x17, 0x62, 0xce, 0x06, 0x3d, 0x0f, 0x05, 0xaa, 0x00, 0x2c, 0x38, 0xa1, 0x34, 0xcc, + 0x8f, 0x52, 0x21, 0xbe, 0x20, 0x60, 0x58, 0x95, 0xda, 0x7f, 0x37, 0x07, 0x83, 0xf3, 0xfc, 0x9e, + 0x31, 0x14, 0xfa, 0x9d, 0xa0, 0x4a, 0x84, 0xbe, 0x99, 0xc1, 0x9a, 0xa6, 0x74, 0x2b, 0x8c, 0xa6, + 0xa6, 0xe9, 0xb3, 0xff, 0x58, 0xf0, 0xa2, 0x17, 0xd9, 0x73, 0x51, 0xe0, 0x78, 0xe1, 0x8e, 0x1f, + 0xb4, 0xb8, 0x41, 0x21, 0x97, 0xd5, 0x2a, 0xdc, 0x32, 0xe8, 0x56, 0x22, 0xd2, 0x8e, 0x43, 0x28, + 0xcc, 0x32, 0x9c, 0x68, 0x83, 0xfd, 0x9b, 0x16, 0x40, 0xdc, 0x7a, 0xf4, 0x25, 0x0b, 0xc6, 0x1c, + 0xdd, 0x29, 0x2b, 0xc6, 0x68, 0x23, 0x3b, 0x03, 0x39, 0x23, 0xcb, 0xaf, 0xd8, 0x06, 0x08, 0x9b, + 0x8c, 0xed, 0x8f, 0x42, 0x9e, 0xed, 0x0e, 0xa6, 0x8b, 0x0b, 0xcb, 0x68, 0xd2, 0x06, 0x23, 0x2d, + 0xa6, 0x58, 0x61, 0xd8, 0xaf, 0xc3, 0xb9, 0x9b, 0x77, 0x49, 0xb5, 0x13, 0xf9, 0x01, 0xb7, 0xa0, + 0xa2, 0x97, 0x01, 0x85, 0x24, 0xd8, 0x73, 0xab, 0x64, 0xb6, 0x5a, 0xa5, 0x37, 0xeb, 0xf5, 0x58, + 0x37, 0x98, 0x14, 0x94, 0x50, 0xa5, 0x0b, 0x03, 0xa7, 0xd4, 0xb2, 0x7f, 0xcf, 0x82, 0x11, 0xcd, + 0x43, 0x47, 0x4f, 0xea, 0xfa, 0x5c, 0x85, 0xdf, 0xbb, 0xc5, 0x50, 0xad, 0x64, 0xe2, 0x03, 0xe4, + 0x24, 0xe3, 0x63, 0x44, 0x81, 0x70, 0xcc, 0xf0, 0x3e, 0xde, 0x3b, 0xfb, 0x5f, 0x59, 0x70, 0x29, + 0xd5, 0x9d, 0xf8, 0x88, 0x9b, 0x3d, 0x03, 0xc5, 0x5d, 0x72, 0xb0, 0xc0, 0xd6, 0x60, 0xd2, 0xf9, + 0xb6, 0x22, 0x0b, 0x70, 0x8c, 0x63, 0x7f, 0xdb, 0x82, 0x98, 0x12, 0x15, 0x45, 0xdb, 0x71, 0xcb, + 0x35, 0x51, 0x24, 0x38, 0x89, 0x52, 0xf4, 0x2e, 0x5c, 0x31, 0x67, 0x90, 0x99, 0xd8, 0x4f, 0xee, + 0xbe, 0xe0, 0x77, 0xa6, 0x74, 0x4a, 0xb8, 0x17, 0x0b, 0xfb, 0x36, 0xe4, 0x17, 0x9d, 0x4e, 0x9d, + 0xf4, 0x65, 0xc4, 0xa1, 0x62, 0x2c, 0x20, 0x4e, 0x33, 0x92, 0x6a, 0xba, 0x10, 0x63, 0x58, 0xc0, + 0xb0, 0x2a, 0xb5, 0x7f, 0x3c, 0x08, 0x23, 0x5a, 0xe4, 0x0f, 0x3d, 0xc7, 0x03, 0xd2, 0xf6, 0x93, + 0xba, 0x2e, 0x9d, 0x6c, 0xcc, 0x4a, 0xe8, 0xfe, 0x09, 0xc8, 0x9e, 0x1b, 0x72, 0x91, 0x63, 0xec, + 0x1f, 0x2c, 0xe0, 0x58, 0x61, 0xa0, 0x29, 0xc8, 0xd7, 0x48, 0x3b, 0x6a, 0x30, 0x69, 0x3a, 0x58, + 0x2e, 0xd2, 0xa6, 0xce, 0x53, 0x00, 0xe6, 0x70, 0x8a, 0xb0, 0x43, 0xa2, 0x6a, 0x83, 0x19, 0x1b, + 0x8b, 0x1c, 0x61, 0x81, 0x02, 0x30, 0x87, 0xa7, 0x38, 0xa4, 0xf2, 0xa7, 0xef, 0x90, 0x1a, 0xca, + 0xd8, 0x21, 0x85, 0xda, 0x70, 0x21, 0x0c, 0x1b, 0x9b, 0x81, 0xbb, 0xe7, 0x44, 0x24, 0x5e, 0x39, + 0xc3, 0x27, 0xe1, 0x73, 0xe5, 0xe8, 0x70, 0xea, 0x42, 0xa5, 0xb2, 0x94, 0xa4, 0x82, 0xd3, 0x48, + 0xa3, 0x0a, 0x5c, 0x72, 0xbd, 0x90, 0x54, 0x3b, 0x01, 0x59, 0xae, 0x7b, 0x7e, 0x40, 0x96, 0xfc, + 0x90, 0x92, 0x13, 0xa1, 0x7a, 0xca, 0xd1, 0xbd, 0x9c, 0x86, 0x84, 0xd3, 0xeb, 0xa2, 0x45, 0x38, + 0x5f, 0x73, 0x43, 0x67, 0xbb, 0x49, 0x2a, 0x9d, 0xed, 0x96, 0x4f, 0x2f, 0x6c, 0x3c, 0xba, 0xa7, + 0x50, 0x7e, 0x5c, 0x9a, 0x26, 0xe6, 0x93, 0x08, 0xb8, 0xbb, 0x8e, 0xfd, 0x3d, 0x0b, 0x46, 0xf5, + 0x30, 0x0c, 0xaa, 0xc3, 0x42, 0x63, 0x7e, 0xa1, 0xc2, 0xa5, 0x6c, 0x76, 0x67, 0xe9, 0x92, 0xa2, + 0x19, 0xdf, 0xf9, 0x62, 0x18, 0xd6, 0x78, 0xf6, 0x11, 0x7a, 0xfa, 0x0c, 0xe4, 0x77, 0x7c, 0x7a, + 0xd4, 0x0f, 0x98, 0x96, 0xd9, 0x05, 0x0a, 0xc4, 0xbc, 0xcc, 0xfe, 0x5f, 0x16, 0x5c, 0x4e, 0x8f, + 0x30, 0xf9, 0x20, 0x74, 0xf2, 0x3a, 0x00, 0xed, 0x8a, 0x21, 0x2e, 0xb5, 0xf8, 0x61, 0x59, 0x82, + 0x35, 0xac, 0xfe, 0xba, 0xfd, 0x13, 0xaa, 0x6e, 0xc6, 0x7c, 0xbe, 0x6c, 0xc1, 0x18, 0x65, 0xbb, + 0x12, 0x6c, 0x1b, 0xbd, 0xdd, 0xc8, 0xa6, 0xb7, 0x8a, 0x6c, 0x6c, 0x80, 0x36, 0xc0, 0xd8, 0x64, + 0x8e, 0x7e, 0x0e, 0x8a, 0x4e, 0xad, 0x16, 0x90, 0x30, 0x54, 0xae, 0x1c, 0xe6, 0x16, 0x9d, 0x95, + 0x40, 0x1c, 0x97, 0x53, 0x11, 0xd7, 0xa8, 0xed, 0x84, 0x54, 0x6a, 0x08, 0xbb, 0x9b, 0x12, 0x71, + 0x94, 0x09, 0x85, 0x63, 0x85, 0x61, 0xff, 0xcd, 0x41, 0x30, 0x79, 0xa3, 0x1a, 0x8c, 0xef, 0x06, + 0xdb, 0x73, 0xcc, 0x75, 0xfb, 0x20, 0x4e, 0xf4, 0x0b, 0x47, 0x87, 0x53, 0xe3, 0x2b, 0x26, 0x05, + 0x9c, 0x24, 0x29, 0xb8, 0xac, 0x90, 0x83, 0xc8, 0xd9, 0x7e, 0x90, 0x83, 0x48, 0x72, 0xd1, 0x29, + 0xe0, 0x24, 0x49, 0xf4, 0x51, 0x18, 0xd9, 0x0d, 0xb6, 0xa5, 0x00, 0x4d, 0x7a, 0xae, 0x57, 0xe2, + 0x22, 0xac, 0xe3, 0xd1, 0x21, 0xdc, 0x0d, 0xb6, 0xe9, 0x81, 0x23, 0x43, 0xb1, 0xd5, 0x10, 0xae, + 0x08, 0x38, 0x56, 0x18, 0xa8, 0x0d, 0x68, 0x57, 0x8e, 0x9e, 0x72, 0x54, 0x0b, 0x39, 0xdf, 0xbf, + 0x9f, 0x9b, 0x85, 0xad, 0xac, 0x74, 0xd1, 0xc1, 0x29, 0xb4, 0xd1, 0xab, 0x70, 0x65, 0x37, 0xd8, + 0x16, 0xc7, 0xf0, 0x66, 0xe0, 0x7a, 0x55, 0xb7, 0x6d, 0x84, 0x5d, 0x4f, 0x89, 0xe6, 0x5e, 0x59, + 0x49, 0x47, 0xc3, 0xbd, 0xea, 0xdb, 0xff, 0x7c, 0x00, 0x58, 0x3c, 0x2b, 0xd5, 0x2c, 0x5a, 0x24, + 0x6a, 0xf8, 0xb5, 0xa4, 0x66, 0xb1, 0xc6, 0xa0, 0x58, 0x94, 0xca, 0x00, 0x99, 0x5c, 0x8f, 0x00, + 0x99, 0x7d, 0x18, 0x6e, 0x10, 0xa7, 0x46, 0x02, 0x69, 0x08, 0x5b, 0xcd, 0x26, 0x02, 0x77, 0x89, + 0x11, 0x8d, 0x2f, 0xb8, 0xfc, 0x7f, 0x88, 0x25, 0x37, 0xf4, 0x31, 0x38, 0x47, 0x75, 0x04, 0xbf, + 0x13, 0x49, 0xab, 0xef, 0x20, 0xb3, 0xfa, 0xb2, 0xf3, 0x6e, 0xcb, 0x28, 0xc1, 0x09, 0x4c, 0x34, + 0x0f, 0x13, 0xc2, 0x42, 0xab, 0x0c, 0x6c, 0x62, 0x60, 0x55, 0x3c, 0x7c, 0x25, 0x51, 0x8e, 0xbb, + 0x6a, 0x50, 0x89, 0xbc, 0xed, 0xd7, 0xb8, 0x93, 0x4e, 0x93, 0xc8, 0x65, 0xbf, 0x76, 0x80, 0x59, + 0x09, 0xd5, 0xc6, 0xe5, 0x49, 0x55, 0xd9, 0x75, 0xdb, 0xb7, 0x49, 0xe0, 0xee, 0x1c, 0xb0, 0x63, + 0xb5, 0x10, 0x6b, 0xe3, 0xcb, 0x5d, 0x18, 0x38, 0xa5, 0x96, 0xfd, 0x0d, 0x7a, 0x26, 0x69, 0xa1, + 0xc9, 0xf7, 0x8b, 0x5c, 0x0a, 0xe3, 0x89, 0xe1, 0x77, 0xaf, 0xa5, 0x0c, 0x26, 0xe6, 0x3e, 0x93, + 0x62, 0x7f, 0x97, 0x8a, 0x59, 0x35, 0x7b, 0x7d, 0xd8, 0x26, 0x9f, 0xd1, 0x6f, 0xf9, 0xbd, 0x14, + 0xc6, 0xcf, 0x42, 0x91, 0xfd, 0x58, 0x08, 0xfc, 0x96, 0x30, 0x11, 0xe2, 0x2c, 0x57, 0x99, 0xb8, + 0xcd, 0x32, 0x91, 0x7b, 0x5b, 0x32, 0xc2, 0x31, 0x4f, 0xdb, 0x87, 0x89, 0x24, 0x36, 0xfa, 0x14, + 0x8c, 0x86, 0x52, 0x6a, 0xc5, 0xa1, 0x7f, 0x7d, 0x4a, 0x37, 0x66, 0xb0, 0xaa, 0x68, 0xd5, 0xb1, + 0x41, 0xcc, 0xde, 0x80, 0xa1, 0x4c, 0x87, 0xd0, 0xfe, 0xa6, 0x05, 0x45, 0xe6, 0x32, 0xa8, 0x07, + 0x4e, 0x2b, 0xae, 0x32, 0x70, 0xcc, 0xa8, 0x87, 0x30, 0xcc, 0x2f, 0x17, 0xd2, 0xd5, 0x9e, 0xc1, + 0x02, 0xe2, 0x8f, 0xc2, 0xe2, 0x05, 0xc4, 0x6f, 0x31, 0x21, 0x96, 0x9c, 0xec, 0x2f, 0xe4, 0x60, + 0x68, 0xd9, 0x6b, 0x77, 0xfe, 0xdc, 0x3f, 0x4c, 0x5a, 0x83, 0xc1, 0xe5, 0x88, 0xb4, 0xcc, 0xf7, + 0x73, 0xa3, 0xe5, 0x67, 0xf5, 0xb7, 0x73, 0x25, 0xf3, 0xed, 0x1c, 0x76, 0xf6, 0x65, 0x24, 0x8a, + 0x30, 0x6e, 0xc5, 0xe1, 0x8f, 0x2f, 0x40, 0x71, 0xd5, 0xd9, 0x26, 0xcd, 0x15, 0x72, 0x10, 0xd2, + 0x5b, 0x0d, 0xf7, 0x8a, 0x5a, 0xf1, 0xad, 0xc6, 0xf0, 0x60, 0xce, 0xc3, 0x39, 0x86, 0xad, 0x36, + 0x03, 0x55, 0xcc, 0x48, 0xfc, 0x72, 0xc5, 0x32, 0x15, 0x33, 0xed, 0xd5, 0x8a, 0x86, 0x65, 0x4f, + 0xc3, 0x48, 0x4c, 0xa5, 0x0f, 0xae, 0x7f, 0x9a, 0x83, 0x31, 0xc3, 0x46, 0x67, 0x78, 0x2e, 0xac, + 0xfb, 0x7a, 0x2e, 0x0c, 0x4f, 0x42, 0xee, 0x51, 0x7b, 0x12, 0x06, 0xce, 0xde, 0x93, 0x60, 0x4e, + 0xd2, 0x60, 0x5f, 0x93, 0xd4, 0x84, 0xc1, 0x55, 0xd7, 0xdb, 0xed, 0x4f, 0xce, 0x84, 0x55, 0xbf, + 0xdd, 0x25, 0x67, 0x2a, 0x14, 0x88, 0x79, 0x99, 0x3c, 0x94, 0x06, 0xd2, 0x0f, 0x25, 0xfb, 0xf3, + 0x16, 0x9c, 0x5f, 0x23, 0x2d, 0xdf, 0x7d, 0xdb, 0x89, 0x23, 0xac, 0x68, 0xa5, 0x86, 0x1b, 0x89, + 0x80, 0x12, 0x55, 0x69, 0xc9, 0x8d, 0x30, 0x85, 0xdf, 0xc7, 0xf2, 0xc3, 0xe2, 0xc0, 0xa9, 0xe2, + 0xb9, 0x1e, 0x6b, 0x80, 0x71, 0xec, 0x94, 0x2c, 0xc0, 0x31, 0x8e, 0xfd, 0x07, 0x16, 0x0c, 0xf3, + 0x46, 0x10, 0x49, 0xdb, 0xea, 0x41, 0xbb, 0x01, 0x79, 0x56, 0x4f, 0x2c, 0xa7, 0xc5, 0x0c, 0x3c, + 0x02, 0x94, 0x1c, 0x5f, 0xfc, 0xec, 0x27, 0xe6, 0x0c, 0x98, 0x3a, 0xe6, 0xdc, 0x9d, 0x55, 0xc1, + 0x65, 0xb1, 0x3a, 0xc6, 0xa0, 0x58, 0x94, 0xda, 0x5f, 0x1f, 0x80, 0x82, 0xf4, 0xb5, 0xf2, 0x07, + 0x11, 0x9e, 0xe7, 0x47, 0x0e, 0x77, 0x45, 0x72, 0x21, 0x99, 0x41, 0xb8, 0x90, 0xe4, 0x30, 0x3d, + 0x1b, 0x53, 0xe7, 0x16, 0x7f, 0xa5, 0x5c, 0x6b, 0x25, 0x58, 0x6f, 0x04, 0xfa, 0x0c, 0x0c, 0x35, + 0xe9, 0xb6, 0x97, 0x32, 0xf3, 0x76, 0x86, 0xcd, 0x61, 0xf2, 0x44, 0xb4, 0x44, 0x8d, 0x10, 0x07, + 0x62, 0xc1, 0x75, 0xf2, 0x13, 0x30, 0x91, 0x6c, 0x75, 0x8a, 0x7b, 0xe1, 0xa2, 0x71, 0x6a, 0x6a, + 0xde, 0x80, 0xc9, 0xbf, 0x2c, 0xc4, 0xd6, 0xc9, 0xab, 0xda, 0xaf, 0xc0, 0xc8, 0x1a, 0x89, 0x02, + 0xb7, 0xca, 0x08, 0xdc, 0x6f, 0x71, 0xf5, 0x75, 0x70, 0x7f, 0x91, 0x2d, 0x56, 0x4a, 0x33, 0x44, + 0xef, 0x02, 0xb4, 0x03, 0x9f, 0xea, 0xe5, 0xa4, 0x23, 0x27, 0x3b, 0x03, 0x75, 0x7b, 0x53, 0xd1, + 0xe4, 0x4e, 0xaa, 0xf8, 0x3f, 0xd6, 0xf8, 0xd9, 0xd7, 0x20, 0xbf, 0xd6, 0x89, 0xc8, 0xdd, 0xfb, + 0x8b, 0x0a, 0xfb, 0x53, 0x30, 0xca, 0x50, 0x97, 0xfc, 0x26, 0x3d, 0x9e, 0x68, 0x4f, 0x5b, 0xf4, + 0x7f, 0xd2, 0x2c, 0xc8, 0x90, 0x30, 0x2f, 0xa3, 0x3b, 0xa0, 0xe1, 0x37, 0x6b, 0x24, 0x10, 0xe3, + 0xa1, 0xe6, 0x77, 0x89, 0x41, 0xb1, 0x28, 0xb5, 0x7f, 0x29, 0x07, 0x23, 0xac, 0xa2, 0x90, 0x1e, + 0x07, 0x30, 0xdc, 0xe0, 0x7c, 0xc4, 0x90, 0x64, 0x10, 0x53, 0xa3, 0xb7, 0x5e, 0x53, 0x77, 0x39, + 0x00, 0x4b, 0x7e, 0x94, 0xf5, 0xbe, 0xe3, 0x46, 0x94, 0x75, 0xee, 0x74, 0x59, 0xdf, 0xe1, 0x6c, + 0xb0, 0xe4, 0x67, 0xff, 0x46, 0x0e, 0x60, 0xdd, 0xaf, 0x11, 0x4c, 0xc2, 0x4e, 0x33, 0x42, 0x3f, + 0x0f, 0xf9, 0x76, 0xc3, 0x09, 0x93, 0xa6, 0xfe, 0xfc, 0x26, 0x05, 0xde, 0x3b, 0x9c, 0x2a, 0x52, + 0x5c, 0xf6, 0x07, 0x73, 0x44, 0x3d, 0x9c, 0x35, 0x77, 0x7c, 0x38, 0x2b, 0x6a, 0xc3, 0xb0, 0xdf, + 0x89, 0xa8, 0x52, 0x26, 0x4e, 0xb5, 0x0c, 0x3c, 0x5d, 0x1b, 0x9c, 0x20, 0x8f, 0x01, 0x15, 0x7f, + 0xb0, 0x64, 0x83, 0x5e, 0x82, 0x42, 0x3b, 0xf0, 0xeb, 0xf4, 0x90, 0x12, 0xe7, 0xd8, 0x93, 0xf2, + 0xe0, 0xdf, 0x14, 0xf0, 0x7b, 0xda, 0x6f, 0xac, 0xb0, 0xed, 0x1f, 0x8e, 0xf3, 0x71, 0x11, 0x8b, + 0x63, 0x12, 0x72, 0xae, 0xbc, 0xe1, 0x82, 0x20, 0x91, 0x5b, 0x9e, 0xc7, 0x39, 0xb7, 0xa6, 0xd6, + 0x71, 0xae, 0xe7, 0x91, 0xf7, 0x51, 0x18, 0xa9, 0xb9, 0x61, 0xbb, 0xe9, 0x1c, 0xac, 0xa7, 0x98, + 0x17, 0xe6, 0xe3, 0x22, 0xac, 0xe3, 0xa1, 0x17, 0x44, 0xf0, 0xf2, 0xa0, 0x71, 0xa5, 0x94, 0xc1, + 0xcb, 0x05, 0xda, 0x3c, 0x2d, 0x6e, 0xf9, 0x25, 0x18, 0x95, 0x87, 0x38, 0xe3, 0xc2, 0xaf, 0x93, + 0x2a, 0x5e, 0x74, 0x4b, 0x2b, 0xc3, 0x06, 0x66, 0x97, 0xca, 0x31, 0x74, 0xf6, 0x2a, 0xc7, 0xc7, + 0x61, 0x4c, 0xfe, 0x65, 0x7a, 0x40, 0xe9, 0x22, 0x6b, 0xbd, 0x32, 0x7b, 0x6d, 0xe9, 0x85, 0xd8, + 0xc4, 0x8d, 0x17, 0xed, 0x70, 0xbf, 0x8b, 0xf6, 0x3a, 0xc0, 0xb6, 0xdf, 0xf1, 0x6a, 0x4e, 0x70, + 0xb0, 0x3c, 0x2f, 0x42, 0x9d, 0x94, 0x86, 0x53, 0x56, 0x25, 0x58, 0xc3, 0xd2, 0x17, 0x7a, 0xf1, + 0x3e, 0x0b, 0xfd, 0x53, 0x50, 0x64, 0x61, 0x61, 0xa4, 0x36, 0x1b, 0x89, 0x20, 0x80, 0x93, 0x44, + 0x10, 0x29, 0xb5, 0xa3, 0x22, 0x89, 0xe0, 0x98, 0x1e, 0x7a, 0x03, 0x60, 0xc7, 0xf5, 0xdc, 0xb0, + 0xc1, 0xa8, 0x8f, 0x9c, 0x98, 0xba, 0xea, 0xe7, 0x82, 0xa2, 0x82, 0x35, 0x8a, 0xe8, 0x75, 0x38, + 0x4f, 0xc2, 0xc8, 0x6d, 0x39, 0x11, 0xa9, 0xa9, 0xb7, 0x1c, 0x25, 0x66, 0x13, 0x51, 0x81, 0x79, + 0x37, 0x93, 0x08, 0xf7, 0xd2, 0x80, 0xb8, 0x9b, 0x90, 0xb1, 0x23, 0x27, 0x4f, 0xb2, 0x23, 0xd1, + 0x4f, 0x2d, 0x38, 0x1f, 0x10, 0xee, 0x19, 0x0e, 0x55, 0xc3, 0x2e, 0x31, 0x79, 0x59, 0xcd, 0x22, + 0xa9, 0x86, 0xdc, 0xec, 0xd3, 0x38, 0xc9, 0x85, 0x2b, 0x0a, 0x44, 0xf6, 0xbe, 0xab, 0xfc, 0x5e, + 0x1a, 0xf0, 0xf3, 0xdf, 0x9f, 0x9a, 0xea, 0xce, 0xf0, 0xa2, 0x88, 0xd3, 0x9d, 0xf7, 0x37, 0xbe, + 0x3f, 0x35, 0x21, 0xff, 0xc7, 0x83, 0xd6, 0xd5, 0x49, 0x7a, 0xee, 0xb5, 0xfd, 0xda, 0xf2, 0xa6, + 0x88, 0xd6, 0x50, 0xe7, 0xde, 0x26, 0x05, 0x62, 0x5e, 0x86, 0x9e, 0x87, 0x42, 0xcd, 0x21, 0x2d, + 0xdf, 0x23, 0xb5, 0xd2, 0x58, 0xec, 0x0e, 0x9b, 0x17, 0x30, 0xac, 0x4a, 0x51, 0x13, 0x86, 0x5c, + 0x76, 0x37, 0x16, 0xa1, 0x59, 0x19, 0x5c, 0xc8, 0xf9, 0x5d, 0x5b, 0x06, 0x66, 0x31, 0x21, 0x2c, + 0x78, 0xe8, 0x52, 0x7f, 0xfc, 0x6c, 0xa4, 0xfe, 0xf3, 0x50, 0xa8, 0x36, 0xdc, 0x66, 0x2d, 0x20, + 0x5e, 0x69, 0x82, 0x5d, 0x12, 0xd9, 0x48, 0xcc, 0x09, 0x18, 0x56, 0xa5, 0xe8, 0x2f, 0xc1, 0x98, + 0xdf, 0x89, 0xd8, 0x26, 0xa7, 0xf3, 0x1f, 0x96, 0xce, 0x33, 0x74, 0xe6, 0x68, 0xdf, 0xd0, 0x0b, + 0xb0, 0x89, 0x47, 0x85, 0x6d, 0xc3, 0x0f, 0x23, 0xfa, 0x87, 0x09, 0xdb, 0xcb, 0xa6, 0xb0, 0x5d, + 0xd2, 0xca, 0xb0, 0x81, 0x89, 0xbe, 0x66, 0xc1, 0xf9, 0x56, 0xf2, 0xea, 0x52, 0xba, 0xc2, 0x46, + 0xa6, 0x92, 0x85, 0x8a, 0x9b, 0x20, 0xcd, 0xe3, 0x11, 0xbb, 0xc0, 0xb8, 0xbb, 0x11, 0xec, 0x3d, + 0x6a, 0x78, 0xe0, 0x55, 0x1b, 0x81, 0xef, 0x99, 0xcd, 0x7b, 0x3c, 0xab, 0xf7, 0x03, 0x6c, 0x97, + 0xa5, 0xb1, 0x28, 0x3f, 0x7e, 0x74, 0x38, 0x75, 0x29, 0xb5, 0x08, 0xa7, 0x37, 0x6a, 0x72, 0x1e, + 0x2e, 0xa7, 0xef, 0xd4, 0xfb, 0xe9, 0xda, 0x03, 0xba, 0xae, 0xbd, 0x00, 0x8f, 0xf7, 0x6c, 0x14, + 0x95, 0xf9, 0x52, 0x31, 0xb3, 0x4c, 0x99, 0xdf, 0xa5, 0x48, 0x9d, 0x83, 0x51, 0x3d, 0x2f, 0x0f, + 0x8b, 0x7a, 0xd0, 0xde, 0x42, 0xa3, 0x77, 0xa1, 0xe8, 0x57, 0x32, 0x0f, 0x1f, 0xd8, 0xa8, 0x74, + 0x85, 0x0f, 0x28, 0x10, 0x8e, 0x19, 0xf6, 0x13, 0xf5, 0x90, 0xfa, 0x70, 0xfb, 0x11, 0x37, 0xfb, + 0xc4, 0x51, 0x0f, 0xff, 0x71, 0x10, 0x62, 0x4a, 0xe8, 0x05, 0x28, 0x10, 0xaf, 0xd6, 0xf6, 0x5d, + 0x2f, 0x4a, 0xda, 0x7d, 0x6e, 0x0a, 0x38, 0x56, 0x18, 0x5a, 0x8c, 0x44, 0xee, 0xd8, 0x18, 0x89, + 0x1a, 0x8c, 0x3b, 0xcc, 0x84, 0x1f, 0x7b, 0xb8, 0x07, 0x4e, 0xec, 0x92, 0x9a, 0x35, 0x29, 0xe0, + 0x24, 0x49, 0xca, 0x25, 0x8c, 0xab, 0x32, 0x2e, 0x83, 0x27, 0xe6, 0x52, 0x31, 0x29, 0xe0, 0x24, + 0x49, 0xf4, 0x3a, 0x94, 0xaa, 0xec, 0x21, 0x0c, 0xef, 0xe3, 0xf2, 0xce, 0xba, 0x1f, 0x6d, 0x06, + 0x24, 0x24, 0x1e, 0x8f, 0x40, 0x28, 0x94, 0x9f, 0x16, 0xa3, 0x50, 0x9a, 0xeb, 0x81, 0x87, 0x7b, + 0x52, 0xa0, 0x5a, 0x1d, 0xf3, 0x3f, 0xb8, 0xd1, 0xc1, 0x96, 0xbf, 0x4b, 0xa4, 0x73, 0x44, 0x69, + 0x75, 0x15, 0xbd, 0x10, 0x9b, 0xb8, 0xe8, 0x57, 0x2d, 0x18, 0x6b, 0x4a, 0x33, 0x1e, 0xee, 0x34, + 0x65, 0xe6, 0x1f, 0x9c, 0xc9, 0xf2, 0x5b, 0xd5, 0x29, 0x73, 0x81, 0x6f, 0x80, 0xb0, 0xc9, 0xdb, + 0xfe, 0xae, 0x05, 0x13, 0xc9, 0x6a, 0x68, 0x17, 0x9e, 0x6a, 0x39, 0xc1, 0xee, 0xb2, 0xb7, 0x13, + 0xb0, 0x10, 0xd1, 0x88, 0xcf, 0xea, 0xec, 0x4e, 0x44, 0x82, 0x79, 0xe7, 0x80, 0x07, 0x82, 0xe5, + 0x55, 0xb2, 0xb2, 0xa7, 0xd6, 0x8e, 0x43, 0xc6, 0xc7, 0xd3, 0x42, 0x15, 0xb8, 0x44, 0x11, 0xe6, + 0x49, 0x93, 0x50, 0x09, 0x15, 0x33, 0xc9, 0x31, 0x26, 0x2a, 0xd4, 0x61, 0x2d, 0x0d, 0x09, 0xa7, + 0xd7, 0xb5, 0x0b, 0x30, 0xc4, 0xc3, 0xe3, 0xed, 0xff, 0x90, 0x03, 0x79, 0x92, 0xfe, 0xf9, 0x36, + 0x99, 0x23, 0x1b, 0x86, 0x02, 0x76, 0x1b, 0x16, 0x17, 0x35, 0xa6, 0xd4, 0xf0, 0xfb, 0x31, 0x16, + 0x25, 0x54, 0xc5, 0x20, 0x77, 0xdd, 0x68, 0xce, 0xaf, 0xc9, 0xeb, 0x19, 0x53, 0x31, 0x6e, 0x0a, + 0x18, 0x56, 0xa5, 0xf6, 0x2f, 0x5b, 0x30, 0x46, 0x7b, 0xd9, 0x6c, 0x92, 0x66, 0x25, 0x22, 0xed, + 0x10, 0x85, 0x90, 0x0f, 0xe9, 0x8f, 0xec, 0xcc, 0x0c, 0xf1, 0xab, 0x08, 0xd2, 0xd6, 0x0c, 0xaa, + 0x94, 0x09, 0xe6, 0xbc, 0xec, 0x6f, 0x0d, 0x40, 0x51, 0x0d, 0x76, 0x1f, 0x56, 0xda, 0xeb, 0x71, + 0xee, 0x06, 0x2e, 0x0d, 0x4b, 0x5a, 0xde, 0x06, 0x7a, 0xa7, 0x9a, 0xf5, 0x0e, 0xf8, 0xf3, 0xcb, + 0x38, 0x89, 0xc3, 0x0b, 0xa6, 0x3b, 0xe8, 0xb2, 0xee, 0x63, 0xd0, 0xf0, 0x85, 0x5f, 0xe8, 0xae, + 0xee, 0x8d, 0x1b, 0xcc, 0xea, 0x64, 0x51, 0xae, 0x86, 0xde, 0x6e, 0xb8, 0x44, 0x02, 0xb2, 0x7c, + 0x5f, 0x09, 0xc8, 0xae, 0xc1, 0x20, 0xf1, 0x3a, 0x2d, 0x16, 0x22, 0x5f, 0x64, 0x3a, 0xd5, 0xe0, + 0x4d, 0xaf, 0xd3, 0x32, 0x7b, 0xc6, 0x50, 0xd0, 0x27, 0x60, 0xa4, 0x46, 0xc2, 0x6a, 0xe0, 0xb2, + 0x37, 0x85, 0xe2, 0x52, 0xfa, 0x24, 0xbb, 0xe9, 0xc7, 0x60, 0xb3, 0xa2, 0x5e, 0xc1, 0x7e, 0x1b, + 0x86, 0x36, 0x9b, 0x9d, 0xba, 0xeb, 0xa1, 0x36, 0x0c, 0xf1, 0x17, 0x86, 0xe2, 0xe4, 0xcd, 0x40, + 0x51, 0xe7, 0xbb, 0x5d, 0x8b, 0x0c, 0xe7, 0x8f, 0x63, 0x04, 0x1f, 0xfb, 0x9f, 0x59, 0x40, 0x6f, + 0x15, 0x8b, 0x73, 0xe8, 0xaf, 0x40, 0x21, 0x94, 0xcf, 0x47, 0xf9, 0x32, 0xf9, 0x90, 0x8a, 0x20, + 0x15, 0xf0, 0x7b, 0x87, 0x53, 0x63, 0x0c, 0x59, 0xbd, 0xf8, 0x54, 0x55, 0x50, 0x13, 0xc6, 0x98, + 0x1d, 0x55, 0x9e, 0x47, 0xc2, 0xf2, 0x7d, 0xa3, 0xcf, 0x47, 0x79, 0x7a, 0x55, 0x21, 0x9d, 0x75, + 0x10, 0x36, 0x89, 0xdb, 0xff, 0x62, 0x10, 0x34, 0x73, 0x63, 0x1f, 0xcb, 0xfb, 0xad, 0x84, 0x71, + 0x79, 0x2d, 0x13, 0xe3, 0xb2, 0xb4, 0xd8, 0x72, 0x91, 0x61, 0xda, 0x93, 0x69, 0xa3, 0x1a, 0xa4, + 0xd9, 0x16, 0x9b, 0x43, 0x35, 0x6a, 0x89, 0x34, 0xdb, 0x98, 0x95, 0xa8, 0xe7, 0x05, 0x83, 0x3d, + 0x9f, 0x17, 0x34, 0x20, 0x5f, 0x77, 0x3a, 0x75, 0x22, 0xa2, 0x46, 0x32, 0xf0, 0x23, 0xb0, 0x78, + 0x4b, 0xee, 0x47, 0x60, 0x3f, 0x31, 0x67, 0x40, 0x77, 0x67, 0x43, 0xfa, 0x79, 0x85, 0x41, 0x28, + 0x83, 0xdd, 0xa9, 0x5c, 0xc7, 0x7c, 0x77, 0xaa, 0xbf, 0x38, 0x66, 0x46, 0xef, 0x8b, 0x55, 0xfe, + 0x96, 0x57, 0x1c, 0xf8, 0xcb, 0x59, 0xbc, 0x9f, 0x60, 0x04, 0xf9, 0x7d, 0x51, 0xfc, 0xc1, 0x92, + 0x8d, 0x3d, 0x03, 0x23, 0x5a, 0x1a, 0x31, 0x3a, 0x0d, 0xea, 0x19, 0xa9, 0x36, 0x0d, 0xf3, 0x4e, + 0xe4, 0x60, 0x56, 0x62, 0xff, 0xbd, 0x01, 0x50, 0xf7, 0x76, 0x3d, 0xda, 0xdf, 0xa9, 0x6a, 0x8f, + 0xde, 0x8d, 0x67, 0x66, 0xbe, 0x87, 0x45, 0x29, 0x55, 0x8a, 0x5a, 0x24, 0xa8, 0xab, 0x9b, 0x82, + 0x90, 0xaf, 0x4a, 0x29, 0x5a, 0xd3, 0x0b, 0xb1, 0x89, 0x4b, 0x35, 0xda, 0x96, 0xe3, 0xb9, 0x3b, + 0x24, 0x8c, 0x92, 0x41, 0x5b, 0x6b, 0x02, 0x8e, 0x15, 0x06, 0x5a, 0x84, 0xf3, 0x21, 0x89, 0x36, + 0xf6, 0x3d, 0x12, 0xa8, 0xe7, 0x6f, 0xe2, 0x3d, 0xa4, 0x0a, 0x64, 0xac, 0x24, 0x11, 0x70, 0x77, + 0x9d, 0xd4, 0x40, 0x97, 0xfc, 0x89, 0x03, 0x5d, 0xe6, 0x61, 0x62, 0xc7, 0x71, 0x9b, 0x9d, 0x80, + 0xf4, 0x0c, 0x97, 0x59, 0x48, 0x94, 0xe3, 0xae, 0x1a, 0x2c, 0x96, 0xb6, 0xe9, 0xd4, 0xc3, 0xd2, + 0xb0, 0x16, 0x4b, 0x4b, 0x01, 0x98, 0xc3, 0xed, 0x7f, 0x6c, 0x01, 0x7f, 0x88, 0x3e, 0xbb, 0xb3, + 0xe3, 0x7a, 0x6e, 0x74, 0x80, 0x7e, 0xcb, 0x82, 0x09, 0xcf, 0xaf, 0x91, 0x59, 0x2f, 0x72, 0x25, + 0x30, 0xbb, 0x1c, 0x4b, 0x8c, 0xd7, 0x7a, 0x82, 0x3c, 0x7f, 0xd5, 0x98, 0x84, 0xe2, 0xae, 0x66, + 0xd8, 0x57, 0xe0, 0x52, 0x2a, 0x01, 0xfb, 0xbb, 0x03, 0x60, 0xbe, 0xa7, 0x47, 0xaf, 0x40, 0xbe, + 0xc9, 0x5e, 0x78, 0x5a, 0x0f, 0x98, 0x28, 0x81, 0x8d, 0x15, 0x7f, 0x02, 0xca, 0x29, 0xa1, 0x79, + 0x18, 0x61, 0x8f, 0xf4, 0xc5, 0xfb, 0x5b, 0xbe, 0x14, 0xed, 0x38, 0x09, 0xa5, 0x2a, 0xba, 0x67, + 0xfe, 0xc5, 0x7a, 0x35, 0xf4, 0x0e, 0x0c, 0x6f, 0xf3, 0x3c, 0x34, 0xd9, 0x19, 0xf6, 0x45, 0x62, + 0x1b, 0xa6, 0x45, 0xc8, 0x2c, 0x37, 0xf7, 0xe2, 0x9f, 0x58, 0x72, 0x44, 0x07, 0x50, 0x70, 0xe4, + 0x9c, 0x0e, 0x66, 0x15, 0x7d, 0x69, 0xac, 0x1f, 0xae, 0xdb, 0xa9, 0x39, 0x54, 0xec, 0x12, 0x8e, + 0xf2, 0x7c, 0x5f, 0x8e, 0xf2, 0x6f, 0x5a, 0x00, 0x71, 0x86, 0x3a, 0x74, 0x17, 0x0a, 0xe1, 0x0d, + 0xe3, 0x7a, 0x9d, 0xc5, 0x83, 0x36, 0x41, 0x51, 0x7b, 0xf4, 0x21, 0x20, 0x58, 0x71, 0xbb, 0x9f, + 0x49, 0xe0, 0x4f, 0x2d, 0xb8, 0x98, 0x96, 0x49, 0xef, 0x11, 0xb6, 0xf8, 0xa4, 0xd6, 0x00, 0x51, + 0x61, 0x33, 0x20, 0x3b, 0xee, 0xdd, 0xa4, 0x4b, 0x7f, 0x45, 0x16, 0xe0, 0x18, 0xc7, 0xfe, 0xf6, + 0x10, 0x28, 0xc6, 0xa7, 0x64, 0x3d, 0x78, 0x8e, 0xde, 0x2e, 0xea, 0x71, 0x7e, 0x24, 0x85, 0x87, + 0x19, 0x14, 0x8b, 0x52, 0x7a, 0xc3, 0x90, 0xd1, 0x7b, 0x42, 0x64, 0xb3, 0x55, 0x28, 0xa3, 0xfc, + 0xb0, 0x2a, 0x4d, 0xb3, 0x47, 0xe4, 0xcf, 0xc4, 0x1e, 0x31, 0x94, 0xbd, 0x3d, 0xe2, 0x1a, 0x0c, + 0x07, 0x7e, 0x93, 0xcc, 0xe2, 0x75, 0xa1, 0x37, 0xc7, 0x79, 0xbd, 0x38, 0x18, 0xcb, 0x72, 0xf4, + 0x51, 0x18, 0xe9, 0x84, 0xa4, 0x32, 0xbf, 0x32, 0x17, 0x90, 0x5a, 0x28, 0x02, 0xfe, 0x95, 0x53, + 0xed, 0x56, 0x5c, 0x84, 0x75, 0x3c, 0xf4, 0x6d, 0xeb, 0x18, 0x93, 0x47, 0x31, 0xab, 0x33, 0x21, + 0x35, 0xbb, 0x08, 0xbb, 0x04, 0x3c, 0x88, 0x1d, 0xe5, 0xeb, 0x16, 0x9c, 0x27, 0x5e, 0x35, 0x38, + 0x60, 0x74, 0x04, 0x35, 0xe1, 0x58, 0xba, 0x95, 0xc5, 0xe6, 0xbb, 0x99, 0x24, 0xce, 0xad, 0xc6, + 0x5d, 0x60, 0xdc, 0xdd, 0x0c, 0xfb, 0x87, 0x39, 0xb8, 0x90, 0x42, 0x81, 0x05, 0x47, 0xb7, 0xe8, + 0x02, 0x5a, 0xae, 0x25, 0xb7, 0xcf, 0x8a, 0x80, 0x63, 0x85, 0x81, 0x36, 0xe1, 0xe2, 0x6e, 0x2b, + 0x8c, 0xa9, 0xcc, 0xf9, 0x5e, 0x44, 0xee, 0xca, 0xcd, 0x24, 0x7d, 0x44, 0x17, 0x57, 0x52, 0x70, + 0x70, 0x6a, 0x4d, 0xaa, 0x6d, 0x10, 0xcf, 0xd9, 0x6e, 0x92, 0xb8, 0x48, 0x84, 0xf6, 0x2b, 0x6d, + 0xe3, 0x66, 0xa2, 0x1c, 0x77, 0xd5, 0x40, 0x5f, 0xb2, 0xe0, 0x89, 0x90, 0x04, 0x7b, 0x24, 0xa8, + 0xb8, 0x35, 0x32, 0xd7, 0x09, 0x23, 0xbf, 0x45, 0x82, 0x07, 0xb4, 0xc9, 0x4d, 0x1d, 0x1d, 0x4e, + 0x3d, 0x51, 0xe9, 0x4d, 0x0d, 0x1f, 0xc7, 0xca, 0xfe, 0x92, 0x05, 0xe7, 0x2a, 0xec, 0x96, 0xa8, + 0x74, 0xce, 0xac, 0xd3, 0x41, 0x3d, 0xa7, 0x9e, 0x79, 0x26, 0x84, 0x98, 0xf9, 0x30, 0xd3, 0x7e, + 0x13, 0x26, 0x2a, 0xa4, 0xe5, 0xb4, 0x1b, 0xec, 0xd5, 0x0c, 0x0f, 0x62, 0x98, 0x81, 0x62, 0x28, + 0x61, 0xc9, 0x3c, 0x9a, 0x0a, 0x19, 0xc7, 0x38, 0xe8, 0x59, 0x1e, 0x70, 0x21, 0x23, 0x8b, 0x8b, + 0x5c, 0x3b, 0xe7, 0x51, 0x1a, 0x21, 0x96, 0x65, 0xf6, 0x3e, 0x8c, 0xc6, 0xd5, 0xc9, 0x0e, 0xaa, + 0xc3, 0x78, 0x55, 0x0b, 0x8c, 0x8f, 0x63, 0x66, 0xfb, 0x8f, 0xa1, 0x67, 0xb2, 0x68, 0xce, 0x24, + 0x82, 0x93, 0x54, 0xed, 0xaf, 0xe4, 0x60, 0x5c, 0x71, 0x16, 0x0e, 0x81, 0xf7, 0x92, 0x41, 0x22, + 0x38, 0x8b, 0xe7, 0xe7, 0xe6, 0x48, 0x1e, 0x13, 0x28, 0xf2, 0x5e, 0x32, 0x50, 0xe4, 0x54, 0xd9, + 0x77, 0xf9, 0x38, 0xbe, 0x99, 0x83, 0x82, 0x7a, 0x0c, 0xff, 0x0a, 0xe4, 0xd9, 0x05, 0xea, 0xe1, + 0xb4, 0x51, 0x76, 0x19, 0xc3, 0x9c, 0x12, 0x25, 0xc9, 0xfc, 0xdc, 0x0f, 0x9c, 0x09, 0xac, 0xc8, + 0xed, 0x5e, 0x4e, 0x10, 0x61, 0x4e, 0x09, 0xad, 0xc0, 0x00, 0xf1, 0x6a, 0x42, 0x2d, 0x3d, 0x39, + 0x41, 0x96, 0x43, 0xf6, 0xa6, 0x57, 0xc3, 0x94, 0x0a, 0x4b, 0x47, 0xc5, 0xb5, 0x8f, 0x41, 0x73, + 0x7b, 0x08, 0xd5, 0x43, 0x94, 0xda, 0xbf, 0x3a, 0x00, 0x43, 0x95, 0xce, 0x36, 0x55, 0xb0, 0x7f, + 0xc7, 0x82, 0x0b, 0xfb, 0x89, 0xcc, 0x75, 0xf1, 0x92, 0xbd, 0x95, 0x9d, 0xed, 0x4f, 0x8f, 0xb5, + 0x78, 0x42, 0xb4, 0xeb, 0x42, 0x4a, 0x21, 0x4e, 0x6b, 0x8e, 0x91, 0xa9, 0x6a, 0xe0, 0x54, 0x32, + 0x55, 0xdd, 0x3d, 0xe5, 0xa8, 0xda, 0xb1, 0x5e, 0x11, 0xb5, 0xf6, 0x4f, 0xf3, 0x00, 0x7c, 0x36, + 0x36, 0xda, 0x51, 0x3f, 0xc6, 0xa1, 0x97, 0x60, 0x54, 0x7e, 0x88, 0x64, 0x3d, 0x0e, 0xec, 0x51, + 0xce, 0xdd, 0x45, 0xad, 0x0c, 0x1b, 0x98, 0xec, 0x42, 0xe0, 0x45, 0xc1, 0x01, 0x57, 0x1a, 0x93, + 0x91, 0xb3, 0xaa, 0x04, 0x6b, 0x58, 0x68, 0xda, 0x30, 0xb6, 0xf3, 0xac, 0x1d, 0xe7, 0x8e, 0xb1, + 0x8d, 0x7f, 0x1c, 0xc6, 0xd4, 0xbf, 0x05, 0xb7, 0x49, 0x92, 0x4e, 0x95, 0x4d, 0xbd, 0x10, 0x9b, + 0xb8, 0xe8, 0x13, 0x70, 0xce, 0x7c, 0x7c, 0x2b, 0xd4, 0x2c, 0xf5, 0xf4, 0xdd, 0x7c, 0xb3, 0x8b, + 0x13, 0xd8, 0x74, 0x07, 0xd4, 0x82, 0x03, 0xdc, 0xf1, 0x84, 0xbe, 0xa5, 0x76, 0xc0, 0x3c, 0x83, + 0x62, 0x51, 0x4a, 0x87, 0x90, 0x1f, 0x65, 0x1c, 0x2e, 0x5e, 0x4f, 0xaa, 0x21, 0xac, 0x68, 0x65, + 0xd8, 0xc0, 0xa4, 0x1c, 0x84, 0x65, 0x0e, 0xcc, 0x3d, 0x96, 0x30, 0xa7, 0xb5, 0xe1, 0x9c, 0x6f, + 0x1a, 0x36, 0x78, 0x28, 0xcc, 0x47, 0xfa, 0x5c, 0xb7, 0x46, 0x5d, 0xfe, 0xda, 0x27, 0x61, 0x07, + 0x49, 0xd0, 0xa7, 0x0a, 0xa7, 0x1e, 0x24, 0x3b, 0x6a, 0x46, 0x71, 0xf5, 0x8c, 0x63, 0xdd, 0x84, + 0x8b, 0x6d, 0xbf, 0xb6, 0x19, 0xb8, 0x7e, 0xe0, 0x46, 0x07, 0x73, 0x4d, 0x27, 0x0c, 0xd9, 0xaa, + 0x1a, 0x33, 0x35, 0x9b, 0xcd, 0x14, 0x1c, 0x9c, 0x5a, 0x93, 0x5e, 0x0d, 0xda, 0x02, 0xc8, 0x22, + 0x38, 0xf2, 0xfc, 0x6a, 0x20, 0x11, 0xb1, 0x2a, 0xb5, 0x2f, 0xc0, 0xf9, 0x4a, 0xa7, 0xdd, 0x6e, + 0xba, 0xa4, 0xa6, 0x2c, 0xe1, 0xf6, 0x2f, 0xc0, 0xb8, 0x48, 0x82, 0xa5, 0xf4, 0x88, 0x13, 0xa5, + 0x6c, 0xb4, 0x7f, 0x6a, 0xc1, 0x78, 0xc2, 0x5f, 0x8e, 0xde, 0x49, 0x9e, 0xfe, 0x99, 0x38, 0x36, + 0xf4, 0x83, 0x9f, 0xef, 0xf0, 0x54, 0x4d, 0xa2, 0x21, 0xe3, 0x42, 0x33, 0x0b, 0xaf, 0x66, 0xd1, + 0x93, 0xfc, 0x38, 0xd1, 0x83, 0x4b, 0xed, 0x2f, 0xe6, 0x20, 0x3d, 0x48, 0x01, 0x7d, 0xa6, 0x7b, + 0x00, 0x5e, 0xc9, 0x70, 0x00, 0x44, 0x94, 0x44, 0xef, 0x31, 0xf0, 0xcc, 0x31, 0x58, 0xcb, 0x68, + 0x0c, 0x04, 0xdf, 0xee, 0x91, 0xf8, 0xdf, 0x16, 0x8c, 0x6c, 0x6d, 0xad, 0x2a, 0xe3, 0x14, 0x86, + 0xcb, 0x21, 0x7f, 0x16, 0xc7, 0xbc, 0x8b, 0x73, 0x7e, 0xab, 0xcd, 0x9d, 0x8d, 0xc2, 0x09, 0xca, + 0xf2, 0x91, 0x55, 0x52, 0x31, 0x70, 0x8f, 0x9a, 0x68, 0x19, 0x2e, 0xe8, 0x25, 0xc2, 0xc4, 0x28, + 0x1c, 0x9e, 0xfc, 0xa1, 0x78, 0x77, 0x31, 0x4e, 0xab, 0x93, 0x24, 0x25, 0xec, 0x8c, 0xe2, 0xf3, + 0x3a, 0x5d, 0xa4, 0x44, 0x31, 0x4e, 0xab, 0x63, 0x6f, 0xc0, 0x88, 0xf6, 0xb1, 0x27, 0xf4, 0x49, + 0x98, 0xa8, 0xfa, 0x2d, 0x69, 0xdf, 0x59, 0x25, 0x7b, 0xa4, 0x29, 0xba, 0xcc, 0x4c, 0x80, 0x73, + 0x89, 0x32, 0xdc, 0x85, 0x6d, 0xff, 0x8f, 0xab, 0xa0, 0xde, 0xa1, 0xf4, 0x71, 0x3c, 0xb5, 0x55, + 0xf8, 0x56, 0x3e, 0xe3, 0xf0, 0x2d, 0x25, 0x6b, 0x13, 0x21, 0x5c, 0x51, 0x1c, 0xc2, 0x35, 0x94, + 0x75, 0x08, 0x97, 0xd2, 0x36, 0xbb, 0xc2, 0xb8, 0xbe, 0x6a, 0xc1, 0xa8, 0xe7, 0xd7, 0x88, 0x72, + 0x21, 0x0d, 0x33, 0x95, 0xf7, 0xf5, 0xec, 0xe2, 0x52, 0x79, 0x38, 0x92, 0x20, 0xcf, 0x83, 0xfc, + 0xd4, 0x11, 0xa5, 0x17, 0x61, 0xa3, 0x1d, 0x68, 0x41, 0xb3, 0x38, 0xf2, 0x24, 0x54, 0x4f, 0xa6, + 0x5d, 0x3d, 0xee, 0x6b, 0x3e, 0xbc, 0xab, 0x29, 0x5d, 0xc5, 0xac, 0x2c, 0x69, 0xf2, 0x8d, 0x83, + 0xe6, 0x18, 0x90, 0x29, 0xf5, 0x62, 0x65, 0xcc, 0x86, 0x21, 0x1e, 0x0d, 0x28, 0x3e, 0x3b, 0xc4, + 0xfc, 0x55, 0x3c, 0x52, 0x10, 0x8b, 0x12, 0x14, 0x49, 0x37, 0xf5, 0x48, 0x56, 0x09, 0x72, 0x0d, + 0x37, 0x78, 0xba, 0x9f, 0x1a, 0xbd, 0xac, 0xdf, 0x68, 0x47, 0xfb, 0xb9, 0xd1, 0x8e, 0xf5, 0xbc, + 0xcd, 0x7e, 0xd9, 0x82, 0xd1, 0xaa, 0x96, 0xb0, 0xb6, 0xf4, 0x7c, 0x56, 0x9f, 0x18, 0x49, 0xcb, + 0x2b, 0xcc, 0x1f, 0x63, 0x1a, 0x09, 0x72, 0x0d, 0xee, 0x2c, 0x87, 0x12, 0xbb, 0xbe, 0xb3, 0xa3, + 0x7f, 0xe4, 0xfa, 0x66, 0x06, 0xc7, 0x83, 0x61, 0x0e, 0xe0, 0xd3, 0xc8, 0x61, 0x58, 0xf0, 0x42, + 0xef, 0x42, 0x41, 0x06, 0x94, 0x8a, 0x70, 0x4f, 0x9c, 0x85, 0x79, 0xdc, 0x74, 0x7e, 0xc9, 0xcc, + 0x2b, 0x1c, 0x8a, 0x15, 0x47, 0xd4, 0x80, 0x81, 0x9a, 0x53, 0x17, 0x81, 0x9f, 0x6b, 0xd9, 0x24, + 0xb6, 0x92, 0x3c, 0xd9, 0xdd, 0x6c, 0x7e, 0x76, 0x11, 0x53, 0x16, 0xe8, 0x6e, 0x9c, 0xf1, 0x73, + 0x22, 0xb3, 0xd3, 0xd7, 0x54, 0x93, 0xb8, 0x81, 0xa2, 0x2b, 0x81, 0x68, 0x4d, 0xf8, 0x0b, 0xff, + 0x02, 0x63, 0xbb, 0x90, 0x4d, 0x66, 0x2c, 0xfe, 0x9d, 0x96, 0xd8, 0xe7, 0x48, 0xb9, 0xb0, 0xef, + 0x53, 0xfd, 0x6c, 0x56, 0x5c, 0x96, 0xb6, 0xb6, 0x36, 0xbb, 0xbe, 0x4b, 0xd5, 0x84, 0xa1, 0x36, + 0x8b, 0x3d, 0x28, 0xfd, 0x5c, 0x56, 0x67, 0x0b, 0x8f, 0x65, 0xe0, 0x6b, 0x93, 0xff, 0xc6, 0x82, + 0x07, 0xba, 0x09, 0xc3, 0x3c, 0x71, 0x35, 0x0f, 0xbc, 0x1d, 0xb9, 0x3e, 0xd9, 0x3b, 0xfd, 0x75, + 0x7c, 0x50, 0xf0, 0xff, 0x21, 0x96, 0x75, 0xd1, 0x57, 0x2c, 0x38, 0x47, 0x25, 0x6a, 0x9c, 0x69, + 0xbb, 0x84, 0xb2, 0x92, 0x59, 0xb7, 0x42, 0xaa, 0x91, 0x48, 0x59, 0xa3, 0xae, 0x49, 0xcb, 0x06, + 0x3b, 0x9c, 0x60, 0x8f, 0xde, 0x83, 0x42, 0xe8, 0xd6, 0x48, 0xd5, 0x09, 0xc2, 0xd2, 0x85, 0xd3, + 0x69, 0x4a, 0xec, 0x28, 0x11, 0x8c, 0xb0, 0x62, 0x89, 0xfe, 0x36, 0xfb, 0x68, 0x87, 0xf8, 0xc0, + 0x92, 0xf8, 0xf6, 0xdf, 0xc5, 0x53, 0xfb, 0xf6, 0x1f, 0xf7, 0x1f, 0x98, 0xec, 0x70, 0x92, 0x3f, + 0xfa, 0xeb, 0x16, 0x5c, 0xe2, 0x89, 0x56, 0x93, 0x59, 0x76, 0x2f, 0x3d, 0xa0, 0x6d, 0x86, 0x45, + 0x0c, 0xcf, 0xa6, 0x91, 0xc4, 0xe9, 0x9c, 0x58, 0xa6, 0x36, 0x33, 0x31, 0xfa, 0xe5, 0x4c, 0x1d, + 0x86, 0xfd, 0x27, 0x43, 0x47, 0x2f, 0xc2, 0x48, 0x5b, 0x1c, 0x87, 0x6e, 0xd8, 0x62, 0xf1, 0xdf, + 0x03, 0xfc, 0x8d, 0xcc, 0x66, 0x0c, 0xc6, 0x3a, 0x8e, 0x91, 0xb6, 0xef, 0xda, 0x71, 0x69, 0xfb, + 0xd0, 0x2d, 0x18, 0x89, 0xfc, 0x26, 0x09, 0xc4, 0x4d, 0xb5, 0xc4, 0x56, 0xe0, 0xd5, 0xb4, 0xbd, + 0xb5, 0xa5, 0xd0, 0xe2, 0x9b, 0x6c, 0x0c, 0x0b, 0xb1, 0x4e, 0x87, 0x85, 0x73, 0x8a, 0x04, 0xb6, + 0x01, 0xbb, 0xc2, 0x3e, 0x9e, 0x08, 0xe7, 0xd4, 0x0b, 0xb1, 0x89, 0x8b, 0x16, 0xe1, 0x7c, 0xbb, + 0xeb, 0x0e, 0xcc, 0x5f, 0x80, 0xa8, 0x58, 0x84, 0xee, 0x0b, 0x70, 0x77, 0x1d, 0xe3, 0xf6, 0xfb, + 0xc4, 0x71, 0xb7, 0xdf, 0x1e, 0x49, 0xec, 0x9e, 0x7c, 0x90, 0x24, 0x76, 0xa8, 0x06, 0x4f, 0x3a, + 0x9d, 0xc8, 0x67, 0x79, 0x07, 0xcc, 0x2a, 0x3c, 0xb2, 0xf5, 0x69, 0x1e, 0x2c, 0x7b, 0x74, 0x38, + 0xf5, 0xe4, 0xec, 0x31, 0x78, 0xf8, 0x58, 0x2a, 0xe8, 0x6d, 0x28, 0x10, 0x91, 0x88, 0xaf, 0xf4, + 0xa1, 0xac, 0x94, 0x04, 0x33, 0xb5, 0x9f, 0x0c, 0x54, 0xe4, 0x30, 0xac, 0xf8, 0xa1, 0x2d, 0x18, + 0x69, 0xf8, 0x61, 0x34, 0xdb, 0x74, 0x9d, 0x90, 0x84, 0xa5, 0xa7, 0xd8, 0xa2, 0x49, 0xd5, 0xbd, + 0x96, 0x24, 0x5a, 0xbc, 0x66, 0x96, 0xe2, 0x9a, 0x58, 0x27, 0x83, 0x08, 0x73, 0x1b, 0xb2, 0xb0, + 0x5e, 0xe9, 0xd2, 0xb9, 0xca, 0x3a, 0xf6, 0x5c, 0x1a, 0xe5, 0x4d, 0xbf, 0x56, 0x31, 0xb1, 0x95, + 0xdf, 0x50, 0x07, 0xe2, 0x24, 0x4d, 0xf4, 0x12, 0x8c, 0xb6, 0xfd, 0x5a, 0xa5, 0x4d, 0xaa, 0x9b, + 0x4e, 0x54, 0x6d, 0x94, 0xa6, 0x4c, 0x93, 0xdd, 0xa6, 0x56, 0x86, 0x0d, 0x4c, 0xd4, 0x86, 0xe1, + 0x16, 0x7f, 0x17, 0x5b, 0x7a, 0x26, 0xab, 0xbb, 0x8d, 0x78, 0x68, 0xcb, 0xf5, 0x05, 0xf1, 0x07, + 0x4b, 0x36, 0xe8, 0x1f, 0x5a, 0x30, 0x9e, 0x78, 0xd1, 0x50, 0xfa, 0x99, 0xcc, 0x54, 0x16, 0x93, + 0x70, 0xf9, 0x39, 0x36, 0x7c, 0x26, 0xf0, 0x5e, 0x37, 0x08, 0x27, 0x5b, 0xc4, 0xc7, 0x85, 0x3d, + 0x6e, 0x2f, 0x3d, 0x9b, 0xdd, 0xb8, 0x30, 0x82, 0x72, 0x5c, 0xd8, 0x1f, 0x2c, 0xd9, 0xa0, 0x6b, + 0x30, 0x2c, 0xf2, 0xeb, 0x94, 0x9e, 0x33, 0x7d, 0xbf, 0x22, 0x0d, 0x0f, 0x96, 0xe5, 0x93, 0xbf, + 0x00, 0xe7, 0xbb, 0xae, 0x6e, 0x27, 0x7a, 0x61, 0xfd, 0x9b, 0x16, 0xe8, 0x8f, 0x11, 0x33, 0xcf, + 0x7e, 0xfd, 0x12, 0x8c, 0x56, 0xf9, 0x67, 0x6b, 0xf8, 0x73, 0xc6, 0x41, 0xd3, 0xfe, 0x39, 0xa7, + 0x95, 0x61, 0x03, 0xd3, 0x5e, 0x02, 0xd4, 0x9d, 0x9a, 0xf4, 0x81, 0xf2, 0x66, 0xfc, 0xae, 0x05, + 0x63, 0x86, 0xce, 0x90, 0xb9, 0xbb, 0x70, 0x01, 0x50, 0xcb, 0x0d, 0x02, 0x3f, 0xd0, 0x3f, 0x46, + 0x22, 0x72, 0x31, 0xb2, 0x3c, 0x55, 0x6b, 0x5d, 0xa5, 0x38, 0xa5, 0x86, 0xfd, 0x4f, 0x07, 0x21, + 0x8e, 0xd4, 0x55, 0x19, 0xea, 0xac, 0x9e, 0x19, 0xea, 0x5e, 0x80, 0xc2, 0x9b, 0xa1, 0xef, 0x6d, + 0xc6, 0x79, 0xec, 0xd4, 0x5c, 0xbc, 0x5c, 0xd9, 0x58, 0x67, 0x98, 0x0a, 0x83, 0x61, 0xbf, 0xb5, + 0xe0, 0x36, 0xa3, 0xee, 0x44, 0x67, 0x2f, 0xbf, 0xc2, 0xe1, 0x58, 0x61, 0xb0, 0xef, 0x92, 0xec, + 0x11, 0x65, 0x18, 0x8f, 0xbf, 0x4b, 0xc2, 0xb3, 0x0e, 0xb3, 0x32, 0x34, 0x03, 0x45, 0x65, 0x57, + 0x17, 0x66, 0x7e, 0x35, 0x52, 0xca, 0xfe, 0x8e, 0x63, 0x1c, 0xa6, 0x10, 0x0a, 0x43, 0xac, 0x30, + 0xa1, 0x54, 0xb2, 0xb8, 0x9e, 0x24, 0x4c, 0xbb, 0x5c, 0xb6, 0x4b, 0x30, 0x56, 0x2c, 0xd3, 0x7c, + 0xa6, 0xc5, 0xd3, 0xf0, 0x99, 0xea, 0x61, 0xe3, 0xf9, 0x7e, 0xc3, 0xc6, 0xcd, 0xb5, 0x5d, 0xe8, + 0x6b, 0x6d, 0xff, 0xca, 0x00, 0x0c, 0xdf, 0x26, 0x01, 0xcb, 0xbe, 0x79, 0x0d, 0x86, 0xf7, 0xf8, + 0xcf, 0xe4, 0x23, 0x2d, 0x81, 0x81, 0x65, 0x39, 0x9d, 0xb7, 0xed, 0x8e, 0xdb, 0xac, 0xcd, 0xc7, + 0xbb, 0x58, 0xcd, 0x5b, 0x59, 0x16, 0xe0, 0x18, 0x87, 0x56, 0xa8, 0x53, 0xcd, 0xbe, 0xd5, 0x72, + 0xa3, 0x64, 0x04, 0xd1, 0xa2, 0x2c, 0xc0, 0x31, 0x0e, 0x7a, 0x0e, 0x86, 0xea, 0x6e, 0xb4, 0xe5, + 0xd4, 0x93, 0x2e, 0xc2, 0x45, 0x06, 0xc5, 0xa2, 0x94, 0xf9, 0x98, 0xdc, 0x68, 0x2b, 0x20, 0xcc, + 0xb2, 0xdb, 0xf5, 0x5a, 0x7b, 0x51, 0x2b, 0xc3, 0x06, 0x26, 0x6b, 0x92, 0x2f, 0x7a, 0x26, 0x7c, + 0x3f, 0x71, 0x93, 0x64, 0x01, 0x8e, 0x71, 0xe8, 0xfa, 0xaf, 0xfa, 0xad, 0xb6, 0xdb, 0x14, 0x11, + 0xb5, 0xda, 0xfa, 0x9f, 0x13, 0x70, 0xac, 0x30, 0x28, 0x36, 0x15, 0x61, 0x54, 0xfc, 0x24, 0xbf, + 0x01, 0xb1, 0x29, 0xe0, 0x58, 0x61, 0xd8, 0xb7, 0x61, 0x8c, 0xef, 0xe4, 0xb9, 0xa6, 0xe3, 0xb6, + 0x16, 0xe7, 0xd0, 0xcd, 0xae, 0xb0, 0xf1, 0x6b, 0x29, 0x61, 0xe3, 0x97, 0x8c, 0x4a, 0xdd, 0xe1, + 0xe3, 0xf6, 0xf7, 0x72, 0x50, 0x38, 0xc3, 0xcf, 0xe8, 0x9c, 0xf9, 0x47, 0xda, 0xd0, 0xdd, 0xc4, + 0x27, 0x74, 0x36, 0xb3, 0x7c, 0x05, 0x72, 0xec, 0xe7, 0x73, 0x7e, 0x62, 0xc1, 0x45, 0x89, 0xca, + 0x84, 0x5a, 0xd9, 0xf5, 0x58, 0x70, 0xc1, 0xe9, 0x0f, 0xf3, 0xbb, 0xc6, 0x30, 0xbf, 0x96, 0x5d, + 0x97, 0xf5, 0x7e, 0xf4, 0xfc, 0x2e, 0xde, 0x8f, 0x2d, 0x28, 0xa5, 0x55, 0x38, 0x83, 0xef, 0x07, + 0xbd, 0x63, 0x7e, 0x3f, 0xe8, 0xf6, 0xe9, 0xf4, 0xbc, 0xc7, 0x77, 0x84, 0x7e, 0xd2, 0xa3, 0xdf, + 0xec, 0xa3, 0x3d, 0x4d, 0x79, 0xdc, 0x59, 0x59, 0xb9, 0xce, 0x38, 0x8b, 0xf4, 0x73, 0xb3, 0x09, + 0x43, 0x21, 0xf3, 0xc4, 0x8b, 0x25, 0xb0, 0x94, 0xc5, 0x21, 0x48, 0xe9, 0x09, 0xd3, 0x27, 0xfb, + 0x8d, 0x05, 0x0f, 0xfb, 0x3f, 0x5b, 0x30, 0x7a, 0x86, 0x1f, 0x89, 0xf2, 0xcd, 0x49, 0x7e, 0x39, + 0xbb, 0x49, 0xee, 0x31, 0xb1, 0x87, 0x79, 0xe8, 0xfa, 0x6e, 0x0e, 0xfa, 0x82, 0xa5, 0x1c, 0xe8, + 0x3c, 0x42, 0xe9, 0x8d, 0xec, 0xda, 0x71, 0x92, 0xfc, 0x49, 0xe8, 0xeb, 0x89, 0xa4, 0x52, 0xb9, + 0xac, 0x32, 0x35, 0x74, 0xb5, 0xe6, 0x01, 0x92, 0x4b, 0x7d, 0xd5, 0x02, 0xe0, 0xed, 0x14, 0xc9, + 0x20, 0x69, 0xdb, 0xb6, 0x4f, 0x6d, 0xa4, 0x28, 0x13, 0xde, 0x34, 0x25, 0x20, 0xe3, 0x02, 0xac, + 0xb5, 0xe4, 0x21, 0xb2, 0x46, 0x3d, 0x74, 0xc2, 0xaa, 0xaf, 0x58, 0x30, 0x9e, 0x68, 0x6e, 0x4a, + 0xfd, 0x1d, 0xf3, 0x7b, 0x1a, 0x19, 0x9c, 0x5b, 0x66, 0x8a, 0x40, 0xfd, 0x96, 0xf6, 0x27, 0x1f, + 0x02, 0xe3, 0x83, 0x63, 0xe8, 0x1d, 0x28, 0xca, 0x2b, 0x96, 0x5c, 0xde, 0x59, 0x7e, 0x57, 0x48, + 0xe9, 0x51, 0x12, 0x12, 0xe2, 0x98, 0x5f, 0x22, 0xb8, 0x27, 0xd7, 0x57, 0x70, 0xcf, 0xa3, 0xfd, + 0x2a, 0x51, 0xba, 0x01, 0x6c, 0xf0, 0x54, 0x0c, 0x60, 0x4f, 0x66, 0x6e, 0x00, 0x7b, 0xea, 0x8c, + 0x0d, 0x60, 0x9a, 0x37, 0x22, 0xff, 0x10, 0xde, 0x88, 0x77, 0xe0, 0xe2, 0x5e, 0xac, 0xdd, 0xaa, + 0x95, 0x24, 0x3e, 0xae, 0x74, 0x2d, 0xd5, 0xec, 0x45, 0x35, 0xf5, 0x30, 0x22, 0x5e, 0xa4, 0xe9, + 0xc5, 0x71, 0x68, 0xd0, 0xed, 0x14, 0x72, 0x38, 0x95, 0x49, 0xd2, 0xac, 0x3c, 0xdc, 0x87, 0x59, + 0xf9, 0x5b, 0x3d, 0xbf, 0x42, 0x5f, 0x38, 0xdd, 0xaf, 0xd0, 0x3f, 0x7e, 0xe2, 0x2f, 0xd0, 0x3f, + 0x1b, 0xfb, 0xf8, 0x78, 0x40, 0x59, 0xba, 0x43, 0xee, 0xeb, 0xc9, 0xc0, 0x01, 0x60, 0x43, 0xff, + 0xe9, 0x6c, 0xd5, 0xfa, 0x0c, 0x82, 0x07, 0x46, 0x1e, 0x22, 0x78, 0x20, 0x61, 0xe3, 0x1f, 0xcd, + 0xc8, 0xc6, 0xef, 0xc1, 0x84, 0xdb, 0x72, 0xea, 0x64, 0xb3, 0xd3, 0x6c, 0xf2, 0xb8, 0x73, 0xf9, + 0xe5, 0xa7, 0x54, 0x53, 0xc1, 0xaa, 0x5f, 0x75, 0x9a, 0xc9, 0x0f, 0xec, 0xa9, 0xf8, 0xfa, 0xe5, + 0x04, 0x25, 0xdc, 0x45, 0x9b, 0x2e, 0x58, 0x96, 0x1e, 0x87, 0x44, 0x74, 0xb4, 0x99, 0x87, 0xba, + 0xc0, 0x17, 0xec, 0x52, 0x0c, 0xc6, 0x3a, 0x0e, 0x5a, 0x81, 0x62, 0xcd, 0x0b, 0xc5, 0x8b, 0xb5, + 0x71, 0x26, 0xcc, 0x3e, 0x4c, 0x45, 0xe0, 0xfc, 0x7a, 0x45, 0xbd, 0x55, 0x7b, 0x32, 0x25, 0xf3, + 0x92, 0x2a, 0xc7, 0x71, 0x7d, 0xb4, 0xc6, 0x88, 0x89, 0xe4, 0xfd, 0xdc, 0x71, 0xfc, 0x74, 0x0f, + 0xcb, 0xf4, 0xfc, 0xba, 0xfc, 0xfc, 0xc0, 0x98, 0x60, 0x27, 0xb2, 0xf0, 0xc7, 0x14, 0xb4, 0x2f, + 0x70, 0x9d, 0x3f, 0xf6, 0x0b, 0x5c, 0x2c, 0xe5, 0x5a, 0xd4, 0x54, 0x7e, 0xa8, 0xab, 0x99, 0xa5, + 0x5c, 0x8b, 0x43, 0xb2, 0x44, 0xca, 0xb5, 0x18, 0x80, 0x75, 0x96, 0x68, 0xa3, 0x97, 0x3f, 0xee, + 0x02, 0x13, 0x1a, 0x27, 0xf7, 0xae, 0xe9, 0x8e, 0x99, 0x8b, 0xc7, 0x3a, 0x66, 0xba, 0x1c, 0x49, + 0x97, 0x4e, 0xe0, 0x48, 0x6a, 0xb0, 0x64, 0x58, 0x8b, 0x73, 0xc2, 0x77, 0x97, 0xc1, 0x8d, 0x85, + 0xbd, 0x61, 0xe7, 0x21, 0x6e, 0xec, 0x27, 0xe6, 0x0c, 0x7a, 0x46, 0x6e, 0x5e, 0x79, 0xe0, 0xc8, + 0x4d, 0x2a, 0x9e, 0x63, 0x38, 0xcb, 0xaa, 0x96, 0x17, 0xe2, 0x39, 0x06, 0x63, 0x1d, 0x27, 0xe9, + 0x96, 0x79, 0xfc, 0xd4, 0xdc, 0x32, 0x93, 0x67, 0xe0, 0x96, 0x79, 0xa2, 0x6f, 0xb7, 0xcc, 0x7b, + 0x70, 0xa1, 0xed, 0xd7, 0xe6, 0xdd, 0x30, 0xe8, 0xb0, 0x87, 0x38, 0xe5, 0x4e, 0xad, 0x4e, 0x22, + 0xe6, 0xd7, 0x19, 0xb9, 0x7e, 0x5d, 0x6f, 0x64, 0x9b, 0x6d, 0xe4, 0xe9, 0xbd, 0x17, 0xb7, 0x49, + 0xc4, 0x27, 0x33, 0x59, 0x8b, 0x59, 0x04, 0x58, 0x8c, 0x5f, 0x4a, 0x21, 0x4e, 0xe3, 0xa3, 0x7b, + 0x85, 0x9e, 0x3e, 0x1b, 0xaf, 0xd0, 0x27, 0xa1, 0x10, 0x36, 0x3a, 0x51, 0xcd, 0xdf, 0xf7, 0x98, + 0xeb, 0xaf, 0xa8, 0xbe, 0xc1, 0x5b, 0xa8, 0x08, 0xf8, 0xbd, 0xc3, 0xa9, 0x09, 0xf9, 0x5b, 0xb3, + 0x99, 0x09, 0x08, 0xfa, 0xed, 0x1e, 0x4f, 0x0d, 0xec, 0xd3, 0x7c, 0x6a, 0x70, 0xe5, 0x44, 0xcf, + 0x0c, 0xd2, 0x5c, 0x5f, 0xcf, 0x7c, 0xe0, 0x5c, 0x5f, 0xbf, 0x65, 0xc1, 0xd8, 0x9e, 0x6e, 0xa0, + 0x14, 0xee, 0xb9, 0x0c, 0xc2, 0x04, 0x0c, 0xbb, 0x67, 0xd9, 0xa6, 0xc2, 0xce, 0x00, 0xdd, 0x4b, + 0x02, 0xb0, 0xd9, 0x92, 0x94, 0x10, 0x86, 0x67, 0x1f, 0x55, 0x08, 0xc3, 0x7b, 0x4c, 0x98, 0xc9, + 0x9b, 0x2e, 0xf3, 0xd9, 0x65, 0x1b, 0xc1, 0x28, 0x05, 0xa3, 0x0a, 0x60, 0xd4, 0xf9, 0xa1, 0x2f, + 0x5b, 0x30, 0x21, 0x2f, 0x67, 0xc2, 0xc1, 0x10, 0x8a, 0x18, 0xac, 0x2c, 0xef, 0x84, 0x2c, 0x88, + 0x77, 0x2b, 0xc1, 0x07, 0x77, 0x71, 0xa6, 0xa2, 0x5d, 0x85, 0xbc, 0xd4, 0x43, 0x16, 0x6a, 0x28, + 0x14, 0x99, 0xd9, 0x18, 0x8c, 0x75, 0x1c, 0xf4, 0x0d, 0xf5, 0x6d, 0xcd, 0x6b, 0x4c, 0xaa, 0xbf, + 0x9a, 0xb1, 0x82, 0x9a, 0xc5, 0x07, 0x36, 0xd1, 0xaf, 0x5b, 0x30, 0xb1, 0x9f, 0xb0, 0x6a, 0x88, + 0x20, 0x34, 0x9c, 0xbd, 0xbd, 0xa4, 0xc7, 0xc7, 0xa0, 0xbb, 0x5a, 0xf0, 0xd0, 0x1e, 0xe0, 0x0f, + 0xd4, 0x87, 0x43, 0xff, 0x18, 0xc1, 0xb9, 0xc4, 0x97, 0xad, 0x3f, 0x62, 0x26, 0x62, 0xbe, 0x9a, + 0xcc, 0x69, 0x3b, 0x26, 0xf1, 0x8d, 0xbc, 0xb6, 0x46, 0xe2, 0xd9, 0xdc, 0xa9, 0x26, 0x9e, 0x1d, + 0x38, 0x9b, 0xc4, 0xb3, 0x13, 0xa7, 0x91, 0x78, 0xf6, 0xfc, 0x89, 0x12, 0xcf, 0x6a, 0x89, 0x7f, + 0x07, 0xef, 0x93, 0xf8, 0x77, 0x16, 0xc6, 0x65, 0x74, 0x3f, 0x11, 0x19, 0x45, 0xb9, 0x63, 0xef, + 0x8a, 0xa8, 0x32, 0x3e, 0x67, 0x16, 0xe3, 0x24, 0x3e, 0x7a, 0xdf, 0x82, 0xbc, 0xc7, 0x6a, 0x0e, + 0x65, 0x95, 0x85, 0xdf, 0x5c, 0x5a, 0xec, 0xde, 0x2a, 0xc4, 0x82, 0x8c, 0x67, 0xcc, 0x33, 0xd8, + 0x3d, 0xf9, 0x03, 0xf3, 0x16, 0xa0, 0xd7, 0xa1, 0xe4, 0xef, 0xec, 0x34, 0x7d, 0xa7, 0x16, 0x67, + 0xc7, 0x95, 0x9e, 0x47, 0xfe, 0x3a, 0x4b, 0x65, 0x07, 0xdc, 0xe8, 0x81, 0x87, 0x7b, 0x52, 0x40, + 0xdf, 0xa2, 0xca, 0x40, 0xe4, 0x07, 0xa4, 0x16, 0x1b, 0x49, 0x8a, 0xac, 0xcf, 0x24, 0xf3, 0x3e, + 0x57, 0x4c, 0x3e, 0xbc, 0xf7, 0x6a, 0x52, 0x12, 0xa5, 0x38, 0xd9, 0x2c, 0x14, 0xc0, 0xe5, 0x76, + 0x9a, 0x8d, 0x26, 0x14, 0x6f, 0x12, 0x8e, 0xb3, 0x14, 0xc9, 0xad, 0x7b, 0x39, 0xd5, 0xca, 0x13, + 0xe2, 0x1e, 0x94, 0xf5, 0xbc, 0xb9, 0x85, 0xb3, 0xc9, 0x9b, 0x6b, 0x7e, 0x8f, 0x7e, 0xec, 0xcc, + 0xbf, 0x47, 0x8f, 0xfe, 0x5f, 0x6a, 0x8a, 0x67, 0x6e, 0xda, 0xa8, 0x67, 0xbe, 0x26, 0x3e, 0x70, + 0x69, 0x9e, 0xff, 0x91, 0x05, 0x93, 0x7c, 0xe5, 0x25, 0x15, 0x6a, 0x7a, 0x9c, 0x8b, 0xe8, 0xfd, + 0xac, 0x9d, 0xd3, 0x2c, 0x4e, 0xa7, 0x62, 0x70, 0x65, 0x3e, 0xd3, 0x63, 0x5a, 0x82, 0xbe, 0x9a, + 0xa2, 0xc6, 0x8f, 0x67, 0x65, 0x2c, 0x4c, 0x4f, 0x0f, 0x7c, 0xe1, 0xa8, 0x1f, 0xcd, 0xfd, 0x9f, + 0xf4, 0xb4, 0x65, 0x22, 0xd6, 0xbc, 0xbf, 0x76, 0x4a, 0xb6, 0x4c, 0x3d, 0x87, 0xf1, 0x49, 0x2c, + 0x9a, 0x93, 0x5f, 0xb0, 0xf8, 0x67, 0x06, 0x7a, 0x6a, 0x21, 0xdb, 0xa6, 0x16, 0xb2, 0x9a, 0x65, + 0xa2, 0x73, 0x5d, 0x1d, 0xfa, 0x35, 0x0b, 0x2e, 0xa6, 0x09, 0xc9, 0x94, 0x26, 0x7d, 0xda, 0x6c, + 0x52, 0x86, 0xca, 0xb6, 0xde, 0xa0, 0x6c, 0xb2, 0x3b, 0xff, 0xb8, 0xa8, 0x79, 0x90, 0x22, 0xd2, + 0xce, 0x3c, 0xd0, 0xcf, 0x83, 0x21, 0xd7, 0x6b, 0xba, 0x1e, 0x11, 0x8f, 0x7a, 0xb2, 0xbc, 0x7a, + 0x88, 0x6c, 0xea, 0x94, 0x3a, 0x16, 0x5c, 0x1e, 0xb1, 0x43, 0x29, 0xf9, 0xa5, 0x88, 0xc1, 0xb3, + 0xff, 0x52, 0xc4, 0x3e, 0x14, 0xf7, 0xdd, 0xa8, 0xc1, 0x1c, 0xe1, 0xc2, 0x4f, 0x93, 0xc1, 0x63, + 0x18, 0x4a, 0x2e, 0xee, 0xfb, 0x1d, 0xc9, 0x00, 0xc7, 0xbc, 0xd0, 0x0c, 0x67, 0xcc, 0xc2, 0xfb, + 0x92, 0x71, 0x57, 0x77, 0x64, 0x01, 0x8e, 0x71, 0xe8, 0x60, 0x8d, 0xd2, 0x7f, 0x32, 0x63, 0x86, + 0x48, 0x67, 0x98, 0x45, 0xb6, 0x2c, 0x41, 0x91, 0x3f, 0x39, 0xbb, 0xa3, 0xf1, 0xc0, 0x06, 0x47, + 0x95, 0x51, 0xb2, 0xd0, 0x33, 0xa3, 0xe4, 0xbb, 0xec, 0xcc, 0x8f, 0x5c, 0xaf, 0x43, 0x36, 0x3c, + 0x11, 0x14, 0xb8, 0x9a, 0xcd, 0x03, 0x39, 0x4e, 0x93, 0xe7, 0x32, 0x88, 0xff, 0x63, 0x8d, 0x9f, + 0x66, 0x2e, 0x1f, 0x39, 0xd6, 0x5c, 0x1e, 0xdf, 0x94, 0x47, 0x33, 0xbf, 0x29, 0x47, 0xa4, 0x9d, + 0xc9, 0x4d, 0xf9, 0x03, 0x75, 0xa3, 0xfc, 0x3f, 0x16, 0x20, 0x75, 0x74, 0x3b, 0xe1, 0xae, 0xf8, + 0xbc, 0xcf, 0xe9, 0x87, 0x78, 0x7d, 0xce, 0x02, 0xf0, 0xd4, 0xf7, 0x84, 0xb2, 0x3d, 0xb5, 0x38, + 0xcd, 0xb8, 0x01, 0x31, 0x0c, 0x6b, 0x3c, 0xed, 0xff, 0x69, 0xc1, 0xe5, 0xee, 0xbe, 0x9f, 0x41, + 0x00, 0xd0, 0x81, 0x19, 0x00, 0xb4, 0x95, 0xa1, 0xc5, 0x55, 0x75, 0xa3, 0x47, 0x28, 0xd0, 0x8f, + 0x72, 0x30, 0xae, 0x23, 0x57, 0xc8, 0x59, 0x4c, 0xf6, 0xbe, 0x11, 0xcf, 0x77, 0x2b, 0xdb, 0xfe, + 0x56, 0x84, 0xe1, 0x3e, 0x2d, 0x7a, 0xf2, 0xb3, 0x89, 0xe8, 0xc9, 0x3b, 0xd9, 0xb3, 0x3e, 0x3e, + 0x88, 0xf2, 0xbf, 0x5b, 0x70, 0x21, 0x51, 0xe3, 0x0c, 0x16, 0xd8, 0x9e, 0xb9, 0xc0, 0x5e, 0xc9, + 0xbc, 0xd7, 0x3d, 0x56, 0xd7, 0xef, 0xe4, 0xba, 0x7a, 0xcb, 0xee, 0x01, 0xbf, 0x62, 0x41, 0x3e, + 0x72, 0xc2, 0x5d, 0x19, 0x8b, 0xf3, 0xe9, 0x53, 0x59, 0x01, 0xd3, 0xf4, 0xb7, 0x90, 0xce, 0xaa, + 0x7d, 0x0c, 0x86, 0x39, 0xf7, 0xc9, 0x5f, 0xb6, 0x00, 0x62, 0xa4, 0x47, 0xa5, 0xb2, 0xda, 0xbf, + 0x97, 0x83, 0x4b, 0xa9, 0xcb, 0x08, 0x7d, 0x51, 0x19, 0x75, 0xac, 0xac, 0x23, 0xcd, 0x0c, 0x46, + 0xba, 0x6d, 0x67, 0xcc, 0xb0, 0xed, 0x08, 0x93, 0xce, 0xa3, 0xba, 0x70, 0x08, 0x31, 0xad, 0x0d, + 0xd6, 0x0f, 0xad, 0x38, 0x78, 0x51, 0x25, 0xbf, 0xf8, 0x33, 0x18, 0xe9, 0x6d, 0xff, 0x48, 0x8b, + 0xb7, 0x96, 0x1d, 0x3d, 0x03, 0x59, 0xb1, 0x6f, 0xca, 0x0a, 0x9c, 0xbd, 0xfb, 0xaf, 0x87, 0xb0, + 0x78, 0x0b, 0xd2, 0xfc, 0x81, 0xfd, 0xa5, 0xdd, 0x32, 0xde, 0x4c, 0xe5, 0xfa, 0x7e, 0x33, 0x35, + 0x06, 0x23, 0xaf, 0xb9, 0x6d, 0xe5, 0xba, 0x9a, 0xfe, 0xce, 0x0f, 0xae, 0x3e, 0xf6, 0x87, 0x3f, + 0xb8, 0xfa, 0xd8, 0xf7, 0x7e, 0x70, 0xf5, 0xb1, 0xcf, 0x1d, 0x5d, 0xb5, 0xbe, 0x73, 0x74, 0xd5, + 0xfa, 0xc3, 0xa3, 0xab, 0xd6, 0xf7, 0x8e, 0xae, 0x5a, 0xff, 0xe5, 0xe8, 0xaa, 0xf5, 0xb7, 0xfe, + 0xeb, 0xd5, 0xc7, 0x5e, 0x2b, 0xc8, 0x8e, 0xfd, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb0, 0x4a, + 0xcf, 0x37, 0x4c, 0xb2, 0x00, 0x00, } func (m *Amount) Marshal() (dAtA []byte, err error) { @@ -7349,6 +7411,11 @@ func (m *NodeResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + i -= len(m.Progress) + copy(dAtA[i:], m.Progress) + i = encodeVarintGenerated(dAtA, i, uint64(len(m.Progress))) + i-- + dAtA[i] = 0x22 if m.Outputs != nil { { size, err := m.Outputs.MarshalToSizedBuffer(dAtA[:i]) @@ -11287,6 +11354,96 @@ func (m *WorkflowStep) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *WorkflowTaskResult) 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 *WorkflowTaskResult) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTaskResult) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.NodeResult.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + { + size, err := m.ObjectMeta.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 *WorkflowTaskResultList) 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 *WorkflowTaskResultList) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTaskResultList) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Items) > 0 { + for iNdEx := len(m.Items) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Items[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGenerated(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + { + size, err := m.ListMeta.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 *WorkflowTaskSet) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -12802,6 +12959,8 @@ func (m *NodeResult) Size() (n int) { l = m.Outputs.Size() n += 1 + l + sovGenerated(uint64(l)) } + l = len(m.Progress) + n += 1 + l + sovGenerated(uint64(l)) return n } @@ -14190,6 +14349,36 @@ func (m *WorkflowStep) Size() (n int) { return n } +func (m *WorkflowTaskResult) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ObjectMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + l = m.NodeResult.Size() + n += 1 + l + sovGenerated(uint64(l)) + return n +} + +func (m *WorkflowTaskResultList) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.ListMeta.Size() + n += 1 + l + sovGenerated(uint64(l)) + if len(m.Items) > 0 { + for _, e := range m.Items { + l = e.Size() + n += 1 + l + sovGenerated(uint64(l)) + } + } + return n +} + func (m *WorkflowTaskSet) Size() (n int) { if m == nil { return 0 @@ -15165,6 +15354,7 @@ func (this *NodeResult) String() string { `Phase:` + fmt.Sprintf("%v", this.Phase) + `,`, `Message:` + fmt.Sprintf("%v", this.Message) + `,`, `Outputs:` + strings.Replace(this.Outputs.String(), "Outputs", "Outputs", 1) + `,`, + `Progress:` + fmt.Sprintf("%v", this.Progress) + `,`, `}`, }, "") return s @@ -16138,6 +16328,33 @@ func (this *WorkflowStep) String() string { }, "") return s } +func (this *WorkflowTaskResult) String() string { + if this == nil { + return "nil" + } + s := strings.Join([]string{`&WorkflowTaskResult{`, + `ObjectMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ObjectMeta), "ObjectMeta", "v11.ObjectMeta", 1), `&`, ``, 1) + `,`, + `NodeResult:` + strings.Replace(strings.Replace(this.NodeResult.String(), "NodeResult", "NodeResult", 1), `&`, ``, 1) + `,`, + `}`, + }, "") + return s +} +func (this *WorkflowTaskResultList) String() string { + if this == nil { + return "nil" + } + repeatedStringForItems := "[]WorkflowTaskResult{" + for _, f := range this.Items { + repeatedStringForItems += strings.Replace(strings.Replace(f.String(), "WorkflowTaskResult", "WorkflowTaskResult", 1), `&`, ``, 1) + "," + } + repeatedStringForItems += "}" + s := strings.Join([]string{`&WorkflowTaskResultList{`, + `ListMeta:` + strings.Replace(strings.Replace(fmt.Sprintf("%v", this.ListMeta), "ListMeta", "v11.ListMeta", 1), `&`, ``, 1) + `,`, + `Items:` + repeatedStringForItems + `,`, + `}`, + }, "") + return s +} func (this *WorkflowTaskSet) String() string { if this == nil { return "nil" @@ -25673,6 +25890,38 @@ func (m *NodeResult) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Progress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenerated + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenerated + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenerated + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Progress = Progress(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenerated(dAtA[iNdEx:]) @@ -38162,6 +38411,239 @@ func (m *WorkflowStep) Unmarshal(dAtA []byte) error { } return nil } +func (m *WorkflowTaskResult) 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: WorkflowTaskResult: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WorkflowTaskResult: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ObjectMeta", 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.ObjectMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NodeResult", 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.NodeResult.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 *WorkflowTaskResultList) 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: WorkflowTaskResultList: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: WorkflowTaskResultList: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ListMeta", 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.ListMeta.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Items", 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 + } + m.Items = append(m.Items, WorkflowTaskResult{}) + if err := m.Items[len(m.Items)-1].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 *WorkflowTaskSet) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/pkg/apis/workflow/v1alpha1/generated.proto b/pkg/apis/workflow/v1alpha1/generated.proto index cca2ba1b7a32..53a098d884b8 100644 --- a/pkg/apis/workflow/v1alpha1/generated.proto +++ b/pkg/apis/workflow/v1alpha1/generated.proto @@ -782,6 +782,8 @@ message NodeResult { optional string message = 2; optional Outputs outputs = 3; + + optional string progress = 4; } // NodeStatus contains status information about an individual node in the workflow @@ -1871,6 +1873,24 @@ message WorkflowStep { map hooks = 12; } +// WorkflowTaskResult is a used to communicate a result back to the controller. Unlike WorkflowTaskSet, it has +// more capacity. This is an internal type. Users should never create this resource directly, much like you would +// never create a ReplicaSet directly. +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +message WorkflowTaskResult { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ObjectMeta metadata = 1; + + optional NodeResult nodeResult = 2; +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +message WorkflowTaskResultList { + optional k8s.io.apimachinery.pkg.apis.meta.v1.ListMeta metadata = 1; + + repeated WorkflowTaskResult items = 2; +} + // +genclient // +kubebuilder:resource:shortName=wfts // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object diff --git a/pkg/apis/workflow/v1alpha1/openapi_generated.go b/pkg/apis/workflow/v1alpha1/openapi_generated.go index 5c83d0c13cd3..7893fd43c2d4 100644 --- a/pkg/apis/workflow/v1alpha1/openapi_generated.go +++ b/pkg/apis/workflow/v1alpha1/openapi_generated.go @@ -130,6 +130,8 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowSpec": schema_pkg_apis_workflow_v1alpha1_WorkflowSpec(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowStatus": schema_pkg_apis_workflow_v1alpha1_WorkflowStatus(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowStep": schema_pkg_apis_workflow_v1alpha1_WorkflowStep(ref), + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskResult": schema_pkg_apis_workflow_v1alpha1_WorkflowTaskResult(ref), + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskResultList": schema_pkg_apis_workflow_v1alpha1_WorkflowTaskResultList(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskSet": schema_pkg_apis_workflow_v1alpha1_WorkflowTaskSet(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskSetList": schema_pkg_apis_workflow_v1alpha1_WorkflowTaskSetList(ref), "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskSetSpec": schema_pkg_apis_workflow_v1alpha1_WorkflowTaskSetSpec(ref), @@ -3187,6 +3189,12 @@ func schema_pkg_apis_workflow_v1alpha1_NodeResult(ref common.ReferenceCallback) Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Outputs"), }, }, + "progress": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, }, }, }, @@ -6847,6 +6855,113 @@ func schema_pkg_apis_workflow_v1alpha1_WorkflowStep(ref common.ReferenceCallback } } +func schema_pkg_apis_workflow_v1alpha1_WorkflowTaskResult(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Description: "WorkflowTaskResult is a used to communicate a result back to the controller. Unlike WorkflowTaskSet, it has more capacity. This is an internal type. Users should never create this resource directly, much like you would never create a ReplicaSet directly.", + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"), + }, + }, + "phase": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "message": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + "outputs": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Outputs"), + }, + }, + "progress": { + SchemaProps: spec.SchemaProps{ + Type: []string{"string"}, + Format: "", + }, + }, + }, + Required: []string{"metadata"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.Outputs", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"}, + } +} + +func schema_pkg_apis_workflow_v1alpha1_WorkflowTaskResultList(ref common.ReferenceCallback) common.OpenAPIDefinition { + return common.OpenAPIDefinition{ + Schema: spec.Schema{ + SchemaProps: spec.SchemaProps{ + Type: []string{"object"}, + Properties: map[string]spec.Schema{ + "kind": { + SchemaProps: spec.SchemaProps{ + Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds", + Type: []string{"string"}, + Format: "", + }, + }, + "apiVersion": { + SchemaProps: spec.SchemaProps{ + Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources", + Type: []string{"string"}, + Format: "", + }, + }, + "metadata": { + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"), + }, + }, + "items": { + SchemaProps: spec.SchemaProps{ + Type: []string{"array"}, + Items: &spec.SchemaOrArray{ + Schema: &spec.Schema{ + SchemaProps: spec.SchemaProps{ + Default: map[string]interface{}{}, + Ref: ref("github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskResult"), + }, + }, + }, + }, + }, + }, + Required: []string{"metadata", "items"}, + }, + }, + Dependencies: []string{ + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1.WorkflowTaskResult", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"}, + } +} + func schema_pkg_apis_workflow_v1alpha1_WorkflowTaskSet(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ diff --git a/pkg/apis/workflow/v1alpha1/register.go b/pkg/apis/workflow/v1alpha1/register.go index bdf2984cbc67..371cfb101da2 100644 --- a/pkg/apis/workflow/v1alpha1/register.go +++ b/pkg/apis/workflow/v1alpha1/register.go @@ -44,6 +44,8 @@ func addKnownTypes(scheme *runtime.Scheme) error { &ClusterWorkflowTemplateList{}, &WorkflowTaskSet{}, &WorkflowTaskSetList{}, + &WorkflowTaskResult{}, + &WorkflowTaskResultList{}, ) metav1.AddToGroupVersion(scheme, SchemeGroupVersion) return nil diff --git a/pkg/apis/workflow/v1alpha1/task_result_types.go b/pkg/apis/workflow/v1alpha1/task_result_types.go new file mode 100644 index 000000000000..6f19052a4f01 --- /dev/null +++ b/pkg/apis/workflow/v1alpha1/task_result_types.go @@ -0,0 +1,23 @@ +package v1alpha1 + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// WorkflowTaskResult is a used to communicate a result back to the controller. Unlike WorkflowTaskSet, it has +// more capacity. This is an internal type. Users should never create this resource directly, much like you would +// never create a ReplicaSet directly. +// +genclient +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type WorkflowTaskResult struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` + NodeResult `json:",inline" protobuf:"bytes,2,opt,name=nodeResult"` +} + +// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object +type WorkflowTaskResultList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata" protobuf:"bytes,1,opt,name=metadata"` + Items []WorkflowTaskResult `json:"items" protobuf:"bytes,2,rep,name=items"` +} diff --git a/pkg/apis/workflow/v1alpha1/task_set_types.go b/pkg/apis/workflow/v1alpha1/task_set_types.go index acb163d7bdcf..b756aea70ac3 100644 --- a/pkg/apis/workflow/v1alpha1/task_set_types.go +++ b/pkg/apis/workflow/v1alpha1/task_set_types.go @@ -31,9 +31,10 @@ type WorkflowTaskSetList struct { } type NodeResult struct { - Phase NodePhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=NodePhase"` - Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` - Outputs *Outputs `json:"outputs,omitempty" protobuf:"bytes,3,opt,name=outputs"` + Phase NodePhase `json:"phase,omitempty" protobuf:"bytes,1,opt,name=phase,casttype=NodePhase"` + Message string `json:"message,omitempty" protobuf:"bytes,2,opt,name=message"` + Outputs *Outputs `json:"outputs,omitempty" protobuf:"bytes,3,opt,name=outputs"` + Progress Progress `json:"progress,omitempty" protobuf:"bytes,4,opt,name=progress,casttype=Progress"` } func (in NodeResult) Fulfilled() bool { diff --git a/pkg/apis/workflow/v1alpha1/workflow_types.go b/pkg/apis/workflow/v1alpha1/workflow_types.go index 4fdaa6b37781..54c66b3a0ce7 100644 --- a/pkg/apis/workflow/v1alpha1/workflow_types.go +++ b/pkg/apis/workflow/v1alpha1/workflow_types.go @@ -2551,6 +2551,10 @@ func (t *Template) GetRetryStrategy() (wait.Backoff, error) { return t.ContainerSet.GetRetryStrategy() } +func (t *Template) HasOutputs() bool { + return t != nil && t.Outputs.HasOutputs() +} + // DAGTemplate is a template subtype for directed acyclic graph templates type DAGTemplate struct { // Target are one or more names of targets to execute in a DAG @@ -2690,6 +2694,9 @@ func (in *Inputs) HasInputs() bool { // HasOutputs returns whether or not there are any outputs func (out *Outputs) HasOutputs() bool { + if out == nil { + return false + } if out.Result != nil { return true } @@ -2712,6 +2719,32 @@ func (out *Outputs) GetArtifactByName(name string) *Artifact { return out.Artifacts.GetArtifactByName(name) } +func (out *Outputs) HasResult() bool { + return out != nil && out.Result != nil +} + +func (out *Outputs) HasArtifacts() bool { + return out != nil && len(out.Artifacts) > 0 +} + +func (out *Outputs) HasParameters() bool { + return out != nil && len(out.Parameters) > 0 +} + +const MainLogsArtifactName = "main-logs" + +func (out *Outputs) HasLogs() bool { + if out == nil { + return false + } + for _, a := range out.Artifacts { + if a.Name == MainLogsArtifactName { + return true + } + } + return false +} + // GetArtifactByName retrieves an artifact by its name func (args *Arguments) GetArtifactByName(name string) *Artifact { return args.Artifacts.GetArtifactByName(name) diff --git a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go index bddb14cbe670..0609523dd4dc 100644 --- a/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go +++ b/pkg/apis/workflow/v1alpha1/zz_generated.deepcopy.go @@ -3393,6 +3393,66 @@ func (in *WorkflowStep) DeepCopy() *WorkflowStep { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WorkflowTaskResult) DeepCopyInto(out *WorkflowTaskResult) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.NodeResult.DeepCopyInto(&out.NodeResult) + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowTaskResult. +func (in *WorkflowTaskResult) DeepCopy() *WorkflowTaskResult { + if in == nil { + return nil + } + out := new(WorkflowTaskResult) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *WorkflowTaskResult) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *WorkflowTaskResultList) DeepCopyInto(out *WorkflowTaskResultList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]WorkflowTaskResult, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + return +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new WorkflowTaskResultList. +func (in *WorkflowTaskResultList) DeepCopy() *WorkflowTaskResultList { + if in == nil { + return nil + } + out := new(WorkflowTaskResultList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *WorkflowTaskResultList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *WorkflowTaskSet) DeepCopyInto(out *WorkflowTaskSet) { *out = *in diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go index 1531ccf1cd15..00122b2659db 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflow_client.go @@ -28,6 +28,10 @@ func (c *FakeArgoprojV1alpha1) WorkflowEventBindings(namespace string) v1alpha1. return &FakeWorkflowEventBindings{c, namespace} } +func (c *FakeArgoprojV1alpha1) WorkflowTaskResults(namespace string) v1alpha1.WorkflowTaskResultInterface { + return &FakeWorkflowTaskResults{c, namespace} +} + func (c *FakeArgoprojV1alpha1) WorkflowTaskSets(namespace string) v1alpha1.WorkflowTaskSetInterface { return &FakeWorkflowTaskSets{c, namespace} } diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflowtaskresult.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflowtaskresult.go new file mode 100644 index 000000000000..b5e10342a929 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/fake/fake_workflowtaskresult.go @@ -0,0 +1,114 @@ +// Code generated by client-gen. DO NOT EDIT. + +package fake + +import ( + "context" + + v1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + labels "k8s.io/apimachinery/pkg/labels" + schema "k8s.io/apimachinery/pkg/runtime/schema" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + testing "k8s.io/client-go/testing" +) + +// FakeWorkflowTaskResults implements WorkflowTaskResultInterface +type FakeWorkflowTaskResults struct { + Fake *FakeArgoprojV1alpha1 + ns string +} + +var workflowtaskresultsResource = schema.GroupVersionResource{Group: "argoproj.io", Version: "v1alpha1", Resource: "workflowtaskresults"} + +var workflowtaskresultsKind = schema.GroupVersionKind{Group: "argoproj.io", Version: "v1alpha1", Kind: "WorkflowTaskResult"} + +// Get takes name of the workflowTaskResult, and returns the corresponding workflowTaskResult object, and an error if there is any. +func (c *FakeWorkflowTaskResults) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + obj, err := c.Fake. + Invokes(testing.NewGetAction(workflowtaskresultsResource, c.ns, name), &v1alpha1.WorkflowTaskResult{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.WorkflowTaskResult), err +} + +// List takes label and field selectors, and returns the list of WorkflowTaskResults that match those selectors. +func (c *FakeWorkflowTaskResults) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.WorkflowTaskResultList, err error) { + obj, err := c.Fake. + Invokes(testing.NewListAction(workflowtaskresultsResource, workflowtaskresultsKind, c.ns, opts), &v1alpha1.WorkflowTaskResultList{}) + + if obj == nil { + return nil, err + } + + label, _, _ := testing.ExtractFromListOptions(opts) + if label == nil { + label = labels.Everything() + } + list := &v1alpha1.WorkflowTaskResultList{ListMeta: obj.(*v1alpha1.WorkflowTaskResultList).ListMeta} + for _, item := range obj.(*v1alpha1.WorkflowTaskResultList).Items { + if label.Matches(labels.Set(item.Labels)) { + list.Items = append(list.Items, item) + } + } + return list, err +} + +// Watch returns a watch.Interface that watches the requested workflowTaskResults. +func (c *FakeWorkflowTaskResults) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + return c.Fake. + InvokesWatch(testing.NewWatchAction(workflowtaskresultsResource, c.ns, opts)) + +} + +// Create takes the representation of a workflowTaskResult and creates it. Returns the server's representation of the workflowTaskResult, and an error, if there is any. +func (c *FakeWorkflowTaskResults) Create(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.CreateOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + obj, err := c.Fake. + Invokes(testing.NewCreateAction(workflowtaskresultsResource, c.ns, workflowTaskResult), &v1alpha1.WorkflowTaskResult{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.WorkflowTaskResult), err +} + +// Update takes the representation of a workflowTaskResult and updates it. Returns the server's representation of the workflowTaskResult, and an error, if there is any. +func (c *FakeWorkflowTaskResults) Update(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.UpdateOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + obj, err := c.Fake. + Invokes(testing.NewUpdateAction(workflowtaskresultsResource, c.ns, workflowTaskResult), &v1alpha1.WorkflowTaskResult{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.WorkflowTaskResult), err +} + +// Delete takes name of the workflowTaskResult and deletes it. Returns an error if one occurs. +func (c *FakeWorkflowTaskResults) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + _, err := c.Fake. + Invokes(testing.NewDeleteAction(workflowtaskresultsResource, c.ns, name), &v1alpha1.WorkflowTaskResult{}) + + return err +} + +// DeleteCollection deletes a collection of objects. +func (c *FakeWorkflowTaskResults) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + action := testing.NewDeleteCollectionAction(workflowtaskresultsResource, c.ns, listOpts) + + _, err := c.Fake.Invokes(action, &v1alpha1.WorkflowTaskResultList{}) + return err +} + +// Patch applies the patch and returns the patched workflowTaskResult. +func (c *FakeWorkflowTaskResults) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.WorkflowTaskResult, err error) { + obj, err := c.Fake. + Invokes(testing.NewPatchSubresourceAction(workflowtaskresultsResource, c.ns, name, pt, data, subresources...), &v1alpha1.WorkflowTaskResult{}) + + if obj == nil { + return nil, err + } + return obj.(*v1alpha1.WorkflowTaskResult), err +} diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go index 148b99e1addd..83010c69fc66 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/generated_expansion.go @@ -10,6 +10,8 @@ type WorkflowExpansion interface{} type WorkflowEventBindingExpansion interface{} +type WorkflowTaskResultExpansion interface{} + type WorkflowTaskSetExpansion interface{} type WorkflowTemplateExpansion interface{} diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go index 2c5b3c26a003..0c06e2ba7d8f 100644 --- a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflow_client.go @@ -14,6 +14,7 @@ type ArgoprojV1alpha1Interface interface { CronWorkflowsGetter WorkflowsGetter WorkflowEventBindingsGetter + WorkflowTaskResultsGetter WorkflowTaskSetsGetter WorkflowTemplatesGetter } @@ -39,6 +40,10 @@ func (c *ArgoprojV1alpha1Client) WorkflowEventBindings(namespace string) Workflo return newWorkflowEventBindings(c, namespace) } +func (c *ArgoprojV1alpha1Client) WorkflowTaskResults(namespace string) WorkflowTaskResultInterface { + return newWorkflowTaskResults(c, namespace) +} + func (c *ArgoprojV1alpha1Client) WorkflowTaskSets(namespace string) WorkflowTaskSetInterface { return newWorkflowTaskSets(c, namespace) } diff --git a/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflowtaskresult.go b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflowtaskresult.go new file mode 100644 index 000000000000..a833fa6f3606 --- /dev/null +++ b/pkg/client/clientset/versioned/typed/workflow/v1alpha1/workflowtaskresult.go @@ -0,0 +1,162 @@ +// Code generated by client-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + "time" + + v1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + scheme "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/scheme" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + types "k8s.io/apimachinery/pkg/types" + watch "k8s.io/apimachinery/pkg/watch" + rest "k8s.io/client-go/rest" +) + +// WorkflowTaskResultsGetter has a method to return a WorkflowTaskResultInterface. +// A group's client should implement this interface. +type WorkflowTaskResultsGetter interface { + WorkflowTaskResults(namespace string) WorkflowTaskResultInterface +} + +// WorkflowTaskResultInterface has methods to work with WorkflowTaskResult resources. +type WorkflowTaskResultInterface interface { + Create(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.CreateOptions) (*v1alpha1.WorkflowTaskResult, error) + Update(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.UpdateOptions) (*v1alpha1.WorkflowTaskResult, error) + Delete(ctx context.Context, name string, opts v1.DeleteOptions) error + DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error + Get(ctx context.Context, name string, opts v1.GetOptions) (*v1alpha1.WorkflowTaskResult, error) + List(ctx context.Context, opts v1.ListOptions) (*v1alpha1.WorkflowTaskResultList, error) + Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) + Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.WorkflowTaskResult, err error) + WorkflowTaskResultExpansion +} + +// workflowTaskResults implements WorkflowTaskResultInterface +type workflowTaskResults struct { + client rest.Interface + ns string +} + +// newWorkflowTaskResults returns a WorkflowTaskResults +func newWorkflowTaskResults(c *ArgoprojV1alpha1Client, namespace string) *workflowTaskResults { + return &workflowTaskResults{ + client: c.RESTClient(), + ns: namespace, + } +} + +// Get takes name of the workflowTaskResult, and returns the corresponding workflowTaskResult object, and an error if there is any. +func (c *workflowTaskResults) Get(ctx context.Context, name string, options v1.GetOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + result = &v1alpha1.WorkflowTaskResult{} + err = c.client.Get(). + Namespace(c.ns). + Resource("workflowtaskresults"). + Name(name). + VersionedParams(&options, scheme.ParameterCodec). + Do(ctx). + Into(result) + return +} + +// List takes label and field selectors, and returns the list of WorkflowTaskResults that match those selectors. +func (c *workflowTaskResults) List(ctx context.Context, opts v1.ListOptions) (result *v1alpha1.WorkflowTaskResultList, err error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + result = &v1alpha1.WorkflowTaskResultList{} + err = c.client.Get(). + Namespace(c.ns). + Resource("workflowtaskresults"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Do(ctx). + Into(result) + return +} + +// Watch returns a watch.Interface that watches the requested workflowTaskResults. +func (c *workflowTaskResults) Watch(ctx context.Context, opts v1.ListOptions) (watch.Interface, error) { + var timeout time.Duration + if opts.TimeoutSeconds != nil { + timeout = time.Duration(*opts.TimeoutSeconds) * time.Second + } + opts.Watch = true + return c.client.Get(). + Namespace(c.ns). + Resource("workflowtaskresults"). + VersionedParams(&opts, scheme.ParameterCodec). + Timeout(timeout). + Watch(ctx) +} + +// Create takes the representation of a workflowTaskResult and creates it. Returns the server's representation of the workflowTaskResult, and an error, if there is any. +func (c *workflowTaskResults) Create(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.CreateOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + result = &v1alpha1.WorkflowTaskResult{} + err = c.client.Post(). + Namespace(c.ns). + Resource("workflowtaskresults"). + VersionedParams(&opts, scheme.ParameterCodec). + Body(workflowTaskResult). + Do(ctx). + Into(result) + return +} + +// Update takes the representation of a workflowTaskResult and updates it. Returns the server's representation of the workflowTaskResult, and an error, if there is any. +func (c *workflowTaskResults) Update(ctx context.Context, workflowTaskResult *v1alpha1.WorkflowTaskResult, opts v1.UpdateOptions) (result *v1alpha1.WorkflowTaskResult, err error) { + result = &v1alpha1.WorkflowTaskResult{} + err = c.client.Put(). + Namespace(c.ns). + Resource("workflowtaskresults"). + Name(workflowTaskResult.Name). + VersionedParams(&opts, scheme.ParameterCodec). + Body(workflowTaskResult). + Do(ctx). + Into(result) + return +} + +// Delete takes name of the workflowTaskResult and deletes it. Returns an error if one occurs. +func (c *workflowTaskResults) Delete(ctx context.Context, name string, opts v1.DeleteOptions) error { + return c.client.Delete(). + Namespace(c.ns). + Resource("workflowtaskresults"). + Name(name). + Body(&opts). + Do(ctx). + Error() +} + +// DeleteCollection deletes a collection of objects. +func (c *workflowTaskResults) DeleteCollection(ctx context.Context, opts v1.DeleteOptions, listOpts v1.ListOptions) error { + var timeout time.Duration + if listOpts.TimeoutSeconds != nil { + timeout = time.Duration(*listOpts.TimeoutSeconds) * time.Second + } + return c.client.Delete(). + Namespace(c.ns). + Resource("workflowtaskresults"). + VersionedParams(&listOpts, scheme.ParameterCodec). + Timeout(timeout). + Body(&opts). + Do(ctx). + Error() +} + +// Patch applies the patch and returns the patched workflowTaskResult. +func (c *workflowTaskResults) Patch(ctx context.Context, name string, pt types.PatchType, data []byte, opts v1.PatchOptions, subresources ...string) (result *v1alpha1.WorkflowTaskResult, err error) { + result = &v1alpha1.WorkflowTaskResult{} + err = c.client.Patch(pt). + Namespace(c.ns). + Resource("workflowtaskresults"). + Name(name). + SubResource(subresources...). + VersionedParams(&opts, scheme.ParameterCodec). + Body(data). + Do(ctx). + Into(result) + return +} diff --git a/pkg/client/informers/externalversions/generic.go b/pkg/client/informers/externalversions/generic.go index 4bb6377604b1..90e6fb7b4c91 100644 --- a/pkg/client/informers/externalversions/generic.go +++ b/pkg/client/informers/externalversions/generic.go @@ -45,6 +45,8 @@ func (f *sharedInformerFactory) ForResource(resource schema.GroupVersionResource return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().Workflows().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("workfloweventbindings"): return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().WorkflowEventBindings().Informer()}, nil + case v1alpha1.SchemeGroupVersion.WithResource("workflowtaskresults"): + return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().WorkflowTaskResults().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("workflowtasksets"): return &genericInformer{resource: resource.GroupResource(), informer: f.Argoproj().V1alpha1().WorkflowTaskSets().Informer()}, nil case v1alpha1.SchemeGroupVersion.WithResource("workflowtemplates"): diff --git a/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go b/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go index 6f57cec15f32..c4ca0974197b 100644 --- a/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go +++ b/pkg/client/informers/externalversions/workflow/v1alpha1/interface.go @@ -16,6 +16,8 @@ type Interface interface { Workflows() WorkflowInformer // WorkflowEventBindings returns a WorkflowEventBindingInformer. WorkflowEventBindings() WorkflowEventBindingInformer + // WorkflowTaskResults returns a WorkflowTaskResultInformer. + WorkflowTaskResults() WorkflowTaskResultInformer // WorkflowTaskSets returns a WorkflowTaskSetInformer. WorkflowTaskSets() WorkflowTaskSetInformer // WorkflowTemplates returns a WorkflowTemplateInformer. @@ -53,6 +55,11 @@ func (v *version) WorkflowEventBindings() WorkflowEventBindingInformer { return &workflowEventBindingInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} } +// WorkflowTaskResults returns a WorkflowTaskResultInformer. +func (v *version) WorkflowTaskResults() WorkflowTaskResultInformer { + return &workflowTaskResultInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} +} + // WorkflowTaskSets returns a WorkflowTaskSetInformer. func (v *version) WorkflowTaskSets() WorkflowTaskSetInformer { return &workflowTaskSetInformer{factory: v.factory, namespace: v.namespace, tweakListOptions: v.tweakListOptions} diff --git a/pkg/client/informers/externalversions/workflow/v1alpha1/workflowtaskresult.go b/pkg/client/informers/externalversions/workflow/v1alpha1/workflowtaskresult.go new file mode 100644 index 000000000000..ede2bfed8083 --- /dev/null +++ b/pkg/client/informers/externalversions/workflow/v1alpha1/workflowtaskresult.go @@ -0,0 +1,74 @@ +// Code generated by informer-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + "context" + time "time" + + workflowv1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + versioned "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned" + internalinterfaces "github.com/argoproj/argo-workflows/v3/pkg/client/informers/externalversions/internalinterfaces" + v1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/client/listers/workflow/v1alpha1" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + runtime "k8s.io/apimachinery/pkg/runtime" + watch "k8s.io/apimachinery/pkg/watch" + cache "k8s.io/client-go/tools/cache" +) + +// WorkflowTaskResultInformer provides access to a shared informer and lister for +// WorkflowTaskResults. +type WorkflowTaskResultInformer interface { + Informer() cache.SharedIndexInformer + Lister() v1alpha1.WorkflowTaskResultLister +} + +type workflowTaskResultInformer struct { + factory internalinterfaces.SharedInformerFactory + tweakListOptions internalinterfaces.TweakListOptionsFunc + namespace string +} + +// NewWorkflowTaskResultInformer constructs a new informer for WorkflowTaskResult type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewWorkflowTaskResultInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers) cache.SharedIndexInformer { + return NewFilteredWorkflowTaskResultInformer(client, namespace, resyncPeriod, indexers, nil) +} + +// NewFilteredWorkflowTaskResultInformer constructs a new informer for WorkflowTaskResult type. +// Always prefer using an informer factory to get a shared informer instead of getting an independent +// one. This reduces memory footprint and number of connections to the server. +func NewFilteredWorkflowTaskResultInformer(client versioned.Interface, namespace string, resyncPeriod time.Duration, indexers cache.Indexers, tweakListOptions internalinterfaces.TweakListOptionsFunc) cache.SharedIndexInformer { + return cache.NewSharedIndexInformer( + &cache.ListWatch{ + ListFunc: func(options v1.ListOptions) (runtime.Object, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ArgoprojV1alpha1().WorkflowTaskResults(namespace).List(context.TODO(), options) + }, + WatchFunc: func(options v1.ListOptions) (watch.Interface, error) { + if tweakListOptions != nil { + tweakListOptions(&options) + } + return client.ArgoprojV1alpha1().WorkflowTaskResults(namespace).Watch(context.TODO(), options) + }, + }, + &workflowv1alpha1.WorkflowTaskResult{}, + resyncPeriod, + indexers, + ) +} + +func (f *workflowTaskResultInformer) defaultInformer(client versioned.Interface, resyncPeriod time.Duration) cache.SharedIndexInformer { + return NewFilteredWorkflowTaskResultInformer(client, f.namespace, resyncPeriod, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}, f.tweakListOptions) +} + +func (f *workflowTaskResultInformer) Informer() cache.SharedIndexInformer { + return f.factory.InformerFor(&workflowv1alpha1.WorkflowTaskResult{}, f.defaultInformer) +} + +func (f *workflowTaskResultInformer) Lister() v1alpha1.WorkflowTaskResultLister { + return v1alpha1.NewWorkflowTaskResultLister(f.Informer().GetIndexer()) +} diff --git a/pkg/client/listers/workflow/v1alpha1/expansion_generated.go b/pkg/client/listers/workflow/v1alpha1/expansion_generated.go index ec50172bf684..d66c352cd562 100644 --- a/pkg/client/listers/workflow/v1alpha1/expansion_generated.go +++ b/pkg/client/listers/workflow/v1alpha1/expansion_generated.go @@ -30,6 +30,14 @@ type WorkflowEventBindingListerExpansion interface{} // WorkflowEventBindingNamespaceLister. type WorkflowEventBindingNamespaceListerExpansion interface{} +// WorkflowTaskResultListerExpansion allows custom methods to be added to +// WorkflowTaskResultLister. +type WorkflowTaskResultListerExpansion interface{} + +// WorkflowTaskResultNamespaceListerExpansion allows custom methods to be added to +// WorkflowTaskResultNamespaceLister. +type WorkflowTaskResultNamespaceListerExpansion interface{} + // WorkflowTaskSetListerExpansion allows custom methods to be added to // WorkflowTaskSetLister. type WorkflowTaskSetListerExpansion interface{} diff --git a/pkg/client/listers/workflow/v1alpha1/workflowtaskresult.go b/pkg/client/listers/workflow/v1alpha1/workflowtaskresult.go new file mode 100644 index 000000000000..dc15b7a893c7 --- /dev/null +++ b/pkg/client/listers/workflow/v1alpha1/workflowtaskresult.go @@ -0,0 +1,83 @@ +// Code generated by lister-gen. DO NOT EDIT. + +package v1alpha1 + +import ( + v1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/client-go/tools/cache" +) + +// WorkflowTaskResultLister helps list WorkflowTaskResults. +// All objects returned here must be treated as read-only. +type WorkflowTaskResultLister interface { + // List lists all WorkflowTaskResults in the indexer. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.WorkflowTaskResult, err error) + // WorkflowTaskResults returns an object that can list and get WorkflowTaskResults. + WorkflowTaskResults(namespace string) WorkflowTaskResultNamespaceLister + WorkflowTaskResultListerExpansion +} + +// workflowTaskResultLister implements the WorkflowTaskResultLister interface. +type workflowTaskResultLister struct { + indexer cache.Indexer +} + +// NewWorkflowTaskResultLister returns a new WorkflowTaskResultLister. +func NewWorkflowTaskResultLister(indexer cache.Indexer) WorkflowTaskResultLister { + return &workflowTaskResultLister{indexer: indexer} +} + +// List lists all WorkflowTaskResults in the indexer. +func (s *workflowTaskResultLister) List(selector labels.Selector) (ret []*v1alpha1.WorkflowTaskResult, err error) { + err = cache.ListAll(s.indexer, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.WorkflowTaskResult)) + }) + return ret, err +} + +// WorkflowTaskResults returns an object that can list and get WorkflowTaskResults. +func (s *workflowTaskResultLister) WorkflowTaskResults(namespace string) WorkflowTaskResultNamespaceLister { + return workflowTaskResultNamespaceLister{indexer: s.indexer, namespace: namespace} +} + +// WorkflowTaskResultNamespaceLister helps list and get WorkflowTaskResults. +// All objects returned here must be treated as read-only. +type WorkflowTaskResultNamespaceLister interface { + // List lists all WorkflowTaskResults in the indexer for a given namespace. + // Objects returned here must be treated as read-only. + List(selector labels.Selector) (ret []*v1alpha1.WorkflowTaskResult, err error) + // Get retrieves the WorkflowTaskResult from the indexer for a given namespace and name. + // Objects returned here must be treated as read-only. + Get(name string) (*v1alpha1.WorkflowTaskResult, error) + WorkflowTaskResultNamespaceListerExpansion +} + +// workflowTaskResultNamespaceLister implements the WorkflowTaskResultNamespaceLister +// interface. +type workflowTaskResultNamespaceLister struct { + indexer cache.Indexer + namespace string +} + +// List lists all WorkflowTaskResults in the indexer for a given namespace. +func (s workflowTaskResultNamespaceLister) List(selector labels.Selector) (ret []*v1alpha1.WorkflowTaskResult, err error) { + err = cache.ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) { + ret = append(ret, m.(*v1alpha1.WorkflowTaskResult)) + }) + return ret, err +} + +// Get retrieves the WorkflowTaskResult from the indexer for a given namespace and name. +func (s workflowTaskResultNamespaceLister) Get(name string) (*v1alpha1.WorkflowTaskResult, error) { + obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name) + if err != nil { + return nil, err + } + if !exists { + return nil, errors.NewNotFound(v1alpha1.Resource("workflowtaskresult"), name) + } + return obj.(*v1alpha1.WorkflowTaskResult), nil +} diff --git a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md index f28670b0c03d..176f1a29dc73 100644 --- a/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md +++ b/sdks/java/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md @@ -10,6 +10,7 @@ Name | Type | Description | Notes **message** | **String** | | [optional] **outputs** | [**IoArgoprojWorkflowV1alpha1Outputs**](IoArgoprojWorkflowV1alpha1Outputs.md) | | [optional] **phase** | **String** | | [optional] +**progress** | **String** | | [optional] diff --git a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_result.py b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_result.py index 9456f08fe497..0120005f693d 100644 --- a/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_result.py +++ b/sdks/python/client/argo_workflows/model/io_argoproj_workflow_v1alpha1_node_result.py @@ -90,6 +90,7 @@ def openapi_types(): 'message': (str,), # noqa: E501 'outputs': (IoArgoprojWorkflowV1alpha1Outputs,), # noqa: E501 'phase': (str,), # noqa: E501 + 'progress': (str,), # noqa: E501 } @cached_property @@ -101,6 +102,7 @@ def discriminator(): 'message': 'message', # noqa: E501 'outputs': 'outputs', # noqa: E501 'phase': 'phase', # noqa: E501 + 'progress': 'progress', # noqa: E501 } read_only_vars = { @@ -147,6 +149,7 @@ def _from_openapi_data(cls, *args, **kwargs): # noqa: E501 message (str): [optional] # noqa: E501 outputs (IoArgoprojWorkflowV1alpha1Outputs): [optional] # noqa: E501 phase (str): [optional] # noqa: E501 + progress (str): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) @@ -231,6 +234,7 @@ def __init__(self, *args, **kwargs): # noqa: E501 message (str): [optional] # noqa: E501 outputs (IoArgoprojWorkflowV1alpha1Outputs): [optional] # noqa: E501 phase (str): [optional] # noqa: E501 + progress (str): [optional] # noqa: E501 """ _check_type = kwargs.pop('_check_type', True) diff --git a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md index a08785808573..9790ceffb93c 100644 --- a/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md +++ b/sdks/python/client/docs/IoArgoprojWorkflowV1alpha1NodeResult.md @@ -7,6 +7,7 @@ Name | Type | Description | Notes **message** | **str** | | [optional] **outputs** | [**IoArgoprojWorkflowV1alpha1Outputs**](IoArgoprojWorkflowV1alpha1Outputs.md) | | [optional] **phase** | **str** | | [optional] +**progress** | **str** | | [optional] **any string name** | **bool, date, datetime, dict, float, int, list, str, none_type** | any string name can be used but the value must be the correct type | [optional] [[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md) diff --git a/workflow/common/common.go b/workflow/common/common.go index 3f5693886b86..b5a93b6c2367 100644 --- a/workflow/common/common.go +++ b/workflow/common/common.go @@ -108,6 +108,10 @@ const ( EnvVarPodName = "ARGO_POD_NAME" // EnvVarWorkflowName is the name of the workflow for which the an agent is responsible for EnvVarWorkflowName = "ARGO_WORKFLOW_NAME" + // EnvVarWorkflowUID is the workflow's UID + EnvVarWorkflowUID = "ARGO_WORKFLOW_UID" + // EnvVarNodeID is the node ID of the node. + EnvVarNodeID = "ARGO_NODE_ID" // EnvVarPluginAddresses is a list of plugin addresses EnvVarPluginAddresses = "ARGO_PLUGIN_ADDRESSES" // EnvVarContainerName container the container's name for the current pod diff --git a/workflow/common/util.go b/workflow/common/util.go index ec61f04d9dc3..f34a8b790a4e 100644 --- a/workflow/common/util.go +++ b/workflow/common/util.go @@ -18,8 +18,6 @@ import ( apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/cache" @@ -28,9 +26,7 @@ import ( "github.com/argoproj/argo-workflows/v3/errors" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" "github.com/argoproj/argo-workflows/v3/util" - errorsutil "github.com/argoproj/argo-workflows/v3/util/errors" "github.com/argoproj/argo-workflows/v3/util/template" - waitutil "github.com/argoproj/argo-workflows/v3/util/wait" ) // FindOverlappingVolume looks an artifact path, checks if it overlaps with any @@ -301,51 +297,6 @@ func RunShellCommand(arg ...string) ([]byte, error) { return RunCommand(name, arg...) } -// Run Seconds -// 0 0.000 -// 1 1.000 -// 2 2.000 -// 3 3.000 -// 4 4.000 -var defaultPatchBackoff = wait.Backoff{ - Steps: 5, - Duration: 1 * time.Second, - Factor: 1, -} - -// AddPodAnnotation adds an annotation to pod -func AddPodAnnotation(ctx context.Context, c kubernetes.Interface, podName, namespace, key, value string, options ...interface{}) error { - backoff := defaultPatchBackoff - for _, option := range options { - switch v := option.(type) { - case wait.Backoff: - backoff = v - default: - panic("unknown option type") - } - } - return addPodMetadata(ctx, c, "annotations", podName, namespace, key, value, backoff) -} - -// addPodMetadata is helper to either add a pod label or annotation to the pod -func addPodMetadata(ctx context.Context, c kubernetes.Interface, field, podName, namespace, key, value string, backoff wait.Backoff) error { - metadata := map[string]interface{}{ - "metadata": map[string]interface{}{ - field: map[string]string{ - key: value, - }, - }, - } - patch, err := json.Marshal(metadata) - if err != nil { - return errors.InternalWrapError(err) - } - return waitutil.Backoff(backoff, func() (bool, error) { - _, err := c.CoreV1().Pods(namespace).Patch(ctx, podName, types.MergePatchType, patch, metav1.PatchOptions{}) - return !errorsutil.IsTransientErr(err), err - }) -} - const deleteRetries = 3 // DeletePod deletes a pod. Ignores NotFound error diff --git a/workflow/controller/controller.go b/workflow/controller/controller.go index c063e17918bd..9e7244f3fb37 100644 --- a/workflow/controller/controller.go +++ b/workflow/controller/controller.go @@ -113,6 +113,7 @@ type WorkflowController struct { archiveLabelSelector labels.Selector cacheFactory controllercache.Factory wfTaskSetInformer wfextvv1alpha1.WorkflowTaskSetInformer + taskResultInformer wfextvv1alpha1.WorkflowTaskResultInformer // progressPatchTickDuration defines how often the executor will patch pod annotations if an updated progress is found. // Default is 1m and can be configured using the env var ARGO_PROGRESS_PATCH_TICK_DURATION. @@ -238,6 +239,7 @@ func (wfc *WorkflowController) Run(ctx context.Context, wfWorkers, workflowTTLWo wfc.wfInformer = util.NewWorkflowInformer(wfc.dynamicInterface, wfc.GetManagedNamespace(), workflowResyncPeriod, wfc.tweakListOptions, indexers) wfc.wftmplInformer = informer.NewTolerantWorkflowTemplateInformer(wfc.dynamicInterface, workflowTemplateResyncPeriod, wfc.managedNamespace) wfc.wfTaskSetInformer = wfc.newWorkflowTaskSetInformer() + wfc.taskResultInformer = wfc.newWorkflowTaskResultInformer() wfc.addWorkflowInformerHandlers(ctx) wfc.podInformer = wfc.newPodInformer(ctx) @@ -259,9 +261,18 @@ func (wfc *WorkflowController) Run(ctx context.Context, wfWorkers, workflowTTLWo go wfc.podInformer.Run(ctx.Done()) go wfc.configMapInformer.Run(ctx.Done()) go wfc.wfTaskSetInformer.Informer().Run(ctx.Done()) + go wfc.taskResultInformer.Informer().Run(ctx.Done()) // Wait for all involved caches to be synced, before processing items from the queue is started - if !cache.WaitForCacheSync(ctx.Done(), wfc.wfInformer.HasSynced, wfc.wftmplInformer.Informer().HasSynced, wfc.podInformer.HasSynced, wfc.configMapInformer.HasSynced) { + if !cache.WaitForCacheSync( + ctx.Done(), + wfc.wfInformer.HasSynced, + wfc.wftmplInformer.Informer().HasSynced, + wfc.podInformer.HasSynced, + wfc.configMapInformer.HasSynced, + wfc.wfTaskSetInformer.Informer().HasSynced, + wfc.taskResultInformer.Informer().HasSynced, + ) { log.Fatal("Timed out waiting for caches to sync") } @@ -1239,7 +1250,7 @@ func (wfc *WorkflowController) newWorkflowTaskSetInformer() wfextvv1alpha1.Workf UpdateFunc: func(old, new interface{}) { key, err := cache.MetaNamespaceKeyFunc(new) if err == nil { - wfc.wfQueue.Add(key) + wfc.wfQueue.AddRateLimited(key) } }, }) diff --git a/workflow/controller/controller_test.go b/workflow/controller/controller_test.go index 7d4bf7f05920..7895c3eb6719 100644 --- a/workflow/controller/controller_test.go +++ b/workflow/controller/controller_test.go @@ -220,6 +220,7 @@ func newController(options ...interface{}) (context.CancelFunc, *WorkflowControl { wfc.wfInformer = util.NewWorkflowInformer(dynamicClient, "", 0, wfc.tweakListOptions, indexers) wfc.wfTaskSetInformer = informerFactory.Argoproj().V1alpha1().WorkflowTaskSets() + wfc.taskResultInformer = informerFactory.Argoproj().V1alpha1().WorkflowTaskResults() wfc.wftmplInformer = informerFactory.Argoproj().V1alpha1().WorkflowTemplates() wfc.addWorkflowInformerHandlers(ctx) wfc.podInformer = wfc.newPodInformer(ctx) @@ -231,6 +232,7 @@ func newController(options ...interface{}) (context.CancelFunc, *WorkflowControl go wfc.wftmplInformer.Informer().Run(ctx.Done()) go wfc.podInformer.Run(ctx.Done()) go wfc.wfTaskSetInformer.Informer().Run(ctx.Done()) + go wfc.taskResultInformer.Informer().Run(ctx.Done()) wfc.cwftmplInformer = informerFactory.Argoproj().V1alpha1().ClusterWorkflowTemplates() go wfc.cwftmplInformer.Informer().Run(ctx.Done()) // wfc.waitForCacheSync() takes minimum 100ms, we can be faster @@ -239,6 +241,8 @@ func newController(options ...interface{}) (context.CancelFunc, *WorkflowControl wfc.wftmplInformer.Informer(), wfc.podInformer, wfc.cwftmplInformer.Informer(), + wfc.wfTaskSetInformer.Informer(), + wfc.taskResultInformer.Informer(), } { for !c.HasSynced() { time.Sleep(5 * time.Millisecond) @@ -308,7 +312,14 @@ func listPods(woc *wfOperationCtx) (*apiv1.PodList, error) { type with func(pod *apiv1.Pod) -func withOutputs(v string) with { return withAnnotation(common.AnnotationKeyOutputs, v) } +func withOutputs(v interface{}) with { + switch x := v.(type) { + case string: + return withAnnotation(common.AnnotationKeyOutputs, x) + default: + return withOutputs(wfv1.MustMarshallJSON(x)) + } +} func withProgress(v string) with { return withAnnotation(common.AnnotationKeyProgress, v) } func withExitCode(v int32) with { diff --git a/workflow/controller/exit_handler_test.go b/workflow/controller/exit_handler_test.go index 294d34a00b95..745718041b21 100644 --- a/workflow/controller/exit_handler_test.go +++ b/workflow/controller/exit_handler_test.go @@ -8,6 +8,7 @@ import ( "github.com/stretchr/testify/assert" apiv1 "k8s.io/api/core/v1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" ) @@ -352,9 +353,11 @@ func TestStepsTmplOnExit(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - makePodsPhase(ctx, woc, apiv1.PodSucceeded) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) + makePodsPhase(ctx, woc, apiv1.PodSucceeded, withOutputs(wfv1.Outputs{Result: pointer.StringPtr("ok"), Parameters: []wfv1.Parameter{{}}})) woc1 := newWorkflowOperationCtx(woc.wf, controller) woc1.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc1.wf.Status.Phase) onExitNodeIsPresent := false for _, node := range woc1.wf.Status.Nodes { if node.Phase == wfv1.NodePending && strings.Contains(node.Name, "onExit") { @@ -367,6 +370,7 @@ func TestStepsTmplOnExit(t *testing.T) { makePodsPhase(ctx, woc1, apiv1.PodSucceeded) woc2 := newWorkflowOperationCtx(woc1.wf, controller) woc2.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc2.wf.Status.Phase) makePodsPhase(ctx, woc2, apiv1.PodSucceeded) for idx, node := range woc2.wf.Status.Nodes { if strings.Contains(node.Name, ".leafB") { @@ -384,6 +388,7 @@ func TestStepsTmplOnExit(t *testing.T) { woc3 := newWorkflowOperationCtx(woc2.wf, controller) woc3.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc3.wf.Status.Phase) onExitNodeIsPresent = false for _, node := range woc3.wf.Status.Nodes { if node.Phase == wfv1.NodePending && strings.Contains(node.Name, "onExit") { @@ -452,9 +457,11 @@ func TestDAGOnExit(t *testing.T) { ctx := context.Background() woc := newWorkflowOperationCtx(wf, controller) woc.operate(ctx) - makePodsPhase(ctx, woc, apiv1.PodSucceeded) + assert.Equal(t, wfv1.WorkflowRunning, woc.wf.Status.Phase) + makePodsPhase(ctx, woc, apiv1.PodSucceeded, withOutputs(wfv1.Outputs{Parameters: []wfv1.Parameter{{}}})) woc1 := newWorkflowOperationCtx(woc.wf, controller) woc1.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc1.wf.Status.Phase) onExitNodeIsPresent := false for _, node := range woc1.wf.Status.Nodes { if strings.Contains(node.Name, "onExit") { @@ -467,6 +474,7 @@ func TestDAGOnExit(t *testing.T) { makePodsPhase(ctx, woc1, apiv1.PodSucceeded) woc2 := newWorkflowOperationCtx(woc1.wf, controller) woc2.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc2.wf.Status.Phase) makePodsPhase(ctx, woc2, apiv1.PodSucceeded) for idx, node := range woc2.wf.Status.Nodes { if strings.Contains(node.Name, ".leafB") { @@ -483,6 +491,7 @@ func TestDAGOnExit(t *testing.T) { } woc3 := newWorkflowOperationCtx(woc2.wf, controller) woc3.operate(ctx) + assert.Equal(t, wfv1.WorkflowRunning, woc3.wf.Status.Phase) onExitNodeIsPresent = false for _, node := range woc3.wf.Status.Nodes { if node.Phase == wfv1.NodePending && strings.Contains(node.Name, "onExit") { diff --git a/workflow/controller/operator.go b/workflow/controller/operator.go index 34ed719dc803..f50f0611bb48 100644 --- a/workflow/controller/operator.go +++ b/workflow/controller/operator.go @@ -679,12 +679,28 @@ func (woc *wfOperationCtx) persistUpdates(ctx context.Context) { woc.log.WithError(err).Warn("error updating taskset") } + if woc.wf.Status.Phase.Completed() { + if err := woc.deleteTaskResults(ctx); err != nil { + woc.log.WithError(err).Warn("failed to delete task-results") + } + } + // It is important that we *never* label pods as completed until we successfully updated the workflow // Failing to do so means we can have inconsistent state. // Pods may be be labeled multiple times. woc.queuePodsForCleanup() } +func (woc *wfOperationCtx) deleteTaskResults(ctx context.Context) error { + deletePropagationBackground := metav1.DeletePropagationBackground + return woc.controller.wfclientset.ArgoprojV1alpha1().WorkflowTaskResults(woc.wf.Namespace). + DeleteCollection( + ctx, + metav1.DeleteOptions{PropagationPolicy: &deletePropagationBackground}, + metav1.ListOptions{LabelSelector: common.LabelKeyWorkflow + "=" + woc.wf.Name}, + ) +} + func (woc *wfOperationCtx) writeBackToInformer() error { un, err := wfutil.ToUnstructured(woc.wf) if err != nil { @@ -1227,16 +1243,8 @@ func (woc *wfOperationCtx) assessNodeStatus(pod *apiv1.Pod, old *wfv1.NodeStatus new.PodIP = pod.Status.PodIP } - // both exit code and outputs maybe know before the pod terminates, we risk loosing them to pod being deleted - // if we do not capture them - if exitCode := getExitCode(pod); exitCode != nil { - if new.Outputs == nil { - new.Outputs = &wfv1.Outputs{} - } - new.Outputs.ExitCode = pointer.StringPtr(fmt.Sprint(*exitCode)) - } - if x, ok := pod.Annotations[common.AnnotationKeyOutputs]; ok { + woc.log.Warn("workflow uses legacy/insecure pod patch, see https://argoproj.github.io/argo-workflows/workflow-rbac/") if new.Outputs == nil { new.Outputs = &wfv1.Outputs{} } @@ -1253,11 +1261,35 @@ func (woc *wfOperationCtx) assessNodeStatus(pod *apiv1.Pod, old *wfv1.NodeStatus } if x, ok := pod.Annotations[common.AnnotationKeyProgress]; ok { + woc.log.Warn("workflow uses legacy/insecure pod patch, see https://argoproj.github.io/argo-workflows/workflow-rbac/") if p, ok := wfv1.ParseProgress(x); ok { new.Progress = p } } + obj, _, _ := woc.controller.taskResultInformer.Informer().GetStore().GetByKey(woc.wf.Namespace + "/" + old.ID) + if result, ok := obj.(*wfv1.WorkflowTaskResult); ok { + if result.Outputs.HasOutputs() { + if new.Outputs == nil { + new.Outputs = &wfv1.Outputs{} + } + result.Outputs.DeepCopyInto(new.Outputs) // preserve any existing values + } + if result.Progress.IsValid() { + new.Progress = result.Progress + } + } + + // We capture the exit-code after we look for the task-result. + // All other outputs are set by the executor, only the exit-code is set by the controller. + // By waiting, we avoid breaking the race-condition check. + if exitCode := getExitCode(pod); exitCode != nil { + if new.Outputs == nil { + new.Outputs = &wfv1.Outputs{} + } + new.Outputs.ExitCode = pointer.StringPtr(fmt.Sprint(*exitCode)) + } + // if we are transitioning from Pending to a different state, clear out unchanged message if old.Phase == wfv1.NodePending && new.Phase != wfv1.NodePending && old.Message == new.Message { new.Message = "" diff --git a/workflow/controller/operator_test.go b/workflow/controller/operator_test.go index cd2d62fab981..5372f0e13c94 100644 --- a/workflow/controller/operator_test.go +++ b/workflow/controller/operator_test.go @@ -6082,8 +6082,8 @@ func TestWFWithRetryAndWithParam(t *testing.T) { ctrs := pods.Items[0].Spec.Containers assert.Len(t, ctrs, 2) envs := ctrs[1].Env - assert.Len(t, envs, 7) - assert.Equal(t, apiv1.EnvVar{Name: "ARGO_INCLUDE_SCRIPT_OUTPUT", Value: "true"}, envs[2]) + assert.Len(t, envs, 8) + assert.Equal(t, apiv1.EnvVar{Name: "ARGO_INCLUDE_SCRIPT_OUTPUT", Value: "true"}, envs[3]) } }) } diff --git a/workflow/controller/taskresult.go b/workflow/controller/taskresult.go new file mode 100644 index 000000000000..48eff3d716de --- /dev/null +++ b/workflow/controller/taskresult.go @@ -0,0 +1,37 @@ +package controller + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/client-go/tools/cache" + + wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/pkg/client/informers/externalversions" + wfextvv1alpha1 "github.com/argoproj/argo-workflows/v3/pkg/client/informers/externalversions/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/workflow/common" + "github.com/argoproj/argo-workflows/v3/workflow/util" +) + +func (wfc *WorkflowController) newWorkflowTaskResultInformer() wfextvv1alpha1.WorkflowTaskResultInformer { + informer := externalversions.NewSharedInformerFactoryWithOptions( + wfc.wfclientset, + workflowTaskSetResyncPeriod, + externalversions.WithNamespace(wfc.GetManagedNamespace()), + externalversions.WithTweakListOptions(func(x *metav1.ListOptions) { + r := util.InstanceIDRequirement(wfc.Config.InstanceID) + x.LabelSelector = r.String() + })).Argoproj().V1alpha1().WorkflowTaskResults() + informer.Informer().AddEventHandler( + cache.ResourceEventHandlerFuncs{ + AddFunc: func(new interface{}) { + result := new.(*wfv1.WorkflowTaskResult) + workflow := result.Labels[common.LabelKeyWorkflow] + wfc.wfQueue.AddRateLimited(result.Namespace + "/" + workflow) + }, + UpdateFunc: func(_, new interface{}) { + result := new.(*wfv1.WorkflowTaskResult) + workflow := result.Labels[common.LabelKeyWorkflow] + wfc.wfQueue.AddRateLimited(result.Namespace + "/" + workflow) + }, + }) + return informer +} diff --git a/workflow/controller/workflowpod.go b/workflow/controller/workflowpod.go index ceda1b318c12..4c1d59b42c37 100644 --- a/workflow/controller/workflowpod.go +++ b/workflow/controller/workflowpod.go @@ -319,6 +319,7 @@ func (woc *wfOperationCtx) createWorkflowPod(ctx context.Context, nodeName strin // Add standard environment variables, making pod spec larger envVars := []apiv1.EnvVar{ {Name: common.EnvVarTemplate, Value: wfv1.MustMarshallJSON(tmpl)}, + {Name: common.EnvVarNodeID, Value: nodeID}, {Name: common.EnvVarIncludeScriptOutput, Value: strconv.FormatBool(opts.includeScriptOutput)}, {Name: common.EnvVarDeadline, Value: woc.getDeadline(opts).Format(time.RFC3339)}, {Name: common.EnvVarProgressFile, Value: common.ArgoProgressPath}, @@ -629,6 +630,10 @@ func (woc *wfOperationCtx) createEnvVars() []apiv1.EnvVar { Name: common.EnvVarWorkflowName, Value: woc.wf.Name, }, + { + Name: common.EnvVarWorkflowUID, + Value: string(woc.wf.UID), + }, } if woc.controller.Config.Executor != nil { execEnvVars = append(execEnvVars, woc.controller.Config.Executor.Env...) diff --git a/workflow/executor/data.go b/workflow/executor/data.go index 5da38a719259..552fb60670f0 100644 --- a/workflow/executor/data.go +++ b/workflow/executor/data.go @@ -26,7 +26,7 @@ func (we *WorkflowExecutor) Data(ctx context.Context) error { return err } we.Template.Outputs.Result = pointer.StringPtr(string(out)) - err = we.AnnotateOutputs(ctx, nil) + err = we.ReportOutputs(ctx, nil) if err != nil { return err } diff --git a/workflow/executor/executor.go b/workflow/executor/executor.go index d96cb8ed33a7..46017e0d1b34 100644 --- a/workflow/executor/executor.go +++ b/workflow/executor/executor.go @@ -24,12 +24,17 @@ import ( argofile "github.com/argoproj/pkg/file" log "github.com/sirupsen/logrus" apiv1 "k8s.io/api/core/v1" + apierr "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" + retryutil "k8s.io/client-go/util/retry" argoerrs "github.com/argoproj/argo-workflows/v3/errors" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + argoprojv1 "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/typed/workflow/v1alpha1" "github.com/argoproj/argo-workflows/v3/util" "github.com/argoproj/argo-workflows/v3/util/archive" errorsutil "github.com/argoproj/argo-workflows/v3/util/errors" @@ -49,10 +54,14 @@ const ( // WorkflowExecutor is program which runs as the init/wait container type WorkflowExecutor struct { PodName string + workflow string + workflowUID types.UID + nodeId string Template wfv1.Template IncludeScriptOutput bool Deadline time.Time ClientSet kubernetes.Interface + taskResultClient argoprojv1.WorkflowTaskResultInterface RESTClient rest.Interface Namespace string RuntimeExecutor ContainerRuntimeExecutor @@ -109,11 +118,26 @@ func isErrUnknownGetPods(err error) bool { } // NewExecutor instantiates a new workflow executor -func NewExecutor(clientset kubernetes.Interface, restClient rest.Interface, podName, namespace string, cre ContainerRuntimeExecutor, template wfv1.Template, includeScriptOutput bool, deadline time.Time, annotationPatchTickDuration, readProgressFileTickDuration time.Duration) WorkflowExecutor { +func NewExecutor( + clientset kubernetes.Interface, + taskSetClient argoprojv1.WorkflowTaskResultInterface, + restClient rest.Interface, + podName, workflow, nodeId, namespace string, + workflowUID types.UID, + cre ContainerRuntimeExecutor, + template wfv1.Template, + includeScriptOutput bool, + deadline time.Time, + annotationPatchTickDuration, readProgressFileTickDuration time.Duration, +) WorkflowExecutor { log.WithFields(log.Fields{"Steps": executorretry.Steps, "Duration": executorretry.Duration, "Factor": executorretry.Factor, "Jitter": executorretry.Jitter}).Info("Using executor retry strategy") return WorkflowExecutor{ PodName: podName, + workflow: workflow, + workflowUID: workflowUID, + nodeId: nodeId, ClientSet: clientset, + taskResultClient: taskSetClient, RESTClient: restClient, Namespace: namespace, RuntimeExecutor: cre, @@ -549,7 +573,7 @@ func (we *WorkflowExecutor) SaveLogs(ctx context.Context) (*wfv1.Artifact, error if err != nil { return nil, err } - art := &wfv1.Artifact{Name: "main-logs"} + art := &wfv1.Artifact{Name: wfv1.MainLogsArtifactName} err = we.saveArtifactFromFile(ctx, art, fileName, mainLog) if err != nil { return nil, err @@ -723,22 +747,42 @@ func (we *WorkflowExecutor) CaptureScriptResult(ctx context.Context) error { return nil } -// AnnotateOutputs annotation to the pod indicating all the outputs. -func (we *WorkflowExecutor) AnnotateOutputs(ctx context.Context, logArt *wfv1.Artifact) error { +// ReportOutputs annotation to the pod indicating all the outputs. +func (we *WorkflowExecutor) ReportOutputs(ctx context.Context, logArt *wfv1.Artifact) error { outputs := we.Template.Outputs.DeepCopy() if logArt != nil { outputs.Artifacts = append(outputs.Artifacts, *logArt) } + return we.reportResult(ctx, wfv1.NodeResult{Outputs: outputs}) +} - if !outputs.HasOutputs() { +func (we *WorkflowExecutor) reportResult(ctx context.Context, result wfv1.NodeResult) error { + if !result.Outputs.HasOutputs() && !result.Progress.IsValid() { return nil } - log.Infof("Annotating pod with output") - outputBytes, err := json.Marshal(outputs) - if err != nil { - return argoerrs.InternalWrapError(err) - } - return we.AddAnnotation(ctx, common.AnnotationKeyOutputs, string(outputBytes)) + return retryutil.OnError(wait.Backoff{ + Duration: time.Second, + Factor: 2, + Jitter: 0.1, + Steps: 5, + Cap: 30 * time.Second, + }, errorsutil.IsTransientErr, func() error { + err := we.upsertTaskResult(ctx, result) + if apierr.IsForbidden(err) { + log.WithError(err).Warn("failed to patch task set, falling back to legacy/insecure pod patch, see https://argoproj.github.io/argo-workflows/workflow-rbac/") + if result.Outputs.HasOutputs() { + value, err := json.Marshal(result.Outputs) + if err != nil { + return err + } + return we.AddAnnotation(ctx, common.AnnotationKeyOutputs, string(value)) + } + if result.Progress.IsValid() { // this may result in occasionally two patches + return we.AddAnnotation(ctx, common.AnnotationKeyProgress, string(result.Progress)) + } + } + return err + }) } // AddError adds an error to the list of encountered errors during execution @@ -757,7 +801,17 @@ func (we *WorkflowExecutor) HasError() error { // AddAnnotation adds an annotation to the workflow pod func (we *WorkflowExecutor) AddAnnotation(ctx context.Context, key, value string) error { - return common.AddPodAnnotation(ctx, we.ClientSet, we.PodName, we.Namespace, key, value, executorretry.ExecutorRetry) + data, err := json.Marshal(map[string]interface{}{"metadata": metav1.ObjectMeta{ + Annotations: map[string]string{ + key: value, + }, + }}) + if err != nil { + return err + } + _, err = we.ClientSet.CoreV1().Pods(we.Namespace).Patch(ctx, we.PodName, types.MergePatchType, data, metav1.PatchOptions{}) + return err + } // isTarball returns whether or not the file is a tarball @@ -972,11 +1026,10 @@ func (we *WorkflowExecutor) monitorProgress(ctx context.Context, progressFile st log.WithError(ctx.Err()).Info("stopping progress monitor (context done)") return case <-annotationPatchTicker.C: - if we.progress != "" { - log.WithField("progress", we.progress).Infof("patching pod progress annotation") - if err := we.AddAnnotation(ctx, common.AnnotationKeyProgress, string(we.progress)); err != nil { - log.WithField("progress", we.progress).WithError(err).Warn("failed to patch progress annotation") - } + if err := we.reportResult(ctx, wfv1.NodeResult{Progress: we.progress}); err != nil { + log.WithError(err).Info("failed to report progress") + } else { + we.progress = "" } case <-fileTicker.C: data, err := ioutil.ReadFile(progressFile) diff --git a/workflow/executor/executor_test.go b/workflow/executor/executor_test.go index 27151b10c8f3..cd2b459089e0 100644 --- a/workflow/executor/executor_test.go +++ b/workflow/executor/executor_test.go @@ -9,18 +9,21 @@ import ( "time" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes/fake" wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + argofake "github.com/argoproj/argo-workflows/v3/pkg/client/clientset/versioned/fake" "github.com/argoproj/argo-workflows/v3/workflow/common" "github.com/argoproj/argo-workflows/v3/workflow/executor/mocks" ) const ( fakePodName = "fake-test-pod-1234567890" + fakeWorkflow = "my-wf" + fakeWorkflowUID = "my-wf-uid" + fakeNodeID = "my-node-id" fakeNamespace = "default" fakeContainerName = "main" ) @@ -378,88 +381,47 @@ func TestSaveArtifacts(t *testing.T) { } func TestMonitorProgress(t *testing.T) { - deadline, ok := t.Deadline() - if !ok { - deadline = time.Now().Add(time.Second) - } - ctx, cancel := context.WithDeadline(context.Background(), deadline) - defer cancel() + ctx := context.Background() + + annotationPackTickDuration := 5 * time.Millisecond + readProgressFileTickDuration := time.Millisecond + progressFile := "/tmp/progress" - fakeClientset := fake.NewSimpleClientset(&corev1.Pod{ + wfFake := argofake.NewSimpleClientset(&wfv1.WorkflowTaskSet{ ObjectMeta: metav1.ObjectMeta{ - Name: fakePodName, Namespace: fakeNamespace, - }, - Spec: corev1.PodSpec{}, - Status: corev1.PodStatus{ - ContainerStatuses: []corev1.ContainerStatus{ - { - Name: "main", - State: corev1.ContainerState{ - Running: &corev1.ContainerStateRunning{ - StartedAt: metav1.Now(), - }, - }, - }, - }, + Name: fakeWorkflow, }, }) + taskResults := wfFake.ArgoprojV1alpha1().WorkflowTaskResults(fakeNamespace) + we := NewExecutor( + nil, + taskResults, + nil, + fakePodName, + fakeWorkflow, + fakeNodeID, + fakeNamespace, + fakeWorkflowUID, + &mocks.ContainerRuntimeExecutor{}, + wfv1.Template{}, + false, + time.Now(), + annotationPackTickDuration, + readProgressFileTickDuration, + ) - f, err := os.CreateTemp("", "") - require.NoError(t, err) - defer func() { - name := f.Name() - err := f.Close() - assert.NoError(t, err) - err = os.Remove(name) - assert.NoError(t, err) - }() - annotationPackTickDuration := 5 * time.Millisecond - readProgressFileTickDuration := time.Millisecond - progressFile := f.Name() + go we.monitorProgress(ctx, progressFile) - mockRuntimeExecutor := mocks.ContainerRuntimeExecutor{} - we := NewExecutor(fakeClientset, nil, fakePodName, fakeNamespace, &mockRuntimeExecutor, wfv1.Template{}, false, deadline, annotationPackTickDuration, readProgressFileTickDuration) + err := os.WriteFile(progressFile, []byte("100/100\n"), os.ModePerm) + assert.NoError(t, err) - go we.monitorProgress(ctx, progressFile) + time.Sleep(time.Second) - go func(ctx context.Context) { - progress := 0 - maxProgress := 10 - tickDuration := time.Millisecond - ticker := time.After(tickDuration) - for { - select { - case <-ctx.Done(): - return - case <-ticker: - t.Logf("tick progress=%d", progress) - _, err := fmt.Fprintf(f, "%d/100\n", progress*10) - assert.NoError(t, err) - if progress >= maxProgress { - return - } - progress += 1 - ticker = time.After(tickDuration) - } - } - }(ctx) - - ticker := time.After(annotationPackTickDuration) - for { - select { - case <-ctx.Done(): - t.Error(ctx.Err()) - return - case <-ticker: - pod, err := we.getPod(ctx) - assert.NoError(t, err) - progress, ok := pod.Annotations[common.AnnotationKeyProgress] - if ok && progress == "100/100" { - t.Log("success reaching 100/100 progress") - return - } - ticker = time.After(annotationPackTickDuration) - } + result, err := taskResults.Get(ctx, fakeNodeID, metav1.GetOptions{}) + if assert.NoError(t, err) { + assert.Equal(t, fakeWorkflow, result.Labels[common.LabelKeyWorkflow]) + assert.Len(t, result.OwnerReferences, 1) + assert.Equal(t, wfv1.Progress("100/100"), result.Progress) } } diff --git a/workflow/executor/resource.go b/workflow/executor/resource.go index f5ddbc55a467..77229e2f41f8 100644 --- a/workflow/executor/resource.go +++ b/workflow/executor/resource.go @@ -317,6 +317,6 @@ func (we *WorkflowExecutor) SaveResourceParameters(ctx context.Context, resource we.Template.Outputs.Parameters[i].Value = wfv1.AnyStringPtr(output) log.Infof("Saved output parameter: %s, value: %s", param.Name, output) } - err := we.AnnotateOutputs(ctx, nil) + err := we.ReportOutputs(ctx, nil) return err } diff --git a/workflow/executor/taskresult.go b/workflow/executor/taskresult.go new file mode 100644 index 000000000000..82c017f1eac1 --- /dev/null +++ b/workflow/executor/taskresult.go @@ -0,0 +1,63 @@ +package executor + +import ( + "context" + "encoding/json" + + apierr "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + + "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow" + wfv1 "github.com/argoproj/argo-workflows/v3/pkg/apis/workflow/v1alpha1" + "github.com/argoproj/argo-workflows/v3/workflow/common" +) + +func (we *WorkflowExecutor) upsertTaskResult(ctx context.Context, result wfv1.NodeResult) error { + err := we.createTaskResult(ctx, result) + if apierr.IsAlreadyExists(err) { + return we.patchTaskResult(ctx, result) + } + return err +} + +func (we *WorkflowExecutor) patchTaskResult(ctx context.Context, result wfv1.NodeResult) error { + data, err := json.Marshal(&wfv1.WorkflowTaskResult{NodeResult: result}) + if err != nil { + return err + } + _, err = we.taskResultClient.Patch(ctx, + we.nodeId, + types.MergePatchType, + data, + metav1.PatchOptions{}, + ) + return err +} + +func (we *WorkflowExecutor) createTaskResult(ctx context.Context, result wfv1.NodeResult) error { + _, err := we.taskResultClient.Create(ctx, + &wfv1.WorkflowTaskResult{ + TypeMeta: metav1.TypeMeta{ + APIVersion: workflow.APIVersion, + Kind: workflow.WorkflowTaskResultKind, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: we.nodeId, + Labels: map[string]string{common.LabelKeyWorkflow: we.workflow}, + // make sure deleting the workflow, delete this result + OwnerReferences: []metav1.OwnerReference{ + { + APIVersion: workflow.APIVersion, + Kind: workflow.WorkflowKind, + Name: we.workflow, + UID: we.workflowUID, + }, + }, + }, + NodeResult: result, + }, + metav1.CreateOptions{}, + ) + return err +}