From dc4f2661a2c32f10c3b0a229e66f8cd2eb17c2b6 Mon Sep 17 00:00:00 2001 From: Kevin Rizza Date: Wed, 19 Jul 2023 13:46:43 -0400 Subject: [PATCH 1/8] add joelanford to OWNERS (#3000) Signed-off-by: kevinrizza Upstream-repository: operator-lifecycle-manager Upstream-commit: 82fab49ef724a060090b8fc65f714724351b16b7 Signed-off-by: Steve Kuznetsov --- pkg/manifests/csv.yaml | 4 ++-- staging/operator-lifecycle-manager/OWNERS | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 897fbeecef..5ac3fb89b3 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.19.0 + olm.version: 0.0.0-c0ff8256acdd48c68b07e8c46376ef6ff28d218a olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.19.0 + version: 0.0.0-c0ff8256acdd48c68b07e8c46376ef6ff28d218a apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/operator-lifecycle-manager/OWNERS b/staging/operator-lifecycle-manager/OWNERS index 1b8bbde740..8a849d2c6c 100644 --- a/staging/operator-lifecycle-manager/OWNERS +++ b/staging/operator-lifecycle-manager/OWNERS @@ -9,6 +9,7 @@ approvers: - dinhxuanvu - perdasilva - grokspawn + - joelanford # review == this code is good /lgtm reviewers: - ecordell From efc34da226fd0e5a9a881c8546579b6dbe1211df Mon Sep 17 00:00:00 2001 From: Kutluhan Metin Date: Tue, 25 Jul 2023 20:27:55 +0300 Subject: [PATCH 2/8] Fix min kube version validation (#286) * fixes https://github.com/operator-framework/operator-sdk/issues/5995 * fix comment change * fix imports Upstream-repository: api Upstream-commit: fdfcb35e6d330fca94841b113c8140cf58930e35 Signed-off-by: Steve Kuznetsov --- pkg/manifests/csv.yaml | 4 +-- staging/api/pkg/validation/internal/csv.go | 15 +++++++++ .../api/pkg/validation/internal/csv_test.go | 13 +++++++- .../pkg/validation/internal/operatorhub.go | 2 +- .../validation/internal/operatorhub_test.go | 2 +- .../testdata/badAnnotationNames.csv.yaml | 1 + .../internal/testdata/badName.csv.yaml | 1 + .../testdata/correct.csv.empty.example.yaml | 1 + ...correct.csv.olm.properties.annotation.yaml | 1 + .../correct.csv.with.conversion.webhook.yaml | 1 + .../internal/testdata/correct.csv.yaml | 1 + .../testdata/dataTypeMismatch.csv.yaml | 1 + .../testdata/invalid.alm-examples.csv.yaml | 1 + .../invalid_min_kube_version.csv.yaml | 32 +++++++++++++++++++ .../internal/testdata/noInstallMode.csv.yaml | 1 + .../api/pkg/validation/internal/csv.go | 15 +++++++++ .../pkg/validation/internal/operatorhub.go | 2 +- 17 files changed, 88 insertions(+), 6 deletions(-) create mode 100644 staging/api/pkg/validation/internal/testdata/invalid_min_kube_version.csv.yaml diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 5ac3fb89b3..a47377ad16 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-c0ff8256acdd48c68b07e8c46376ef6ff28d218a + olm.version: 0.0.0-62d7be6699baacf83e06be64c8260a90377308dc olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-c0ff8256acdd48c68b07e8c46376ef6ff28d218a + version: 0.0.0-62d7be6699baacf83e06be64c8260a90377308dc apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/api/pkg/validation/internal/csv.go b/staging/api/pkg/validation/internal/csv.go index b5b7683c0c..f0c1853851 100644 --- a/staging/api/pkg/validation/internal/csv.go +++ b/staging/api/pkg/validation/internal/csv.go @@ -3,6 +3,7 @@ package internal import ( "encoding/json" "fmt" + "github.com/blang/semver/v4" "io" "reflect" "strings" @@ -45,6 +46,8 @@ func validateCSV(csv *v1alpha1.ClusterServiceVersion) errors.ManifestResult { result.Add(validateExamplesAnnotations(csv)...) // validate installModes result.Add(validateInstallModes(csv)...) + // validate min Kubernetes version + result.Add(validateMinKubeVersion(*csv)...) // check missing optional/mandatory fields. result.Add(checkFields(*csv)...) // validate case sensitive annotation names @@ -240,3 +243,15 @@ func validateVersionKind(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Err } return } + +// validateMinKubeVersion checks format of spec.minKubeVersion field +func validateMinKubeVersion(csv v1alpha1.ClusterServiceVersion) (errs []errors.Error) { + if len(strings.TrimSpace(csv.Spec.MinKubeVersion)) == 0 { + errs = append(errs, errors.WarnInvalidCSV(minKubeVersionWarnMessage, csv.GetName())) + } else { + if _, err := semver.Parse(csv.Spec.MinKubeVersion); err != nil { + errs = append(errs, errors.ErrInvalidCSV(fmt.Sprintf("csv.Spec.MinKubeVersion has an invalid value: %s", csv.Spec.MinKubeVersion), csv.GetName())) + } + } + return errs +} diff --git a/staging/api/pkg/validation/internal/csv_test.go b/staging/api/pkg/validation/internal/csv_test.go index 44f1ae8700..6925216aad 100644 --- a/staging/api/pkg/validation/internal/csv_test.go +++ b/staging/api/pkg/validation/internal/csv_test.go @@ -6,8 +6,9 @@ import ( "path/filepath" "testing" - "github.com/ghodss/yaml" operatorsv1alpha1 "github.com/operator-framework/api/pkg/operators/v1alpha1" + + "github.com/ghodss/yaml" "github.com/operator-framework/api/pkg/validation/errors" "k8s.io/apimachinery/pkg/runtime/schema" ) @@ -107,6 +108,16 @@ func TestValidateCSV(t *testing.T) { }, filepath.Join("testdata", "correct.csv.olm.properties.annotation.yaml"), }, + { + validatorFuncTest{ + description: "should fail when spec.minKubeVersion is not in semantic version format", + wantErr: true, + errors: []errors.Error{ + errors.ErrInvalidCSV(`csv.Spec.MinKubeVersion has an invalid value: 1.21`, "test-operator.v0.0.1"), + }, + }, + filepath.Join("testdata", "invalid_min_kube_version.csv.yaml"), + }, } for _, c := range cases { diff --git a/staging/api/pkg/validation/internal/operatorhub.go b/staging/api/pkg/validation/internal/operatorhub.go index f5da37a274..e82d102875 100644 --- a/staging/api/pkg/validation/internal/operatorhub.go +++ b/staging/api/pkg/validation/internal/operatorhub.go @@ -240,7 +240,7 @@ func checkSpecMinKubeVersion(checks CSVChecks) CSVChecks { if len(strings.TrimSpace(checks.csv.Spec.MinKubeVersion)) == 0 { checks.warns = append(checks.warns, fmt.Errorf(minKubeVersionWarnMessage)) } else { - if _, err := semver.ParseTolerant(checks.csv.Spec.MinKubeVersion); err != nil { + if _, err := semver.Parse(checks.csv.Spec.MinKubeVersion); err != nil { checks.errs = append(checks.errs, fmt.Errorf("csv.Spec.MinKubeVersion has an invalid value: %s", checks.csv.Spec.MinKubeVersion)) } } diff --git a/staging/api/pkg/validation/internal/operatorhub_test.go b/staging/api/pkg/validation/internal/operatorhub_test.go index 6e34062838..d8c049180f 100644 --- a/staging/api/pkg/validation/internal/operatorhub_test.go +++ b/staging/api/pkg/validation/internal/operatorhub_test.go @@ -218,7 +218,7 @@ func TestCheckSpecMinKubeVersion(t *testing.T) { }{ { name: "should work with a valid value", - args: args{minKubeVersion: "1.16"}, + args: args{minKubeVersion: "1.16.0"}, }, { name: "should return a warning when the minKubeVersion is not informed ", diff --git a/staging/api/pkg/validation/internal/testdata/badAnnotationNames.csv.yaml b/staging/api/pkg/validation/internal/testdata/badAnnotationNames.csv.yaml index af2c3e74fc..f95a02c6cb 100644 --- a/staging/api/pkg/validation/internal/testdata/badAnnotationNames.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/badAnnotationNames.csv.yaml @@ -14,6 +14,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: | etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd. diff --git a/staging/api/pkg/validation/internal/testdata/badName.csv.yaml b/staging/api/pkg/validation/internal/testdata/badName.csv.yaml index 582aa8d933..ad306cc26a 100644 --- a/staging/api/pkg/validation/internal/testdata/badName.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/badName.csv.yaml @@ -11,6 +11,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: something keywords: ['etcd', 'key value', 'database', 'coreos', 'open source'] diff --git a/staging/api/pkg/validation/internal/testdata/correct.csv.empty.example.yaml b/staging/api/pkg/validation/internal/testdata/correct.csv.empty.example.yaml index 2aa19870d8..6c1db26e85 100644 --- a/staging/api/pkg/validation/internal/testdata/correct.csv.empty.example.yaml +++ b/staging/api/pkg/validation/internal/testdata/correct.csv.empty.example.yaml @@ -8,6 +8,7 @@ metadata: annotations: "alm-examples": "" spec: + minKubeVersion: 1.21.0 version: 0.9.0 installModes: - type: AllNamespaces diff --git a/staging/api/pkg/validation/internal/testdata/correct.csv.olm.properties.annotation.yaml b/staging/api/pkg/validation/internal/testdata/correct.csv.olm.properties.annotation.yaml index 6794c5121e..2d9773a5e6 100644 --- a/staging/api/pkg/validation/internal/testdata/correct.csv.olm.properties.annotation.yaml +++ b/staging/api/pkg/validation/internal/testdata/correct.csv.olm.properties.annotation.yaml @@ -9,6 +9,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' olm.properties: '[{"type": "foo", "value": "bar"}]' spec: + minKubeVersion: 1.21.0 version: 0.9.0 installModes: - type: AllNamespaces diff --git a/staging/api/pkg/validation/internal/testdata/correct.csv.with.conversion.webhook.yaml b/staging/api/pkg/validation/internal/testdata/correct.csv.with.conversion.webhook.yaml index 2bef1ecb2d..fc791c472d 100644 --- a/staging/api/pkg/validation/internal/testdata/correct.csv.with.conversion.webhook.yaml +++ b/staging/api/pkg/validation/internal/testdata/correct.csv.with.conversion.webhook.yaml @@ -11,6 +11,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: | etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd. diff --git a/staging/api/pkg/validation/internal/testdata/correct.csv.yaml b/staging/api/pkg/validation/internal/testdata/correct.csv.yaml index 4dad396639..9ba9a487da 100644 --- a/staging/api/pkg/validation/internal/testdata/correct.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/correct.csv.yaml @@ -11,6 +11,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: | etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd. diff --git a/staging/api/pkg/validation/internal/testdata/dataTypeMismatch.csv.yaml b/staging/api/pkg/validation/internal/testdata/dataTypeMismatch.csv.yaml index a915b115c7..5c65ee045b 100644 --- a/staging/api/pkg/validation/internal/testdata/dataTypeMismatch.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/dataTypeMismatch.csv.yaml @@ -11,6 +11,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: | etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd. diff --git a/staging/api/pkg/validation/internal/testdata/invalid.alm-examples.csv.yaml b/staging/api/pkg/validation/internal/testdata/invalid.alm-examples.csv.yaml index 1d6bfc13bd..2eb8e9adb0 100644 --- a/staging/api/pkg/validation/internal/testdata/invalid.alm-examples.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/invalid.alm-examples.csv.yaml @@ -7,6 +7,7 @@ metadata: name: test-operator.v0.0.1 namespace: placeholder spec: + minKubeVersion: 1.21.0 displayName: test-operator install: strategy: deployment diff --git a/staging/api/pkg/validation/internal/testdata/invalid_min_kube_version.csv.yaml b/staging/api/pkg/validation/internal/testdata/invalid_min_kube_version.csv.yaml new file mode 100644 index 0000000000..a46f55ec79 --- /dev/null +++ b/staging/api/pkg/validation/internal/testdata/invalid_min_kube_version.csv.yaml @@ -0,0 +1,32 @@ +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: test-operator.v0.0.1 + namespace: placeholder +spec: + minKubeVersion: 1.21 + displayName: test-operator + install: + strategy: deployment + installModes: + - supported: true + type: OwnNamespace + - supported: true + type: SingleNamespace + - supported: false + type: MultiNamespace + - supported: true + type: AllNamespaces + keywords: + - test-operator + links: + - name: Test Operator + url: https://test-operator.domain + maintainers: + - email: your@email.com + name: Maintainer Name + maturity: alpha + provider: + name: Provider Name + url: https://your.domain + version: 0.0.1 \ No newline at end of file diff --git a/staging/api/pkg/validation/internal/testdata/noInstallMode.csv.yaml b/staging/api/pkg/validation/internal/testdata/noInstallMode.csv.yaml index f6d3e92977..db5eeae446 100644 --- a/staging/api/pkg/validation/internal/testdata/noInstallMode.csv.yaml +++ b/staging/api/pkg/validation/internal/testdata/noInstallMode.csv.yaml @@ -11,6 +11,7 @@ metadata: alm-examples: '[{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdCluster","metadata":{"name":"example","namespace":"default"},"spec":{"size":3,"version":"3.2.13"}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdRestore","metadata":{"name":"example-etcd-cluster"},"spec":{"etcdCluster":{"name":"example-etcd-cluster"},"backupStorageType":"S3","s3":{"path":"","awsSecret":""}}},{"apiVersion":"etcd.database.coreos.com/v1beta2","kind":"EtcdBackup","metadata":{"name":"example-etcd-cluster-backup"},"spec":{"etcdEndpoints":[""],"storageType":"S3","s3":{"path":"","awsSecret":""}}}]' description: etcd is a distributed key value store providing a reliable way to store data across a cluster of machines. spec: + minKubeVersion: 1.21.0 displayName: etcd description: | etcd is a distributed key value store that provides a reliable way to store data across a cluster of machines. It’s open-source and available on GitHub. etcd gracefully handles leader elections during network partitions and will tolerate machine failure, including the leader. Your applications can read and write data into etcd. diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/csv.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/csv.go index b5b7683c0c..f0c1853851 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/csv.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/csv.go @@ -3,6 +3,7 @@ package internal import ( "encoding/json" "fmt" + "github.com/blang/semver/v4" "io" "reflect" "strings" @@ -45,6 +46,8 @@ func validateCSV(csv *v1alpha1.ClusterServiceVersion) errors.ManifestResult { result.Add(validateExamplesAnnotations(csv)...) // validate installModes result.Add(validateInstallModes(csv)...) + // validate min Kubernetes version + result.Add(validateMinKubeVersion(*csv)...) // check missing optional/mandatory fields. result.Add(checkFields(*csv)...) // validate case sensitive annotation names @@ -240,3 +243,15 @@ func validateVersionKind(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Err } return } + +// validateMinKubeVersion checks format of spec.minKubeVersion field +func validateMinKubeVersion(csv v1alpha1.ClusterServiceVersion) (errs []errors.Error) { + if len(strings.TrimSpace(csv.Spec.MinKubeVersion)) == 0 { + errs = append(errs, errors.WarnInvalidCSV(minKubeVersionWarnMessage, csv.GetName())) + } else { + if _, err := semver.Parse(csv.Spec.MinKubeVersion); err != nil { + errs = append(errs, errors.ErrInvalidCSV(fmt.Sprintf("csv.Spec.MinKubeVersion has an invalid value: %s", csv.Spec.MinKubeVersion), csv.GetName())) + } + } + return errs +} diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go index f5da37a274..e82d102875 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/operatorhub.go @@ -240,7 +240,7 @@ func checkSpecMinKubeVersion(checks CSVChecks) CSVChecks { if len(strings.TrimSpace(checks.csv.Spec.MinKubeVersion)) == 0 { checks.warns = append(checks.warns, fmt.Errorf(minKubeVersionWarnMessage)) } else { - if _, err := semver.ParseTolerant(checks.csv.Spec.MinKubeVersion); err != nil { + if _, err := semver.Parse(checks.csv.Spec.MinKubeVersion); err != nil { checks.errs = append(checks.errs, fmt.Errorf("csv.Spec.MinKubeVersion has an invalid value: %s", checks.csv.Spec.MinKubeVersion)) } } From 62fcad2f6a06cba60d45d1e592ee673041c1fa7b Mon Sep 17 00:00:00 2001 From: Mikalai Radchuk Date: Fri, 28 Jul 2023 16:15:03 +0100 Subject: [PATCH 3/8] Makes codecov-action optional We do not want to fail the job if codecov fails to upload the report due to rate limiting. Signed-off-by: Mikalai Radchuk Upstream-repository: api Upstream-commit: 92e43415eb8799b2733cc2a98e667e0e7e8d39b8 Signed-off-by: Steve Kuznetsov --- pkg/manifests/csv.yaml | 4 ++-- staging/api/.github/workflows/go.yaml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index a47377ad16..7ec4b83b24 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-62d7be6699baacf83e06be64c8260a90377308dc + olm.version: 0.0.0-bcf4a022ee3aedf89c78865472b03e0e4517f8a7 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-62d7be6699baacf83e06be64c8260a90377308dc + version: 0.0.0-bcf4a022ee3aedf89c78865472b03e0e4517f8a7 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/api/.github/workflows/go.yaml b/staging/api/.github/workflows/go.yaml index 2da8edbf35..a9d155e57d 100644 --- a/staging/api/.github/workflows/go.yaml +++ b/staging/api/.github/workflows/go.yaml @@ -33,7 +33,6 @@ jobs: - uses: codecov/codecov-action@v3 with: files: cover.out - fail_ci_if_error: true functionalities: fixes go-apidiff: From 95680747c806c53c422b0c323f614194082151e3 Mon Sep 17 00:00:00 2001 From: Jordan Keister Date: Tue, 1 Aug 2023 09:24:00 -0500 Subject: [PATCH 4/8] ignore vendor dir (#1132) Signed-off-by: Jordan Keister Upstream-repository: operator-registry Upstream-commit: a71ca092204961ad1ede3db1079a7ac50439a1c3 Signed-off-by: Steve Kuznetsov --- pkg/manifests/csv.yaml | 4 ++-- staging/operator-registry/.gitignore | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 7ec4b83b24..fcb629be03 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-bcf4a022ee3aedf89c78865472b03e0e4517f8a7 + olm.version: 0.0.0-bf6cb154ac7948026535350f0e1c849372c56196 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-bcf4a022ee3aedf89c78865472b03e0e4517f8a7 + version: 0.0.0-bf6cb154ac7948026535350f0e1c849372c56196 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/operator-registry/.gitignore b/staging/operator-registry/.gitignore index e8d67186f6..e36468cc81 100644 --- a/staging/operator-registry/.gitignore +++ b/staging/operator-registry/.gitignore @@ -473,3 +473,6 @@ certs/* # ignore temp artifacts of building images pkg/lib/indexer/index.Dockerfile* +# ignore vendor since we don't commit it +vendor/* + From 61341bba1bc3979414d7430498c14bdb2ae03e8d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Aug 2023 13:52:20 +0200 Subject: [PATCH 5/8] Bump github.com/docker/docker (#2994) Bumps [github.com/docker/docker](https://github.com/docker/docker) from 23.0.1+incompatible to 23.0.3+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v23.0.1...v23.0.3) Upstream-repository: operator-lifecycle-manager Upstream-commit: a7e3f3fba29a6b65695a96cc073a077f0058ab84 --- updated-dependencies: - dependency-name: github.com/docker/docker dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Signed-off-by: Steve Kuznetsov --- go.mod | 2 +- go.sum | 4 ++-- pkg/manifests/csv.yaml | 4 ++-- staging/operator-lifecycle-manager/go.mod | 2 +- staging/operator-lifecycle-manager/go.sum | 4 ++-- vendor/modules.txt | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 93e82483f0..95764df905 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,7 @@ require ( github.com/distribution/distribution v2.7.1+incompatible // indirect github.com/docker/cli v23.0.1+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v23.0.1+incompatible // indirect + github.com/docker/docker v23.0.3+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect diff --git a/go.sum b/go.sum index 4b95109810..7bcffd9de7 100644 --- a/go.sum +++ b/go.sum @@ -185,8 +185,8 @@ github.com/docker/cli v23.0.1+incompatible h1:LRyWITpGzl2C9e9uGxzisptnxAn1zfZKXy github.com/docker/cli v23.0.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v0.0.0-20191216044856-a8371794149d h1:jC8tT/S0OGx2cswpeUTn4gOIea8P08lD3VFQT0cOZ50= github.com/docker/distribution v0.0.0-20191216044856-a8371794149d/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/docker v23.0.1+incompatible h1:vjgvJZxprTTE1A37nm+CLNAdwu6xZekyoiVlUZEINcY= -github.com/docker/docker v23.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= +github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index fcb629be03..17c4a8c495 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-bf6cb154ac7948026535350f0e1c849372c56196 + olm.version: 0.0.0-7b1fd73aa35a79a5766541029762ec59ef9eab29 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-bf6cb154ac7948026535350f0e1c849372c56196 + version: 0.0.0-7b1fd73aa35a79a5766541029762ec59ef9eab29 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index 66cd3d1558..2636ce5f16 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -89,7 +89,7 @@ require ( github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/docker/cli v23.0.1+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v23.0.1+incompatible // indirect + github.com/docker/docker v23.0.3+incompatible // indirect github.com/docker/docker-credential-helpers v0.7.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-metrics v0.0.1 // indirect diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index ae6760a140..1b7d89d14a 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -185,8 +185,8 @@ github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m3 github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker v23.0.1+incompatible h1:vjgvJZxprTTE1A37nm+CLNAdwu6xZekyoiVlUZEINcY= -github.com/docker/docker v23.0.1+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= +github.com/docker/docker v23.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= diff --git a/vendor/modules.txt b/vendor/modules.txt index 72d4433ec3..328516a2bd 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -192,7 +192,7 @@ github.com/docker/distribution/registry/client/auth/challenge github.com/docker/distribution/registry/client/transport github.com/docker/distribution/registry/storage/cache github.com/docker/distribution/registry/storage/cache/memory -# github.com/docker/docker v23.0.1+incompatible +# github.com/docker/docker v23.0.3+incompatible ## explicit github.com/docker/docker/api/types github.com/docker/docker/api/types/blkiodev From 8fba31d809a3c2fdd85ea4fbf044d66c7dcb80aa Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Thu, 3 Aug 2023 10:12:23 -0400 Subject: [PATCH 6/8] operators/v1alpha1: expose CSV copied logic (#289) We want to use a partial object metadata query for CSVs to reduce resource utilization. We still want to ask questions about whether these CSVs are copied, so we need to refactor this method to take only object metadata. While it's not a perfect port of the previous logic, it defies explanation how an object would have all the other markings of being copied but the wrong status. Signed-off-by: Steve Kuznetsov Upstream-repository: api Upstream-commit: 409ec70c6c889945acb0447397305aa5c2150ea2 Signed-off-by: Steve Kuznetsov --- pkg/manifests/csv.yaml | 4 +- .../v1alpha1/clusterserviceversion.go | 15 +++-- .../v1alpha1/clusterserviceversion_test.go | 65 +++++++++++++++++++ .../v1alpha1/clusterserviceversion.go | 15 +++-- 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 17c4a8c495..4aafcd893f 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-7b1fd73aa35a79a5766541029762ec59ef9eab29 + olm.version: 0.0.0-6e63ad61683d27bae6a357eb473fb3067a4c73e6 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-7b1fd73aa35a79a5766541029762ec59ef9eab29 + version: 0.0.0-6e63ad61683d27bae6a357eb473fb3067a4c73e6 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/api/pkg/operators/v1alpha1/clusterserviceversion.go b/staging/api/pkg/operators/v1alpha1/clusterserviceversion.go index ffc357b12b..a4c8d17469 100644 --- a/staging/api/pkg/operators/v1alpha1/clusterserviceversion.go +++ b/staging/api/pkg/operators/v1alpha1/clusterserviceversion.go @@ -120,12 +120,19 @@ func (c *ClusterServiceVersion) IsObsolete() bool { // IsCopied returns true if the CSV has been copied and false otherwise. func (c *ClusterServiceVersion) IsCopied() bool { - operatorNamespace, ok := c.GetAnnotations()[OperatorGroupNamespaceAnnotationKey] - if c.Status.Reason == CSVReasonCopied || ok && c.GetNamespace() != operatorNamespace { - return true + return c.Status.Reason == CSVReasonCopied || IsCopied(c) +} + +func IsCopied(o metav1.Object) bool { + annotations := o.GetAnnotations() + if annotations != nil { + operatorNamespace, ok := annotations[OperatorGroupNamespaceAnnotationKey] + if ok && o.GetNamespace() != operatorNamespace { + return true + } } - if labels := c.GetLabels(); labels != nil { + if labels := o.GetLabels(); labels != nil { if _, ok := labels[CopiedLabelKey]; ok { return true } diff --git a/staging/api/pkg/operators/v1alpha1/clusterserviceversion_test.go b/staging/api/pkg/operators/v1alpha1/clusterserviceversion_test.go index 26136c99d9..0f73c906b4 100644 --- a/staging/api/pkg/operators/v1alpha1/clusterserviceversion_test.go +++ b/staging/api/pkg/operators/v1alpha1/clusterserviceversion_test.go @@ -430,3 +430,68 @@ func helperNewConditions(count int) []ClusterServiceVersionCondition { return conditions } + +func TestIsCopied(t *testing.T) { + var testCases = []struct { + name string + input metav1.Object + expected bool + }{ + { + name: "no labels or annotations", + input: &metav1.ObjectMeta{}, + expected: false, + }, + { + name: "no labels, has annotations but missing operatorgroup namespace annotation", + input: &metav1.ObjectMeta{ + Annotations: map[string]string{}, + }, + expected: false, + }, + { + name: "no labels, has operatorgroup namespace annotation matching self", + input: &metav1.ObjectMeta{ + Namespace: "whatever", + Annotations: map[string]string{ + "olm.operatorNamespace": "whatever", + }, + }, + expected: false, + }, + { + name: "no labels, has operatorgroup namespace annotation not matching self", + input: &metav1.ObjectMeta{ + Namespace: "whatever", + Annotations: map[string]string{ + "olm.operatorNamespace": "other", + }, + }, + expected: true, + }, + { + name: "no annotations, labels missing copied key", + input: &metav1.ObjectMeta{ + Labels: map[string]string{}, + }, + expected: false, + }, + { + name: "no annotations, labels has copied key", + input: &metav1.ObjectMeta{ + Labels: map[string]string{ + "olm.copiedFrom": "whatever", + }, + }, + expected: true, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.name, func(t *testing.T) { + if got, expected := IsCopied(testCase.input), testCase.expected; got != expected { + t.Errorf("got %v, expected %v", got, expected) + } + }) + } +} diff --git a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion.go b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion.go index ffc357b12b..a4c8d17469 100644 --- a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion.go +++ b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/clusterserviceversion.go @@ -120,12 +120,19 @@ func (c *ClusterServiceVersion) IsObsolete() bool { // IsCopied returns true if the CSV has been copied and false otherwise. func (c *ClusterServiceVersion) IsCopied() bool { - operatorNamespace, ok := c.GetAnnotations()[OperatorGroupNamespaceAnnotationKey] - if c.Status.Reason == CSVReasonCopied || ok && c.GetNamespace() != operatorNamespace { - return true + return c.Status.Reason == CSVReasonCopied || IsCopied(c) +} + +func IsCopied(o metav1.Object) bool { + annotations := o.GetAnnotations() + if annotations != nil { + operatorNamespace, ok := annotations[OperatorGroupNamespaceAnnotationKey] + if ok && o.GetNamespace() != operatorNamespace { + return true + } } - if labels := c.GetLabels(); labels != nil { + if labels := o.GetLabels(); labels != nil { if _, ok := labels[CopiedLabelKey]; ok { return true } From 89c9cb7a109d1b8bd2c258c2d12dbaff64b022ae Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Thu, 3 Aug 2023 11:28:44 -0400 Subject: [PATCH 7/8] CatalogSource: add configurations for gRPC server memory footprint (#288) Signed-off-by: Steve Kuznetsov Upstream-repository: api Upstream-commit: 704ae942c4a9a33a3326a7da9364bc59f20ae532 Signed-off-by: Steve Kuznetsov --- manifests/0000_50_olm_00-catalogsources.crd.yaml | 7 +++++++ pkg/manifests/csv.yaml | 4 ++-- .../operators.coreos.com_catalogsources.yaml | 7 +++++++ staging/api/crds/zz_defs.go | 2 +- .../operators/v1alpha1/catalogsource_types.go | 16 ++++++++++++++++ .../operators/v1alpha1/zz_generated.deepcopy.go | 5 +++++ .../operators.coreos.com_catalogsources.yaml | 7 +++++++ .../operator-framework/api/crds/zz_defs.go | 2 +- .../operators/v1alpha1/catalogsource_types.go | 16 ++++++++++++++++ .../operators/v1alpha1/zz_generated.deepcopy.go | 5 +++++ 10 files changed, 67 insertions(+), 4 deletions(-) diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml index 37d2d38a53..8b6a6a6888 100644 --- a/manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -534,6 +534,13 @@ spec: topologyKey: description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string + memoryTarget: + description: "MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod will have the following modifications made to the container running the server: - the $GOMEMLIMIT environment variable will be set to this value in bytes - the memory request will be set to this value - the memory limit will be set to 200% of this value \n This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if a catalog being served is very large and needs more than the default allocation. If your index image has a file- system cache, determine a good approximation for this value by doubling the size of the package cache at /tmp/cache/cache/packages.json in the index image. \n This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set." + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true nodeSelector: description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. type: object diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 4aafcd893f..44b1c4e487 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-6e63ad61683d27bae6a357eb473fb3067a4c73e6 + olm.version: 0.0.0-ee4bc498873f18daef46f5b1e443f5abdb9732c9 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-6e63ad61683d27bae6a357eb473fb3067a4c73e6 + version: 0.0.0-ee4bc498873f18daef46f5b1e443f5abdb9732c9 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/api/crds/operators.coreos.com_catalogsources.yaml b/staging/api/crds/operators.coreos.com_catalogsources.yaml index e42010c7ad..c3e2f6ce18 100644 --- a/staging/api/crds/operators.coreos.com_catalogsources.yaml +++ b/staging/api/crds/operators.coreos.com_catalogsources.yaml @@ -532,6 +532,13 @@ spec: topologyKey: description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string + memoryTarget: + description: "MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod will have the following modifications made to the container running the server: - the $GOMEMLIMIT environment variable will be set to this value in bytes - the memory request will be set to this value - the memory limit will be set to 200% of this value \n This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if a catalog being served is very large and needs more than the default allocation. If your index image has a file- system cache, determine a good approximation for this value by doubling the size of the package cache at /tmp/cache/cache/packages.json in the index image. \n This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set." + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true nodeSelector: description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. type: object diff --git a/staging/api/crds/zz_defs.go b/staging/api/crds/zz_defs.go index 6a98bd4bd7..a391fce34b 100644 --- a/staging/api/crds/zz_defs.go +++ b/staging/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfb\x73\xdc\x36\x92\xff\xef\xfe\x2b\xba\xf4\xfd\x56\x49\xca\xcd\x50\x76\xb2\x95\xdb\xd5\xe6\x51\x5a\x39\xce\xa9\x12\xdb\x2a\xcb\xc9\xd6\xad\xe5\x3b\x63\xc8\x1e\x0e\x22\x12\x60\x00\x50\xf2\x24\x95\xff\xfd\xaa\x1b\x00\xc9\x79\x3f\x64\xc7\x76\x2d\xf9\x8b\x35\x24\x9e\x8d\x46\xf7\xa7\x1f\x80\x45\x25\x7f\x46\x63\xa5\x56\xa7\x20\x2a\x89\x6f\x1d\x2a\xfa\x65\x93\x9b\xbf\xda\x44\xea\x93\xdb\x47\x0f\x6e\xa4\xca\x4e\xe1\xbc\xb6\x4e\x97\x2f\xd0\xea\xda\xa4\xf8\x18\xc7\x52\x49\x27\xb5\x7a\x50\xa2\x13\x99\x70\xe2\xf4\x01\x80\x50\x4a\x3b\x41\xaf\x2d\xfd\x04\x48\xb5\x72\x46\x17\x05\x9a\x61\x8e\x2a\xb9\xa9\x47\x38\xaa\x65\x91\xa1\xe1\xc6\x63\xd7\xb7\x0f\x93\xbf\x25\x0f\x1f\x00\xa4\x06\xb9\xfa\x4b\x59\xa2\x75\xa2\xac\x4e\x41\xd5\x45\xf1\x00\x40\x89\x12\x4f\x21\x15\x4e\x14\x3a\xf7\x83\xb0\x89\xae\xd0\x08\xa7\x8d\x4d\x52\x6d\x50\xd3\x3f\xe5\x03\x5b\x61\x4a\xbd\xe7\x46\xd7\xd5\x29\x2c\x2d\xe3\xdb\x8b\x83\x14\x0e\x73\x6d\x64\xfc\x0d\x30\x04\x5d\x94\xfc\x77\x98\xbc\xef\xf6\x8a\xbb\xe5\xf7\x85\xb4\xee\x87\xc5\x6f\x3f\x4a\xeb\xf8\x7b\x55\xd4\x46\x14\xf3\x03\xe6\x4f\x76\xa2\x8d\x7b\xd6\x76\x4f\xdd\xa5\xc2\x59\x93\xfa\xcf\x52\xe5\x75\x21\xcc\x5c\xdd\x07\x00\x36\xd5\x15\x9e\x02\x57\xad\x44\x8a\xd9\x03\x80\x40\xc2\xd0\xd4\x10\x44\x96\xf1\xb2\x88\xe2\xd2\x48\xe5\xd0\x9c\xeb\xa2\x2e\x55\xd3\x15\x95\xc9\xd0\xa6\x46\x56\x8e\x49\xff\x72\x82\x50\x19\x74\x6e\xca\x24\x01\x3d\x06\x37\xc1\xd8\x77\x53\x0b\xe0\x17\xab\xd5\xa5\x70\x93\x53\x48\x88\xc2\x49\x26\x6d\x55\x88\x29\x8d\xa6\x53\xca\x2f\xd3\x63\xff\xad\xf3\xde\x4d\x69\xe8\xd6\x19\xa9\xf2\x75\x43\xa1\x72\xdb\x8f\xc1\x93\xe6\xe5\xb4\x5a\x1c\xc2\xdc\xcb\x6d\xfb\xaf\xea\x51\x21\xed\x04\xcd\xf6\x83\x68\xaa\x2c\x8c\xe1\x72\xc9\x97\x15\x03\xe9\x34\x1a\x37\x54\xb2\xb0\x19\x16\x3a\x38\xcb\x17\xe7\x98\x09\x17\x5f\xfa\x42\xb7\x8f\x44\x51\x4d\xc4\xa3\xf0\xd2\xa6\x13\x2c\x45\xcb\x0f\xba\x42\x75\x76\x79\xf1\xf3\x17\x57\x73\x1f\x60\x96\x3a\x33\x7c\x0e\xd2\x82\x00\x83\x95\xb6\xd2\x69\x33\x25\x6a\x9d\x5f\xfd\x6c\x07\x70\xfe\xe2\xb1\x1d\x80\x50\x59\xb3\xf1\xa0\x12\xe9\x8d\xc8\xd1\x26\x0b\x63\xd5\xa3\x5f\x30\x75\x9d\xd7\x06\x7f\xad\xa5\xc1\xac\x3b\x0a\x22\x4f\xa4\xc9\xdc\x6b\xa2\x7f\xe7\x55\x65\xa8\x4f\xd7\xd9\xc8\xfe\xe9\x48\xb9\x99\xf7\x73\x33\x3c\x24\x32\xf8\x72\x90\x91\x80\x43\xcb\x2c\x10\xf6\x18\x66\x81\x76\x9e\x35\xa4\xa5\xf9\x1b\xb4\xa8\xbc\xc8\xa3\xd7\x42\x85\x39\x25\x70\x85\x86\x2a\xd2\x76\xaf\x8b\x8c\x24\xe1\x2d\x1a\x07\x06\x53\x9d\x2b\xf9\x5b\xd3\x9a\x05\xa7\xb9\x9b\x42\x38\xb4\x0e\x78\xd7\x2a\x51\xc0\xad\x28\x6a\xf4\xa4\x2c\xc5\x14\x0c\x52\xbb\x50\xab\x4e\x0b\x5c\xc4\x26\xf0\x54\x1b\x04\xa9\xc6\xfa\x14\x26\xce\x55\xf6\xf4\xe4\x24\x97\x2e\xca\xf0\x54\x97\x65\xad\xa4\x9b\x9e\xb0\x38\x96\xa3\x9a\xc4\xe1\x49\x86\xb7\x58\x9c\x58\x99\x0f\x85\x49\x27\xd2\x61\xea\x6a\x83\x27\xa2\x92\x43\x1e\xac\x62\x39\x9e\x94\xd9\xff\x33\x41\xea\xdb\xc3\x39\xf2\x2d\x65\x66\x88\x62\x73\x2d\xad\x49\x78\x7a\x2e\xf2\xd5\xfd\x5c\x5a\x92\xd2\x2b\xa2\xca\x8b\xef\xae\x5e\x42\x1c\x80\x27\xbb\xa7\x70\x5b\xd4\xb6\xc4\x26\x42\x49\x35\x46\xe3\x4b\x8e\x8d\x2e\xb9\x15\x54\x59\xa5\xa5\x72\x7e\x4b\x17\x12\x95\x03\x5b\x8f\x4a\xe9\x2c\xf3\x1c\x5a\x47\xeb\x90\xc0\x39\xab\x30\x18\x21\xd4\x15\xed\xa4\x2c\x81\x0b\x05\xe7\xa2\xc4\xe2\x5c\x58\x7c\xef\xa4\x26\x8a\xda\x21\x91\x6f\x7b\x62\x77\x35\xf0\x62\x85\x85\x3d\x06\x10\x35\xe4\x56\x85\x57\x6d\x4a\xf0\x3b\x70\x99\x04\x86\x35\x7b\x91\x1e\x91\x65\x06\xed\x92\x0f\x0b\x1b\xd2\x17\xf4\x7c\x32\xd1\x96\xd6\x4f\x38\x78\xfe\xe3\x53\x48\x85\x82\xda\x22\x6d\x9e\x54\x2b\x45\x0c\xe1\x34\x08\xd2\x65\x43\x7c\x2b\x2d\x33\x90\xc1\x5c\x5a\x67\xa6\x09\x3c\xd1\xa6\x14\xee\x14\xbe\x8a\xaf\x86\xdc\x9c\x36\x20\xab\x6f\x4e\xbf\xaa\xb4\x71\xdf\xc0\x73\x55\x4c\xa9\xd1\x0c\xee\x26\xa8\xe0\xaa\x99\x1b\x7c\xdd\xf9\xf1\xbd\xa9\xd2\x04\x2e\x72\xa5\x4d\x2c\x49\x5c\x75\x51\x8a\x1c\x61\x2c\xb1\x60\xbe\xb6\xe8\x92\xf9\x15\x5c\xbb\x8a\xe0\xe1\xd2\x58\xe6\x4f\x45\xb5\x91\x34\xe7\xb1\x24\xf5\x45\xdd\x77\x95\x77\xfb\xd1\x69\x66\x65\x9a\x12\xfd\x29\xd2\x1b\x10\xa1\x97\x52\x54\x43\xcb\xdb\xa6\x43\xa6\xed\x28\x70\x1e\x1b\x20\xfa\xb5\xaf\x2f\x82\xe4\x4a\x76\x9d\x76\x77\x66\x3b\xd7\x6d\x61\xc8\x46\xa2\x3d\x5d\xa6\x45\xb6\xe8\x23\x37\x55\x7a\xa9\x33\x3f\xed\x8d\xbd\x7c\xdf\x2d\x0d\xf8\xb6\xd2\x16\x2d\x64\x72\x3c\x46\x43\x72\x47\xdf\xa2\x31\x32\x43\x0b\x63\x6d\x78\xbd\x2a\x9d\xf1\x9e\x6c\xd6\x6f\x46\xd5\x5e\xea\x6c\xdb\x85\xa1\xae\x59\x61\x78\x66\x0c\x6c\xb8\x72\xba\x4b\x77\x3b\x6c\xd8\xbc\xf4\x88\x31\xc3\xff\xe9\xf2\xaf\x73\xf4\x38\x0b\x85\x23\xa7\x06\x44\x15\x44\xc7\xa1\xa5\xe9\x1f\xda\xa6\xcd\x65\xc3\xdd\x62\xc8\xdb\x0c\x9b\x1e\xa5\x33\x3c\xdb\x30\xfc\x85\x29\x3c\xe6\x1f\x23\xb4\x5c\xbd\x19\x2a\x6b\xf0\xac\x2e\x58\xd4\xd4\xc5\xec\x8a\xae\x9a\xc7\x96\x73\xd9\x76\x3e\xbe\x1c\x8e\xd1\x18\xcc\x1e\xd7\xc4\xbf\x57\xcd\xa8\x82\x90\xf2\xaf\xbf\x7b\x8b\x69\xbd\x6a\x8f\xad\x9c\x3a\x81\xe2\x30\x4d\x34\x70\x27\x8b\x22\x74\x47\x02\x25\x7e\xa0\xf9\x32\x8e\x21\xf2\x58\x2f\xa4\xad\x70\xd2\x8e\xa7\x4c\x8e\x86\x60\xf8\x96\x74\x36\x5b\x2c\xcc\xf1\x72\x2c\x31\x83\xd1\x34\xa8\x6b\x12\x9e\x03\x18\xd5\x0e\xa4\x63\x5d\x9e\x4e\xb4\xb6\x08\xc2\xd3\x9d\xdb\xbd\x95\x9a\x91\x12\x68\x85\x24\x7f\x4a\x52\xc8\x61\xe3\x74\x9a\x4f\x78\xe4\x6d\x35\x69\xa1\x24\x89\xdf\xd0\x2a\xb2\x23\x35\x73\x27\xdd\x84\x7f\xe4\x04\xb9\x09\x85\xd9\xba\xa4\x46\xef\x50\xe6\x13\x67\x07\x20\x13\x4c\x78\x75\x51\xa4\x93\x4e\xb3\x25\xa2\xb3\x20\x8a\x22\x0e\xa1\xcb\x12\x5e\x6f\x96\x04\x51\xe0\xa8\xc1\x30\x01\x6f\x0c\x1a\xbd\x3a\xbf\x6a\x4b\xc9\x35\x00\x74\x69\x72\x3c\x80\x54\x97\x55\xed\x88\x26\x34\xc6\xd1\x14\xa4\x23\x9c\xed\xf1\x92\xd1\x75\xee\x67\x82\x45\xe8\x38\x82\x55\xaf\x99\x48\x38\x90\x8d\xa8\x72\x38\xf0\x93\x3b\x88\xf8\x93\x9a\x93\x7e\x12\x3c\xbf\x52\xb8\x74\x12\x20\x70\xaa\x8d\x41\x5b\x69\xc5\x35\xf9\xcb\x77\xed\xd8\xfe\xde\x54\x3a\xb2\xc7\x2d\x31\x27\x32\x9f\x44\x5a\x0a\x83\xfc\x6e\x76\x0d\xd6\xed\x91\x76\x9f\x08\x63\x66\x6c\xc9\x65\x8f\x74\x58\x6e\xd8\x25\x0b\xac\x7d\xa6\x00\xcb\xca\x4d\x3b\x3c\xd1\x59\x3d\x87\xa6\x6c\x68\xc0\x0b\xcc\xdb\xd5\xfa\xf9\xc9\xb2\x2a\x64\x2a\x5d\xe0\x10\x78\x08\x47\xcc\x22\xd2\x91\x28\x03\xa5\x87\xba\x3a\x4e\xe0\x8c\xdd\x17\x5b\x74\xa0\x74\xd3\x7e\x68\x88\x3a\xb5\xba\x6d\x6b\xe3\xdc\xb6\x14\x2a\xfe\x59\x8d\xe9\x16\x9f\x61\x18\x3f\xaa\x74\x1e\xe5\x2d\x2f\xee\x69\xb2\xb1\xe8\xb6\xe2\x2d\x96\x8e\x63\xd8\xa6\xf4\xfc\x52\x7b\x96\xb6\x58\x60\x4a\x26\x29\xd1\x7e\x00\xc2\x5a\x9d\x4a\x42\xf9\x2d\xd3\xce\x72\xba\x9f\xc9\x66\xda\xc3\xae\xf4\x87\x9d\xe7\x4f\xcf\xfc\xc6\xdb\xb6\xde\x02\x35\x0a\x49\xe0\x77\x3c\x47\x95\x19\x81\x35\x9a\xf2\xd7\x43\x0b\x85\x18\x61\x61\xb7\x23\x02\xec\xb4\x6b\xdb\x67\xcb\xfd\xbb\x72\x42\x2b\x27\x12\x6c\xcc\x66\xe1\x49\x68\x93\x6d\x26\xa4\xb2\xc1\x7e\x1e\x80\x80\x1b\x9c\x7a\x53\x9b\x2c\xf8\xe8\xb8\xe0\xc2\x06\xbd\xba\x21\xe6\xb8\xc1\x29\x17\x0a\x76\xf7\x0e\xc3\xdd\x99\x39\xfc\xb3\xcb\x36\x6d\x9f\x21\x0d\x74\xc7\x1a\x71\xd2\x3b\x54\xdb\x9d\x7f\xfd\x73\x83\x6b\x91\xd7\xb2\x67\x01\x92\x30\x4f\xf2\x7a\xf0\x22\xb1\xfe\x8a\x6b\x2c\xaa\xaa\x90\xc8\xf6\xfc\x8e\xdd\xac\xb5\x02\xd6\x3d\x91\x7a\xf7\x9a\xd7\x8b\xc6\xa1\xe1\x19\xf2\xd0\x7a\xe6\xa3\x9d\x3e\x91\x95\xb7\x6f\x2d\xf2\xc6\x8d\x9e\x9f\x9f\x45\x21\x5b\x57\x9b\x65\x3d\x7b\xa1\x06\xf0\x4c\x3b\xfa\xe7\x3b\xb2\x84\xed\x00\x1e\x6b\xb4\xcf\xb4\xe3\x9f\x09\x7c\xef\x3c\xaf\xff\xb8\xa5\x64\x7b\x07\x04\xf2\xe3\xbd\x17\x79\xce\x94\x97\x29\x34\xfd\xae\xcf\xc8\x26\x70\xe1\x61\x4b\xb3\x71\xa5\x85\x0b\x45\xe0\x30\x90\x81\xbd\x78\x5c\x36\x34\x51\xd6\x96\x9d\x3c\x4a\xab\x21\x63\x80\xa5\x6d\x78\xea\x51\x3b\x5d\xfa\xad\x69\x6e\x75\x53\xdf\xb3\xaf\xe1\xc7\x95\x95\x27\xe2\x96\x21\x9d\x54\x79\xd1\x80\xb7\x01\xdc\x4d\x64\x3a\xf1\xa8\x7b\x84\xde\x35\x58\x19\x24\x85\x25\x2c\x89\x2a\x7a\x93\xa3\x21\xb0\x2b\x63\x7b\xde\x31\x59\x88\x14\x33\xc8\x18\x5a\x7a\x27\x9b\x70\x98\xcb\x14\x4a\x34\x39\x42\x45\x9a\x64\xbf\xd5\xdf\x4d\xb0\xfb\x67\x67\xf1\xde\xed\x70\x27\x76\x63\x15\xf9\x84\xb0\xee\x9f\xa4\x1d\x19\x57\xf7\xda\xb1\xd7\x8e\x73\x4f\xaf\x1d\x9b\xa7\xd7\x8e\x1b\x9e\x5e\x3b\xf6\xda\xf1\xbd\x6b\x47\x6f\xcb\xee\x61\x3c\xff\xd3\xbb\x38\xe6\xad\x65\xd6\xb4\x31\x4c\x37\x6b\x36\x93\xbe\xb9\x0a\x02\xe7\x25\x9b\xda\xd2\x07\x49\x8c\x50\x39\xc2\xa3\xe1\xa3\x87\x0f\x77\x31\xaa\xc3\x42\x6e\x55\x63\x1c\x22\x3d\x52\xb9\x2f\x3e\x5f\x5b\x63\x95\xff\xed\x1d\x78\x4d\x03\x8f\x37\x8e\xbc\x19\xec\xb0\xc2\xf1\xc9\xd2\x49\x69\x07\x25\x3a\x10\x6e\xc6\x55\x24\x4b\x1c\x34\xa1\x02\x66\xf8\x10\xa5\x8c\x1e\xd8\x0c\xb4\x0a\x7e\x3c\x22\x7e\xb2\xdf\x08\x52\x14\x3e\xa4\x36\xc2\x66\x14\xba\xa4\x5e\xa5\x72\x71\xbb\xd0\x10\x30\x52\x05\x8e\x30\xc9\x13\xc8\x6a\xae\x26\x54\x08\x9b\x1e\xfb\xd1\xda\xa9\x75\x58\xb2\x27\x57\x1b\xfe\x87\x86\xed\xcc\x94\x0a\xe3\x2d\x2a\x57\x8b\xa2\x98\x02\xde\xca\xd4\x35\xf3\xe3\xa8\xad\x74\xde\xd9\xbe\x9d\x8b\x70\x2b\xe8\xb0\x3d\x5c\x18\x2e\x70\xb0\xdd\x50\x67\x17\x6d\xbf\xd0\xf6\x36\x7b\x72\x4e\x17\xfa\x99\x24\x2b\xc1\xaa\xa3\x76\xbd\x0f\x9c\xff\x64\xe6\x7a\xfe\x62\xb3\xcb\x15\x76\x96\x64\x3b\x48\xaf\x79\x58\x5a\x17\x05\x31\x86\xf7\xc2\x2e\x4e\x60\x89\x77\xd4\x4f\x69\x86\x99\xbd\xe3\xdd\xbb\x98\xcf\x9e\x3d\x26\xaa\x50\x99\x97\xba\xd2\x85\xce\xa7\x5d\x4a\xfb\xf4\x22\x59\x56\xd1\x39\x2e\xc0\xd6\xa3\x00\x1a\x88\xfd\x9e\xcd\x2d\x4d\xef\xf9\xeb\x3d\x7f\xbd\x6d\xb3\xf0\xf4\xb6\x4d\xf3\xf4\xb6\xcd\x86\xa7\xb7\x6d\x7a\xdb\xa6\xf7\xfc\x41\xaf\x1d\xd7\xd0\xa4\xd7\x8e\xd0\x6b\xc7\x95\xf3\xea\xb5\xe3\x5a\xf2\xf4\xda\xb1\xd7\x8e\xcb\x9e\x4a\x67\xf7\x48\x74\xac\x74\xb6\x26\xcf\xd1\x7b\x7d\x52\x3d\x2c\x74\x2a\x5c\xc8\xcb\xa7\x2a\xc1\xcf\x67\x45\xe9\x1d\x51\x03\xf8\x4d\x2b\xf4\xc9\x6b\xb4\x36\xec\x4e\xd2\x6e\x82\x86\x8a\x1f\xd9\xe3\xb5\x89\x4d\x7d\x9e\x64\x9f\x27\xf9\xd1\xe7\x49\x4e\x84\xf5\xeb\xea\x85\xd2\xea\xb4\xc9\xce\x86\x7c\x89\xa6\xfc\x44\xb3\x26\x89\x5d\xc2\x72\xf3\x89\xa7\x76\x49\xfd\xcc\xb3\x10\x2f\xc0\xec\x72\x76\xbe\x01\x2f\xf3\xa4\x44\x96\x61\x06\x15\x9a\xa1\x67\x11\x0d\x63\xa9\xb2\x25\x73\x8d\xf4\xf9\xa0\xd9\x8f\xb3\xf3\xf8\x80\x29\x90\xb3\x03\xd9\xc3\xe7\xda\x75\x1c\xcf\x48\xf8\x8f\x22\x21\x72\x57\x54\x3f\x04\x17\x9c\xbc\x3f\x6c\x89\xeb\x77\x87\xe6\x0c\xa8\xa3\x4b\x78\x7f\xbb\x92\x61\xf9\xaf\x35\x9a\x29\x9f\xff\x68\x01\x6b\x73\xb6\x2e\xc4\xc8\xa4\x85\x54\x58\xaf\x29\x76\x35\x2d\x77\x34\xa3\xf6\xb3\x53\xf6\xf7\x44\xc3\x3c\x5d\xe6\x9b\xf2\x36\x69\xb4\xc1\x3d\xcd\x96\x1a\xe1\x4b\xa2\x00\xad\xf7\x7f\xa7\xf1\xec\x0b\xdd\xf6\x02\x6e\x4b\x99\xe2\x23\x36\xce\x61\x7f\x03\x1d\xf6\x36\xd2\x61\x2f\x43\x1d\xf6\x35\xd6\xe1\x1e\x06\x3b\xec\x67\xb4\xc3\x3c\x2b\xd0\x0a\x05\x94\xf5\x7e\xec\x77\xb8\x8f\x89\x0a\xf7\xb0\xe3\x61\x7e\xaa\x0d\x9b\x9a\xf7\x65\xd4\x33\xaf\xcf\xd8\xf5\x7f\x36\xb1\xf6\xb3\xe9\x61\x9e\x54\xc1\x18\x96\x6c\xd0\x7e\x22\x16\xfe\x9f\x62\x6e\xc3\xbd\x4c\x6e\xd8\xdf\xec\x86\xfd\x39\x83\x55\xdd\x8f\x1c\x4e\xbd\xaf\xc2\xf4\xad\x78\x15\xc1\x67\x70\xc7\xf0\x3b\x69\x02\x5e\x97\x3f\xa0\x12\xd2\x58\xc2\x77\xc1\x67\xd2\xfd\x16\xac\xf3\x6e\x33\xa5\x3f\x42\x4c\xa2\xfa\x56\x14\xa4\x7b\x7c\x1e\x47\xb0\x8b\xa8\xf5\x79\x35\x3d\x80\xbb\x09\x59\x9b\x24\xa5\x9a\xf3\xce\x07\x37\x38\x3d\x18\x2c\x30\xd2\xc1\x85\x3a\xf0\x3a\x6a\x81\x75\x1a\x85\xa6\x55\x31\x85\x03\xfe\x76\xf0\xae\x35\xfb\x1e\x8a\xab\x7b\x85\xca\xbe\x7a\x61\x0f\x2e\x51\xf1\x5a\x97\x77\x0f\x36\xbd\x16\xf1\x81\x8d\xd8\x8b\x6d\x15\x0c\xa7\x5a\x74\x94\x4b\x93\x35\xc2\x3c\xc6\xef\xb3\x68\xfc\xd6\x2a\xdc\x74\x11\xcf\x9c\x87\xc6\xbc\x92\x5a\x4c\x69\x0a\x0b\xaf\x15\x5a\x06\x76\xd8\xb8\x88\x3a\x95\xb9\x6c\xe2\xd3\x41\x5a\x6d\xa7\xb2\xf9\x04\x91\xb6\x06\x63\xc4\x12\x85\xb2\x70\x10\x7d\x4f\x87\xb6\x2d\x71\x90\xb4\xa7\xfb\x9a\x16\x8f\x7e\xff\xe3\x78\xe6\x44\x5f\xdb\x60\x8f\xb4\x7b\xa4\xdd\x23\xed\x1d\x6a\xf5\x48\x7b\xf5\xd3\x23\xed\x1d\x9e\x1e\x69\xf7\x48\x7b\x5d\xc7\x3d\xd2\xee\x91\xf6\xe6\xce\xf7\x43\xda\xfb\xe6\x09\x75\x71\x6f\x08\xce\xf9\x8b\xcc\x84\x93\x69\x9b\x43\x14\x4b\xf9\xbf\xde\x2d\xde\xee\x62\xe9\xe5\x68\xbb\x8b\xc8\x17\x6c\x8b\x64\x03\xb4\x6e\xc0\xf7\x42\xcd\xf5\xa8\xfb\xe3\xca\x85\xda\x83\x37\x3a\x01\x85\x3d\x99\xe3\x65\x0c\x85\x87\x8b\xff\x46\xd8\xc6\xc9\x33\x38\x8a\x11\x97\x63\x22\xbe\xd2\x6e\xf6\xa3\x72\x72\xd8\x96\x68\x62\x30\x1c\x5e\x9c\x39\x6f\x33\x13\x96\x68\xa2\xee\x4d\xa4\xb8\x5d\x4f\x12\x21\x68\x66\xc6\x20\x6d\xb8\xde\x90\xb3\x25\x4c\xad\x14\xb5\xaa\x55\x0c\x1f\x7b\x99\xe3\xef\xe3\x0b\x9c\xe7\xc1\x12\x8f\x87\x11\x53\x4b\xa5\x4e\xbc\x53\x38\x7f\x05\x62\x48\xe5\xd7\x2a\x44\x44\xe9\x4d\x8c\xfa\x46\xa6\xe4\x19\xc9\xa6\xf7\x04\xbe\x63\x3e\xec\x36\x2c\x2d\xd3\x47\x14\x85\xbe\xdb\x45\x24\xfd\x59\xc7\xa2\xee\x76\x3e\x16\x35\x17\xbf\xeb\x4f\x45\xfd\x9b\x9c\x8a\xe2\x8f\x7e\x0b\xbd\xf3\xe3\x51\xf0\xcf\x70\x01\xa1\x41\x26\x55\x59\x17\x4e\x56\x6d\xae\x94\xf5\x5d\x15\x1e\x65\x8e\x43\xe6\xc9\x2c\x5f\x52\x6f\x22\x9d\xcc\xf3\x27\xb7\xc7\xb9\x55\x96\x37\x6d\xc8\xee\x10\x45\x11\xce\x14\x45\x48\xea\x53\x58\xe4\x87\xce\x4c\x78\x1c\xee\x6c\x6d\xac\x19\x16\x32\x47\x24\x0b\x0b\x5a\x50\x92\x6a\x6b\x84\xa8\x37\x8a\x6e\x31\xaa\xde\x5c\xde\xa2\x6a\x25\xe9\x91\x3d\x3e\x8e\x3a\xfc\x9d\x4a\xf8\xf7\x22\xa1\xbf\xea\x48\xd2\x6f\xb6\x91\xd1\x3c\xa1\x46\x4a\xb7\xe4\x6b\x65\xf4\x87\x4c\xc1\xd8\x25\xce\xbf\x9b\x8f\x61\x8f\xf8\xfe\x9f\x18\xdb\xff\x74\x4e\x96\x7d\x60\x0f\xe3\x87\xc8\xad\xff\xe8\xbd\x8a\x7d\x72\x7d\xfb\xdc\x37\xb9\xfe\xbd\x7b\x0e\x3f\x6c\x8e\xfd\x27\xe0\x2d\xfc\x90\x39\xf6\xbd\x87\x70\xed\xa2\x7c\x6c\xa9\xef\xb3\xcf\x5e\x1e\xc1\xde\x1b\xb8\xb7\x16\xde\x51\xe1\xdc\xd7\x0b\xb8\x23\x47\xec\x19\x67\xef\x63\xec\x7f\x4e\x8c\xbd\x47\xbc\x5b\x3e\x3d\xe2\x5d\x49\x94\x1e\xf1\x42\x8f\x78\x37\x4d\xaf\x47\xbc\x6b\xc9\xd3\x23\xde\xb5\x8b\xd2\x23\xde\x1e\xf1\xc2\xa7\x86\x78\xf7\xb9\xa5\xab\x8f\x75\xdf\x2b\xd6\xbd\xab\xb4\xd8\x49\x46\xec\xc8\x07\x3b\xc7\xb6\xfb\xb8\xf6\xc7\x12\xd7\xde\xfa\xc0\xbf\x72\xf2\xbe\x87\xfe\xbb\x6b\xb5\xea\xe4\xbf\xb8\xd5\x32\x83\xaa\x76\xe1\x3c\x75\x7f\xfa\xff\x5d\x9c\xfe\x9f\xa1\x7c\x7f\x05\xc0\x56\x57\x00\xac\xa2\x59\x7f\x0f\x40\x7f\x0f\xc0\x3b\x0e\x42\xf7\xf7\x00\xf4\xf7\x00\xf4\xf7\x00\xc4\xa7\x3f\x9d\x04\xfd\xe9\xa4\xad\x9e\xfe\x74\xd2\xea\xa7\x3f\x9d\xf4\xd1\x7a\x5f\xa1\x3f\x9d\xf4\x71\x7b\x62\xa1\x3f\x9d\xd4\x7b\x67\xb7\x5c\xa8\x4f\xf0\x74\x52\x7f\x0f\xc0\xc7\x9a\xa3\x00\x3d\xd2\xee\x91\x76\x8f\xb4\x7b\xa4\xbd\xfe\xe9\x91\xf6\x0e\x4f\x8f\xb4\x7b\xa4\xbd\xae\xe3\x1e\x69\xf7\x48\x7b\x73\xe7\xfd\x3d\x00\x9f\x50\x6e\x04\xf4\xf7\x00\xf4\xf9\x12\xfd\x3d\x00\xff\xbe\xf7\x00\xcc\xc4\xee\x3f\xdc\x65\x00\xbb\x0f\xa3\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\x20\x3e\xfd\x8d\x00\xfe\xf9\x98\x7c\x8d\xfd\xf9\xa8\x95\x44\xe9\xcf\x47\x41\x7f\x3e\x6a\xd3\xf4\x3e\x01\xbf\x61\x7f\x3e\xea\x23\xf4\x15\xf6\xe7\xa3\x7a\xbf\xe0\xfc\xe2\x7c\x22\xe7\xa3\xfa\x1b\x01\x3e\xc6\x68\x7b\x8f\x78\xb7\x7c\x7a\xc4\xbb\x92\x28\x3d\xe2\x85\x1e\xf1\x6e\x9a\x5e\x8f\x78\xd7\x92\xa7\x47\xbc\x6b\x17\xa5\x47\xbc\x3d\xe2\x85\x4f\x0d\xf1\xf6\x37\x02\xf4\x37\x02\xf4\x37\x02\x7c\x8a\x11\xee\x8d\x2b\x4d\x23\xdb\x64\xd0\xce\x2c\xe7\xb3\x4e\x85\x39\xf0\x1e\x4e\x34\x07\xdd\xea\x4c\x8d\x7c\xc0\x3b\xc6\x1f\xf9\xd8\xae\x6b\xe9\x9a\xc0\xd5\x92\x9a\x4c\xbe\x50\xe2\xd0\x7a\x42\xdb\xf9\x76\xe6\xe2\xb5\x9e\xd6\xdc\xe6\x8a\x29\x6c\x21\x6e\x77\x13\xae\x1b\x09\x5b\x19\xa9\x8d\x74\xd3\xf3\x42\x58\xfb\x4c\x94\xb8\x15\x75\x2f\xc6\x2d\xd3\x0e\x40\xaa\x4c\xa6\x8d\x75\xe3\x05\x49\x6c\x97\x01\x10\xf1\x43\xa7\x7c\xa4\x50\x2c\xe3\x03\xdc\x23\x24\xf6\x16\x75\xe1\x68\x8b\xfd\x86\x46\x87\x03\xe9\x06\x3d\x4f\xc5\xcf\xeb\x89\xb7\x66\xae\x16\xd3\x9a\xe7\xaa\x95\xc3\xb7\xee\x5c\xab\xb1\xcc\xb7\x9a\xef\xc1\xd5\xb2\xaa\x90\x0a\x45\xc3\xe6\x0b\x09\xc6\xf0\xa6\xc0\x5c\xa4\xd3\x37\x34\xfc\x37\x06\x69\x20\xb4\x67\xde\x78\xa5\x70\x2e\x9c\x28\x74\x7e\xc5\x11\xb3\xc3\x70\xc3\x84\x05\x94\x7c\x81\x84\x54\xbf\xf8\x0d\xd6\xc8\x0e\xc3\x79\x18\x95\xce\x12\xa2\x5c\x32\x37\x76\x96\xea\xcd\xc7\x00\x00\xd0\xbc\xfa\xec\xf5\x42\xc9\x00\x15\x08\x8c\xd0\x96\xec\xf2\xa7\xa9\x15\xc9\xa0\x4b\x9d\x41\x9c\x20\x9c\x65\xa5\x64\x74\x02\x47\x97\x57\x67\xc7\x33\x33\x81\x92\xaf\xc1\xd0\x06\x32\x8d\x56\x1d\x3a\xb6\x1b\xdc\x04\x6d\x8b\x48\x78\xe7\x73\x40\xd0\xef\x16\x8e\x08\xc6\x3e\x89\x60\x0c\x52\x46\xd8\x74\x7e\x75\x06\x6f\x46\xc2\x62\x21\x15\x7a\xda\x55\x46\xde\xca\x02\x73\xea\xb1\xe3\x5f\x81\xf3\xda\x18\x54\xae\x98\xc6\x9b\x0a\x96\xaf\x8a\xb4\x50\xab\x39\x76\x8b\x9c\xd5\x48\xc7\x66\xb1\xa8\xb4\xc5\x2c\x81\x2b\xae\x31\xf5\x50\x3a\x94\xe3\xb5\x71\x13\xa1\x56\x2e\x2e\x18\xb4\xd4\xb0\x54\xbe\x96\xcc\xd8\xb2\x02\x34\x86\x54\x33\x67\x2f\xd4\x96\x05\x75\x91\xa1\x81\xd4\xb3\x01\xc8\x52\xe4\x5e\xca\x33\x91\x58\xe5\x84\x14\x8f\x40\x98\x25\x84\x5f\x3d\xe7\x56\x69\xf1\x8a\xe8\x66\xbc\x09\x5c\x2b\x32\x5a\x04\x8c\x6b\x57\x1b\x84\x5b\x34\xbc\xba\xbc\xe7\xba\xa4\x89\x9b\x30\x36\xd0\xe9\x7e\xd0\x0c\xbb\x14\x32\xb0\x9a\x8d\x7d\x1a\x1c\xd5\xb2\x60\xb4\x22\x9b\xf9\x59\xcf\xc8\xa2\xe9\x4e\x8f\x41\x57\x65\xb8\x26\xa4\xae\x2a\x6d\x5c\xab\xc3\xd2\xee\xde\x08\x3a\x66\x09\x01\x68\x58\x95\xc1\x8a\x70\x6c\x90\xb4\x16\x21\x9d\x08\x95\x13\x7b\x5c\x2b\x78\xaa\x39\xa5\xc3\xe7\x05\x51\xb7\x62\xa4\x6b\xc7\x3c\x16\xf6\xea\x58\xd7\x2a\x03\x12\x2a\xa7\x30\x71\xae\xb2\xa7\x27\x27\x37\xf5\x08\x8d\x42\x87\x36\x91\xfa\x24\xd3\xa9\x3d\x49\xb5\x4a\xb1\x72\xf6\x24\xee\xa6\x93\x4a\x67\xc3\xf8\x63\x28\xe2\x26\x39\x39\x3c\xd8\x57\x1a\x41\xa4\xfc\x29\xf8\xb5\x5a\x51\x0a\x55\xbd\xe6\x52\x84\xe1\xfa\xca\x54\xa0\x25\xe3\xd2\x42\x4e\x17\x7c\x85\xc8\x1a\x4f\xe1\x2c\x50\x6a\xcb\x37\x57\x79\x44\xf6\xb0\x1d\xe9\x76\x68\xbb\x4d\xaf\x17\xda\xeb\x00\xe4\x06\xc8\xb8\x70\x8d\x07\xcb\x36\x02\x73\xed\x40\x19\x00\x38\x27\xf8\x22\x0f\x42\xe3\xfe\x0b\x89\x2b\x35\x05\xe2\x67\x17\x6e\x75\xe9\x5c\x73\xe2\x0c\xe7\x19\x7d\xd5\x58\x7d\x03\x1c\x8f\x31\x75\xdf\x84\xfd\xdc\xd8\x7f\xbc\xb9\xa3\xa5\xf6\x55\xfc\xeb\x9b\xd5\xc8\x67\x2b\xa3\x6a\x3b\xb7\x98\x1f\xd2\x7a\xb8\x3b\x43\xa1\xef\xb8\xc2\x9c\xca\xf6\x14\xf0\x6d\x11\x7d\x78\x5a\x11\xdb\x79\x23\x21\xe0\x1d\x92\x19\x9d\xc2\x36\x48\xb8\x8e\xb4\x0d\xb8\xaf\xb5\x50\x11\x9e\xe9\x90\x70\x87\x03\xb8\xe4\x3b\x50\xda\x37\xac\xc8\x9e\x69\x9f\x7a\xb7\x12\x17\x75\xe9\xb6\xd1\x1e\xd8\xe8\x18\x9c\x21\xc8\x0f\xad\x1b\xd0\xcf\x6c\xc6\x0d\xd8\x72\xf0\x8c\x95\xb7\x8e\x32\x37\x38\x6d\x5d\x47\xc1\xc9\xc8\x96\xd9\xa0\xe5\x92\x08\x3e\xbd\x27\xe8\xef\x21\x77\x46\x97\x23\xa9\x7c\x67\xbe\xe9\xb8\x14\xdc\x7a\x24\xa8\xca\xf8\x27\x77\xf3\x2e\xc8\xb5\x9d\xb7\x71\x86\x66\xcf\x77\xf0\x2d\x36\xde\x8a\xe5\x5e\xc5\x8e\x2b\xf1\xbb\x5f\x6b\x51\x24\xf0\xd8\x4b\x45\x9e\x7d\x78\x15\x0a\x2d\x78\x57\xee\x64\x91\xa5\xc2\x64\xac\x0d\xfc\x1e\x05\xab\xfd\xea\x89\x06\x70\xc4\xdd\xde\xae\x91\xbf\xe3\x07\x2a\x61\x9c\x4c\xeb\x42\xb0\xda\xc2\x5c\x9b\xe9\x3b\xa1\x68\xcb\x34\x57\x98\x6a\x95\x6d\x30\x78\x57\x48\xd7\x50\xb7\x4b\x63\x86\x51\x68\x64\x48\x65\x93\x25\xce\x33\xe9\xd1\xac\x71\xa3\xc7\x71\x57\x37\x5b\x6c\xe0\x51\xcd\x9d\x64\x58\xd6\xf8\x1b\xa4\x05\xe9\x73\x61\x8f\x3b\xe2\xb1\xd9\x15\x09\xfc\x63\x1a\xf5\xd5\x00\xa4\x8b\x56\x9e\x45\x17\x31\x4c\x64\xd9\x40\xec\x76\x43\x8d\xb5\xc1\x5b\x34\x70\x94\x69\xae\xc3\xe9\x9e\xc7\x09\xfc\x8b\x20\x3e\x7b\x27\x30\xf7\x99\x89\x81\xc5\x23\x12\x71\x7c\x29\x17\x5b\xbb\x0f\xe1\xc8\x67\x89\xca\xb2\xc4\x4c\x0a\x87\xc5\xf4\xd8\x07\x0a\x63\x9e\xe9\x36\x4b\xb7\x4d\x72\x71\x27\xa9\xf8\xcb\xbf\xac\x29\xc9\x83\xdd\x61\x65\x7f\x66\x48\x39\x23\x6a\x3c\xca\x9c\x5b\xc2\x46\x07\xe9\x35\xce\xe3\x8e\xb3\xb8\x83\xfd\xa2\x98\x69\x16\xf8\x17\xe2\x03\x01\x06\x73\xe6\x72\xcf\xb9\xf7\xe0\x71\x99\x2e\x4f\x8e\xde\xa0\xd1\xd6\xc7\x9f\x86\x40\xf0\xff\xcb\xbf\x64\xc2\x89\x15\x05\xfc\x9a\x4f\x2b\x5c\xf2\x7d\x93\xa2\x6c\x1b\x5f\xb5\x58\x1b\xb7\x75\xd3\xfd\x5e\x2d\x30\xd4\x5f\x56\x73\xd6\xa4\xa6\x52\x21\x1e\x11\xd7\x7b\x68\x30\x97\xd6\x99\xc6\xc5\x4b\x96\x22\x97\x73\x1a\xa4\xb2\x4e\x28\x27\x59\xb2\x41\x2c\x39\xb4\x68\x6e\xf9\xd6\x3e\x37\x49\xe0\x39\xd9\x5a\x64\xde\xc0\x1d\xa9\x69\x0f\xb0\x5f\x4e\x2b\x84\xaf\x3b\x3f\xbe\x37\x55\xca\xbc\x16\x04\x8d\x67\x2e\x91\x65\x06\xed\xa2\x7c\x58\xc6\x3e\x6b\xe7\x1f\xcd\xfc\x8d\x24\x38\xbc\x8c\x0e\x81\xe0\x03\xb5\x56\xe6\x84\x32\xe3\xa9\x84\xa0\x4e\x66\xd1\xa6\xb7\x0a\xb8\xa2\xfc\x8d\x77\x53\xd9\x28\x01\xe9\x22\xee\x4f\xb5\xb2\x75\x19\x93\x0b\xc8\xea\xa9\x50\x65\xa8\xd2\x29\xa7\xb1\x16\xb7\x68\x12\xf8\xc9\xd2\x4a\xc1\x7f\xc9\x9c\xec\xbe\xd0\x69\x17\x2a\xc5\xec\xe8\xb9\x11\x48\xdb\xb9\xdb\x8d\xd3\x25\x08\x03\xc5\x16\x30\x9b\x2b\x6f\x63\xc8\x66\x7e\x10\x9c\x5c\x1f\x1c\xf7\x7c\x7a\x22\xb8\xdf\x1a\x47\x89\xdf\xf0\x34\xa5\x5c\xfb\x44\xf9\x4a\x5b\x19\xb3\xba\x1b\x39\x3a\x73\x02\x43\x8f\xfd\xf9\x08\xdf\xee\xac\x21\xcc\xb1\xbf\xb9\xc9\xb0\xe1\x56\x2b\x4f\x7c\xec\x7a\x69\xa2\x98\x79\xe8\x9b\x5a\x56\xcf\xc5\x0b\x33\x67\x87\xdc\xca\x74\x23\xd4\x0d\x66\x50\xe0\x5b\x99\xea\xdc\x88\x6a\x22\x53\x3e\x04\x40\xdb\x94\x9d\x64\x9c\xfa\x2f\x4a\x4c\x0e\x57\x32\xda\x2a\x31\x5e\xd5\xa3\x42\xda\x09\x2e\xc5\x32\x6b\x79\xd4\x62\x6a\xd0\x2d\x95\x20\x33\x2c\x7a\xe5\xcb\xb5\x4a\x39\x46\x4e\x43\x03\x21\x33\xc0\xf3\x1c\x6f\x3c\x22\x71\x9a\xd2\x46\xf2\x47\x67\x94\x6b\x2f\x66\x6c\x68\x98\xc0\x05\xab\xd4\x11\x5a\xe6\xf2\x1b\xc4\xca\x73\x1a\xbb\xf0\x6d\xc9\x3e\x15\x2b\x55\x8a\xfe\x28\x83\x3f\x12\x82\x18\xdd\x8c\xce\x48\xf4\x30\x88\x54\xed\xb4\x59\x1b\x54\x6e\x39\xa8\x59\x6f\x77\xad\xb1\xb9\xd6\x93\xb1\x91\x29\x9b\x29\xd9\xca\xa2\xa8\x13\xe9\x6f\x22\x25\x7f\xd9\x75\x05\xfd\xc9\x93\x2b\x1f\x02\xdd\x2c\x6b\x7e\x9a\x29\x1e\x1c\xeb\x16\x26\xfa\x2e\xb4\x34\xbf\x69\x83\xc7\x26\xae\x6d\x26\x6d\x4a\x3b\x1d\x33\x38\xd7\xca\xc6\xe3\x27\x42\xf9\x13\x25\xb7\xa2\xf0\xac\x10\x1b\xae\x74\xc1\x27\x7b\xb2\x3a\x9a\x13\x3e\x4b\x04\xcb\x11\xf2\xb5\x91\x36\x0e\x65\x85\x9a\xdb\xa0\x62\x37\x69\xc1\xa8\x1f\x2e\x75\x51\xac\xd7\x62\x6b\xed\xd2\x6d\xac\xd2\x48\x80\xad\xaf\xec\xbd\x88\x14\x0b\xbe\x38\xe2\xe9\x0c\x1d\x9a\x52\xaa\x00\x8f\x08\xea\x36\x84\x1d\xa1\xbb\x43\x54\x90\x4e\x30\xbd\xb1\x6d\xac\x83\x2f\x70\x9d\x5b\xb5\xe0\x7f\x9a\x95\x58\x0d\x9e\xa2\x55\x61\x43\xc3\x22\x82\x24\x9b\x40\xe1\x5d\xd7\x67\xb5\x44\xdd\x90\x8a\xbe\x15\xb2\x10\xa3\xc2\x1f\xbb\x6a\x7e\x0d\xba\xe3\x90\x51\x9f\x57\x75\x51\xa0\x0f\xe8\xe5\x2f\x2e\xcf\xc1\x19\x31\x1e\xcb\x94\xc3\x39\xd2\x78\xaf\x6f\x50\x6c\x4b\xa7\xb0\xf9\x52\xe1\x25\x3b\xc2\x3a\xe1\xea\x85\x35\x5a\xb3\xc0\xeb\x16\x96\xec\x10\xb9\xd2\x41\x34\x77\x15\xe7\x8c\xb1\x42\xc3\x40\x6f\x6c\xcd\xf8\xbf\x13\x78\xa6\x5d\xb8\x49\xf7\x29\x5a\x52\xbb\x4c\xa0\x17\x28\xac\x56\x1d\xe9\xca\xe8\xd7\xc8\x5c\x2a\x51\x84\x49\x75\xfd\x7b\x8d\xed\x21\xd8\xa5\x5c\xca\xdc\x08\xd7\x08\xc5\x76\xdc\x41\xbb\x04\xbd\xe8\x3d\xa1\x09\x9c\xa9\x29\xaf\xf7\x18\x05\xbd\xa0\x96\x9d\xd1\x59\x9d\x62\x38\x73\x57\xdb\x6e\x23\xef\x54\x8c\xce\x86\x17\xce\x63\x27\x6d\x2c\x3f\x43\x27\x64\x08\x29\x69\x85\x20\x6c\x45\x76\x5c\xe4\x49\xef\x0a\x6f\x09\xcc\xca\xe2\xec\xf2\x02\x5e\x84\x43\x39\x09\x0c\x87\x43\x1f\xd5\xb4\xce\xd4\x29\xeb\x17\xda\x42\x2a\x0b\x9a\xc2\x73\x1f\x4f\x52\x74\xd2\x60\x82\xe7\xc3\x43\xb0\x4a\xb8\x09\x24\x9e\xf0\x49\x87\x14\x00\x4f\x48\xd7\xbc\x15\x65\x45\x7c\x7f\xad\xbc\xf4\x7e\xa2\xf5\x95\x5f\x24\xdf\xe7\xef\x70\x72\x32\xcf\x13\x7a\x44\x10\x35\x38\x10\x99\x35\xc6\x5a\x1f\xda\xd9\x29\x25\x54\xf1\x07\xa5\xef\xd4\xb2\xde\xb9\x2f\x61\xf0\x14\xae\x0f\xce\xe2\xee\xbb\x3e\x18\xc0\xf5\xc1\xa5\xd1\x39\xa7\x57\xa8\xfc\x3a\xe4\x4b\x5c\x1f\x3c\xc6\xdc\x88\x0c\xb3\xeb\x03\x6a\xf6\x3f\x38\x2f\xe6\x29\x9a\x1c\x7f\xc0\xe9\xd7\xdc\x58\xf3\x3a\x6a\x84\xaf\x7d\x0a\x0d\xbd\x27\x15\x4c\x7a\xea\xeb\x52\x54\xcd\x8b\xa7\xa2\x6a\x2a\x9f\xb7\x7c\xf6\xea\x75\x89\x4e\xdc\x3e\x4a\xda\x15\x7d\xf3\x8b\xd5\xea\xf4\xfa\xa0\x1d\xff\x40\x97\xc4\x19\x95\x9b\x5e\x1f\xc0\x4c\xaf\xa7\xd7\x07\xdc\x6f\x7c\x1f\x07\x79\x7a\x7d\x40\x3d\xd1\x6b\xa3\x9d\x1e\xd5\xe3\xd3\xeb\x83\xd1\xd4\xa1\x1d\x3c\x1a\x18\xac\x06\x04\x98\xbe\x6e\x7b\xb8\x3e\x78\x43\x6b\x72\x72\x12\x42\x18\xe1\x92\xe2\x3f\x96\x3b\xab\x37\xca\xfd\x4d\xf9\x83\x43\x28\x84\x75\x2f\x8d\x50\x96\xfb\x7f\x29\xcb\x65\x2a\x0c\x82\x2d\xc7\xfb\x7d\xe5\x77\xc3\x32\x60\xe5\x67\xcf\x0d\x2b\x3f\xaf\xd0\x9e\xdb\x68\xae\xc5\x39\x6c\xe9\x75\x5e\xac\xd8\x26\x16\x12\x9e\x8b\x7e\x9a\x66\x7d\x48\x07\x84\xd2\x18\x0e\xbc\xd2\x16\x0f\xf2\x8d\xd3\x86\x78\xdd\x42\xca\x57\x6b\xe0\xdf\x85\xc3\xb0\x50\xab\x0c\x4d\xc1\xc1\xaa\xb6\x55\x1f\x09\xc9\x12\xf0\x7e\x03\xd1\x78\x69\x6e\x68\x23\xb1\x76\x52\x1d\xe7\x35\x8f\xab\x69\x91\x64\x47\x38\x0f\xec\x9b\x61\x45\x97\xa6\x58\x39\xd6\x74\xfb\x87\x98\xa1\xe3\x54\x21\x64\x35\x74\xab\xd9\x23\x30\xc7\x96\x84\x0f\xa5\x7d\x7c\x7f\x52\x97\x82\x54\x87\xc8\x68\xbc\xed\x37\x6f\xbe\x79\x73\xcb\x8b\x54\x1f\x14\xf2\x3e\xfe\xb8\x0e\x81\xd4\x41\x91\x88\x26\xf1\x7b\x83\xc7\x64\xab\xc9\x97\xe2\xed\x8f\xa8\x72\x37\x39\x85\x2f\x3e\xff\xcf\x2f\xff\xba\xa2\xa0\x17\x8c\x98\x7d\x8f\x2a\xf8\x82\xb6\x24\xc3\x62\xc5\x79\xa7\x61\x42\x52\x29\x13\x4e\x24\x79\x5b\xa6\x71\x72\xb7\x1c\x74\x27\x2c\x1b\x34\x5e\x5d\xd6\x15\xd1\xe5\x09\x27\xaa\x58\x27\x54\x8a\x03\x02\x49\x4b\x1b\x93\x8d\x00\x2f\xa6\xf0\xe8\x73\x7f\x99\x3f\x77\xbd\x20\xbe\x5f\xbd\x7d\x9d\x2c\x19\xb2\xb4\xf0\xb7\xc1\xdc\x78\xa4\x05\x5a\x2a\x3d\x66\xc6\xf1\x26\xa6\x41\xaf\x09\xa3\x33\x60\x51\x13\x62\x33\xde\x4d\x0b\xb7\xc9\x1f\xb8\x9d\x2f\xb0\x94\x4a\x96\x75\x79\x0a\x0f\x57\x14\xf1\x22\x6d\xcb\xd5\xf4\x85\x5b\x20\x20\x48\x74\xe5\x46\x94\x25\xa7\xa4\xc9\x0c\x95\x93\x63\xc9\x49\x03\x0d\x6b\xb3\xb9\xef\x2b\xc6\x1c\x94\x86\x8a\x9c\x9e\x42\x72\xa8\xc3\xec\x97\x1e\xe7\x18\xd6\xc0\x21\x7a\x93\x76\x05\xd4\xb4\x42\xbf\x1b\xbc\x01\x03\xf8\xb6\xf2\x50\xb5\x13\x86\x28\x51\x28\xa9\xf2\x98\xf6\xd2\xfe\x47\x0e\xf4\xf1\x6e\x82\x21\x7a\x8e\xdd\x58\x50\x4a\xc6\x52\xc6\x76\x93\x80\xbc\x16\x46\x28\x47\x66\xec\xd9\xe5\x85\xc7\xe8\xf3\x3e\x4d\x42\x8e\x25\x16\xe7\xc2\x62\xdc\x8d\x7e\xab\x7a\x61\x15\x6f\x15\x68\xb2\x64\xdf\xd9\x56\x7d\xf4\xf0\xf3\xb5\x4b\xde\x94\x5b\x1d\xc2\x13\xce\xa1\x51\xa7\xf0\x3f\xaf\xce\x86\xff\x12\xc3\xdf\x5e\x1f\x85\x3f\x1e\x0e\xff\xf6\xbf\x83\xd3\xd7\x9f\x75\x7e\xbe\x3e\xfe\xf6\xff\xaf\x68\x69\x39\x98\x5f\xc1\x3e\x41\x89\x44\x9c\x18\x57\x74\x10\xb3\x54\x5e\x9a\x1a\x07\xf0\x44\x14\x16\x07\xf0\x93\x62\xd5\x70\x4f\xa2\xad\x8f\x50\x93\x56\x3e\xa0\x5e\x57\x45\xca\x43\x11\x1e\xd2\xfa\x32\x61\xb8\xeb\xcc\xd7\xed\x88\x14\x5d\x0d\x1d\x49\xa3\x3a\x7c\xe6\x53\xf3\xc6\x5a\x27\x01\xe1\x26\xa9\x2e\x4f\x9a\xef\x1e\x5a\x3f\x15\x6a\x0a\xad\x58\xf3\xa0\x74\x9e\xd3\xad\x23\xd9\x24\x52\xa3\xad\x6d\xcf\xcb\x43\x21\x6f\x10\xce\x5a\xbb\x91\x84\xe5\x08\x53\xc1\x58\xdc\x8c\xa4\x33\xc2\x3b\x7d\x23\xae\x6c\x3d\x4a\xe3\xba\x80\x23\x32\x57\x13\x4e\x24\x5b\x90\xae\xe1\xee\x0d\x31\x92\x05\xff\x17\x08\x64\x4a\xa7\x5a\x8d\x0b\x19\x4c\x80\xb2\xd2\xc6\x09\xe5\x62\x82\x70\x8e\x6f\xfd\xff\xba\xe2\xc3\x0e\xd2\xc2\x51\xa6\xec\xa3\x47\x9f\x7f\x71\x55\x8f\x32\x5d\x0a\xa9\x9e\x94\xee\xe4\xf8\xdb\xa3\x5f\x6b\x51\x70\x94\xf7\x99\x28\xf1\x49\xe9\x56\xff\xff\x15\x3b\xab\xc5\x47\x5f\x6e\xb1\x8b\x8e\x5e\xf9\xbd\xf2\xfa\xe8\xd5\x30\xfc\xf5\x59\x7c\x75\xfc\xed\xd1\x75\xb2\xf6\xfb\xf1\x67\x34\x87\xce\x0e\x7c\xfd\x6a\xd8\x6e\xbf\xe4\xf5\x67\xc7\xdf\x76\xbe\x1d\x2f\xdb\x8c\x6f\x87\x6d\xaa\xc8\x90\xac\x80\x61\x29\xaa\xe1\x0d\x4e\x57\x6c\xce\x95\x70\x74\xb1\x21\x4f\xb1\x52\x54\xcb\xac\xef\xb1\xcc\x9f\x8a\xea\x05\x8e\xd1\xa0\x4a\x97\x32\xf9\x3d\x23\x30\x64\x3f\xac\xf9\xc4\x19\x58\x7b\x78\x9d\x48\xef\x78\x4f\xdb\x3a\x38\xbd\x05\xb7\x6c\x87\x1f\xd5\x9a\xfc\xc5\xcd\x29\xa6\x71\x9e\x7b\xb7\x10\xf7\xf7\xcf\xde\x7f\xb4\x77\x3b\xb5\x5c\x69\x69\xcd\xfa\x30\x2f\x1e\x7b\xe8\xcb\xa2\x87\xe1\xdc\x44\x93\x9d\x57\x2b\xf9\x6b\x8d\x70\xf1\xb8\x39\x9a\x26\x55\x5a\xd4\x7c\x19\xce\x4f\x3f\x5d\x3c\x26\xfb\xfd\x1f\x41\xdc\xdc\x21\x64\x5a\x1d\x3a\x78\xfe\xec\xc7\xff\x66\x67\x00\x97\x18\x78\x85\x1e\xce\xc7\x14\x52\x78\x37\x59\x50\xc0\xf0\x0f\xf4\x79\x72\xdc\x73\x2a\xaa\xc6\x7f\xc2\xe2\x8e\x33\xac\x8a\x8a\x00\xc4\x0d\x82\xad\x4d\x18\x1d\x35\xec\x23\xbe\x9c\x45\x1f\xe2\xc1\x39\xf2\x59\xba\x71\x21\xdc\xea\x7c\xe1\xb5\x44\x4b\xb5\x52\x98\x72\xd0\x9c\x50\xe0\x7b\xd8\x1f\xc4\xc8\xcf\x03\x66\xe5\x3e\xf6\xd8\x0c\x21\xa0\xb6\x37\x5b\xd0\x18\xce\xfd\x4c\xdf\xfb\x4e\x5a\x98\xef\x5e\x3d\x7a\x7f\x26\x47\x36\x5f\x6c\xf0\x3f\x2f\xa4\x71\xcd\x9a\xce\x33\xde\xc3\xe0\x5b\x6d\x82\xa3\x13\x61\x61\x84\xa8\xd8\x9d\xeb\xbd\x7f\xa8\x02\xd7\x61\xeb\x88\xad\xab\xa1\xd3\xc3\x6c\xf9\xe2\x6d\xa0\xdc\x66\xaa\xad\xb1\x5c\xe7\x4e\x99\xee\x6a\xa8\xde\x4d\xa6\xcb\x68\x60\xdb\x4b\x77\x1a\x0c\xb2\xeb\xc4\x56\x1b\x26\x73\x5e\x5d\xb6\x2c\x82\x53\x23\xd8\x19\x8b\x43\x22\xeb\x71\xc6\xb3\xe1\x34\x47\xf3\x66\x3d\x7b\xbb\x8f\xd1\x2f\xf3\x15\x9a\x5b\xb9\x97\xf2\xdb\xb4\x31\x53\x9f\x67\x72\xf6\xfe\xb7\x15\x41\xaf\xbd\x3b\x61\xd7\x5f\xaa\x37\x84\x6f\xd6\xe6\xbf\x33\x05\xd7\x65\xf9\xef\xd2\xc6\xae\xca\xd2\x4b\x93\x53\x3e\x71\x11\x5f\x39\x6d\x38\xe4\xde\x7d\x57\x8f\x1a\xa0\xdc\xb6\x1e\x6c\x20\xf8\xfd\x8f\x07\xff\x17\x00\x00\xff\xff\x25\x01\x0e\x3b\xe7\xe7\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x73\xdc\x36\x16\xe0\x77\xff\x8a\x57\xda\xd9\x92\x94\x74\x53\x76\x32\x95\x9d\x68\x72\x94\x46\x3e\x56\x15\x1f\x2a\x4b\xc9\xd4\x8e\xe5\xdd\xa0\xc9\xd7\xdd\x88\x48\x80\x01\x40\x49\x9d\xe3\xbf\x6f\xbd\x07\x80\x64\xdf\x87\xec\xd8\xae\x21\x3f\x24\x6a\x12\xe7\xbb\x2f\xc0\xa2\x94\x3f\xa1\xb1\x52\xab\x63\x10\xa5\xc4\x3b\x87\x8a\x7e\xd9\xe4\xfa\x1f\x36\x91\xfa\xe8\xe6\xd1\x83\x6b\xa9\xb2\x63\x38\xad\xac\xd3\xc5\x6b\xb4\xba\x32\x29\x3e\xc6\xa1\x54\xd2\x49\xad\x1e\x14\xe8\x44\x26\x9c\x38\x7e\x00\x20\x94\xd2\x4e\xd0\x6b\x4b\x3f\x01\x52\xad\x9c\xd1\x79\x8e\xa6\x3f\x42\x95\x5c\x57\x03\x1c\x54\x32\xcf\xd0\xf0\xe0\x71\xea\x9b\x87\xc9\xd7\xc9\xc3\x07\x00\xa9\x41\xee\x7e\x29\x0b\xb4\x4e\x14\xe5\x31\xa8\x2a\xcf\x1f\x00\x28\x51\xe0\x31\xa4\xc2\x89\x5c\x8f\xfc\x22\x6c\xa2\x4b\x34\xc2\x69\x63\x93\x54\x1b\xd4\xf4\xbf\xe2\x81\x2d\x31\xa5\xd9\x47\x46\x57\xe5\x31\x2c\x6c\xe3\xc7\x8b\x8b\x14\x0e\x47\xda\xc8\xf8\x1b\xa0\x0f\x3a\x2f\xf8\xef\xb0\x79\x3f\xed\x05\x4f\xcb\xef\x73\x69\xdd\x0f\xf3\xdf\x9e\x4b\xeb\xf8\x7b\x99\x57\x46\xe4\xb3\x0b\xe6\x4f\x76\xac\x8d\x7b\xd9\x4c\x4f\xd3\xa5\xc2\x59\x93\xfa\xcf\x52\x8d\xaa\x5c\x98\x99\xbe\x0f\x00\x6c\xaa\x4b\x3c\x06\xee\x5a\x8a\x14\xb3\x07\x00\x01\x84\x61\xa8\x3e\x88\x2c\x63\xb4\x88\xfc\xdc\x48\xe5\xd0\x9c\xea\xbc\x2a\x54\x3d\x15\xb5\xc9\xd0\xa6\x46\x96\x8e\x41\x7f\x39\x46\x28\x0d\x3a\x37\x61\x90\x80\x1e\x82\x1b\x63\x9c\xbb\xee\x05\xf0\x8b\xd5\xea\x5c\xb8\xf1\x31\x24\x04\xe1\x24\x93\xb6\xcc\xc5\x84\x56\xd3\x6a\xe5\xd1\xf4\xd8\x7f\x6b\xbd\x77\x13\x5a\xba\x75\x46\xaa\xd1\xaa\xa5\x50\xbb\xcd\xd7\xe0\x41\x73\x39\x29\xe7\x97\x30\xf3\x72\xd3\xf9\xcb\x6a\x90\x4b\x3b\x46\xb3\xf9\x22\xea\x2e\x73\x6b\x38\x5f\xf0\x65\xc9\x42\x5a\x83\x46\x86\x4a\xe6\x98\x61\x6e\x82\x93\xd1\xfc\x1e\x33\xe1\xe2\x4b\xdf\xe8\xe6\x91\xc8\xcb\xb1\x78\x14\x5e\xda\x74\x8c\x85\x68\xe8\x41\x97\xa8\x4e\xce\xcf\x7e\xfa\xf2\x62\xe6\x03\x4c\x43\x67\x8a\xce\x41\x5a\x10\x60\xb0\xd4\x56\x3a\x6d\x26\x04\xad\xd3\x8b\x9f\x6c\x0f\x4e\x5f\x3f\xb6\x3d\x10\x2a\xab\x19\x0f\x4a\x91\x5e\x8b\x11\xda\x64\x6e\xad\x7a\xf0\x0b\xa6\xae\xf5\xda\xe0\xaf\x95\x34\x98\xb5\x57\x41\xe0\x89\x30\x99\x79\x4d\xf0\x6f\xbd\x2a\x0d\xcd\xe9\x5a\x8c\xec\x9f\x96\x94\x9b\x7a\x3f\xb3\xc3\x7d\x02\x83\x6f\x07\x19\x09\x38\xb4\x4c\x02\x81\xc7\x30\x0b\xb0\xf3\xa4\x21\x2d\xed\xdf\xa0\x45\xe5\x45\x1e\xbd\x16\x2a\xec\x29\x81\x0b\x34\xd4\x91\xd8\xbd\xca\x33\x92\x84\x37\x68\x1c\x18\x4c\xf5\x48\xc9\xdf\xea\xd1\x2c\x38\xcd\xd3\xe4\xc2\xa1\x75\xc0\x5c\xab\x44\x0e\x37\x22\xaf\xd0\x83\xb2\x10\x13\x30\x48\xe3\x42\xa5\x5a\x23\x70\x13\x9b\xc0\x0b\x6d\x10\xa4\x1a\xea\x63\x18\x3b\x57\xda\xe3\xa3\xa3\x91\x74\x51\x86\xa7\xba\x28\x2a\x25\xdd\xe4\x88\xc5\xb1\x1c\x54\x24\x0e\x8f\x32\xbc\xc1\xfc\xc8\xca\x51\x5f\x98\x74\x2c\x1d\xa6\xae\x32\x78\x24\x4a\xd9\xe7\xc5\x2a\x96\xe3\x49\x91\xfd\x0f\x13\xa4\xbe\xdd\x9f\x01\xdf\x42\x62\x86\x28\x36\x57\xc2\x9a\x84\xa7\xa7\x22\xdf\xdd\xef\xa5\x01\x29\xbd\x22\xa8\xbc\x7e\x72\x71\x09\x71\x01\x1e\xec\x1e\xc2\x4d\x53\xdb\x00\x9b\x00\x25\xd5\x10\x8d\x6f\x39\x34\xba\xe0\x51\x50\x65\xa5\x96\xca\x79\x96\xce\x25\x2a\x07\xb6\x1a\x14\xd2\x59\xa6\x39\xb4\x8e\xf0\x90\xc0\x29\xab\x30\x18\x20\x54\x25\x71\x52\x96\xc0\x99\x82\x53\x51\x60\x7e\x2a\x2c\xbe\x77\x50\x13\x44\x6d\x9f\xc0\xb7\x39\xb0\xdb\x1a\x78\xbe\xc3\x1c\x8f\x01\x44\x0d\xb9\x51\xe3\x65\x4c\x09\x9e\x03\x17\x49\x60\x58\xc1\x8b\xf4\x88\x2c\x33\x68\x17\x7c\x98\x63\x48\xdf\xd0\xd3\xc9\x58\x5b\xc2\x9f\x70\xf0\xea\xf9\x0b\x48\x85\x82\xca\x22\x31\x4f\xaa\x95\x22\x82\x70\x1a\x04\xe9\xb2\x3e\xde\x49\xcb\x04\x64\x70\x24\xad\x33\x93\x04\x9e\x6a\x53\x08\x77\x0c\xdf\xc4\x57\x7d\x1e\x4e\x1b\x90\xe5\x77\xc7\xdf\x94\xda\xb8\xef\xe0\x95\xca\x27\x34\x68\x06\xb7\x63\x54\x70\x51\xef\x0d\xbe\x6d\xfd\x78\x66\xca\x34\x81\xb3\x91\xd2\x26\xb6\x24\xaa\x3a\x2b\xc4\x08\x61\x28\x31\x67\xba\xb6\xe8\x92\x59\x0c\xae\xc4\x22\x78\x73\x69\x28\x47\x2f\x44\xb9\x16\x34\xa7\xb1\x25\xcd\x45\xd3\xb7\x95\x77\xf3\xd1\x69\x26\x65\xda\x12\xfd\x29\xd2\x6b\x10\x61\x96\x42\x94\x7d\xcb\x6c\xd3\x02\xd3\x66\x10\x38\x8d\x03\x10\xfc\x9a\xd7\x67\x41\x72\x25\xdb\x6e\xbb\xbd\xb3\xad\xfb\x36\x66\xc8\x5a\xa0\xbd\x58\xa4\x45\x36\x98\x63\x64\xca\xf4\x5c\x67\x7e\xdb\x6b\x67\x79\xd6\x6e\x0d\x78\x57\x6a\x8b\x16\x32\x39\x1c\xa2\x21\xb9\xa3\x6f\xd0\x18\x99\xa1\x85\xa1\x36\x8c\xaf\x52\x67\xcc\x93\x35\xfe\xa6\x54\xed\xb9\xce\x36\x45\x0c\x4d\xcd\x0a\xc3\x13\x63\x20\xc3\xa5\xdb\x5d\xc8\xed\xb0\x86\x79\xe9\x11\x43\x36\xff\x27\x8b\xbf\xce\xc0\xe3\x24\x34\x8e\x94\x1a\x2c\xaa\x20\x3a\xf6\x2d\x6d\x7f\xdf\xd6\x63\x2e\x5a\xee\x06\x4b\xde\x64\xd9\xf4\x28\x9d\xe1\xc9\x9a\xe5\xcf\x6d\xe1\x31\xff\x18\xa0\xe5\xee\xf5\x52\x59\x83\x67\x55\xce\xa2\xa6\xca\xa7\x31\xba\x6c\x1f\x1b\xee\x65\xd3\xfd\xf8\x76\x38\x44\x63\x30\x7b\x5c\x11\xfd\x5e\xd4\xab\x0a\x42\xca\xbf\x7e\x72\x87\x69\xb5\x8c\xc7\x96\x6e\x9d\x8c\xe2\xb0\x4d\x34\x70\x2b\xf3\x3c\x4c\x47\x02\x25\x7e\xa0\xfd\xb2\x1d\x43\xe0\xb1\x5e\x48\x5b\xe1\xa4\x1d\x4e\x18\x1c\x35\xc0\xf0\x8e\x74\x36\x7b\x2c\x4c\xf1\x72\x28\x31\x83\xc1\x24\xa8\x6b\x12\x9e\x3d\x18\x54\x0e\xa4\x63\x5d\x9e\x8e\xb5\xb6\x08\xc2\xc3\x9d\xc7\xbd\x91\x9a\x2d\x25\xd0\x0a\x49\xfe\x14\xa4\x90\x03\xe3\xb4\x86\x4f\x78\xe5\x4d\x37\x69\xa1\x20\x89\x5f\xc3\x2a\x92\x23\x0d\x73\x2b\xdd\x98\x7f\x8c\xc8\xe4\x26\x2b\xcc\x56\x05\x0d\x7a\x8b\x72\x34\x76\xb6\x07\x32\xc1\x84\xb1\x8b\x22\x1d\xb7\x86\x2d\x10\x9d\x05\x91\xe7\x71\x09\x6d\x92\xf0\x7a\xb3\x20\x13\x05\x0e\x6a\x1b\x26\xd8\x1b\xbd\x5a\xaf\xce\x62\x6d\x21\xb8\x7a\x80\x2e\x4d\x0e\x7b\x90\xea\xa2\xac\x1c\xc1\x84\xd6\x38\x98\x80\x74\x64\x67\x7b\x7b\xc9\xe8\x6a\xe4\x77\x82\x79\x98\x38\x1a\xab\x5e\x33\x91\x70\x20\x1f\x51\x8d\x60\xcf\x6f\x6e\x2f\xda\x9f\x34\x9c\xf4\x9b\xe0\xfd\x15\xc2\xa5\xe3\x60\x02\xa7\xda\x18\xb4\xa5\x56\xdc\x93\xbf\x3c\x69\xd6\xf6\xcf\xba\xd3\x81\x3d\x6c\x80\x39\x96\xa3\x71\x84\xa5\x30\xc8\xef\xa6\x71\xb0\x8a\x47\x1a\x3e\x11\xc6\x4c\xf9\x92\x8b\x1e\xe9\xb0\x58\xc3\x25\x73\xa4\x7d\xa2\x00\x8b\xd2\x4d\x5a\x34\xd1\xc2\x9e\x43\x53\xd4\x30\x60\x04\x33\xbb\x5a\xbf\x3f\x59\x94\xb9\x4c\xa5\x0b\x14\x02\x0f\xe1\x80\x49\x44\x3a\x12\x65\xa0\x74\x5f\x97\x87\x09\x9c\x70\xf8\x62\x83\x09\x94\xae\xc7\x0f\x03\xd1\xa4\x56\x37\x63\xad\xdd\xdb\x86\x42\xc5\x3f\xcb\x6d\xba\xf9\xa7\x1f\xd6\x8f\x2a\x9d\xb5\xf2\x16\x37\xf7\x30\x59\xdb\x74\x53\xf1\x16\x5b\xc7\x35\x6c\xd2\x7a\x16\xd5\x9e\xa4\x2d\xe6\x98\x92\x4b\x4a\xb0\xef\x81\xb0\x56\xa7\x92\xac\xfc\x86\x68\xa7\x29\xdd\xef\x64\x3d\xec\x61\x5b\xf8\xc3\xd6\xfb\xa7\x67\x96\xf1\x36\xed\x37\x07\x8d\x5c\x92\xf1\x3b\x9c\x81\xca\x94\xc0\x1a\x4c\xf8\xeb\xbe\x85\x5c\x0c\x30\xb7\x9b\x01\x01\xb6\xe2\xda\xe6\xd9\x90\x7f\x97\x6e\x68\xe9\x46\x82\x8f\x59\x23\x9e\x84\x36\xf9\x66\x42\x2a\x1b\xfc\xe7\x1e\x08\xb8\xc6\x89\x77\xb5\xc9\x83\x8f\x81\x0b\x6e\x6c\xd0\xab\x1b\x22\x8e\x6b\x9c\x70\xa3\xe0\x77\x6f\xb1\xdc\xad\x89\xc3\x3f\xdb\xb0\x69\xf3\xf4\x69\xa1\x5b\xf6\x88\x9b\xde\xa2\xdb\xf6\xf4\xeb\x9f\x6b\x5c\x69\x79\x2d\x7a\xe6\x4c\x12\xa6\x49\xc6\x07\x23\x89\xf5\x57\xc4\xb1\x28\xcb\x5c\x22\xfb\xf3\x5b\x4e\xb3\xd2\x0b\x58\xf5\x44\xe8\xdd\x6b\x5f\xaf\xeb\x80\x86\x27\xc8\x7d\xeb\x89\x8f\x38\x7d\x2c\x4b\xef\xdf\x5a\x64\xc6\x8d\x91\x9f\x9f\x44\x2e\x9b\x50\x9b\x65\x3d\x7b\xa6\x7a\xf0\x52\x3b\xfa\xdf\x13\xf2\x84\x6d\x0f\x1e\x6b\xb4\x2f\xb5\xe3\x9f\x09\x3c\x73\x9e\xd6\x9f\x6f\x28\xd9\xde\x01\x80\xfc\x7a\xef\x05\x9e\x13\xe5\x65\x0a\x6d\xbf\x1d\x33\xb2\x09\x9c\x79\xb3\xa5\x66\x5c\x69\xe1\x4c\x91\x71\x18\xc0\xc0\x51\x3c\x6e\x1b\x86\x28\x2a\xcb\x41\x1e\xa5\x55\x9f\x6d\x80\x85\x63\x78\xe8\xd1\x38\x6d\xf8\xad\x18\x6e\xf9\x50\xcf\x38\xd6\xf0\x7c\x69\xe7\xb1\xb8\x61\x93\x4e\xaa\x51\x5e\x1b\x6f\x3d\xb8\x1d\xcb\x74\xec\xad\xee\x01\xfa\xd0\x60\x69\x90\x14\x96\xb0\x24\xaa\xe8\xcd\x08\x0d\x19\xbb\x32\x8e\xe7\x03\x93\xb9\x48\x31\x83\x8c\x4d\x4b\x1f\x64\x13\x0e\x47\x32\x85\x02\xcd\x08\xa1\x24\x4d\xb2\x1b\xf6\xb7\x13\xec\xfe\xd9\x5a\xbc\xb7\x27\xdc\x8a\xdc\x58\x45\x3e\x25\x5b\xf7\x2f\xd2\x8e\x6c\x57\x77\xda\xb1\xd3\x8e\x33\x4f\xa7\x1d\xeb\xa7\xd3\x8e\x6b\x9e\x4e\x3b\x76\xda\xf1\xbd\x6b\x47\xef\xcb\xee\xe0\x3c\xff\xdb\x87\x38\x66\xbd\x65\xd6\xb4\x31\x4d\x37\xed\x36\x93\xbe\xb9\x08\x02\xe7\x92\x5d\x6d\xe9\x93\x24\x46\xa8\x11\xc2\xa3\xfe\xa3\x87\x0f\xb7\x71\xaa\x03\x22\x37\xea\x31\x0c\x99\x1e\xa9\xdc\x97\x5f\xac\xec\xb1\x2c\xfe\xf6\x0e\xa2\xa6\x81\xc6\xeb\x40\xde\x94\xed\xb0\x24\xf0\xc9\xd2\x49\x69\x07\x05\x3a\x10\x6e\x2a\x54\x24\x0b\xec\xd5\xa9\x02\x26\xf8\x90\xa5\x8c\x11\xd8\x0c\xb4\x0a\x71\x3c\x02\x7e\xb2\xdb\x0a\x52\x14\x3e\xa5\x36\xc0\x7a\x15\xba\xa0\x59\xa5\x72\x91\x5d\x68\x09\x18\xa1\x02\x07\x98\x8c\x12\xc8\x2a\xee\x26\x54\x48\x9b\x1e\xfa\xd5\xda\x89\x75\x58\x70\x24\x57\x1b\xfe\x1f\x2d\xdb\x99\x09\x35\xc6\x1b\x54\xae\x12\x79\x3e\x01\xbc\x91\xa9\xab\xf7\xc7\x59\x5b\xe9\x7c\xb0\x7d\xb3\x10\xe1\x46\xa6\xc3\xe6\xe6\x42\x7f\x8e\x82\xed\x9a\x3e\xdb\x68\xfb\xb9\xb1\x37\xe1\xc9\x19\x5d\xe8\x77\x92\x2c\x35\x56\x1d\x8d\xeb\x63\xe0\xfc\x27\x13\xd7\xab\xd7\xeb\x43\xae\xb0\xb5\x24\xdb\x42\x7a\xcd\x9a\xa5\x55\x9e\x13\x61\xf8\x28\xec\xfc\x06\x16\x44\x47\xfd\x96\xa6\x88\xd9\x07\xde\x7d\x88\xf9\xe4\xe5\x63\x82\x0a\xb5\xb9\xd4\xa5\xce\xf5\x68\xd2\x86\xb4\x2f\x2f\x92\x45\x19\x83\xe3\x02\x6c\x35\x08\x46\x03\x91\xdf\xcb\x19\xd4\x74\x91\xbf\x2e\xf2\xd7\xf9\x36\x73\x4f\xe7\xdb\xd4\x4f\xe7\xdb\xac\x79\x3a\xdf\xa6\xf3\x6d\xba\xc8\x1f\x74\xda\x71\x05\x4c\x3a\xed\x08\x9d\x76\x5c\xba\xaf\x4e\x3b\xae\x04\x4f\xa7\x1d\x3b\xed\xb8\xe8\x29\x75\x76\x8f\x42\xc7\x52\x67\x2b\xea\x1c\x7d\xd4\x27\xd5\xfd\x5c\xa7\xc2\x85\xba\x7c\xea\x12\xe2\x7c\x56\x14\x3e\x10\xd5\x83\xdf\xb4\x42\x5f\xbc\x46\xb8\xe1\x70\x92\x76\x63\x34\xd4\xfc\xc0\x1e\xae\x2c\x6c\xea\xea\x24\xbb\x3a\xc9\x8f\xbe\x4e\x72\x2c\xac\xc7\xab\x17\x4a\xcb\xcb\x26\x5b\x0c\x79\x89\xa6\xf8\x44\xab\x26\x89\x5c\x02\xba\xf9\xc4\x53\x83\x52\xbf\xf3\x2c\xe4\x0b\x30\x3b\x9f\xde\x6f\xb0\x97\x79\x53\x22\xcb\x30\x83\x12\x4d\xdf\x93\x88\x86\xa1\x54\xd9\x82\xbd\x46\xf8\x7c\xd0\xea\xc7\xe9\x7d\x7c\xc0\x12\xc8\xe9\x85\xec\x10\x73\x6d\x07\x8e\xa7\x24\xfc\x47\x51\x10\xb9\xad\x55\xdf\x07\x17\x82\xbc\x3f\x6c\x68\xd7\x6f\x6f\x9a\xb3\x41\x1d\x43\xc2\xbb\xfb\x95\x6c\x96\xff\x5a\xa1\x99\xf0\xf9\x8f\xc6\x60\xad\xcf\xd6\x85\x1c\x99\xb4\x90\x0a\xeb\x35\xc5\xb6\xae\xe5\x96\x6e\xd4\x6e\x7e\xca\xee\x91\x68\x98\x85\xcb\xec\x50\xde\x27\x8d\x3e\xb8\x87\xd9\x42\x27\x7c\x41\x16\xa0\x89\xfe\x6f\xb5\x9e\x5d\x4d\xb7\x9d\x0c\xb7\x85\x44\xf1\x11\x3b\xe7\xb0\xbb\x83\x0e\x3b\x3b\xe9\xb0\x93\xa3\x0e\xbb\x3a\xeb\x70\x0f\x87\x1d\x76\x73\xda\x61\x96\x14\x08\x43\xc1\xca\x7a\x3f\xfe\x3b\xdc\xc7\x45\x85\x7b\xf8\xf1\x30\xbb\xd5\x9a\x4c\xcd\xfb\x72\xea\x99\xd6\xa7\xfc\xfa\xbf\x1a\x58\xbb\xf9\xf4\x30\x0b\xaa\xe0\x0c\x4b\x76\x68\x3f\x11\x0f\xff\x2f\x71\xb7\xe1\x5e\x2e\x37\xec\xee\x76\xc3\xee\x94\xc1\xaa\xee\x39\xa7\x53\xef\xab\x30\xfd\x28\x5e\x45\xf0\x19\xdc\x21\xfc\x4e\x9a\x80\xf1\xf2\x27\x94\x42\x1a\x4b\xf6\x5d\x88\x99\xb4\xbf\x05\xef\xbc\x3d\x4c\xe1\x8f\x10\x93\xa8\xbe\x11\x39\xe9\x1e\x5f\xc7\x11\xfc\x22\x1a\x7d\x56\x4d\xf7\xe0\x76\x4c\xde\x26\x49\xa9\xfa\xbc\xf3\xde\x35\x4e\xf6\x7a\x73\x84\xb4\x77\xa6\xf6\xbc\x8e\x9a\x23\x9d\x5a\xa1\x69\x95\x4f\x60\x8f\xbf\xed\xbd\x6b\xcd\xbe\x83\xe2\x6a\x5f\xa1\xb2\xab\x5e\xd8\x81\x4a\x54\xbc\xd6\xe5\xdd\x1b\x9b\x5e\x8b\xf8\xc4\x46\x9c\xc5\x36\x0a\x86\x4b\x2d\x5a\xca\xa5\xae\x1a\x61\x1a\xe3\xf7\x59\x74\x7e\x2b\x15\x6e\xba\x88\x67\xce\xc3\x60\x5e\x49\xcd\x97\x34\x05\xc4\x6b\x85\x96\x0d\x3b\xac\x43\x44\xad\xce\xdc\x36\xf1\xe5\x20\x8d\xb6\x53\xd9\x6c\x81\x48\xd3\x83\x6d\xc4\x02\x85\xb2\xb0\x17\x63\x4f\xfb\xb6\x69\xb1\x97\x34\xa7\xfb\xea\x11\x0f\x7e\xff\xf3\x70\xea\x44\x5f\x33\x60\x67\x69\x77\x96\x76\x67\x69\x6f\xd1\xab\xb3\xb4\x97\x3f\x9d\xa5\xbd\xc5\xd3\x59\xda\x9d\xa5\xbd\x6a\xe2\xce\xd2\xee\x2c\xed\xf5\x93\xef\x66\x69\xef\x5a\x27\xd4\xb6\x7b\x43\x72\xce\x5f\x64\x26\x9c\x4c\x9b\x1a\xa2\xd8\xca\xff\xf5\x6e\xed\xed\xb6\x2d\xbd\xd8\xda\x6e\x5b\xe4\x73\xbe\x45\xb2\xc6\xb4\xae\x8d\xef\xb9\x9e\xab\xad\xee\x8f\xab\x16\x6a\x07\xda\x68\x25\x14\x76\x24\x8e\xcb\x98\x0a\x0f\x17\xff\x0d\xb0\xc9\x93\x67\x70\x10\x33\x2e\x87\x04\x7c\xa5\xdd\xf4\x47\xe5\x64\xbf\x69\x51\xe7\x60\x38\xbd\x38\x75\xde\x66\x2a\x2d\x51\x67\xdd\xeb\x4c\x71\x83\x4f\x12\x21\x68\xa6\xd6\x20\x6d\xb8\xde\x90\xab\x25\x4c\xa5\x14\x8d\xaa\x55\x4c\x1f\x7b\x99\xe3\xef\xe3\x0b\x94\xe7\x8d\x25\x5e\x0f\x5b\x4c\x0d\x94\x5a\xf9\x4e\xe1\xfc\x15\x88\xa1\x94\x5f\xab\x90\x11\xa5\x37\x31\xeb\x1b\x89\x92\x77\x24\xeb\xd9\x13\x78\xc2\x74\xd8\x1e\x58\x5a\x86\x8f\xc8\x73\x7d\xbb\x8d\x48\xfa\xab\x8e\x45\xdd\x6e\x7d\x2c\x6a\x26\x7f\xd7\x9d\x8a\xfa\x2f\x39\x15\xc5\x1f\x3d\x0b\xbd\xf3\xe3\x51\xf0\xef\x70\x01\xa1\x41\x06\x55\x51\xe5\x4e\x96\x4d\xad\x94\xf5\x53\xe5\xde\xca\x1c\x86\xca\x93\x69\xba\xa4\xd9\x44\x3a\x9e\xa5\x4f\x1e\x8f\x6b\xab\x2c\x33\x6d\xa8\xee\x10\x79\x1e\xce\x14\x45\x93\xd4\x97\xb0\xc8\x0f\x5d\x99\xf0\x38\xdc\xd9\x5a\x7b\x33\x2c\x64\x0e\x48\x16\xe6\x84\x50\x92\x6a\x2b\x84\xa8\x77\x8a\x6e\x30\xaa\xde\x91\xbc\x41\xd5\x48\xd2\x03\x7b\x78\x18\x75\xf8\x3b\x95\xf0\xef\x45\x42\x7f\xd3\x92\xa4\xdf\x6d\x22\xa3\x79\x43\xb5\x94\x6e\xc0\xd7\xc8\xe8\x0f\x59\x82\xb1\x4d\x9e\x7f\xbb\x18\xc3\x0e\xf9\xfd\xbf\x30\xb7\xff\xe9\x9c\x2c\xfb\xc0\x11\xc6\x0f\x51\x5b\xff\xd1\x47\x15\xbb\xe2\xfa\xe6\xb9\x6f\x71\xfd\x7b\x8f\x1c\x7e\xd8\x1a\xfb\x4f\x20\x5a\xf8\x21\x6b\xec\xbb\x08\xe1\x4a\xa4\x7c\x6c\xa5\xef\xd3\xcf\x4e\x11\xc1\x2e\x1a\xb8\xb3\x16\xde\x52\xe1\xdc\x37\x0a\xb8\x25\x45\xec\x98\x67\xef\x72\xec\x7f\x4d\x8e\xbd\xb3\x78\x37\x7c\x3a\x8b\x77\x29\x50\x3a\x8b\x17\x3a\x8b\x77\xdd\xf6\x3a\x8b\x77\x25\x78\x3a\x8b\x77\x25\x52\x3a\x8b\xb7\xb3\x78\xe1\x53\xb3\x78\x77\xb9\xa5\xab\xcb\x75\xdf\x2b\xd7\xbd\xad\xb4\xd8\x4a\x46\x6c\x49\x07\x5b\xe7\xb6\xbb\xbc\xf6\xc7\x92\xd7\xde\xf8\xc0\xbf\x72\xf2\xbe\x87\xfe\xdb\xb8\x5a\x76\xf2\x5f\xdc\x68\x99\x41\x59\xb9\x70\x9e\xba\x3b\xfd\xff\x2e\x4e\xff\x4f\x41\xbe\xbb\x02\x60\xa3\x2b\x00\x96\xc1\xac\xbb\x07\xa0\xbb\x07\xe0\x1d\x27\xa1\xbb\x7b\x00\xba\x7b\x00\xba\x7b\x00\xe2\xd3\x9d\x4e\x82\xee\x74\xd2\x46\x4f\x77\x3a\x69\xf9\xd3\x9d\x4e\xfa\x68\xa3\xaf\xd0\x9d\x4e\xfa\xb8\x23\xb1\xd0\x9d\x4e\xea\xa2\xb3\x1b\x22\xea\x13\x3c\x9d\xd4\xdd\x03\xf0\xb1\xd6\x28\x40\x67\x69\x77\x96\x76\x67\x69\x77\x96\xf6\xea\xa7\xb3\xb4\xb7\x78\x3a\x4b\xbb\xb3\xb4\x57\x4d\xdc\x59\xda\x9d\xa5\xbd\x7e\xf2\xee\x1e\x80\x4f\xa8\x36\x02\xba\x7b\x00\xba\x7a\x89\xee\x1e\x80\xff\xde\x7b\x00\xa6\x72\xf7\x1f\xee\x32\x80\xed\x97\xd1\xdd\x08\xd0\xdd\x08\xd0\xdd\x08\xd0\xdd\x08\x10\x9f\xee\x46\x00\xff\x7c\x4c\xb1\xc6\xee\x7c\xd4\x52\xa0\x74\xe7\xa3\xa0\x3b\x1f\xb5\x6e\x7b\x9f\x40\xdc\xb0\x3b\x1f\xf5\x11\xc6\x0a\xbb\xf3\x51\x5d\x5c\x70\x16\x39\x9f\xc8\xf9\xa8\xee\x46\x80\x8f\x31\xdb\xde\x59\xbc\x1b\x3e\x9d\xc5\xbb\x14\x28\x9d\xc5\x0b\x9d\xc5\xbb\x6e\x7b\x9d\xc5\xbb\x12\x3c\x9d\xc5\xbb\x12\x29\x9d\xc5\xdb\x59\xbc\xf0\xa9\x59\xbc\xdd\x8d\x00\xdd\x8d\x00\xdd\x8d\x00\x9f\x62\x86\x7b\x2d\xa6\x0b\x2c\xb4\x99\x5c\x0a\x33\xc2\xa5\x59\xed\x29\x74\xee\xbd\x68\xf5\x20\x09\x39\x94\xa3\xca\x04\x03\xfc\x6f\xcf\x5e\xbd\x78\xf2\xe2\xf9\xd9\x8b\xb3\xcb\x00\xaf\xa1\xf6\x2e\xee\xe8\xf5\xf9\x29\xa4\xc2\x89\x5c\x8f\xe0\x5c\x67\x41\xe9\x7a\xeb\x5f\x0f\x5d\x58\x08\xe4\xb2\x90\xae\xee\x65\xd1\xdc\xa0\xe9\x05\xb8\x71\xf2\xbb\x52\x4e\x16\xe8\x53\xb7\xc2\x39\x62\x4d\x92\x03\x05\xa2\xe3\x73\xee\x85\xb8\x46\x02\x14\x8c\x2a\x61\x84\x72\x18\x51\x21\x9d\xef\x94\x69\xb0\x3a\x98\x0f\x32\xf8\x18\xb4\x0e\x8b\xc1\x52\x38\x8f\x99\xe1\xb1\xb8\xf1\x07\xaa\x87\x9a\x60\x4e\x44\x51\xe8\x4c\x0e\x65\xea\x8d\x3c\x28\x44\x56\x67\xfd\x82\xae\x40\x53\x13\x50\xb3\x81\x63\xe8\xcf\x81\x07\xd5\x8d\x34\x5a\xb1\x06\xbb\x11\x46\x8a\x41\x1e\x76\x35\xf0\x01\x01\x1e\xb7\x59\xa0\x82\xc1\x84\xfc\x1c\x3f\x52\x80\x56\x38\xf9\xbe\xa2\xdf\x54\x73\x0f\xdc\x99\xc6\x5f\x3c\x7c\xf8\x3f\xeb\xe3\xec\xbe\xd3\x95\xf2\xd8\xf1\x12\xb3\xe1\x5b\xea\x21\x87\x20\xdd\x3e\x71\x8c\x25\xcf\x87\x46\x30\x98\x55\x69\x84\x94\x76\xa5\x91\x5e\x2b\x8b\x1a\xe1\x1e\x0c\xc4\x5d\x45\x45\x0c\x40\x02\xc1\x5a\x39\xc8\xb1\x47\x6c\x2f\xdb\x6d\x07\x48\xc0\xe3\x1e\xcc\x9a\x37\x48\x2b\x27\x72\xf3\x12\x17\x91\x78\x5f\xf3\x59\x77\xe1\xf9\x3c\xc3\xa1\xa8\x72\xcf\x1a\x1e\x37\x8c\xdf\x89\xae\x48\x14\x64\x78\x07\xb2\x10\x23\x7f\xf6\x5e\xc0\x50\xe6\xd8\x8f\x39\xf4\x54\xa4\x63\xec\x41\x86\xa4\x5b\xa4\x42\x10\x30\xd2\x3a\x23\x15\x63\xf4\x9d\x2c\x78\xb4\x40\x8f\x35\x7c\x06\x13\xc8\x74\x35\xc8\x6b\x2c\xcb\xdf\x6a\xc9\x50\x8a\xf4\x9a\xe6\xe2\x81\x41\x38\x38\x72\x45\x79\xc4\xbf\xc2\x7f\x43\x0b\x9b\xfc\x62\xb5\x8a\xa2\xaa\xb5\xcc\x64\x06\xfe\xd2\xc2\x00\xad\xeb\xe3\x70\xa8\x8d\xfb\x27\x41\xab\x52\x4c\xad\x4a\xd7\x5b\x8f\x48\xad\x2c\x7a\x1d\xa7\x34\x13\xf2\x14\xe6\xb5\x59\xc0\xa1\x2d\x72\x48\xf6\x96\x48\x80\x92\x38\xcd\xa8\x63\xf8\xbf\x07\x57\x9f\xff\xd1\x3f\xfc\xfe\xe0\xe0\xcd\xc3\xfe\xd7\x6f\x3f\x3f\xb8\x4a\xf8\x8f\xcf\x0e\xbf\x3f\xfc\x23\xfe\xf8\xfc\xf0\xf0\xe0\xe0\xcd\x0f\x2f\x9e\x5d\x9e\x3f\x79\x2b\x0f\xff\x78\xa3\xaa\xe2\xda\xff\xfa\xe3\xe0\x0d\x3e\x79\xbb\xe1\x20\x87\x87\xdf\xff\x6d\xc9\x82\x84\x9a\xbc\x1a\x2e\x57\x46\xfd\x0d\x6b\x5e\xfa\x9b\xa8\xc2\xbb\xfe\x75\x35\x40\xa3\xd0\xa1\xed\x4b\xe5\xfa\xda\xf4\x7d\x87\x63\x70\xa6\xc2\x85\xdd\x48\xe2\xaf\x0b\x14\x4e\xc9\xd5\x97\xad\x0e\x33\x41\x91\x70\x53\x44\xf0\x59\x68\xca\x5a\x40\x92\x5e\xe5\xeb\x10\x5c\xa3\xaf\x12\xb8\x58\xd0\x93\xd5\x52\x68\xb1\x6f\xbd\x02\xb3\xb3\xe3\xcc\xd4\xc1\x78\xc1\xc9\x63\x2e\xd9\xc2\x06\x66\xec\x76\x46\xeb\x5a\x7c\x94\x46\x6a\x23\xdd\xe4\x34\x17\xd6\xbe\x14\x05\x6e\x04\xdd\xb3\x61\x63\x0c\xf4\x88\xd9\x48\x86\x07\xa5\xe5\x0d\xb4\x38\x2e\x4b\x0e\xd2\xb3\xad\xf6\x11\x42\xb1\x4d\xcd\x33\x91\xfb\xb4\x81\xdf\xd0\xe8\x70\xd1\x87\x41\xaf\xab\xe3\xe7\xd5\xc0\x5b\xb1\x57\x8b\x69\xc5\x7b\xd5\xca\xe1\x9d\x3b\x65\x65\xbb\x99\x96\xbe\x58\xd4\x15\x52\xa1\x68\xd9\x7c\xd1\xcb\x10\x7e\xce\x71\x24\xd2\xc9\xcf\xb4\xfc\x9f\x0d\xd2\x42\xc8\x16\xf9\xd9\x1b\xdb\xa7\x5e\x1e\x5f\x70\x25\xc2\x7e\xb8\xb9\xc7\x02\x4a\xbe\x98\x47\xaa\x5f\xbc\xe1\x52\xdb\x64\x86\xeb\xdb\x4a\x9d\x25\x04\xb9\x64\x66\xed\x2c\x93\xea\x8f\xb5\xb2\x7c\xf3\xd9\xdb\xb9\x96\xc1\x05\x23\x27\x8f\xd4\x6e\x9b\x3e\x4d\xc5\x02\x93\x04\x5b\xdc\x20\x9c\x64\x85\x64\xaf\x0f\x0e\xce\x2f\x4e\x0e\xa7\x76\x42\xfa\xda\xab\x98\x4c\xa3\x55\xfb\xce\x2b\xbd\x31\xda\xc6\xd3\x63\xb5\xc1\x85\x16\x9e\x5b\xb8\xd2\x22\xce\x49\x00\x63\xe7\x6f\x80\xf5\xe4\x17\x27\xf0\xf3\x40\x58\xcc\xa5\x42\x0f\xbb\xd2\xc8\x1b\x99\xe3\x88\x66\x6c\xc5\xad\xe1\xb4\x32\x06\x95\xcb\x27\xf1\x06\x98\xc5\x58\x91\x96\x04\xfa\x34\xb9\x45\xca\xaa\xad\xce\x1a\x59\xd4\xda\x62\x96\xc0\x05\xf7\x98\xf8\x10\x45\x68\xc7\xb8\x61\xbd\xb8\x0c\xb9\x60\xd0\xd2\xc0\x52\xf9\x5e\x32\xf3\x2a\x0e\x8d\x21\x97\x87\xab\xc2\x2a\xcb\x06\x70\x9e\xa1\xa9\xd5\x32\xab\x26\x1b\x4d\xb1\x94\x4d\x82\x50\x3a\x17\x00\xb3\x00\xf0\xcb\xf7\x3c\x6d\x54\x38\x5d\xaf\x97\xb5\xdf\x19\x2d\x6e\x58\xb9\xca\x20\xe9\x7f\xc6\x2e\xf3\x5c\x1b\x34\x33\x76\x4c\x7b\xfa\x5e\xbd\xec\x42\xc8\x40\x6a\x36\xce\x69\x70\x50\xc9\x9c\xbd\x40\x59\xef\xcf\x7a\x42\x16\xf5\x74\x7a\x08\xba\x2c\xc2\xf5\x4b\x55\x59\x6a\xe3\x1a\xdf\x20\x6d\xf3\x46\xb0\xdd\x17\x00\x80\x96\x55\x1a\x2c\x85\xa9\x25\xb6\x45\x48\xc7\x42\x91\xfa\xa7\x8d\xbe\xd0\x5c\x2a\xe7\xeb\x2d\x69\x5a\x31\xd0\x95\x63\x1a\x0b\xbc\x3a\xd4\x95\xca\x80\x84\xca\x31\x8c\x9d\x2b\xed\xf1\xd1\x51\xa3\x8f\x12\xa9\x8f\x32\x9d\xda\xa3\x54\xab\x14\x4b\x67\x8f\x22\x37\x1d\x95\x3a\xeb\xc7\x1f\x7d\x11\x99\xe4\x68\x7f\x99\x8e\xdf\x40\x13\x06\xc8\x1f\x83\xc7\xd5\x92\x56\xa8\xaa\x15\x97\xcd\xf4\x57\x77\xa6\x06\x0d\x18\x17\x36\x72\x3a\xe7\xab\x99\x56\x64\x60\xa6\x1d\xd0\xa6\x7d\x7d\x45\x52\x6d\x98\xb6\xa4\xdb\xbe\x6d\x0f\xbd\x5a\x68\xaf\x72\xcc\xd7\xb8\xe2\x73\xd7\x23\xb1\x6c\x23\x73\xaf\x59\x28\x1b\x00\xce\x09\xbe\x20\x89\x0c\x7a\xff\x85\xc4\x95\x9a\x00\xd1\xb3\x0b\xb7\x65\xb5\xae\x8f\x72\x86\xeb\x37\xbf\xa9\xa3\x69\x3d\x1c\x0e\x31\x75\xdf\x05\x7e\xae\xe3\x6a\xcc\xdc\x31\x02\xf6\x4d\xfc\xeb\xbb\xe5\x1e\xe5\x46\xc1\xaa\xcd\xd2\x0d\x7e\x49\xab\xc3\x08\x53\x10\x7a\xc2\x1d\x66\x54\xb6\x87\x80\x1f\x8b\xbd\x3f\x0e\xc8\x06\x9f\xd9\x07\x5f\x82\xbd\x43\x32\xa3\xd5\xd8\x06\x09\xd7\x92\xb6\xc1\x9f\x6e\x22\x7f\x08\x2f\x75\x28\x64\xc6\x1e\x9c\xf3\xdd\x52\xcd\x1b\x56\x64\x2f\xb5\x2f\x69\x5e\x6a\x17\xb5\xe1\xb6\x36\xce\xb2\x36\xe1\x32\x05\x90\x1f\x9a\xf4\x8a\xdf\xd9\x54\x7a\xa5\xa1\xe0\xa9\xe8\xd9\x2a\xc8\x5c\xe3\xa4\x09\xc9\x87\xe4\x0d\x47\xbc\x7a\x0d\x95\x44\xe3\xd3\x47\xd8\xff\x19\x6a\x12\x75\x31\x90\xca\x4f\xe6\x87\x8e\xa8\xe0\xd1\x23\x40\x55\xc6\x3f\x79\x9a\x77\x01\xae\xcd\xb2\x38\x53\x30\x7b\xb5\x45\xce\xa6\x8e\x02\x2f\xce\xd6\xb4\x52\x34\x4f\x7e\xad\x44\x9e\xc0\x63\x2f\x15\x79\xf7\xe1\x55\x68\x34\x17\xb5\xbe\x95\x79\x96\x0a\x93\xb1\x36\xf0\x3c\x0a\x56\x7b\xec\x89\xda\xe0\x88\xdc\xde\xe0\xc8\xdf\x9d\x06\xa5\x30\x4e\xa6\x55\x2e\x58\x6d\xe1\x48\x9b\xc9\x3b\x81\x68\x43\x34\x17\x98\x6a\x95\xad\x09\x24\x2e\x91\xae\xa1\x6f\x1b\xc6\x6c\x46\xa1\x91\xa1\x44\x58\x16\x38\x4b\xa4\x07\xd3\xce\x8d\x1e\x46\xae\xae\x59\xac\xe7\xad\x9a\x5b\xc9\x66\x59\xdb\x2b\x96\xfe\x8c\xc1\x61\x4b\x3c\xd6\x5c\x91\xc0\xbf\x26\x51\x5f\xf5\x40\xba\x18\x3d\x63\xbf\x39\xcc\x19\x48\x36\x00\xbb\x61\xa8\xa1\x36\x78\x83\x06\x0e\x32\xcd\x7d\xb8\x8c\xfe\x30\x81\xff\x90\x89\xef\x63\x10\x23\x5f\xf1\x1d\x48\x3c\x5a\x22\x8e\x2f\x3b\xe4\x28\xe2\x43\x38\xf0\xd5\xf7\xb2\x28\x30\x93\xc2\x61\x3e\x39\xf4\x05\x18\xb1\x7e\x7f\x13\xd4\x6d\x72\x68\xa3\x75\x58\xe3\xab\xbf\xaf\x68\xc9\x8b\xdd\x02\xb3\x3f\xc5\xc8\x58\x03\x19\x6f\x65\xce\xa0\xb0\xd6\x41\x7a\x45\x52\xae\x95\x84\x6b\xd9\x7e\x51\xcc\xd4\x08\xfe\x85\xe8\x40\x80\xc1\x11\x53\xb9\xa7\xdc\x7b\xd0\xb8\x4c\x17\x1f\x3a\x59\xa3\xd1\x56\xe7\xf5\xfb\x40\xe6\xff\x57\x7f\xcf\x84\x13\x4b\x1a\x78\x9c\x4f\xca\x45\xc1\x81\x75\x8a\xb2\x19\x7c\x19\xb2\x36\x88\xea\x86\xe9\x77\x1a\x81\x4d\xfd\x45\x3d\xa7\x5d\x6a\x0e\xa9\xf9\x3c\x6f\xc4\x77\xdf\xe0\x48\x5a\x67\x26\xad\x70\xa8\x0f\xbd\x39\x0d\x52\x59\x27\x94\x93\x2c\xd9\x20\xb6\xec\x87\xd8\x20\x99\xdf\x09\xbc\x22\x5f\x8b\x63\x58\xb7\xa4\xa6\xbd\x81\x7d\x39\x29\x11\xbe\x6d\xfd\x78\x66\xca\x94\x69\x2d\x08\x1a\x4f\x5c\x22\xcb\x0c\xda\x79\xf9\xb0\x88\x7c\x56\xee\x3f\xba\xf9\x6b\x41\xb0\x7f\x1e\x03\x02\x21\xb7\x64\xad\x1c\x91\x95\x19\x4f\x7b\xc5\xd8\xf0\x94\xb5\xe9\xbd\x02\xee\x28\x7f\x63\x6e\x2a\x6a\x25\x20\x5d\xb4\xfb\x53\xad\x6c\x55\xc4\xa2\x2d\xf2\x7a\x4a\x54\x19\xaa\x74\xc2\xc7\x03\xf2\x1b\x34\x09\xfc\x68\x09\x53\xf0\xbf\xe5\x88\xfc\xbe\x30\x69\xdb\x54\x8a\xa7\x4e\x66\x56\x20\x6d\xeb\xce\x4c\x2e\x43\x23\x1b\x28\x8e\x80\xd9\x4c\x7b\x1b\x53\xe1\xb3\x8b\xa8\x7c\xac\xf5\xb2\x3e\x95\x16\x83\xa0\x11\x2e\x9e\xe1\x69\x4b\x23\xed\x0f\x20\x95\xda\xca\x78\x5a\xa6\x96\xa3\x53\x27\xdb\xf4\xd0\x9f\x3b\xf3\xe3\x4e\x3b\xc2\x5c\x53\x31\xb3\x19\x76\xdc\x2a\xe5\x81\x8f\xed\x28\x4d\x14\x33\x0f\xfd\x50\x8b\xfa\xb9\x78\x11\xf1\xf4\x92\x1b\x99\x6e\x84\xba\xc6\x0c\x72\xbc\x93\xa9\x1e\x19\x51\x8e\x65\xca\x87\xab\x88\x4d\x39\x48\xc6\x47\xaa\x44\x81\xc9\xfe\x52\x42\x5b\x26\xc6\xcb\x6a\x90\x4b\x3b\xc6\x85\xb6\xcc\x4a\x1a\xb5\x98\x1a\x74\x0b\x25\xc8\x14\x89\x5e\xf8\x76\x8d\x52\x8e\x15\x29\x61\x80\x50\x71\xe5\x69\x8e\x19\x8f\x40\x9c\xa6\xc4\x48\x31\xad\xd1\x5c\x78\x5b\xc3\x30\x81\x33\x17\x03\xd3\xd4\xe3\x1a\xb1\xf4\x94\xc6\xa9\x51\x5b\x70\x4c\xc5\x4a\x95\xa2\x3f\x22\xe6\x8f\xda\x21\xc6\x30\xa3\x33\x12\xbd\x19\x84\x1c\xe0\x8f\xb8\x41\xe5\x16\x1b\x35\xab\xfd\xae\x15\x3e\xd7\x6a\x30\xd6\x32\x65\x3d\x24\x1b\x59\x14\x75\x22\xfd\x4d\xa0\xe4\x2f\xdb\x62\xd0\x9f\xe8\xbb\xf0\xa5\x25\xeb\x65\xcd\x8f\x53\xcd\x43\xc2\xd2\xc2\x58\xdf\x86\x91\x66\x99\x36\x44\x6c\x22\x6e\x33\x69\x53\xe2\x74\xcc\xe0\x54\x2b\x1b\x8f\xf5\x09\xe5\x4f\xea\xdd\x88\xdc\x93\x42\x1c\xb8\xd4\x39\xe7\x37\xb2\x2a\xba\x13\xbe\xfa\x0e\x8b\x01\xf2\x75\xbc\x36\x2e\x65\x89\x9a\x5b\xa3\x62\xd7\x69\xc1\xa8\x1f\xce\x75\x9e\xaf\xd6\x62\x2b\xfd\xd2\x4d\xbc\xd2\x08\x80\x8d\xaf\x42\x3f\x8b\x10\x0b\xb1\x38\xa2\xe9\x26\x83\xc4\xa4\x41\xa6\x6e\x0d\xd8\x01\xba\x5b\x44\x05\xe9\x18\xd3\x6b\xdb\xe4\x90\xf9\x62\xec\x19\xac\x85\xf8\xd3\xb4\xc4\xaa\xed\x29\xc2\x0a\x3b\x1a\x16\xd1\xa7\xcd\x14\xde\xb6\x63\x56\x0b\xd4\x0d\xa9\xe8\x1b\x21\x73\x31\xc8\xfd\x71\xd6\xfa\x57\xaf\xbd\x0e\x19\xf5\x79\x59\xe5\x79\x48\x22\x71\xd6\xd6\x19\x31\x1c\xca\x94\xd3\xe4\xd2\xf8\xa8\x6f\x50\x6c\x0b\xb7\xb0\xfe\xb2\xf6\x05\x1c\x61\x9d\x70\xd5\x1c\x8e\x56\x20\x78\x15\x62\xc9\x0f\x91\x4b\x03\x44\x33\x57\x1c\x4f\x39\x2b\xb4\x0c\xf4\xce\xd6\x54\xfc\x3b\x81\x97\xda\x85\x1b\xca\x5f\xa0\x25\xb5\xcb\x00\x7a\x8d\xc2\x6a\xd5\x92\xae\x6c\xfd\x1a\x39\x92\x4a\xe4\x61\x53\xed\xf8\x5e\xed\x7b\x08\x0e\x29\x17\x72\x64\x84\xab\x85\x62\xb3\xee\xa0\x5d\x82\x5e\xf4\x91\xd0\x04\x4e\xd4\x84\xf1\x3d\x44\xe1\x38\xe7\x2e\x95\x33\x3a\xab\x52\x0c\x19\xeb\xca\xb6\x07\x79\xa7\x62\x74\x3a\xbd\x70\x1a\x27\x69\x6a\xa4\x32\x74\x42\x86\x94\x92\x56\x08\xc2\x96\xe4\xc7\x45\x9a\xf4\xa1\xf0\x06\xc0\xac\x2c\x4e\xce\xcf\xe0\x75\x38\xec\x98\x40\xbf\xdf\xf7\x79\x4f\xeb\x4c\x95\xb2\x7e\x21\x16\x52\x59\xd0\x14\x9e\xfa\x78\x93\xa2\x55\x5e\x18\x22\x1f\xde\x04\x2b\x85\x1b\x43\xe2\x01\x9f\xb4\x40\x01\xf0\x94\x74\xcd\x9d\x28\x4a\xa2\xfb\x2b\xe5\xa5\xf7\x53\xad\x2f\x3c\x92\xfc\x9c\xbf\xc3\xd1\xd1\x2c\x4d\xe8\x01\x99\xa8\x21\x80\xc8\xa4\x31\xd4\x7a\xdf\x4e\x6f\x29\xa1\x8e\x3f\x28\x7d\xab\x16\xcd\xce\x73\x09\x83\xc7\x70\xb5\x77\x12\xb9\xef\x6a\xaf\x07\x57\x7b\xe7\x46\x8f\xb8\x6c\x4d\x8d\xae\x42\x1d\xda\xd5\xde\x63\x1c\x19\x91\x61\x76\xb5\x47\xc3\x7e\xce\xf5\x86\x2f\xd0\x8c\xf0\x07\x9c\x7c\xcb\x83\xd5\xaf\xa3\x46\xf8\xd6\x97\x26\xd2\x7b\x52\xc1\xa4\xa7\xbe\x2d\x44\x59\xbf\x78\x21\xca\xba\xf3\x69\x43\x67\x6f\xde\x16\xe8\xc4\xcd\xa3\xa4\xc1\xe8\xcf\xbf\x58\xad\x8e\xaf\xf6\x9a\xf5\xf7\x74\x21\xb9\xd2\x62\x72\xb5\x07\x53\xb3\x1e\x5f\xed\xf1\xbc\xf1\x7d\x5c\xe4\xf1\xd5\x1e\xcd\x44\xaf\x8d\x76\x7a\x50\x0d\x8f\xaf\xf6\xb8\x80\xa1\xf7\xa8\x67\xb0\xec\x91\xc1\xf4\x6d\x33\xc3\xd5\xde\xcf\x84\x93\xa3\xa3\x90\xc2\x08\x97\xbf\xff\xb9\x38\x58\xbd\x56\xee\xaf\xab\xcb\xee\x43\x2e\xac\xbb\x34\x42\x59\x9e\xff\x52\x16\x8b\xd3\xb8\xde\x97\x63\x7e\x5f\xfa\xdd\xb0\x0c\x58\xfa\xd9\x53\xc3\xd2\xcf\x4b\xb4\xe7\x26\x9a\x6b\x7e\x0f\x1b\x46\x9d\xe7\x3b\x36\x05\xdb\x64\xcf\xc5\x38\x4d\x8d\x1f\xd2\x01\xa1\x35\x86\x8b\x04\x88\xc5\x83\x7c\xe3\x72\x4c\xc6\x5b\xa8\xea\x69\x1c\xfc\xdb\x70\xc9\x00\x54\x2a\x43\x93\x73\xb2\xaa\x19\xd5\x67\x42\xb2\x04\x7c\xdc\x40\xd4\x51\x9a\x6b\x62\x24\xd6\x4e\xaa\x15\xbc\xf6\x85\x3f\x71\x44\x92\x1d\xe1\x9e\x05\x3f\x0c\x2b\xba\x34\xc5\xd2\xb1\xa6\xdb\x3d\xc5\x0c\xad\xa0\x0a\x59\x56\x7d\xb7\x9c\x3c\x02\x71\x6c\x08\xf8\xd0\xda\xe7\xf7\xc7\x55\x21\x48\x75\x88\x8c\x6b\x7f\xea\x6f\xde\x7d\xf3\xee\x96\x17\xa9\x3e\x29\xe4\x63\xfc\x11\x0f\x01\xd4\x41\x91\x88\xfa\x40\xcd\x9a\x88\xc9\x46\x9b\x2f\xc4\xdd\x73\x54\x23\x37\x3e\x86\x2f\xbf\xf8\x5f\x5f\xfd\x63\x49\x43\x2f\x18\x31\x7b\x86\x2a\xc4\x82\x36\x04\xc3\x7c\xc7\xd9\xa0\x61\x42\x52\x29\x13\x4e\x24\xa3\xa6\x4d\x1d\xe4\x6e\x28\xe8\x56\x70\xe1\x56\x50\x97\x55\x49\x70\x79\xca\x05\x80\xd6\x09\x95\x62\x8f\x8c\xa4\x85\x83\xc9\x5a\x80\xe7\x13\x78\xf4\x85\xff\x47\x52\x78\xea\x39\xf1\xfd\xe6\xee\x6d\xb2\x60\xc9\xd2\xc2\xd7\xbd\x99\xf5\x48\x0b\x84\x2a\x3d\x64\xc2\xf1\x2e\xa6\x41\xaf\x09\x63\x30\x60\x5e\x13\x62\xbd\xde\x75\x88\x5b\x17\x0f\xdc\x2c\x16\x58\x48\x25\x8b\xaa\x38\x86\x87\x4b\x9a\x78\x91\xb6\x21\x36\x7d\xe3\xc6\x10\x10\x24\xba\x46\x46\x14\x05\x97\xfa\xca\x0c\x95\x93\x43\xc9\x45\x03\x35\x69\xb3\xbb\xef\x3b\xc6\x1a\x94\x1a\x8a\x5c\x9e\x42\x72\xa8\x45\xec\xe7\xde\xce\x31\xac\x81\x43\xf6\x26\x6d\x0b\xa8\x49\x89\x9e\x1b\xbc\x03\x03\x78\x57\x7a\x53\xb5\x95\x86\x28\x50\x28\xa9\x46\xb6\xa9\xe7\x0a\xff\x40\x0e\x7d\xbc\x1d\x63\xc8\x9e\x63\x3b\x17\x94\x92\xb3\x94\xb1\xdf\x24\x9a\x9a\xc2\x8c\xc4\x8f\xb7\xd1\x67\x63\x9a\x64\x39\x16\x98\x9f\x0a\x8b\x91\x1b\xdb\xd5\x5c\xf1\xb6\x96\xfa\xf4\xc1\x3b\x63\xd5\x47\x0f\xbf\x58\x89\xf2\xba\xdd\xf2\x14\x5e\x5d\xe6\xf5\xe6\xa4\xff\x1f\xd1\xff\xed\xed\x41\xf8\xe3\x61\xff\xeb\xff\xd7\x3b\x7e\xfb\x59\xeb\xe7\xdb\xe5\xd5\x59\x8b\x8d\xf9\x25\xe4\x13\x94\x48\xb4\x13\x23\x46\x7b\xb1\x4a\xe5\xd2\x54\xd8\x83\xa7\x22\xb7\xd8\x83\x1f\x15\xab\x86\x7b\x02\x6d\x75\x86\x9a\xb4\xf2\x1e\xcd\xba\x2c\x53\x1e\x9a\xf0\x92\x56\xb7\x09\xcb\x5d\xe5\xbe\x6e\x06\xa4\x18\x6a\x68\x49\x1a\xd5\xa2\x33\x5f\xf2\x3c\xd4\x3a\x09\x16\x6e\x92\xea\xe2\xa8\xfe\xee\x4d\xeb\x17\x42\x4d\xa0\x11\x6b\xde\x28\x9d\xa5\x74\xeb\x48\x36\x89\xd4\x68\x6b\x9b\x7b\x48\x20\x97\xd7\x08\x27\x8d\xdf\x48\xc2\x72\x80\xa9\x60\x5b\xdc\x0c\xa4\x33\xc2\x07\x7d\xa3\x5d\xd9\x44\x94\x86\x55\x0e\x07\xe4\xae\x26\x5c\x48\x36\x27\x5d\xc3\x9d\x46\x62\x20\x73\xfe\xa7\x65\xc8\x95\x4e\xb5\x1a\xe6\x32\xb8\x00\x45\xa9\x8d\x13\xca\xc5\x83\x17\x23\xbc\xf3\xff\x9a\x95\x4f\x3b\x48\x0b\x07\x99\xb2\x8f\x1e\x7d\xf1\xe5\x45\x35\xc8\x74\x21\xa4\x7a\x5a\xb8\xa3\xc3\xef\x0f\x7e\xad\x44\xce\x59\xde\x97\xa2\xc0\xa7\x85\x5b\xfe\xef\x02\x6d\xad\x16\x1f\x7d\xb5\x01\x17\x1d\xbc\xf1\xbc\xf2\xf6\xe0\x4d\x3f\xfc\xf5\x59\x7c\x75\xf8\xfd\xc1\x55\xb2\xf2\xfb\xe1\x67\x47\x5c\x23\x59\xb3\xdc\xdb\x37\xfd\x86\xfd\x92\xb7\x9f\x1d\x7e\xdf\xfa\x76\xb8\x88\x19\xa7\x4a\x17\xc9\x0b\xe8\x17\xa2\xec\x5f\xe3\x64\x09\x73\x2e\x35\x47\xe7\x07\xf2\x10\x2b\x44\xb9\xc8\xfb\x1e\xca\xd1\x0b\x51\xbe\xc6\x21\x1a\x54\xe9\x42\x22\xbf\x67\x06\x86\xfc\x87\x15\x9f\xb8\x02\x6b\x87\xa8\x13\xe9\x1d\x1f\x69\x5b\x65\x4e\x6f\x40\x2d\x9b\xd9\x8f\x6a\x45\xfd\xe2\xda\x49\xea\x7d\xee\x3c\x42\xe4\xef\x9f\x7c\xfc\x68\xe7\x71\x2a\xb9\xd4\xd3\x9a\x8e\x61\x9e\x3d\xf6\xa6\x2f\x8b\x1e\x36\xe7\xc6\x9a\xfc\xbc\x4a\xc9\x5f\x2b\x84\xb3\xc7\xf5\x91\x5f\xa9\xd2\xbc\xe2\x4b\xc6\x7e\xfc\xf1\xec\x31\xf9\xef\xff\x0a\xe2\xe6\x16\x21\xd3\x6a\xdf\xc1\xab\x97\xcf\xff\x0f\x07\x03\xb8\x45\xcf\x2b\xf4\x70\xee\x30\x97\xc2\x87\xc9\x82\x02\x86\x7f\xa1\xaf\x93\xe3\x99\x53\x51\xd6\xf1\x13\x16\x77\x5c\x61\x95\x97\x96\x4f\x0f\x80\xad\x4c\x58\x1d\x0d\xec\x33\xbe\x7c\x3a\x29\xe4\x83\xe3\xc1\x87\x5c\xb8\xe5\xe7\x30\x56\x02\x2d\xd5\x4a\x61\xca\x49\x73\xb2\x02\xdf\x03\x7f\x10\x21\xbf\x0a\x36\x2b\xcf\xb1\x03\x33\x84\x84\xda\xce\x64\x41\x6b\x38\xf5\x3b\x7d\xef\x9c\x34\xb7\xdf\x9d\x66\xf4\xf1\x4c\xce\x6c\xbe\x5e\x13\x7f\x9e\x2b\xe3\x9a\x76\x9d\xa7\xa2\x87\x21\xb6\x5a\x27\x47\xc7\xc2\xc2\x00\x51\x71\x38\xd7\x47\xff\x50\x05\xaa\xc3\x26\x10\x5b\x95\x7d\xa7\xfb\xd9\x62\xe4\xad\x81\xdc\x7a\xa8\xad\xf0\x5c\x67\x4e\xef\x6f\xeb\xa8\xde\x8e\x27\x8b\x60\x60\x9b\xcb\xcc\x6a\x1b\x64\xdb\x8d\x2d\x77\x4c\x66\xa2\xba\xec\x59\x84\xa0\x46\xf0\x33\xe6\x97\x44\xde\xe3\x54\x64\xc3\x69\xce\xe6\x4d\x47\xf6\xb6\x5f\xa3\x47\xf3\x05\x9a\x1b\xb9\x93\xf2\x5b\xc7\x98\xa9\xaf\x33\x39\x79\xff\x6c\x45\xa6\xd7\xce\x93\x70\xe8\x2f\xd5\x6b\xd2\x37\x2b\xeb\xdf\x19\x82\xab\xaa\xfc\xb7\x19\x63\x5b\x65\xe9\xa5\xc9\xd4\x21\x0f\xeb\xb4\xe1\x94\x7b\xfb\x5d\x35\xa8\x0d\xe5\x66\xf4\xe0\x03\xc1\xef\x7f\x3e\xf8\xff\x01\x00\x00\xff\xff\x3e\xcb\x2d\xc0\x3f\xed\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( diff --git a/staging/api/pkg/operators/v1alpha1/catalogsource_types.go b/staging/api/pkg/operators/v1alpha1/catalogsource_types.go index c4c7662d37..53bd40ca40 100644 --- a/staging/api/pkg/operators/v1alpha1/catalogsource_types.go +++ b/staging/api/pkg/operators/v1alpha1/catalogsource_types.go @@ -7,6 +7,7 @@ import ( "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -145,6 +146,21 @@ type GrpcPodConfig struct { // +kubebuilder:validation:Enum=legacy;restricted // +kubebuilder:default:=legacy SecurityContextConfig SecurityConfig `json:"securityContextConfig,omitempty"` + + // MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, + // which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod + // will have the following modifications made to the container running the server: + // - the $GOMEMLIMIT environment variable will be set to this value in bytes + // - the memory request will be set to this value + // - the memory limit will be set to 200% of this value + // + // This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if + // a catalog being served is very large and needs more than the default allocation. If your index image has a file- + // system cache, determine a good approximation for this value by doubling the size of the package cache at + // /tmp/cache/cache/packages.json in the index image. + // + // This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set. + MemoryTarget *resource.Quantity `json:"memoryTarget,omitempty"` } // UpdateStrategy holds all the different types of catalog source update strategies diff --git a/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go b/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go index cf01001f5c..b4459a00a4 100644 --- a/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go +++ b/staging/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go @@ -733,6 +733,11 @@ func (in *GrpcPodConfig) DeepCopyInto(out *GrpcPodConfig) { *out = new(string) **out = **in } + if in.MemoryTarget != nil { + in, out := &in.MemoryTarget, &out.MemoryTarget + x := (*in).DeepCopy() + *out = &x + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GrpcPodConfig. diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml index e42010c7ad..c3e2f6ce18 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_catalogsources.yaml @@ -532,6 +532,13 @@ spec: topologyKey: description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string + memoryTarget: + description: "MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod will have the following modifications made to the container running the server: - the $GOMEMLIMIT environment variable will be set to this value in bytes - the memory request will be set to this value - the memory limit will be set to 200% of this value \n This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if a catalog being served is very large and needs more than the default allocation. If your index image has a file- system cache, determine a good approximation for this value by doubling the size of the package cache at /tmp/cache/cache/packages.json in the index image. \n This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set." + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true nodeSelector: description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. type: object diff --git a/vendor/github.com/operator-framework/api/crds/zz_defs.go b/vendor/github.com/operator-framework/api/crds/zz_defs.go index 6a98bd4bd7..a391fce34b 100644 --- a/vendor/github.com/operator-framework/api/crds/zz_defs.go +++ b/vendor/github.com/operator-framework/api/crds/zz_defs.go @@ -85,7 +85,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\xfb\x73\xdc\x36\x92\xff\xef\xfe\x2b\xba\xf4\xfd\x56\x49\xca\xcd\x50\x76\xb2\x95\xdb\xd5\xe6\x51\x5a\x39\xce\xa9\x12\xdb\x2a\xcb\xc9\xd6\xad\xe5\x3b\x63\xc8\x1e\x0e\x22\x12\x60\x00\x50\xf2\x24\x95\xff\xfd\xaa\x1b\x00\xc9\x79\x3f\x64\xc7\x76\x2d\xf9\x8b\x35\x24\x9e\x8d\x46\xf7\xa7\x1f\x80\x45\x25\x7f\x46\x63\xa5\x56\xa7\x20\x2a\x89\x6f\x1d\x2a\xfa\x65\x93\x9b\xbf\xda\x44\xea\x93\xdb\x47\x0f\x6e\xa4\xca\x4e\xe1\xbc\xb6\x4e\x97\x2f\xd0\xea\xda\xa4\xf8\x18\xc7\x52\x49\x27\xb5\x7a\x50\xa2\x13\x99\x70\xe2\xf4\x01\x80\x50\x4a\x3b\x41\xaf\x2d\xfd\x04\x48\xb5\x72\x46\x17\x05\x9a\x61\x8e\x2a\xb9\xa9\x47\x38\xaa\x65\x91\xa1\xe1\xc6\x63\xd7\xb7\x0f\x93\xbf\x25\x0f\x1f\x00\xa4\x06\xb9\xfa\x4b\x59\xa2\x75\xa2\xac\x4e\x41\xd5\x45\xf1\x00\x40\x89\x12\x4f\x21\x15\x4e\x14\x3a\xf7\x83\xb0\x89\xae\xd0\x08\xa7\x8d\x4d\x52\x6d\x50\xd3\x3f\xe5\x03\x5b\x61\x4a\xbd\xe7\x46\xd7\xd5\x29\x2c\x2d\xe3\xdb\x8b\x83\x14\x0e\x73\x6d\x64\xfc\x0d\x30\x04\x5d\x94\xfc\x77\x98\xbc\xef\xf6\x8a\xbb\xe5\xf7\x85\xb4\xee\x87\xc5\x6f\x3f\x4a\xeb\xf8\x7b\x55\xd4\x46\x14\xf3\x03\xe6\x4f\x76\xa2\x8d\x7b\xd6\x76\x4f\xdd\xa5\xc2\x59\x93\xfa\xcf\x52\xe5\x75\x21\xcc\x5c\xdd\x07\x00\x36\xd5\x15\x9e\x02\x57\xad\x44\x8a\xd9\x03\x80\x40\xc2\xd0\xd4\x10\x44\x96\xf1\xb2\x88\xe2\xd2\x48\xe5\xd0\x9c\xeb\xa2\x2e\x55\xd3\x15\x95\xc9\xd0\xa6\x46\x56\x8e\x49\xff\x72\x82\x50\x19\x74\x6e\xca\x24\x01\x3d\x06\x37\xc1\xd8\x77\x53\x0b\xe0\x17\xab\xd5\xa5\x70\x93\x53\x48\x88\xc2\x49\x26\x6d\x55\x88\x29\x8d\xa6\x53\xca\x2f\xd3\x63\xff\xad\xf3\xde\x4d\x69\xe8\xd6\x19\xa9\xf2\x75\x43\xa1\x72\xdb\x8f\xc1\x93\xe6\xe5\xb4\x5a\x1c\xc2\xdc\xcb\x6d\xfb\xaf\xea\x51\x21\xed\x04\xcd\xf6\x83\x68\xaa\x2c\x8c\xe1\x72\xc9\x97\x15\x03\xe9\x34\x1a\x37\x54\xb2\xb0\x19\x16\x3a\x38\xcb\x17\xe7\x98\x09\x17\x5f\xfa\x42\xb7\x8f\x44\x51\x4d\xc4\xa3\xf0\xd2\xa6\x13\x2c\x45\xcb\x0f\xba\x42\x75\x76\x79\xf1\xf3\x17\x57\x73\x1f\x60\x96\x3a\x33\x7c\x0e\xd2\x82\x00\x83\x95\xb6\xd2\x69\x33\x25\x6a\x9d\x5f\xfd\x6c\x07\x70\xfe\xe2\xb1\x1d\x80\x50\x59\xb3\xf1\xa0\x12\xe9\x8d\xc8\xd1\x26\x0b\x63\xd5\xa3\x5f\x30\x75\x9d\xd7\x06\x7f\xad\xa5\xc1\xac\x3b\x0a\x22\x4f\xa4\xc9\xdc\x6b\xa2\x7f\xe7\x55\x65\xa8\x4f\xd7\xd9\xc8\xfe\xe9\x48\xb9\x99\xf7\x73\x33\x3c\x24\x32\xf8\x72\x90\x91\x80\x43\xcb\x2c\x10\xf6\x18\x66\x81\x76\x9e\x35\xa4\xa5\xf9\x1b\xb4\xa8\xbc\xc8\xa3\xd7\x42\x85\x39\x25\x70\x85\x86\x2a\xd2\x76\xaf\x8b\x8c\x24\xe1\x2d\x1a\x07\x06\x53\x9d\x2b\xf9\x5b\xd3\x9a\x05\xa7\xb9\x9b\x42\x38\xb4\x0e\x78\xd7\x2a\x51\xc0\xad\x28\x6a\xf4\xa4\x2c\xc5\x14\x0c\x52\xbb\x50\xab\x4e\x0b\x5c\xc4\x26\xf0\x54\x1b\x04\xa9\xc6\xfa\x14\x26\xce\x55\xf6\xf4\xe4\x24\x97\x2e\xca\xf0\x54\x97\x65\xad\xa4\x9b\x9e\xb0\x38\x96\xa3\x9a\xc4\xe1\x49\x86\xb7\x58\x9c\x58\x99\x0f\x85\x49\x27\xd2\x61\xea\x6a\x83\x27\xa2\x92\x43\x1e\xac\x62\x39\x9e\x94\xd9\xff\x33\x41\xea\xdb\xc3\x39\xf2\x2d\x65\x66\x88\x62\x73\x2d\xad\x49\x78\x7a\x2e\xf2\xd5\xfd\x5c\x5a\x92\xd2\x2b\xa2\xca\x8b\xef\xae\x5e\x42\x1c\x80\x27\xbb\xa7\x70\x5b\xd4\xb6\xc4\x26\x42\x49\x35\x46\xe3\x4b\x8e\x8d\x2e\xb9\x15\x54\x59\xa5\xa5\x72\x7e\x4b\x17\x12\x95\x03\x5b\x8f\x4a\xe9\x2c\xf3\x1c\x5a\x47\xeb\x90\xc0\x39\xab\x30\x18\x21\xd4\x15\xed\xa4\x2c\x81\x0b\x05\xe7\xa2\xc4\xe2\x5c\x58\x7c\xef\xa4\x26\x8a\xda\x21\x91\x6f\x7b\x62\x77\x35\xf0\x62\x85\x85\x3d\x06\x10\x35\xe4\x56\x85\x57\x6d\x4a\xf0\x3b\x70\x99\x04\x86\x35\x7b\x91\x1e\x91\x65\x06\xed\x92\x0f\x0b\x1b\xd2\x17\xf4\x7c\x32\xd1\x96\xd6\x4f\x38\x78\xfe\xe3\x53\x48\x85\x82\xda\x22\x6d\x9e\x54\x2b\x45\x0c\xe1\x34\x08\xd2\x65\x43\x7c\x2b\x2d\x33\x90\xc1\x5c\x5a\x67\xa6\x09\x3c\xd1\xa6\x14\xee\x14\xbe\x8a\xaf\x86\xdc\x9c\x36\x20\xab\x6f\x4e\xbf\xaa\xb4\x71\xdf\xc0\x73\x55\x4c\xa9\xd1\x0c\xee\x26\xa8\xe0\xaa\x99\x1b\x7c\xdd\xf9\xf1\xbd\xa9\xd2\x04\x2e\x72\xa5\x4d\x2c\x49\x5c\x75\x51\x8a\x1c\x61\x2c\xb1\x60\xbe\xb6\xe8\x92\xf9\x15\x5c\xbb\x8a\xe0\xe1\xd2\x58\xe6\x4f\x45\xb5\x91\x34\xe7\xb1\x24\xf5\x45\xdd\x77\x95\x77\xfb\xd1\x69\x66\x65\x9a\x12\xfd\x29\xd2\x1b\x10\xa1\x97\x52\x54\x43\xcb\xdb\xa6\x43\xa6\xed\x28\x70\x1e\x1b\x20\xfa\xb5\xaf\x2f\x82\xe4\x4a\x76\x9d\x76\x77\x66\x3b\xd7\x6d\x61\xc8\x46\xa2\x3d\x5d\xa6\x45\xb6\xe8\x23\x37\x55\x7a\xa9\x33\x3f\xed\x8d\xbd\x7c\xdf\x2d\x0d\xf8\xb6\xd2\x16\x2d\x64\x72\x3c\x46\x43\x72\x47\xdf\xa2\x31\x32\x43\x0b\x63\x6d\x78\xbd\x2a\x9d\xf1\x9e\x6c\xd6\x6f\x46\xd5\x5e\xea\x6c\xdb\x85\xa1\xae\x59\x61\x78\x66\x0c\x6c\xb8\x72\xba\x4b\x77\x3b\x6c\xd8\xbc\xf4\x88\x31\xc3\xff\xe9\xf2\xaf\x73\xf4\x38\x0b\x85\x23\xa7\x06\x44\x15\x44\xc7\xa1\xa5\xe9\x1f\xda\xa6\xcd\x65\xc3\xdd\x62\xc8\xdb\x0c\x9b\x1e\xa5\x33\x3c\xdb\x30\xfc\x85\x29\x3c\xe6\x1f\x23\xb4\x5c\xbd\x19\x2a\x6b\xf0\xac\x2e\x58\xd4\xd4\xc5\xec\x8a\xae\x9a\xc7\x96\x73\xd9\x76\x3e\xbe\x1c\x8e\xd1\x18\xcc\x1e\xd7\xc4\xbf\x57\xcd\xa8\x82\x90\xf2\xaf\xbf\x7b\x8b\x69\xbd\x6a\x8f\xad\x9c\x3a\x81\xe2\x30\x4d\x34\x70\x27\x8b\x22\x74\x47\x02\x25\x7e\xa0\xf9\x32\x8e\x21\xf2\x58\x2f\xa4\xad\x70\xd2\x8e\xa7\x4c\x8e\x86\x60\xf8\x96\x74\x36\x5b\x2c\xcc\xf1\x72\x2c\x31\x83\xd1\x34\xa8\x6b\x12\x9e\x03\x18\xd5\x0e\xa4\x63\x5d\x9e\x4e\xb4\xb6\x08\xc2\xd3\x9d\xdb\xbd\x95\x9a\x91\x12\x68\x85\x24\x7f\x4a\x52\xc8\x61\xe3\x74\x9a\x4f\x78\xe4\x6d\x35\x69\xa1\x24\x89\xdf\xd0\x2a\xb2\x23\x35\x73\x27\xdd\x84\x7f\xe4\x04\xb9\x09\x85\xd9\xba\xa4\x46\xef\x50\xe6\x13\x67\x07\x20\x13\x4c\x78\x75\x51\xa4\x93\x4e\xb3\x25\xa2\xb3\x20\x8a\x22\x0e\xa1\xcb\x12\x5e\x6f\x96\x04\x51\xe0\xa8\xc1\x30\x01\x6f\x0c\x1a\xbd\x3a\xbf\x6a\x4b\xc9\x35\x00\x74\x69\x72\x3c\x80\x54\x97\x55\xed\x88\x26\x34\xc6\xd1\x14\xa4\x23\x9c\xed\xf1\x92\xd1\x75\xee\x67\x82\x45\xe8\x38\x82\x55\xaf\x99\x48\x38\x90\x8d\xa8\x72\x38\xf0\x93\x3b\x88\xf8\x93\x9a\x93\x7e\x12\x3c\xbf\x52\xb8\x74\x12\x20\x70\xaa\x8d\x41\x5b\x69\xc5\x35\xf9\xcb\x77\xed\xd8\xfe\xde\x54\x3a\xb2\xc7\x2d\x31\x27\x32\x9f\x44\x5a\x0a\x83\xfc\x6e\x76\x0d\xd6\xed\x91\x76\x9f\x08\x63\x66\x6c\xc9\x65\x8f\x74\x58\x6e\xd8\x25\x0b\xac\x7d\xa6\x00\xcb\xca\x4d\x3b\x3c\xd1\x59\x3d\x87\xa6\x6c\x68\xc0\x0b\xcc\xdb\xd5\xfa\xf9\xc9\xb2\x2a\x64\x2a\x5d\xe0\x10\x78\x08\x47\xcc\x22\xd2\x91\x28\x03\xa5\x87\xba\x3a\x4e\xe0\x8c\xdd\x17\x5b\x74\xa0\x74\xd3\x7e\x68\x88\x3a\xb5\xba\x6d\x6b\xe3\xdc\xb6\x14\x2a\xfe\x59\x8d\xe9\x16\x9f\x61\x18\x3f\xaa\x74\x1e\xe5\x2d\x2f\xee\x69\xb2\xb1\xe8\xb6\xe2\x2d\x96\x8e\x63\xd8\xa6\xf4\xfc\x52\x7b\x96\xb6\x58\x60\x4a\x26\x29\xd1\x7e\x00\xc2\x5a\x9d\x4a\x42\xf9\x2d\xd3\xce\x72\xba\x9f\xc9\x66\xda\xc3\xae\xf4\x87\x9d\xe7\x4f\xcf\xfc\xc6\xdb\xb6\xde\x02\x35\x0a\x49\xe0\x77\x3c\x47\x95\x19\x81\x35\x9a\xf2\xd7\x43\x0b\x85\x18\x61\x61\xb7\x23\x02\xec\xb4\x6b\xdb\x67\xcb\xfd\xbb\x72\x42\x2b\x27\x12\x6c\xcc\x66\xe1\x49\x68\x93\x6d\x26\xa4\xb2\xc1\x7e\x1e\x80\x80\x1b\x9c\x7a\x53\x9b\x2c\xf8\xe8\xb8\xe0\xc2\x06\xbd\xba\x21\xe6\xb8\xc1\x29\x17\x0a\x76\xf7\x0e\xc3\xdd\x99\x39\xfc\xb3\xcb\x36\x6d\x9f\x21\x0d\x74\xc7\x1a\x71\xd2\x3b\x54\xdb\x9d\x7f\xfd\x73\x83\x6b\x91\xd7\xb2\x67\x01\x92\x30\x4f\xf2\x7a\xf0\x22\xb1\xfe\x8a\x6b\x2c\xaa\xaa\x90\xc8\xf6\xfc\x8e\xdd\xac\xb5\x02\xd6\x3d\x91\x7a\xf7\x9a\xd7\x8b\xc6\xa1\xe1\x19\xf2\xd0\x7a\xe6\xa3\x9d\x3e\x91\x95\xb7\x6f\x2d\xf2\xc6\x8d\x9e\x9f\x9f\x45\x21\x5b\x57\x9b\x65\x3d\x7b\xa1\x06\xf0\x4c\x3b\xfa\xe7\x3b\xb2\x84\xed\x00\x1e\x6b\xb4\xcf\xb4\xe3\x9f\x09\x7c\xef\x3c\xaf\xff\xb8\xa5\x64\x7b\x07\x04\xf2\xe3\xbd\x17\x79\xce\x94\x97\x29\x34\xfd\xae\xcf\xc8\x26\x70\xe1\x61\x4b\xb3\x71\xa5\x85\x0b\x45\xe0\x30\x90\x81\xbd\x78\x5c\x36\x34\x51\xd6\x96\x9d\x3c\x4a\xab\x21\x63\x80\xa5\x6d\x78\xea\x51\x3b\x5d\xfa\xad\x69\x6e\x75\x53\xdf\xb3\xaf\xe1\xc7\x95\x95\x27\xe2\x96\x21\x9d\x54\x79\xd1\x80\xb7\x01\xdc\x4d\x64\x3a\xf1\xa8\x7b\x84\xde\x35\x58\x19\x24\x85\x25\x2c\x89\x2a\x7a\x93\xa3\x21\xb0\x2b\x63\x7b\xde\x31\x59\x88\x14\x33\xc8\x18\x5a\x7a\x27\x9b\x70\x98\xcb\x14\x4a\x34\x39\x42\x45\x9a\x64\xbf\xd5\xdf\x4d\xb0\xfb\x67\x67\xf1\xde\xed\x70\x27\x76\x63\x15\xf9\x84\xb0\xee\x9f\xa4\x1d\x19\x57\xf7\xda\xb1\xd7\x8e\x73\x4f\xaf\x1d\x9b\xa7\xd7\x8e\x1b\x9e\x5e\x3b\xf6\xda\xf1\xbd\x6b\x47\x6f\xcb\xee\x61\x3c\xff\xd3\xbb\x38\xe6\xad\x65\xd6\xb4\x31\x4c\x37\x6b\x36\x93\xbe\xb9\x0a\x02\xe7\x25\x9b\xda\xd2\x07\x49\x8c\x50\x39\xc2\xa3\xe1\xa3\x87\x0f\x77\x31\xaa\xc3\x42\x6e\x55\x63\x1c\x22\x3d\x52\xb9\x2f\x3e\x5f\x5b\x63\x95\xff\xed\x1d\x78\x4d\x03\x8f\x37\x8e\xbc\x19\xec\xb0\xc2\xf1\xc9\xd2\x49\x69\x07\x25\x3a\x10\x6e\xc6\x55\x24\x4b\x1c\x34\xa1\x02\x66\xf8\x10\xa5\x8c\x1e\xd8\x0c\xb4\x0a\x7e\x3c\x22\x7e\xb2\xdf\x08\x52\x14\x3e\xa4\x36\xc2\x66\x14\xba\xa4\x5e\xa5\x72\x71\xbb\xd0\x10\x30\x52\x05\x8e\x30\xc9\x13\xc8\x6a\xae\x26\x54\x08\x9b\x1e\xfb\xd1\xda\xa9\x75\x58\xb2\x27\x57\x1b\xfe\x87\x86\xed\xcc\x94\x0a\xe3\x2d\x2a\x57\x8b\xa2\x98\x02\xde\xca\xd4\x35\xf3\xe3\xa8\xad\x74\xde\xd9\xbe\x9d\x8b\x70\x2b\xe8\xb0\x3d\x5c\x18\x2e\x70\xb0\xdd\x50\x67\x17\x6d\xbf\xd0\xf6\x36\x7b\x72\x4e\x17\xfa\x99\x24\x2b\xc1\xaa\xa3\x76\xbd\x0f\x9c\xff\x64\xe6\x7a\xfe\x62\xb3\xcb\x15\x76\x96\x64\x3b\x48\xaf\x79\x58\x5a\x17\x05\x31\x86\xf7\xc2\x2e\x4e\x60\x89\x77\xd4\x4f\x69\x86\x99\xbd\xe3\xdd\xbb\x98\xcf\x9e\x3d\x26\xaa\x50\x99\x97\xba\xd2\x85\xce\xa7\x5d\x4a\xfb\xf4\x22\x59\x56\xd1\x39\x2e\xc0\xd6\xa3\x00\x1a\x88\xfd\x9e\xcd\x2d\x4d\xef\xf9\xeb\x3d\x7f\xbd\x6d\xb3\xf0\xf4\xb6\x4d\xf3\xf4\xb6\xcd\x86\xa7\xb7\x6d\x7a\xdb\xa6\xf7\xfc\x41\xaf\x1d\xd7\xd0\xa4\xd7\x8e\xd0\x6b\xc7\x95\xf3\xea\xb5\xe3\x5a\xf2\xf4\xda\xb1\xd7\x8e\xcb\x9e\x4a\x67\xf7\x48\x74\xac\x74\xb6\x26\xcf\xd1\x7b\x7d\x52\x3d\x2c\x74\x2a\x5c\xc8\xcb\xa7\x2a\xc1\xcf\x67\x45\xe9\x1d\x51\x03\xf8\x4d\x2b\xf4\xc9\x6b\xb4\x36\xec\x4e\xd2\x6e\x82\x86\x8a\x1f\xd9\xe3\xb5\x89\x4d\x7d\x9e\x64\x9f\x27\xf9\xd1\xe7\x49\x4e\x84\xf5\xeb\xea\x85\xd2\xea\xb4\xc9\xce\x86\x7c\x89\xa6\xfc\x44\xb3\x26\x89\x5d\xc2\x72\xf3\x89\xa7\x76\x49\xfd\xcc\xb3\x10\x2f\xc0\xec\x72\x76\xbe\x01\x2f\xf3\xa4\x44\x96\x61\x06\x15\x9a\xa1\x67\x11\x0d\x63\xa9\xb2\x25\x73\x8d\xf4\xf9\xa0\xd9\x8f\xb3\xf3\xf8\x80\x29\x90\xb3\x03\xd9\xc3\xe7\xda\x75\x1c\xcf\x48\xf8\x8f\x22\x21\x72\x57\x54\x3f\x04\x17\x9c\xbc\x3f\x6c\x89\xeb\x77\x87\xe6\x0c\xa8\xa3\x4b\x78\x7f\xbb\x92\x61\xf9\xaf\x35\x9a\x29\x9f\xff\x68\x01\x6b\x73\xb6\x2e\xc4\xc8\xa4\x85\x54\x58\xaf\x29\x76\x35\x2d\x77\x34\xa3\xf6\xb3\x53\xf6\xf7\x44\xc3\x3c\x5d\xe6\x9b\xf2\x36\x69\xb4\xc1\x3d\xcd\x96\x1a\xe1\x4b\xa2\x00\xad\xf7\x7f\xa7\xf1\xec\x0b\xdd\xf6\x02\x6e\x4b\x99\xe2\x23\x36\xce\x61\x7f\x03\x1d\xf6\x36\xd2\x61\x2f\x43\x1d\xf6\x35\xd6\xe1\x1e\x06\x3b\xec\x67\xb4\xc3\x3c\x2b\xd0\x0a\x05\x94\xf5\x7e\xec\x77\xb8\x8f\x89\x0a\xf7\xb0\xe3\x61\x7e\xaa\x0d\x9b\x9a\xf7\x65\xd4\x33\xaf\xcf\xd8\xf5\x7f\x36\xb1\xf6\xb3\xe9\x61\x9e\x54\xc1\x18\x96\x6c\xd0\x7e\x22\x16\xfe\x9f\x62\x6e\xc3\xbd\x4c\x6e\xd8\xdf\xec\x86\xfd\x39\x83\x55\xdd\x8f\x1c\x4e\xbd\xaf\xc2\xf4\xad\x78\x15\xc1\x67\x70\xc7\xf0\x3b\x69\x02\x5e\x97\x3f\xa0\x12\xd2\x58\xc2\x77\xc1\x67\xd2\xfd\x16\xac\xf3\x6e\x33\xa5\x3f\x42\x4c\xa2\xfa\x56\x14\xa4\x7b\x7c\x1e\x47\xb0\x8b\xa8\xf5\x79\x35\x3d\x80\xbb\x09\x59\x9b\x24\xa5\x9a\xf3\xce\x07\x37\x38\x3d\x18\x2c\x30\xd2\xc1\x85\x3a\xf0\x3a\x6a\x81\x75\x1a\x85\xa6\x55\x31\x85\x03\xfe\x76\xf0\xae\x35\xfb\x1e\x8a\xab\x7b\x85\xca\xbe\x7a\x61\x0f\x2e\x51\xf1\x5a\x97\x77\x0f\x36\xbd\x16\xf1\x81\x8d\xd8\x8b\x6d\x15\x0c\xa7\x5a\x74\x94\x4b\x93\x35\xc2\x3c\xc6\xef\xb3\x68\xfc\xd6\x2a\xdc\x74\x11\xcf\x9c\x87\xc6\xbc\x92\x5a\x4c\x69\x0a\x0b\xaf\x15\x5a\x06\x76\xd8\xb8\x88\x3a\x95\xb9\x6c\xe2\xd3\x41\x5a\x6d\xa7\xb2\xf9\x04\x91\xb6\x06\x63\xc4\x12\x85\xb2\x70\x10\x7d\x4f\x87\xb6\x2d\x71\x90\xb4\xa7\xfb\x9a\x16\x8f\x7e\xff\xe3\x78\xe6\x44\x5f\xdb\x60\x8f\xb4\x7b\xa4\xdd\x23\xed\x1d\x6a\xf5\x48\x7b\xf5\xd3\x23\xed\x1d\x9e\x1e\x69\xf7\x48\x7b\x5d\xc7\x3d\xd2\xee\x91\xf6\xe6\xce\xf7\x43\xda\xfb\xe6\x09\x75\x71\x6f\x08\xce\xf9\x8b\xcc\x84\x93\x69\x9b\x43\x14\x4b\xf9\xbf\xde\x2d\xde\xee\x62\xe9\xe5\x68\xbb\x8b\xc8\x17\x6c\x8b\x64\x03\xb4\x6e\xc0\xf7\x42\xcd\xf5\xa8\xfb\xe3\xca\x85\xda\x83\x37\x3a\x01\x85\x3d\x99\xe3\x65\x0c\x85\x87\x8b\xff\x46\xd8\xc6\xc9\x33\x38\x8a\x11\x97\x63\x22\xbe\xd2\x6e\xf6\xa3\x72\x72\xd8\x96\x68\x62\x30\x1c\x5e\x9c\x39\x6f\x33\x13\x96\x68\xa2\xee\x4d\xa4\xb8\x5d\x4f\x12\x21\x68\x66\xc6\x20\x6d\xb8\xde\x90\xb3\x25\x4c\xad\x14\xb5\xaa\x55\x0c\x1f\x7b\x99\xe3\xef\xe3\x0b\x9c\xe7\xc1\x12\x8f\x87\x11\x53\x4b\xa5\x4e\xbc\x53\x38\x7f\x05\x62\x48\xe5\xd7\x2a\x44\x44\xe9\x4d\x8c\xfa\x46\xa6\xe4\x19\xc9\xa6\xf7\x04\xbe\x63\x3e\xec\x36\x2c\x2d\xd3\x47\x14\x85\xbe\xdb\x45\x24\xfd\x59\xc7\xa2\xee\x76\x3e\x16\x35\x17\xbf\xeb\x4f\x45\xfd\x9b\x9c\x8a\xe2\x8f\x7e\x0b\xbd\xf3\xe3\x51\xf0\xcf\x70\x01\xa1\x41\x26\x55\x59\x17\x4e\x56\x6d\xae\x94\xf5\x5d\x15\x1e\x65\x8e\x43\xe6\xc9\x2c\x5f\x52\x6f\x22\x9d\xcc\xf3\x27\xb7\xc7\xb9\x55\x96\x37\x6d\xc8\xee\x10\x45\x11\xce\x14\x45\x48\xea\x53\x58\xe4\x87\xce\x4c\x78\x1c\xee\x6c\x6d\xac\x19\x16\x32\x47\x24\x0b\x0b\x5a\x50\x92\x6a\x6b\x84\xa8\x37\x8a\x6e\x31\xaa\xde\x5c\xde\xa2\x6a\x25\xe9\x91\x3d\x3e\x8e\x3a\xfc\x9d\x4a\xf8\xf7\x22\xa1\xbf\xea\x48\xd2\x6f\xb6\x91\xd1\x3c\xa1\x46\x4a\xb7\xe4\x6b\x65\xf4\x87\x4c\xc1\xd8\x25\xce\xbf\x9b\x8f\x61\x8f\xf8\xfe\x9f\x18\xdb\xff\x74\x4e\x96\x7d\x60\x0f\xe3\x87\xc8\xad\xff\xe8\xbd\x8a\x7d\x72\x7d\xfb\xdc\x37\xb9\xfe\xbd\x7b\x0e\x3f\x6c\x8e\xfd\x27\xe0\x2d\xfc\x90\x39\xf6\xbd\x87\x70\xed\xa2\x7c\x6c\xa9\xef\xb3\xcf\x5e\x1e\xc1\xde\x1b\xb8\xb7\x16\xde\x51\xe1\xdc\xd7\x0b\xb8\x23\x47\xec\x19\x67\xef\x63\xec\x7f\x4e\x8c\xbd\x47\xbc\x5b\x3e\x3d\xe2\x5d\x49\x94\x1e\xf1\x42\x8f\x78\x37\x4d\xaf\x47\xbc\x6b\xc9\xd3\x23\xde\xb5\x8b\xd2\x23\xde\x1e\xf1\xc2\xa7\x86\x78\xf7\xb9\xa5\xab\x8f\x75\xdf\x2b\xd6\xbd\xab\xb4\xd8\x49\x46\xec\xc8\x07\x3b\xc7\xb6\xfb\xb8\xf6\xc7\x12\xd7\xde\xfa\xc0\xbf\x72\xf2\xbe\x87\xfe\xbb\x6b\xb5\xea\xe4\xbf\xb8\xd5\x32\x83\xaa\x76\xe1\x3c\x75\x7f\xfa\xff\x5d\x9c\xfe\x9f\xa1\x7c\x7f\x05\xc0\x56\x57\x00\xac\xa2\x59\x7f\x0f\x40\x7f\x0f\xc0\x3b\x0e\x42\xf7\xf7\x00\xf4\xf7\x00\xf4\xf7\x00\xc4\xa7\x3f\x9d\x04\xfd\xe9\xa4\xad\x9e\xfe\x74\xd2\xea\xa7\x3f\x9d\xf4\xd1\x7a\x5f\xa1\x3f\x9d\xf4\x71\x7b\x62\xa1\x3f\x9d\xd4\x7b\x67\xb7\x5c\xa8\x4f\xf0\x74\x52\x7f\x0f\xc0\xc7\x9a\xa3\x00\x3d\xd2\xee\x91\x76\x8f\xb4\x7b\xa4\xbd\xfe\xe9\x91\xf6\x0e\x4f\x8f\xb4\x7b\xa4\xbd\xae\xe3\x1e\x69\xf7\x48\x7b\x73\xe7\xfd\x3d\x00\x9f\x50\x6e\x04\xf4\xf7\x00\xf4\xf9\x12\xfd\x3d\x00\xff\xbe\xf7\x00\xcc\xc4\xee\x3f\xdc\x65\x00\xbb\x0f\xa3\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\xa0\xbf\x11\x20\x3e\xfd\x8d\x00\xfe\xf9\x98\x7c\x8d\xfd\xf9\xa8\x95\x44\xe9\xcf\x47\x41\x7f\x3e\x6a\xd3\xf4\x3e\x01\xbf\x61\x7f\x3e\xea\x23\xf4\x15\xf6\xe7\xa3\x7a\xbf\xe0\xfc\xe2\x7c\x22\xe7\xa3\xfa\x1b\x01\x3e\xc6\x68\x7b\x8f\x78\xb7\x7c\x7a\xc4\xbb\x92\x28\x3d\xe2\x85\x1e\xf1\x6e\x9a\x5e\x8f\x78\xd7\x92\xa7\x47\xbc\x6b\x17\xa5\x47\xbc\x3d\xe2\x85\x4f\x0d\xf1\xf6\x37\x02\xf4\x37\x02\xf4\x37\x02\x7c\x8a\x11\xee\x8d\x2b\x4d\x23\xdb\x64\xd0\xce\x2c\xe7\xb3\x4e\x85\x39\xf0\x1e\x4e\x34\x07\xdd\xea\x4c\x8d\x7c\xc0\x3b\xc6\x1f\xf9\xd8\xae\x6b\xe9\x9a\xc0\xd5\x92\x9a\x4c\xbe\x50\xe2\xd0\x7a\x42\xdb\xf9\x76\xe6\xe2\xb5\x9e\xd6\xdc\xe6\x8a\x29\x6c\x21\x6e\x77\x13\xae\x1b\x09\x5b\x19\xa9\x8d\x74\xd3\xf3\x42\x58\xfb\x4c\x94\xb8\x15\x75\x2f\xc6\x2d\xd3\x0e\x40\xaa\x4c\xa6\x8d\x75\xe3\x05\x49\x6c\x97\x01\x10\xf1\x43\xa7\x7c\xa4\x50\x2c\xe3\x03\xdc\x23\x24\xf6\x16\x75\xe1\x68\x8b\xfd\x86\x46\x87\x03\xe9\x06\x3d\x4f\xc5\xcf\xeb\x89\xb7\x66\xae\x16\xd3\x9a\xe7\xaa\x95\xc3\xb7\xee\x5c\xab\xb1\xcc\xb7\x9a\xef\xc1\xd5\xb2\xaa\x90\x0a\x45\xc3\xe6\x0b\x09\xc6\xf0\xa6\xc0\x5c\xa4\xd3\x37\x34\xfc\x37\x06\x69\x20\xb4\x67\xde\x78\xa5\x70\x2e\x9c\x28\x74\x7e\xc5\x11\xb3\xc3\x70\xc3\x84\x05\x94\x7c\x81\x84\x54\xbf\xf8\x0d\xd6\xc8\x0e\xc3\x79\x18\x95\xce\x12\xa2\x5c\x32\x37\x76\x96\xea\xcd\xc7\x00\x00\xd0\xbc\xfa\xec\xf5\x42\xc9\x00\x15\x08\x8c\xd0\x96\xec\xf2\xa7\xa9\x15\xc9\xa0\x4b\x9d\x41\x9c\x20\x9c\x65\xa5\x64\x74\x02\x47\x97\x57\x67\xc7\x33\x33\x81\x92\xaf\xc1\xd0\x06\x32\x8d\x56\x1d\x3a\xb6\x1b\xdc\x04\x6d\x8b\x48\x78\xe7\x73\x40\xd0\xef\x16\x8e\x08\xc6\x3e\x89\x60\x0c\x52\x46\xd8\x74\x7e\x75\x06\x6f\x46\xc2\x62\x21\x15\x7a\xda\x55\x46\xde\xca\x02\x73\xea\xb1\xe3\x5f\x81\xf3\xda\x18\x54\xae\x98\xc6\x9b\x0a\x96\xaf\x8a\xb4\x50\xab\x39\x76\x8b\x9c\xd5\x48\xc7\x66\xb1\xa8\xb4\xc5\x2c\x81\x2b\xae\x31\xf5\x50\x3a\x94\xe3\xb5\x71\x13\xa1\x56\x2e\x2e\x18\xb4\xd4\xb0\x54\xbe\x96\xcc\xd8\xb2\x02\x34\x86\x54\x33\x67\x2f\xd4\x96\x05\x75\x91\xa1\x81\xd4\xb3\x01\xc8\x52\xe4\x5e\xca\x33\x91\x58\xe5\x84\x14\x8f\x40\x98\x25\x84\x5f\x3d\xe7\x56\x69\xf1\x8a\xe8\x66\xbc\x09\x5c\x2b\x32\x5a\x04\x8c\x6b\x57\x1b\x84\x5b\x34\xbc\xba\xbc\xe7\xba\xa4\x89\x9b\x30\x36\xd0\xe9\x7e\xd0\x0c\xbb\x14\x32\xb0\x9a\x8d\x7d\x1a\x1c\xd5\xb2\x60\xb4\x22\x9b\xf9\x59\xcf\xc8\xa2\xe9\x4e\x8f\x41\x57\x65\xb8\x26\xa4\xae\x2a\x6d\x5c\xab\xc3\xd2\xee\xde\x08\x3a\x66\x09\x01\x68\x58\x95\xc1\x8a\x70\x6c\x90\xb4\x16\x21\x9d\x08\x95\x13\x7b\x5c\x2b\x78\xaa\x39\xa5\xc3\xe7\x05\x51\xb7\x62\xa4\x6b\xc7\x3c\x16\xf6\xea\x58\xd7\x2a\x03\x12\x2a\xa7\x30\x71\xae\xb2\xa7\x27\x27\x37\xf5\x08\x8d\x42\x87\x36\x91\xfa\x24\xd3\xa9\x3d\x49\xb5\x4a\xb1\x72\xf6\x24\xee\xa6\x93\x4a\x67\xc3\xf8\x63\x28\xe2\x26\x39\x39\x3c\xd8\x57\x1a\x41\xa4\xfc\x29\xf8\xb5\x5a\x51\x0a\x55\xbd\xe6\x52\x84\xe1\xfa\xca\x54\xa0\x25\xe3\xd2\x42\x4e\x17\x7c\x85\xc8\x1a\x4f\xe1\x2c\x50\x6a\xcb\x37\x57\x79\x44\xf6\xb0\x1d\xe9\x76\x68\xbb\x4d\xaf\x17\xda\xeb\x00\xe4\x06\xc8\xb8\x70\x8d\x07\xcb\x36\x02\x73\xed\x40\x19\x00\x38\x27\xf8\x22\x0f\x42\xe3\xfe\x0b\x89\x2b\x35\x05\xe2\x67\x17\x6e\x75\xe9\x5c\x73\xe2\x0c\xe7\x19\x7d\xd5\x58\x7d\x03\x1c\x8f\x31\x75\xdf\x84\xfd\xdc\xd8\x7f\xbc\xb9\xa3\xa5\xf6\x55\xfc\xeb\x9b\xd5\xc8\x67\x2b\xa3\x6a\x3b\xb7\x98\x1f\xd2\x7a\xb8\x3b\x43\xa1\xef\xb8\xc2\x9c\xca\xf6\x14\xf0\x6d\x11\x7d\x78\x5a\x11\xdb\x79\x23\x21\xe0\x1d\x92\x19\x9d\xc2\x36\x48\xb8\x8e\xb4\x0d\xb8\xaf\xb5\x50\x11\x9e\xe9\x90\x70\x87\x03\xb8\xe4\x3b\x50\xda\x37\xac\xc8\x9e\x69\x9f\x7a\xb7\x12\x17\x75\xe9\xb6\xd1\x1e\xd8\xe8\x18\x9c\x21\xc8\x0f\xad\x1b\xd0\xcf\x6c\xc6\x0d\xd8\x72\xf0\x8c\x95\xb7\x8e\x32\x37\x38\x6d\x5d\x47\xc1\xc9\xc8\x96\xd9\xa0\xe5\x92\x08\x3e\xbd\x27\xe8\xef\x21\x77\x46\x97\x23\xa9\x7c\x67\xbe\xe9\xb8\x14\xdc\x7a\x24\xa8\xca\xf8\x27\x77\xf3\x2e\xc8\xb5\x9d\xb7\x71\x86\x66\xcf\x77\xf0\x2d\x36\xde\x8a\xe5\x5e\xc5\x8e\x2b\xf1\xbb\x5f\x6b\x51\x24\xf0\xd8\x4b\x45\x9e\x7d\x78\x15\x0a\x2d\x78\x57\xee\x64\x91\xa5\xc2\x64\xac\x0d\xfc\x1e\x05\xab\xfd\xea\x89\x06\x70\xc4\xdd\xde\xae\x91\xbf\xe3\x07\x2a\x61\x9c\x4c\xeb\x42\xb0\xda\xc2\x5c\x9b\xe9\x3b\xa1\x68\xcb\x34\x57\x98\x6a\x95\x6d\x30\x78\x57\x48\xd7\x50\xb7\x4b\x63\x86\x51\x68\x64\x48\x65\x93\x25\xce\x33\xe9\xd1\xac\x71\xa3\xc7\x71\x57\x37\x5b\x6c\xe0\x51\xcd\x9d\x64\x58\xd6\xf8\x1b\xa4\x05\xe9\x73\x61\x8f\x3b\xe2\xb1\xd9\x15\x09\xfc\x63\x1a\xf5\xd5\x00\xa4\x8b\x56\x9e\x45\x17\x31\x4c\x64\xd9\x40\xec\x76\x43\x8d\xb5\xc1\x5b\x34\x70\x94\x69\xae\xc3\xe9\x9e\xc7\x09\xfc\x8b\x20\x3e\x7b\x27\x30\xf7\x99\x89\x81\xc5\x23\x12\x71\x7c\x29\x17\x5b\xbb\x0f\xe1\xc8\x67\x89\xca\xb2\xc4\x4c\x0a\x87\xc5\xf4\xd8\x07\x0a\x63\x9e\xe9\x36\x4b\xb7\x4d\x72\x71\x27\xa9\xf8\xcb\xbf\xac\x29\xc9\x83\xdd\x61\x65\x7f\x66\x48\x39\x23\x6a\x3c\xca\x9c\x5b\xc2\x46\x07\xe9\x35\xce\xe3\x8e\xb3\xb8\x83\xfd\xa2\x98\x69\x16\xf8\x17\xe2\x03\x01\x06\x73\xe6\x72\xcf\xb9\xf7\xe0\x71\x99\x2e\x4f\x8e\xde\xa0\xd1\xd6\xc7\x9f\x86\x40\xf0\xff\xcb\xbf\x64\xc2\x89\x15\x05\xfc\x9a\x4f\x2b\x5c\xf2\x7d\x93\xa2\x6c\x1b\x5f\xb5\x58\x1b\xb7\x75\xd3\xfd\x5e\x2d\x30\xd4\x5f\x56\x73\xd6\xa4\xa6\x52\x21\x1e\x11\xd7\x7b\x68\x30\x97\xd6\x99\xc6\xc5\x4b\x96\x22\x97\x73\x1a\xa4\xb2\x4e\x28\x27\x59\xb2\x41\x2c\x39\xb4\x68\x6e\xf9\xd6\x3e\x37\x49\xe0\x39\xd9\x5a\x64\xde\xc0\x1d\xa9\x69\x0f\xb0\x5f\x4e\x2b\x84\xaf\x3b\x3f\xbe\x37\x55\xca\xbc\x16\x04\x8d\x67\x2e\x91\x65\x06\xed\xa2\x7c\x58\xc6\x3e\x6b\xe7\x1f\xcd\xfc\x8d\x24\x38\xbc\x8c\x0e\x81\xe0\x03\xb5\x56\xe6\x84\x32\xe3\xa9\x84\xa0\x4e\x66\xd1\xa6\xb7\x0a\xb8\xa2\xfc\x8d\x77\x53\xd9\x28\x01\xe9\x22\xee\x4f\xb5\xb2\x75\x19\x93\x0b\xc8\xea\xa9\x50\x65\xa8\xd2\x29\xa7\xb1\x16\xb7\x68\x12\xf8\xc9\xd2\x4a\xc1\x7f\xc9\x9c\xec\xbe\xd0\x69\x17\x2a\xc5\xec\xe8\xb9\x11\x48\xdb\xb9\xdb\x8d\xd3\x25\x08\x03\xc5\x16\x30\x9b\x2b\x6f\x63\xc8\x66\x7e\x10\x9c\x5c\x1f\x1c\xf7\x7c\x7a\x22\xb8\xdf\x1a\x47\x89\xdf\xf0\x34\xa5\x5c\xfb\x44\xf9\x4a\x5b\x19\xb3\xba\x1b\x39\x3a\x73\x02\x43\x8f\xfd\xf9\x08\xdf\xee\xac\x21\xcc\xb1\xbf\xb9\xc9\xb0\xe1\x56\x2b\x4f\x7c\xec\x7a\x69\xa2\x98\x79\xe8\x9b\x5a\x56\xcf\xc5\x0b\x33\x67\x87\xdc\xca\x74\x23\xd4\x0d\x66\x50\xe0\x5b\x99\xea\xdc\x88\x6a\x22\x53\x3e\x04\x40\xdb\x94\x9d\x64\x9c\xfa\x2f\x4a\x4c\x0e\x57\x32\xda\x2a\x31\x5e\xd5\xa3\x42\xda\x09\x2e\xc5\x32\x6b\x79\xd4\x62\x6a\xd0\x2d\x95\x20\x33\x2c\x7a\xe5\xcb\xb5\x4a\x39\x46\x4e\x43\x03\x21\x33\xc0\xf3\x1c\x6f\x3c\x22\x71\x9a\xd2\x46\xf2\x47\x67\x94\x6b\x2f\x66\x6c\x68\x98\xc0\x05\xab\xd4\x11\x5a\xe6\xf2\x1b\xc4\xca\x73\x1a\xbb\xf0\x6d\xc9\x3e\x15\x2b\x55\x8a\xfe\x28\x83\x3f\x12\x82\x18\xdd\x8c\xce\x48\xf4\x30\x88\x54\xed\xb4\x59\x1b\x54\x6e\x39\xa8\x59\x6f\x77\xad\xb1\xb9\xd6\x93\xb1\x91\x29\x9b\x29\xd9\xca\xa2\xa8\x13\xe9\x6f\x22\x25\x7f\xd9\x75\x05\xfd\xc9\x93\x2b\x1f\x02\xdd\x2c\x6b\x7e\x9a\x29\x1e\x1c\xeb\x16\x26\xfa\x2e\xb4\x34\xbf\x69\x83\xc7\x26\xae\x6d\x26\x6d\x4a\x3b\x1d\x33\x38\xd7\xca\xc6\xe3\x27\x42\xf9\x13\x25\xb7\xa2\xf0\xac\x10\x1b\xae\x74\xc1\x27\x7b\xb2\x3a\x9a\x13\x3e\x4b\x04\xcb\x11\xf2\xb5\x91\x36\x0e\x65\x85\x9a\xdb\xa0\x62\x37\x69\xc1\xa8\x1f\x2e\x75\x51\xac\xd7\x62\x6b\xed\xd2\x6d\xac\xd2\x48\x80\xad\xaf\xec\xbd\x88\x14\x0b\xbe\x38\xe2\xe9\x0c\x1d\x9a\x52\xaa\x00\x8f\x08\xea\x36\x84\x1d\xa1\xbb\x43\x54\x90\x4e\x30\xbd\xb1\x6d\xac\x83\x2f\x70\x9d\x5b\xb5\xe0\x7f\x9a\x95\x58\x0d\x9e\xa2\x55\x61\x43\xc3\x22\x82\x24\x9b\x40\xe1\x5d\xd7\x67\xb5\x44\xdd\x90\x8a\xbe\x15\xb2\x10\xa3\xc2\x1f\xbb\x6a\x7e\x0d\xba\xe3\x90\x51\x9f\x57\x75\x51\xa0\x0f\xe8\xe5\x2f\x2e\xcf\xc1\x19\x31\x1e\xcb\x94\xc3\x39\xd2\x78\xaf\x6f\x50\x6c\x4b\xa7\xb0\xf9\x52\xe1\x25\x3b\xc2\x3a\xe1\xea\x85\x35\x5a\xb3\xc0\xeb\x16\x96\xec\x10\xb9\xd2\x41\x34\x77\x15\xe7\x8c\xb1\x42\xc3\x40\x6f\x6c\xcd\xf8\xbf\x13\x78\xa6\x5d\xb8\x49\xf7\x29\x5a\x52\xbb\x4c\xa0\x17\x28\xac\x56\x1d\xe9\xca\xe8\xd7\xc8\x5c\x2a\x51\x84\x49\x75\xfd\x7b\x8d\xed\x21\xd8\xa5\x5c\xca\xdc\x08\xd7\x08\xc5\x76\xdc\x41\xbb\x04\xbd\xe8\x3d\xa1\x09\x9c\xa9\x29\xaf\xf7\x18\x05\xbd\xa0\x96\x9d\xd1\x59\x9d\x62\x38\x73\x57\xdb\x6e\x23\xef\x54\x8c\xce\x86\x17\xce\x63\x27\x6d\x2c\x3f\x43\x27\x64\x08\x29\x69\x85\x20\x6c\x45\x76\x5c\xe4\x49\xef\x0a\x6f\x09\xcc\xca\xe2\xec\xf2\x02\x5e\x84\x43\x39\x09\x0c\x87\x43\x1f\xd5\xb4\xce\xd4\x29\xeb\x17\xda\x42\x2a\x0b\x9a\xc2\x73\x1f\x4f\x52\x74\xd2\x60\x82\xe7\xc3\x43\xb0\x4a\xb8\x09\x24\x9e\xf0\x49\x87\x14\x00\x4f\x48\xd7\xbc\x15\x65\x45\x7c\x7f\xad\xbc\xf4\x7e\xa2\xf5\x95\x5f\x24\xdf\xe7\xef\x70\x72\x32\xcf\x13\x7a\x44\x10\x35\x38\x10\x99\x35\xc6\x5a\x1f\xda\xd9\x29\x25\x54\xf1\x07\xa5\xef\xd4\xb2\xde\xb9\x2f\x61\xf0\x14\xae\x0f\xce\xe2\xee\xbb\x3e\x18\xc0\xf5\xc1\xa5\xd1\x39\xa7\x57\xa8\xfc\x3a\xe4\x4b\x5c\x1f\x3c\xc6\xdc\x88\x0c\xb3\xeb\x03\x6a\xf6\x3f\x38\x2f\xe6\x29\x9a\x1c\x7f\xc0\xe9\xd7\xdc\x58\xf3\x3a\x6a\x84\xaf\x7d\x0a\x0d\xbd\x27\x15\x4c\x7a\xea\xeb\x52\x54\xcd\x8b\xa7\xa2\x6a\x2a\x9f\xb7\x7c\xf6\xea\x75\x89\x4e\xdc\x3e\x4a\xda\x15\x7d\xf3\x8b\xd5\xea\xf4\xfa\xa0\x1d\xff\x40\x97\xc4\x19\x95\x9b\x5e\x1f\xc0\x4c\xaf\xa7\xd7\x07\xdc\x6f\x7c\x1f\x07\x79\x7a\x7d\x40\x3d\xd1\x6b\xa3\x9d\x1e\xd5\xe3\xd3\xeb\x83\xd1\xd4\xa1\x1d\x3c\x1a\x18\xac\x06\x04\x98\xbe\x6e\x7b\xb8\x3e\x78\x43\x6b\x72\x72\x12\x42\x18\xe1\x92\xe2\x3f\x96\x3b\xab\x37\xca\xfd\x4d\xf9\x83\x43\x28\x84\x75\x2f\x8d\x50\x96\xfb\x7f\x29\xcb\x65\x2a\x0c\x82\x2d\xc7\xfb\x7d\xe5\x77\xc3\x32\x60\xe5\x67\xcf\x0d\x2b\x3f\xaf\xd0\x9e\xdb\x68\xae\xc5\x39\x6c\xe9\x75\x5e\xac\xd8\x26\x16\x12\x9e\x8b\x7e\x9a\x66\x7d\x48\x07\x84\xd2\x18\x0e\xbc\xd2\x16\x0f\xf2\x8d\xd3\x86\x78\xdd\x42\xca\x57\x6b\xe0\xdf\x85\xc3\xb0\x50\xab\x0c\x4d\xc1\xc1\xaa\xb6\x55\x1f\x09\xc9\x12\xf0\x7e\x03\xd1\x78\x69\x6e\x68\x23\xb1\x76\x52\x1d\xe7\x35\x8f\xab\x69\x91\x64\x47\x38\x0f\xec\x9b\x61\x45\x97\xa6\x58\x39\xd6\x74\xfb\x87\x98\xa1\xe3\x54\x21\x64\x35\x74\xab\xd9\x23\x30\xc7\x96\x84\x0f\xa5\x7d\x7c\x7f\x52\x97\x82\x54\x87\xc8\x68\xbc\xed\x37\x6f\xbe\x79\x73\xcb\x8b\x54\x1f\x14\xf2\x3e\xfe\xb8\x0e\x81\xd4\x41\x91\x88\x26\xf1\x7b\x83\xc7\x64\xab\xc9\x97\xe2\xed\x8f\xa8\x72\x37\x39\x85\x2f\x3e\xff\xcf\x2f\xff\xba\xa2\xa0\x17\x8c\x98\x7d\x8f\x2a\xf8\x82\xb6\x24\xc3\x62\xc5\x79\xa7\x61\x42\x52\x29\x13\x4e\x24\x79\x5b\xa6\x71\x72\xb7\x1c\x74\x27\x2c\x1b\x34\x5e\x5d\xd6\x15\xd1\xe5\x09\x27\xaa\x58\x27\x54\x8a\x03\x02\x49\x4b\x1b\x93\x8d\x00\x2f\xa6\xf0\xe8\x73\x7f\x99\x3f\x77\xbd\x20\xbe\x5f\xbd\x7d\x9d\x2c\x19\xb2\xb4\xf0\xb7\xc1\xdc\x78\xa4\x05\x5a\x2a\x3d\x66\xc6\xf1\x26\xa6\x41\xaf\x09\xa3\x33\x60\x51\x13\x62\x33\xde\x4d\x0b\xb7\xc9\x1f\xb8\x9d\x2f\xb0\x94\x4a\x96\x75\x79\x0a\x0f\x57\x14\xf1\x22\x6d\xcb\xd5\xf4\x85\x5b\x20\x20\x48\x74\xe5\x46\x94\x25\xa7\xa4\xc9\x0c\x95\x93\x63\xc9\x49\x03\x0d\x6b\xb3\xb9\xef\x2b\xc6\x1c\x94\x86\x8a\x9c\x9e\x42\x72\xa8\xc3\xec\x97\x1e\xe7\x18\xd6\xc0\x21\x7a\x93\x76\x05\xd4\xb4\x42\xbf\x1b\xbc\x01\x03\xf8\xb6\xf2\x50\xb5\x13\x86\x28\x51\x28\xa9\xf2\x98\xf6\xd2\xfe\x47\x0e\xf4\xf1\x6e\x82\x21\x7a\x8e\xdd\x58\x50\x4a\xc6\x52\xc6\x76\x93\x80\xbc\x16\x46\x28\x47\x66\xec\xd9\xe5\x85\xc7\xe8\xf3\x3e\x4d\x42\x8e\x25\x16\xe7\xc2\x62\xdc\x8d\x7e\xab\x7a\x61\x15\x6f\x15\x68\xb2\x64\xdf\xd9\x56\x7d\xf4\xf0\xf3\xb5\x4b\xde\x94\x5b\x1d\xc2\x13\xce\xa1\x51\xa7\xf0\x3f\xaf\xce\x86\xff\x12\xc3\xdf\x5e\x1f\x85\x3f\x1e\x0e\xff\xf6\xbf\x83\xd3\xd7\x9f\x75\x7e\xbe\x3e\xfe\xf6\xff\xaf\x68\x69\x39\x98\x5f\xc1\x3e\x41\x89\x44\x9c\x18\x57\x74\x10\xb3\x54\x5e\x9a\x1a\x07\xf0\x44\x14\x16\x07\xf0\x93\x62\xd5\x70\x4f\xa2\xad\x8f\x50\x93\x56\x3e\xa0\x5e\x57\x45\xca\x43\x11\x1e\xd2\xfa\x32\x61\xb8\xeb\xcc\xd7\xed\x88\x14\x5d\x0d\x1d\x49\xa3\x3a\x7c\xe6\x53\xf3\xc6\x5a\x27\x01\xe1\x26\xa9\x2e\x4f\x9a\xef\x1e\x5a\x3f\x15\x6a\x0a\xad\x58\xf3\xa0\x74\x9e\xd3\xad\x23\xd9\x24\x52\xa3\xad\x6d\xcf\xcb\x43\x21\x6f\x10\xce\x5a\xbb\x91\x84\xe5\x08\x53\xc1\x58\xdc\x8c\xa4\x33\xc2\x3b\x7d\x23\xae\x6c\x3d\x4a\xe3\xba\x80\x23\x32\x57\x13\x4e\x24\x5b\x90\xae\xe1\xee\x0d\x31\x92\x05\xff\x17\x08\x64\x4a\xa7\x5a\x8d\x0b\x19\x4c\x80\xb2\xd2\xc6\x09\xe5\x62\x82\x70\x8e\x6f\xfd\xff\xba\xe2\xc3\x0e\xd2\xc2\x51\xa6\xec\xa3\x47\x9f\x7f\x71\x55\x8f\x32\x5d\x0a\xa9\x9e\x94\xee\xe4\xf8\xdb\xa3\x5f\x6b\x51\x70\x94\xf7\x99\x28\xf1\x49\xe9\x56\xff\xff\x15\x3b\xab\xc5\x47\x5f\x6e\xb1\x8b\x8e\x5e\xf9\xbd\xf2\xfa\xe8\xd5\x30\xfc\xf5\x59\x7c\x75\xfc\xed\xd1\x75\xb2\xf6\xfb\xf1\x67\x34\x87\xce\x0e\x7c\xfd\x6a\xd8\x6e\xbf\xe4\xf5\x67\xc7\xdf\x76\xbe\x1d\x2f\xdb\x8c\x6f\x87\x6d\xaa\xc8\x90\xac\x80\x61\x29\xaa\xe1\x0d\x4e\x57\x6c\xce\x95\x70\x74\xb1\x21\x4f\xb1\x52\x54\xcb\xac\xef\xb1\xcc\x9f\x8a\xea\x05\x8e\xd1\xa0\x4a\x97\x32\xf9\x3d\x23\x30\x64\x3f\xac\xf9\xc4\x19\x58\x7b\x78\x9d\x48\xef\x78\x4f\xdb\x3a\x38\xbd\x05\xb7\x6c\x87\x1f\xd5\x9a\xfc\xc5\xcd\x29\xa6\x71\x9e\x7b\xb7\x10\xf7\xf7\xcf\xde\x7f\xb4\x77\x3b\xb5\x5c\x69\x69\xcd\xfa\x30\x2f\x1e\x7b\xe8\xcb\xa2\x87\xe1\xdc\x44\x93\x9d\x57\x2b\xf9\x6b\x8d\x70\xf1\xb8\x39\x9a\x26\x55\x5a\xd4\x7c\x19\xce\x4f\x3f\x5d\x3c\x26\xfb\xfd\x1f\x41\xdc\xdc\x21\x64\x5a\x1d\x3a\x78\xfe\xec\xc7\xff\x66\x67\x00\x97\x18\x78\x85\x1e\xce\xc7\x14\x52\x78\x37\x59\x50\xc0\xf0\x0f\xf4\x79\x72\xdc\x73\x2a\xaa\xc6\x7f\xc2\xe2\x8e\x33\xac\x8a\x8a\x00\xc4\x0d\x82\xad\x4d\x18\x1d\x35\xec\x23\xbe\x9c\x45\x1f\xe2\xc1\x39\xf2\x59\xba\x71\x21\xdc\xea\x7c\xe1\xb5\x44\x4b\xb5\x52\x98\x72\xd0\x9c\x50\xe0\x7b\xd8\x1f\xc4\xc8\xcf\x03\x66\xe5\x3e\xf6\xd8\x0c\x21\xa0\xb6\x37\x5b\xd0\x18\xce\xfd\x4c\xdf\xfb\x4e\x5a\x98\xef\x5e\x3d\x7a\x7f\x26\x47\x36\x5f\x6c\xf0\x3f\x2f\xa4\x71\xcd\x9a\xce\x33\xde\xc3\xe0\x5b\x6d\x82\xa3\x13\x61\x61\x84\xa8\xd8\x9d\xeb\xbd\x7f\xa8\x02\xd7\x61\xeb\x88\xad\xab\xa1\xd3\xc3\x6c\xf9\xe2\x6d\xa0\xdc\x66\xaa\xad\xb1\x5c\xe7\x4e\x99\xee\x6a\xa8\xde\x4d\xa6\xcb\x68\x60\xdb\x4b\x77\x1a\x0c\xb2\xeb\xc4\x56\x1b\x26\x73\x5e\x5d\xb6\x2c\x82\x53\x23\xd8\x19\x8b\x43\x22\xeb\x71\xc6\xb3\xe1\x34\x47\xf3\x66\x3d\x7b\xbb\x8f\xd1\x2f\xf3\x15\x9a\x5b\xb9\x97\xf2\xdb\xb4\x31\x53\x9f\x67\x72\xf6\xfe\xb7\x15\x41\xaf\xbd\x3b\x61\xd7\x5f\xaa\x37\x84\x6f\xd6\xe6\xbf\x33\x05\xd7\x65\xf9\xef\xd2\xc6\xae\xca\xd2\x4b\x93\x53\x3e\x71\x11\x5f\x39\x6d\x38\xe4\xde\x7d\x57\x8f\x1a\xa0\xdc\xb6\x1e\x6c\x20\xf8\xfd\x8f\x07\xff\x17\x00\x00\xff\xff\x25\x01\x0e\x3b\xe7\xe7\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x69\x73\xdc\x36\x16\xe0\x77\xff\x8a\x57\xda\xd9\x92\x94\x74\x53\x76\x32\x95\x9d\x68\x72\x94\x46\x3e\x56\x15\x1f\x2a\x4b\xc9\xd4\x8e\xe5\xdd\xa0\xc9\xd7\xdd\x88\x48\x80\x01\x40\x49\x9d\xe3\xbf\x6f\xbd\x07\x80\x64\xdf\x87\xec\xd8\xae\x21\x3f\x24\x6a\x12\xe7\xbb\x2f\xc0\xa2\x94\x3f\xa1\xb1\x52\xab\x63\x10\xa5\xc4\x3b\x87\x8a\x7e\xd9\xe4\xfa\x1f\x36\x91\xfa\xe8\xe6\xd1\x83\x6b\xa9\xb2\x63\x38\xad\xac\xd3\xc5\x6b\xb4\xba\x32\x29\x3e\xc6\xa1\x54\xd2\x49\xad\x1e\x14\xe8\x44\x26\x9c\x38\x7e\x00\x20\x94\xd2\x4e\xd0\x6b\x4b\x3f\x01\x52\xad\x9c\xd1\x79\x8e\xa6\x3f\x42\x95\x5c\x57\x03\x1c\x54\x32\xcf\xd0\xf0\xe0\x71\xea\x9b\x87\xc9\xd7\xc9\xc3\x07\x00\xa9\x41\xee\x7e\x29\x0b\xb4\x4e\x14\xe5\x31\xa8\x2a\xcf\x1f\x00\x28\x51\xe0\x31\xa4\xc2\x89\x5c\x8f\xfc\x22\x6c\xa2\x4b\x34\xc2\x69\x63\x93\x54\x1b\xd4\xf4\xbf\xe2\x81\x2d\x31\xa5\xd9\x47\x46\x57\xe5\x31\x2c\x6c\xe3\xc7\x8b\x8b\x14\x0e\x47\xda\xc8\xf8\x1b\xa0\x0f\x3a\x2f\xf8\xef\xb0\x79\x3f\xed\x05\x4f\xcb\xef\x73\x69\xdd\x0f\xf3\xdf\x9e\x4b\xeb\xf8\x7b\x99\x57\x46\xe4\xb3\x0b\xe6\x4f\x76\xac\x8d\x7b\xd9\x4c\x4f\xd3\xa5\xc2\x59\x93\xfa\xcf\x52\x8d\xaa\x5c\x98\x99\xbe\x0f\x00\x6c\xaa\x4b\x3c\x06\xee\x5a\x8a\x14\xb3\x07\x00\x01\x84\x61\xa8\x3e\x88\x2c\x63\xb4\x88\xfc\xdc\x48\xe5\xd0\x9c\xea\xbc\x2a\x54\x3d\x15\xb5\xc9\xd0\xa6\x46\x96\x8e\x41\x7f\x39\x46\x28\x0d\x3a\x37\x61\x90\x80\x1e\x82\x1b\x63\x9c\xbb\xee\x05\xf0\x8b\xd5\xea\x5c\xb8\xf1\x31\x24\x04\xe1\x24\x93\xb6\xcc\xc5\x84\x56\xd3\x6a\xe5\xd1\xf4\xd8\x7f\x6b\xbd\x77\x13\x5a\xba\x75\x46\xaa\xd1\xaa\xa5\x50\xbb\xcd\xd7\xe0\x41\x73\x39\x29\xe7\x97\x30\xf3\x72\xd3\xf9\xcb\x6a\x90\x4b\x3b\x46\xb3\xf9\x22\xea\x2e\x73\x6b\x38\x5f\xf0\x65\xc9\x42\x5a\x83\x46\x86\x4a\xe6\x98\x61\x6e\x82\x93\xd1\xfc\x1e\x33\xe1\xe2\x4b\xdf\xe8\xe6\x91\xc8\xcb\xb1\x78\x14\x5e\xda\x74\x8c\x85\x68\xe8\x41\x97\xa8\x4e\xce\xcf\x7e\xfa\xf2\x62\xe6\x03\x4c\x43\x67\x8a\xce\x41\x5a\x10\x60\xb0\xd4\x56\x3a\x6d\x26\x04\xad\xd3\x8b\x9f\x6c\x0f\x4e\x5f\x3f\xb6\x3d\x10\x2a\xab\x19\x0f\x4a\x91\x5e\x8b\x11\xda\x64\x6e\xad\x7a\xf0\x0b\xa6\xae\xf5\xda\xe0\xaf\x95\x34\x98\xb5\x57\x41\xe0\x89\x30\x99\x79\x4d\xf0\x6f\xbd\x2a\x0d\xcd\xe9\x5a\x8c\xec\x9f\x96\x94\x9b\x7a\x3f\xb3\xc3\x7d\x02\x83\x6f\x07\x19\x09\x38\xb4\x4c\x02\x81\xc7\x30\x0b\xb0\xf3\xa4\x21\x2d\xed\xdf\xa0\x45\xe5\x45\x1e\xbd\x16\x2a\xec\x29\x81\x0b\x34\xd4\x91\xd8\xbd\xca\x33\x92\x84\x37\x68\x1c\x18\x4c\xf5\x48\xc9\xdf\xea\xd1\x2c\x38\xcd\xd3\xe4\xc2\xa1\x75\xc0\x5c\xab\x44\x0e\x37\x22\xaf\xd0\x83\xb2\x10\x13\x30\x48\xe3\x42\xa5\x5a\x23\x70\x13\x9b\xc0\x0b\x6d\x10\xa4\x1a\xea\x63\x18\x3b\x57\xda\xe3\xa3\xa3\x91\x74\x51\x86\xa7\xba\x28\x2a\x25\xdd\xe4\x88\xc5\xb1\x1c\x54\x24\x0e\x8f\x32\xbc\xc1\xfc\xc8\xca\x51\x5f\x98\x74\x2c\x1d\xa6\xae\x32\x78\x24\x4a\xd9\xe7\xc5\x2a\x96\xe3\x49\x91\xfd\x0f\x13\xa4\xbe\xdd\x9f\x01\xdf\x42\x62\x86\x28\x36\x57\xc2\x9a\x84\xa7\xa7\x22\xdf\xdd\xef\xa5\x01\x29\xbd\x22\xa8\xbc\x7e\x72\x71\x09\x71\x01\x1e\xec\x1e\xc2\x4d\x53\xdb\x00\x9b\x00\x25\xd5\x10\x8d\x6f\x39\x34\xba\xe0\x51\x50\x65\xa5\x96\xca\x79\x96\xce\x25\x2a\x07\xb6\x1a\x14\xd2\x59\xa6\x39\xb4\x8e\xf0\x90\xc0\x29\xab\x30\x18\x20\x54\x25\x71\x52\x96\xc0\x99\x82\x53\x51\x60\x7e\x2a\x2c\xbe\x77\x50\x13\x44\x6d\x9f\xc0\xb7\x39\xb0\xdb\x1a\x78\xbe\xc3\x1c\x8f\x01\x44\x0d\xb9\x51\xe3\x65\x4c\x09\x9e\x03\x17\x49\x60\x58\xc1\x8b\xf4\x88\x2c\x33\x68\x17\x7c\x98\x63\x48\xdf\xd0\xd3\xc9\x58\x5b\xc2\x9f\x70\xf0\xea\xf9\x0b\x48\x85\x82\xca\x22\x31\x4f\xaa\x95\x22\x82\x70\x1a\x04\xe9\xb2\x3e\xde\x49\xcb\x04\x64\x70\x24\xad\x33\x93\x04\x9e\x6a\x53\x08\x77\x0c\xdf\xc4\x57\x7d\x1e\x4e\x1b\x90\xe5\x77\xc7\xdf\x94\xda\xb8\xef\xe0\x95\xca\x27\x34\x68\x06\xb7\x63\x54\x70\x51\xef\x0d\xbe\x6d\xfd\x78\x66\xca\x34\x81\xb3\x91\xd2\x26\xb6\x24\xaa\x3a\x2b\xc4\x08\x61\x28\x31\x67\xba\xb6\xe8\x92\x59\x0c\xae\xc4\x22\x78\x73\x69\x28\x47\x2f\x44\xb9\x16\x34\xa7\xb1\x25\xcd\x45\xd3\xb7\x95\x77\xf3\xd1\x69\x26\x65\xda\x12\xfd\x29\xd2\x6b\x10\x61\x96\x42\x94\x7d\xcb\x6c\xd3\x02\xd3\x66\x10\x38\x8d\x03\x10\xfc\x9a\xd7\x67\x41\x72\x25\xdb\x6e\xbb\xbd\xb3\xad\xfb\x36\x66\xc8\x5a\xa0\xbd\x58\xa4\x45\x36\x98\x63\x64\xca\xf4\x5c\x67\x7e\xdb\x6b\x67\x79\xd6\x6e\x0d\x78\x57\x6a\x8b\x16\x32\x39\x1c\xa2\x21\xb9\xa3\x6f\xd0\x18\x99\xa1\x85\xa1\x36\x8c\xaf\x52\x67\xcc\x93\x35\xfe\xa6\x54\xed\xb9\xce\x36\x45\x0c\x4d\xcd\x0a\xc3\x13\x63\x20\xc3\xa5\xdb\x5d\xc8\xed\xb0\x86\x79\xe9\x11\x43\x36\xff\x27\x8b\xbf\xce\xc0\xe3\x24\x34\x8e\x94\x1a\x2c\xaa\x20\x3a\xf6\x2d\x6d\x7f\xdf\xd6\x63\x2e\x5a\xee\x06\x4b\xde\x64\xd9\xf4\x28\x9d\xe1\xc9\x9a\xe5\xcf\x6d\xe1\x31\xff\x18\xa0\xe5\xee\xf5\x52\x59\x83\x67\x55\xce\xa2\xa6\xca\xa7\x31\xba\x6c\x1f\x1b\xee\x65\xd3\xfd\xf8\x76\x38\x44\x63\x30\x7b\x5c\x11\xfd\x5e\xd4\xab\x0a\x42\xca\xbf\x7e\x72\x87\x69\xb5\x8c\xc7\x96\x6e\x9d\x8c\xe2\xb0\x4d\x34\x70\x2b\xf3\x3c\x4c\x47\x02\x25\x7e\xa0\xfd\xb2\x1d\x43\xe0\xb1\x5e\x48\x5b\xe1\xa4\x1d\x4e\x18\x1c\x35\xc0\xf0\x8e\x74\x36\x7b\x2c\x4c\xf1\x72\x28\x31\x83\xc1\x24\xa8\x6b\x12\x9e\x3d\x18\x54\x0e\xa4\x63\x5d\x9e\x8e\xb5\xb6\x08\xc2\xc3\x9d\xc7\xbd\x91\x9a\x2d\x25\xd0\x0a\x49\xfe\x14\xa4\x90\x03\xe3\xb4\x86\x4f\x78\xe5\x4d\x37\x69\xa1\x20\x89\x5f\xc3\x2a\x92\x23\x0d\x73\x2b\xdd\x98\x7f\x8c\xc8\xe4\x26\x2b\xcc\x56\x05\x0d\x7a\x8b\x72\x34\x76\xb6\x07\x32\xc1\x84\xb1\x8b\x22\x1d\xb7\x86\x2d\x10\x9d\x05\x91\xe7\x71\x09\x6d\x92\xf0\x7a\xb3\x20\x13\x05\x0e\x6a\x1b\x26\xd8\x1b\xbd\x5a\xaf\xce\x62\x6d\x21\xb8\x7a\x80\x2e\x4d\x0e\x7b\x90\xea\xa2\xac\x1c\xc1\x84\xd6\x38\x98\x80\x74\x64\x67\x7b\x7b\xc9\xe8\x6a\xe4\x77\x82\x79\x98\x38\x1a\xab\x5e\x33\x91\x70\x20\x1f\x51\x8d\x60\xcf\x6f\x6e\x2f\xda\x9f\x34\x9c\xf4\x9b\xe0\xfd\x15\xc2\xa5\xe3\x60\x02\xa7\xda\x18\xb4\xa5\x56\xdc\x93\xbf\x3c\x69\xd6\xf6\xcf\xba\xd3\x81\x3d\x6c\x80\x39\x96\xa3\x71\x84\xa5\x30\xc8\xef\xa6\x71\xb0\x8a\x47\x1a\x3e\x11\xc6\x4c\xf9\x92\x8b\x1e\xe9\xb0\x58\xc3\x25\x73\xa4\x7d\xa2\x00\x8b\xd2\x4d\x5a\x34\xd1\xc2\x9e\x43\x53\xd4\x30\x60\x04\x33\xbb\x5a\xbf\x3f\x59\x94\xb9\x4c\xa5\x0b\x14\x02\x0f\xe1\x80\x49\x44\x3a\x12\x65\xa0\x74\x5f\x97\x87\x09\x9c\x70\xf8\x62\x83\x09\x94\xae\xc7\x0f\x03\xd1\xa4\x56\x37\x63\xad\xdd\xdb\x86\x42\xc5\x3f\xcb\x6d\xba\xf9\xa7\x1f\xd6\x8f\x2a\x9d\xb5\xf2\x16\x37\xf7\x30\x59\xdb\x74\x53\xf1\x16\x5b\xc7\x35\x6c\xd2\x7a\x16\xd5\x9e\xa4\x2d\xe6\x98\x92\x4b\x4a\xb0\xef\x81\xb0\x56\xa7\x92\xac\xfc\x86\x68\xa7\x29\xdd\xef\x64\x3d\xec\x61\x5b\xf8\xc3\xd6\xfb\xa7\x67\x96\xf1\x36\xed\x37\x07\x8d\x5c\x92\xf1\x3b\x9c\x81\xca\x94\xc0\x1a\x4c\xf8\xeb\xbe\x85\x5c\x0c\x30\xb7\x9b\x01\x01\xb6\xe2\xda\xe6\xd9\x90\x7f\x97\x6e\x68\xe9\x46\x82\x8f\x59\x23\x9e\x84\x36\xf9\x66\x42\x2a\x1b\xfc\xe7\x1e\x08\xb8\xc6\x89\x77\xb5\xc9\x83\x8f\x81\x0b\x6e\x6c\xd0\xab\x1b\x22\x8e\x6b\x9c\x70\xa3\xe0\x77\x6f\xb1\xdc\xad\x89\xc3\x3f\xdb\xb0\x69\xf3\xf4\x69\xa1\x5b\xf6\x88\x9b\xde\xa2\xdb\xf6\xf4\xeb\x9f\x6b\x5c\x69\x79\x2d\x7a\xe6\x4c\x12\xa6\x49\xc6\x07\x23\x89\xf5\x57\xc4\xb1\x28\xcb\x5c\x22\xfb\xf3\x5b\x4e\xb3\xd2\x0b\x58\xf5\x44\xe8\xdd\x6b\x5f\xaf\xeb\x80\x86\x27\xc8\x7d\xeb\x89\x8f\x38\x7d\x2c\x4b\xef\xdf\x5a\x64\xc6\x8d\x91\x9f\x9f\x44\x2e\x9b\x50\x9b\x65\x3d\x7b\xa6\x7a\xf0\x52\x3b\xfa\xdf\x13\xf2\x84\x6d\x0f\x1e\x6b\xb4\x2f\xb5\xe3\x9f\x09\x3c\x73\x9e\xd6\x9f\x6f\x28\xd9\xde\x01\x80\xfc\x7a\xef\x05\x9e\x13\xe5\x65\x0a\x6d\xbf\x1d\x33\xb2\x09\x9c\x79\xb3\xa5\x66\x5c\x69\xe1\x4c\x91\x71\x18\xc0\xc0\x51\x3c\x6e\x1b\x86\x28\x2a\xcb\x41\x1e\xa5\x55\x9f\x6d\x80\x85\x63\x78\xe8\xd1\x38\x6d\xf8\xad\x18\x6e\xf9\x50\xcf\x38\xd6\xf0\x7c\x69\xe7\xb1\xb8\x61\x93\x4e\xaa\x51\x5e\x1b\x6f\x3d\xb8\x1d\xcb\x74\xec\xad\xee\x01\xfa\xd0\x60\x69\x90\x14\x96\xb0\x24\xaa\xe8\xcd\x08\x0d\x19\xbb\x32\x8e\xe7\x03\x93\xb9\x48\x31\x83\x8c\x4d\x4b\x1f\x64\x13\x0e\x47\x32\x85\x02\xcd\x08\xa1\x24\x4d\xb2\x1b\xf6\xb7\x13\xec\xfe\xd9\x5a\xbc\xb7\x27\xdc\x8a\xdc\x58\x45\x3e\x25\x5b\xf7\x2f\xd2\x8e\x6c\x57\x77\xda\xb1\xd3\x8e\x33\x4f\xa7\x1d\xeb\xa7\xd3\x8e\x6b\x9e\x4e\x3b\x76\xda\xf1\xbd\x6b\x47\xef\xcb\xee\xe0\x3c\xff\xdb\x87\x38\x66\xbd\x65\xd6\xb4\x31\x4d\x37\xed\x36\x93\xbe\xb9\x08\x02\xe7\x92\x5d\x6d\xe9\x93\x24\x46\xa8\x11\xc2\xa3\xfe\xa3\x87\x0f\xb7\x71\xaa\x03\x22\x37\xea\x31\x0c\x99\x1e\xa9\xdc\x97\x5f\xac\xec\xb1\x2c\xfe\xf6\x0e\xa2\xa6\x81\xc6\xeb\x40\xde\x94\xed\xb0\x24\xf0\xc9\xd2\x49\x69\x07\x05\x3a\x10\x6e\x2a\x54\x24\x0b\xec\xd5\xa9\x02\x26\xf8\x90\xa5\x8c\x11\xd8\x0c\xb4\x0a\x71\x3c\x02\x7e\xb2\xdb\x0a\x52\x14\x3e\xa5\x36\xc0\x7a\x15\xba\xa0\x59\xa5\x72\x91\x5d\x68\x09\x18\xa1\x02\x07\x98\x8c\x12\xc8\x2a\xee\x26\x54\x48\x9b\x1e\xfa\xd5\xda\x89\x75\x58\x70\x24\x57\x1b\xfe\x1f\x2d\xdb\x99\x09\x35\xc6\x1b\x54\xae\x12\x79\x3e\x01\xbc\x91\xa9\xab\xf7\xc7\x59\x5b\xe9\x7c\xb0\x7d\xb3\x10\xe1\x46\xa6\xc3\xe6\xe6\x42\x7f\x8e\x82\xed\x9a\x3e\xdb\x68\xfb\xb9\xb1\x37\xe1\xc9\x19\x5d\xe8\x77\x92\x2c\x35\x56\x1d\x8d\xeb\x63\xe0\xfc\x27\x13\xd7\xab\xd7\xeb\x43\xae\xb0\xb5\x24\xdb\x42\x7a\xcd\x9a\xa5\x55\x9e\x13\x61\xf8\x28\xec\xfc\x06\x16\x44\x47\xfd\x96\xa6\x88\xd9\x07\xde\x7d\x88\xf9\xe4\xe5\x63\x82\x0a\xb5\xb9\xd4\xa5\xce\xf5\x68\xd2\x86\xb4\x2f\x2f\x92\x45\x19\x83\xe3\x02\x6c\x35\x08\x46\x03\x91\xdf\xcb\x19\xd4\x74\x91\xbf\x2e\xf2\xd7\xf9\x36\x73\x4f\xe7\xdb\xd4\x4f\xe7\xdb\xac\x79\x3a\xdf\xa6\xf3\x6d\xba\xc8\x1f\x74\xda\x71\x05\x4c\x3a\xed\x08\x9d\x76\x5c\xba\xaf\x4e\x3b\xae\x04\x4f\xa7\x1d\x3b\xed\xb8\xe8\x29\x75\x76\x8f\x42\xc7\x52\x67\x2b\xea\x1c\x7d\xd4\x27\xd5\xfd\x5c\xa7\xc2\x85\xba\x7c\xea\x12\xe2\x7c\x56\x14\x3e\x10\xd5\x83\xdf\xb4\x42\x5f\xbc\x46\xb8\xe1\x70\x92\x76\x63\x34\xd4\xfc\xc0\x1e\xae\x2c\x6c\xea\xea\x24\xbb\x3a\xc9\x8f\xbe\x4e\x72\x2c\xac\xc7\xab\x17\x4a\xcb\xcb\x26\x5b\x0c\x79\x89\xa6\xf8\x44\xab\x26\x89\x5c\x02\xba\xf9\xc4\x53\x83\x52\xbf\xf3\x2c\xe4\x0b\x30\x3b\x9f\xde\x6f\xb0\x97\x79\x53\x22\xcb\x30\x83\x12\x4d\xdf\x93\x88\x86\xa1\x54\xd9\x82\xbd\x46\xf8\x7c\xd0\xea\xc7\xe9\x7d\x7c\xc0\x12\xc8\xe9\x85\xec\x10\x73\x6d\x07\x8e\xa7\x24\xfc\x47\x51\x10\xb9\xad\x55\xdf\x07\x17\x82\xbc\x3f\x6c\x68\xd7\x6f\x6f\x9a\xb3\x41\x1d\x43\xc2\xbb\xfb\x95\x6c\x96\xff\x5a\xa1\x99\xf0\xf9\x8f\xc6\x60\xad\xcf\xd6\x85\x1c\x99\xb4\x90\x0a\xeb\x35\xc5\xb6\xae\xe5\x96\x6e\xd4\x6e\x7e\xca\xee\x91\x68\x98\x85\xcb\xec\x50\xde\x27\x8d\x3e\xb8\x87\xd9\x42\x27\x7c\x41\x16\xa0\x89\xfe\x6f\xb5\x9e\x5d\x4d\xb7\x9d\x0c\xb7\x85\x44\xf1\x11\x3b\xe7\xb0\xbb\x83\x0e\x3b\x3b\xe9\xb0\x93\xa3\x0e\xbb\x3a\xeb\x70\x0f\x87\x1d\x76\x73\xda\x61\x96\x14\x08\x43\xc1\xca\x7a\x3f\xfe\x3b\xdc\xc7\x45\x85\x7b\xf8\xf1\x30\xbb\xd5\x9a\x4c\xcd\xfb\x72\xea\x99\xd6\xa7\xfc\xfa\xbf\x1a\x58\xbb\xf9\xf4\x30\x0b\xaa\xe0\x0c\x4b\x76\x68\x3f\x11\x0f\xff\x2f\x71\xb7\xe1\x5e\x2e\x37\xec\xee\x76\xc3\xee\x94\xc1\xaa\xee\x39\xa7\x53\xef\xab\x30\xfd\x28\x5e\x45\xf0\x19\xdc\x21\xfc\x4e\x9a\x80\xf1\xf2\x27\x94\x42\x1a\x4b\xf6\x5d\x88\x99\xb4\xbf\x05\xef\xbc\x3d\x4c\xe1\x8f\x10\x93\xa8\xbe\x11\x39\xe9\x1e\x5f\xc7\x11\xfc\x22\x1a\x7d\x56\x4d\xf7\xe0\x76\x4c\xde\x26\x49\xa9\xfa\xbc\xf3\xde\x35\x4e\xf6\x7a\x73\x84\xb4\x77\xa6\xf6\xbc\x8e\x9a\x23\x9d\x5a\xa1\x69\x95\x4f\x60\x8f\xbf\xed\xbd\x6b\xcd\xbe\x83\xe2\x6a\x5f\xa1\xb2\xab\x5e\xd8\x81\x4a\x54\xbc\xd6\xe5\xdd\x1b\x9b\x5e\x8b\xf8\xc4\x46\x9c\xc5\x36\x0a\x86\x4b\x2d\x5a\xca\xa5\xae\x1a\x61\x1a\xe3\xf7\x59\x74\x7e\x2b\x15\x6e\xba\x88\x67\xce\xc3\x60\x5e\x49\xcd\x97\x34\x05\xc4\x6b\x85\x96\x0d\x3b\xac\x43\x44\xad\xce\xdc\x36\xf1\xe5\x20\x8d\xb6\x53\xd9\x6c\x81\x48\xd3\x83\x6d\xc4\x02\x85\xb2\xb0\x17\x63\x4f\xfb\xb6\x69\xb1\x97\x34\xa7\xfb\xea\x11\x0f\x7e\xff\xf3\x70\xea\x44\x5f\x33\x60\x67\x69\x77\x96\x76\x67\x69\x6f\xd1\xab\xb3\xb4\x97\x3f\x9d\xa5\xbd\xc5\xd3\x59\xda\x9d\xa5\xbd\x6a\xe2\xce\xd2\xee\x2c\xed\xf5\x93\xef\x66\x69\xef\x5a\x27\xd4\xb6\x7b\x43\x72\xce\x5f\x64\x26\x9c\x4c\x9b\x1a\xa2\xd8\xca\xff\xf5\x6e\xed\xed\xb6\x2d\xbd\xd8\xda\x6e\x5b\xe4\x73\xbe\x45\xb2\xc6\xb4\xae\x8d\xef\xb9\x9e\xab\xad\xee\x8f\xab\x16\x6a\x07\xda\x68\x25\x14\x76\x24\x8e\xcb\x98\x0a\x0f\x17\xff\x0d\xb0\xc9\x93\x67\x70\x10\x33\x2e\x87\x04\x7c\xa5\xdd\xf4\x47\xe5\x64\xbf\x69\x51\xe7\x60\x38\xbd\x38\x75\xde\x66\x2a\x2d\x51\x67\xdd\xeb\x4c\x71\x83\x4f\x12\x21\x68\xa6\xd6\x20\x6d\xb8\xde\x90\xab\x25\x4c\xa5\x14\x8d\xaa\x55\x4c\x1f\x7b\x99\xe3\xef\xe3\x0b\x94\xe7\x8d\x25\x5e\x0f\x5b\x4c\x0d\x94\x5a\xf9\x4e\xe1\xfc\x15\x88\xa1\x94\x5f\xab\x90\x11\xa5\x37\x31\xeb\x1b\x89\x92\x77\x24\xeb\xd9\x13\x78\xc2\x74\xd8\x1e\x58\x5a\x86\x8f\xc8\x73\x7d\xbb\x8d\x48\xfa\xab\x8e\x45\xdd\x6e\x7d\x2c\x6a\x26\x7f\xd7\x9d\x8a\xfa\x2f\x39\x15\xc5\x1f\x3d\x0b\xbd\xf3\xe3\x51\xf0\xef\x70\x01\xa1\x41\x06\x55\x51\xe5\x4e\x96\x4d\xad\x94\xf5\x53\xe5\xde\xca\x1c\x86\xca\x93\x69\xba\xa4\xd9\x44\x3a\x9e\xa5\x4f\x1e\x8f\x6b\xab\x2c\x33\x6d\xa8\xee\x10\x79\x1e\xce\x14\x45\x93\xd4\x97\xb0\xc8\x0f\x5d\x99\xf0\x38\xdc\xd9\x5a\x7b\x33\x2c\x64\x0e\x48\x16\xe6\x84\x50\x92\x6a\x2b\x84\xa8\x77\x8a\x6e\x30\xaa\xde\x91\xbc\x41\xd5\x48\xd2\x03\x7b\x78\x18\x75\xf8\x3b\x95\xf0\xef\x45\x42\x7f\xd3\x92\xa4\xdf\x6d\x22\xa3\x79\x43\xb5\x94\x6e\xc0\xd7\xc8\xe8\x0f\x59\x82\xb1\x4d\x9e\x7f\xbb\x18\xc3\x0e\xf9\xfd\xbf\x30\xb7\xff\xe9\x9c\x2c\xfb\xc0\x11\xc6\x0f\x51\x5b\xff\xd1\x47\x15\xbb\xe2\xfa\xe6\xb9\x6f\x71\xfd\x7b\x8f\x1c\x7e\xd8\x1a\xfb\x4f\x20\x5a\xf8\x21\x6b\xec\xbb\x08\xe1\x4a\xa4\x7c\x6c\xa5\xef\xd3\xcf\x4e\x11\xc1\x2e\x1a\xb8\xb3\x16\xde\x52\xe1\xdc\x37\x0a\xb8\x25\x45\xec\x98\x67\xef\x72\xec\x7f\x4d\x8e\xbd\xb3\x78\x37\x7c\x3a\x8b\x77\x29\x50\x3a\x8b\x17\x3a\x8b\x77\xdd\xf6\x3a\x8b\x77\x25\x78\x3a\x8b\x77\x25\x52\x3a\x8b\xb7\xb3\x78\xe1\x53\xb3\x78\x77\xb9\xa5\xab\xcb\x75\xdf\x2b\xd7\xbd\xad\xb4\xd8\x4a\x46\x6c\x49\x07\x5b\xe7\xb6\xbb\xbc\xf6\xc7\x92\xd7\xde\xf8\xc0\xbf\x72\xf2\xbe\x87\xfe\xdb\xb8\x5a\x76\xf2\x5f\xdc\x68\x99\x41\x59\xb9\x70\x9e\xba\x3b\xfd\xff\x2e\x4e\xff\x4f\x41\xbe\xbb\x02\x60\xa3\x2b\x00\x96\xc1\xac\xbb\x07\xa0\xbb\x07\xe0\x1d\x27\xa1\xbb\x7b\x00\xba\x7b\x00\xba\x7b\x00\xe2\xd3\x9d\x4e\x82\xee\x74\xd2\x46\x4f\x77\x3a\x69\xf9\xd3\x9d\x4e\xfa\x68\xa3\xaf\xd0\x9d\x4e\xfa\xb8\x23\xb1\xd0\x9d\x4e\xea\xa2\xb3\x1b\x22\xea\x13\x3c\x9d\xd4\xdd\x03\xf0\xb1\xd6\x28\x40\x67\x69\x77\x96\x76\x67\x69\x77\x96\xf6\xea\xa7\xb3\xb4\xb7\x78\x3a\x4b\xbb\xb3\xb4\x57\x4d\xdc\x59\xda\x9d\xa5\xbd\x7e\xf2\xee\x1e\x80\x4f\xa8\x36\x02\xba\x7b\x00\xba\x7a\x89\xee\x1e\x80\xff\xde\x7b\x00\xa6\x72\xf7\x1f\xee\x32\x80\xed\x97\xd1\xdd\x08\xd0\xdd\x08\xd0\xdd\x08\xd0\xdd\x08\x10\x9f\xee\x46\x00\xff\x7c\x4c\xb1\xc6\xee\x7c\xd4\x52\xa0\x74\xe7\xa3\xa0\x3b\x1f\xb5\x6e\x7b\x9f\x40\xdc\xb0\x3b\x1f\xf5\x11\xc6\x0a\xbb\xf3\x51\x5d\x5c\x70\x16\x39\x9f\xc8\xf9\xa8\xee\x46\x80\x8f\x31\xdb\xde\x59\xbc\x1b\x3e\x9d\xc5\xbb\x14\x28\x9d\xc5\x0b\x9d\xc5\xbb\x6e\x7b\x9d\xc5\xbb\x12\x3c\x9d\xc5\xbb\x12\x29\x9d\xc5\xdb\x59\xbc\xf0\xa9\x59\xbc\xdd\x8d\x00\xdd\x8d\x00\xdd\x8d\x00\x9f\x62\x86\x7b\x2d\xa6\x0b\x2c\xb4\x99\x5c\x0a\x33\xc2\xa5\x59\xed\x29\x74\xee\xbd\x68\xf5\x20\x09\x39\x94\xa3\xca\x04\x03\xfc\x6f\xcf\x5e\xbd\x78\xf2\xe2\xf9\xd9\x8b\xb3\xcb\x00\xaf\xa1\xf6\x2e\xee\xe8\xf5\xf9\x29\xa4\xc2\x89\x5c\x8f\xe0\x5c\x67\x41\xe9\x7a\xeb\x5f\x0f\x5d\x58\x08\xe4\xb2\x90\xae\xee\x65\xd1\xdc\xa0\xe9\x05\xb8\x71\xf2\xbb\x52\x4e\x16\xe8\x53\xb7\xc2\x39\x62\x4d\x92\x03\x05\xa2\xe3\x73\xee\x85\xb8\x46\x02\x14\x8c\x2a\x61\x84\x72\x18\x51\x21\x9d\xef\x94\x69\xb0\x3a\x98\x0f\x32\xf8\x18\xb4\x0e\x8b\xc1\x52\x38\x8f\x99\xe1\xb1\xb8\xf1\x07\xaa\x87\x9a\x60\x4e\x44\x51\xe8\x4c\x0e\x65\xea\x8d\x3c\x28\x44\x56\x67\xfd\x82\xae\x40\x53\x13\x50\xb3\x81\x63\xe8\xcf\x81\x07\xd5\x8d\x34\x5a\xb1\x06\xbb\x11\x46\x8a\x41\x1e\x76\x35\xf0\x01\x01\x1e\xb7\x59\xa0\x82\xc1\x84\xfc\x1c\x3f\x52\x80\x56\x38\xf9\xbe\xa2\xdf\x54\x73\x0f\xdc\x99\xc6\x5f\x3c\x7c\xf8\x3f\xeb\xe3\xec\xbe\xd3\x95\xf2\xd8\xf1\x12\xb3\xe1\x5b\xea\x21\x87\x20\xdd\x3e\x71\x8c\x25\xcf\x87\x46\x30\x98\x55\x69\x84\x94\x76\xa5\x91\x5e\x2b\x8b\x1a\xe1\x1e\x0c\xc4\x5d\x45\x45\x0c\x40\x02\xc1\x5a\x39\xc8\xb1\x47\x6c\x2f\xdb\x6d\x07\x48\xc0\xe3\x1e\xcc\x9a\x37\x48\x2b\x27\x72\xf3\x12\x17\x91\x78\x5f\xf3\x59\x77\xe1\xf9\x3c\xc3\xa1\xa8\x72\xcf\x1a\x1e\x37\x8c\xdf\x89\xae\x48\x14\x64\x78\x07\xb2\x10\x23\x7f\xf6\x5e\xc0\x50\xe6\xd8\x8f\x39\xf4\x54\xa4\x63\xec\x41\x86\xa4\x5b\xa4\x42\x10\x30\xd2\x3a\x23\x15\x63\xf4\x9d\x2c\x78\xb4\x40\x8f\x35\x7c\x06\x13\xc8\x74\x35\xc8\x6b\x2c\xcb\xdf\x6a\xc9\x50\x8a\xf4\x9a\xe6\xe2\x81\x41\x38\x38\x72\x45\x79\xc4\xbf\xc2\x7f\x43\x0b\x9b\xfc\x62\xb5\x8a\xa2\xaa\xb5\xcc\x64\x06\xfe\xd2\xc2\x00\xad\xeb\xe3\x70\xa8\x8d\xfb\x27\x41\xab\x52\x4c\xad\x4a\xd7\x5b\x8f\x48\xad\x2c\x7a\x1d\xa7\x34\x13\xf2\x14\xe6\xb5\x59\xc0\xa1\x2d\x72\x48\xf6\x96\x48\x80\x92\x38\xcd\xa8\x63\xf8\xbf\x07\x57\x9f\xff\xd1\x3f\xfc\xfe\xe0\xe0\xcd\xc3\xfe\xd7\x6f\x3f\x3f\xb8\x4a\xf8\x8f\xcf\x0e\xbf\x3f\xfc\x23\xfe\xf8\xfc\xf0\xf0\xe0\xe0\xcd\x0f\x2f\x9e\x5d\x9e\x3f\x79\x2b\x0f\xff\x78\xa3\xaa\xe2\xda\xff\xfa\xe3\xe0\x0d\x3e\x79\xbb\xe1\x20\x87\x87\xdf\xff\x6d\xc9\x82\x84\x9a\xbc\x1a\x2e\x57\x46\xfd\x0d\x6b\x5e\xfa\x9b\xa8\xc2\xbb\xfe\x75\x35\x40\xa3\xd0\xa1\xed\x4b\xe5\xfa\xda\xf4\x7d\x87\x63\x70\xa6\xc2\x85\xdd\x48\xe2\xaf\x0b\x14\x4e\xc9\xd5\x97\xad\x0e\x33\x41\x91\x70\x53\x44\xf0\x59\x68\xca\x5a\x40\x92\x5e\xe5\xeb\x10\x5c\xa3\xaf\x12\xb8\x58\xd0\x93\xd5\x52\x68\xb1\x6f\xbd\x02\xb3\xb3\xe3\xcc\xd4\xc1\x78\xc1\xc9\x63\x2e\xd9\xc2\x06\x66\xec\x76\x46\xeb\x5a\x7c\x94\x46\x6a\x23\xdd\xe4\x34\x17\xd6\xbe\x14\x05\x6e\x04\xdd\xb3\x61\x63\x0c\xf4\x88\xd9\x48\x86\x07\xa5\xe5\x0d\xb4\x38\x2e\x4b\x0e\xd2\xb3\xad\xf6\x11\x42\xb1\x4d\xcd\x33\x91\xfb\xb4\x81\xdf\xd0\xe8\x70\xd1\x87\x41\xaf\xab\xe3\xe7\xd5\xc0\x5b\xb1\x57\x8b\x69\xc5\x7b\xd5\xca\xe1\x9d\x3b\x65\x65\xbb\x99\x96\xbe\x58\xd4\x15\x52\xa1\x68\xd9\x7c\xd1\xcb\x10\x7e\xce\x71\x24\xd2\xc9\xcf\xb4\xfc\x9f\x0d\xd2\x42\xc8\x16\xf9\xd9\x1b\xdb\xa7\x5e\x1e\x5f\x70\x25\xc2\x7e\xb8\xb9\xc7\x02\x4a\xbe\x98\x47\xaa\x5f\xbc\xe1\x52\xdb\x64\x86\xeb\xdb\x4a\x9d\x25\x04\xb9\x64\x66\xed\x2c\x93\xea\x8f\xb5\xb2\x7c\xf3\xd9\xdb\xb9\x96\xc1\x05\x23\x27\x8f\xd4\x6e\x9b\x3e\x4d\xc5\x02\x93\x04\x5b\xdc\x20\x9c\x64\x85\x64\xaf\x0f\x0e\xce\x2f\x4e\x0e\xa7\x76\x42\xfa\xda\xab\x98\x4c\xa3\x55\xfb\xce\x2b\xbd\x31\xda\xc6\xd3\x63\xb5\xc1\x85\x16\x9e\x5b\xb8\xd2\x22\xce\x49\x00\x63\xe7\x6f\x80\xf5\xe4\x17\x27\xf0\xf3\x40\x58\xcc\xa5\x42\x0f\xbb\xd2\xc8\x1b\x99\xe3\x88\x66\x6c\xc5\xad\xe1\xb4\x32\x06\x95\xcb\x27\xf1\x06\x98\xc5\x58\x91\x96\x04\xfa\x34\xb9\x45\xca\xaa\xad\xce\x1a\x59\xd4\xda\x62\x96\xc0\x05\xf7\x98\xf8\x10\x45\x68\xc7\xb8\x61\xbd\xb8\x0c\xb9\x60\xd0\xd2\xc0\x52\xf9\x5e\x32\xf3\x2a\x0e\x8d\x21\x97\x87\xab\xc2\x2a\xcb\x06\x70\x9e\xa1\xa9\xd5\x32\xab\x26\x1b\x4d\xb1\x94\x4d\x82\x50\x3a\x17\x00\xb3\x00\xf0\xcb\xf7\x3c\x6d\x54\x38\x5d\xaf\x97\xb5\xdf\x19\x2d\x6e\x58\xb9\xca\x20\xe9\x7f\xc6\x2e\xf3\x5c\x1b\x34\x33\x76\x4c\x7b\xfa\x5e\xbd\xec\x42\xc8\x40\x6a\x36\xce\x69\x70\x50\xc9\x9c\xbd\x40\x59\xef\xcf\x7a\x42\x16\xf5\x74\x7a\x08\xba\x2c\xc2\xf5\x4b\x55\x59\x6a\xe3\x1a\xdf\x20\x6d\xf3\x46\xb0\xdd\x17\x00\x80\x96\x55\x1a\x2c\x85\xa9\x25\xb6\x45\x48\xc7\x42\x91\xfa\xa7\x8d\xbe\xd0\x5c\x2a\xe7\xeb\x2d\x69\x5a\x31\xd0\x95\x63\x1a\x0b\xbc\x3a\xd4\x95\xca\x80\x84\xca\x31\x8c\x9d\x2b\xed\xf1\xd1\x51\xa3\x8f\x12\xa9\x8f\x32\x9d\xda\xa3\x54\xab\x14\x4b\x67\x8f\x22\x37\x1d\x95\x3a\xeb\xc7\x1f\x7d\x11\x99\xe4\x68\x7f\x99\x8e\xdf\x40\x13\x06\xc8\x1f\x83\xc7\xd5\x92\x56\xa8\xaa\x15\x97\xcd\xf4\x57\x77\xa6\x06\x0d\x18\x17\x36\x72\x3a\xe7\xab\x99\x56\x64\x60\xa6\x1d\xd0\xa6\x7d\x7d\x45\x52\x6d\x98\xb6\xa4\xdb\xbe\x6d\x0f\xbd\x5a\x68\xaf\x72\xcc\xd7\xb8\xe2\x73\xd7\x23\xb1\x6c\x23\x73\xaf\x59\x28\x1b\x00\xce\x09\xbe\x20\x89\x0c\x7a\xff\x85\xc4\x95\x9a\x00\xd1\xb3\x0b\xb7\x65\xb5\xae\x8f\x72\x86\xeb\x37\xbf\xa9\xa3\x69\x3d\x1c\x0e\x31\x75\xdf\x05\x7e\xae\xe3\x6a\xcc\xdc\x31\x02\xf6\x4d\xfc\xeb\xbb\xe5\x1e\xe5\x46\xc1\xaa\xcd\xd2\x0d\x7e\x49\xab\xc3\x08\x53\x10\x7a\xc2\x1d\x66\x54\xb6\x87\x80\x1f\x8b\xbd\x3f\x0e\xc8\x06\x9f\xd9\x07\x5f\x82\xbd\x43\x32\xa3\xd5\xd8\x06\x09\xd7\x92\xb6\xc1\x9f\x6e\x22\x7f\x08\x2f\x75\x28\x64\xc6\x1e\x9c\xf3\xdd\x52\xcd\x1b\x56\x64\x2f\xb5\x2f\x69\x5e\x6a\x17\xb5\xe1\xb6\x36\xce\xb2\x36\xe1\x32\x05\x90\x1f\x9a\xf4\x8a\xdf\xd9\x54\x7a\xa5\xa1\xe0\xa9\xe8\xd9\x2a\xc8\x5c\xe3\xa4\x09\xc9\x87\xe4\x0d\x47\xbc\x7a\x0d\x95\x44\xe3\xd3\x47\xd8\xff\x19\x6a\x12\x75\x31\x90\xca\x4f\xe6\x87\x8e\xa8\xe0\xd1\x23\x40\x55\xc6\x3f\x79\x9a\x77\x01\xae\xcd\xb2\x38\x53\x30\x7b\xb5\x45\xce\xa6\x8e\x02\x2f\xce\xd6\xb4\x52\x34\x4f\x7e\xad\x44\x9e\xc0\x63\x2f\x15\x79\xf7\xe1\x55\x68\x34\x17\xb5\xbe\x95\x79\x96\x0a\x93\xb1\x36\xf0\x3c\x0a\x56\x7b\xec\x89\xda\xe0\x88\xdc\xde\xe0\xc8\xdf\x9d\x06\xa5\x30\x4e\xa6\x55\x2e\x58\x6d\xe1\x48\x9b\xc9\x3b\x81\x68\x43\x34\x17\x98\x6a\x95\xad\x09\x24\x2e\x91\xae\xa1\x6f\x1b\xc6\x6c\x46\xa1\x91\xa1\x44\x58\x16\x38\x4b\xa4\x07\xd3\xce\x8d\x1e\x46\xae\xae\x59\xac\xe7\xad\x9a\x5b\xc9\x66\x59\xdb\x2b\x96\xfe\x8c\xc1\x61\x4b\x3c\xd6\x5c\x91\xc0\xbf\x26\x51\x5f\xf5\x40\xba\x18\x3d\x63\xbf\x39\xcc\x19\x48\x36\x00\xbb\x61\xa8\xa1\x36\x78\x83\x06\x0e\x32\xcd\x7d\xb8\x8c\xfe\x30\x81\xff\x90\x89\xef\x63\x10\x23\x5f\xf1\x1d\x48\x3c\x5a\x22\x8e\x2f\x3b\xe4\x28\xe2\x43\x38\xf0\xd5\xf7\xb2\x28\x30\x93\xc2\x61\x3e\x39\xf4\x05\x18\xb1\x7e\x7f\x13\xd4\x6d\x72\x68\xa3\x75\x58\xe3\xab\xbf\xaf\x68\xc9\x8b\xdd\x02\xb3\x3f\xc5\xc8\x58\x03\x19\x6f\x65\xce\xa0\xb0\xd6\x41\x7a\x45\x52\xae\x95\x84\x6b\xd9\x7e\x51\xcc\xd4\x08\xfe\x85\xe8\x40\x80\xc1\x11\x53\xb9\xa7\xdc\x7b\xd0\xb8\x4c\x17\x1f\x3a\x59\xa3\xd1\x56\xe7\xf5\xfb\x40\xe6\xff\x57\x7f\xcf\x84\x13\x4b\x1a\x78\x9c\x4f\xca\x45\xc1\x81\x75\x8a\xb2\x19\x7c\x19\xb2\x36\x88\xea\x86\xe9\x77\x1a\x81\x4d\xfd\x45\x3d\xa7\x5d\x6a\x0e\xa9\xf9\x3c\x6f\xc4\x77\xdf\xe0\x48\x5a\x67\x26\xad\x70\xa8\x0f\xbd\x39\x0d\x52\x59\x27\x94\x93\x2c\xd9\x20\xb6\xec\x87\xd8\x20\x99\xdf\x09\xbc\x22\x5f\x8b\x63\x58\xb7\xa4\xa6\xbd\x81\x7d\x39\x29\x11\xbe\x6d\xfd\x78\x66\xca\x94\x69\x2d\x08\x1a\x4f\x5c\x22\xcb\x0c\xda\x79\xf9\xb0\x88\x7c\x56\xee\x3f\xba\xf9\x6b\x41\xb0\x7f\x1e\x03\x02\x21\xb7\x64\xad\x1c\x91\x95\x19\x4f\x7b\xc5\xd8\xf0\x94\xb5\xe9\xbd\x02\xee\x28\x7f\x63\x6e\x2a\x6a\x25\x20\x5d\xb4\xfb\x53\xad\x6c\x55\xc4\xa2\x2d\xf2\x7a\x4a\x54\x19\xaa\x74\xc2\xc7\x03\xf2\x1b\x34\x09\xfc\x68\x09\x53\xf0\xbf\xe5\x88\xfc\xbe\x30\x69\xdb\x54\x8a\xa7\x4e\x66\x56\x20\x6d\xeb\xce\x4c\x2e\x43\x23\x1b\x28\x8e\x80\xd9\x4c\x7b\x1b\x53\xe1\xb3\x8b\xa8\x7c\xac\xf5\xb2\x3e\x95\x16\x83\xa0\x11\x2e\x9e\xe1\x69\x4b\x23\xed\x0f\x20\x95\xda\xca\x78\x5a\xa6\x96\xa3\x53\x27\xdb\xf4\xd0\x9f\x3b\xf3\xe3\x4e\x3b\xc2\x5c\x53\x31\xb3\x19\x76\xdc\x2a\xe5\x81\x8f\xed\x28\x4d\x14\x33\x0f\xfd\x50\x8b\xfa\xb9\x78\x11\xf1\xf4\x92\x1b\x99\x6e\x84\xba\xc6\x0c\x72\xbc\x93\xa9\x1e\x19\x51\x8e\x65\xca\x87\xab\x88\x4d\x39\x48\xc6\x47\xaa\x44\x81\xc9\xfe\x52\x42\x5b\x26\xc6\xcb\x6a\x90\x4b\x3b\xc6\x85\xb6\xcc\x4a\x1a\xb5\x98\x1a\x74\x0b\x25\xc8\x14\x89\x5e\xf8\x76\x8d\x52\x8e\x15\x29\x61\x80\x50\x71\xe5\x69\x8e\x19\x8f\x40\x9c\xa6\xc4\x48\x31\xad\xd1\x5c\x78\x5b\xc3\x30\x81\x33\x17\x03\xd3\xd4\xe3\x1a\xb1\xf4\x94\xc6\xa9\x51\x5b\x70\x4c\xc5\x4a\x95\xa2\x3f\x22\xe6\x8f\xda\x21\xc6\x30\xa3\x33\x12\xbd\x19\x84\x1c\xe0\x8f\xb8\x41\xe5\x16\x1b\x35\xab\xfd\xae\x15\x3e\xd7\x6a\x30\xd6\x32\x65\x3d\x24\x1b\x59\x14\x75\x22\xfd\x4d\xa0\xe4\x2f\xdb\x62\xd0\x9f\xe8\xbb\xf0\xa5\x25\xeb\x65\xcd\x8f\x53\xcd\x43\xc2\xd2\xc2\x58\xdf\x86\x91\x66\x99\x36\x44\x6c\x22\x6e\x33\x69\x53\xe2\x74\xcc\xe0\x54\x2b\x1b\x8f\xf5\x09\xe5\x4f\xea\xdd\x88\xdc\x93\x42\x1c\xb8\xd4\x39\xe7\x37\xb2\x2a\xba\x13\xbe\xfa\x0e\x8b\x01\xf2\x75\xbc\x36\x2e\x65\x89\x9a\x5b\xa3\x62\xd7\x69\xc1\xa8\x1f\xce\x75\x9e\xaf\xd6\x62\x2b\xfd\xd2\x4d\xbc\xd2\x08\x80\x8d\xaf\x42\x3f\x8b\x10\x0b\xb1\x38\xa2\xe9\x26\x83\xc4\xa4\x41\xa6\x6e\x0d\xd8\x01\xba\x5b\x44\x05\xe9\x18\xd3\x6b\xdb\xe4\x90\xf9\x62\xec\x19\xac\x85\xf8\xd3\xb4\xc4\xaa\xed\x29\xc2\x0a\x3b\x1a\x16\xd1\xa7\xcd\x14\xde\xb6\x63\x56\x0b\xd4\x0d\xa9\xe8\x1b\x21\x73\x31\xc8\xfd\x71\xd6\xfa\x57\xaf\xbd\x0e\x19\xf5\x79\x59\xe5\x79\x48\x22\x71\xd6\xd6\x19\x31\x1c\xca\x94\xd3\xe4\xd2\xf8\xa8\x6f\x50\x6c\x0b\xb7\xb0\xfe\xb2\xf6\x05\x1c\x61\x9d\x70\xd5\x1c\x8e\x56\x20\x78\x15\x62\xc9\x0f\x91\x4b\x03\x44\x33\x57\x1c\x4f\x39\x2b\xb4\x0c\xf4\xce\xd6\x54\xfc\x3b\x81\x97\xda\x85\x1b\xca\x5f\xa0\x25\xb5\xcb\x00\x7a\x8d\xc2\x6a\xd5\x92\xae\x6c\xfd\x1a\x39\x92\x4a\xe4\x61\x53\xed\xf8\x5e\xed\x7b\x08\x0e\x29\x17\x72\x64\x84\xab\x85\x62\xb3\xee\xa0\x5d\x82\x5e\xf4\x91\xd0\x04\x4e\xd4\x84\xf1\x3d\x44\xe1\x38\xe7\x2e\x95\x33\x3a\xab\x52\x0c\x19\xeb\xca\xb6\x07\x79\xa7\x62\x74\x3a\xbd\x70\x1a\x27\x69\x6a\xa4\x32\x74\x42\x86\x94\x92\x56\x08\xc2\x96\xe4\xc7\x45\x9a\xf4\xa1\xf0\x06\xc0\xac\x2c\x4e\xce\xcf\xe0\x75\x38\xec\x98\x40\xbf\xdf\xf7\x79\x4f\xeb\x4c\x95\xb2\x7e\x21\x16\x52\x59\xd0\x14\x9e\xfa\x78\x93\xa2\x55\x5e\x18\x22\x1f\xde\x04\x2b\x85\x1b\x43\xe2\x01\x9f\xb4\x40\x01\xf0\x94\x74\xcd\x9d\x28\x4a\xa2\xfb\x2b\xe5\xa5\xf7\x53\xad\x2f\x3c\x92\xfc\x9c\xbf\xc3\xd1\xd1\x2c\x4d\xe8\x01\x99\xa8\x21\x80\xc8\xa4\x31\xd4\x7a\xdf\x4e\x6f\x29\xa1\x8e\x3f\x28\x7d\xab\x16\xcd\xce\x73\x09\x83\xc7\x70\xb5\x77\x12\xb9\xef\x6a\xaf\x07\x57\x7b\xe7\x46\x8f\xb8\x6c\x4d\x8d\xae\x42\x1d\xda\xd5\xde\x63\x1c\x19\x91\x61\x76\xb5\x47\xc3\x7e\xce\xf5\x86\x2f\xd0\x8c\xf0\x07\x9c\x7c\xcb\x83\xd5\xaf\xa3\x46\xf8\xd6\x97\x26\xd2\x7b\x52\xc1\xa4\xa7\xbe\x2d\x44\x59\xbf\x78\x21\xca\xba\xf3\x69\x43\x67\x6f\xde\x16\xe8\xc4\xcd\xa3\xa4\xc1\xe8\xcf\xbf\x58\xad\x8e\xaf\xf6\x9a\xf5\xf7\x74\x21\xb9\xd2\x62\x72\xb5\x07\x53\xb3\x1e\x5f\xed\xf1\xbc\xf1\x7d\x5c\xe4\xf1\xd5\x1e\xcd\x44\xaf\x8d\x76\x7a\x50\x0d\x8f\xaf\xf6\xb8\x80\xa1\xf7\xa8\x67\xb0\xec\x91\xc1\xf4\x6d\x33\xc3\xd5\xde\xcf\x84\x93\xa3\xa3\x90\xc2\x08\x97\xbf\xff\xb9\x38\x58\xbd\x56\xee\xaf\xab\xcb\xee\x43\x2e\xac\xbb\x34\x42\x59\x9e\xff\x52\x16\x8b\xd3\xb8\xde\x97\x63\x7e\x5f\xfa\xdd\xb0\x0c\x58\xfa\xd9\x53\xc3\xd2\xcf\x4b\xb4\xe7\x26\x9a\x6b\x7e\x0f\x1b\x46\x9d\xe7\x3b\x36\x05\xdb\x64\xcf\xc5\x38\x4d\x8d\x1f\xd2\x01\xa1\x35\x86\x8b\x04\x88\xc5\x83\x7c\xe3\x72\x4c\xc6\x5b\xa8\xea\x69\x1c\xfc\xdb\x70\xc9\x00\x54\x2a\x43\x93\x73\xb2\xaa\x19\xd5\x67\x42\xb2\x04\x7c\xdc\x40\xd4\x51\x9a\x6b\x62\x24\xd6\x4e\xaa\x15\xbc\xf6\x85\x3f\x71\x44\x92\x1d\xe1\x9e\x05\x3f\x0c\x2b\xba\x34\xc5\xd2\xb1\xa6\xdb\x3d\xc5\x0c\xad\xa0\x0a\x59\x56\x7d\xb7\x9c\x3c\x02\x71\x6c\x08\xf8\xd0\xda\xe7\xf7\xc7\x55\x21\x48\x75\x88\x8c\x6b\x7f\xea\x6f\xde\x7d\xf3\xee\x96\x17\xa9\x3e\x29\xe4\x63\xfc\x11\x0f\x01\xd4\x41\x91\x88\xfa\x40\xcd\x9a\x88\xc9\x46\x9b\x2f\xc4\xdd\x73\x54\x23\x37\x3e\x86\x2f\xbf\xf8\x5f\x5f\xfd\x63\x49\x43\x2f\x18\x31\x7b\x86\x2a\xc4\x82\x36\x04\xc3\x7c\xc7\xd9\xa0\x61\x42\x52\x29\x13\x4e\x24\xa3\xa6\x4d\x1d\xe4\x6e\x28\xe8\x56\x70\xe1\x56\x50\x97\x55\x49\x70\x79\xca\x05\x80\xd6\x09\x95\x62\x8f\x8c\xa4\x85\x83\xc9\x5a\x80\xe7\x13\x78\xf4\x85\xff\x47\x52\x78\xea\x39\xf1\xfd\xe6\xee\x6d\xb2\x60\xc9\xd2\xc2\xd7\xbd\x99\xf5\x48\x0b\x84\x2a\x3d\x64\xc2\xf1\x2e\xa6\x41\xaf\x09\x63\x30\x60\x5e\x13\x62\xbd\xde\x75\x88\x5b\x17\x0f\xdc\x2c\x16\x58\x48\x25\x8b\xaa\x38\x86\x87\x4b\x9a\x78\x91\xb6\x21\x36\x7d\xe3\xc6\x10\x10\x24\xba\x46\x46\x14\x05\x97\xfa\xca\x0c\x95\x93\x43\xc9\x45\x03\x35\x69\xb3\xbb\xef\x3b\xc6\x1a\x94\x1a\x8a\x5c\x9e\x42\x72\xa8\x45\xec\xe7\xde\xce\x31\xac\x81\x43\xf6\x26\x6d\x0b\xa8\x49\x89\x9e\x1b\xbc\x03\x03\x78\x57\x7a\x53\xb5\x95\x86\x28\x50\x28\xa9\x46\xb6\xa9\xe7\x0a\xff\x40\x0e\x7d\xbc\x1d\x63\xc8\x9e\x63\x3b\x17\x94\x92\xb3\x94\xb1\xdf\x24\x9a\x9a\xc2\x8c\xc4\x8f\xb7\xd1\x67\x63\x9a\x64\x39\x16\x98\x9f\x0a\x8b\x91\x1b\xdb\xd5\x5c\xf1\xb6\x96\xfa\xf4\xc1\x3b\x63\xd5\x47\x0f\xbf\x58\x89\xf2\xba\xdd\xf2\x14\x5e\x5d\xe6\xf5\xe6\xa4\xff\x1f\xd1\xff\xed\xed\x41\xf8\xe3\x61\xff\xeb\xff\xd7\x3b\x7e\xfb\x59\xeb\xe7\xdb\xe5\xd5\x59\x8b\x8d\xf9\x25\xe4\x13\x94\x48\xb4\x13\x23\x46\x7b\xb1\x4a\xe5\xd2\x54\xd8\x83\xa7\x22\xb7\xd8\x83\x1f\x15\xab\x86\x7b\x02\x6d\x75\x86\x9a\xb4\xf2\x1e\xcd\xba\x2c\x53\x1e\x9a\xf0\x92\x56\xb7\x09\xcb\x5d\xe5\xbe\x6e\x06\xa4\x18\x6a\x68\x49\x1a\xd5\xa2\x33\x5f\xf2\x3c\xd4\x3a\x09\x16\x6e\x92\xea\xe2\xa8\xfe\xee\x4d\xeb\x17\x42\x4d\xa0\x11\x6b\xde\x28\x9d\xa5\x74\xeb\x48\x36\x89\xd4\x68\x6b\x9b\x7b\x48\x20\x97\xd7\x08\x27\x8d\xdf\x48\xc2\x72\x80\xa9\x60\x5b\xdc\x0c\xa4\x33\xc2\x07\x7d\xa3\x5d\xd9\x44\x94\x86\x55\x0e\x07\xe4\xae\x26\x5c\x48\x36\x27\x5d\xc3\x9d\x46\x62\x20\x73\xfe\xa7\x65\xc8\x95\x4e\xb5\x1a\xe6\x32\xb8\x00\x45\xa9\x8d\x13\xca\xc5\x83\x17\x23\xbc\xf3\xff\x9a\x95\x4f\x3b\x48\x0b\x07\x99\xb2\x8f\x1e\x7d\xf1\xe5\x45\x35\xc8\x74\x21\xa4\x7a\x5a\xb8\xa3\xc3\xef\x0f\x7e\xad\x44\xce\x59\xde\x97\xa2\xc0\xa7\x85\x5b\xfe\xef\x02\x6d\xad\x16\x1f\x7d\xb5\x01\x17\x1d\xbc\xf1\xbc\xf2\xf6\xe0\x4d\x3f\xfc\xf5\x59\x7c\x75\xf8\xfd\xc1\x55\xb2\xf2\xfb\xe1\x67\x47\x5c\x23\x59\xb3\xdc\xdb\x37\xfd\x86\xfd\x92\xb7\x9f\x1d\x7e\xdf\xfa\x76\xb8\x88\x19\xa7\x4a\x17\xc9\x0b\xe8\x17\xa2\xec\x5f\xe3\x64\x09\x73\x2e\x35\x47\xe7\x07\xf2\x10\x2b\x44\xb9\xc8\xfb\x1e\xca\xd1\x0b\x51\xbe\xc6\x21\x1a\x54\xe9\x42\x22\xbf\x67\x06\x86\xfc\x87\x15\x9f\xb8\x02\x6b\x87\xa8\x13\xe9\x1d\x1f\x69\x5b\x65\x4e\x6f\x40\x2d\x9b\xd9\x8f\x6a\x45\xfd\xe2\xda\x49\xea\x7d\xee\x3c\x42\xe4\xef\x9f\x7c\xfc\x68\xe7\x71\x2a\xb9\xd4\xd3\x9a\x8e\x61\x9e\x3d\xf6\xa6\x2f\x8b\x1e\x36\xe7\xc6\x9a\xfc\xbc\x4a\xc9\x5f\x2b\x84\xb3\xc7\xf5\x91\x5f\xa9\xd2\xbc\xe2\x4b\xc6\x7e\xfc\xf1\xec\x31\xf9\xef\xff\x0a\xe2\xe6\x16\x21\xd3\x6a\xdf\xc1\xab\x97\xcf\xff\x0f\x07\x03\xb8\x45\xcf\x2b\xf4\x70\xee\x30\x97\xc2\x87\xc9\x82\x02\x86\x7f\xa1\xaf\x93\xe3\x99\x53\x51\xd6\xf1\x13\x16\x77\x5c\x61\x95\x97\x96\x4f\x0f\x80\xad\x4c\x58\x1d\x0d\xec\x33\xbe\x7c\x3a\x29\xe4\x83\xe3\xc1\x87\x5c\xb8\xe5\xe7\x30\x56\x02\x2d\xd5\x4a\x61\xca\x49\x73\xb2\x02\xdf\x03\x7f\x10\x21\xbf\x0a\x36\x2b\xcf\xb1\x03\x33\x84\x84\xda\xce\x64\x41\x6b\x38\xf5\x3b\x7d\xef\x9c\x34\xb7\xdf\x9d\x66\xf4\xf1\x4c\xce\x6c\xbe\x5e\x13\x7f\x9e\x2b\xe3\x9a\x76\x9d\xa7\xa2\x87\x21\xb6\x5a\x27\x47\xc7\xc2\xc2\x00\x51\x71\x38\xd7\x47\xff\x50\x05\xaa\xc3\x26\x10\x5b\x95\x7d\xa7\xfb\xd9\x62\xe4\xad\x81\xdc\x7a\xa8\xad\xf0\x5c\x67\x4e\xef\x6f\xeb\xa8\xde\x8e\x27\x8b\x60\x60\x9b\xcb\xcc\x6a\x1b\x64\xdb\x8d\x2d\x77\x4c\x66\xa2\xba\xec\x59\x84\xa0\x46\xf0\x33\xe6\x97\x44\xde\xe3\x54\x64\xc3\x69\xce\xe6\x4d\x47\xf6\xb6\x5f\xa3\x47\xf3\x05\x9a\x1b\xb9\x93\xf2\x5b\xc7\x98\xa9\xaf\x33\x39\x79\xff\x6c\x45\xa6\xd7\xce\x93\x70\xe8\x2f\xd5\x6b\xd2\x37\x2b\xeb\xdf\x19\x82\xab\xaa\xfc\xb7\x19\x63\x5b\x65\xe9\xa5\xc9\xd4\x21\x0f\xeb\xb4\xe1\x94\x7b\xfb\x5d\x35\xa8\x0d\xe5\x66\xf4\xe0\x03\xc1\xef\x7f\x3e\xf8\xff\x01\x00\x00\xff\xff\x3e\xcb\x2d\xc0\x3f\xed\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go index c4c7662d37..53bd40ca40 100644 --- a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go +++ b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/catalogsource_types.go @@ -7,6 +7,7 @@ import ( "github.com/sirupsen/logrus" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" ) @@ -145,6 +146,21 @@ type GrpcPodConfig struct { // +kubebuilder:validation:Enum=legacy;restricted // +kubebuilder:default:=legacy SecurityContextConfig SecurityConfig `json:"securityContextConfig,omitempty"` + + // MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, + // which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod + // will have the following modifications made to the container running the server: + // - the $GOMEMLIMIT environment variable will be set to this value in bytes + // - the memory request will be set to this value + // - the memory limit will be set to 200% of this value + // + // This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if + // a catalog being served is very large and needs more than the default allocation. If your index image has a file- + // system cache, determine a good approximation for this value by doubling the size of the package cache at + // /tmp/cache/cache/packages.json in the index image. + // + // This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set. + MemoryTarget *resource.Quantity `json:"memoryTarget,omitempty"` } // UpdateStrategy holds all the different types of catalog source update strategies diff --git a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go index cf01001f5c..b4459a00a4 100644 --- a/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go +++ b/vendor/github.com/operator-framework/api/pkg/operators/v1alpha1/zz_generated.deepcopy.go @@ -733,6 +733,11 @@ func (in *GrpcPodConfig) DeepCopyInto(out *GrpcPodConfig) { *out = new(string) **out = **in } + if in.MemoryTarget != nil { + in, out := &in.MemoryTarget, &out.MemoryTarget + x := (*in).DeepCopy() + *out = &x + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new GrpcPodConfig. From f41c684dac28cf2d753ba3dd34bcd9ea05c0d363 Mon Sep 17 00:00:00 2001 From: Steve Kuznetsov Date: Thu, 3 Aug 2023 13:35:11 -0400 Subject: [PATCH 8/8] OCPBUGS-17157: registry: implement memory targets on gRPC servers (#3004) * go.mod: update operator-framework/api $ GOPROXY=direct go get github.com/operator-framework/api@master $ GOPROXY=direct go mod tidy $ GOPROXY=direct go mod vendor $ make gen-all Signed-off-by: Steve Kuznetsov * registry: implement memory targets on gRPC servers This commit implements the GoDoc on the new CatalogSource field, adding memory requests, limits and $GOMEMLIMIT values for sources that opt into a memory target. Signed-off-by: Steve Kuznetsov --------- Signed-off-by: Steve Kuznetsov Upstream-repository: operator-lifecycle-manager Upstream-commit: 2c3928ec460a9354cb8d840da92d90900075e94d Signed-off-by: Steve Kuznetsov --- go.mod | 2 +- pkg/manifests/csv.yaml | 4 +- .../0000_50_olm_00-catalogsources.crd.yaml | 7 + ..._50_olm_00-clusterserviceversions.crd.yaml | 125 ++++++++++---- .../0000_50_olm_00-subscriptions.crd.yaml | 10 +- staging/operator-lifecycle-manager/go.mod | 19 +- staging/operator-lifecycle-manager/go.sum | 36 ++-- .../registry/reconciler/reconciler.go | 18 ++ .../registry/reconciler/reconciler_test.go | 163 ++++++++++++++++++ .../registry/reconciler/reconciler.go | 18 ++ vendor/modules.txt | 2 +- 11 files changed, 332 insertions(+), 72 deletions(-) diff --git a/go.mod b/go.mod index 95764df905..bd4cd3fa94 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 github.com/onsi/ginkgo/v2 v2.9.5 github.com/openshift/api v3.9.0+incompatible - github.com/operator-framework/api v0.17.7 + github.com/operator-framework/api v0.17.8-0.20230803152844-704ae942c4a9 github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 github.com/operator-framework/operator-registry v1.27.1 github.com/sirupsen/logrus v1.9.2 diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 44b1c4e487..897fbeecef 100644 --- a/pkg/manifests/csv.yaml +++ b/pkg/manifests/csv.yaml @@ -5,7 +5,7 @@ metadata: name: packageserver namespace: openshift-operator-lifecycle-manager labels: - olm.version: 0.0.0-ee4bc498873f18daef46f5b1e443f5abdb9732c9 + olm.version: 0.19.0 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/self-managed-high-availability: "true" @@ -159,7 +159,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.0.0-ee4bc498873f18daef46f5b1e443f5abdb9732c9 + version: 0.19.0 apiservicedefinitions: owned: - group: packages.operators.coreos.com diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml index 321b99467b..f678b426c3 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-catalogsources.crd.yaml @@ -532,6 +532,13 @@ spec: topologyKey: description: This pod should be co-located (affinity) or not co-located (anti-affinity) with the pods matching the labelSelector in the specified namespaces, where co-located is defined as running on a node whose value of the label with key topologyKey matches that of any node on which any of the selected pods is running. Empty topologyKey is not allowed. type: string + memoryTarget: + description: "MemoryTarget configures the $GOMEMLIMIT value for the gRPC catalog Pod. This is a soft memory limit for the server, which the runtime will attempt to meet but makes no guarantees that it will do so. If this value is set, the Pod will have the following modifications made to the container running the server: - the $GOMEMLIMIT environment variable will be set to this value in bytes - the memory request will be set to this value - the memory limit will be set to 200% of this value \n This field should be set if it's desired to reduce the footprint of a catalog server as much as possible, or if a catalog being served is very large and needs more than the default allocation. If your index image has a file- system cache, determine a good approximation for this value by doubling the size of the package cache at /tmp/cache/cache/packages.json in the index image. \n This field is best-effort; if unset, no default will be used and no Pod memory limit or $GOMEMLIMIT value will be set." + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true nodeSelector: description: NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node's labels for the pod to be scheduled on that node. type: object diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml index 77422915c5..e5a35991bd 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -687,7 +687,7 @@ spec: description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. type: string template: - description: Template describes the pods that will be created. + description: Template describes the pods that will be created. The only allowed template.spec.restartPolicy value is "Always". type: object properties: metadata: @@ -1340,7 +1340,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -1405,7 +1405,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -1455,7 +1455,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -1487,7 +1487,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -1591,7 +1591,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -1623,7 +1623,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -1675,12 +1675,29 @@ spec: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 + resizePolicy: + description: Resources resize policy for the container. + type: array + items: + description: ContainerResizePolicy represents resource resize policy for the container. + type: object + required: + - resourceName + - restartPolicy + properties: + resourceName: + description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.' + type: string + restartPolicy: + description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired. + type: string + x-kubernetes-list-type: atomic resources: description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -1704,7 +1721,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ @@ -1817,7 +1834,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -1849,7 +1866,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -2167,7 +2184,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -2232,7 +2249,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -2282,7 +2299,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -2314,7 +2331,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -2418,7 +2435,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -2450,7 +2467,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -2502,12 +2519,29 @@ spec: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 + resizePolicy: + description: Resources resize policy for the container. + type: array + items: + description: ContainerResizePolicy represents resource resize policy for the container. + type: object + required: + - resourceName + - restartPolicy + properties: + resourceName: + description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.' + type: string + restartPolicy: + description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired. + type: string + x-kubernetes-list-type: atomic resources: description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -2531,7 +2565,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ @@ -2644,7 +2678,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -2676,7 +2710,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3005,7 +3039,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3070,7 +3104,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3120,7 +3154,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -3152,7 +3186,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3256,7 +3290,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -3288,7 +3322,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3340,12 +3374,29 @@ spec: description: 'Number of seconds after which the probe times out. Defaults to 1 second. Minimum value is 1. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' type: integer format: int32 + resizePolicy: + description: Resources resize policy for the container. + type: array + items: + description: ContainerResizePolicy represents resource resize policy for the container. + type: object + required: + - resourceName + - restartPolicy + properties: + resourceName: + description: 'Name of the resource to which this resource resize policy applies. Supported values: cpu, memory.' + type: string + restartPolicy: + description: Restart policy to apply when specified resource is resized. If not specified, it defaults to NotRequired. + type: string + x-kubernetes-list-type: atomic resources: description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -3369,7 +3420,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ @@ -3482,7 +3533,7 @@ spec: type: integer format: int32 grpc: - description: GRPC specifies an action involving a GRPC port. This is a beta field and requires enabling GRPCContainerProbe feature gate. + description: GRPC specifies an action involving a GRPC port. type: object required: - port @@ -3514,7 +3565,7 @@ spec: - value properties: name: - description: The header field name + description: The header field name. This will be canonicalized upon output, so case-variant names will be understood as the same header. type: string value: description: The header field value @@ -3703,7 +3754,7 @@ spec: - name x-kubernetes-list-type: map restartPolicy: - description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' + description: 'Restart policy for all containers within the pod. One of Always, OnFailure, Never. In some contexts, only a subset of those values may be permitted. Default to Always. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy' type: string runtimeClassName: description: 'RuntimeClassName refers to a RuntimeClass object in the node.k8s.io group, which should be used to run this pod. If no RuntimeClass resource matches the named class, the pod will not be run. If unset or empty, the "legacy" RuntimeClass will be used, which is an implicit class with an empty definition that uses the default runtime handler. More info: https://git.k8s.io/enhancements/keps/sig-node/585-runtime-class' @@ -3712,7 +3763,7 @@ spec: description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. type: string schedulingGates: - description: "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. More info: https://git.k8s.io/enhancements/keps/sig-scheduling/3521-pod-scheduling-readiness. \n This is an alpha-level feature enabled by PodSchedulingReadiness feature gate." + description: "SchedulingGates is an opaque list of values that if specified will block scheduling the pod. If schedulingGates is not empty, the pod will stay in the SchedulingGated state and the scheduler will not attempt to schedule the pod. \n SchedulingGates can only be set at pod creation time, and be removed only afterwards. \n This is a beta feature enabled by the PodSchedulingReadiness feature gate." type: array items: description: PodSchedulingGate is associated to a Pod to guard its scheduling. @@ -3898,7 +3949,7 @@ spec: additionalProperties: type: string matchLabelKeys: - description: MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. + description: "MatchLabelKeys is a set of pod label keys to select the pods over which spreading will be calculated. The keys are used to lookup values from the incoming pod labels, those key-value labels are ANDed with labelSelector to select the group of existing pods over which spreading will be calculated for the incoming pod. The same key is forbidden to exist in both MatchLabelKeys and LabelSelector. MatchLabelKeys cannot be set when LabelSelector isn't set. Keys that don't exist in the incoming pod labels will be ignored. A null or empty list means only match against labelSelector. \n This is a beta field and requires the MatchLabelKeysInPodTopologySpread feature gate to be enabled (enabled by default)." type: array items: type: string @@ -4172,7 +4223,7 @@ spec: description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string sizeLimit: - description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - type: integer @@ -4240,7 +4291,7 @@ spec: type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -4264,7 +4315,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ diff --git a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml index 02411590d9..31e7ae877a 100644 --- a/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml +++ b/staging/operator-lifecycle-manager/deploy/chart/crds/0000_50_olm_00-subscriptions.crd.yaml @@ -644,7 +644,7 @@ spec: type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -668,7 +668,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ @@ -1002,7 +1002,7 @@ spec: description: 'medium represents what type of storage medium should back this directory. The default is "" which means to use the node''s default medium. Must be an empty string (default) or Memory. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' type: string sizeLimit: - description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: http://kubernetes.io/docs/user-guide/volumes#emptydir' + description: 'sizeLimit is the total amount of local storage required for this EmptyDir volume. The size limit is also applicable for memory medium. The maximum usage on memory medium EmptyDir would be the minimum value between the SizeLimit specified here and the sum of memory limits of all containers in a pod. The default is nil which means that the limit is undefined. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ anyOf: - type: integer @@ -1070,7 +1070,7 @@ spec: type: object properties: claims: - description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable." + description: "Claims lists the names of resources, defined in spec.resourceClaims, that are used by this container. \n This is an alpha field and requires enabling the DynamicResourceAllocation feature gate. \n This field is immutable. It can only be set for containers." type: array items: description: ResourceClaim references one entry in PodSpec.ResourceClaims. @@ -1094,7 +1094,7 @@ spec: - type: string x-kubernetes-int-or-string: true requests: - description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' + description: 'Requests describes the minimum amount of compute resources required. If Requests is omitted for a container, it defaults to Limits if that is explicitly specified, otherwise to an implementation-defined value. Requests cannot exceed Limits. More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/' type: object additionalProperties: pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index 2636ce5f16..496e1851e3 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -24,20 +24,20 @@ require ( github.com/onsi/gomega v1.27.7 github.com/openshift/api v3.9.0+incompatible github.com/openshift/client-go v0.0.0-20220525160904-9e1acff93e4a - github.com/operator-framework/api v0.17.6 + github.com/operator-framework/api v0.17.8-0.20230803152844-704ae942c4a9 github.com/operator-framework/operator-registry v1.27.1 github.com/otiai10/copy v1.2.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.15.1 github.com/prometheus/client_model v0.4.0 github.com/prometheus/common v0.42.0 - github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.6.1 + github.com/sirupsen/logrus v1.9.2 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/stretchr/testify v1.8.2 + github.com/stretchr/testify v1.8.3 golang.org/x/net v0.10.0 golang.org/x/time v0.3.0 - google.golang.org/grpc v1.53.0 + google.golang.org/grpc v1.54.0 gopkg.in/yaml.v2 v2.4.0 helm.sh/helm/v3 v3.12.2 k8s.io/api v0.27.2 @@ -73,7 +73,7 @@ require ( github.com/NYTimes/gziphandler v1.1.1 // indirect github.com/adrg/xdg v0.4.0 // indirect github.com/alessio/shellescape v1.4.1 // indirect - github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 // indirect + github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.0 // indirect @@ -118,7 +118,7 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/btree v1.0.1 // indirect - github.com/google/cel-go v0.12.6 // indirect + github.com/google/cel-go v0.15.3 // indirect github.com/google/gnostic v0.5.7-v3refs // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 // indirect @@ -136,7 +136,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 // indirect github.com/jmoiron/sqlx v1.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect @@ -204,6 +204,7 @@ require ( go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.7.0 // indirect + golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.10.0 // indirect golang.org/x/oauth2 v0.5.0 // indirect @@ -215,7 +216,7 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect gomodules.xyz/jsonpatch/v2 v2.3.0 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index 1b7d89d14a..116c4919f6 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -25,7 +25,7 @@ cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvf cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.18.0 h1:FEigFqoDbys2cvFkZ9Fjq4gnHBP55anJ0yQyau2f9oY= +cloud.google.com/go/compute v1.19.0 h1:+9zda3WGgW1ZSTlVppLCYFIr48Pa35q1uG2N1itbCEQ= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= @@ -86,8 +86,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v1.4.10 h1:yL7+Jz0jTC6yykIK/Wh74gnTJnrGr5AyrNMXuA0gves= -github.com/antlr/antlr4/runtime/Go/antlr v1.4.10/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df h1:7RFfzj4SSt6nnvCPbCqijJi1nWCd+TqAT3bYCStRC18= +github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -349,8 +349,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= -github.com/google/cel-go v0.12.6 h1:kjeKudqV0OygrAqA9fX6J55S8gj+Jre2tckIm5RoG4M= -github.com/google/cel-go v0.12.6/go.mod h1:Jk7ljRzLBhkmiAwBoUxB1sZSCVBAzkqPF25olK/iRDw= +github.com/google/cel-go v0.15.3 h1:W1wIeGuEs81+lBVU+cQRg1hkRT58Q6bNxvM5yn008S8= +github.com/google/cel-go v0.15.3/go.mod h1:YzWEoI07MC/a/wj9in8GeVatqfypkldgBlwXh9bCwqY= github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -469,8 +469,8 @@ github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 h1:3gyXljUyTWWTv/NMFPvwgxJSdE9Mamg2r3x8HMBl+Uo= github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645/go.mod h1:296z3W7Xsrp2mlIY88ruDKscuvrkL6zXCNRtaYVshzw= github.com/itchyny/go-flags v1.5.0/go.mod h1:lenkYuCobuxLBAd/HGFE4LRoW8D3B6iXRQfWYJ+MNbA= @@ -664,8 +664,8 @@ github.com/openshift/api v0.0.0-20221021112143-4226c2167e40/go.mod h1:aQ6LDasvHM github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c h1:CV76yFOTXmq9VciBR3Bve5ZWzSxdft7gaMVB3kS0rwg= github.com/openshift/client-go v0.0.0-20221019143426-16aed247da5c/go.mod h1:lFMO8mLHXWFzSdYvGNo8ivF9SfF6zInA8ZGw4phRnUE= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/operator-framework/api v0.17.6 h1:E6+vlvYUKafvoXYtCuHlDZrXX4vl8AT+r93OxNlzjpU= -github.com/operator-framework/api v0.17.6/go.mod h1:l/cuwtPxkVUY7fzYgdust2m9tlmb8I4pOvbsUufRb24= +github.com/operator-framework/api v0.17.8-0.20230803152844-704ae942c4a9 h1:0rOIH8rbWsjhiZb14DD7V8Ohl0CjPkTYIbm/0G/nv1s= +github.com/operator-framework/api v0.17.8-0.20230803152844-704ae942c4a9/go.mod h1:lnurXgadLnoZ7pufKMHkErr2BVOIZSpHtvEkHBcKvdk= github.com/operator-framework/operator-registry v1.27.1 h1:yU4atKR69XKH/GHlhgTdKTOAv4qRZUIFVHgrJE4FyiE= github.com/operator-framework/operator-registry v1.27.1/go.mod h1:zVsP+QdutDReiSpASIYqbrixjoNEHZKAyBOgLz1jaXk= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= @@ -756,8 +756,8 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= +github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -773,8 +773,8 @@ github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHN github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -799,8 +799,8 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= @@ -924,6 +924,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e h1:+WEEuIdZHnUeJJmEUjyYC2gfUMj69yZXw17EnHg/otA= +golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -1275,8 +1277,8 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= -google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6 h1:62QuyPXKEkZpjZesyj5K5jABl6MnSnWl+vNuT5oz90E= +google.golang.org/genproto v0.0.0-20230525154841-bd750badd5c6/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go index dfb7b87049..88a421a713 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go @@ -219,6 +219,24 @@ func Pod(source *operatorsv1alpha1.CatalogSource, name string, img string, saNam if grpcPodConfig.Affinity != nil { pod.Spec.Affinity = grpcPodConfig.Affinity.DeepCopy() } + + // Add memory targets + if grpcPodConfig.MemoryTarget != nil { + pod.Spec.Containers[0].Resources.Requests[corev1.ResourceMemory] = *grpcPodConfig.MemoryTarget + + if pod.Spec.Containers[0].Resources.Limits == nil { + pod.Spec.Containers[0].Resources.Limits = map[corev1.ResourceName]resource.Quantity{} + } + double := *grpcPodConfig.MemoryTarget + double.Add(double.DeepCopy()) + pod.Spec.Containers[0].Resources.Limits[corev1.ResourceMemory] = double + + grpcPodConfig.MemoryTarget.Format = resource.BinarySI + pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, corev1.EnvVar{ + Name: "GOMEMLIMIT", + Value: grpcPodConfig.MemoryTarget.String() + "B", // k8s resources use Mi, GOMEMLIMIT wants MiB + }) + } } // Set priorityclass if its annotation exists diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go index eafb629f48..7535107a60 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler_test.go @@ -3,8 +3,11 @@ package reconciler import ( "testing" + "github.com/google/go-cmp/cmp" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/image" "github.com/stretchr/testify/require" corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/resource" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/utils/pointer" @@ -13,6 +16,166 @@ import ( const workloadUserID = 1001 +func TestPodMemoryTarget(t *testing.T) { + q := resource.MustParse("5Mi") + var testCases = []struct { + name string + input *v1alpha1.CatalogSource + expected *corev1.Pod + }{ + { + name: "no memory target set", + input: &v1alpha1.CatalogSource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "testns", + }, + }, + expected: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "test-", + Namespace: "testns", + Labels: map[string]string{"olm.pod-spec-hash": "68d7885bb7"}, + Annotations: map[string]string{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "name", + Image: "image", + Ports: []corev1.ContainerPort{{Name: "grpc", ContainerPort: 50051}}, + ReadinessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + InitialDelaySeconds: 0, + TimeoutSeconds: 5, + }, + LivenessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + InitialDelaySeconds: 0, + TimeoutSeconds: 5, + }, + StartupProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + FailureThreshold: 10, + PeriodSeconds: 10, + TimeoutSeconds: 5, + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("10m"), + corev1.ResourceMemory: resource.MustParse("50Mi"), + }, + }, + SecurityContext: &corev1.SecurityContext{ + ReadOnlyRootFilesystem: pointer.Bool(false), + }, + ImagePullPolicy: image.InferImagePullPolicy("image"), + TerminationMessagePolicy: "FallbackToLogsOnError", + }, + }, + NodeSelector: map[string]string{"kubernetes.io/os": "linux"}, + ServiceAccountName: "service-account", + }, + }, + }, + { + name: "memory target set", + input: &v1alpha1.CatalogSource{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test", + Namespace: "testns", + }, + Spec: v1alpha1.CatalogSourceSpec{ + GrpcPodConfig: &v1alpha1.GrpcPodConfig{ + MemoryTarget: &q, + }, + }, + }, + expected: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + GenerateName: "test-", + Namespace: "testns", + Labels: map[string]string{"olm.pod-spec-hash": "855b6c6cf6"}, + Annotations: map[string]string{"cluster-autoscaler.kubernetes.io/safe-to-evict": "true"}, + }, + Spec: corev1.PodSpec{ + Containers: []corev1.Container{ + { + Name: "name", + Image: "image", + Ports: []corev1.ContainerPort{{Name: "grpc", ContainerPort: 50051}}, + Env: []corev1.EnvVar{{Name: "GOMEMLIMIT", Value: "5MiB"}}, + ReadinessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + InitialDelaySeconds: 0, + TimeoutSeconds: 5, + }, + LivenessProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + InitialDelaySeconds: 0, + TimeoutSeconds: 5, + }, + StartupProbe: &corev1.Probe{ + ProbeHandler: corev1.ProbeHandler{ + Exec: &corev1.ExecAction{ + Command: []string{"grpc_health_probe", "-addr=:50051"}, + }, + }, + FailureThreshold: 10, + PeriodSeconds: 10, + TimeoutSeconds: 5, + }, + Resources: corev1.ResourceRequirements{ + Requests: corev1.ResourceList{ + corev1.ResourceCPU: resource.MustParse("10m"), + corev1.ResourceMemory: resource.MustParse("5Mi"), + }, + Limits: corev1.ResourceList{ + corev1.ResourceMemory: resource.MustParse("10Mi"), + }, + }, + SecurityContext: &corev1.SecurityContext{ + ReadOnlyRootFilesystem: pointer.Bool(false), + }, + ImagePullPolicy: image.InferImagePullPolicy("image"), + TerminationMessagePolicy: "FallbackToLogsOnError", + }, + }, + NodeSelector: map[string]string{"kubernetes.io/os": "linux"}, + ServiceAccountName: "service-account", + }, + }, + }, + } + + for _, testCase := range testCases { + pod := Pod(testCase.input, "name", "image", "service-account", map[string]string{}, map[string]string{}, int32(0), int32(0), int64(workloadUserID)) + if diff := cmp.Diff(pod, testCase.expected); diff != "" { + t.Errorf("got incorrect pod: %v", diff) + } + } +} + func TestPodNodeSelector(t *testing.T) { catsrc := &v1alpha1.CatalogSource{ ObjectMeta: metav1.ObjectMeta{ diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go index dfb7b87049..88a421a713 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler/reconciler.go @@ -219,6 +219,24 @@ func Pod(source *operatorsv1alpha1.CatalogSource, name string, img string, saNam if grpcPodConfig.Affinity != nil { pod.Spec.Affinity = grpcPodConfig.Affinity.DeepCopy() } + + // Add memory targets + if grpcPodConfig.MemoryTarget != nil { + pod.Spec.Containers[0].Resources.Requests[corev1.ResourceMemory] = *grpcPodConfig.MemoryTarget + + if pod.Spec.Containers[0].Resources.Limits == nil { + pod.Spec.Containers[0].Resources.Limits = map[corev1.ResourceName]resource.Quantity{} + } + double := *grpcPodConfig.MemoryTarget + double.Add(double.DeepCopy()) + pod.Spec.Containers[0].Resources.Limits[corev1.ResourceMemory] = double + + grpcPodConfig.MemoryTarget.Format = resource.BinarySI + pod.Spec.Containers[0].Env = append(pod.Spec.Containers[0].Env, corev1.EnvVar{ + Name: "GOMEMLIMIT", + Value: grpcPodConfig.MemoryTarget.String() + "B", // k8s resources use Mi, GOMEMLIMIT wants MiB + }) + } } // Set priorityclass if its annotation exists diff --git a/vendor/modules.txt b/vendor/modules.txt index 328516a2bd..e20db9a1c4 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -642,7 +642,7 @@ github.com/openshift/client-go/config/informers/externalversions/config github.com/openshift/client-go/config/informers/externalversions/config/v1 github.com/openshift/client-go/config/informers/externalversions/internalinterfaces github.com/openshift/client-go/config/listers/config/v1 -# github.com/operator-framework/api v0.17.7 => ./staging/api +# github.com/operator-framework/api v0.17.8-0.20230803152844-704ae942c4a9 => ./staging/api ## explicit; go 1.19 github.com/operator-framework/api/crds github.com/operator-framework/api/pkg/constraints