From a1fb36d24ca2b6a2bb70ac25fa55a3e157603bff Mon Sep 17 00:00:00 2001 From: timflannagan Date: Thu, 8 Jul 2021 16:54:31 -0400 Subject: [PATCH 01/45] .github/workflows: Fix the release quickstart.yaml GH action Update the .github/workflows/quickstart.yml github action and replace the usage of `kubectl wait ...` with a function that waits until the various OLM component deployment resources are present and reporting an available status. Using `kubectl wait ...` is potentially problematic as it doesn't support waiting until the creation of that resource, so in the case the PackageServer deployment doesn't exist yet as the catalog/olm operators are still being setup, this action will fail as `kubectl wait ...` will return a non-zero exit code. Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: b98ff9d1601b41847fb47445a8366a1145c7cbe6 --- .../.github/workflows/quickstart.yml | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml b/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml index eeee62a248..9e6f6bf167 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/quickstart.yml @@ -20,4 +20,24 @@ jobs: kubectl apply -f deploy/upstream/quickstart/crds.yaml kubectl wait --timeout=5m --for=condition=Established crd $(kubectl get crd --output=jsonpath='{.items[*].metadata.name}') kubectl apply -f deploy/upstream/quickstart/olm.yaml - kubectl wait --timeout=5m --for=condition=Available -n olm deploy olm-operator catalog-operator packageserver + + # Note(tflannag): `kubectl wait` does not support waiting for resource creation: https://github.com/kubernetes/kubernetes/pull/87399. + wait_for_deployment() { + local deployment_name=$1 + timeout=60 + i=1 + echo "Checking if the ${deployment_name} deployment is ready" + until kubectl -n olm get deployment ${deployment_name} -o jsonpath='{.status.conditions[?(@.status=="True")].type}' | grep "Available" 2>/dev/null; do + ((i++)) + if [[ ${i} -gt ${timeout} ]]; then + echo "the ${deployment_name} deployment has not become ready before the timeout period" + exit 1 + fi + echo "waiting for ${deployment_name} deployment to report a ready status" + sleep 5 + done + echo "The ${deployment_name} deployment is ready" + } + wait_for_deployment catalog-operator + wait_for_deployment olm-operator + wait_for_deployment packageserver From 2aac21c3e5a15b46fbd57885379345507724ad51 Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Mon, 26 Jul 2021 12:07:47 -0400 Subject: [PATCH 02/45] Expose errors generated while retrieving catalog content. Failing to fetch catalog content should not silently return an empty cache. Instead, it should fail outright with an error that indicates which catalog(s) could not be fetched. Signed-off-by: Ben Luddy Upstream-repository: operator-lifecycle-manager Upstream-commit: 6ab5f1634093c91d7027b9245a88ede7b807088b --- .../pkg/controller/registry/resolver/cache.go | 25 +++++++++++++++++++ .../registry/resolver/cache_test.go | 24 +++++++++++++++++- .../controller/registry/resolver/resolver.go | 4 +++ .../pkg/controller/registry/types.go | 2 +- .../pkg/controller/registry/resolver/cache.go | 25 +++++++++++++++++++ .../controller/registry/resolver/resolver.go | 4 +++ .../pkg/controller/registry/types.go | 2 +- 7 files changed, 83 insertions(+), 3 deletions(-) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go index 68a060f9c7..d713f5018e 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go @@ -8,6 +8,8 @@ import ( "sync" "time" + "k8s.io/apimachinery/pkg/util/errors" + "github.com/sirupsen/logrus" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" @@ -79,6 +81,19 @@ type NamespacedOperatorCache struct { snapshots map[registry.CatalogKey]*CatalogSnapshot } +func (c *NamespacedOperatorCache) Error() error { + var errs []error + for key, snapshot := range c.snapshots { + snapshot.m.Lock() + err := snapshot.err + snapshot.m.Unlock() + if err != nil { + errs = append(errs, fmt.Errorf("error using catalog %s (in namespace %s): %w", key.Name, key.Namespace, err)) + } + } + return errors.NewAggregate(errs) +} + func (c *OperatorCache) Expire(catalog registry.CatalogKey) { c.m.Lock() defer c.m.Unlock() @@ -183,6 +198,12 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, registry client.Interface) { defer snapshot.m.Unlock() + defer func() { + // Don't cache an errorred snapshot. + if snapshot.err != nil { + snapshot.expiry = time.Time{} + } + }() c.sem <- struct{}{} defer func() { <-c.sem }() @@ -195,6 +216,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, it, err := registry.ListBundles(ctx) if err != nil { snapshot.logger.Errorf("failed to list bundles: %s", err.Error()) + snapshot.err = err return } c.logger.WithField("catalog", snapshot.key.String()).Debug("updating cache") @@ -223,6 +245,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, } if err := it.Error(); err != nil { snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) + snapshot.err = err } snapshot.operators = operators } @@ -293,6 +316,7 @@ type CatalogSnapshot struct { m sync.RWMutex pop context.CancelFunc priority catalogSourcePriority + err error } func (s *CatalogSnapshot) Cancel() { @@ -400,6 +424,7 @@ type MultiCatalogOperatorFinder interface { Catalog(registry.CatalogKey) OperatorFinder FindPreferred(*registry.CatalogKey, ...OperatorPredicate) []*Operator WithExistingOperators(*CatalogSnapshot) MultiCatalogOperatorFinder + Error() error OperatorFinder } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go index fccf59dd95..1d86cacc78 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go @@ -2,6 +2,7 @@ package resolver import ( "context" + "errors" "fmt" "io" "math/rand" @@ -10,6 +11,7 @@ import ( "time" "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -35,6 +37,8 @@ func (s *BundleStreamStub) Recv() (*api.Bundle, error) { type RegistryClientStub struct { BundleIterator *client.BundleIterator + + ListBundlesError error } func (s *RegistryClientStub) Get() (client.Interface, error) { @@ -58,7 +62,7 @@ func (s *RegistryClientStub) GetBundleThatProvides(ctx context.Context, group, v } func (s *RegistryClientStub) ListBundles(ctx context.Context) (*client.BundleIterator, error) { - return s.BundleIterator, nil + return s.BundleIterator, s.ListBundlesError } func (s *RegistryClientStub) GetPackage(ctx context.Context, packageName string) (*api.Package, error) { @@ -339,3 +343,21 @@ func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { assert.Equal(t, "K.v1.g", result[0].providedAPIs.String()) assert.Equal(t, "K2.v2.g2", result[0].requiredAPIs.String()) } + +func TestNamespaceOperatorCacheError(t *testing.T) { + rcp := RegistryClientProviderStub{} + catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() + key := registry.CatalogKey{Namespace: "dummynamespace", Name: "dummyname"} + rcp[key] = &RegistryClientStub{ + ListBundlesError: errors.New("testing"), + } + + logger, _ := test.NewNullLogger() + c := NewOperatorCache(rcp, logger, catsrcLister) + require.EqualError(t, c.Namespaced("dummynamespace").Error(), "error using catalog dummyname (in namespace dummynamespace): testing") + if snapshot, ok := c.snapshots[key]; !ok { + t.Fatalf("cache snapshot not found") + } else { + require.Zero(t, snapshot.expiry) + } +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index b00ec8a269..96201146a7 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -103,6 +103,10 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust r.addInvariants(namespacedCache, installables) + if err := namespacedCache.Error(); err != nil { + return nil, err + } + input := make([]solver.Installable, 0) for _, i := range installables { input = append(input, i) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/types.go b/staging/operator-lifecycle-manager/pkg/controller/registry/types.go index 11c3f99fa8..55e2c9f40c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/types.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/types.go @@ -33,7 +33,7 @@ func (k *CatalogKey) Virtual() bool { func NewVirtualCatalogKey(namespace string) CatalogKey { return CatalogKey{ - Name: ExistingOperatorKey, + Name: ExistingOperatorKey, Namespace: namespace, } } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go index 68a060f9c7..d713f5018e 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go @@ -8,6 +8,8 @@ import ( "sync" "time" + "k8s.io/apimachinery/pkg/util/errors" + "github.com/sirupsen/logrus" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" @@ -79,6 +81,19 @@ type NamespacedOperatorCache struct { snapshots map[registry.CatalogKey]*CatalogSnapshot } +func (c *NamespacedOperatorCache) Error() error { + var errs []error + for key, snapshot := range c.snapshots { + snapshot.m.Lock() + err := snapshot.err + snapshot.m.Unlock() + if err != nil { + errs = append(errs, fmt.Errorf("error using catalog %s (in namespace %s): %w", key.Name, key.Namespace, err)) + } + } + return errors.NewAggregate(errs) +} + func (c *OperatorCache) Expire(catalog registry.CatalogKey) { c.m.Lock() defer c.m.Unlock() @@ -183,6 +198,12 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, registry client.Interface) { defer snapshot.m.Unlock() + defer func() { + // Don't cache an errorred snapshot. + if snapshot.err != nil { + snapshot.expiry = time.Time{} + } + }() c.sem <- struct{}{} defer func() { <-c.sem }() @@ -195,6 +216,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, it, err := registry.ListBundles(ctx) if err != nil { snapshot.logger.Errorf("failed to list bundles: %s", err.Error()) + snapshot.err = err return } c.logger.WithField("catalog", snapshot.key.String()).Debug("updating cache") @@ -223,6 +245,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, } if err := it.Error(); err != nil { snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) + snapshot.err = err } snapshot.operators = operators } @@ -293,6 +316,7 @@ type CatalogSnapshot struct { m sync.RWMutex pop context.CancelFunc priority catalogSourcePriority + err error } func (s *CatalogSnapshot) Cancel() { @@ -400,6 +424,7 @@ type MultiCatalogOperatorFinder interface { Catalog(registry.CatalogKey) OperatorFinder FindPreferred(*registry.CatalogKey, ...OperatorPredicate) []*Operator WithExistingOperators(*CatalogSnapshot) MultiCatalogOperatorFinder + Error() error OperatorFinder } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index b00ec8a269..96201146a7 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -103,6 +103,10 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust r.addInvariants(namespacedCache, installables) + if err := namespacedCache.Error(); err != nil { + return nil, err + } + input := make([]solver.Installable, 0) for _, i := range installables { input = append(input, i) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/types.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/types.go index 11c3f99fa8..55e2c9f40c 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/types.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/types.go @@ -33,7 +33,7 @@ func (k *CatalogKey) Virtual() bool { func NewVirtualCatalogKey(namespace string) CatalogKey { return CatalogKey{ - Name: ExistingOperatorKey, + Name: ExistingOperatorKey, Namespace: namespace, } } From cbc87e6ec1b84bdc0f218c3d96eab79362e73844 Mon Sep 17 00:00:00 2001 From: timflannagan Date: Thu, 8 Jul 2021 10:47:24 -0400 Subject: [PATCH 03/45] v0.18.3 OLM release Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 1e7e1cc81d5c3e0f2de2a06cb4315ea622371cbe --- .../0000_50_olm_00-catalogsources.crd.yaml | 169 + ..._50_olm_00-clusterserviceversions.crd.yaml | 4841 +++++++++++++++++ .../0000_50_olm_00-installplans.crd.yaml | 265 + .../0.18.3/0000_50_olm_00-namespace.yaml | 12 + ...0000_50_olm_00-operatorconditions.crd.yaml | 308 ++ .../0000_50_olm_00-operatorgroups.crd.yaml | 235 + .../0.18.3/0000_50_olm_00-operators.crd.yaml | 140 + .../0000_50_olm_00-subscriptions.crd.yaml | 1344 +++++ ...50_olm_01-olm-operator.serviceaccount.yaml | 33 + ...000_50_olm_07-olm-operator.deployment.yaml | 60 + ...50_olm_08-catalog-operator.deployment.yaml | 54 + ...0000_50_olm_09-aggregated.clusterrole.yaml | 35 + .../0000_50_olm_13-operatorgroup-default.yaml | 17 + ...5-packageserver.clusterserviceversion.yaml | 135 + ...m_17-upstream-operators.catalogsource.yaml | 15 + .../deploy/upstream/manifests/latest | 2 +- .../deploy/upstream/quickstart/crds.yaml | 164 + .../deploy/upstream/quickstart/install.sh | 5 + .../deploy/upstream/quickstart/olm.yaml | 22 +- .../deploy/upstream/values.yaml | 6 +- 20 files changed, 7845 insertions(+), 17 deletions(-) create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-catalogsources.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-clusterserviceversions.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-installplans.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-namespace.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorconditions.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorgroups.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operators.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-subscriptions.crd.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_01-olm-operator.serviceaccount.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_07-olm-operator.deployment.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_08-catalog-operator.deployment.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_09-aggregated.clusterrole.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_13-operatorgroup-default.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_15-packageserver.clusterserviceversion.yaml create mode 100644 staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_17-upstream-operators.catalogsource.yaml diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-catalogsources.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-catalogsources.crd.yaml new file mode 100644 index 0000000000..2c1efc61dd --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-catalogsources.crd.yaml @@ -0,0 +1,169 @@ +--- +# Source: olm/crds/0000_50_olm_00-catalogsources.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: catalogsources.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: CatalogSource + listKind: CatalogSourceList + plural: catalogsources + shortNames: + - catsrc + singular: catalogsource + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The pretty name of the catalog + jsonPath: .spec.displayName + name: Display + type: string + - description: The type of the catalog + jsonPath: .spec.sourceType + name: Type + type: string + - description: The publisher of the catalog + jsonPath: .spec.publisher + name: Publisher + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + description: CatalogSource is a repository of CSVs, CRDs, and operator packages. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + type: object + required: + - sourceType + properties: + address: + description: 'Address is a host that OLM can use to connect to a pre-existing registry. Format: : Only used when SourceType = SourceTypeGrpc. Ignored when the Image field is set.' + type: string + configMap: + description: ConfigMap is the name of the ConfigMap to be used to back a configmap-server registry. Only used when SourceType = SourceTypeConfigmap or SourceTypeInternal. + type: string + description: + type: string + displayName: + description: Metadata + type: string + icon: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + image: + description: Image is an operator-registry container image to instantiate a registry-server with. Only used when SourceType = SourceTypeGrpc. If present, the address field is ignored. + type: string + priority: + description: 'Priority field assigns a weight to the catalog source to prioritize them so that it can be consumed by the dependency resolver. Usage: Higher weight indicates that this catalog source is preferred over lower weighted catalog sources during dependency resolution. The range of the priority value can go from positive to negative in the range of int32. The default value to a catalog source with unassigned priority would be 0. The catalog source with the same priority values will be ranked lexicographically based on its name.' + type: integer + publisher: + type: string + secrets: + description: Secrets represent set of secrets that can be used to access the contents of the catalog. It is best to keep this list small, since each will need to be tried for every catalog entry. + type: array + items: + type: string + sourceType: + description: SourceType is the type of source + type: string + updateStrategy: + description: UpdateStrategy defines how updated catalog source images can be discovered Consists of an interval that defines polling duration and an embedded strategy type + type: object + properties: + registryPoll: + type: object + properties: + interval: + description: Interval is used to determine the time interval between checks of the latest catalog source version. The catalog operator polls to see if a new version of the catalog source is available. If available, the latest image is pulled and gRPC traffic is directed to the latest catalog source. + type: string + status: + type: object + properties: + configMapReference: + type: object + required: + - name + - namespace + properties: + lastUpdateTime: + type: string + format: date-time + name: + type: string + namespace: + type: string + resourceVersion: + type: string + uid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + connectionState: + type: object + required: + - lastObservedState + properties: + address: + type: string + lastConnect: + type: string + format: date-time + lastObservedState: + type: string + latestImageRegistryPoll: + description: The last time the CatalogSource image registry has been polled to ensure the image is up-to-date + type: string + format: date-time + message: + description: A human readable message indicating details about why the CatalogSource is in this condition. + type: string + reason: + description: Reason is the reason the CatalogSource was transitioned to its current state. + type: string + registryService: + type: object + properties: + createdAt: + type: string + format: date-time + port: + type: string + protocol: + type: string + serviceName: + type: string + serviceNamespace: + type: string + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-clusterserviceversions.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-clusterserviceversions.crd.yaml new file mode 100644 index 0000000000..394924902a --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -0,0 +1,4841 @@ +--- +# Source: olm/crds/0000_50_olm_00-clusterserviceversions.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: clusterserviceversions.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: ClusterServiceVersion + listKind: ClusterServiceVersionList + plural: clusterserviceversions + shortNames: + - csv + - csvs + singular: clusterserviceversion + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The name of the CSV + jsonPath: .spec.displayName + name: Display + type: string + - description: The version of the CSV + jsonPath: .spec.version + name: Version + type: string + - description: The name of a CSV that this one replaces + jsonPath: .spec.replaces + name: Replaces + type: string + - jsonPath: .status.phase + name: Phase + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: ClusterServiceVersion is a Custom Resource of type `ClusterServiceVersionSpec`. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: ClusterServiceVersionSpec declarations tell OLM how to install an operator that can manage apps for a given version. + type: object + required: + - displayName + - install + properties: + annotations: + description: Annotations is an unstructured key value map stored with a resource that may be set by external tools to store and retrieve arbitrary metadata. + type: object + additionalProperties: + type: string + apiservicedefinitions: + description: APIServiceDefinitions declares all of the extension apis managed or required by an operator being ran by ClusterServiceVersion. + type: object + properties: + owned: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: APIServiceDescription provides details to OLM about apis provided via aggregation + type: object + required: + - group + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + deploymentName: + type: string + description: + type: string + displayName: + type: string + group: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + cleanup: + description: Cleanup specifies the cleanup behaviour when the CSV gets deleted + type: object + required: + - enabled + properties: + enabled: + type: boolean + customresourcedefinitions: + description: "CustomResourceDefinitions declares all of the CRDs managed or required by an operator being ran by ClusterServiceVersion. \n If the CRD is present in the Owned list, it is implicitly required." + type: object + properties: + owned: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + required: + type: array + items: + description: CRDDescription provides details to OLM about the CRDs + type: object + required: + - kind + - name + - version + properties: + actionDescriptors: + type: array + items: + description: ActionDescriptor describes a declarative action that can be performed on a custom resource instance + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + description: + type: string + displayName: + type: string + kind: + type: string + name: + type: string + resources: + type: array + items: + description: APIResourceReference is a Kubernetes resource type used by a custom resource + type: object + required: + - kind + - name + - version + properties: + kind: + type: string + name: + type: string + version: + type: string + specDescriptors: + type: array + items: + description: SpecDescriptor describes a field in a spec block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + statusDescriptors: + type: array + items: + description: StatusDescriptor describes a field in a status block of a CRD so that OLM can consume it + type: object + required: + - path + properties: + description: + type: string + displayName: + type: string + path: + type: string + value: + description: RawMessage is a raw encoded JSON value. It implements Marshaler and Unmarshaler and can be used to delay JSON decoding or precompute a JSON encoding. + type: string + format: byte + x-descriptors: + type: array + items: + type: string + version: + type: string + description: + type: string + displayName: + type: string + icon: + type: array + items: + type: object + required: + - base64data + - mediatype + properties: + base64data: + type: string + mediatype: + type: string + install: + description: NamedInstallStrategy represents the block of an ClusterServiceVersion resource where the install strategy is specified. + type: object + required: + - strategy + properties: + spec: + description: StrategyDetailsDeployment represents the parsed details of a Deployment InstallStrategy. + type: object + required: + - deployments + properties: + clusterPermissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + deployments: + type: array + items: + description: StrategyDeploymentSpec contains the name, spec and labels for the deployment ALM should create + type: object + required: + - name + - spec + properties: + label: + description: Set is a map of label:value. It implements Labels. + type: object + additionalProperties: + type: string + name: + type: string + spec: + description: DeploymentSpec is the specification of the desired behavior of the Deployment. + type: object + required: + - selector + - template + properties: + minReadySeconds: + description: Minimum number of seconds for which a newly created pod should be ready without any of its container crashing, for it to be considered available. Defaults to 0 (pod will be considered available as soon as it is ready) + type: integer + format: int32 + paused: + description: Indicates that the deployment is paused. + type: boolean + progressDeadlineSeconds: + description: The maximum time in seconds for a deployment to make progress before it is considered to be failed. The deployment controller will continue to process failed deployments and a condition with a ProgressDeadlineExceeded reason will be surfaced in the deployment status. Note that progress will not be estimated during the time a deployment is paused. Defaults to 600s. + type: integer + format: int32 + replicas: + description: Number of desired pods. This is a pointer to distinguish between explicit zero and not specified. Defaults to 1. + type: integer + format: int32 + revisionHistoryLimit: + description: The number of old ReplicaSets to retain to allow rollback. This is a pointer to distinguish between explicit zero and not specified. Defaults to 10. + type: integer + format: int32 + selector: + description: Label selector for pods. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + strategy: + description: The deployment strategy to use to replace existing pods with new ones. + type: object + properties: + rollingUpdate: + description: 'Rolling update config params. Present only if DeploymentStrategyType = RollingUpdate. --- TODO: Update this to follow our convention for oneOf, whatever we decide it to be.' + type: object + properties: + maxSurge: + description: 'The maximum number of pods that can be scheduled above the desired number of pods. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). This can not be 0 if MaxUnavailable is 0. Absolute number is calculated from percentage by rounding up. Defaults to 25%. Example: when this is set to 30%, the new ReplicaSet can be scaled up immediately when the rolling update starts, such that the total number of old and new pods do not exceed 130% of desired pods. Once old pods have been killed, new ReplicaSet can be scaled up further, ensuring that total number of pods running at any time during the update is at most 130% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + maxUnavailable: + description: 'The maximum number of pods that can be unavailable during the update. Value can be an absolute number (ex: 5) or a percentage of desired pods (ex: 10%). Absolute number is calculated from percentage by rounding down. This can not be 0 if MaxSurge is 0. Defaults to 25%. Example: when this is set to 30%, the old ReplicaSet can be scaled down to 70% of desired pods immediately when the rolling update starts. Once new pods are ready, old ReplicaSet can be scaled down further, followed by scaling up the new ReplicaSet, ensuring that the total number of pods available at all times during the update is at least 70% of desired pods.' + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + type: + description: Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate. + type: string + template: + description: Template describes the pods that will be created. + type: object + properties: + metadata: + description: 'Standard object''s metadata. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#metadata' + type: object + x-kubernetes-preserve-unknown-fields: true + spec: + description: 'Specification of the desired behavior of the pod. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status' + type: object + required: + - containers + properties: + activeDeadlineSeconds: + description: Optional duration in seconds the pod may be active on the node relative to StartTime before the system will actively try to mark it failed and kill associated containers. Value must be a positive integer. + type: integer + format: int64 + affinity: + description: If specified, the pod's scheduling constraints + type: object + properties: + nodeAffinity: + description: Describes node affinity scheduling rules for the pod. + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node matches the corresponding matchExpressions; the node(s) with the highest sum are the most preferred. + type: array + items: + description: An empty preferred scheduling term matches all objects with implicit weight 0 (i.e. it's a no-op). A null preferred scheduling term matches no objects (i.e. is also a no-op). + type: object + required: + - preference + - weight + properties: + preference: + description: A node selector term, associated with the corresponding weight. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + weight: + description: Weight associated with matching the corresponding nodeSelectorTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to an update), the system may or may not try to eventually evict the pod from its node. + type: object + required: + - nodeSelectorTerms + properties: + nodeSelectorTerms: + description: Required. A list of node selector terms. The terms are ORed. + type: array + items: + description: A null or empty node selector term matches no objects. The requirements of them are ANDed. The TopologySelectorTerm type implements a subset of the NodeSelectorTerm. + type: object + properties: + matchExpressions: + description: A list of node selector requirements by node's labels. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchFields: + description: A list of node selector requirements by node's fields. + type: array + items: + description: A node selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: The label key that the selector applies to. + type: string + operator: + description: Represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists, DoesNotExist. Gt, and Lt. + type: string + values: + description: An array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. If the operator is Gt or Lt, the values array must have a single element, which will be interpreted as an integer. This array is replaced during a strategic merge patch. + type: array + items: + type: string + podAffinity: + description: Describes pod affinity scheduling rules (e.g. co-locate this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + 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 + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + 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 + podAntiAffinity: + description: Describes pod anti-affinity scheduling rules (e.g. avoid putting this pod in the same node, zone, etc. as some other pod(s)). + type: object + properties: + preferredDuringSchedulingIgnoredDuringExecution: + description: The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding "weight" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred. + type: array + items: + description: The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s) + type: object + required: + - podAffinityTerm + - weight + properties: + podAffinityTerm: + description: Required. A pod affinity term, associated with the corresponding weight. + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + 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 + weight: + description: weight associated with matching the corresponding podAffinityTerm, in the range 1-100. + type: integer + format: int32 + requiredDuringSchedulingIgnoredDuringExecution: + description: If the anti-affinity requirements specified by this field are not met at scheduling time, the pod will not be scheduled onto the node. If the anti-affinity requirements specified by this field cease to be met at some point during pod execution (e.g. due to a pod label update), the system may or may not try to eventually evict the pod from its node. When there are multiple elements, the lists of nodes corresponding to each podAffinityTerm are intersected, i.e. all terms must be satisfied. + type: array + items: + description: Defines a set of pods (namely those matching the labelSelector relative to the given namespace(s)) that this pod should be co-located (affinity) or not co-located (anti-affinity) with, where co-located is defined as running on a node whose value of the label with key matches that of any node on which a pod of the set of pods is running + type: object + required: + - topologyKey + properties: + labelSelector: + description: A label query over a set of resources, in this case pods. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + namespaces: + description: namespaces specifies which namespaces the labelSelector applies to (matches against); null or empty list means "this pod's namespace" + type: array + items: + type: string + 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 + automountServiceAccountToken: + description: AutomountServiceAccountToken indicates whether a service account token should be automatically mounted. + type: boolean + containers: + description: List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated. + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. + type: object + required: + - containerPort + properties: + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + dnsConfig: + description: Specifies the DNS parameters of a pod. Parameters specified here will be merged to the generated DNS configuration based on DNSPolicy. + type: object + properties: + nameservers: + description: A list of DNS name server IP addresses. This will be appended to the base nameservers generated from DNSPolicy. Duplicated nameservers will be removed. + type: array + items: + type: string + options: + description: A list of DNS resolver options. This will be merged with the base options generated from DNSPolicy. Duplicated entries will be removed. Resolution options given in Options will override those that appear in the base DNSPolicy. + type: array + items: + description: PodDNSConfigOption defines DNS resolver options of a pod. + type: object + properties: + name: + description: Required. + type: string + value: + type: string + searches: + description: A list of DNS search domains for host-name lookup. This will be appended to the base search paths generated from DNSPolicy. Duplicated search paths will be removed. + type: array + items: + type: string + dnsPolicy: + description: Set DNS policy for the pod. Defaults to "ClusterFirst". Valid values are 'ClusterFirstWithHostNet', 'ClusterFirst', 'Default' or 'None'. DNS parameters given in DNSConfig will be merged with the policy selected with DNSPolicy. To have DNS options set along with hostNetwork, you have to specify DNS policy explicitly to 'ClusterFirstWithHostNet'. + type: string + enableServiceLinks: + description: 'EnableServiceLinks indicates whether information about services should be injected into pod''s environment variables, matching the syntax of Docker links. Optional: Defaults to true.' + type: boolean + ephemeralContainers: + description: List of ephemeral containers run in this pod. Ephemeral containers may be run in an existing pod to perform user-initiated actions such as debugging. This list cannot be specified when creating a pod, and it cannot be modified by updating the pod spec. In order to add an ephemeral container to an existing pod, use the pod's ephemeralcontainers subresource. This field is alpha-level and is only honored by servers that enable the EphemeralContainers feature. + type: array + items: + description: An EphemeralContainer is a container that may be added temporarily to an existing pod for user-initiated activities such as debugging. Ephemeral containers have no resource or scheduling guarantees, and they will not be restarted when they exit or when a pod is removed or restarted. If an ephemeral container causes a pod to exceed its resource allocation, the pod may be evicted. Ephemeral containers may not be added by directly updating the pod spec. They must be added via the pod's ephemeralcontainers subresource, and they will appear in the pod spec once added. This is an alpha feature enabled by the EphemeralContainers feature flag. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Lifecycle is not allowed for ephemeral containers. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + name: + description: Name of the ephemeral container specified as a DNS_LABEL. This name must be unique among all containers, init containers and ephemeral containers. + type: string + ports: + description: Ports are not allowed for ephemeral containers. + type: array + items: + description: ContainerPort represents a network port in a single container. + type: object + required: + - containerPort + properties: + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + readinessProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + resources: + description: Resources are not allowed for ephemeral containers. Ephemeral containers use spare resources already allocated to the pod. + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + securityContext: + description: SecurityContext is not allowed for ephemeral containers. + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: Probes are not allowed for ephemeral containers. + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + targetContainerName: + description: If set, the name of the container from PodSpec that this ephemeral container targets. The ephemeral container will be run in the namespaces (IPC, PID, etc) of this container. If not set then the ephemeral container is run in whatever namespaces are shared for the pod. Note that the container runtime must support this feature. + type: string + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + hostAliases: + description: HostAliases is an optional list of hosts and IPs that will be injected into the pod's hosts file if specified. This is only valid for non-hostNetwork pods. + type: array + items: + description: HostAlias holds the mapping between IP and hostnames that will be injected as an entry in the pod's hosts file. + type: object + properties: + hostnames: + description: Hostnames for the above IP address. + type: array + items: + type: string + ip: + description: IP address of the host file entry. + type: string + hostIPC: + description: 'Use the host''s ipc namespace. Optional: Default to false.' + type: boolean + hostNetwork: + description: Host networking requested for this pod. Use the host's network namespace. If this option is set, the ports that will be used must be specified. Default to false. + type: boolean + hostPID: + description: 'Use the host''s pid namespace. Optional: Default to false.' + type: boolean + hostname: + description: Specifies the hostname of the Pod If not specified, the pod's hostname will be set to a system-defined value. + type: string + imagePullSecrets: + description: 'ImagePullSecrets is an optional list of references to secrets in the same namespace to use for pulling any of the images used by this PodSpec. If specified, these secrets will be passed to individual puller implementations for them to use. For example, in the case of docker, only DockerConfig type secrets are honored. More info: https://kubernetes.io/docs/concepts/containers/images#specifying-imagepullsecrets-on-a-pod' + type: array + items: + description: LocalObjectReference contains enough information to let you locate the referenced object inside the same namespace. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + initContainers: + description: 'List of initialization containers belonging to the pod. Init containers are executed in order prior to containers being started. If any init container fails, the pod is considered to have failed and is handled according to its restartPolicy. The name for an init container or normal container must be unique among all containers. Init containers may not have Lifecycle actions, Readiness probes, Liveness probes, or Startup probes. The resourceRequirements of an init container are taken into account during scheduling by finding the highest request/limit for each resource type, and then using the max of of that value or the sum of the normal containers. Limits are applied to init containers in a similar fashion. Init containers cannot currently be added or removed. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/' + type: array + items: + description: A single application container that you want to run within a pod. + type: object + required: + - name + properties: + args: + description: 'Arguments to the entrypoint. The docker image''s CMD is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + command: + description: 'Entrypoint array. Not executed within a shell. The docker image''s ENTRYPOINT is used if this is not provided. Variable references $(VAR_NAME) are expanded using the container''s environment. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Cannot be updated. More info: https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#running-a-command-in-a-shell' + type: array + items: + type: string + env: + description: List of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + image: + description: 'Docker image name. More info: https://kubernetes.io/docs/concepts/containers/images This field is optional to allow higher level config management to default or override container images in workload controllers like Deployments and StatefulSets.' + type: string + imagePullPolicy: + description: 'Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated. More info: https://kubernetes.io/docs/concepts/containers/images#updating-images' + type: string + lifecycle: + description: Actions that the management system should take in response to container lifecycle events. Cannot be updated. + type: object + properties: + postStart: + description: 'PostStart is called immediately after a container is created. If the handler fails, the container is terminated and restarted according to its restart policy. Other management of the container blocks until the hook completes. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + preStop: + description: 'PreStop is called immediately before a container is terminated due to an API request or management event such as liveness/startup probe failure, preemption, resource contention, etc. The handler is not called if the container crashes or exits. The reason for termination is passed to the handler. The Pod''s termination grace period countdown begins before the PreStop hooked is executed. Regardless of the outcome of the handler, the container will eventually terminate within the Pod''s termination grace period. Other management of the container blocks until the hook completes or until the termination grace period is reached. More info: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#container-hooks' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + livenessProbe: + description: 'Periodic probe of container liveness. Container will be restarted if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + name: + description: Name of the container specified as a DNS_LABEL. Each container in a pod must have a unique name (DNS_LABEL). Cannot be updated. + type: string + ports: + description: List of ports to expose from the container. Exposing a port here gives the system additional information about the network connections a container uses, but is primarily informational. Not specifying a port here DOES NOT prevent that port from being exposed. Any port which is listening on the default "0.0.0.0" address inside a container will be accessible from the network. Cannot be updated. + type: array + items: + description: ContainerPort represents a network port in a single container. + type: object + required: + - containerPort + properties: + containerPort: + description: Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536. + type: integer + format: int32 + hostIP: + description: What host IP to bind the external port to. + type: string + hostPort: + description: Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this. + type: integer + format: int32 + name: + description: If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services. + type: string + protocol: + description: Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP". + type: string + default: TCP + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + description: 'Periodic probe of container service readiness. Container will be removed from service endpoints if the probe fails. Cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + resources: + description: 'Compute Resources required by this container. Cannot be updated. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + securityContext: + description: 'Security options the pod should run with. More info: https://kubernetes.io/docs/concepts/policy/security-context/ More info: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/' + type: object + properties: + allowPrivilegeEscalation: + description: 'AllowPrivilegeEscalation controls whether a process can gain more privileges than its parent process. This bool directly controls if the no_new_privs flag will be set on the container process. AllowPrivilegeEscalation is true always when the container is: 1) run as Privileged 2) has CAP_SYS_ADMIN' + type: boolean + capabilities: + description: The capabilities to add/drop when running containers. Defaults to the default set of capabilities granted by the container runtime. + type: object + properties: + add: + description: Added capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + drop: + description: Removed capabilities + type: array + items: + description: Capability represent POSIX capabilities type + type: string + privileged: + description: Run container in privileged mode. Processes in privileged containers are essentially equivalent to root on the host. Defaults to false. + type: boolean + procMount: + description: procMount denotes the type of proc mount to use for the containers. The default is DefaultProcMount which uses the container runtime defaults for readonly paths and masked paths. This requires the ProcMountType feature flag to be enabled. + type: string + readOnlyRootFilesystem: + description: Whether this container has a read-only root filesystem. Default is false. + type: boolean + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to the container. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by this container. If seccomp options are provided at both the pod & container level, the container options override the pod options. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options from the PodSecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + startupProbe: + description: 'StartupProbe indicates that the Pod has successfully initialized. If specified, no other probes are executed until this completes successfully. If this probe fails, the Pod will be restarted, just as if the livenessProbe failed. This can be used to provide different probe parameters at the beginning of a Pod''s lifecycle, when it might take a long time to load data or warm a cache, than during steady-state operation. This cannot be updated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: object + properties: + exec: + description: One and only one of the following should be specified. Exec specifies the action to take. + type: object + properties: + command: + description: Command is the command line to execute inside the container, the working directory for the command is root ('/') in the container's filesystem. The command is simply exec'd, it is not run inside a shell, so traditional shell instructions ('|', etc) won't work. To use a shell, you need to explicitly call out to that shell. Exit status of 0 is treated as live/healthy and non-zero is unhealthy. + type: array + items: + type: string + failureThreshold: + description: Minimum consecutive failures for the probe to be considered failed after having succeeded. Defaults to 3. Minimum value is 1. + type: integer + format: int32 + httpGet: + description: HTTPGet specifies the http request to perform. + type: object + required: + - port + properties: + host: + description: Host name to connect to, defaults to the pod IP. You probably want to set "Host" in httpHeaders instead. + type: string + httpHeaders: + description: Custom headers to set in the request. HTTP allows repeated headers. + type: array + items: + description: HTTPHeader describes a custom header to be used in HTTP probes + type: object + required: + - name + - value + properties: + name: + description: The header field name + type: string + value: + description: The header field value + type: string + path: + description: Path to access on the HTTP server. + type: string + port: + description: Name or number of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + description: Scheme to use for connecting to the host. Defaults to HTTP. + type: string + initialDelaySeconds: + description: 'Number of seconds after the container has started before liveness probes are initiated. More info: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle#container-probes' + type: integer + format: int32 + periodSeconds: + description: How often (in seconds) to perform the probe. Default to 10 seconds. Minimum value is 1. + type: integer + format: int32 + successThreshold: + description: Minimum consecutive successes for the probe to be considered successful after having failed. Defaults to 1. Must be 1 for liveness and startup. Minimum value is 1. + type: integer + format: int32 + tcpSocket: + description: 'TCPSocket specifies an action involving a TCP port. TCP hooks not yet supported TODO: implement a realistic TCP lifecycle hook' + type: object + required: + - port + properties: + host: + description: 'Optional: Host name to connect to, defaults to the pod IP.' + type: string + port: + description: Number or name of the port to access on the container. Number must be in the range 1 to 65535. Name must be an IANA_SVC_NAME. + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + 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 + stdin: + description: Whether this container should allocate a buffer for stdin in the container runtime. If this is not set, reads from stdin in the container will always result in EOF. Default is false. + type: boolean + stdinOnce: + description: Whether the container runtime should close the stdin channel after it has been opened by a single attach. When stdin is true the stdin stream will remain open across multiple attach sessions. If stdinOnce is set to true, stdin is opened on container start, is empty until the first client attaches to stdin, and then remains open and accepts data until the client disconnects, at which time stdin is closed and remains closed until the container is restarted. If this flag is false, a container processes that reads from stdin will never receive an EOF. Default is false + type: boolean + terminationMessagePath: + description: 'Optional: Path at which the file to which the container''s termination message will be written is mounted into the container''s filesystem. Message written is intended to be brief final status, such as an assertion failure message. Will be truncated by the node if greater than 4096 bytes. The total message length across all containers will be limited to 12kb. Defaults to /dev/termination-log. Cannot be updated.' + type: string + terminationMessagePolicy: + description: Indicate how the termination message should be populated. File will use the contents of terminationMessagePath to populate the container status message on both success and failure. FallbackToLogsOnError will use the last chunk of container log output if the termination message file is empty and the container exited with an error. The log output is limited to 2048 bytes or 80 lines, whichever is smaller. Defaults to File. Cannot be updated. + type: string + tty: + description: Whether this container should allocate a TTY for itself, also requires 'stdin' to be true. Default is false. + type: boolean + volumeDevices: + description: volumeDevices is the list of block devices to be used by the container. + type: array + items: + description: volumeDevice describes a mapping of a raw block device within a container. + type: object + required: + - devicePath + - name + properties: + devicePath: + description: devicePath is the path inside of the container that the device will be mapped to. + type: string + name: + description: name must match the name of a persistentVolumeClaim in the pod + type: string + volumeMounts: + description: Pod volumes to mount into the container's filesystem. Cannot be updated. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + workingDir: + description: Container's working directory. If not specified, the container runtime's default will be used, which might be configured in the container image. Cannot be updated. + type: string + nodeName: + description: NodeName is a request to schedule this pod onto a specific node. If it is non-empty, the scheduler simply schedules this pod onto that node, assuming that it fits resource requirements. + type: string + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + overhead: + description: 'Overhead represents the resource overhead associated with running a pod for a given RuntimeClass. This field will be autopopulated at admission time by the RuntimeClass admission controller. If the RuntimeClass admission controller is enabled, overhead must not be set in Pod create requests. The RuntimeClass admission controller will reject Pod create requests which have the overhead already set. If RuntimeClass is configured and selected in the PodSpec, Overhead will be set to the value defined in the corresponding RuntimeClass, otherwise it will remain unset and treated as zero. More info: https://git.k8s.io/enhancements/keps/sig-node/20190226-pod-overhead.md This field is alpha-level as of Kubernetes v1.16, and is only honored by servers that enable the PodOverhead feature.' + type: object + additionalProperties: + 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 + preemptionPolicy: + description: PreemptionPolicy is the Policy for preempting pods with lower priority. One of Never, PreemptLowerPriority. Defaults to PreemptLowerPriority if unset. This field is beta-level, gated by the NonPreemptingPriority feature-gate. + type: string + priority: + description: The priority value. Various system components use this field to find the priority of the pod. When Priority Admission Controller is enabled, it prevents users from setting this field. The admission controller populates this field from PriorityClassName. The higher the value, the higher the priority. + type: integer + format: int32 + priorityClassName: + description: If specified, indicates the pod's priority. "system-node-critical" and "system-cluster-critical" are two special keywords which indicate the highest priorities with the former being the highest priority. Any other name must be defined by creating a PriorityClass object with that name. If not specified, the pod priority will be default or zero if there is no default. + type: string + readinessGates: + description: 'If specified, all readiness gates will be evaluated for pod readiness. A pod is ready when all its containers are ready AND all conditions specified in the readiness gates have status equal to "True" More info: https://git.k8s.io/enhancements/keps/sig-network/0007-pod-ready%2B%2B.md' + type: array + items: + description: PodReadinessGate contains the reference to a pod condition + type: object + required: + - conditionType + properties: + conditionType: + description: ConditionType refers to a condition in the pod's condition list with matching type. + type: string + 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' + 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/runtime-class.md This is a beta feature as of Kubernetes v1.14.' + type: string + schedulerName: + description: If specified, the pod will be dispatched by specified scheduler. If not specified, the pod will be dispatched by default scheduler. + type: string + securityContext: + description: 'SecurityContext holds pod-level security attributes and common container settings. Optional: Defaults to empty. See type description for default values of each field.' + type: object + properties: + fsGroup: + description: "A special supplemental group that applies to all containers in a pod. Some volume types allow the Kubelet to change the ownership of that volume to be owned by the pod: \n 1. The owning GID will be the FSGroup 2. The setgid bit is set (new files created in the volume will be owned by FSGroup) 3. The permission bits are OR'd with rw-rw---- \n If unset, the Kubelet will not modify the ownership and permissions of any volume." + type: integer + format: int64 + fsGroupChangePolicy: + description: 'fsGroupChangePolicy defines behavior of changing ownership and permission of the volume before being exposed inside Pod. This field will only apply to volume types which support fsGroup based ownership(and permissions). It will have no effect on ephemeral volume types such as: secret, configmaps and emptydir. Valid values are "OnRootMismatch" and "Always". If not specified, "Always" is used.' + type: string + runAsGroup: + description: The GID to run the entrypoint of the container process. Uses runtime default if unset. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + runAsNonRoot: + description: Indicates that the container must run as a non-root user. If true, the Kubelet will validate the image at runtime to ensure that it does not run as UID 0 (root) and fail to start the container if it does. If unset or false, no such validation will be performed. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: boolean + runAsUser: + description: The UID to run the entrypoint of the container process. Defaults to user specified in image metadata if unspecified. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: integer + format: int64 + seLinuxOptions: + description: The SELinux context to be applied to all containers. If unspecified, the container runtime will allocate a random SELinux context for each container. May also be set in SecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence for that container. + type: object + properties: + level: + description: Level is SELinux level label that applies to the container. + type: string + role: + description: Role is a SELinux role label that applies to the container. + type: string + type: + description: Type is a SELinux type label that applies to the container. + type: string + user: + description: User is a SELinux user label that applies to the container. + type: string + seccompProfile: + description: The seccomp options to use by the containers in this pod. + type: object + required: + - type + properties: + localhostProfile: + description: localhostProfile indicates a profile defined in a file on the node should be used. The profile must be preconfigured on the node to work. Must be a descending path, relative to the kubelet's configured seccomp profile location. Must only be set if type is "Localhost". + type: string + type: + description: "type indicates which kind of seccomp profile will be applied. Valid options are: \n Localhost - a profile defined in a file on the node should be used. RuntimeDefault - the container runtime default profile should be used. Unconfined - no profile should be applied." + type: string + supplementalGroups: + description: A list of groups applied to the first process run in each container, in addition to the container's primary GID. If unspecified, no groups will be added to any container. + type: array + items: + type: integer + format: int64 + sysctls: + description: Sysctls hold a list of namespaced sysctls used for the pod. Pods with unsupported sysctls (by the container runtime) might fail to launch. + type: array + items: + description: Sysctl defines a kernel parameter to be set + type: object + required: + - name + - value + properties: + name: + description: Name of a property to set + type: string + value: + description: Value of a property to set + type: string + windowsOptions: + description: The Windows specific settings applied to all containers. If unspecified, the options within a container's SecurityContext will be used. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: object + properties: + gmsaCredentialSpec: + description: GMSACredentialSpec is where the GMSA admission webhook (https://github.com/kubernetes-sigs/windows-gmsa) inlines the contents of the GMSA credential spec named by the GMSACredentialSpecName field. + type: string + gmsaCredentialSpecName: + description: GMSACredentialSpecName is the name of the GMSA credential spec to use. + type: string + runAsUserName: + description: The UserName in Windows to run the entrypoint of the container process. Defaults to the user specified in image metadata if unspecified. May also be set in PodSecurityContext. If set in both SecurityContext and PodSecurityContext, the value specified in SecurityContext takes precedence. + type: string + serviceAccount: + description: 'DeprecatedServiceAccount is a depreciated alias for ServiceAccountName. Deprecated: Use serviceAccountName instead.' + type: string + serviceAccountName: + description: 'ServiceAccountName is the name of the ServiceAccount to use to run this pod. More info: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/' + type: string + setHostnameAsFQDN: + description: If true the pod's hostname will be configured as the pod's FQDN, rather than the leaf name (the default). In Linux containers, this means setting the FQDN in the hostname field of the kernel (the nodename field of struct utsname). In Windows containers, this means setting the registry value of hostname for the registry key HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters to FQDN. If a pod does not have FQDN, this has no effect. Default to false. + type: boolean + shareProcessNamespace: + description: 'Share a single process namespace between all of the containers in a pod. When this is set containers will be able to view and signal processes from other containers in the same pod, and the first process in each container will not be assigned PID 1. HostPID and ShareProcessNamespace cannot both be set. Optional: Default to false.' + type: boolean + subdomain: + description: If specified, the fully qualified Pod hostname will be "...svc.". If not specified, the pod will not have a domainname at all. + type: string + terminationGracePeriodSeconds: + description: Optional duration in seconds the pod needs to terminate gracefully. May be decreased in delete request. Value must be non-negative integer. The value zero indicates delete immediately. If this value is nil, the default grace period will be used instead. The grace period is the duration in seconds after the processes running in the pod are sent a termination signal and the time when the processes are forcibly halted with a kill signal. Set this value longer than the expected cleanup time for your process. Defaults to 30 seconds. + type: integer + format: int64 + tolerations: + description: If specified, the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. + type: integer + format: int64 + value: + description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + topologySpreadConstraints: + description: TopologySpreadConstraints describes how a group of pods ought to spread across topology domains. Scheduler will schedule pods in a way which abides by the constraints. All topologySpreadConstraints are ANDed. + type: array + items: + description: TopologySpreadConstraint specifies how to spread matching pods among the given topology. + type: object + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + properties: + labelSelector: + description: LabelSelector is used to find matching pods. Pods that match this label selector are counted to determine the number of pods in their corresponding topology domain. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + maxSkew: + description: 'MaxSkew describes the degree to which pods may be unevenly distributed. When `whenUnsatisfiable=DoNotSchedule`, it is the maximum permitted difference between the number of matching pods in the target topology and the global minimum. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 1/1/0: | zone1 | zone2 | zone3 | | P | P | | - if MaxSkew is 1, incoming pod can only be scheduled to zone3 to become 1/1/1; scheduling it onto zone1(zone2) would make the ActualSkew(2-0) on zone1(zone2) violate MaxSkew(1). - if MaxSkew is 2, incoming pod can be scheduled onto any zone. When `whenUnsatisfiable=ScheduleAnyway`, it is used to give higher precedence to topologies that satisfy it. It''s a required field. Default value is 1 and 0 is not allowed.' + type: integer + format: int32 + topologyKey: + description: TopologyKey is the key of node labels. Nodes that have a label with this key and identical values are considered to be in the same topology. We consider each as a "bucket", and try to put balanced number of pods into each bucket. It's a required field. + type: string + whenUnsatisfiable: + description: 'WhenUnsatisfiable indicates how to deal with a pod if it doesn''t satisfy the spread constraint. - DoNotSchedule (default) tells the scheduler not to schedule it. - ScheduleAnyway tells the scheduler to schedule the pod in any location, but giving higher precedence to topologies that would help reduce the skew. A constraint is considered "Unsatisfiable" for an incoming pod if and only if every possible node assigment for that pod would violate "MaxSkew" on some topology. For example, in a 3-zone cluster, MaxSkew is set to 1, and pods with the same labelSelector spread as 3/1/1: | zone1 | zone2 | zone3 | | P P P | P | P | If WhenUnsatisfiable is set to DoNotSchedule, incoming pod can only be scheduled to zone2(zone3) to become 3/2/1(3/1/2) as ActualSkew(2-1) on zone2(zone3) satisfies MaxSkew(1). In other words, the cluster can still be imbalanced, but scheduler won''t make it *more* imbalanced. It''s a required field.' + type: string + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + description: 'List of volumes that can be mounted by containers belonging to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes' + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: '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: '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' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + selector: + description: A label query over volumes to consider for binding. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secret: + description: information about the secret data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + permissions: + type: array + items: + description: StrategyDeploymentPermissions describe the rbac rules and service account needed by the install strategy + type: object + required: + - rules + - serviceAccountName + properties: + rules: + type: array + items: + description: PolicyRule holds information that describes a policy rule, but does not contain information about who the rule applies to or which namespace the rule applies to. + type: object + required: + - verbs + properties: + apiGroups: + description: APIGroups is the name of the APIGroup that contains the resources. If multiple API groups are specified, any action requested against one of the enumerated resources in any API group will be allowed. + type: array + items: + type: string + nonResourceURLs: + description: NonResourceURLs is a set of partial urls that a user should have access to. *s are allowed, but only as the full, final step in the path Since non-resource URLs are not namespaced, this field is only applicable for ClusterRoles referenced from a ClusterRoleBinding. Rules can either apply to API resources (such as "pods" or "secrets") or non-resource URL paths (such as "/api"), but not both. + type: array + items: + type: string + resourceNames: + description: ResourceNames is an optional white list of names that the rule applies to. An empty set means that everything is allowed. + type: array + items: + type: string + resources: + description: Resources is a list of resources this rule applies to. ResourceAll represents all resources. + type: array + items: + type: string + verbs: + description: Verbs is a list of Verbs that apply to ALL the ResourceKinds and AttributeRestrictions contained in this rule. VerbAll represents all kinds. + type: array + items: + type: string + serviceAccountName: + type: string + strategy: + type: string + installModes: + description: InstallModes specify supported installation types + type: array + items: + description: InstallMode associates an InstallModeType with a flag representing if the CSV supports it + type: object + required: + - supported + - type + properties: + supported: + type: boolean + type: + description: InstallModeType is a supported type of install mode for CSV installation + type: string + keywords: + type: array + items: + type: string + labels: + description: Map of string keys and values that can be used to organize and categorize (scope and select) objects. + type: object + additionalProperties: + type: string + links: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + maintainers: + type: array + items: + type: object + properties: + email: + type: string + name: + type: string + maturity: + type: string + minKubeVersion: + type: string + nativeAPIs: + type: array + items: + description: GroupVersionKind unambiguously identifies a kind. It doesn't anonymously include GroupVersion to avoid automatic coersion. It doesn't use a GroupVersion to avoid custom marshalling + type: object + required: + - group + - kind + - version + properties: + group: + type: string + kind: + type: string + version: + type: string + provider: + type: object + properties: + name: + type: string + url: + type: string + relatedImages: + description: List any related images, or other container images that your Operator might require to perform their functions. This list should also include operand images as well. All image references should be specified by digest (SHA) and not by tag. This field is only used during catalog creation and plays no part in cluster runtime. + type: array + items: + type: object + required: + - image + - name + properties: + image: + type: string + name: + type: string + replaces: + description: The name of a CSV this one replaces. Should match the `metadata.Name` field of the old CSV. + type: string + selector: + description: Label selector for related resources. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + skips: + description: The name(s) of one or more CSV(s) that should be skipped in the upgrade graph. Should match the `metadata.Name` field of the CSV that should be skipped. This field is only used during catalog creation and plays no part in cluster runtime. + type: array + items: + type: string + version: + description: OperatorVersion is a wrapper around semver.Version which supports correct marshaling to YAML and JSON. + type: string + webhookdefinitions: + type: array + items: + description: WebhookDescription provides details to OLM about required webhooks + type: object + required: + - admissionReviewVersions + - generateName + - sideEffects + - type + properties: + admissionReviewVersions: + type: array + items: + type: string + containerPort: + type: integer + format: int32 + default: 443 + maximum: 65535 + minimum: 1 + conversionCRDs: + type: array + items: + type: string + deploymentName: + type: string + failurePolicy: + type: string + generateName: + type: string + matchPolicy: + description: MatchPolicyType specifies the type of match policy + type: string + objectSelector: + description: A label selector is a label query over a set of resources. The result of matchLabels and matchExpressions are ANDed. An empty label selector matches all objects. A null label selector matches no objects. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + reinvocationPolicy: + description: ReinvocationPolicyType specifies what type of policy the admission hook uses. + type: string + rules: + type: array + items: + description: RuleWithOperations is a tuple of Operations and Resources. It is recommended to make sure that all the tuple expansions are valid. + type: object + properties: + apiGroups: + description: APIGroups is the API groups the resources belong to. '*' is all groups. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + apiVersions: + description: APIVersions is the API versions the resources belong to. '*' is all versions. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + operations: + description: Operations is the operations the admission hook cares about - CREATE, UPDATE, DELETE, CONNECT or * for all of those operations and any future admission operations that are added. If '*' is present, the length of the slice must be one. Required. + type: array + items: + type: string + resources: + description: "Resources is a list of resources this rule applies to. \n For example: 'pods' means pods. 'pods/log' means the log subresource of pods. '*' means all resources, but not subresources. 'pods/*' means all subresources of pods. '*/scale' means all scale subresources. '*/*' means all resources and their subresources. \n If wildcard is present, the validation rule will ensure resources do not overlap with each other. \n Depending on the enclosing object, subresources might not be allowed. Required." + type: array + items: + type: string + scope: + description: scope specifies the scope of this rule. Valid values are "Cluster", "Namespaced", and "*" "Cluster" means that only cluster-scoped resources will match this rule. Namespace API objects are cluster-scoped. "Namespaced" means that only namespaced resources will match this rule. "*" means that there are no scope restrictions. Subresources match the scope of their parent resource. Default is "*". + type: string + sideEffects: + type: string + targetPort: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + timeoutSeconds: + type: integer + format: int32 + type: + description: WebhookAdmissionType is the type of admission webhooks supported by OLM + type: string + enum: + - ValidatingAdmissionWebhook + - MutatingAdmissionWebhook + - ConversionWebhook + webhookPath: + type: string + status: + description: ClusterServiceVersionStatus represents information about the status of a CSV. Status may trail the actual state of a system. + type: object + properties: + certsLastUpdated: + description: Last time the owned APIService certs were updated + type: string + format: date-time + certsRotateAt: + description: Time the owned APIService certs will rotate next + type: string + format: date-time + cleanup: + description: CleanupStatus represents information about the status of cleanup while a CSV is pending deletion + type: object + properties: + pendingDeletion: + description: PendingDeletion is the list of custom resource objects that are pending deletion and blocked on finalizers. This indicates the progress of cleanup that is blocking CSV deletion or operator uninstall. + type: array + items: + description: ResourceList represents a list of resources which are of the same Group/Kind + type: object + required: + - group + - instances + - kind + properties: + group: + type: string + instances: + type: array + items: + type: object + required: + - name + properties: + name: + type: string + namespace: + description: Namespace can be empty for cluster-scoped resources + type: string + kind: + type: string + conditions: + description: List of conditions, a history of state transitions + type: array + items: + description: Conditions appear in the status as a record of state transitions on the ClusterServiceVersion + type: object + properties: + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + lastTransitionTime: + description: Last time the status transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time we updated the status + type: string + format: date-time + message: + description: A human readable message indicating details about why the ClusterServiceVersion is in this condition. + type: string + phase: + description: Current condition of the ClusterServiceVersion + type: string + reason: + description: A brief CamelCase message indicating details about why the ClusterServiceVersion is in this state. e.g. 'RequirementsNotMet' + type: string + requirementStatus: + description: The status of each requirement for this CSV + type: array + items: + type: object + required: + - group + - kind + - message + - name + - status + - version + properties: + dependents: + type: array + items: + description: DependentStatus is the status for a dependent requirement (to prevent infinite nesting) + type: object + required: + - group + - kind + - status + - version + properties: + group: + type: string + kind: + type: string + message: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + group: + type: string + kind: + type: string + message: + type: string + name: + type: string + status: + description: StatusReason is a camelcased reason for the status of a RequirementStatus or DependentStatus + type: string + uuid: + type: string + version: + type: string + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-installplans.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-installplans.crd.yaml new file mode 100644 index 0000000000..6536fe1b79 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-installplans.crd.yaml @@ -0,0 +1,265 @@ +--- +# Source: olm/crds/0000_50_olm_00-installplans.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: installplans.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: InstallPlan + listKind: InstallPlanList + plural: installplans + shortNames: + - ip + singular: installplan + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The first CSV in the list of clusterServiceVersionNames + jsonPath: .spec.clusterServiceVersionNames[0] + name: CSV + type: string + - description: The approval mode + jsonPath: .spec.approval + name: Approval + type: string + - jsonPath: .spec.approved + name: Approved + type: boolean + name: v1alpha1 + schema: + openAPIV3Schema: + description: InstallPlan defines the installation of a set of operators. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: InstallPlanSpec defines a set of Application resources to be installed + type: object + required: + - approval + - approved + - clusterServiceVersionNames + properties: + approval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + approved: + type: boolean + clusterServiceVersionNames: + type: array + items: + type: string + generation: + type: integer + source: + type: string + sourceNamespace: + type: string + status: + description: "InstallPlanStatus represents the information about the status of steps required to complete installation. \n Status may trail the actual state of a system." + type: object + required: + - catalogSources + - phase + properties: + attenuatedServiceAccountRef: + description: AttenuatedServiceAccountRef references the service account that is used to do scoped operator install. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + bundleLookups: + description: BundleLookups is the set of in-progress requests to pull and unpackage bundle content to the cluster. + type: array + items: + description: BundleLookup is a request to pull and unpackage the content of a bundle to the cluster. + type: object + required: + - catalogSourceRef + - identifier + - path + - replaces + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to the CatalogSource the bundle path was resolved from. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + conditions: + description: Conditions represents the overall state of a BundleLookup. + type: array + items: + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed. + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + identifier: + description: Identifier is the catalog-unique name of the operator (the name of the CSV for bundles that contain CSVs) + type: string + path: + description: Path refers to the location of a bundle to pull. It's typically an image reference. + type: string + properties: + description: The effective properties of the unpacked bundle. + type: string + replaces: + description: Replaces is the name of the bundle to replace with the one found at Path. + type: string + catalogSources: + type: array + items: + type: string + conditions: + type: array + items: + description: InstallPlanCondition represents the overall status of the execution of an InstallPlan. + type: object + properties: + lastTransitionTime: + type: string + format: date-time + lastUpdateTime: + type: string + format: date-time + message: + type: string + reason: + description: ConditionReason is a camelcased reason for the state transition. + type: string + status: + type: string + type: + description: InstallPlanConditionType describes the state of an InstallPlan at a certain point as a whole. + type: string + message: + description: Message is a human-readable message containing detailed information that may be important to understanding why the plan has its current status. + type: string + phase: + description: InstallPlanPhase is the current status of a InstallPlan as a whole. + type: string + plan: + type: array + items: + description: Step represents the status of an individual step in an InstallPlan. + type: object + required: + - resolving + - resource + - status + properties: + resolving: + type: string + resource: + description: StepResource represents the status of a resource to be tracked by an InstallPlan. + type: object + required: + - group + - kind + - name + - sourceName + - sourceNamespace + - version + properties: + group: + type: string + kind: + type: string + manifest: + type: string + name: + type: string + sourceName: + type: string + sourceNamespace: + type: string + version: + type: string + status: + description: StepStatus is the current status of a particular resource an in InstallPlan + type: string + startTime: + description: StartTime is the time when the controller began applying the resources listed in the plan to the cluster. + type: string + format: date-time + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-namespace.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-namespace.yaml new file mode 100644 index 0000000000..13917074d8 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-namespace.yaml @@ -0,0 +1,12 @@ +--- +# Source: olm/templates/0000_50_olm_00-namespace.yaml +apiVersion: v1 +kind: Namespace +metadata: + name: olm +--- +# Source: olm/templates/0000_50_olm_00-namespace.yaml +apiVersion: v1 +kind: Namespace +metadata: + name: operators diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorconditions.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorconditions.crd.yaml new file mode 100644 index 0000000000..334b0c2d33 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorconditions.crd.yaml @@ -0,0 +1,308 @@ +--- +# Source: olm/crds/0000_50_olm_00-operatorconditions.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: operatorconditions.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: OperatorCondition + listKind: OperatorConditionList + plural: operatorconditions + shortNames: + - condition + singular: operatorcondition + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorConditionSpec allows a cluster admin to convey information about the state of an operator to OLM, potentially overriding state reported by the operator. + type: object + properties: + deployments: + type: array + items: + type: string + overrides: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows an operator to convey information its state to OLM. The status may trail the actual state of a system. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + served: true + storage: false + subresources: + status: {} + - name: v2 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorConditionSpec allows an operator to report state to OLM and provides cluster admin with the ability to manually override state reported by the operator. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + deployments: + type: array + items: + type: string + overrides: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows OLM to convey which conditions have been observed. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorgroups.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorgroups.crd.yaml new file mode 100644 index 0000000000..f05dca4089 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operatorgroups.crd.yaml @@ -0,0 +1,235 @@ +--- +# Source: olm/crds/0000_50_olm_00-operatorgroups.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: operatorgroups.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: OperatorGroup + listKind: OperatorGroupList + plural: operatorgroups + shortNames: + - og + singular: operatorgroup + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. + type: string + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: + type: string + x-kubernetes-list-type: set + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: + type: string + x-kubernetes-list-type: set + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + - name: v1alpha2 + schema: + openAPIV3Schema: + description: OperatorGroup is the unit of multitenancy for OLM managed operators. It constrains the installation of operators in its namespace to a specified set of target namespaces. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorGroupSpec is the spec for an OperatorGroup resource. + type: object + properties: + selector: + description: Selector selects the OperatorGroup's target namespaces. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + serviceAccountName: + description: ServiceAccountName is the admin specified service account which will be used to deploy operator(s) in this operator group. + type: string + staticProvidedAPIs: + description: Static tells OLM not to update the OperatorGroup's providedAPIs annotation + type: boolean + targetNamespaces: + description: TargetNamespaces is an explicit set of namespaces to target. If it is set, Selector is ignored. + type: array + items: + type: string + status: + description: OperatorGroupStatus is the status for an OperatorGroupResource. + type: object + required: + - lastUpdated + properties: + lastUpdated: + description: LastUpdated is a timestamp of the last time the OperatorGroup's status was Updated. + type: string + format: date-time + namespaces: + description: Namespaces is the set of target namespaces for the OperatorGroup. + type: array + items: + type: string + serviceAccountRef: + description: ServiceAccountRef references the service account object specified. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: false + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operators.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operators.crd.yaml new file mode 100644 index 0000000000..31b582b3b8 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-operators.crd.yaml @@ -0,0 +1,140 @@ +--- +# Source: olm/crds/0000_50_olm_00-operators.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: operators.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: Operator + listKind: OperatorList + plural: operators + singular: operator + scope: Cluster + versions: + - name: v1 + schema: + openAPIV3Schema: + description: Operator represents a cluster operator. + type: object + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorSpec defines the desired state of Operator + type: object + status: + description: OperatorStatus defines the observed state of an Operator and its components + type: object + properties: + components: + description: Components describes resources that compose the operator. + type: object + required: + - labelSelector + properties: + labelSelector: + description: LabelSelector is a label query over a set of resources used to select the operator's components + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + refs: + description: Refs are a set of references to the operator's component resources, selected with LabelSelector. + type: array + items: + description: RichReference is a reference to a resource, enriched with its status conditions. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + conditions: + description: Conditions represents the latest state of the component. + type: array + items: + description: Condition represent the latest available observations of an component's state. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: Last time the condition transitioned from one status to another. + type: string + format: date-time + lastUpdateTime: + description: Last time the condition was probed + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-subscriptions.crd.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-subscriptions.crd.yaml new file mode 100644 index 0000000000..d9769df42b --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_00-subscriptions.crd.yaml @@ -0,0 +1,1344 @@ +--- +# Source: olm/crds/0000_50_olm_00-subscriptions.crd.yaml +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: subscriptions.operators.coreos.com +spec: + group: operators.coreos.com + names: + categories: + - olm + kind: Subscription + listKind: SubscriptionList + plural: subscriptions + shortNames: + - sub + - subs + singular: subscription + scope: Namespaced + versions: + - additionalPrinterColumns: + - description: The package subscribed to + jsonPath: .spec.name + name: Package + type: string + - description: The catalog source for the specified package + jsonPath: .spec.source + name: Source + type: string + - description: The channel of updates to subscribe to + jsonPath: .spec.channel + name: Channel + type: string + name: v1alpha1 + schema: + openAPIV3Schema: + description: Subscription keeps operators up to date by tracking changes to Catalogs. + type: object + required: + - metadata + - spec + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SubscriptionSpec defines an Application that can be installed + type: object + required: + - name + - source + - sourceNamespace + properties: + channel: + type: string + config: + description: SubscriptionConfig contains configuration specified for a subscription. + type: object + properties: + env: + description: Env is a list of environment variables to set in the container. Cannot be updated. + type: array + items: + description: EnvVar represents an environment variable present in a Container. + type: object + required: + - name + properties: + name: + description: Name of the environment variable. Must be a C_IDENTIFIER. + type: string + value: + description: 'Variable references $(VAR_NAME) are expanded using the previous defined environment variables in the container and any service environment variables. If a variable cannot be resolved, the reference in the input string will be unchanged. The $(VAR_NAME) syntax can be escaped with a double $$, ie: $$(VAR_NAME). Escaped references will never be expanded, regardless of whether the variable exists or not. Defaults to "".' + type: string + valueFrom: + description: Source for the environment variable's value. Cannot be used if value is not empty. + type: object + properties: + configMapKeyRef: + description: Selects a key of a ConfigMap. + type: object + required: + - key + properties: + key: + description: The key to select. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its key must be defined + type: boolean + fieldRef: + description: 'Selects a field of the pod: supports metadata.name, metadata.namespace, `metadata.labels['''']`, `metadata.annotations['''']`, spec.nodeName, spec.serviceAccountName, status.hostIP, status.podIP, status.podIPs.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, limits.ephemeral-storage, requests.cpu, requests.memory and requests.ephemeral-storage) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secretKeyRef: + description: Selects a key of a secret in the pod's namespace + type: object + required: + - key + properties: + key: + description: The key of the secret to select from. Must be a valid secret key. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + envFrom: + description: EnvFrom is a list of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Immutable. + type: array + items: + description: EnvFromSource represents the source of a set of ConfigMaps + type: object + properties: + configMapRef: + description: The ConfigMap to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap must be defined + type: boolean + prefix: + description: An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER. + type: string + secretRef: + description: The Secret to select from + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret must be defined + type: boolean + nodeSelector: + description: 'NodeSelector is a selector which must be true for the pod to fit on a node. Selector which must match a node''s labels for the pod to be scheduled on that node. More info: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/' + type: object + additionalProperties: + type: string + resources: + description: 'Resources represents compute resources required by this container. Immutable. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + selector: + description: Selector is the label selector for pods to be configured. Existing ReplicaSets whose pods are selected by this will be the ones affected by this deployment. It must match the pod template's labels. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + tolerations: + description: Tolerations are the pod's tolerations. + type: array + items: + description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching operator . + type: object + properties: + effect: + description: Effect indicates the taint effect to match. Empty means match all taint effects. When specified, allowed values are NoSchedule, PreferNoSchedule and NoExecute. + type: string + key: + description: Key is the taint key that the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists; this combination means to match all values and all keys. + type: string + operator: + description: Operator represents a key's relationship to the value. Valid operators are Exists and Equal. Defaults to Equal. Exists is equivalent to wildcard for value, so that a pod can tolerate all taints of a particular category. + type: string + tolerationSeconds: + description: TolerationSeconds represents the period of time the toleration (which must be of effect NoExecute, otherwise this field is ignored) tolerates the taint. By default, it is not set, which means tolerate the taint forever (do not evict). Zero and negative values will be treated as 0 (evict immediately) by the system. + type: integer + format: int64 + value: + description: Value is the taint value the toleration matches to. If the operator is Exists, the value should be empty, otherwise just a regular string. + type: string + volumeMounts: + description: List of VolumeMounts to set in the container. + type: array + items: + description: VolumeMount describes a mounting of a Volume within a container. + type: object + required: + - mountPath + - name + properties: + mountPath: + description: Path within the container at which the volume should be mounted. Must not contain ':'. + type: string + mountPropagation: + description: mountPropagation determines how mounts are propagated from the host to container and the other way around. When not set, MountPropagationNone is used. This field is beta in 1.10. + type: string + name: + description: This must match the Name of a Volume. + type: string + readOnly: + description: Mounted read-only if true, read-write otherwise (false or unspecified). Defaults to false. + type: boolean + subPath: + description: Path within the volume from which the container's volume should be mounted. Defaults to "" (volume's root). + type: string + subPathExpr: + description: Expanded path within the volume from which the container's volume should be mounted. Behaves similarly to SubPath but environment variable references $(VAR_NAME) are expanded using the container's environment. Defaults to "" (volume's root). SubPathExpr and SubPath are mutually exclusive. + type: string + volumes: + description: List of Volumes to set in the podSpec. + type: array + items: + description: Volume represents a named volume in a pod that may be accessed by any container in the pod. + type: object + required: + - name + properties: + awsElasticBlockStore: + description: 'AWSElasticBlockStore represents an AWS Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty).' + type: integer + format: int32 + readOnly: + description: 'Specify "true" to force and set the ReadOnly property in VolumeMounts to "true". If omitted, the default is "false". More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: boolean + volumeID: + description: 'Unique ID of the persistent disk resource in AWS (Amazon EBS volume). More info: https://kubernetes.io/docs/concepts/storage/volumes#awselasticblockstore' + type: string + azureDisk: + description: AzureDisk represents an Azure Data Disk mount on the host and bind mount to the pod. + type: object + required: + - diskName + - diskURI + properties: + cachingMode: + description: 'Host Caching mode: None, Read Only, Read Write.' + type: string + diskName: + description: The Name of the data disk in the blob storage + type: string + diskURI: + description: The URI the data disk in the blob storage + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + kind: + description: 'Expected values Shared: multiple blob disks per storage account Dedicated: single blob disk per storage account Managed: azure managed data disk (only in managed availability set). defaults to shared' + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + azureFile: + description: AzureFile represents an Azure File Service mount on the host and bind mount to the pod. + type: object + required: + - secretName + - shareName + properties: + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretName: + description: the name of secret that contains Azure Storage Account Name and Key + type: string + shareName: + description: Share Name + type: string + cephfs: + description: CephFS represents a Ceph FS mount on the host that shares a pod's lifetime + type: object + required: + - monitors + properties: + monitors: + description: 'Required: Monitors is a collection of Ceph monitors More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: array + items: + type: string + path: + description: 'Optional: Used as the mounted root, rather than the full Ceph tree, default is /' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: boolean + secretFile: + description: 'Optional: SecretFile is the path to key ring for User, default is /etc/ceph/user.secret More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + secretRef: + description: 'Optional: SecretRef is reference to the authentication secret for User, default is empty. More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + user: + description: 'Optional: User is the rados user name, default is admin More info: https://examples.k8s.io/volumes/cephfs/README.md#how-to-use-it' + type: string + cinder: + description: 'Cinder represents a cinder volume attached and mounted on kubelets host machine. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: object + required: + - volumeID + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: boolean + secretRef: + description: 'Optional: points to a secret object containing parameters used to connect to OpenStack.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeID: + description: 'volume id used to identify the volume in cinder. More info: https://examples.k8s.io/mysql-cinder-pd/README.md' + type: string + configMap: + description: ConfigMap represents a configMap that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + csi: + description: CSI (Container Storage Interface) represents ephemeral storage that is handled by certain external CSI drivers (Beta feature). + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the CSI driver that handles this volume. Consult with your admin for the correct name as registered in the cluster. + type: string + fsType: + description: Filesystem type to mount. Ex. "ext4", "xfs", "ntfs". If not provided, the empty value is passed to the associated CSI driver which will determine the default filesystem to apply. + type: string + nodePublishSecretRef: + description: NodePublishSecretRef is a reference to the secret object containing sensitive information to pass to the CSI driver to complete the CSI NodePublishVolume and NodeUnpublishVolume calls. This field is optional, and may be empty if no secret is required. If the secret object contains more than one secret, all secret references are passed. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeAttributes: + description: VolumeAttributes stores driver-specific properties that are passed to the CSI driver. Consult your driver's documentation for supported values. + type: object + additionalProperties: + type: string + downwardAPI: + description: DownwardAPI represents downward API about the pod that should populate this volume + type: object + properties: + defaultMode: + description: 'Optional: mode bits to use on created files by default. Must be a Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: Items is a list of downward API volume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + emptyDir: + description: 'EmptyDir represents a temporary directory that shares a pod''s lifetime. More info: https://kubernetes.io/docs/concepts/storage/volumes#emptydir' + type: object + properties: + medium: + description: '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: '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' + 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 + ephemeral: + description: "Ephemeral represents a volume that is handled by a cluster storage driver (Alpha feature). The volume's lifecycle is tied to the pod that defines it - it will be created before the pod starts, and deleted when the pod is removed. \n Use this if: a) the volume is only needed while the pod runs, b) features of normal volumes like restoring from snapshot or capacity tracking are needed, c) the storage driver is specified through a storage class, and d) the storage driver supports dynamic volume provisioning through a PersistentVolumeClaim (see EphemeralVolumeSource for more information on the connection between this volume type and PersistentVolumeClaim). \n Use PersistentVolumeClaim or one of the vendor-specific APIs for volumes that persist for longer than the lifecycle of an individual pod. \n Use CSI for light-weight local ephemeral volumes if the CSI driver is meant to be used that way - see the documentation of the driver for more information. \n A pod can use both types of ephemeral volumes and persistent volumes at the same time." + type: object + properties: + readOnly: + description: Specifies a read-only configuration for the volume. Defaults to false (read/write). + type: boolean + volumeClaimTemplate: + description: "Will be used to create a stand-alone PVC to provision the volume. The pod in which this EphemeralVolumeSource is embedded will be the owner of the PVC, i.e. the PVC will be deleted together with the pod. The name of the PVC will be `-` where `` is the name from the `PodSpec.Volumes` array entry. Pod validation will reject the pod if the concatenated name is not valid for a PVC (for example, too long). \n An existing PVC with that name that is not owned by the pod will *not* be used for the pod to avoid using an unrelated volume by mistake. Starting the pod is then blocked until the unrelated PVC is removed. If such a pre-created PVC is meant to be used by the pod, the PVC has to updated with an owner reference to the pod once the pod exists. Normally this should not be necessary, but it may be useful when manually reconstructing a broken cluster. \n This field is read-only and no changes will be made by Kubernetes to the PVC after it has been created. \n Required, must not be nil." + type: object + required: + - spec + properties: + metadata: + description: May contain labels and annotations that will be copied into the PVC when creating it. No other fields are allowed and will be rejected during validation. + type: object + spec: + description: The specification for the PersistentVolumeClaim. The entire content is copied unchanged into the PVC that gets created from this template. The same fields as in a PersistentVolumeClaim are also valid here. + type: object + properties: + accessModes: + description: 'AccessModes contains the desired access modes the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes-1' + type: array + items: + type: string + dataSource: + description: 'This field can be used to specify either: * An existing VolumeSnapshot object (snapshot.storage.k8s.io/VolumeSnapshot) * An existing PVC (PersistentVolumeClaim) * An existing custom resource that implements data population (Alpha) In order to use custom resource types that implement data population, the AnyVolumeDataSource feature gate must be enabled. If the provisioner or an external controller can support the specified data source, it will create a new volume based on the contents of the specified data source.' + type: object + required: + - kind + - name + properties: + apiGroup: + description: APIGroup is the group for the resource being referenced. If APIGroup is not specified, the specified Kind must be in the core API group. For any other third-party types, APIGroup is required. + type: string + kind: + description: Kind is the type of resource being referenced + type: string + name: + description: Name is the name of resource being referenced + type: string + resources: + description: 'Resources represents the minimum resources the volume should have. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#resources' + type: object + properties: + limits: + description: 'Limits describes the maximum amount of compute resources allowed. More info: https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/' + type: object + additionalProperties: + 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 + 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-compute-resources-container/' + type: object + additionalProperties: + 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 + selector: + description: A label query over volumes to consider for binding. + type: object + properties: + matchExpressions: + description: matchExpressions is a list of label selector requirements. The requirements are ANDed. + type: array + items: + description: A label selector requirement is a selector that contains values, a key, and an operator that relates the key and values. + type: object + required: + - key + - operator + properties: + key: + description: key is the label key that the selector applies to. + type: string + operator: + description: operator represents a key's relationship to a set of values. Valid operators are In, NotIn, Exists and DoesNotExist. + type: string + values: + description: values is an array of string values. If the operator is In or NotIn, the values array must be non-empty. If the operator is Exists or DoesNotExist, the values array must be empty. This array is replaced during a strategic merge patch. + type: array + items: + type: string + matchLabels: + description: matchLabels is a map of {key,value} pairs. A single {key,value} in the matchLabels map is equivalent to an element of matchExpressions, whose key field is "key", the operator is "In", and the values array contains only "value". The requirements are ANDed. + type: object + additionalProperties: + type: string + storageClassName: + description: 'Name of the StorageClass required by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1' + type: string + volumeMode: + description: volumeMode defines what type of volume is required by the claim. Value of Filesystem is implied when not included in claim spec. + type: string + volumeName: + description: VolumeName is the binding reference to the PersistentVolume backing this claim. + type: string + fc: + description: FC represents a Fibre Channel resource that is attached to a kubelet's host machine and then exposed to the pod. + type: object + properties: + fsType: + description: 'Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + lun: + description: 'Optional: FC target lun number' + type: integer + format: int32 + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + targetWWNs: + description: 'Optional: FC target worldwide names (WWNs)' + type: array + items: + type: string + wwids: + description: 'Optional: FC volume world wide identifiers (wwids) Either wwids or combination of targetWWNs and lun must be set, but not both simultaneously.' + type: array + items: + type: string + flexVolume: + description: FlexVolume represents a generic volume resource that is provisioned/attached using an exec based plugin. + type: object + required: + - driver + properties: + driver: + description: Driver is the name of the driver to use for this volume. + type: string + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". The default filesystem depends on FlexVolume script. + type: string + options: + description: 'Optional: Extra command options if any.' + type: object + additionalProperties: + type: string + readOnly: + description: 'Optional: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts.' + type: boolean + secretRef: + description: 'Optional: SecretRef is reference to the secret object containing sensitive information to pass to the plugin scripts. This may be empty if no secret object is specified. If the secret object contains more than one secret, all secrets are passed to the plugin scripts.' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + flocker: + description: Flocker represents a Flocker volume attached to a kubelet's host machine. This depends on the Flocker control service being running + type: object + properties: + datasetName: + description: Name of the dataset stored as metadata -> name on the dataset for Flocker should be considered as deprecated + type: string + datasetUUID: + description: UUID of the dataset. This is unique identifier of a Flocker dataset + type: string + gcePersistentDisk: + description: 'GCEPersistentDisk represents a GCE Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: object + required: + - pdName + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + partition: + description: 'The partition in the volume that you want to mount. If omitted, the default is to mount by volume name. Examples: For volume /dev/sda1, you specify the partition as "1". Similarly, the volume partition for /dev/sda is "0" (or you can leave the property empty). More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: integer + format: int32 + pdName: + description: 'Unique name of the PD resource in GCE. Used to identify the disk in GCE. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#gcepersistentdisk' + type: boolean + gitRepo: + description: 'GitRepo represents a git repository at a particular revision. DEPRECATED: GitRepo is deprecated. To provision a container with a git repo, mount an EmptyDir into an InitContainer that clones the repo using git, then mount the EmptyDir into the Pod''s container.' + type: object + required: + - repository + properties: + directory: + description: Target directory name. Must not contain or start with '..'. If '.' is supplied, the volume directory will be the git repository. Otherwise, if specified, the volume will contain the git repository in the subdirectory with the given name. + type: string + repository: + description: Repository URL + type: string + revision: + description: Commit hash for the specified revision. + type: string + glusterfs: + description: 'Glusterfs represents a Glusterfs mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/glusterfs/README.md' + type: object + required: + - endpoints + - path + properties: + endpoints: + description: 'EndpointsName is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + path: + description: 'Path is the Glusterfs volume path. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: string + readOnly: + description: 'ReadOnly here will force the Glusterfs volume to be mounted with read-only permissions. Defaults to false. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod' + type: boolean + hostPath: + description: 'HostPath represents a pre-existing file or directory on the host machine that is directly exposed to the container. This is generally used for system agents or other privileged things that are allowed to see the host machine. Most containers will NOT need this. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath --- TODO(jonesdl) We need to restrict who can use host directory mounts and who can/can not mount host directories as read/write.' + type: object + required: + - path + properties: + path: + description: 'Path of the directory on the host. If the path is a symlink, it will follow the link to the real path. More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + type: + description: 'Type for HostPath Volume Defaults to "" More info: https://kubernetes.io/docs/concepts/storage/volumes#hostpath' + type: string + iscsi: + description: 'ISCSI represents an ISCSI Disk resource that is attached to a kubelet''s host machine and then exposed to the pod. More info: https://examples.k8s.io/volumes/iscsi/README.md' + type: object + required: + - iqn + - lun + - targetPortal + properties: + chapAuthDiscovery: + description: whether support iSCSI Discovery CHAP authentication + type: boolean + chapAuthSession: + description: whether support iSCSI Session CHAP authentication + type: boolean + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#iscsi TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + initiatorName: + description: Custom iSCSI Initiator Name. If initiatorName is specified with iscsiInterface simultaneously, new iSCSI interface : will be created for the connection. + type: string + iqn: + description: Target iSCSI Qualified Name. + type: string + iscsiInterface: + description: iSCSI Interface Name that uses an iSCSI transport. Defaults to 'default' (tcp). + type: string + lun: + description: iSCSI Target Lun number. + type: integer + format: int32 + portals: + description: iSCSI Target Portal List. The portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: array + items: + type: string + readOnly: + description: ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. + type: boolean + secretRef: + description: CHAP Secret for iSCSI target and initiator authentication + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + targetPortal: + description: iSCSI Target Portal. The Portal is either an IP or ip_addr:port if the port is other than default (typically TCP ports 860 and 3260). + type: string + name: + description: 'Volume''s name. Must be a DNS_LABEL and unique within the pod. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + nfs: + description: 'NFS represents an NFS mount on the host that shares a pod''s lifetime More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: object + required: + - path + - server + properties: + path: + description: 'Path that is exported by the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + readOnly: + description: 'ReadOnly here will force the NFS export to be mounted with read-only permissions. Defaults to false. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: boolean + server: + description: 'Server is the hostname or IP address of the NFS server. More info: https://kubernetes.io/docs/concepts/storage/volumes#nfs' + type: string + persistentVolumeClaim: + description: 'PersistentVolumeClaimVolumeSource represents a reference to a PersistentVolumeClaim in the same namespace. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: object + required: + - claimName + properties: + claimName: + description: 'ClaimName is the name of a PersistentVolumeClaim in the same namespace as the pod using this volume. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#persistentvolumeclaims' + type: string + readOnly: + description: Will force the ReadOnly setting in VolumeMounts. Default false. + type: boolean + photonPersistentDisk: + description: PhotonPersistentDisk represents a PhotonController persistent disk attached and mounted on kubelets host machine + type: object + required: + - pdID + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + pdID: + description: ID that identifies Photon Controller persistent disk + type: string + portworxVolume: + description: PortworxVolume represents a portworx volume attached and mounted on kubelets host machine + type: object + required: + - volumeID + properties: + fsType: + description: FSType represents the filesystem type to mount Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + volumeID: + description: VolumeID uniquely identifies a Portworx volume + type: string + projected: + description: Items for all in one resources secrets, configmaps, and downward API + type: object + properties: + defaultMode: + description: Mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set. + type: integer + format: int32 + sources: + description: list of volume projections + type: array + items: + description: Projection that may be projected along with other supported volume types + type: object + properties: + configMap: + description: information about the configMap data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced ConfigMap will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the ConfigMap, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the ConfigMap or its keys must be defined + type: boolean + downwardAPI: + description: information about the downwardAPI data to project + type: object + properties: + items: + description: Items is a list of DownwardAPIVolume file + type: array + items: + description: DownwardAPIVolumeFile represents information to create the file containing the pod field + type: object + required: + - path + properties: + fieldRef: + description: 'Required: Selects a field of the pod: only annotations, labels, name and namespace are supported.' + type: object + required: + - fieldPath + properties: + apiVersion: + description: Version of the schema the FieldPath is written in terms of, defaults to "v1". + type: string + fieldPath: + description: Path of the field to select in the specified API version. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file, must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: 'Required: Path is the relative path name of the file to be created. Must not be absolute or contain the ''..'' path. Must be utf-8 encoded. The first item of the relative path must not start with ''..''' + type: string + resourceFieldRef: + description: 'Selects a resource of the container: only resources limits and requests (limits.cpu, limits.memory, requests.cpu and requests.memory) are currently supported.' + type: object + required: + - resource + properties: + containerName: + description: 'Container name: required for volumes, optional for env vars' + type: string + divisor: + description: Specifies the output format of the exposed resources, defaults to "1" + 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 + resource: + description: 'Required: resource to select' + type: string + secret: + description: information about the secret data to project + type: object + properties: + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + optional: + description: Specify whether the Secret or its key must be defined + type: boolean + serviceAccountToken: + description: information about the serviceAccountToken data to project + type: object + required: + - path + properties: + audience: + description: Audience is the intended audience of the token. A recipient of a token must identify itself with an identifier specified in the audience of the token, and otherwise should reject the token. The audience defaults to the identifier of the apiserver. + type: string + expirationSeconds: + description: ExpirationSeconds is the requested duration of validity of the service account token. As the token approaches expiration, the kubelet volume plugin will proactively rotate the service account token. The kubelet will start trying to rotate the token if the token is older than 80 percent of its time to live or if the token is older than 24 hours.Defaults to 1 hour and must be at least 10 minutes. + type: integer + format: int64 + path: + description: Path is the path relative to the mount point of the file to project the token into. + type: string + quobyte: + description: Quobyte represents a Quobyte mount on the host that shares a pod's lifetime + type: object + required: + - registry + - volume + properties: + group: + description: Group to map volume access to Default is no group + type: string + readOnly: + description: ReadOnly here will force the Quobyte volume to be mounted with read-only permissions. Defaults to false. + type: boolean + registry: + description: Registry represents a single or multiple Quobyte Registry services specified as a string as host:port pair (multiple entries are separated with commas) which acts as the central registry for volumes + type: string + tenant: + description: Tenant owning the given Quobyte volume in the Backend Used with dynamically provisioned Quobyte volumes, value is set by the plugin + type: string + user: + description: User to map volume access to Defaults to serivceaccount user + type: string + volume: + description: Volume is a string that references an already created Quobyte volume by name. + type: string + rbd: + description: 'RBD represents a Rados Block Device mount on the host that shares a pod''s lifetime. More info: https://examples.k8s.io/volumes/rbd/README.md' + type: object + required: + - image + - monitors + properties: + fsType: + description: 'Filesystem type of the volume that you want to mount. Tip: Ensure that the filesystem type is supported by the host operating system. Examples: "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. More info: https://kubernetes.io/docs/concepts/storage/volumes#rbd TODO: how do we prevent errors in the filesystem from compromising the machine' + type: string + image: + description: 'The rados image name. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + keyring: + description: 'Keyring is the path to key ring for RBDUser. Default is /etc/ceph/keyring. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + monitors: + description: 'A collection of Ceph monitors. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: array + items: + type: string + pool: + description: 'The rados pool name. Default is rbd. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + readOnly: + description: 'ReadOnly here will force the ReadOnly setting in VolumeMounts. Defaults to false. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: boolean + secretRef: + description: 'SecretRef is name of the authentication secret for RBDUser. If provided overrides keyring. Default is nil. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + user: + description: 'The rados user name. Default is admin. More info: https://examples.k8s.io/volumes/rbd/README.md#how-to-use-it' + type: string + scaleIO: + description: ScaleIO represents a ScaleIO persistent volume attached and mounted on Kubernetes nodes. + type: object + required: + - gateway + - secretRef + - system + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Default is "xfs". + type: string + gateway: + description: The host address of the ScaleIO API Gateway. + type: string + protectionDomain: + description: The name of the ScaleIO Protection Domain for the configured storage. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef references to the secret for ScaleIO user and other sensitive information. If this is not provided, Login operation will fail. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + sslEnabled: + description: Flag to enable/disable SSL communication with Gateway, default false + type: boolean + storageMode: + description: Indicates whether the storage for a volume should be ThickProvisioned or ThinProvisioned. Default is ThinProvisioned. + type: string + storagePool: + description: The ScaleIO Storage Pool associated with the protection domain. + type: string + system: + description: The name of the storage system as configured in ScaleIO. + type: string + volumeName: + description: The name of a volume already created in the ScaleIO system that is associated with this volume source. + type: string + secret: + description: 'Secret represents a secret that should populate this volume. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: object + properties: + defaultMode: + description: 'Optional: mode bits used to set permissions on created files by default. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. Defaults to 0644. Directories within the path are not affected by this setting. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + items: + description: If unspecified, each key-value pair in the Data field of the referenced Secret will be projected into the volume as a file whose name is the key and content is the value. If specified, the listed keys will be projected into the specified paths, and unlisted keys will not be present. If a key is specified which is not present in the Secret, the volume setup will error unless it is marked optional. Paths must be relative and may not contain the '..' path or start with '..'. + type: array + items: + description: Maps a string key to a path within a volume. + type: object + required: + - key + - path + properties: + key: + description: The key to project. + type: string + mode: + description: 'Optional: mode bits used to set permissions on this file. Must be an octal value between 0000 and 0777 or a decimal value between 0 and 511. YAML accepts both octal and decimal values, JSON requires decimal values for mode bits. If not specified, the volume defaultMode will be used. This might be in conflict with other options that affect the file mode, like fsGroup, and the result can be other mode bits set.' + type: integer + format: int32 + path: + description: The relative path of the file to map the key to. May not be an absolute path. May not contain the path element '..'. May not start with the string '..'. + type: string + optional: + description: Specify whether the Secret or its keys must be defined + type: boolean + secretName: + description: 'Name of the secret in the pod''s namespace to use. More info: https://kubernetes.io/docs/concepts/storage/volumes#secret' + type: string + storageos: + description: StorageOS represents a StorageOS volume attached and mounted on Kubernetes nodes. + type: object + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + readOnly: + description: Defaults to false (read/write). ReadOnly here will force the ReadOnly setting in VolumeMounts. + type: boolean + secretRef: + description: SecretRef specifies the secret to use for obtaining the StorageOS API credentials. If not specified, default values will be attempted. + type: object + properties: + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names TODO: Add other useful fields. apiVersion, kind, uid?' + type: string + volumeName: + description: VolumeName is the human-readable name of the StorageOS volume. Volume names are only unique within a namespace. + type: string + volumeNamespace: + description: VolumeNamespace specifies the scope of the volume within StorageOS. If no namespace is specified then the Pod's namespace will be used. This allows the Kubernetes name scoping to be mirrored within StorageOS for tighter integration. Set VolumeName to any name to override the default behaviour. Set to "default" if you are not using namespaces within StorageOS. Namespaces that do not pre-exist within StorageOS will be created. + type: string + vsphereVolume: + description: VsphereVolume represents a vSphere volume attached and mounted on kubelets host machine + type: object + required: + - volumePath + properties: + fsType: + description: Filesystem type to mount. Must be a filesystem type supported by the host operating system. Ex. "ext4", "xfs", "ntfs". Implicitly inferred to be "ext4" if unspecified. + type: string + storagePolicyID: + description: Storage Policy Based Management (SPBM) profile ID associated with the StoragePolicyName. + type: string + storagePolicyName: + description: Storage Policy Based Management (SPBM) profile name. + type: string + volumePath: + description: Path that identifies vSphere volume vmdk + type: string + installPlanApproval: + description: Approval is the user approval policy for an InstallPlan. It must be one of "Automatic" or "Manual". + type: string + name: + type: string + source: + type: string + sourceNamespace: + type: string + startingCSV: + type: string + status: + type: object + required: + - lastUpdated + properties: + catalogHealth: + description: CatalogHealth contains the Subscription's view of its relevant CatalogSources' status. It is used to determine SubscriptionStatusConditions related to CatalogSources. + type: array + items: + description: SubscriptionCatalogHealth describes the health of a CatalogSource the Subscription knows about. + type: object + required: + - catalogSourceRef + - healthy + - lastUpdated + properties: + catalogSourceRef: + description: CatalogSourceRef is a reference to a CatalogSource. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + healthy: + description: Healthy is true if the CatalogSource is healthy; false otherwise. + type: boolean + lastUpdated: + description: LastUpdated represents the last time that the CatalogSourceHealth changed + type: string + format: date-time + conditions: + description: Conditions is a list of the latest available observations about a Subscription's current state. + type: array + items: + description: SubscriptionCondition represents the latest available observations of a Subscription's state. + type: object + required: + - status + - type + properties: + lastHeartbeatTime: + description: LastHeartbeatTime is the last time we got an update on a given condition + type: string + format: date-time + lastTransitionTime: + description: LastTransitionTime is the last time the condition transit from one status to another + type: string + format: date-time + message: + description: Message is a human-readable message indicating details about last transition. + type: string + reason: + description: Reason is a one-word CamelCase reason for the condition's last transition. + type: string + status: + description: Status is the status of the condition, one of True, False, Unknown. + type: string + type: + description: Type is the type of Subscription condition. + type: string + currentCSV: + description: CurrentCSV is the CSV the Subscription is progressing to. + type: string + installPlanGeneration: + description: InstallPlanGeneration is the current generation of the installplan + type: integer + installPlanRef: + description: InstallPlanRef is a reference to the latest InstallPlan that contains the Subscription's current CSV. + type: object + properties: + apiVersion: + description: API version of the referent. + type: string + fieldPath: + description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' + type: string + kind: + description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + name: + description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' + type: string + namespace: + description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' + type: string + resourceVersion: + description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' + type: string + uid: + description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' + type: string + installedCSV: + description: InstalledCSV is the CSV currently installed by the Subscription. + type: string + installplan: + description: 'Install is a reference to the latest InstallPlan generated for the Subscription. DEPRECATED: InstallPlanRef' + type: object + required: + - apiVersion + - kind + - name + - uuid + properties: + apiVersion: + type: string + kind: + type: string + name: + type: string + uuid: + description: UID is a type that holds unique ID values, including UUIDs. Because we don't ONLY use UUIDs, this is an alias to string. Being a type captures intent and helps make sure that UIDs and names do not get conflated. + type: string + lastUpdated: + description: LastUpdated represents the last time that the Subscription status was updated. + type: string + format: date-time + reason: + description: Reason is the reason the Subscription was transitioned to its current state. + type: string + state: + description: State represents the current state of the Subscription + type: string + served: true + storage: true + subresources: + status: {} + diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_01-olm-operator.serviceaccount.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_01-olm-operator.serviceaccount.yaml new file mode 100644 index 0000000000..e21d33d03d --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_01-olm-operator.serviceaccount.yaml @@ -0,0 +1,33 @@ +--- +# Source: olm/templates/0000_50_olm_01-olm-operator.serviceaccount.yaml +kind: ServiceAccount +apiVersion: v1 +metadata: + name: olm-operator-serviceaccount + namespace: olm +--- +# Source: olm/templates/0000_50_olm_01-olm-operator.serviceaccount.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: system:controller:operator-lifecycle-manager +rules: +- apiGroups: ["*"] + resources: ["*"] + verbs: ["*"] +- nonResourceURLs: ["*"] + verbs: ["*"] +--- +# Source: olm/templates/0000_50_olm_01-olm-operator.serviceaccount.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: olm-operator-binding-olm +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: system:controller:operator-lifecycle-manager +subjects: +- kind: ServiceAccount + name: olm-operator-serviceaccount + namespace: olm diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_07-olm-operator.deployment.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_07-olm-operator.deployment.yaml new file mode 100644 index 0000000000..9d5fe26b9e --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_07-olm-operator.deployment.yaml @@ -0,0 +1,60 @@ +--- +# Source: olm/templates/0000_50_olm_07-olm-operator.deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: olm-operator + namespace: olm + labels: + app: olm-operator +spec: + strategy: + type: RollingUpdate + replicas: 1 + selector: + matchLabels: + app: olm-operator + template: + metadata: + labels: + app: olm-operator + spec: + serviceAccountName: olm-operator-serviceaccount + containers: + - name: olm-operator + command: + - /bin/olm + args: + - --namespace + - $(OPERATOR_NAMESPACE) + - --writeStatusName + - "" + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + - containerPort: 8081 + name: metrics + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: 8080 + readinessProbe: + httpGet: + path: /healthz + port: 8080 + terminationMessagePolicy: FallbackToLogsOnError + env: + - name: OPERATOR_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: OPERATOR_NAME + value: olm-operator + resources: + requests: + cpu: 10m + memory: 160Mi + nodeSelector: + kubernetes.io/os: linux diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_08-catalog-operator.deployment.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_08-catalog-operator.deployment.yaml new file mode 100644 index 0000000000..169fb6f6a5 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_08-catalog-operator.deployment.yaml @@ -0,0 +1,54 @@ +--- +# Source: olm/templates/0000_50_olm_08-catalog-operator.deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: catalog-operator + namespace: olm + labels: + app: catalog-operator +spec: + strategy: + type: RollingUpdate + replicas: 1 + selector: + matchLabels: + app: catalog-operator + template: + metadata: + labels: + app: catalog-operator + spec: + serviceAccountName: olm-operator-serviceaccount + containers: + - name: catalog-operator + command: + - /bin/catalog + args: + - '-namespace' + - olm + - -configmapServerImage=quay.io/operator-framework/configmap-operator-registry:latest + - -util-image + - quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed + imagePullPolicy: IfNotPresent + ports: + - containerPort: 8080 + - containerPort: 8081 + name: metrics + protocol: TCP + livenessProbe: + httpGet: + path: /healthz + port: 8080 + readinessProbe: + httpGet: + path: /healthz + port: 8080 + terminationMessagePolicy: FallbackToLogsOnError + resources: + requests: + cpu: 10m + memory: 80Mi + nodeSelector: + kubernetes.io/os: linux diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_09-aggregated.clusterrole.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_09-aggregated.clusterrole.yaml new file mode 100644 index 0000000000..e7aa0af341 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_09-aggregated.clusterrole.yaml @@ -0,0 +1,35 @@ +--- +# Source: olm/templates/0000_50_olm_09-aggregated.clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: aggregate-olm-edit + labels: + # Add these permissions to the "admin" and "edit" default roles. + rbac.authorization.k8s.io/aggregate-to-admin: "true" + rbac.authorization.k8s.io/aggregate-to-edit: "true" +rules: +- apiGroups: ["operators.coreos.com"] + resources: ["subscriptions"] + verbs: ["create", "update", "patch", "delete"] +- apiGroups: ["operators.coreos.com"] + resources: ["clusterserviceversions", "catalogsources", "installplans", "subscriptions"] + verbs: ["delete"] +--- +# Source: olm/templates/0000_50_olm_09-aggregated.clusterrole.yaml +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: aggregate-olm-view + labels: + # Add these permissions to the "admin", "edit" and "view" default roles + rbac.authorization.k8s.io/aggregate-to-admin: "true" + rbac.authorization.k8s.io/aggregate-to-edit: "true" + rbac.authorization.k8s.io/aggregate-to-view: "true" +rules: +- apiGroups: ["operators.coreos.com"] + resources: ["clusterserviceversions", "catalogsources", "installplans", "subscriptions", "operatorgroups"] + verbs: ["get", "list", "watch"] +- apiGroups: ["packages.operators.coreos.com"] + resources: ["packagemanifests", "packagemanifests/icon"] + verbs: ["get", "list", "watch"] diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_13-operatorgroup-default.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_13-operatorgroup-default.yaml new file mode 100644 index 0000000000..56f5bca2bd --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_13-operatorgroup-default.yaml @@ -0,0 +1,17 @@ +--- +# Source: olm/templates/0000_50_olm_13-operatorgroup-default.yaml +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: global-operators + namespace: operators +--- +# Source: olm/templates/0000_50_olm_13-operatorgroup-default.yaml +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: olm-operators + namespace: olm +spec: + targetNamespaces: + - olm diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_15-packageserver.clusterserviceversion.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_15-packageserver.clusterserviceversion.yaml new file mode 100644 index 0000000000..ec592b9f38 --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_15-packageserver.clusterserviceversion.yaml @@ -0,0 +1,135 @@ +--- +# Source: olm/templates/0000_50_olm_15-packageserver.clusterserviceversion.yaml +apiVersion: operators.coreos.com/v1alpha1 +kind: ClusterServiceVersion +metadata: + name: packageserver + namespace: olm + labels: + olm.version: 0.18.3 +spec: + displayName: Package Server + description: Represents an Operator package that is available from a given CatalogSource which will resolve to a ClusterServiceVersion. + minKubeVersion: 1.11.0 + keywords: ['packagemanifests', 'olm', 'packages'] + maintainers: + - name: Red Hat + email: openshift-operators@redhat.com + provider: + name: Red Hat + links: + - name: Package Server + url: https://github.com/operator-framework/operator-lifecycle-manager/tree/master/pkg/package-server + installModes: + - type: OwnNamespace + supported: true + - type: SingleNamespace + supported: true + - type: MultiNamespace + supported: true + - type: AllNamespaces + supported: true + install: + strategy: deployment + spec: + clusterPermissions: + - serviceAccountName: olm-operator-serviceaccount + rules: + - apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create + - get + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - apiGroups: + - "operators.coreos.com" + resources: + - catalogsources + verbs: + - get + - list + - watch + - apiGroups: + - "packages.operators.coreos.com" + resources: + - packagemanifests + verbs: + - get + - list + deployments: + - name: packageserver + spec: + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 1 + maxSurge: 1 + replicas: 2 + selector: + matchLabels: + app: packageserver + template: + metadata: + labels: + app: packageserver + spec: + serviceAccountName: olm-operator-serviceaccount + nodeSelector: + kubernetes.io/os: linux + containers: + - name: packageserver + command: + - /bin/package-server + - -v=4 + - --secure-port + - "5443" + - --global-namespace + - olm + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed + imagePullPolicy: Always + ports: + - containerPort: 5443 + livenessProbe: + httpGet: + scheme: HTTPS + path: /healthz + port: 5443 + readinessProbe: + httpGet: + scheme: HTTPS + path: /healthz + port: 5443 + terminationMessagePolicy: FallbackToLogsOnError + resources: + requests: + cpu: 10m + memory: 50Mi + securityContext: + runAsUser: 1000 + volumeMounts: + - name: tmpfs + mountPath: /tmp + volumes: + - name: tmpfs + emptyDir: {} + maturity: alpha + version: 0.18.3 + apiservicedefinitions: + owned: + - group: packages.operators.coreos.com + version: v1 + kind: PackageManifest + name: packagemanifests + displayName: PackageManifest + description: A PackageManifest is a resource generated from existing CatalogSources and their ConfigMaps + deploymentName: packageserver + containerPort: 5443 diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_17-upstream-operators.catalogsource.yaml b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_17-upstream-operators.catalogsource.yaml new file mode 100644 index 0000000000..50da73f93f --- /dev/null +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/0.18.3/0000_50_olm_17-upstream-operators.catalogsource.yaml @@ -0,0 +1,15 @@ +--- +# Source: olm/templates/0000_50_olm_17-upstream-operators.catalogsource.yaml +apiVersion: operators.coreos.com/v1alpha1 +kind: CatalogSource +metadata: + name: operatorhubio-catalog + namespace: olm +spec: + sourceType: grpc + image: quay.io/operatorhubio/catalog:latest + displayName: Community Operators + publisher: OperatorHub.io + updateStrategy: + registryPoll: + interval: 60m diff --git a/staging/operator-lifecycle-manager/deploy/upstream/manifests/latest b/staging/operator-lifecycle-manager/deploy/upstream/manifests/latest index 26e7bfac65..dbfa849a36 120000 --- a/staging/operator-lifecycle-manager/deploy/upstream/manifests/latest +++ b/staging/operator-lifecycle-manager/deploy/upstream/manifests/latest @@ -1 +1 @@ -./0.18.1 \ No newline at end of file +./0.18.3 \ No newline at end of file diff --git a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/crds.yaml b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/crds.yaml index 3c3e418047..b1b3ed6f62 100644 --- a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/crds.yaml +++ b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/crds.yaml @@ -5409,6 +5409,170 @@ spec: maxLength: 316 pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ served: true + storage: false + subresources: + status: {} + - name: v2 + schema: + openAPIV3Schema: + description: OperatorCondition is a Custom Resource of type `OperatorCondition` which is used to convey information to OLM about the state of an operator. + type: object + required: + - metadata + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: OperatorConditionSpec allows an operator to report state to OLM and provides cluster admin with the ability to manually override state reported by the operator. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + deployments: + type: array + items: + type: string + overrides: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + serviceAccounts: + type: array + items: + type: string + status: + description: OperatorConditionStatus allows OLM to convey which conditions have been observed. + type: object + properties: + conditions: + type: array + items: + description: "Condition contains details for one aspect of the current state of this API Resource. --- This struct is intended for direct use as an array at the field path .status.conditions. For example, type FooStatus struct{ // Represents the observations of a foo's current state. // Known .status.conditions.type are: \"Available\", \"Progressing\", and \"Degraded\" // +patchMergeKey=type // +patchStrategy=merge // +listType=map // +listMapKey=type Conditions []metav1.Condition `json:\"conditions,omitempty\" patchStrategy:\"merge\" patchMergeKey:\"type\" protobuf:\"bytes,1,rep,name=conditions\"` \n // other fields }" + type: object + required: + - lastTransitionTime + - message + - reason + - status + - type + properties: + lastTransitionTime: + description: lastTransitionTime is the last time the condition transitioned from one status to another. This should be when the underlying condition changed. If that is not known, then using the time when the API field changed is acceptable. + type: string + format: date-time + message: + description: message is a human readable message indicating details about the transition. This may be an empty string. + type: string + maxLength: 32768 + observedGeneration: + description: observedGeneration represents the .metadata.generation that the condition was set based upon. For instance, if .metadata.generation is currently 12, but the .status.conditions[x].observedGeneration is 9, the condition is out of date with respect to the current state of the instance. + type: integer + format: int64 + minimum: 0 + reason: + description: reason contains a programmatic identifier indicating the reason for the condition's last transition. Producers of specific condition types may define expected values and meanings for this field, and whether the values are considered a guaranteed API. The value should be a CamelCase string. This field may not be empty. + type: string + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + status: + description: status of the condition, one of True, False, Unknown. + type: string + enum: + - "True" + - "False" + - Unknown + type: + description: type of condition in CamelCase or in foo.example.com/CamelCase. --- Many .condition.type values are consistent across resources like Available, but because arbitrary conditions can be useful (see .node.status.conditions), the ability to deconflict is important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt) + type: string + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + served: true storage: true subresources: status: {} diff --git a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/install.sh b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/install.sh index 6f4e9fab1b..35c65b35ce 100755 --- a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/install.sh +++ b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/install.sh @@ -14,6 +14,11 @@ if [[ ${#@} -lt 1 || ${#@} -gt 2 ]]; then exit 1 fi +if kubectl get deployment olm-operator -n openshift-operator-lifecycle-manager -o=jsonpath='{.spec}' > /dev/null 2>&1; then + echo "OLM is already installed in a different configuration. This is common if you are not running a vanilla Kubernetes cluster. Exiting..." + exit 1 +fi + release="$1" base_url="${2:-${default_base_url}}" url="${base_url}/${release}" diff --git a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml index 810e8907b0..d011cbf1ee 100644 --- a/staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml +++ b/staging/operator-lifecycle-manager/deploy/upstream/quickstart/olm.yaml @@ -68,7 +68,7 @@ spec: - $(OPERATOR_NAMESPACE) - --writeStatusName - "" - image: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed imagePullPolicy: IfNotPresent ports: - containerPort: 8080 @@ -85,7 +85,6 @@ spec: port: 8080 terminationMessagePolicy: FallbackToLogsOnError env: - - name: OPERATOR_NAMESPACE valueFrom: fieldRef: @@ -96,8 +95,6 @@ spec: requests: cpu: 10m memory: 160Mi - - nodeSelector: kubernetes.io/os: linux --- @@ -130,8 +127,8 @@ spec: - olm - -configmapServerImage=quay.io/operator-framework/configmap-operator-registry:latest - -util-image - - quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 - image: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + - quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed imagePullPolicy: IfNotPresent ports: - containerPort: 8080 @@ -147,14 +144,10 @@ spec: path: /healthz port: 8080 terminationMessagePolicy: FallbackToLogsOnError - env: - resources: requests: cpu: 10m memory: 80Mi - - nodeSelector: kubernetes.io/os: linux --- @@ -210,7 +203,7 @@ metadata: name: packageserver namespace: olm labels: - olm.version: 0.18.1 + olm.version: 0.18.3 spec: displayName: Package Server description: Represents an Operator package that is available from a given CatalogSource which will resolve to a ClusterServiceVersion. @@ -298,7 +291,7 @@ spec: - "5443" - --global-namespace - olm - image: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + image: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed imagePullPolicy: Always ports: - containerPort: 5443 @@ -326,7 +319,7 @@ spec: - name: tmpfs emptyDir: {} maturity: alpha - version: 0.18.1 + version: 0.18.3 apiservicedefinitions: owned: - group: packages.operators.coreos.com @@ -348,3 +341,6 @@ spec: image: quay.io/operatorhubio/catalog:latest displayName: Community Operators publisher: OperatorHub.io + updateStrategy: + registryPoll: + interval: 60m diff --git a/staging/operator-lifecycle-manager/deploy/upstream/values.yaml b/staging/operator-lifecycle-manager/deploy/upstream/values.yaml index 723fa98d55..ccfa1e0166 100644 --- a/staging/operator-lifecycle-manager/deploy/upstream/values.yaml +++ b/staging/operator-lifecycle-manager/deploy/upstream/values.yaml @@ -9,14 +9,14 @@ writePackageServerStatusName: "" olm: replicaCount: 1 image: - ref: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + ref: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed pullPolicy: IfNotPresent service: internalPort: 8080 catalog: replicaCount: 1 image: - ref: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + ref: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed pullPolicy: IfNotPresent service: internalPort: 8080 @@ -25,7 +25,7 @@ package: maxUnavailable: 1 maxSurge: 1 image: - ref: quay.io/operator-framework/olm@sha256:b706ee6583c4c3cf8059d44234c8a4505804adcc742bcddb3d1e2f6eff3d6519 + ref: quay.io/operator-framework/olm@sha256:e74b2ac57963c7f3ba19122a8c31c9f2a0deb3c0c5cac9e5323ccffd0ca198ed pullPolicy: Always service: internalPort: 5443 From f274faf3273d8e94748d0a1ee30f4e1977c8e533 Mon Sep 17 00:00:00 2001 From: Vu Dinh Date: Wed, 28 Jul 2021 08:29:28 -0400 Subject: [PATCH 04/45] Update containerd dependency to fix vulnerabilities (#719) Update to containerd 1.4.8 Signed-off-by: Vu Dinh Upstream-repository: operator-registry Upstream-commit: aa44cbec0df254fb503a34384a85e197a7e68e6f --- staging/operator-registry/go.mod | 15 +++------------ staging/operator-registry/go.sum | 8 ++++---- vendor/modules.txt | 2 +- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/staging/operator-registry/go.mod b/staging/operator-registry/go.mod index f4e40875e0..94d1d1bbc6 100644 --- a/staging/operator-registry/go.mod +++ b/staging/operator-registry/go.mod @@ -7,7 +7,7 @@ require ( github.com/blang/semver v3.5.1+incompatible github.com/bugsnag/bugsnag-go v1.5.3 // indirect github.com/bugsnag/panicwrap v1.2.0 // indirect - github.com/containerd/containerd v1.3.2 + github.com/containerd/containerd v1.4.8 github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb // indirect github.com/containerd/ttrpc v1.0.1 // indirect github.com/docker/cli v0.0.0-20200130152716-5d0cf8839492 @@ -36,7 +36,6 @@ require ( github.com/onsi/gomega v1.13.0 github.com/opencontainers/go-digest v1.0.0 github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 - github.com/opencontainers/runc v0.1.1 // indirect github.com/operator-framework/api v0.7.1 github.com/otiai10/copy v1.2.0 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 @@ -66,13 +65,5 @@ require ( sigs.k8s.io/yaml v1.2.0 ) -replace ( - // Currently on a fork for two issues: - // 1. stage registry proxy didn't like requests with no scopes, see https://github.com/containerd/containerd/pull/4223 - // 2. prod registry proxy returns a 403 on post, see https://github.com/containerd/containerd/pull/3913 - // The fork can be removed when both issues are resolved in a release, which should be 1.4.0 - github.com/containerd/containerd => github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5 - - // latest tag resolves to a very old version. this is only used for spinning up local test registries - github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d -) +// latest tag resolves to a very old version. this is only used for spinning up local test registries +replace github.com/docker/distribution => github.com/docker/distribution v0.0.0-20191216044856-a8371794149d diff --git a/staging/operator-registry/go.sum b/staging/operator-registry/go.sum index 5ee86f2706..79e8263309 100644 --- a/staging/operator-registry/go.sum +++ b/staging/operator-registry/go.sum @@ -150,6 +150,10 @@ github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u9 github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f h1:tSNMc+rJDfmYntojat8lljbt1mgKNpTxUZJsSzJ9Y1s= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= +github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.8 h1:H0wkS4AbVKTg9vyvBdCBrxoax8AMObKbNz9Fl2N0i4Y= +github.com/containerd/containerd v1.4.8/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb h1:nXPkFq8X1a9ycY3GYQpFNxHh3j2JgY7zDZfq2EXMIzk= github.com/containerd/continuity v0.0.0-20200413184840-d3ef23f19fbb/go.mod h1:Dq467ZllaHgAtVp4p1xUQWBrFXR9s/wyoTpG8zOJGkY= @@ -231,8 +235,6 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5 h1:Jaqyo6dNoi2RlsZuZIXtFL6PZ+2X9vK+iwRtzG2/zYE= -github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5/go.mod h1:bzKmwSHFIW6VylTyruXdGKbiAE3GhZV13uRlfLxy75s= github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153 h1:yUdfgN0XgIJw7foRItutHYUIhlcKzcSf5vDpdhQAKTc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= @@ -671,8 +673,6 @@ github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zM github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6 h1:yN8BPXVwMBAm3Cuvh1L5XE8XpvYRMdsVLd82ILprhUU= github.com/opencontainers/image-spec v1.0.2-0.20190823105129-775207bd45b6/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1 h1:GlxAyO6x8rfZYN9Tt0Kti5a/cP41iuiO2yYT0IJGY8Y= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700 h1:eNUVfm/RFLIi1G7flU5/ZRTHvd4kcVuzfRnL6OFlzCI= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= diff --git a/vendor/modules.txt b/vendor/modules.txt index 231b0a63ed..5b1028663d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -74,7 +74,7 @@ github.com/blang/semver/v4 github.com/cespare/xxhash/v2 # github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 github.com/containerd/cgroups/stats/v1 -# github.com/containerd/containerd v1.4.4 => github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5 +# github.com/containerd/containerd v1.4.8 => github.com/ecordell/containerd v1.3.1-0.20200629153125-0ff1a1be2fa5 github.com/containerd/containerd/archive github.com/containerd/containerd/archive/compression github.com/containerd/containerd/containers From bfa9b222b200ca385c516dc38594e41a1ff46d58 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Wed, 28 Jul 2021 17:13:19 -0400 Subject: [PATCH 05/45] doc/design: Update the changelog release documentation (#2298) Update the doc/design/release.md documentation around how to generate the root CHANGELOG.md. Previously, when running into API rate limiting behaviors locally, the suggestion was to modify a variable in the Ruby gem package that no longer exists. Now, specify the --max-issues CLI flag to lower the number of API requests to the OLM repository. Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 5c40752a9605669d34234bf18a93dba948b59439 --- .../doc/design/release.md | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/staging/operator-lifecycle-manager/doc/design/release.md b/staging/operator-lifecycle-manager/doc/design/release.md index 1843b88efc..755de20236 100644 --- a/staging/operator-lifecycle-manager/doc/design/release.md +++ b/staging/operator-lifecycle-manager/doc/design/release.md @@ -66,18 +66,29 @@ You need to have `gem` installed on your workstation. Execute the following comm gem install github_changelog_generator ``` -Afterward installing it may be worth modifying the `MAX_THREAD_NUMBER` to something lower similar to what is done here: . Note that the referenced PR has been merged, but the number is still too high. Although 1 is a very low value, it does seem to work more reliably. (On Fedora, the install location for the gem is `~/.gem/ruby/gems/github_changelog_generator-1.14.3/lib/github_changelog_generator/octo_fetcher.rb`.) - Make sure you have a GitHub API access token. You can generate one from [tokens](https://github.com/settings/tokens) -* Generate the changelog: +Run the following command to generate a changelog for this release: + ```bash # is the previous version. # is the new release you have made. -github_changelog_generator -u operator-framework -p operator-lifecycle-manager --since-tag= \ - --token= --future-release= --pr-label="**Other changes:**" -b CHANGELOG.md +GITHUB_TOKEN="" +github_changelog_generator \ + -u operator-framework \ + -p operator-lifecycle-manager \ + --token=${GITHUB_TOKEN} \ + --since-tag= \ + --future-release= \ + --pr-label="**Other changes:**" \ + -b CHANGELOG.md ``` -* Open a new PR with the changelog. + +**Note**: You may run into API rate limiting when attempting to generate the changelog. + +By default, all open and closed issues will be queried when running the above command, which can lead to API rate limiting. Lower the number of issues that will be queried by specifying the `--max-issues` flag (e.g. `--max-issues=100`) and re-run the above command with that flag provided. + +Ensure the `CHANGELOG.md` has been modified locally and open a PR with those generated changes. ## Step 7: Create a New GitHub Release From 600d1c233213d2b6e3b4f5a7cc3ade7d443bc1f2 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Thu, 29 Jul 2021 15:15:22 -0400 Subject: [PATCH 06/45] .github/workflows: Avoid running the e2e-tests workflow on doc-only pull requests (#2299) Update the e2e-tests.yml github workflow and avoid running that action on PRs that only change the doc directory. Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 939bf94f834181d60a713191f78b13b80c7bec0f --- .../operator-lifecycle-manager/.github/workflows/e2e-tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml index 27174e425e..18b857ae66 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml @@ -4,6 +4,9 @@ on: branches: - master pull_request: + paths: + - '**' + - '!doc/**' jobs: run-e2e-tests: runs-on: ubuntu-latest From a1ffbf234ba57e9ffd550d735d7a3f48280292e3 Mon Sep 17 00:00:00 2001 From: Evan Cordell Date: Fri, 30 Jul 2021 23:43:35 -0400 Subject: [PATCH 07/45] don't return an error if the singleton rbac doesn't exist (#2309) Signed-off-by: Evan Upstream-repository: operator-lifecycle-manager Upstream-commit: 538b1315eace85e33df7b2893a85a000f8757349 --- .../controller/operators/olm/operatorgroup.go | 20 +++++++++++++++---- .../controller/operators/olm/operatorgroup.go | 20 +++++++++++++++---- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index eb9139d89a..bef31bbb08 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -530,8 +530,14 @@ func (a *Operator) ensureSingletonRBAC(operatorNamespace string, csv *v1alpha1.C Resources: []string{"namespaces"}, }), } - if _, err := a.opClient.CreateClusterRole(clusterRole); err != nil { - return err + // TODO: this should do something smarter if the cluster role already exists + if cr, err := a.opClient.CreateClusterRole(clusterRole); err != nil { + // if the CR already exists, but the label is correct, the cache is just behind + if k8serrors.IsAlreadyExists(err) && ownerutil.IsOwnedByLabel(cr, csv) { + continue + } else { + return err + } } a.logger.Debug("created cluster role") } @@ -564,8 +570,14 @@ func (a *Operator) ensureSingletonRBAC(operatorNamespace string, csv *v1alpha1.C Name: r.RoleRef.Name, }, } - if _, err := a.opClient.CreateClusterRoleBinding(clusterRoleBinding); err != nil { - return err + // TODO: this should do something smarter if the cluster role binding already exists + if crb, err := a.opClient.CreateClusterRoleBinding(clusterRoleBinding); err != nil { + // if the CR already exists, but the label is correct, the cache is just behind + if k8serrors.IsAlreadyExists(err) && ownerutil.IsOwnedByLabel(crb, csv) { + continue + } else { + return err + } } } } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index eb9139d89a..bef31bbb08 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -530,8 +530,14 @@ func (a *Operator) ensureSingletonRBAC(operatorNamespace string, csv *v1alpha1.C Resources: []string{"namespaces"}, }), } - if _, err := a.opClient.CreateClusterRole(clusterRole); err != nil { - return err + // TODO: this should do something smarter if the cluster role already exists + if cr, err := a.opClient.CreateClusterRole(clusterRole); err != nil { + // if the CR already exists, but the label is correct, the cache is just behind + if k8serrors.IsAlreadyExists(err) && ownerutil.IsOwnedByLabel(cr, csv) { + continue + } else { + return err + } } a.logger.Debug("created cluster role") } @@ -564,8 +570,14 @@ func (a *Operator) ensureSingletonRBAC(operatorNamespace string, csv *v1alpha1.C Name: r.RoleRef.Name, }, } - if _, err := a.opClient.CreateClusterRoleBinding(clusterRoleBinding); err != nil { - return err + // TODO: this should do something smarter if the cluster role binding already exists + if crb, err := a.opClient.CreateClusterRoleBinding(clusterRoleBinding); err != nil { + // if the CR already exists, but the label is correct, the cache is just behind + if k8serrors.IsAlreadyExists(err) && ownerutil.IsOwnedByLabel(crb, csv) { + continue + } else { + return err + } } } } From 60fe57bc7bff03a10ea9e4af4ea837eca7ad6c15 Mon Sep 17 00:00:00 2001 From: Evan Cordell Date: Sat, 31 Jul 2021 00:42:35 -0400 Subject: [PATCH 08/45] let net.Listen pick a port for grpc servers generated in tests (#2310) Signed-off-by: Evan Upstream-repository: operator-lifecycle-manager Upstream-commit: 44fc44daf778cd9d36d6b6eb8edf63ff5a202304 --- .../controller/registry/grpc/source_test.go | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source_test.go index c604d77346..ed9d957f64 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/grpc/source_test.go @@ -22,8 +22,8 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" ) -func server(store opregistry.Query, port int) (func(), func()) { - lis, err := net.Listen("tcp", fmt.Sprintf("localhost:%d", port)) +func server(store opregistry.Query) (func(), string, func()) { + lis, err := net.Listen("tcp", fmt.Sprintf("localhost:")) if err != nil { logrus.Fatalf("failed to listen: %v", err) } @@ -41,7 +41,7 @@ func server(store opregistry.Query, port int) (func(), func()) { s.Stop() } - return serve, stop + return serve, lis.Addr().String(), stop } type FakeSourceSyncer struct { @@ -82,14 +82,14 @@ func TestConnectionEvents(t *testing.T) { test := func(tt testcase) func(t *testing.T) { return func(t *testing.T) { - // start server for each catalog totalEvents := 0 - port := 50050 - for _, events := range tt.expectedHistory { + addresses := map[registry.CatalogKey]string{} + + for catalog, events := range tt.expectedHistory { totalEvents += len(events) - port += 1 - serve, stop := server(&fakes.FakeQuery{}, port) + serve, address, stop := server(&fakes.FakeQuery{}) + addresses[catalog] = address go serve() defer stop() } @@ -102,10 +102,8 @@ func TestConnectionEvents(t *testing.T) { sources.Start(ctx) // add source for each catalog - port = 50050 - for catalog := range tt.expectedHistory { - port += 1 - _, err := sources.Add(catalog, fmt.Sprintf("localhost:%d", port)) + for catalog, address := range addresses { + _, err := sources.Add(catalog, address) require.NoError(t, err) } From 97929747322d275f565cca50a274bb5a76618e3d Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Tue, 3 Aug 2021 16:48:32 -0400 Subject: [PATCH 09/45] internal/declcfg: Avoid processing the .indexignore file when walking the root fs (#733) Update internal/declcfg/load.go and avoid processing any files that are named `.indexignore` when walking the declarative config index root filesystem. When validating declarative config directories, the .indexignore file was being processed and validated. Signed-off-by: timflannagan Upstream-repository: operator-registry Upstream-commit: 78f27b39dc098c2e56681d9a3d8e786aae95d4fe --- staging/operator-registry/internal/declcfg/load.go | 10 ++++++++-- .../operator-registry/internal/declcfg/load.go | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/staging/operator-registry/internal/declcfg/load.go b/staging/operator-registry/internal/declcfg/load.go index bc9c23e2cd..c53c61d7e9 100644 --- a/staging/operator-registry/internal/declcfg/load.go +++ b/staging/operator-registry/internal/declcfg/load.go @@ -17,6 +17,10 @@ import ( "github.com/operator-framework/operator-registry/internal/property" ) +const ( + indexIgnoreFilename = ".indexignore" +) + type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error // WalkFS walks root using a gitignore-style filename matcher to skip files @@ -27,7 +31,7 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { if root == nil { return fmt.Errorf("no declarative config filesystem provided") } - matcher, err := ignore.NewMatcher(root, ".indexignore") + matcher, err := ignore.NewMatcher(root, indexIgnoreFilename) if err != nil { return err } @@ -36,7 +40,9 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { if err != nil { return walkFn(path, nil, err) } - if info.IsDir() || matcher.Match(path, false) { + // avoid validating a directory, an .indexignore file, or any file that matches + // an ignore pattern outlined in a .indexignore file. + if info.IsDir() || info.Name() == indexIgnoreFilename || matcher.Match(path, false) { return nil } file, err := root.Open(path) diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go b/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go index bc9c23e2cd..c53c61d7e9 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go +++ b/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go @@ -17,6 +17,10 @@ import ( "github.com/operator-framework/operator-registry/internal/property" ) +const ( + indexIgnoreFilename = ".indexignore" +) + type WalkFunc func(path string, cfg *DeclarativeConfig, err error) error // WalkFS walks root using a gitignore-style filename matcher to skip files @@ -27,7 +31,7 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { if root == nil { return fmt.Errorf("no declarative config filesystem provided") } - matcher, err := ignore.NewMatcher(root, ".indexignore") + matcher, err := ignore.NewMatcher(root, indexIgnoreFilename) if err != nil { return err } @@ -36,7 +40,9 @@ func WalkFS(root fs.FS, walkFn WalkFunc) error { if err != nil { return walkFn(path, nil, err) } - if info.IsDir() || matcher.Match(path, false) { + // avoid validating a directory, an .indexignore file, or any file that matches + // an ignore pattern outlined in a .indexignore file. + if info.IsDir() || info.Name() == indexIgnoreFilename || matcher.Match(path, false) { return nil } file, err := root.Open(path) From 4900eb2441b36afed3fb9ad03548b467a9dfc0bb Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Thu, 15 Jul 2021 17:56:04 +0000 Subject: [PATCH 10/45] setup multi-arch builds with goreleaser Signed-off-by: Joe Lanford Upstream-repository: operator-registry Upstream-commit: a390f86b3ca429c9618a7c20a31406bc2bd6ed16 --- .../.github/workflows/goreleaser.yaml | 96 ++++++++++ .../.github/workflows/release.yaml | 48 ----- staging/operator-registry/.gitignore | 2 - staging/operator-registry/.goreleaser.yaml | 173 ++++++++++++++++++ staging/operator-registry/Makefile | 16 +- .../release/goreleaser.opm.Dockerfile | 10 + staging/operator-registry/scripts/fetch | 31 ++++ .../upstream-opm-builder.Dockerfile | 5 + 8 files changed, 327 insertions(+), 54 deletions(-) create mode 100644 staging/operator-registry/.github/workflows/goreleaser.yaml delete mode 100644 staging/operator-registry/.github/workflows/release.yaml create mode 100644 staging/operator-registry/.goreleaser.yaml create mode 100644 staging/operator-registry/release/goreleaser.opm.Dockerfile create mode 100755 staging/operator-registry/scripts/fetch diff --git a/staging/operator-registry/.github/workflows/goreleaser.yaml b/staging/operator-registry/.github/workflows/goreleaser.yaml new file mode 100644 index 0000000000..9edf58a161 --- /dev/null +++ b/staging/operator-registry/.github/workflows/goreleaser.yaml @@ -0,0 +1,96 @@ +name: goreleaser +on: + push: + branches: + - 'master' + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + pull_request: {} +defaults: + run: + shell: bash +jobs: + goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + # GoReleaser requires fetch-depth: 0 for + # changelog generation to work correctly. + fetch-depth: 0 + + - uses: actions/setup-go@v2 + with: + go-version: '~1.16' + + - name: "Download osxcross cross-compiler for macOS builds" + run: | + git clone https://github.com/tpoechtrager/osxcross /tmp/osxcross + cd /tmp/osxcross + wget -P tarballs '' + echo "/tmp/osxcross/target/bin" >> $GITHUB_PATH + + - name: "Cache the osxcross + tarball build output" + id: cache-osxcross + uses: actions/cache@v2 + with: + path: /tmp/osxcross/target + key: ${{ runner.os }}-osxcross-${{ hashFiles('/tmp/osxcross/**/*') }} + restore-keys: | + ${{ runner.os }}-osxcross- + + - name: "Build osxcross" + if: steps.cache-osxcross.outputs.cache-hit != 'true' + run: | + cd /tmp/osxcross + sudo ./tools/get_dependencies.sh + UNATTENDED=1 ./build.sh + + - name: "Install linux cross-compilers" + run: sudo apt-get install -y gcc-aarch64-linux-gnu gcc-s390x-linux-gnu gcc-powerpc64le-linux-gnu gcc-mingw-w64-x86-64 + + - name: "Install yq" + run: | + sudo wget https://github.com/mikefarah/yq/releases/download/v4.10.0/yq_linux_amd64 -O /usr/local/bin/yq + sudo chmod +x /usr/local/bin/yq + + - name: "Disable image pushes for pull requests" + if: github.event_name == 'pull_request' + run: | + yq eval '.dockers[].skip_push=true' -i .goreleaser.yaml + yq eval '.docker_manifests[].skip_push=true' -i .goreleaser.yaml + + - name: "Disable the Github release upload for non-tag builds" + if: startsWith(github.ref, 'refs/tags') != true + run: | + yq eval '.release.disable=true' -i .goreleaser.yaml + + - name: "Set the image tag" + run: | + if [[ $GITHUB_REF == refs/tags/* ]]; then + # Release tags. + echo IMAGE_TAG="${GITHUB_REF#refs/tags/}" >> $GITHUB_ENV + elif [[ $GITHUB_REF == refs/heads/* ]]; then + # Branch build. + echo IMAGE_TAG="$(echo "${GITHUB_REF#refs/heads/}" | sed -r 's|/+|-|g')" >> $GITHUB_ENV + elif [[ $GITHUB_REF == refs/pull/* ]]; then + # PR build. + echo IMAGE_TAG="pr-$(echo "${GITHUB_REF}" | sed -E 's|refs/pull/([^/]+)/?.*|\1|')" >> $GITHUB_ENV + else + echo IMAGE_TAG="$(git describe --tags --always)" >> $GITHUB_ENV + fi + + - name: "Login to Quay" + if: github.event_name != 'pull_request' + uses: docker/login-action@v1 + with: + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_PASSWORD }} + registry: quay.io + + + - name: "Run GoReleaser" + run: make release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + RELEASE_ARGS: release --rm-dist ${{ !startsWith(github.ref, 'refs/tags') && '--skip-validate' || '' }} diff --git a/staging/operator-registry/.github/workflows/release.yaml b/staging/operator-registry/.github/workflows/release.yaml deleted file mode 100644 index 6d05f2f7d5..0000000000 --- a/staging/operator-registry/.github/workflows/release.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: release -on: - push: - tags: - - 'v[0-9]+.[0-9]+.[0-9]+' -defaults: - run: - shell: bash -jobs: - create: - runs-on: ubuntu-latest - outputs: - upload_url: ${{ steps.release.outputs.upload_url }} - steps: - - uses: actions/create-release@v1 - id: release - env: - GITHUB_TOKEN: ${{ github.token }} - with: - draft: true - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} - assets: - needs: create - strategy: - matrix: - os: - - ubuntu-latest - - macos-latest - - windows-latest - runs-on: ${{ matrix.os }} - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 - with: - go-version: '~1.16' - - run: | - echo "asset_path=bin/opm" >> $GITHUB_ENV - echo "asset_name=$(go env GOOS)-$(go env GOARCH)-opm$(go env GOEXE)" >> $GITHUB_ENV - - run: make ${{ env.asset_path }} - - uses: actions/upload-release-asset@v1 - env: - GITHUB_TOKEN: ${{ github.token }} - with: - upload_url: ${{ needs.create.outputs.upload_url }} - asset_path: ${{ env.asset_path }} - asset_name: ${{ env.asset_name }} - asset_content_type: application/octet-stream diff --git a/staging/operator-registry/.gitignore b/staging/operator-registry/.gitignore index 0dc911b823..fe176ef932 100644 --- a/staging/operator-registry/.gitignore +++ b/staging/operator-registry/.gitignore @@ -181,8 +181,6 @@ tags # Build results [Dd]ebug/ [Dd]ebugPublic/ -[Rr]elease/ -[Rr]eleases/ x64/ x86/ bld/ diff --git a/staging/operator-registry/.goreleaser.yaml b/staging/operator-registry/.goreleaser.yaml new file mode 100644 index 0000000000..2a5db02c10 --- /dev/null +++ b/staging/operator-registry/.goreleaser.yaml @@ -0,0 +1,173 @@ +builds: + - id: linux-amd64 + main: ./cmd/opm + binary: opm + goos: + - linux + goarch: + - amd64 + env: + - CC=gcc + mod_timestamp: "{{ .CommitTimestamp }}" + flags: &build-flags + - -tags=json1 + asmflags: &build-asmflags + - all=-trimpath={{ .Env.PWD }} + gcflags: &build-gcflags + - all=-trimpath={{ .Env.PWD }} + ldflags: &build-ldflags + - -s -w + - -X {{ .Env.PKG }}/cmd/opm/version.gitCommit={{ .Env.GIT_COMMIT }} + - -X {{ .Env.PKG }}/cmd/opm/version.opmVersion={{ .Env.OPM_VERSION }} + - -X {{ .Env.PKG }}/cmd/opm/version.buildDate={{ .Env.BUILD_DATE }} + - id: linux-arm64 + main: ./cmd/opm + binary: opm + goos: + - linux + goarch: + - arm64 + env: + - CC=aarch64-linux-gnu-gcc + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags + - id: linux-ppc64le + main: ./cmd/opm + binary: opm + goos: + - linux + goarch: + - ppc64le + env: + - CC=powerpc64le-linux-gnu-gcc + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags + - id: linux-s390x + main: ./cmd/opm + binary: opm + goos: + - linux + goarch: + - s390x + env: + - CC=s390x-linux-gnu-gcc + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags + - id: windows-amd64 + main: ./cmd/opm + binary: opm + goos: + - windows + goarch: + - amd64 + env: + - CC=x86_64-w64-mingw32-gcc-posix + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags + - id: darwin-amd64 + main: ./cmd/opm + binary: opm + goos: + - darwin + goarch: + - amd64 + env: + - CC=o64-clang + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags + - id: darwin-arm64 + main: ./cmd/opm + binary: opm + goos: + - darwin + goarch: + - arm64 + env: + - CC=oa64e-clang + mod_timestamp: "{{ .CommitTimestamp }}" + flags: *build-flags + asmflags: *build-asmflags + gcflags: *build-gcflags + ldflags: *build-ldflags +archives: + - id: opm + builds: + - linux-amd64 + - linux-arm64 + - linux-ppc64le + - linux-s390x + - windows-amd64 + - darwin-amd64 + - darwin-arm64 + name_template: "{{ .Binary }}_{{ .Env.OPM_VERSION }}_{{ .Os }}_{{ .Arch }}" + format: binary +dockers: + - image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + ids: ["linux-amd64"] + goos: linux + goarch: amd64 + dockerfile: release/goreleaser.opm.Dockerfile + extra_files: ["nsswitch.conf"] + use: buildx + build_flag_templates: + - --platform=linux/amd64 + - image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + ids: ["linux-arm64"] + goos: linux + goarch: arm64 + dockerfile: release/goreleaser.opm.Dockerfile + extra_files: ["nsswitch.conf"] + use: buildx + build_flag_templates: + - --platform=linux/arm64 + - image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + ids: ["linux-ppc64le"] + goos: linux + goarch: ppc64le + dockerfile: release/goreleaser.opm.Dockerfile + extra_files: ["nsswitch.conf"] + use: buildx + build_flag_templates: + - --platform=linux/ppc64le + - image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + ids: ["linux-s390x"] + goos: linux + goarch: s390x + dockerfile: release/goreleaser.opm.Dockerfile + extra_files: ["nsswitch.conf"] + use: buildx + build_flag_templates: + - --platform=linux/s390x +docker_manifests: + - name_template: "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}" + image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" +checksum: + name_template: 'checksums.txt' +snapshot: + name_template: "{{ .Env.OPM_VERSION }}" +release: + name_template: "{{ .Env.OPM_VERSION }}" + draft: true diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index bd586974e9..ad2004a1bc 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -2,10 +2,10 @@ GO := GOFLAGS="-mod=vendor" go CMDS := $(addprefix bin/, $(shell ls ./cmd | grep -v opm)) OPM := $(addprefix bin/, opm) SPECIFIC_UNIT_TEST := $(if $(TEST),-run $(TEST),) -PKG := github.com/operator-framework/operator-registry -GIT_COMMIT := $(or $(SOURCE_GIT_COMMIT),$(shell git rev-parse --short HEAD)) -OPM_VERSION := $(or $(SOURCE_GIT_TAG),$(shell git describe --always --tags HEAD)) -BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') +export PKG := github.com/operator-framework/operator-registry +export GIT_COMMIT := $(or $(SOURCE_GIT_COMMIT),$(shell git rev-parse --short HEAD)) +export OPM_VERSION := $(or $(SOURCE_GIT_TAG),$(shell git describe --always --tags HEAD)) +export BUILD_DATE := $(shell date -u +'%Y-%m-%dT%H:%M:%SZ') # define characters null := @@ -114,3 +114,11 @@ clean: .PHONY: e2e e2e: $(GO) run github.com/onsi/ginkgo/ginkgo --v --randomizeAllSpecs --randomizeSuites --race $(if $(TEST),-focus '$(TEST)') $(TAGS) ./test/e2e -- $(if $(SKIPTLS),-skip-tls true) + + +.PHONY: release +export OPM_IMAGE_REPO ?= quay.io/operator-framework/opm +export IMAGE_TAG ?= $(OPM_VERSION) +release: RELEASE_ARGS?=release --rm-dist --snapshot +release: + ./scripts/fetch goreleaser 0.173.2 && ./bin/goreleaser $(RELEASE_ARGS) diff --git a/staging/operator-registry/release/goreleaser.opm.Dockerfile b/staging/operator-registry/release/goreleaser.opm.Dockerfile new file mode 100644 index 0000000000..eac78673c8 --- /dev/null +++ b/staging/operator-registry/release/goreleaser.opm.Dockerfile @@ -0,0 +1,10 @@ +# NOTE: This Dockerfile is used in conjuction with GoReleaser to +# build opm images. See the configurations in .goreleaser.yaml +# and .github/workflows/release.yaml. + +FROM --platform=$BUILDPLATFORM ghcr.io/grpc-ecosystem/grpc-health-probe:v0.4.4 as grpc_health_probe +FROM gcr.io/distroless/base:debug +COPY --from=grpc_health_probe /grpc_health_probe /bin/grpc_health_probe +COPY ["nsswitch.conf", "/etc/nsswitch.conf"] +COPY opm /bin/opm +ENTRYPOINT ["/bin/opm"] diff --git a/staging/operator-registry/scripts/fetch b/staging/operator-registry/scripts/fetch new file mode 100755 index 0000000000..ac383f67d2 --- /dev/null +++ b/staging/operator-registry/scripts/fetch @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +ROOT="$( git rev-parse --show-toplevel )" + +fetch() { + local tool=$1; shift + local ver=$1; shift + + local ver_cmd="" + local tool_fetch_cmd="" + case "$tool" in + "golangci-lint") + ver_cmd="${ROOT}/bin/golangci-lint --version 2>/dev/null | cut -d\" \" -f4" + fetch_cmd="curl -sSfL \"https://raw.githubusercontent.com/golangci/golangci-lint/v${ver}/install.sh\" | sh -s -- -b \"${ROOT}/bin\" \"v${ver}\"" + ;; + "goreleaser") + ver_cmd="${ROOT}/bin/goreleaser --version 2>/dev/null | grep 'goreleaser version' | cut -d' ' -f3" + fetch_cmd="curl -sSfL https://install.goreleaser.com/github.com/goreleaser/goreleaser.sh | sh -s -- -b \"${ROOT}/bin\" -d \"v${ver}\"" + ;; + *) + echo "unknown tool $tool" + return 1 + ;; + esac + + if [[ "${ver}" != "$(eval ${ver_cmd})" ]]; then + echo "${tool} missing or not version '${ver}', downloading..." + eval ${fetch_cmd} + fi +} +fetch $@ diff --git a/staging/operator-registry/upstream-opm-builder.Dockerfile b/staging/operator-registry/upstream-opm-builder.Dockerfile index b1b89845ae..7d4d202562 100644 --- a/staging/operator-registry/upstream-opm-builder.Dockerfile +++ b/staging/operator-registry/upstream-opm-builder.Dockerfile @@ -1,3 +1,8 @@ +## +## Deprecated: release/goreleaser.opm.Dockerfile is used in conjunction with +## GoReleaser to build and push multi-arch images for opm +## + FROM golang:1.16-alpine AS builder RUN apk update && apk add sqlite build-base git mercurial bash From 99a7a1f2d9b0aa5004bba1aacec6ccb5baf01bcd Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Thu, 5 Aug 2021 10:02:15 -0400 Subject: [PATCH 11/45] Move operator caching from resolver into a new package. (#2316) Signed-off-by: Ben Luddy Upstream-repository: operator-lifecycle-manager Upstream-commit: 3a565917233c72d098f3a60d9239f0e3c5b55f76 --- .../pkg/controller/operators/olm/operator.go | 5 +- .../controller/operators/olm/operator_test.go | 9 +- .../controller/operators/olm/operatorgroup.go | 23 +- .../registry/resolver/{ => cache}/cache.go | 96 +-- .../resolver/{ => cache}/cache_test.go | 42 +- .../registry/resolver/cache}/operators.go | 217 ++++--- .../resolver/{ => cache}/operators_test.go | 156 ++--- .../resolver/{ => cache}/predicates.go | 24 +- .../resolver/{ => cache}/predicates_test.go | 12 +- .../controller/registry/resolver/groups.go | 19 +- .../registry/resolver/groups_test.go | 75 +-- .../registry/resolver/installabletypes.go | 14 +- .../controller/registry/resolver/labeler.go | 15 +- .../registry/resolver/labeler_test.go | 11 +- .../controller/registry/resolver/resolver.go | 167 ++--- .../registry/resolver/resolver_test.go | 591 +++++++++--------- .../registry/resolver/step_resolver.go | 27 +- .../registry/resolver/step_resolver_test.go | 39 +- .../pkg/controller/registry/resolver/steps.go | 3 +- .../controller/registry/resolver/util_test.go | 112 +--- .../fakes/fake_api_intersection_reconciler.go | 13 +- .../pkg/controller/operators/olm/operator.go | 5 +- .../controller/operators/olm/operatorgroup.go | 23 +- .../registry/resolver/{ => cache}/cache.go | 96 +-- .../registry/resolver/cache}/operators.go | 217 ++++--- .../resolver/{ => cache}/predicates.go | 24 +- .../controller/registry/resolver/groups.go | 19 +- .../registry/resolver/installabletypes.go | 14 +- .../controller/registry/resolver/labeler.go | 15 +- .../controller/registry/resolver/resolver.go | 167 ++--- .../registry/resolver/step_resolver.go | 27 +- .../pkg/controller/registry/resolver/steps.go | 3 +- vendor/modules.txt | 1 + 33 files changed, 1185 insertions(+), 1096 deletions(-) rename staging/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/cache.go (82%) rename staging/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/cache_test.go (93%) rename {vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver => staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache}/operators.go (75%) rename staging/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/operators_test.go (92%) rename staging/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/predicates.go (95%) rename staging/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/predicates_test.go (80%) rename vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/cache.go (82%) rename {staging/operator-lifecycle-manager/pkg/controller/registry/resolver => vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache}/operators.go (75%) rename vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/{ => cache}/predicates.go (95%) diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index 94d3339f50..b71abe2115 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -38,6 +38,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/event" @@ -1364,7 +1365,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v out = in.DeepCopy() now := a.now() - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(out) + operatorSurface, err := resolvercache.NewOperatorFromV1Alpha1CSV(out) if err != nil { // If the resolver is unable to retrieve the operator info from the CSV the CSV requires changes, a syncError should not be returned. logger.WithError(err).Warn("Unable to retrieve operator information from CSV") @@ -1428,7 +1429,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v groupSurface := resolver.NewOperatorGroup(operatorGroup) otherGroupSurfaces := resolver.NewOperatorGroupSurfaces(otherGroups...) - providedAPIs := operatorSurface.ProvidedAPIs().StripPlural() + providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { case operatorGroup.Spec.StaticProvidedAPIs && (result == resolver.AddAPIs || result == resolver.RemoveAPIs): diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go index 5f6eae41a4..f7d9abbded 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go @@ -55,6 +55,7 @@ import ( olmerrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/fakes" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clientfake" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" @@ -872,7 +873,7 @@ func TestTransitionCSV(t *testing.T) { logrus.SetLevel(logrus.DebugLevel) namespace := "ns" - apiHash, err := resolver.APIKeyToGVKHash(opregistry.APIKey{Group: "g1", Version: "v1", Kind: "c1"}) + apiHash, err := resolvercache.APIKeyToGVKHash(opregistry.APIKey{Group: "g1", Version: "v1", Kind: "c1"}) require.NoError(t, err) defaultOperatorGroup := &v1.OperatorGroup{ @@ -3693,7 +3694,7 @@ func TestSyncOperatorGroups(t *testing.T) { v1alpha1.CSVPhaseNone, ), labels.Set{resolver.APILabelKeyPrefix + "9f4c46c37bdff8d0": "provided"}) - operatorCSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs[0].Spec.Template.Spec.Containers[0].Env = []corev1.EnvVar{corev1.EnvVar{ + operatorCSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs[0].Spec.Template.Spec.Containers[0].Env = []corev1.EnvVar{{ Name: "OPERATOR_CONDITION_NAME", Value: operatorCSV.GetName(), }} @@ -4631,7 +4632,7 @@ func TestOperatorGroupConditions(t *testing.T) { }, expectError: true, expectedConditions: []metav1.Condition{ - metav1.Condition{ + { Type: v1.OperatorGroupServiceAccountCondition, Status: metav1.ConditionTrue, Reason: v1.OperatorGroupServiceAccountReason, @@ -4674,7 +4675,7 @@ func TestOperatorGroupConditions(t *testing.T) { }, expectError: true, expectedConditions: []metav1.Condition{ - metav1.Condition{ + { Type: v1.MutlipleOperatorGroupCondition, Status: metav1.ConditionTrue, Reason: v1.MultipleOperatorGroupsReason, diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index bef31bbb08..8c28ef0d1e 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -22,6 +22,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" opregistry "github.com/operator-framework/operator-registry/pkg/registry" @@ -46,7 +47,7 @@ var ( ) func aggregationLabelFromAPIKey(k opregistry.APIKey, suffix string) (string, error) { - hash, err := resolver.APIKeyToGVKHash(k) + hash, err := cache.APIKeyToGVKHash(k) if err != nil { return "", err } @@ -188,7 +189,7 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error { groupSurface := resolver.NewOperatorGroup(op) groupProvidedAPIs := groupSurface.ProvidedAPIs() providedAPIsForCSVs := a.providedAPIsFromCSVs(op, logger) - providedAPIsForGroup := make(resolver.APISet) + providedAPIsForGroup := make(cache.APISet) for api := range providedAPIsForCSVs { providedAPIsForGroup[api] = struct{}{} } @@ -309,26 +310,26 @@ func (a *Operator) providedAPIsFromCSVs(group *v1.OperatorGroup, logger *logrus. // TODO: Throw out CSVs that aren't members of the group due to group related failures? // Union the providedAPIsFromCSVs from existing members of the group - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { logger.WithError(err).Warn("could not create OperatorSurface from csv") continue } - for providedAPI := range operatorSurface.ProvidedAPIs().StripPlural() { + for providedAPI := range operatorSurface.GetProvidedAPIs().StripPlural() { providedAPIsFromCSVs[providedAPI] = csv } } return providedAPIsFromCSVs } -func (a *Operator) pruneProvidedAPIs(group *v1.OperatorGroup, groupProvidedAPIs resolver.APISet, providedAPIsFromCSVs map[opregistry.APIKey]*v1alpha1.ClusterServiceVersion, logger *logrus.Entry) { +func (a *Operator) pruneProvidedAPIs(group *v1.OperatorGroup, groupProvidedAPIs cache.APISet, providedAPIsFromCSVs map[opregistry.APIKey]*v1alpha1.ClusterServiceVersion, logger *logrus.Entry) { // Don't prune providedAPIsFromCSVs if static if group.Spec.StaticProvidedAPIs { a.logger.Debug("group has static provided apis. skipping provided api pruning") return } - intersection := make(resolver.APISet) + intersection := make(cache.APISet) for api := range providedAPIsFromCSVs { if _, ok := groupProvidedAPIs[api]; ok { intersection[api] = struct{}{} @@ -978,7 +979,7 @@ func (a *Operator) updateNamespaceList(op *v1.OperatorGroup) ([]string, error) { return namespaceList, nil } -func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, apis resolver.APISet) error { +func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, apis cache.APISet) error { clusterRole := &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{ Name: strings.Join([]string{op.GetName(), suffix}, "-"), @@ -1029,7 +1030,7 @@ func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, return nil } -func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis resolver.APISet) error { +func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis cache.APISet) error { for _, suffix := range Suffices { if err := a.ensureOpGroupClusterRole(op, suffix, apis); err != nil { return err @@ -1038,7 +1039,7 @@ func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis resolver return nil } -func (a *Operator) findCSVsThatProvideAnyOf(provide resolver.APISet) ([]*v1alpha1.ClusterServiceVersion, error) { +func (a *Operator) findCSVsThatProvideAnyOf(provide cache.APISet) ([]*v1alpha1.ClusterServiceVersion, error) { csvs, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().ClusterServiceVersions(metav1.NamespaceAll).List(labels.Everything()) if err != nil { return nil, err @@ -1051,12 +1052,12 @@ func (a *Operator) findCSVsThatProvideAnyOf(provide resolver.APISet) ([]*v1alpha continue } - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { continue } - if len(operatorSurface.ProvidedAPIs().StripPlural().Intersection(provide)) > 0 { + if len(operatorSurface.GetProvidedAPIs().StripPlural().Intersection(provide)) > 0 { providers = append(providers, csv) } } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go similarity index 82% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go index d713f5018e..c26f30d434 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "context" @@ -76,14 +76,14 @@ func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger, catsrc } type NamespacedOperatorCache struct { - namespaces []string + Namespaces []string existing *registry.CatalogKey - snapshots map[registry.CatalogKey]*CatalogSnapshot + Snapshots map[registry.CatalogKey]*CatalogSnapshot } func (c *NamespacedOperatorCache) Error() error { var errs []error - for key, snapshot := range c.snapshots { + for key, snapshot := range c.Snapshots { snapshot.m.Lock() err := snapshot.err snapshot.m.Unlock() @@ -113,8 +113,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin clients := c.rcp.ClientsForNamespaces(namespaces...) result := NamespacedOperatorCache{ - namespaces: namespaces, - snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + Namespaces: namespaces, + Snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), } var misses []registry.CatalogKey @@ -127,8 +127,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin func() { snapshot.m.RLock() defer snapshot.m.RUnlock() - if !snapshot.Expired(now) && snapshot.operators != nil && len(snapshot.operators) > 0 { - result.snapshots[key] = snapshot + if !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { + result.Snapshots[key] = snapshot } else { misses = append(misses, key) } @@ -162,8 +162,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin // Check for any snapshots that were populated while waiting to acquire the lock. var found int for i := range misses { - if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.operators != nil && len(snapshot.operators) > 0 { - result.snapshots[misses[i]] = snapshot + if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { + result.Snapshots[misses[i]] = snapshot misses[found], misses[i] = misses[i], misses[found] found++ } @@ -182,14 +182,14 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin s := CatalogSnapshot{ logger: c.logger.WithField("catalog", miss), - key: miss, + Key: miss, expiry: now.Add(c.ttl), pop: cancel, - priority: catalogSourcePriority(catsrcPriority), + Priority: catalogSourcePriority(catsrcPriority), } s.m.Lock() c.snapshots[miss] = &s - result.snapshots[miss] = &s + result.Snapshots[miss] = &s go c.populate(ctx, &s, clients[miss]) } @@ -219,7 +219,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, snapshot.err = err return } - c.logger.WithField("catalog", snapshot.key.String()).Debug("updating cache") + c.logger.WithField("catalog", snapshot.Key.String()).Debug("updating cache") var operators []*Operator for b := it.Next(); b != nil; b = it.Next() { defaultChannel, ok := defaultChannels[b.PackageName] @@ -232,26 +232,26 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, defaultChannel = p.DefaultChannelName } } - o, err := NewOperatorFromBundle(b, "", snapshot.key, defaultChannel) + o, err := NewOperatorFromBundle(b, "", snapshot.Key, defaultChannel) if err != nil { snapshot.logger.Warnf("failed to construct operator from bundle, continuing: %v", err) continue } - o.providedAPIs = o.ProvidedAPIs().StripPlural() - o.requiredAPIs = o.RequiredAPIs().StripPlural() - o.replaces = b.Replaces - ensurePackageProperty(o, b.PackageName, b.Version) + o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() + o.RequiredAPIs = o.RequiredAPIs.StripPlural() + o.Replaces = b.Replaces + EnsurePackageProperty(o, b.PackageName, b.Version) operators = append(operators, o) } if err := it.Error(); err != nil { snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) snapshot.err = err } - snapshot.operators = operators + snapshot.Operators = operators } -func ensurePackageProperty(o *Operator, name, version string) { - for _, p := range o.Properties() { +func EnsurePackageProperty(o *Operator, name, version string) { + for _, p := range o.Properties { if p.Type == opregistry.PackageType { return } @@ -264,7 +264,7 @@ func ensurePackageProperty(o *Operator, name, version string) { if err != nil { return } - o.properties = append(o.properties, &api.Property{ + o.Properties = append(o.Properties, &api.Property{ Type: opregistry.PackageType, Value: string(bytes), }) @@ -275,7 +275,7 @@ func (c *NamespacedOperatorCache) Catalog(k registry.CatalogKey) OperatorFinder if k.Empty() { return c } - if snapshot, ok := c.snapshots[k]; ok { + if snapshot, ok := c.Snapshots[k]; ok { return snapshot } return EmptyOperatorFinder{} @@ -286,7 +286,7 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, if preferred != nil && preferred.Empty() { preferred = nil } - sorted := NewSortableSnapshots(c.existing, preferred, c.namespaces, c.snapshots) + sorted := NewSortableSnapshots(c.existing, preferred, c.Namespaces, c.Snapshots) sort.Sort(sorted) for _, snapshot := range sorted.snapshots { result = append(result, snapshot.Find(p...)...) @@ -296,11 +296,11 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *CatalogSnapshot) MultiCatalogOperatorFinder { o := &NamespacedOperatorCache{ - namespaces: c.namespaces, - existing: &snapshot.key, - snapshots: c.snapshots, + Namespaces: c.Namespaces, + existing: &snapshot.Key, + Snapshots: c.Snapshots, } - o.snapshots[snapshot.key] = snapshot + o.Snapshots[snapshot.Key] = snapshot return o } @@ -310,12 +310,12 @@ func (c *NamespacedOperatorCache) Find(p ...OperatorPredicate) []*Operator { type CatalogSnapshot struct { logger logrus.FieldLogger - key registry.CatalogKey + Key registry.CatalogKey expiry time.Time - operators []*Operator + Operators []*Operator m sync.RWMutex pop context.CancelFunc - priority catalogSourcePriority + Priority catalogSourcePriority err error } @@ -332,8 +332,8 @@ func (s *CatalogSnapshot) Expired(at time.Time) bool { func NewRunningOperatorSnapshot(logger logrus.FieldLogger, key registry.CatalogKey, o []*Operator) *CatalogSnapshot { return &CatalogSnapshot{ logger: logger, - key: key, - operators: o, + Key: key, + Operators: o, } } @@ -372,37 +372,37 @@ func (s SortableSnapshots) Len() int { func (s SortableSnapshots) Less(i, j int) bool { // existing operators are preferred over catalog operators if s.existing != nil && - s.snapshots[i].key.Name == s.existing.Name && - s.snapshots[i].key.Namespace == s.existing.Namespace { + s.snapshots[i].Key.Name == s.existing.Name && + s.snapshots[i].Key.Namespace == s.existing.Namespace { return true } if s.existing != nil && - s.snapshots[j].key.Name == s.existing.Name && - s.snapshots[j].key.Namespace == s.existing.Namespace { + s.snapshots[j].Key.Name == s.existing.Name && + s.snapshots[j].Key.Namespace == s.existing.Namespace { return false } // preferred catalog is less than all other catalogs if s.preferred != nil && - s.snapshots[i].key.Name == s.preferred.Name && - s.snapshots[i].key.Namespace == s.preferred.Namespace { + s.snapshots[i].Key.Name == s.preferred.Name && + s.snapshots[i].Key.Namespace == s.preferred.Namespace { return true } if s.preferred != nil && - s.snapshots[j].key.Name == s.preferred.Name && - s.snapshots[j].key.Namespace == s.preferred.Namespace { + s.snapshots[j].Key.Name == s.preferred.Name && + s.snapshots[j].Key.Namespace == s.preferred.Namespace { return false } // the rest are sorted first on priority, namespace and then by name - if s.snapshots[i].priority != s.snapshots[j].priority { - return s.snapshots[i].priority > s.snapshots[j].priority + if s.snapshots[i].Priority != s.snapshots[j].Priority { + return s.snapshots[i].Priority > s.snapshots[j].Priority } - if s.snapshots[i].key.Namespace != s.snapshots[j].key.Namespace { - return s.namespaces[s.snapshots[i].key.Namespace] < s.namespaces[s.snapshots[j].key.Namespace] + if s.snapshots[i].Key.Namespace != s.snapshots[j].Key.Namespace { + return s.namespaces[s.snapshots[i].Key.Namespace] < s.namespaces[s.snapshots[j].Key.Namespace] } - return s.snapshots[i].key.Name < s.snapshots[j].key.Name + return s.snapshots[i].Key.Name < s.snapshots[j].Key.Name } // Swap swaps the elements with indexes i and j. @@ -413,7 +413,7 @@ func (s SortableSnapshots) Swap(i, j int) { func (s *CatalogSnapshot) Find(p ...OperatorPredicate) []*Operator { s.m.RLock() defer s.m.RUnlock() - return Filter(s.operators, p...) + return Filter(s.Operators, p...) } type OperatorFinder interface { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go similarity index 93% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go index 1d86cacc78..ecb4f14b24 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "context" @@ -240,9 +240,9 @@ func TestCatalogSnapshotFind(t *testing.T) { return false }), Operators: []*Operator{ - {name: "a"}, - {name: "b"}, - {name: "c"}, + {Name: "a"}, + {Name: "b"}, + {Name: "c"}, }, Expected: nil, }, @@ -260,34 +260,34 @@ func TestCatalogSnapshotFind(t *testing.T) { return true }), Operators: []*Operator{ - {name: "a"}, - {name: "b"}, - {name: "c"}, + {Name: "a"}, + {Name: "b"}, + {Name: "c"}, }, Expected: []*Operator{ - {name: "a"}, - {name: "b"}, - {name: "c"}, + {Name: "a"}, + {Name: "b"}, + {Name: "c"}, }, }, { Name: "some satisfy predicate", Predicate: OperatorPredicateTestFunc(func(o *Operator) bool { - return o.name != "a" + return o.Name != "a" }), Operators: []*Operator{ - {name: "a"}, - {name: "b"}, - {name: "c"}, + {Name: "a"}, + {Name: "b"}, + {Name: "c"}, }, Expected: []*Operator{ - {name: "b"}, - {name: "c"}, + {Name: "b"}, + {Name: "c"}, }, }, } { t.Run(tt.Name, func(t *testing.T) { - s := CatalogSnapshot{operators: tt.Operators} + s := CatalogSnapshot{Operators: tt.Operators} assert.Equal(t, tt.Expected, s.Find(tt.Predicate)) }) } @@ -314,7 +314,7 @@ func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { Kind: "K2", Plural: "ks2", }}, - Properties: apiSetToProperties(map[opregistry.APIKey]struct{}{ + Properties: APISetToProperties(map[opregistry.APIKey]struct{}{ { Group: "g", Version: "v1", @@ -322,7 +322,7 @@ func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { Plural: "ks", }: {}, }, nil, false), - Dependencies: apiSetToDependencies(map[opregistry.APIKey]struct{}{ + Dependencies: APISetToDependencies(map[opregistry.APIKey]struct{}{ { Group: "g2", Version: "v2", @@ -340,8 +340,8 @@ func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { result, err := AtLeast(1, nc.Find(ProvidingAPIPredicate(opregistry.APIKey{Group: "g", Version: "v1", Kind: "K"}))) assert.NoError(t, err) assert.Equal(t, 1, len(result)) - assert.Equal(t, "K.v1.g", result[0].providedAPIs.String()) - assert.Equal(t, "K2.v2.g2", result[0].requiredAPIs.String()) + assert.Equal(t, "K.v1.g", result[0].ProvidedAPIs.String()) + assert.Equal(t, "K2.v2.g2", result[0].RequiredAPIs.String()) } func TestNamespaceOperatorCacheError(t *testing.T) { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go similarity index 75% rename from vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 32c38b3f09..7b85124133 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "encoding/json" @@ -208,28 +208,28 @@ var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: // OperatorSurface describes the API surfaces provided and required by an Operator. type OperatorSurface interface { - ProvidedAPIs() APISet - RequiredAPIs() APISet + GetProvidedAPIs() APISet + GetRequiredAPIs() APISet Identifier() string - Replaces() string - Version() *semver.Version - SourceInfo() *OperatorSourceInfo - Bundle() *api.Bundle + GetReplaces() string + GetVersion() *semver.Version + GetSourceInfo() *OperatorSourceInfo + GetBundle() *api.Bundle Inline() bool - Properties() []*api.Property - Skips() []string + GetProperties() []*api.Property + GetSkips() []string } type Operator struct { - name string - replaces string - providedAPIs APISet - requiredAPIs APISet - version *semver.Version - bundle *api.Bundle - sourceInfo *OperatorSourceInfo - properties []*api.Property - skips []string + Name string + Replaces string + ProvidedAPIs APISet + RequiredAPIs APISet + Version *semver.Version + Bundle *api.Bundle + SourceInfo *OperatorSourceInfo + Properties []*api.Property + Skips []string } var _ OperatorSurface = &Operator{} @@ -265,13 +265,13 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg } } if len(bundle.Dependencies) > 0 { - ps, err := legacyDependenciesToProperties(bundle.Dependencies) + ps, err := LegacyDependenciesToProperties(bundle.Dependencies) if err != nil { return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) } properties = append(properties, ps...) } else { - ps, err := requiredAPIsToProperties(required) + ps, err := RequiredAPIsToProperties(required) if err != nil { return nil, err } @@ -279,15 +279,15 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg } o := &Operator{ - name: bundle.CsvName, - replaces: bundle.Replaces, - version: version, - providedAPIs: provided, - requiredAPIs: required, - bundle: bundle, - sourceInfo: sourceInfo, - properties: properties, - skips: bundle.Skips, + Name: bundle.CsvName, + Replaces: bundle.Replaces, + Version: version, + ProvidedAPIs: provided, + RequiredAPIs: required, + Bundle: bundle, + SourceInfo: sourceInfo, + Properties: properties, + Skips: bundle.Skips, } if !o.Inline() { @@ -331,91 +331,83 @@ func NewOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*Operator, if err != nil { return nil, err } - dependencies, err := requiredAPIsToProperties(requiredAPIs) + dependencies, err := RequiredAPIsToProperties(requiredAPIs) if err != nil { return nil, err } properties = append(properties, dependencies...) return &Operator{ - name: csv.GetName(), - version: &csv.Spec.Version.Version, - providedAPIs: providedAPIs, - requiredAPIs: requiredAPIs, - sourceInfo: &ExistingOperator, - properties: properties, + Name: csv.GetName(), + Version: &csv.Spec.Version.Version, + ProvidedAPIs: providedAPIs, + RequiredAPIs: requiredAPIs, + SourceInfo: &ExistingOperator, + Properties: properties, }, nil } -func (o *Operator) Name() string { - return o.name +func (o *Operator) GetProvidedAPIs() APISet { + return o.ProvidedAPIs } -func (o *Operator) ProvidedAPIs() APISet { - return o.providedAPIs -} - -func (o *Operator) RequiredAPIs() APISet { - return o.requiredAPIs +func (o *Operator) GetRequiredAPIs() APISet { + return o.RequiredAPIs } func (o *Operator) Identifier() string { - return o.name + return o.Name } -func (o *Operator) Replaces() string { - return o.replaces +func (o *Operator) GetReplaces() string { + return o.Replaces } -func (o *Operator) Skips() []string { - return o.skips -} - -func (o *Operator) SetReplaces(replacing string) { - o.replaces = replacing +func (o *Operator) GetSkips() []string { + return o.Skips } func (o *Operator) Package() string { - if o.bundle != nil { - return o.bundle.PackageName + if o.Bundle != nil { + return o.Bundle.PackageName } return "" } func (o *Operator) Channel() string { - if o.bundle != nil { - return o.bundle.ChannelName + if o.Bundle != nil { + return o.Bundle.ChannelName } return "" } -func (o *Operator) SourceInfo() *OperatorSourceInfo { - return o.sourceInfo +func (o *Operator) GetSourceInfo() *OperatorSourceInfo { + return o.SourceInfo } -func (o *Operator) Bundle() *api.Bundle { - return o.bundle +func (o *Operator) GetBundle() *api.Bundle { + return o.Bundle } -func (o *Operator) Version() *semver.Version { - return o.version +func (o *Operator) GetVersion() *semver.Version { + return o.Version } func (o *Operator) SemverRange() (semver.Range, error) { - return semver.ParseRange(o.Bundle().SkipRange) + return semver.ParseRange(o.Bundle.SkipRange) } func (o *Operator) Inline() bool { - return o.bundle != nil && o.bundle.GetBundlePath() == "" + return o.Bundle != nil && o.Bundle.GetBundlePath() == "" } -func (o *Operator) Properties() []*api.Property { - return o.properties +func (o *Operator) GetProperties() []*api.Property { + return o.Properties } func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { predicates = make([]OperatorPredicate, 0) - for _, property := range o.Properties() { + for _, property := range o.Properties { predicate, err := PredicateForProperty(property) if err != nil { return nil, err @@ -428,7 +420,7 @@ func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err e return } -func requiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { +func RequiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { if len(apis) == 0 { return } @@ -479,7 +471,7 @@ func providedAPIsToProperties(apis APISet) (out []*api.Property, err error) { return nil, nil } -func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { +func LegacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { var result []*api.Property for _, dependency := range dependencies { switch dependency.Type { @@ -538,3 +530,88 @@ func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Prop } return result, nil } + +func APISetToProperties(crds, apis APISet, deprecated bool) (out []*api.Property) { + out = make([]*api.Property, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if deprecated { + val, err := json.Marshal(opregistry.DeprecatedProperty{}) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.DeprecatedType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} + +func APISetToDependencies(crds, apis APISet) (out []*api.Dependency) { + if len(crds)+len(apis) == 0 { + return nil + } + out = make([]*api.Dependency, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go similarity index 92% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators_test.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go index eb295deec4..5e08f8b089 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "encoding/json" @@ -737,7 +737,7 @@ func TestAPIMultiOwnerSet_PopAPIKey(t *testing.T) { name: "OneApi/OneOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, + "owner1": &Operator{Name: "op1"}, }, }, }, @@ -745,8 +745,8 @@ func TestAPIMultiOwnerSet_PopAPIKey(t *testing.T) { name: "OneApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, }, @@ -754,12 +754,12 @@ func TestAPIMultiOwnerSet_PopAPIKey(t *testing.T) { name: "MultipleApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, }, @@ -797,41 +797,41 @@ func TestAPIMultiOwnerSet_PopAPIRequirers(t *testing.T) { name: "OneApi/OneOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, + "owner1": &Operator{Name: "op1"}, }, }, want: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, + "owner1": &Operator{Name: "op1"}, }, }, { name: "OneApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, want: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, { name: "MultipleApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, want: map[string]OperatorSurface{ - "owner1": &Operator{name: "op1"}, - "owner2": &Operator{name: "op2"}, + "owner1": &Operator{Name: "op1"}, + "owner2": &Operator{Name: "op2"}, }, }, } @@ -1077,12 +1077,12 @@ func TestNewOperatorFromBundle(t *testing.T) { sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ - name: "testBundle", - version: &version.Version, - providedAPIs: EmptyAPISet(), - requiredAPIs: EmptyAPISet(), - bundle: bundleNoAPIs, - sourceInfo: &OperatorSourceInfo{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: EmptyAPISet(), + Bundle: bundleNoAPIs, + SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, @@ -1096,9 +1096,9 @@ func TestNewOperatorFromBundle(t *testing.T) { sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ - name: "testBundle", - version: &version.Version, - providedAPIs: APISet{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: APISet{ opregistry.APIKey{ Group: "crd.group.com", Version: "v1", @@ -1112,7 +1112,7 @@ func TestNewOperatorFromBundle(t *testing.T) { Plural: "ownedapis", }: struct{}{}, }, - requiredAPIs: APISet{ + RequiredAPIs: APISet{ opregistry.APIKey{ Group: "crd.group.com", Version: "v1", @@ -1126,7 +1126,7 @@ func TestNewOperatorFromBundle(t *testing.T) { Plural: "requiredapis", }: struct{}{}, }, - properties: []*api.Property{ + Properties: []*api.Property{ { Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", @@ -1144,8 +1144,8 @@ func TestNewOperatorFromBundle(t *testing.T) { Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, }, - bundle: bundleWithAPIs, - sourceInfo: &OperatorSourceInfo{ + Bundle: bundleWithAPIs, + SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, @@ -1159,11 +1159,11 @@ func TestNewOperatorFromBundle(t *testing.T) { sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ - name: "testBundle", - providedAPIs: EmptyAPISet(), - requiredAPIs: EmptyAPISet(), - bundle: bundleWithAPIsUnextracted, - sourceInfo: &OperatorSourceInfo{ + Name: "testBundle", + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: EmptyAPISet(), + Bundle: bundleWithAPIsUnextracted, + SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, @@ -1178,12 +1178,12 @@ func TestNewOperatorFromBundle(t *testing.T) { defaultChannel: "testChannel", }, want: &Operator{ - name: "testBundle", - version: &version.Version, - providedAPIs: EmptyAPISet(), - requiredAPIs: EmptyAPISet(), - bundle: bundleNoAPIs, - sourceInfo: &OperatorSourceInfo{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: EmptyAPISet(), + Bundle: bundleNoAPIs, + SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, @@ -1198,11 +1198,11 @@ func TestNewOperatorFromBundle(t *testing.T) { sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ - name: "testBundle", - version: &version.Version, - providedAPIs: EmptyAPISet(), - requiredAPIs: EmptyAPISet(), - properties: []*api.Property{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: EmptyAPISet(), + Properties: []*api.Property{ { Type: "olm.gvk", Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", @@ -1220,8 +1220,8 @@ func TestNewOperatorFromBundle(t *testing.T) { Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", }, }, - bundle: bundleWithPropsAndDeps, - sourceInfo: &OperatorSourceInfo{ + Bundle: bundleWithPropsAndDeps, + SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, @@ -1233,8 +1233,8 @@ func TestNewOperatorFromBundle(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got, err := NewOperatorFromBundle(tt.args.bundle, "", tt.args.sourceKey, tt.args.defaultChannel) require.Equal(t, tt.wantErr, err) - requirePropertiesEqual(t, tt.want.properties, got.properties) - tt.want.properties, got.properties = nil, nil + requirePropertiesEqual(t, tt.want.Properties, got.Properties) + tt.want.Properties, got.Properties = nil, nil require.Equal(t, tt.want, got) }) } @@ -1264,11 +1264,11 @@ func TestNewOperatorFromCSV(t *testing.T) { }, }, want: &Operator{ - name: "operator.v1", - providedAPIs: EmptyAPISet(), - requiredAPIs: EmptyAPISet(), - sourceInfo: &ExistingOperator, - version: &version.Version, + Name: "operator.v1", + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: EmptyAPISet(), + SourceInfo: &ExistingOperator, + Version: &version.Version, }, }, { @@ -1303,12 +1303,12 @@ func TestNewOperatorFromCSV(t *testing.T) { }, }, want: &Operator{ - name: "operator.v1", - providedAPIs: map[opregistry.APIKey]struct{}{ + Name: "operator.v1", + ProvidedAPIs: map[opregistry.APIKey]struct{}{ {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, }, - properties: []*api.Property{ + Properties: []*api.Property{ { Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", @@ -1318,9 +1318,9 @@ func TestNewOperatorFromCSV(t *testing.T) { Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", }, }, - requiredAPIs: EmptyAPISet(), - sourceInfo: &ExistingOperator, - version: &version.Version, + RequiredAPIs: EmptyAPISet(), + SourceInfo: &ExistingOperator, + Version: &version.Version, }, }, { @@ -1355,13 +1355,13 @@ func TestNewOperatorFromCSV(t *testing.T) { }, }, want: &Operator{ - name: "operator.v1", - providedAPIs: EmptyAPISet(), - requiredAPIs: map[opregistry.APIKey]struct{}{ + Name: "operator.v1", + ProvidedAPIs: EmptyAPISet(), + RequiredAPIs: map[opregistry.APIKey]struct{}{ {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, }, - properties: []*api.Property{ + Properties: []*api.Property{ { Type: "olm.gvk.required", Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", @@ -1371,8 +1371,8 @@ func TestNewOperatorFromCSV(t *testing.T) { Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", }, }, - sourceInfo: &ExistingOperator, - version: &version.Version, + SourceInfo: &ExistingOperator, + Version: &version.Version, }, }, { @@ -1422,16 +1422,16 @@ func TestNewOperatorFromCSV(t *testing.T) { }, }, want: &Operator{ - name: "operator.v1", - providedAPIs: map[opregistry.APIKey]struct{}{ + Name: "operator.v1", + ProvidedAPIs: map[opregistry.APIKey]struct{}{ {Group: "g", Version: "v1", Kind: "APIOwnedKind", Plural: "apiownedkinds"}: {}, {Group: "g", Version: "v1", Kind: "CRDOwnedKind", Plural: "crdownedkinds"}: {}, }, - requiredAPIs: map[opregistry.APIKey]struct{}{ + RequiredAPIs: map[opregistry.APIKey]struct{}{ {Group: "g2", Version: "v1", Kind: "APIReqKind", Plural: "apireqkinds"}: {}, {Group: "g2", Version: "v1", Kind: "CRDReqKind", Plural: "crdreqkinds"}: {}, }, - properties: []*api.Property{ + Properties: []*api.Property{ { Type: "olm.gvk", Value: "{\"group\":\"g\",\"kind\":\"APIOwnedKind\",\"version\":\"v1\"}", @@ -1449,8 +1449,8 @@ func TestNewOperatorFromCSV(t *testing.T) { Value: "{\"group\":\"g2\",\"kind\":\"CRDReqKind\",\"version\":\"v1\"}", }, }, - sourceInfo: &ExistingOperator, - version: &version.Version, + SourceInfo: &ExistingOperator, + Version: &version.Version, }, }, } @@ -1458,8 +1458,8 @@ func TestNewOperatorFromCSV(t *testing.T) { t.Run(tt.name, func(t *testing.T) { got, err := NewOperatorFromV1Alpha1CSV(tt.args.csv) require.Equal(t, tt.wantErr, err) - requirePropertiesEqual(t, tt.want.properties, got.properties) - tt.want.properties, got.properties = nil, nil + requirePropertiesEqual(t, tt.want.Properties, got.Properties) + tt.want.Properties, got.Properties = nil, nil require.Equal(t, tt.want, got) }) } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go similarity index 95% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 4e731dd412..171ee5ac91 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "bytes" @@ -24,7 +24,7 @@ func CSVNamePredicate(name string) OperatorPredicate { } func (c csvNamePredicate) Test(o *Operator) bool { - return o.Name() == string(c) + return o.Name == string(c) } func (c csvNamePredicate) String() string { @@ -42,10 +42,10 @@ func (ch channelPredicate) Test(o *Operator) bool { if string(ch) == "" { return true } - if o.Bundle() == nil { + if o.Bundle == nil { return false } - return o.Bundle().ChannelName == string(ch) + return o.Bundle.ChannelName == string(ch) } func (ch channelPredicate) String() string { @@ -59,7 +59,7 @@ func PkgPredicate(pkg string) OperatorPredicate { } func (pkg pkgPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.PackageType { continue } @@ -89,7 +89,7 @@ func VersionInRangePredicate(r semver.Range, version string) OperatorPredicate { } func (v versionInRangePredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.PackageType { continue } @@ -106,7 +106,7 @@ func (v versionInRangePredicate) Test(o *Operator) bool { return true } } - return o.Version() != nil && v.r(*o.Version()) + return o.Version != nil && v.r(*o.Version) } func (v versionInRangePredicate) String() string { @@ -119,7 +119,7 @@ func LabelPredicate(label string) OperatorPredicate { return labelPredicate(label) } func (l labelPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.LabelType { continue } @@ -148,7 +148,7 @@ func CatalogPredicate(key registry.CatalogKey) OperatorPredicate { } func (c catalogPredicate) Test(o *Operator) bool { - return c.key.Equal(o.SourceInfo().Catalog) + return c.key.Equal(o.SourceInfo.Catalog) } func (c catalogPredicate) String() string { @@ -166,7 +166,7 @@ func ProvidingAPIPredicate(api opregistry.APIKey) OperatorPredicate { } func (g gvkPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.GVKType { continue } @@ -210,10 +210,10 @@ func ReplacesPredicate(replaces string) OperatorPredicate { } func (r replacesPredicate) Test(o *Operator) bool { - if o.Replaces() == string(r) { + if o.Replaces == string(r) { return true } - for _, s := range o.Skips() { + for _, s := range o.Skips { if s == string(r) { return true } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates_test.go similarity index 80% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates_test.go rename to staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates_test.go index 97947a7364..ad493b0a7d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates_test.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "testing" @@ -6,6 +6,16 @@ import ( "github.com/stretchr/testify/assert" ) +type OperatorPredicateTestFunc func(*Operator) bool + +func (opf OperatorPredicateTestFunc) Test(o *Operator) bool { + return opf(o) +} + +func (opf OperatorPredicateTestFunc) String() string { + return "" +} + func TestCountingPredicate(t *testing.T) { for _, tc := range []struct { Name string diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go index 2dcc276e08..72f3e68ebf 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go @@ -5,6 +5,7 @@ import ( "strings" v1 "github.com/operator-framework/api/pkg/operators/v1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type NamespaceSet map[string]struct{} @@ -93,7 +94,7 @@ type OperatorGroupSurface interface { Identifier() string Namespace() string Targets() NamespaceSet - ProvidedAPIs() APISet + ProvidedAPIs() cache.APISet GroupIntersection(groups ...OperatorGroupSurface) []OperatorGroupSurface } @@ -103,7 +104,7 @@ type OperatorGroup struct { namespace string name string targets NamespaceSet - providedAPIs APISet + providedAPIs cache.APISet } func NewOperatorGroup(group *v1.OperatorGroup) *OperatorGroup { @@ -119,7 +120,7 @@ func NewOperatorGroup(group *v1.OperatorGroup) *OperatorGroup { namespace: group.GetNamespace(), name: group.GetName(), targets: NewNamespaceSet(namespaces), - providedAPIs: GVKStringToProvidedAPISet(gvksStr), + providedAPIs: cache.GVKStringToProvidedAPISet(gvksStr), } } @@ -144,7 +145,7 @@ func (g *OperatorGroup) Targets() NamespaceSet { return g.targets } -func (g *OperatorGroup) ProvidedAPIs() APISet { +func (g *OperatorGroup) ProvidedAPIs() cache.APISet { return g.providedAPIs } @@ -174,18 +175,18 @@ const ( ) type APIIntersectionReconciler interface { - Reconcile(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult + Reconcile(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult } -type APIIntersectionReconcileFunc func(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult +type APIIntersectionReconcileFunc func(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult -func (a APIIntersectionReconcileFunc) Reconcile(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { +func (a APIIntersectionReconcileFunc) Reconcile(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { return a(add, group, otherGroups...) } -func ReconcileAPIIntersection(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { +func ReconcileAPIIntersection(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { groupIntersection := group.GroupIntersection(otherGroups...) - providedAPIIntersection := make(APISet) + providedAPIIntersection := make(cache.APISet) for _, g := range groupIntersection { providedAPIIntersection = providedAPIIntersection.Union(g.ProvidedAPIs()) } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go index 20fbc56a56..6b2be428d4 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go @@ -8,7 +8,8 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "github.com/operator-framework/api/pkg/operators/v1" + v1 "github.com/operator-framework/api/pkg/operators/v1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) func buildAPIOperatorGroup(namespace, name string, targets []string, gvks []string) *v1.OperatorGroup { @@ -38,7 +39,7 @@ func TestNewOperatorGroup(t *testing.T) { namespace: "ns", name: "empty-group", targets: make(NamespaceSet), - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -51,7 +52,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns": {}, "ns-1": {}, }, - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -63,7 +64,7 @@ func TestNewOperatorGroup(t *testing.T) { targets: NamespaceSet{ "ns": {}, }, - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -77,7 +78,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns-1": {}, "ns-2": {}, }, - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -89,7 +90,7 @@ func TestNewOperatorGroup(t *testing.T) { targets: NamespaceSet{ metav1.NamespaceAll: {}, }, - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -102,7 +103,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns": {}, "ns-1": {}, }, - providedAPIs: APISet{ + providedAPIs: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, }, @@ -117,7 +118,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns": {}, "ns-1": {}, }, - providedAPIs: make(APISet), + providedAPIs: make(cache.APISet), }, }, { @@ -130,7 +131,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns": {}, "ns-1": {}, }, - providedAPIs: APISet{ + providedAPIs: cache.APISet{ opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Moose"}: {}, }, }, @@ -145,7 +146,7 @@ func TestNewOperatorGroup(t *testing.T) { "ns": {}, "ns-1": {}, }, - providedAPIs: APISet{ + providedAPIs: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Moose"}: {}, }, @@ -804,21 +805,21 @@ func TestGroupIntersection(t *testing.T) { func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReconciler) { tests := []struct { name string - add APISet + add cache.APISet group OperatorGroupSurface otherGroups []OperatorGroupSurface want APIReconciliationResult }{ { name: "Empty/NoAPIConflict", - add: make(APISet), + add: make(cache.APISet), group: buildOperatorGroup("ns", "g1", []string{"ns"}, nil), otherGroups: nil, want: NoAPIConflict, }, { name: "NoNamespaceIntersection/APIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -829,7 +830,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersection/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -840,7 +841,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "MultipleNamespaceIntersections/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -852,7 +853,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "SomeNamespaceIntersection/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Moose"}: {}, }, @@ -866,7 +867,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersection/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, []string{"Goose.v1alpha1.birds.com"}), @@ -877,7 +878,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersectionOnOther/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -888,7 +889,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceInstersectionOnOther/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, []string{"Goose.v1alpha1.birds.com"}), @@ -899,7 +900,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersection/NoAPIIntersection/NoAPIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -910,7 +911,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersection/APIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -921,7 +922,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersection/APIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, nil), @@ -932,7 +933,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersectionOnOther/APIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -943,7 +944,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersectionOnBoth/APIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, nil), @@ -954,7 +955,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersection/SomeAPIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -966,7 +967,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersectionOnOperatorNamespace/SomeAPIIntersection/APIConflict", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -978,7 +979,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco { name: "NoNamespaceIntersection/NoAPIIntersection/AddAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -989,7 +990,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceIntersection/NoAPIIntersection/AddAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -1000,7 +1001,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "OperatorNamespaceIntersection/NoAPIIntersection/AddAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -1011,7 +1012,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersection/NoAPIIntersection/AddAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, nil), @@ -1023,7 +1024,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersectionOnOthers/NoAPIIntersection/AddAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, nil), @@ -1035,7 +1036,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceIntersectionOnOthers/NoAPIIntersection/AddAPIs/PrexistingAddition", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Cow"}: {}, }, @@ -1048,7 +1049,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "NamespaceInstersection/APIIntersection/RemoveAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -1059,7 +1060,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceInstersection/APIIntersection/RemoveAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, []string{"Goose.v1alpha1.birds.com"}), @@ -1070,7 +1071,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "AllNamespaceInstersectionOnOther/APIIntersection/RemoveAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{""}, []string{"Goose.v1alpha1.birds.com"}), @@ -1081,7 +1082,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "MultipleNamespaceIntersections/APIIntersection/RemoveAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, }, group: buildOperatorGroup("ns", "g1", []string{"ns-1"}, []string{"Goose.v1alpha1.birds.com"}), @@ -1093,7 +1094,7 @@ func apiIntersectionReconcilerSuite(t *testing.T, reconciler APIIntersectionReco }, { name: "SomeNamespaceIntersection/APIIntersection/RemoveAPIs", - add: APISet{ + add: cache.APISet{ opregistry.APIKey{Group: "birds.com", Version: "v1alpha1", Kind: "Goose"}: {}, opregistry.APIKey{Group: "mammals.com", Version: "v1alpha1", Kind: "Moose"}: {}, }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index a76361d3f2..94302d53ee 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" operatorregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -55,14 +56,13 @@ func bundleId(bundle, channel string, catalog registry.CatalogKey) solver.Identi return solver.IdentifierFromString(fmt.Sprintf("%s/%s/%s", catalog.String(), channel, bundle)) } -func NewBundleInstallableFromOperator(o *Operator) (BundleInstallable, error) { - src := o.SourceInfo() - if src == nil { - return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Identifier()) +func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, error) { + if o.SourceInfo == nil { + return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Name) } - id := bundleId(o.Identifier(), o.Channel(), src.Catalog) + id := bundleId(o.Identifier(), o.Channel(), o.SourceInfo.Catalog) var constraints []solver.Constraint - if src.Catalog.Virtual() && src.Subscription == nil { + if o.SourceInfo.Catalog.Virtual() && o.SourceInfo.Subscription == nil { // CSVs already associated with a Subscription // may be replaced, but freestanding CSVs must // appear in any solution. @@ -71,7 +71,7 @@ func NewBundleInstallableFromOperator(o *Operator) (BundleInstallable, error) { fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Identifier()), )) } - for _, p := range o.bundle.GetProperties() { + for _, p := range o.Properties { if p.GetType() == operatorregistry.DeprecatedType { constraints = append(constraints, PrettyConstraint( solver.Prohibited(), diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go index cf408ef00d..9b10eb2d6d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go @@ -1,6 +1,7 @@ package resolver import ( + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" @@ -15,7 +16,7 @@ const ( // Concrete types other than OperatorSurface and CustomResource definition no-op. func LabelSetsFor(obj interface{}) ([]labels.Set, error) { switch v := obj.(type) { - case OperatorSurface: + case cache.OperatorSurface: return labelSetsForOperatorSurface(v) case *extv1beta1.CustomResourceDefinition: return labelSetsForCRD(v) @@ -24,17 +25,17 @@ func LabelSetsFor(obj interface{}) ([]labels.Set, error) { } } -func labelSetsForOperatorSurface(surface OperatorSurface) ([]labels.Set, error) { +func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} - for key := range surface.ProvidedAPIs().StripPlural() { - hash, err := APIKeyToGVKHash(key) + for key := range surface.GetProvidedAPIs().StripPlural() { + hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } labelSet[APILabelKeyPrefix+hash] = "provided" } - for key := range surface.RequiredAPIs().StripPlural() { - hash, err := APIKeyToGVKHash(key) + for key := range surface.GetRequiredAPIs().StripPlural() { + hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } @@ -52,7 +53,7 @@ func labelSetsForCRD(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, er // Add label sets for each version for _, version := range crd.Spec.Versions { - hash, err := APIKeyToGVKHash(registry.APIKey{ + hash, err := cache.APIKeyToGVKHash(registry.APIKey{ Group: crd.Spec.Group, Version: version.Name, Kind: crd.Spec.Names.Kind, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go index 2c26a7dece..caf16f972e 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go @@ -3,6 +3,7 @@ package resolver import ( "testing" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" opregistry "github.com/operator-framework/operator-registry/pkg/registry" "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/labels" @@ -43,8 +44,8 @@ func TestLabelSetsFor(t *testing.T) { }, { name: "OperatorSurface/Provided", - obj: &Operator{ - providedAPIs: map[opregistry.APIKey]struct{}{ + obj: &cache.Operator{ + ProvidedAPIs: map[opregistry.APIKey]struct{}{ opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, }, }, @@ -56,11 +57,11 @@ func TestLabelSetsFor(t *testing.T) { }, { name: "OperatorSurface/ProvidedAndRequired", - obj: &Operator{ - providedAPIs: map[opregistry.APIKey]struct{}{ + obj: &cache.Operator{ + ProvidedAPIs: map[opregistry.APIKey]struct{}{ opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, }, - requiredAPIs: map[opregistry.APIKey]struct{}{ + RequiredAPIs: map[opregistry.APIKey]struct{}{ opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Goblin", Plural: "Goblins"}: {}, }, }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 96201146a7..a8eeaf51bf 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -14,6 +14,7 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-registry/pkg/api" @@ -21,17 +22,17 @@ import ( ) type OperatorResolver interface { - SolveOperators(csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription, add map[OperatorSourceInfo]struct{}) (OperatorSet, error) + SolveOperators(csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription, add map[cache.OperatorSourceInfo]struct{}) (cache.OperatorSet, error) } type SatResolver struct { - cache OperatorCacheProvider + cache cache.OperatorCacheProvider log logrus.FieldLogger } -func NewDefaultSatResolver(rcp RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { +func NewDefaultSatResolver(rcp cache.RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { return &SatResolver{ - cache: NewOperatorCache(rcp, log, catsrcLister), + cache: cache.NewOperatorCache(rcp, log, catsrcLister), log: log, } } @@ -46,11 +47,11 @@ func (w *debugWriter) Write(b []byte) (int, error) { return n, nil } -func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription) (OperatorSet, error) { +func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription) (cache.OperatorSet, error) { var errs []error installables := make(map[solver.Identifier]solver.Installable, 0) - visited := make(map[OperatorSurface]*BundleInstallable, 0) + visited := make(map[cache.OperatorSurface]*BundleInstallable, 0) // TODO: better abstraction startingCSVs := make(map[string]struct{}) @@ -73,10 +74,10 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust // build constraints for each Subscription for _, sub := range subs { // find the currently installed operator (if it exists) - var current *Operator + var current *cache.Operator for _, csv := range csvs { if csv.Name == sub.Status.InstalledCSV { - op, err := NewOperatorFromV1Alpha1CSV(csv) + op, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -140,7 +141,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust } } - operators := make(map[string]OperatorSurface, 0) + operators := make(map[string]cache.OperatorSurface, 0) for _, installableOperator := range operatorInstallables { csvName, channel, catalog, err := installableOperator.BundleSourceInfo() if err != nil { @@ -148,18 +149,18 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust continue } - op, err := ExactlyOne(namespacedCache.Catalog(catalog).Find(CSVNamePredicate(csvName), ChannelPredicate(channel))) + op, err := cache.ExactlyOne(namespacedCache.Catalog(catalog).Find(cache.CSVNamePredicate(csvName), cache.ChannelPredicate(channel))) if err != nil { errs = append(errs, err) continue } if len(installableOperator.Replaces) > 0 { - op.replaces = installableOperator.Replaces + op.Replaces = installableOperator.Replaces // TODO: Don't mutate object from cache! } // lookup if this installable came from a starting CSV if _, ok := startingCSVs[csvName]; ok { - op.sourceInfo.StartingCSV = csvName + op.SourceInfo.StartingCSV = csvName // TODO: Don't mutate object from cache! } operators[csvName] = op @@ -172,8 +173,8 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust return operators, nil } -func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *Operator, namespacedCache MultiCatalogOperatorFinder, visited map[OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { - var cachePredicates, channelPredicates []OperatorPredicate +func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { + var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) catalog := registry.CatalogKey{ @@ -181,24 +182,24 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu Namespace: sub.Spec.CatalogSourceNamespace, } - var bundles []*Operator + var bundles []*cache.Operator { var nall, npkg, nch, ncsv int - csvPredicate := True() + csvPredicate := cache.True() if current != nil { // if we found an existing installed operator, we should filter the channel by operators that can replace it - channelPredicates = append(channelPredicates, Or(SkipRangeIncludesPredicate(*current.Version()), ReplacesPredicate(current.Identifier()))) + channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Identifier()))) } else if sub.Spec.StartingCSV != "" { // if no operator is installed and we have a startingCSV, filter for it - csvPredicate = CSVNamePredicate(sub.Spec.StartingCSV) + csvPredicate = cache.CSVNamePredicate(sub.Spec.StartingCSV) } - cachePredicates = append(cachePredicates, And( - CountingPredicate(True(), &nall), - CountingPredicate(PkgPredicate(sub.Spec.Package), &npkg), - CountingPredicate(ChannelPredicate(sub.Spec.Channel), &nch), - CountingPredicate(csvPredicate, &ncsv), + cachePredicates = append(cachePredicates, cache.And( + cache.CountingPredicate(cache.True(), &nall), + cache.CountingPredicate(cache.PkgPredicate(sub.Spec.Package), &npkg), + cache.CountingPredicate(cache.ChannelPredicate(sub.Spec.Channel), &nch), + cache.CountingPredicate(csvPredicate, &ncsv), )) bundles = namespacedCache.Catalog(catalog).Find(cachePredicates...) @@ -223,23 +224,23 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // bundles in the default channel appear first, then lexicographically order by channel name sort.SliceStable(bundles, func(i, j int) bool { var idef bool - if isrc := bundles[i].SourceInfo(); isrc != nil { + if isrc := bundles[i].SourceInfo; isrc != nil { idef = isrc.DefaultChannel } var jdef bool - if jsrc := bundles[j].SourceInfo(); jsrc != nil { + if jsrc := bundles[j].SourceInfo; jsrc != nil { jdef = jsrc.DefaultChannel } if idef == jdef { - return bundles[i].bundle.ChannelName < bundles[j].bundle.ChannelName + return bundles[i].Bundle.ChannelName < bundles[j].Bundle.ChannelName } return idef }) - var sortedBundles []*Operator + var sortedBundles []*cache.Operator lastChannel, lastIndex := "", 0 for i := 0; i <= len(bundles); i++ { - if i != len(bundles) && bundles[i].bundle.ChannelName == lastChannel { + if i != len(bundles) && bundles[i].Bundle.ChannelName == lastChannel { continue } channel, err := sortChannel(bundles[lastIndex:i]) @@ -249,14 +250,14 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu sortedBundles = append(sortedBundles, channel...) if i != len(bundles) { - lastChannel = bundles[i].bundle.ChannelName + lastChannel = bundles[i].Bundle.ChannelName lastIndex = i } } candidates := make([]*BundleInstallable, 0) - for _, o := range Filter(sortedBundles, channelPredicates...) { - predicates := append(cachePredicates, CSVNamePredicate(o.Identifier())) + for _, o := range cache.Filter(sortedBundles, channelPredicates...) { + predicates := append(cachePredicates, cache.CSVNamePredicate(o.Identifier())) stack := namespacedCache.Catalog(catalog).Find(predicates...) id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) if err != nil { @@ -302,12 +303,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*Operator, namespacedCache MultiCatalogOperatorFinder, visited map[OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies // track the first layer of installable ids - var initial = make(map[*Operator]struct{}) + var initial = make(map[*cache.Operator]struct{}) for _, o := range bundleStack { initial[o] = struct{}{} } @@ -340,15 +341,15 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS } for _, d := range dependencyPredicates { - sourcePredicate := False() + sourcePredicate := cache.False() // Build a filter matching all (catalog, // package, channel) combinations that contain // at least one candidate bundle, even if only // a subset of those bundles actually satisfy // the dependency. - sources := map[OperatorSourceInfo]struct{}{} + sources := map[cache.OperatorSourceInfo]struct{}{} for _, b := range namespacedCache.Find(d) { - si := b.SourceInfo() + si := b.SourceInfo if _, ok := sources[*si]; ok { // Predicate already covers this source. @@ -357,19 +358,19 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS sources[*si] = struct{}{} if si.Catalog.Virtual() { - sourcePredicate = Or(sourcePredicate, And( - CSVNamePredicate(b.Identifier()), - CatalogPredicate(si.Catalog), + sourcePredicate = cache.Or(sourcePredicate, cache.And( + cache.CSVNamePredicate(b.Identifier()), + cache.CatalogPredicate(si.Catalog), )) } else { - sourcePredicate = Or(sourcePredicate, And( - PkgPredicate(si.Package), - ChannelPredicate(si.Channel), - CatalogPredicate(si.Catalog), + sourcePredicate = cache.Or(sourcePredicate, cache.And( + cache.PkgPredicate(si.Package), + cache.ChannelPredicate(si.Channel), + cache.CatalogPredicate(si.Catalog), )) } } - sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.sourceInfo.Catalog, sourcePredicate)) + sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, sourcePredicate)) if err != nil { errs = append(errs, err) continue @@ -378,7 +379,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS // The dependency predicate is applied here // (after sorting) to remove all bundles that // don't satisfy the dependency. - for _, b := range Filter(sortedBundles, d) { + for _, b := range cache.Filter(sortedBundles, d) { i, err := NewBundleInstallableFromOperator(b) if err != nil { errs = append(errs, err) @@ -390,7 +391,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS } bundleInstallable.AddConstraint(PrettyConstraint( solver.Dependency(bundleDependencies...), - fmt.Sprintf("bundle %s requires an operator %s", bundle.name, d.String()), + fmt.Sprintf("bundle %s requires an operator %s", bundle.Name, d.String()), )) } @@ -421,7 +422,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs // package against catalog contents, updates to the // Subscription spec could result in a bad package // inference. - for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(And(CSVNamePredicate(csv.Name), PkgPredicate(sub.Spec.Package))) { + for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { if pkg := entry.Package(); pkg != "" { packages[pkg] = struct{}{} } @@ -454,7 +455,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs return properties, nil } -func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*CatalogSnapshot, error) { +func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.CatalogSnapshot, error) { existingOperatorCatalog := registry.NewVirtualCatalogKey(namespace) // build a catalog snapshot of CSVs without subscriptions csvSubscriptions := make(map[*v1alpha1.ClusterServiceVersion]*v1alpha1.Subscription) @@ -467,9 +468,9 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 } } var csvsMissingProperties []*v1alpha1.ClusterServiceVersion - standaloneOperators := make([]*Operator, 0) + standaloneOperators := make([]*cache.Operator, 0) for _, csv := range csvs { - op, err := NewOperatorFromV1Alpha1CSV(csv) + op, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -479,20 +480,20 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 if inferred, err := r.inferProperties(csv, subs); err != nil { r.log.Warnf("unable to infer properties for csv %q: %w", csv.Name, err) } else { - op.properties = append(op.properties, inferred...) + op.Properties = append(op.Properties, inferred...) } } else if props, err := projection.PropertyListFromPropertiesAnnotation(anno); err != nil { return nil, fmt.Errorf("failed to retrieve properties of csv %q: %w", csv.GetName(), err) } else { - op.properties = props + op.Properties = props } - op.sourceInfo = &OperatorSourceInfo{ + op.SourceInfo = &cache.OperatorSourceInfo{ Catalog: existingOperatorCatalog, Subscription: csvSubscriptions[csv], } // Try to determine source package name from properties and add to SourceInfo. - for _, p := range op.properties { + for _, p := range op.Properties { if p.Type != opregistry.PackageType { continue } @@ -502,7 +503,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Warnf("failed to unmarshal package property of csv %q: %w", csv.Name, err) continue } - op.sourceInfo.Package = pp.PackageName + op.SourceInfo.Package = pp.PackageName } standaloneOperators = append(standaloneOperators, op) @@ -516,10 +517,10 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Infof("considered csvs without properties annotation during resolution: %v", names) } - return NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil + return cache.NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil } -func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { +func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { // no two operators may provide the same GVK or Package in a namespace gvkConflictToInstallable := make(map[opregistry.GVKProperty][]solver.Identifier) packageConflictToInstallable := make(map[string][]solver.Identifier) @@ -533,13 +534,13 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, continue } - op, err := ExactlyOne(namespacedCache.Catalog(catalog).Find(CSVNamePredicate(csvName), ChannelPredicate(channel))) + op, err := cache.ExactlyOne(namespacedCache.Catalog(catalog).Find(cache.CSVNamePredicate(csvName), cache.ChannelPredicate(channel))) if err != nil { continue } // cannot provide the same GVK - for _, p := range op.Properties() { + for _, p := range op.Properties { if p.Type != opregistry.GVKType { continue } @@ -552,7 +553,7 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, } // cannot have the same package - for _, p := range op.Properties() { + for _, p := range op.Properties { if p.Type != opregistry.PackageType { continue } @@ -576,7 +577,7 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, } } -func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { +func (r *SatResolver) sortBundles(bundles []*cache.Operator) ([]*cache.Operator, error) { // assume bundles have been passed in sorted by catalog already catalogOrder := make([]registry.CatalogKey, 0) @@ -588,22 +589,22 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { channelOrder := make(map[registry.CatalogKey][]PackageChannel) // partition by catalog -> channel -> bundle - partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*Operator{} + partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*cache.Operator{} for _, b := range bundles { pc := PackageChannel{ Package: b.Package(), Channel: b.Channel(), - DefaultChannel: b.SourceInfo().DefaultChannel, + DefaultChannel: b.SourceInfo.DefaultChannel, } - if _, ok := partitionedBundles[b.sourceInfo.Catalog]; !ok { - catalogOrder = append(catalogOrder, b.sourceInfo.Catalog) - partitionedBundles[b.sourceInfo.Catalog] = make(map[PackageChannel][]*Operator) + if _, ok := partitionedBundles[b.SourceInfo.Catalog]; !ok { + catalogOrder = append(catalogOrder, b.SourceInfo.Catalog) + partitionedBundles[b.SourceInfo.Catalog] = make(map[PackageChannel][]*cache.Operator) } - if _, ok := partitionedBundles[b.sourceInfo.Catalog][pc]; !ok { - channelOrder[b.sourceInfo.Catalog] = append(channelOrder[b.sourceInfo.Catalog], pc) - partitionedBundles[b.sourceInfo.Catalog][pc] = make([]*Operator, 0) + if _, ok := partitionedBundles[b.SourceInfo.Catalog][pc]; !ok { + channelOrder[b.SourceInfo.Catalog] = append(channelOrder[b.SourceInfo.Catalog], pc) + partitionedBundles[b.SourceInfo.Catalog][pc] = make([]*cache.Operator, 0) } - partitionedBundles[b.sourceInfo.Catalog][pc] = append(partitionedBundles[b.sourceInfo.Catalog][pc], b) + partitionedBundles[b.SourceInfo.Catalog][pc] = append(partitionedBundles[b.SourceInfo.Catalog][pc], b) } for catalog := range partitionedBundles { @@ -625,7 +626,7 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { partitionedBundles[catalog][channel] = sorted } } - all := make([]*Operator, 0) + all := make([]*cache.Operator, 0) for _, catalog := range catalogOrder { for _, channel := range channelOrder[catalog] { all = append(all, partitionedBundles[catalog][channel]...) @@ -636,7 +637,7 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { // Sorts bundle in a channel by replaces. All entries in the argument // are assumed to have the same Package and Channel. -func sortChannel(bundles []*Operator) ([]*Operator, error) { +func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { if len(bundles) < 1 { return bundles, nil } @@ -644,25 +645,25 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { packageName := bundles[0].Package() channelName := bundles[0].Channel() - bundleLookup := map[string]*Operator{} + bundleLookup := map[string]*cache.Operator{} // if a replaces b, then replacedBy[b] = a - replacedBy := map[*Operator]*Operator{} - replaces := map[*Operator]*Operator{} - skipped := map[string]*Operator{} + replacedBy := map[*cache.Operator]*cache.Operator{} + replaces := map[*cache.Operator]*cache.Operator{} + skipped := map[string]*cache.Operator{} for _, b := range bundles { bundleLookup[b.Identifier()] = b } for _, b := range bundles { - if b.replaces != "" { - if r, ok := bundleLookup[b.replaces]; ok { + if b.Replaces != "" { + if r, ok := bundleLookup[b.Replaces]; ok { replacedBy[r] = b replaces[b] = r } } - for _, skip := range b.skips { + for _, skip := range b.Skips { if r, ok := bundleLookup[skip]; ok { replacedBy[r] = b skipped[skip] = r @@ -672,7 +673,7 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { // a bundle without a replacement is a channel head, but if we // find more than one of those something is weird - headCandidates := []*Operator{} + headCandidates := []*cache.Operator{} for _, b := range bundles { if _, ok := replacedBy[b]; !ok { headCandidates = append(headCandidates, b) @@ -682,10 +683,10 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { return nil, fmt.Errorf("no channel heads (entries not replaced by another entry) found in channel %q of package %q", channelName, packageName) } - var chains [][]*Operator + var chains [][]*cache.Operator for _, head := range headCandidates { - var chain []*Operator - visited := make(map[*Operator]struct{}) + var chain []*cache.Operator + visited := make(map[*cache.Operator]struct{}) current := head for { visited[current] = struct{}{} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go index b954425930..fc9b3eb336 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go @@ -16,13 +16,14 @@ import ( "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) func TestSolveOperators(t *testing.T) { - APISet := APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} Provides := APISet const namespace = "test-namespace" @@ -34,11 +35,11 @@ func TestSolveOperators(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.1", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, @@ -53,7 +54,7 @@ func TestSolveOperators(t *testing.T) { operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v1": genOperator("packageB.v1", "1.0.1", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), } require.EqualValues(t, expected, operators) @@ -66,11 +67,11 @@ func TestDisjointChannelGraph(t *testing.T) { newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("packageA.side1.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageA.side1.v2", "0.0.2", "packageA.side1.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageA.side2.v1", "1.0.0", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), @@ -103,11 +104,11 @@ func TestPropertiesAnnotationHonored(t *testing.T) { b := genOperator("packageB.v1", "1.0.1", "", "packageB", "alpha", "community", "olm", nil, nil, []*api.Dependency{{Type: "olm.package", Value: `{"packageName":"packageA","version":"1.0.0"}`}}, "", false) - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ community: { - key: community, - operators: []*Operator{b}, + Key: community, + Operators: []*cache.Operator{b}, }, }, } @@ -119,14 +120,14 @@ func TestPropertiesAnnotationHonored(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v1": b, } require.EqualValues(t, expected, operators) } func TestSolveOperators_MultipleChannels(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -138,11 +139,11 @@ func TestSolveOperators_MultipleChannels(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "beta", "community", "olm", nil, nil, nil, "", false), @@ -157,7 +158,7 @@ func TestSolveOperators_MultipleChannels(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v1": genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), } assert.Len(t, operators, 1) @@ -167,7 +168,7 @@ func TestSolveOperators_MultipleChannels(t *testing.T) { } func TestSolveOperators_FindLatestVersion(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -179,17 +180,17 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -207,10 +208,10 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 2, len(operators)) for _, op := range operators { - assert.Equal(t, "1.0.1", op.Version().String()) + assert.Equal(t, "1.0.1", op.GetVersion().String()) } - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1.0.1": genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), } @@ -221,7 +222,7 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { } func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -244,17 +245,17 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -277,7 +278,7 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 4, len(operators)) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1.0.1": genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageC.v1.0.1": genOperator("packageC.v1.0.1", "1.0.1", "packageC.v1.0.0", "packageC", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -290,7 +291,7 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { } func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -319,17 +320,17 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -352,7 +353,7 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 5, len(operators)) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1.0.1": genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageC.v1.0.1": genOperator("packageC.v1.0.1", "1.0.1", "packageC.v1.0.0", "packageC", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -378,17 +379,17 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { newSub := newSub(namespace, "packageA", "alpha", customCatalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", namespace, nil, nil, opToAddVersionDeps, "", false), }, @@ -397,11 +398,11 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { Namespace: "olm", Name: "community-operator", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community-operator", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", namespace, nil, nil, nil, "", false), }, @@ -410,12 +411,12 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { Namespace: "olm", Name: "high-priority-operator", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "high-priority-operator", }, - priority: catalogSourcePriority(100), - operators: []*Operator{ + Priority: 100, + Operators: []*cache.Operator{ genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator", namespace, nil, nil, nil, "", false), }, @@ -430,7 +431,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1": genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator", "olm", @@ -442,16 +443,16 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } // Catsrc with the same priority, ns, different name - fakeNamespacedOperatorCache.snapshots[registry.CatalogKey{ + fakeNamespacedOperatorCache.Snapshots[registry.CatalogKey{ Namespace: "olm", Name: "community-operator", - }] = &CatalogSnapshot{ - key: registry.CatalogKey{ + }] = &cache.CatalogSnapshot{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community-operator", }, - priority: catalogSourcePriority(100), - operators: []*Operator{ + Priority: 100, + Operators: []*cache.Operator{ genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", namespace, nil, nil, nil, "", false), }, @@ -463,7 +464,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { operators, err = satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) assert.NoError(t, err) - expected = OperatorSet{ + expected = cache.OperatorSet{ "packageA.v1": genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", "olm", @@ -475,15 +476,15 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } // operators from the same catalogs source should be prioritized. - fakeNamespacedOperatorCache.snapshots[registry.CatalogKey{ + fakeNamespacedOperatorCache.Snapshots[registry.CatalogKey{ Namespace: "olm", Name: "community", - }] = &CatalogSnapshot{ - key: registry.CatalogKey{ + }] = &cache.CatalogSnapshot{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", namespace, nil, nil, opToAddVersionDeps, "", false), genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community", @@ -497,7 +498,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { operators, err = satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) assert.NoError(t, err) - expected = OperatorSet{ + expected = cache.OperatorSet{ "packageA.v1": genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageB.v1": genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community", "olm", @@ -511,7 +512,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } func TestSolveOperators_WithDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -530,17 +531,17 @@ func TestSolveOperators_WithDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -557,7 +558,7 @@ func TestSolveOperators_WithDependencies(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 3, len(operators)) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1.0.1": genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), "packageB.v1": genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageC.v1": genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -569,7 +570,7 @@ func TestSolveOperators_WithDependencies(t *testing.T) { } func TestSolveOperators_WithGVKDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -590,11 +591,11 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ community: { - key: community, - operators: []*Operator{ + Key: community, + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, Provides, nil, "", false), @@ -610,7 +611,7 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v1": genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), "packageC.v1": genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, Provides, nil, "", false), } @@ -644,20 +645,20 @@ func TestSolveOperators_WithLabelDependencies(t *testing.T) { operatorBv1 := genOperator("packageB.v1", "1.0.0", "", "packageB", "beta", "community", "olm", nil, nil, nil, "", false) for _, p := range props { - operatorBv1.properties = append(operatorBv1.properties, p) + operatorBv1.Properties = append(operatorBv1.Properties, p) } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, "", false), operatorBv1, }, @@ -672,7 +673,7 @@ func TestSolveOperators_WithLabelDependencies(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 2, len(operators)) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA": genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, "", false), "packageB.v1": operatorBv1, } @@ -696,17 +697,17 @@ func TestSolveOperators_WithUnsatisfiableLabelDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), }, @@ -723,7 +724,7 @@ func TestSolveOperators_WithUnsatisfiableLabelDependencies(t *testing.T) { } func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -749,17 +750,17 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), @@ -772,11 +773,11 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { Namespace: "olm", Name: "certified", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "certified", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageC.v1.0.0", "1.0.0", "", "packageC", "alpha", "certified", "olm", Provides2, Provides, deps2, "", false), genOperator("packageC.v1.0.1", "1.0.1", "packageC.v1.0.0", "packageC", "alpha", "certified", "olm", Provides2, Provides, deps2, "", false), genOperator("packageD.v1.0.1", "1.0.1", "", "packageD", "alpha", "certified", "olm", nil, Provides2, nil, "", false), @@ -792,7 +793,7 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) assert.Equal(t, 4, len(operators)) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v1.0.1": genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), "packageC.v1.0.1": genOperator("packageC.v1.0.1", "1.0.1", "packageC.v1.0.0", "packageC", "alpha", "community", "olm", Provides2, Provides, deps2, "", false), @@ -813,7 +814,7 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { const namespace = "olm" - Provides := APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} + Provides := cache.APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} community := registry.CatalogKey{Name: "community", Namespace: namespace} csvs := []*v1alpha1.ClusterServiceVersion{ existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil), @@ -836,11 +837,11 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ community: { - key: community, - operators: []*Operator{ + Key: community, + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, nil, unsatisfiableVersionDeps, "", false), @@ -850,11 +851,11 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { Namespace: "olm", Name: "certified", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "certified", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "certified", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "certified", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "certified", "olm", nil, nil, nil, "", false), @@ -869,7 +870,7 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v1": genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), "packageC.v1": genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "certified", "olm", nil, nil, nil, "", false), } @@ -883,7 +884,7 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { // Behavior: The resolver should prefer catalogs in the same namespace as the subscription. // It should also prefer the same catalog over global catalogs in terms of the operator cache. func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -896,20 +897,20 @@ func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) { sub := existingSub(namespace, "packageA.v1", "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{sub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, "", false), }, }, altnsCatalog: { - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", altnsCatalog.Name, altnsCatalog.Namespace, nil, Provides, nil, "", false), }, }, }, - namespaces: []string{namespace, altNamespace}, + Namespaces: []string{namespace, altNamespace}, } satResolver := SatResolver{ cache: getFakeOperatorCache(fakeNamespacedOperatorCache), @@ -919,7 +920,7 @@ func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) { operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, "", false), } require.EqualValues(t, expected, operators) @@ -928,7 +929,7 @@ func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) { // Behavior: The resolver should not look in catalogs not in the same namespace or the global catalog namespace when resolving the subscription. // This test should not result in a successful resolution because the catalog fulfilling the subscription is not in the operator cache. func TestSolveOperators_ResolveOnlyInCachedNamespaces(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -940,15 +941,15 @@ func TestSolveOperators_ResolveOnlyInCachedNamespaces(t *testing.T) { newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", otherCatalog.Name, otherCatalog.Namespace, nil, Provides, nil, "", false), }, }, }, - namespaces: []string{otherCatalog.Namespace}, + Namespaces: []string{otherCatalog.Namespace}, } satResolver := SatResolver{ cache: getFakeOperatorCache(fakeNamespacedOperatorCache), @@ -963,7 +964,7 @@ func TestSolveOperators_ResolveOnlyInCachedNamespaces(t *testing.T) { // Behavior: the resolver should always prefer the default channel for the subscribed bundle (unless we implement ordering for channels) func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -976,10 +977,10 @@ func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { newSub := newSub(namespace, "packageA", "", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - operators: []*Operator{ + Operators: []*cache.Operator{ // Default channel is stable in this case genOperator("packageA.v0.0.2", "0.0.2", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), @@ -997,7 +998,7 @@ func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { assert.NoError(t, err) // operator should be from the default stable channel - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), } require.EqualValues(t, expected, operators) @@ -1005,7 +1006,7 @@ func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { // Behavior: the resolver should always prefer the default channel for bundles satisfying transitive dependencies func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -1017,11 +1018,11 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie subs := []*v1alpha1.Subscription{newSub} const defaultChannel = "stable" - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - operators: []*Operator{ - genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(nil, Provides), defaultChannel, false), + Operators: []*cache.Operator{ + genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(nil, Provides), defaultChannel, false), genOperator("packageB.v0.0.1", "0.0.1", "packageB.v1", "packageB", defaultChannel, catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), genOperator("packageB.v0.0.2", "0.0.2", "packageB.v0.0.1", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), }, @@ -1038,15 +1039,15 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie assert.NoError(t, err) // operator should be from the default stable channel - expected := OperatorSet{ - "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(nil, Provides), defaultChannel, false), + expected := cache.OperatorSet{ + "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(nil, Provides), defaultChannel, false), "packageB.v0.0.1": genOperator("packageB.v0.0.1", "0.0.1", "packageB.v1", "packageB", defaultChannel, catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), } require.EqualValues(t, expected, operators) } func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -1064,17 +1065,17 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. }, } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), }, @@ -1088,8 +1089,8 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) - expected := OperatorSet{ - "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(Provides, nil), "", false), + expected := cache.OperatorSet{ + "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(Provides, nil), "", false), } assert.Equal(t, len(expected), len(operators)) for k := range expected { @@ -1099,7 +1100,7 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. } func TestSolveOperators_SubscriptionlessOperatorsCanConflict(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -1110,17 +1111,17 @@ func TestSolveOperators_SubscriptionlessOperatorsCanConflict(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, Provides, nil, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, Provides, nil, "", false), }, @@ -1137,10 +1138,10 @@ func TestSolveOperators_SubscriptionlessOperatorsCanConflict(t *testing.T) { } func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { - Provides1 := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} - Requires1 := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} - Provides2 := APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} - Requires2 := APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} + Provides1 := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + Requires1 := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + Provides2 := cache.APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} + Requires2 := cache.APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} ProvidesBoth := Provides1.Union(Provides2) RequiresBoth := Requires1.Union(Requires2) @@ -1151,11 +1152,11 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { newSub := newSub(namespace, "packageA", "stable", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, RequiresBoth, nil, nil, "", false), // Despite satisfying dependencies of opA, this is not chosen because it is in the same package genOperator("opABC.v1.0.0", "1.0.0", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, ProvidesBoth, nil, "", false), @@ -1165,8 +1166,8 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { }, }, secondaryCatalog: { - key: secondaryCatalog, - operators: []*Operator{ + Key: secondaryCatalog, + Operators: []*cache.Operator{ genOperator("opC.v1.0.0", "1.0.0", "", "packageB", "stable", secondaryCatalog.Name, secondaryCatalog.Namespace, nil, Provides2, nil, "stable", false), genOperator("opE.v1.0.0", "1.0.0", "", "packageC", "stable", secondaryCatalog.Name, secondaryCatalog.Namespace, nil, Provides2, nil, "", false), @@ -1181,7 +1182,7 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "opA.v1.0.0": genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, RequiresBoth, nil, nil, "", false), "opB.v1.0.0": genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "stable", false), "opE.v1.0.0": genOperator("opE.v1.0.0", "1.0.0", "", "packageC", "stable", secondaryCatalog.Name, secondaryCatalog.Namespace, nil, Provides2, nil, "", false), @@ -1194,9 +1195,9 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { } func TestSolveOperators_TransferApiOwnership(t *testing.T) { - Provides1 := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} - Requires1 := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} - Provides2 := APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} + Provides1 := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + Requires1 := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + Provides2 := cache.APISet{opregistry.APIKey{"g2", "v", "k", "ks"}: struct{}{}} ProvidesBoth := Provides1.Union(Provides2) namespace := "olm" @@ -1204,19 +1205,19 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { phases := []struct { subs []*v1alpha1.Subscription - catalog *CatalogSnapshot - expected OperatorSet + catalog *cache.CatalogSnapshot + expected cache.OperatorSet }{ { subs: []*v1alpha1.Subscription{newSub(namespace, "packageB", "stable", catalog)}, - catalog: &CatalogSnapshot{ - key: catalog, - operators: []*Operator{ + catalog: &cache.CatalogSnapshot{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), }, }, - expected: OperatorSet{ + expected: cache.OperatorSet{ "opA.v1.0.0": genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), "opB.v1.0.0": genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), }, @@ -1227,16 +1228,16 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { existingSub(namespace, "opA.v1.0.0", "packageA", "stable", catalog), existingSub(namespace, "opB.v1.0.0", "packageB", "stable", catalog), }, - catalog: &CatalogSnapshot{ - key: catalog, - operators: []*Operator{ + catalog: &cache.CatalogSnapshot{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opA.v1.0.1", "1.0.1", "opA.v1.0.0", "packageA", "stable", catalog.Name, catalog.Namespace, Requires1, nil, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), }, }, // nothing new to do here - expected: OperatorSet{}, + expected: cache.OperatorSet{}, }, { // will have two existing subs after resolving once @@ -1244,27 +1245,27 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { existingSub(namespace, "opA.v1.0.0", "packageA", "stable", catalog), existingSub(namespace, "opB.v1.0.0", "packageB", "stable", catalog), }, - catalog: &CatalogSnapshot{ - key: catalog, - operators: []*Operator{ + catalog: &cache.CatalogSnapshot{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opA.v1.0.1", "1.0.1", "opA.v1.0.0", "packageA", "stable", catalog.Name, catalog.Namespace, Requires1, nil, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), genOperator("opB.v1.0.1", "1.0.1", "opB.v1.0.0", "packageB", "stable", catalog.Name, catalog.Namespace, nil, ProvidesBoth, nil, "stable", false), }, }, - expected: OperatorSet{ + expected: cache.OperatorSet{ "opA.v1.0.1": genOperator("opA.v1.0.1", "1.0.1", "opA.v1.0.0", "packageA", "stable", catalog.Name, catalog.Namespace, Requires1, nil, nil, "", false), "opB.v1.0.1": genOperator("opB.v1.0.1", "1.0.1", "opB.v1.0.0", "packageB", "stable", catalog.Name, catalog.Namespace, nil, ProvidesBoth, nil, "stable", false), }, }, } - var operators OperatorSet + var operators cache.OperatorSet for i, p := range phases { t.Run(fmt.Sprintf("phase %d", i+1), func(t *testing.T) { - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: p.catalog, }, } @@ -1275,11 +1276,11 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { csvs := make([]*v1alpha1.ClusterServiceVersion, 0) for _, o := range operators { var pkg, channel string - if b := o.Bundle(); b != nil { + if b := o.GetBundle(); b != nil { pkg = b.PackageName channel = b.ChannelName } - csvs = append(csvs, existingOperator(namespace, o.Identifier(), pkg, channel, o.Replaces(), o.ProvidedAPIs(), o.RequiredAPIs(), nil, nil)) + csvs = append(csvs, existingOperator(namespace, o.Identifier(), pkg, channel, o.GetReplaces(), o.GetProvidedAPIs(), o.GetRequiredAPIs(), nil, nil)) } var err error @@ -1295,10 +1296,10 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { } type FakeOperatorCache struct { - fakedNamespacedOperatorCache NamespacedOperatorCache + fakedNamespacedOperatorCache cache.NamespacedOperatorCache } -func (f *FakeOperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { +func (f *FakeOperatorCache) Namespaced(namespaces ...string) cache.MultiCatalogOperatorFinder { return &f.fakedNamespacedOperatorCache } @@ -1306,40 +1307,40 @@ func (f *FakeOperatorCache) Expire(key registry.CatalogKey) { return } -func getFakeOperatorCache(fakedNamespacedOperatorCache NamespacedOperatorCache) OperatorCacheProvider { +func getFakeOperatorCache(fakedNamespacedOperatorCache cache.NamespacedOperatorCache) cache.OperatorCacheProvider { return &FakeOperatorCache{ fakedNamespacedOperatorCache: fakedNamespacedOperatorCache, } } -func genOperator(name, version, replaces, pkg, channel, catalogName, catalogNamespace string, requiredAPIs, providedAPIs APISet, dependencies []*api.Dependency, defaultChannel string, deprecated bool) *Operator { +func genOperator(name, version, replaces, pkg, channel, catalogName, catalogNamespace string, requiredAPIs, providedAPIs cache.APISet, dependencies []*api.Dependency, defaultChannel string, deprecated bool) *cache.Operator { semversion, _ := semver.Make(version) - properties := apiSetToProperties(providedAPIs, nil, deprecated) + properties := cache.APISetToProperties(providedAPIs, nil, deprecated) if len(dependencies) == 0 { - ps, err := requiredAPIsToProperties(requiredAPIs) + ps, err := cache.RequiredAPIsToProperties(requiredAPIs) if err != nil { panic(err) } properties = append(properties, ps...) } else { - ps, err := legacyDependenciesToProperties(dependencies) + ps, err := cache.LegacyDependenciesToProperties(dependencies) if err != nil { panic(err) } properties = append(properties, ps...) } - o := &Operator{ - name: name, - version: &semversion, - replaces: replaces, - bundle: &api.Bundle{ + o := &cache.Operator{ + Name: name, + Version: &semversion, + Replaces: replaces, + Bundle: &api.Bundle{ PackageName: pkg, ChannelName: channel, Dependencies: dependencies, Properties: properties, }, - properties: properties, - sourceInfo: &OperatorSourceInfo{ + Properties: properties, + SourceInfo: &cache.OperatorSourceInfo{ Catalog: registry.CatalogKey{ Name: catalogName, Namespace: catalogNamespace, @@ -1348,15 +1349,15 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName Package: pkg, Channel: channel, }, - providedAPIs: providedAPIs, - requiredAPIs: requiredAPIs, + ProvidedAPIs: providedAPIs, + RequiredAPIs: requiredAPIs, } - ensurePackageProperty(o, pkg, version) + cache.EnsurePackageProperty(o, pkg, version) return o } -func stripBundle(o *Operator) *Operator { - o.bundle = nil +func stripBundle(o *cache.Operator) *cache.Operator { + o.Bundle = nil return o } @@ -1367,11 +1368,11 @@ func TestSolveOperators_WithoutDeprecated(t *testing.T) { newSub(catalog.Namespace, "packageA", "alpha", catalog), } - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", true), }, }, @@ -1395,11 +1396,11 @@ func TestSolveOperatorsWithDeprecatedInnerChannelEntry(t *testing.T) { } logger, _ := test.NewNullLogger() resolver := SatResolver{ - cache: getFakeOperatorCache(NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("a-1", "1.0.0", "", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("a-2", "2.0.0", "a-1", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", true), genOperator("a-3", "3.0.0", "a-2", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), @@ -1417,7 +1418,7 @@ func TestSolveOperatorsWithDeprecatedInnerChannelEntry(t *testing.T) { } func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { - APISet := APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet := cache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides := APISet namespace := "olm" @@ -1435,27 +1436,27 @@ func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { opB := genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false) opB2 := genOperator("packageB.v2", "2.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false) - opB2.skips = []string{"packageB.v1"} + opB2.Skips = []string{"packageB.v1"} op1 := genOperator("packageA.v1", "1.0.0", "", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) op2 := genOperator("packageA.v2", "2.0.0", "packageA.v1", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) op3 := genOperator("packageA.v3", "3.0.0", "packageA.v2", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) op4 := genOperator("packageA.v4", "4.0.0", "packageA.v3", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) - op4.skips = []string{"packageA.v3"} + op4.Skips = []string{"packageA.v3"} op5 := genOperator("packageA.v5", "5.0.0", "packageA.v4", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) - op5.skips = []string{"packageA.v2", "packageA.v3", "packageA.v4"} + op5.Skips = []string{"packageA.v2", "packageA.v3", "packageA.v4"} op6 := genOperator("packageA.v6", "6.0.0", "packageA.v5", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ registry.CatalogKey{ Namespace: "olm", Name: "community", }: { - key: registry.CatalogKey{ + Key: registry.CatalogKey{ Namespace: "olm", Name: "community", }, - operators: []*Operator{ + Operators: []*cache.Operator{ opB, opB2, op1, op2, op3, op4, op5, op6, }, }, @@ -1468,8 +1469,8 @@ func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) assert.NoError(t, err) - opB.SourceInfo().StartingCSV = "packageB.v1" - expected := OperatorSet{ + opB.SourceInfo.StartingCSV = "packageB.v1" + expected := cache.OperatorSet{ "packageB.v1": opB, "packageA.v6": op6, } @@ -1485,13 +1486,13 @@ func TestSolveOperators_WithSkips(t *testing.T) { opB := genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false) opB2 := genOperator("packageB.v2", "2.0.0", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false) - opB2.skips = []string{"packageB.v1"} + opB2.Skips = []string{"packageB.v1"} - fakeNamespacedOperatorCache := NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ opB, opB2, }, }, @@ -1504,7 +1505,7 @@ func TestSolveOperators_WithSkips(t *testing.T) { operators, err := satResolver.SolveOperators([]string{namespace}, nil, subs) assert.NoError(t, err) - expected := OperatorSet{ + expected := cache.OperatorSet{ "packageB.v2": opB2, } require.EqualValues(t, expected, operators) @@ -1513,7 +1514,7 @@ func TestSolveOperators_WithSkips(t *testing.T) { func TestSolveOperatorsWithSkipsPreventingSelection(t *testing.T) { const namespace = "test-namespace" catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} - gvks := APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} + gvks := cache.APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} // Subscription candidate a-1 requires a GVK provided // exclusively by b-1, but b-1 is skipped by b-3 and can't be @@ -1521,17 +1522,17 @@ func TestSolveOperatorsWithSkipsPreventingSelection(t *testing.T) { subs := []*v1alpha1.Subscription{newSub(namespace, "a", "channel", catalog)} a1 := genOperator("a-1", "1.0.0", "", "a", "channel", catalog.Name, catalog.Namespace, gvks, nil, nil, "", false) b3 := genOperator("b-3", "3.0.0", "b-2", "b", "channel", catalog.Name, catalog.Namespace, nil, nil, nil, "", false) - b3.skips = []string{"b-1"} + b3.Skips = []string{"b-1"} b2 := genOperator("b-2", "2.0.0", "b-1", "b", "channel", catalog.Name, catalog.Namespace, nil, nil, nil, "", false) b1 := genOperator("b-1", "1.0.0", "", "b", "channel", catalog.Name, catalog.Namespace, nil, gvks, nil, "", false) logger, _ := test.NewNullLogger() satResolver := SatResolver{ - cache: getFakeOperatorCache(NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{a1, b3, b2, b1}, + Key: catalog, + Operators: []*cache.Operator{a1, b3, b2, b1}, }, }, }), @@ -1563,11 +1564,11 @@ func TestSolveOperatorsWithClusterServiceVersionHavingDependency(t *testing.T) { log, _ := test.NewNullLogger() r := SatResolver{ - cache: getFakeOperatorCache(NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ genOperator("b-2", "2.0.0", "b-1", "b", "default", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, }, @@ -1586,7 +1587,7 @@ func TestInferProperties(t *testing.T) { for _, tc := range []struct { Name string - Cache NamespacedOperatorCache + Cache cache.NamespacedOperatorCache CSV *v1alpha1.ClusterServiceVersion Subscriptions []*v1alpha1.Subscription Expected []*api.Property @@ -1663,14 +1664,14 @@ func TestInferProperties(t *testing.T) { }, { Name: "one matching subscription infers package property", - Cache: NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + Cache: cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ { - name: "a", - bundle: &api.Bundle{ + Name: "a", + Bundle: &api.Bundle{ PackageName: "x", }, }, @@ -1728,14 +1729,14 @@ func TestInferProperties(t *testing.T) { }, { Name: "one matching subscription infers package property without csv version", - Cache: NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + Cache: cache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ catalog: { - key: catalog, - operators: []*Operator{ + Key: catalog, + Operators: []*cache.Operator{ { - name: "a", - bundle: &api.Bundle{ + Name: "a", + Bundle: &api.Bundle{ PackageName: "x", }, }, @@ -1787,41 +1788,41 @@ func TestInferProperties(t *testing.T) { func TestSortChannel(t *testing.T) { for _, tc := range []struct { Name string - In []*Operator - Out []*Operator + In []*cache.Operator + Out []*cache.Operator Err error }{ { Name: "wrinkle-free", - In: []*Operator{ + In: []*cache.Operator{ { - name: "b", - bundle: &api.Bundle{ + Name: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "a", - replaces: "b", - bundle: &api.Bundle{ + Name: "a", + Replaces: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, }, - Out: []*Operator{ + Out: []*cache.Operator{ { - name: "a", - replaces: "b", - bundle: &api.Bundle{ + Name: "a", + Replaces: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "b", - bundle: &api.Bundle{ + Name: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, @@ -1835,19 +1836,19 @@ func TestSortChannel(t *testing.T) { }, { Name: "replacement cycle", - In: []*Operator{ + In: []*cache.Operator{ { - name: "a", - replaces: "b", - bundle: &api.Bundle{ + Name: "a", + Replaces: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "b", - replaces: "a", - bundle: &api.Bundle{ + Name: "b", + Replaces: "a", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, @@ -1857,27 +1858,27 @@ func TestSortChannel(t *testing.T) { }, { Name: "replacement cycle", - In: []*Operator{ + In: []*cache.Operator{ { - name: "a", - replaces: "b", - bundle: &api.Bundle{ + Name: "a", + Replaces: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "b", - replaces: "c", - bundle: &api.Bundle{ + Name: "b", + Replaces: "c", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "c", - replaces: "b", - bundle: &api.Bundle{ + Name: "c", + Replaces: "b", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, @@ -1887,73 +1888,73 @@ func TestSortChannel(t *testing.T) { }, { Name: "skipped and replaced entry omitted", - In: []*Operator{ + In: []*cache.Operator{ { - name: "a", - replaces: "b", - skips: []string{"b"}, + Name: "a", + Replaces: "b", + Skips: []string{"b"}, }, { - name: "b", + Name: "b", }, }, - Out: []*Operator{ + Out: []*cache.Operator{ { - name: "a", - replaces: "b", - skips: []string{"b"}, + Name: "a", + Replaces: "b", + Skips: []string{"b"}, }, }, }, { Name: "skipped entry omitted", - In: []*Operator{ + In: []*cache.Operator{ { - name: "a", - replaces: "b", - skips: []string{"c"}, + Name: "a", + Replaces: "b", + Skips: []string{"c"}, }, { - name: "b", - replaces: "c", + Name: "b", + Replaces: "c", }, { - name: "c", + Name: "c", }, }, - Out: []*Operator{ + Out: []*cache.Operator{ { - name: "a", - replaces: "b", - skips: []string{"c"}, + Name: "a", + Replaces: "b", + Skips: []string{"c"}, }, { - name: "b", - replaces: "c", + Name: "b", + Replaces: "c", }, }, }, { Name: "two replaces chains", - In: []*Operator{ + In: []*cache.Operator{ { - name: "a", - bundle: &api.Bundle{ + Name: "a", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "b", - replaces: "c", - bundle: &api.Bundle{ + Name: "b", + Replaces: "c", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, }, { - name: "c", - bundle: &api.Bundle{ + Name: "c", + Bundle: &api.Bundle{ PackageName: "package", ChannelName: "channel", }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 6f211e1bd4..9fb369ca32 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -19,6 +19,7 @@ import ( v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" ) @@ -48,7 +49,7 @@ type OperatorStepResolver struct { var _ StepResolver = &OperatorStepResolver{} func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versioned.Interface, kubeclient kubernetes.Interface, - globalCatalogNamespace string, provider RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { + globalCatalogNamespace string, provider cache.RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { return &OperatorStepResolver{ subLister: lister.OperatorsV1alpha1().SubscriptionLister(), csvLister: lister.OperatorsV1alpha1().ClusterServiceVersionLister(), @@ -56,7 +57,7 @@ func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versio client: client, kubeclient: kubeclient, globalCatalogNamespace: globalCatalogNamespace, - satResolver: NewDefaultSatResolver(NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), + satResolver: NewDefaultSatResolver(cache.NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), log: log, } } @@ -86,7 +87,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( return nil, nil, nil, err } - var operators OperatorSet + var operators cache.OperatorSet namespaces := []string{namespace, r.globalCatalogNamespace} operators, err = r.satResolver.SolveOperators(namespaces, csvs, subs) if err != nil { @@ -101,7 +102,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( for name, op := range operators { // Find any existing subscriptions that resolve to this operator. existingSubscriptions := make(map[*v1alpha1.Subscription]bool) - sourceInfo := *op.SourceInfo() + sourceInfo := *op.GetSourceInfo() for _, sub := range subs { if sub.Spec.Package != sourceInfo.Package { continue @@ -137,21 +138,21 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( } // add steps for any new bundle - if op.Bundle() != nil { + if op.GetBundle() != nil { if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.Bundle(), namespace, op.Replaces(), op.SourceInfo().Catalog.Name, op.SourceInfo().Catalog.Namespace) + bundleSteps, err := NewStepsFromBundle(op.GetBundle(), namespace, op.GetReplaces(), op.GetSourceInfo().Catalog.Name, op.GetSourceInfo().Catalog.Namespace) if err != nil { return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) } steps = append(steps, bundleSteps...) } else { lookup := v1alpha1.BundleLookup{ - Path: op.Bundle().GetBundlePath(), + Path: op.GetBundle().GetBundlePath(), Identifier: op.Identifier(), - Replaces: op.Replaces(), + Replaces: op.GetReplaces(), CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.SourceInfo().Catalog.Namespace, - Name: op.SourceInfo().Catalog.Name, + Namespace: op.GetSourceInfo().Catalog.Namespace, + Name: op.GetSourceInfo().Catalog.Name, }, Conditions: []v1alpha1.BundleLookupCondition{ { @@ -168,7 +169,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( }, }, } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties()); err != nil { + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.GetProperties()); err != nil { return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Identifier(), err) } else { lookup.Properties = anno @@ -178,8 +179,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) == 0 { // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.SourceInfo().StartingCSV = op.Identifier() - subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo()) + op.GetSourceInfo().StartingCSV = op.Identifier() + subStep, err := NewSubscriptionStepResource(namespace, *op.GetSourceInfo()) if err != nil { return nil, nil, nil, err } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go index 1aa6af0780..27225f556b 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go @@ -14,7 +14,6 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" k8sfake "k8s.io/client-go/kubernetes/fake" - "k8s.io/client-go/tools/cache" "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-registry/pkg/api" @@ -25,24 +24,26 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" + "k8s.io/client-go/tools/cache" ) var ( // conventions for tests: packages are letters (a,b,c) and apis are numbers (1,2,3) // APISets used for tests - APISet1 = APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} + APISet1 = resolvercache.APISet{opregistry.APIKey{"g", "v", "k", "ks"}: struct{}{}} Provides1 = APISet1 Requires1 = APISet1 - APISet2 = APISet{opregistry.APIKey{"g2", "v2", "k2", "k2s"}: struct{}{}} + APISet2 = resolvercache.APISet{opregistry.APIKey{"g2", "v2", "k2", "k2s"}: struct{}{}} Provides2 = APISet2 Requires2 = APISet2 - APISet3 = APISet{opregistry.APIKey{"g3", "v3", "k3", "k3s"}: struct{}{}} + APISet3 = resolvercache.APISet{opregistry.APIKey{"g3", "v3", "k3", "k3s"}: struct{}{}} Provides3 = APISet3 Requires3 = APISet3 - APISet4 = APISet{opregistry.APIKey{"g4", "v4", "k4", "k4s"}: struct{}{}} + APISet4 = resolvercache.APISet{opregistry.APIKey{"g4", "v4", "k4", "k4s"}: struct{}{}} Provides4 = APISet4 Requires4 = APISet4 ) @@ -826,20 +827,19 @@ func TestResolver(t *testing.T) { lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(namespace, informerFactory.Operators().V1alpha1().ClusterServiceVersions().Lister()) kClientFake := k8sfake.NewSimpleClientset() - stubSnapshot := &CatalogSnapshot{} + stubSnapshot := &resolvercache.CatalogSnapshot{} for _, bundles := range tt.bundlesByCatalog { for _, bundle := range bundles { - op, err := NewOperatorFromBundle(bundle, "", catalog, "") + op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } - op.replaces = bundle.Replaces - stubSnapshot.operators = append(stubSnapshot.operators, op) + stubSnapshot.Operators = append(stubSnapshot.Operators, op) } } stubCache := &stubOperatorCacheProvider{ - noc: &NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + noc: &resolvercache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*resolvercache.CatalogSnapshot{ catalog: stubSnapshot, }, }, @@ -880,10 +880,10 @@ func TestResolver(t *testing.T) { } type stubOperatorCacheProvider struct { - noc *NamespacedOperatorCache + noc *resolvercache.NamespacedOperatorCache } -func (stub *stubOperatorCacheProvider) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { +func (stub *stubOperatorCacheProvider) Namespaced(namespaces ...string) resolvercache.MultiCatalogOperatorFinder { return stub.noc } @@ -979,18 +979,17 @@ func TestNamespaceResolverRBAC(t *testing.T) { lister.OperatorsV1alpha1().RegisterSubscriptionLister(namespace, informerFactory.Operators().V1alpha1().Subscriptions().Lister()) lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(namespace, informerFactory.Operators().V1alpha1().ClusterServiceVersions().Lister()) - stubSnapshot := &CatalogSnapshot{} + stubSnapshot := &resolvercache.CatalogSnapshot{} for _, bundle := range tt.bundlesInCatalog { - op, err := NewOperatorFromBundle(bundle, "", catalog, "") + op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } - op.replaces = bundle.Replaces - stubSnapshot.operators = append(stubSnapshot.operators, op) + stubSnapshot.Operators = append(stubSnapshot.Operators, op) } stubCache := &stubOperatorCacheProvider{ - noc: &NamespacedOperatorCache{ - snapshots: map[registry.CatalogKey]*CatalogSnapshot{ + noc: &resolvercache.NamespacedOperatorCache{ + Snapshots: map[registry.CatalogKey]*resolvercache.CatalogSnapshot{ catalog: stubSnapshot, }, }, @@ -1102,7 +1101,7 @@ func existingSub(namespace, operatorName, pkg, channel string, catalog registry. } } -func existingOperator(namespace, operatorName, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIs, requiredAPIs APISet) *v1alpha1.ClusterServiceVersion { +func existingOperator(namespace, operatorName, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIs, requiredAPIs resolvercache.APISet) *v1alpha1.ClusterServiceVersion { bundleForOperator := bundle(operatorName, pkg, channel, replaces, providedCRDs, requiredCRDs, providedAPIs, requiredAPIs) csv, err := V1alpha1CSVFromBundle(bundleForOperator) if err != nil { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go index d800dff869..7f2270881b 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go @@ -17,6 +17,7 @@ import ( k8sscheme "k8s.io/client-go/kubernetes/scheme" "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" ) @@ -86,7 +87,7 @@ func NewStepResourceFromObject(obj runtime.Object, catalogSourceName, catalogSou return resource, nil } -func NewSubscriptionStepResource(namespace string, info OperatorSourceInfo) (v1alpha1.StepResource, error) { +func NewSubscriptionStepResource(namespace string, info cache.OperatorSourceInfo) (v1alpha1.StepResource, error) { return NewStepResourceFromObject(&v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go index 3580a3f32d..533013a38d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go @@ -19,6 +19,7 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes" ) @@ -32,7 +33,7 @@ func RequireStepsEqual(t *testing.T, expectedSteps, steps []*v1alpha1.Step) { } } -func csv(name, replaces string, ownedCRDs, requiredCRDs, ownedAPIServices, requiredAPIServices APISet, permissions, clusterPermissions []v1alpha1.StrategyDeploymentPermissions) *v1alpha1.ClusterServiceVersion { +func csv(name, replaces string, ownedCRDs, requiredCRDs, ownedAPIServices, requiredAPIServices cache.APISet, permissions, clusterPermissions []v1alpha1.StrategyDeploymentPermissions) *v1alpha1.ClusterServiceVersion { var singleInstance = int32(1) strategy := v1alpha1.StrategyDetailsDeployment{ Permissions: permissions, @@ -155,7 +156,7 @@ func u(object runtime.Object) *unstructured.Unstructured { return &unstructured.Unstructured{Object: unst} } -func apiSetToGVK(crds, apis APISet) (out []*api.GroupVersionKind) { +func apiSetToGVK(crds, apis cache.APISet) (out []*api.GroupVersionKind) { out = make([]*api.GroupVersionKind, 0) for a := range crds { out = append(out, &api.GroupVersionKind{ @@ -176,91 +177,6 @@ func apiSetToGVK(crds, apis APISet) (out []*api.GroupVersionKind) { return } -func apiSetToDependencies(crds, apis APISet) (out []*api.Dependency) { - if len(crds)+len(apis) == 0 { - return nil - } - out = make([]*api.Dependency, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} - -func apiSetToProperties(crds, apis APISet, deprecated bool) (out []*api.Property) { - out = make([]*api.Property, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if deprecated { - val, err := json.Marshal(opregistry.DeprecatedProperty{}) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.DeprecatedType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} - func packageNameToProperty(packageName, version string) (out *api.Property) { val, err := json.Marshal(opregistry.PackageProperty{ PackageName: packageName, @@ -303,7 +219,7 @@ func withVersion(version string) bundleOpt { } } -func bundle(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices APISet, opts ...bundleOpt) *api.Bundle { +func bundle(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices cache.APISet, opts ...bundleOpt) *api.Bundle { csvJson, err := json.Marshal(csv(name, replaces, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices, nil, nil)) if err != nil { panic(err) @@ -328,8 +244,8 @@ func bundle(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, pro ProvidedApis: apiSetToGVK(providedCRDs, providedAPIServices), RequiredApis: apiSetToGVK(requiredCRDs, requiredAPIServices), Replaces: replaces, - Dependencies: apiSetToDependencies(requiredCRDs, requiredAPIServices), - Properties: append(apiSetToProperties(providedCRDs, providedAPIServices, false), + Dependencies: cache.APISetToDependencies(requiredCRDs, requiredAPIServices), + Properties: append(cache.APISetToProperties(providedCRDs, providedAPIServices, false), packageNameToProperty(pkg, "0.0.0"), ), } @@ -359,7 +275,7 @@ func withBundlePath(bundle *api.Bundle, path string) *api.Bundle { return bundle } -func bundleWithPermissions(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices APISet, permissions, clusterPermissions []v1alpha1.StrategyDeploymentPermissions) *api.Bundle { +func bundleWithPermissions(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices cache.APISet, permissions, clusterPermissions []v1alpha1.StrategyDeploymentPermissions) *api.Bundle { csvJson, err := json.Marshal(csv(name, replaces, providedCRDs, requiredCRDs, providedAPIServices, requiredAPIServices, permissions, clusterPermissions)) if err != nil { panic(err) @@ -385,8 +301,8 @@ func bundleWithPermissions(name, pkg, channel, replaces string, providedCRDs, re } } -func withReplaces(operator *Operator, replaces string) *Operator { - operator.replaces = replaces +func withReplaces(operator *cache.Operator, replaces string) *cache.Operator { + operator.Replaces = replaces return operator } @@ -518,13 +434,3 @@ func getPkgName(pkgChan string) string { s := strings.Split(pkgChan, "/") return s[0] } - -type OperatorPredicateTestFunc func(*Operator) bool - -func (opf OperatorPredicateTestFunc) Test(o *Operator) bool { - return opf(o) -} - -func (opf OperatorPredicateTestFunc) String() string { - return "" -} diff --git a/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go b/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go index 7ce13e21a8..1cfbf3d137 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go @@ -5,13 +5,14 @@ import ( "sync" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type FakeAPIIntersectionReconciler struct { - ReconcileStub func(resolver.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult + ReconcileStub func(cache.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult reconcileMutex sync.RWMutex reconcileArgsForCall []struct { - arg1 resolver.APISet + arg1 cache.APISet arg2 resolver.OperatorGroupSurface arg3 []resolver.OperatorGroupSurface } @@ -25,11 +26,11 @@ type FakeAPIIntersectionReconciler struct { invocationsMutex sync.RWMutex } -func (fake *FakeAPIIntersectionReconciler) Reconcile(arg1 resolver.APISet, arg2 resolver.OperatorGroupSurface, arg3 ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult { +func (fake *FakeAPIIntersectionReconciler) Reconcile(arg1 cache.APISet, arg2 resolver.OperatorGroupSurface, arg3 ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult { fake.reconcileMutex.Lock() ret, specificReturn := fake.reconcileReturnsOnCall[len(fake.reconcileArgsForCall)] fake.reconcileArgsForCall = append(fake.reconcileArgsForCall, struct { - arg1 resolver.APISet + arg1 cache.APISet arg2 resolver.OperatorGroupSurface arg3 []resolver.OperatorGroupSurface }{arg1, arg2, arg3}) @@ -51,13 +52,13 @@ func (fake *FakeAPIIntersectionReconciler) ReconcileCallCount() int { return len(fake.reconcileArgsForCall) } -func (fake *FakeAPIIntersectionReconciler) ReconcileCalls(stub func(resolver.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult) { +func (fake *FakeAPIIntersectionReconciler) ReconcileCalls(stub func(cache.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult) { fake.reconcileMutex.Lock() defer fake.reconcileMutex.Unlock() fake.ReconcileStub = stub } -func (fake *FakeAPIIntersectionReconciler) ReconcileArgsForCall(i int) (resolver.APISet, resolver.OperatorGroupSurface, []resolver.OperatorGroupSurface) { +func (fake *FakeAPIIntersectionReconciler) ReconcileArgsForCall(i int) (cache.APISet, resolver.OperatorGroupSurface, []resolver.OperatorGroupSurface) { fake.reconcileMutex.RLock() defer fake.reconcileMutex.RUnlock() argsForCall := fake.reconcileArgsForCall[i] diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index 94d3339f50..b71abe2115 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -38,6 +38,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/event" @@ -1364,7 +1365,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v out = in.DeepCopy() now := a.now() - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(out) + operatorSurface, err := resolvercache.NewOperatorFromV1Alpha1CSV(out) if err != nil { // If the resolver is unable to retrieve the operator info from the CSV the CSV requires changes, a syncError should not be returned. logger.WithError(err).Warn("Unable to retrieve operator information from CSV") @@ -1428,7 +1429,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v groupSurface := resolver.NewOperatorGroup(operatorGroup) otherGroupSurfaces := resolver.NewOperatorGroupSurfaces(otherGroups...) - providedAPIs := operatorSurface.ProvidedAPIs().StripPlural() + providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { case operatorGroup.Spec.StaticProvidedAPIs && (result == resolver.AddAPIs || result == resolver.RemoveAPIs): diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index bef31bbb08..8c28ef0d1e 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -22,6 +22,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" opregistry "github.com/operator-framework/operator-registry/pkg/registry" @@ -46,7 +47,7 @@ var ( ) func aggregationLabelFromAPIKey(k opregistry.APIKey, suffix string) (string, error) { - hash, err := resolver.APIKeyToGVKHash(k) + hash, err := cache.APIKeyToGVKHash(k) if err != nil { return "", err } @@ -188,7 +189,7 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error { groupSurface := resolver.NewOperatorGroup(op) groupProvidedAPIs := groupSurface.ProvidedAPIs() providedAPIsForCSVs := a.providedAPIsFromCSVs(op, logger) - providedAPIsForGroup := make(resolver.APISet) + providedAPIsForGroup := make(cache.APISet) for api := range providedAPIsForCSVs { providedAPIsForGroup[api] = struct{}{} } @@ -309,26 +310,26 @@ func (a *Operator) providedAPIsFromCSVs(group *v1.OperatorGroup, logger *logrus. // TODO: Throw out CSVs that aren't members of the group due to group related failures? // Union the providedAPIsFromCSVs from existing members of the group - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { logger.WithError(err).Warn("could not create OperatorSurface from csv") continue } - for providedAPI := range operatorSurface.ProvidedAPIs().StripPlural() { + for providedAPI := range operatorSurface.GetProvidedAPIs().StripPlural() { providedAPIsFromCSVs[providedAPI] = csv } } return providedAPIsFromCSVs } -func (a *Operator) pruneProvidedAPIs(group *v1.OperatorGroup, groupProvidedAPIs resolver.APISet, providedAPIsFromCSVs map[opregistry.APIKey]*v1alpha1.ClusterServiceVersion, logger *logrus.Entry) { +func (a *Operator) pruneProvidedAPIs(group *v1.OperatorGroup, groupProvidedAPIs cache.APISet, providedAPIsFromCSVs map[opregistry.APIKey]*v1alpha1.ClusterServiceVersion, logger *logrus.Entry) { // Don't prune providedAPIsFromCSVs if static if group.Spec.StaticProvidedAPIs { a.logger.Debug("group has static provided apis. skipping provided api pruning") return } - intersection := make(resolver.APISet) + intersection := make(cache.APISet) for api := range providedAPIsFromCSVs { if _, ok := groupProvidedAPIs[api]; ok { intersection[api] = struct{}{} @@ -978,7 +979,7 @@ func (a *Operator) updateNamespaceList(op *v1.OperatorGroup) ([]string, error) { return namespaceList, nil } -func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, apis resolver.APISet) error { +func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, apis cache.APISet) error { clusterRole := &rbacv1.ClusterRole{ ObjectMeta: metav1.ObjectMeta{ Name: strings.Join([]string{op.GetName(), suffix}, "-"), @@ -1029,7 +1030,7 @@ func (a *Operator) ensureOpGroupClusterRole(op *v1.OperatorGroup, suffix string, return nil } -func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis resolver.APISet) error { +func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis cache.APISet) error { for _, suffix := range Suffices { if err := a.ensureOpGroupClusterRole(op, suffix, apis); err != nil { return err @@ -1038,7 +1039,7 @@ func (a *Operator) ensureOpGroupClusterRoles(op *v1.OperatorGroup, apis resolver return nil } -func (a *Operator) findCSVsThatProvideAnyOf(provide resolver.APISet) ([]*v1alpha1.ClusterServiceVersion, error) { +func (a *Operator) findCSVsThatProvideAnyOf(provide cache.APISet) ([]*v1alpha1.ClusterServiceVersion, error) { csvs, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().ClusterServiceVersions(metav1.NamespaceAll).List(labels.Everything()) if err != nil { return nil, err @@ -1051,12 +1052,12 @@ func (a *Operator) findCSVsThatProvideAnyOf(provide resolver.APISet) ([]*v1alpha continue } - operatorSurface, err := resolver.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { continue } - if len(operatorSurface.ProvidedAPIs().StripPlural().Intersection(provide)) > 0 { + if len(operatorSurface.GetProvidedAPIs().StripPlural().Intersection(provide)) > 0 { providers = append(providers, csv) } } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go similarity index 82% rename from vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go rename to vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go index d713f5018e..c26f30d434 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "context" @@ -76,14 +76,14 @@ func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger, catsrc } type NamespacedOperatorCache struct { - namespaces []string + Namespaces []string existing *registry.CatalogKey - snapshots map[registry.CatalogKey]*CatalogSnapshot + Snapshots map[registry.CatalogKey]*CatalogSnapshot } func (c *NamespacedOperatorCache) Error() error { var errs []error - for key, snapshot := range c.snapshots { + for key, snapshot := range c.Snapshots { snapshot.m.Lock() err := snapshot.err snapshot.m.Unlock() @@ -113,8 +113,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin clients := c.rcp.ClientsForNamespaces(namespaces...) result := NamespacedOperatorCache{ - namespaces: namespaces, - snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + Namespaces: namespaces, + Snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), } var misses []registry.CatalogKey @@ -127,8 +127,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin func() { snapshot.m.RLock() defer snapshot.m.RUnlock() - if !snapshot.Expired(now) && snapshot.operators != nil && len(snapshot.operators) > 0 { - result.snapshots[key] = snapshot + if !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { + result.Snapshots[key] = snapshot } else { misses = append(misses, key) } @@ -162,8 +162,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin // Check for any snapshots that were populated while waiting to acquire the lock. var found int for i := range misses { - if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.operators != nil && len(snapshot.operators) > 0 { - result.snapshots[misses[i]] = snapshot + if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { + result.Snapshots[misses[i]] = snapshot misses[found], misses[i] = misses[i], misses[found] found++ } @@ -182,14 +182,14 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin s := CatalogSnapshot{ logger: c.logger.WithField("catalog", miss), - key: miss, + Key: miss, expiry: now.Add(c.ttl), pop: cancel, - priority: catalogSourcePriority(catsrcPriority), + Priority: catalogSourcePriority(catsrcPriority), } s.m.Lock() c.snapshots[miss] = &s - result.snapshots[miss] = &s + result.Snapshots[miss] = &s go c.populate(ctx, &s, clients[miss]) } @@ -219,7 +219,7 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, snapshot.err = err return } - c.logger.WithField("catalog", snapshot.key.String()).Debug("updating cache") + c.logger.WithField("catalog", snapshot.Key.String()).Debug("updating cache") var operators []*Operator for b := it.Next(); b != nil; b = it.Next() { defaultChannel, ok := defaultChannels[b.PackageName] @@ -232,26 +232,26 @@ func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, defaultChannel = p.DefaultChannelName } } - o, err := NewOperatorFromBundle(b, "", snapshot.key, defaultChannel) + o, err := NewOperatorFromBundle(b, "", snapshot.Key, defaultChannel) if err != nil { snapshot.logger.Warnf("failed to construct operator from bundle, continuing: %v", err) continue } - o.providedAPIs = o.ProvidedAPIs().StripPlural() - o.requiredAPIs = o.RequiredAPIs().StripPlural() - o.replaces = b.Replaces - ensurePackageProperty(o, b.PackageName, b.Version) + o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() + o.RequiredAPIs = o.RequiredAPIs.StripPlural() + o.Replaces = b.Replaces + EnsurePackageProperty(o, b.PackageName, b.Version) operators = append(operators, o) } if err := it.Error(); err != nil { snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) snapshot.err = err } - snapshot.operators = operators + snapshot.Operators = operators } -func ensurePackageProperty(o *Operator, name, version string) { - for _, p := range o.Properties() { +func EnsurePackageProperty(o *Operator, name, version string) { + for _, p := range o.Properties { if p.Type == opregistry.PackageType { return } @@ -264,7 +264,7 @@ func ensurePackageProperty(o *Operator, name, version string) { if err != nil { return } - o.properties = append(o.properties, &api.Property{ + o.Properties = append(o.Properties, &api.Property{ Type: opregistry.PackageType, Value: string(bytes), }) @@ -275,7 +275,7 @@ func (c *NamespacedOperatorCache) Catalog(k registry.CatalogKey) OperatorFinder if k.Empty() { return c } - if snapshot, ok := c.snapshots[k]; ok { + if snapshot, ok := c.Snapshots[k]; ok { return snapshot } return EmptyOperatorFinder{} @@ -286,7 +286,7 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, if preferred != nil && preferred.Empty() { preferred = nil } - sorted := NewSortableSnapshots(c.existing, preferred, c.namespaces, c.snapshots) + sorted := NewSortableSnapshots(c.existing, preferred, c.Namespaces, c.Snapshots) sort.Sort(sorted) for _, snapshot := range sorted.snapshots { result = append(result, snapshot.Find(p...)...) @@ -296,11 +296,11 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *CatalogSnapshot) MultiCatalogOperatorFinder { o := &NamespacedOperatorCache{ - namespaces: c.namespaces, - existing: &snapshot.key, - snapshots: c.snapshots, + Namespaces: c.Namespaces, + existing: &snapshot.Key, + Snapshots: c.Snapshots, } - o.snapshots[snapshot.key] = snapshot + o.Snapshots[snapshot.Key] = snapshot return o } @@ -310,12 +310,12 @@ func (c *NamespacedOperatorCache) Find(p ...OperatorPredicate) []*Operator { type CatalogSnapshot struct { logger logrus.FieldLogger - key registry.CatalogKey + Key registry.CatalogKey expiry time.Time - operators []*Operator + Operators []*Operator m sync.RWMutex pop context.CancelFunc - priority catalogSourcePriority + Priority catalogSourcePriority err error } @@ -332,8 +332,8 @@ func (s *CatalogSnapshot) Expired(at time.Time) bool { func NewRunningOperatorSnapshot(logger logrus.FieldLogger, key registry.CatalogKey, o []*Operator) *CatalogSnapshot { return &CatalogSnapshot{ logger: logger, - key: key, - operators: o, + Key: key, + Operators: o, } } @@ -372,37 +372,37 @@ func (s SortableSnapshots) Len() int { func (s SortableSnapshots) Less(i, j int) bool { // existing operators are preferred over catalog operators if s.existing != nil && - s.snapshots[i].key.Name == s.existing.Name && - s.snapshots[i].key.Namespace == s.existing.Namespace { + s.snapshots[i].Key.Name == s.existing.Name && + s.snapshots[i].Key.Namespace == s.existing.Namespace { return true } if s.existing != nil && - s.snapshots[j].key.Name == s.existing.Name && - s.snapshots[j].key.Namespace == s.existing.Namespace { + s.snapshots[j].Key.Name == s.existing.Name && + s.snapshots[j].Key.Namespace == s.existing.Namespace { return false } // preferred catalog is less than all other catalogs if s.preferred != nil && - s.snapshots[i].key.Name == s.preferred.Name && - s.snapshots[i].key.Namespace == s.preferred.Namespace { + s.snapshots[i].Key.Name == s.preferred.Name && + s.snapshots[i].Key.Namespace == s.preferred.Namespace { return true } if s.preferred != nil && - s.snapshots[j].key.Name == s.preferred.Name && - s.snapshots[j].key.Namespace == s.preferred.Namespace { + s.snapshots[j].Key.Name == s.preferred.Name && + s.snapshots[j].Key.Namespace == s.preferred.Namespace { return false } // the rest are sorted first on priority, namespace and then by name - if s.snapshots[i].priority != s.snapshots[j].priority { - return s.snapshots[i].priority > s.snapshots[j].priority + if s.snapshots[i].Priority != s.snapshots[j].Priority { + return s.snapshots[i].Priority > s.snapshots[j].Priority } - if s.snapshots[i].key.Namespace != s.snapshots[j].key.Namespace { - return s.namespaces[s.snapshots[i].key.Namespace] < s.namespaces[s.snapshots[j].key.Namespace] + if s.snapshots[i].Key.Namespace != s.snapshots[j].Key.Namespace { + return s.namespaces[s.snapshots[i].Key.Namespace] < s.namespaces[s.snapshots[j].Key.Namespace] } - return s.snapshots[i].key.Name < s.snapshots[j].key.Name + return s.snapshots[i].Key.Name < s.snapshots[j].Key.Name } // Swap swaps the elements with indexes i and j. @@ -413,7 +413,7 @@ func (s SortableSnapshots) Swap(i, j int) { func (s *CatalogSnapshot) Find(p ...OperatorPredicate) []*Operator { s.m.RLock() defer s.m.RUnlock() - return Filter(s.operators, p...) + return Filter(s.Operators, p...) } type OperatorFinder interface { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go similarity index 75% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go rename to vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 32c38b3f09..7b85124133 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/operators.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "encoding/json" @@ -208,28 +208,28 @@ var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: // OperatorSurface describes the API surfaces provided and required by an Operator. type OperatorSurface interface { - ProvidedAPIs() APISet - RequiredAPIs() APISet + GetProvidedAPIs() APISet + GetRequiredAPIs() APISet Identifier() string - Replaces() string - Version() *semver.Version - SourceInfo() *OperatorSourceInfo - Bundle() *api.Bundle + GetReplaces() string + GetVersion() *semver.Version + GetSourceInfo() *OperatorSourceInfo + GetBundle() *api.Bundle Inline() bool - Properties() []*api.Property - Skips() []string + GetProperties() []*api.Property + GetSkips() []string } type Operator struct { - name string - replaces string - providedAPIs APISet - requiredAPIs APISet - version *semver.Version - bundle *api.Bundle - sourceInfo *OperatorSourceInfo - properties []*api.Property - skips []string + Name string + Replaces string + ProvidedAPIs APISet + RequiredAPIs APISet + Version *semver.Version + Bundle *api.Bundle + SourceInfo *OperatorSourceInfo + Properties []*api.Property + Skips []string } var _ OperatorSurface = &Operator{} @@ -265,13 +265,13 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg } } if len(bundle.Dependencies) > 0 { - ps, err := legacyDependenciesToProperties(bundle.Dependencies) + ps, err := LegacyDependenciesToProperties(bundle.Dependencies) if err != nil { return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) } properties = append(properties, ps...) } else { - ps, err := requiredAPIsToProperties(required) + ps, err := RequiredAPIsToProperties(required) if err != nil { return nil, err } @@ -279,15 +279,15 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg } o := &Operator{ - name: bundle.CsvName, - replaces: bundle.Replaces, - version: version, - providedAPIs: provided, - requiredAPIs: required, - bundle: bundle, - sourceInfo: sourceInfo, - properties: properties, - skips: bundle.Skips, + Name: bundle.CsvName, + Replaces: bundle.Replaces, + Version: version, + ProvidedAPIs: provided, + RequiredAPIs: required, + Bundle: bundle, + SourceInfo: sourceInfo, + Properties: properties, + Skips: bundle.Skips, } if !o.Inline() { @@ -331,91 +331,83 @@ func NewOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*Operator, if err != nil { return nil, err } - dependencies, err := requiredAPIsToProperties(requiredAPIs) + dependencies, err := RequiredAPIsToProperties(requiredAPIs) if err != nil { return nil, err } properties = append(properties, dependencies...) return &Operator{ - name: csv.GetName(), - version: &csv.Spec.Version.Version, - providedAPIs: providedAPIs, - requiredAPIs: requiredAPIs, - sourceInfo: &ExistingOperator, - properties: properties, + Name: csv.GetName(), + Version: &csv.Spec.Version.Version, + ProvidedAPIs: providedAPIs, + RequiredAPIs: requiredAPIs, + SourceInfo: &ExistingOperator, + Properties: properties, }, nil } -func (o *Operator) Name() string { - return o.name +func (o *Operator) GetProvidedAPIs() APISet { + return o.ProvidedAPIs } -func (o *Operator) ProvidedAPIs() APISet { - return o.providedAPIs -} - -func (o *Operator) RequiredAPIs() APISet { - return o.requiredAPIs +func (o *Operator) GetRequiredAPIs() APISet { + return o.RequiredAPIs } func (o *Operator) Identifier() string { - return o.name + return o.Name } -func (o *Operator) Replaces() string { - return o.replaces +func (o *Operator) GetReplaces() string { + return o.Replaces } -func (o *Operator) Skips() []string { - return o.skips -} - -func (o *Operator) SetReplaces(replacing string) { - o.replaces = replacing +func (o *Operator) GetSkips() []string { + return o.Skips } func (o *Operator) Package() string { - if o.bundle != nil { - return o.bundle.PackageName + if o.Bundle != nil { + return o.Bundle.PackageName } return "" } func (o *Operator) Channel() string { - if o.bundle != nil { - return o.bundle.ChannelName + if o.Bundle != nil { + return o.Bundle.ChannelName } return "" } -func (o *Operator) SourceInfo() *OperatorSourceInfo { - return o.sourceInfo +func (o *Operator) GetSourceInfo() *OperatorSourceInfo { + return o.SourceInfo } -func (o *Operator) Bundle() *api.Bundle { - return o.bundle +func (o *Operator) GetBundle() *api.Bundle { + return o.Bundle } -func (o *Operator) Version() *semver.Version { - return o.version +func (o *Operator) GetVersion() *semver.Version { + return o.Version } func (o *Operator) SemverRange() (semver.Range, error) { - return semver.ParseRange(o.Bundle().SkipRange) + return semver.ParseRange(o.Bundle.SkipRange) } func (o *Operator) Inline() bool { - return o.bundle != nil && o.bundle.GetBundlePath() == "" + return o.Bundle != nil && o.Bundle.GetBundlePath() == "" } -func (o *Operator) Properties() []*api.Property { - return o.properties +func (o *Operator) GetProperties() []*api.Property { + return o.Properties } func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { predicates = make([]OperatorPredicate, 0) - for _, property := range o.Properties() { + for _, property := range o.Properties { predicate, err := PredicateForProperty(property) if err != nil { return nil, err @@ -428,7 +420,7 @@ func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err e return } -func requiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { +func RequiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { if len(apis) == 0 { return } @@ -479,7 +471,7 @@ func providedAPIsToProperties(apis APISet) (out []*api.Property, err error) { return nil, nil } -func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { +func LegacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { var result []*api.Property for _, dependency := range dependencies { switch dependency.Type { @@ -538,3 +530,88 @@ func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Prop } return result, nil } + +func APISetToProperties(crds, apis APISet, deprecated bool) (out []*api.Property) { + out = make([]*api.Property, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if deprecated { + val, err := json.Marshal(opregistry.DeprecatedProperty{}) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.DeprecatedType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} + +func APISetToDependencies(crds, apis APISet) (out []*api.Dependency) { + if len(crds)+len(apis) == 0 { + return nil + } + out = make([]*api.Dependency, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go similarity index 95% rename from vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go rename to vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 4e731dd412..171ee5ac91 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/predicates.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -1,4 +1,4 @@ -package resolver +package cache import ( "bytes" @@ -24,7 +24,7 @@ func CSVNamePredicate(name string) OperatorPredicate { } func (c csvNamePredicate) Test(o *Operator) bool { - return o.Name() == string(c) + return o.Name == string(c) } func (c csvNamePredicate) String() string { @@ -42,10 +42,10 @@ func (ch channelPredicate) Test(o *Operator) bool { if string(ch) == "" { return true } - if o.Bundle() == nil { + if o.Bundle == nil { return false } - return o.Bundle().ChannelName == string(ch) + return o.Bundle.ChannelName == string(ch) } func (ch channelPredicate) String() string { @@ -59,7 +59,7 @@ func PkgPredicate(pkg string) OperatorPredicate { } func (pkg pkgPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.PackageType { continue } @@ -89,7 +89,7 @@ func VersionInRangePredicate(r semver.Range, version string) OperatorPredicate { } func (v versionInRangePredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.PackageType { continue } @@ -106,7 +106,7 @@ func (v versionInRangePredicate) Test(o *Operator) bool { return true } } - return o.Version() != nil && v.r(*o.Version()) + return o.Version != nil && v.r(*o.Version) } func (v versionInRangePredicate) String() string { @@ -119,7 +119,7 @@ func LabelPredicate(label string) OperatorPredicate { return labelPredicate(label) } func (l labelPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.LabelType { continue } @@ -148,7 +148,7 @@ func CatalogPredicate(key registry.CatalogKey) OperatorPredicate { } func (c catalogPredicate) Test(o *Operator) bool { - return c.key.Equal(o.SourceInfo().Catalog) + return c.key.Equal(o.SourceInfo.Catalog) } func (c catalogPredicate) String() string { @@ -166,7 +166,7 @@ func ProvidingAPIPredicate(api opregistry.APIKey) OperatorPredicate { } func (g gvkPredicate) Test(o *Operator) bool { - for _, p := range o.Properties() { + for _, p := range o.Properties { if p.Type != opregistry.GVKType { continue } @@ -210,10 +210,10 @@ func ReplacesPredicate(replaces string) OperatorPredicate { } func (r replacesPredicate) Test(o *Operator) bool { - if o.Replaces() == string(r) { + if o.Replaces == string(r) { return true } - for _, s := range o.Skips() { + for _, s := range o.Skips { if s == string(r) { return true } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go index 2dcc276e08..72f3e68ebf 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go @@ -5,6 +5,7 @@ import ( "strings" v1 "github.com/operator-framework/api/pkg/operators/v1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type NamespaceSet map[string]struct{} @@ -93,7 +94,7 @@ type OperatorGroupSurface interface { Identifier() string Namespace() string Targets() NamespaceSet - ProvidedAPIs() APISet + ProvidedAPIs() cache.APISet GroupIntersection(groups ...OperatorGroupSurface) []OperatorGroupSurface } @@ -103,7 +104,7 @@ type OperatorGroup struct { namespace string name string targets NamespaceSet - providedAPIs APISet + providedAPIs cache.APISet } func NewOperatorGroup(group *v1.OperatorGroup) *OperatorGroup { @@ -119,7 +120,7 @@ func NewOperatorGroup(group *v1.OperatorGroup) *OperatorGroup { namespace: group.GetNamespace(), name: group.GetName(), targets: NewNamespaceSet(namespaces), - providedAPIs: GVKStringToProvidedAPISet(gvksStr), + providedAPIs: cache.GVKStringToProvidedAPISet(gvksStr), } } @@ -144,7 +145,7 @@ func (g *OperatorGroup) Targets() NamespaceSet { return g.targets } -func (g *OperatorGroup) ProvidedAPIs() APISet { +func (g *OperatorGroup) ProvidedAPIs() cache.APISet { return g.providedAPIs } @@ -174,18 +175,18 @@ const ( ) type APIIntersectionReconciler interface { - Reconcile(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult + Reconcile(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult } -type APIIntersectionReconcileFunc func(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult +type APIIntersectionReconcileFunc func(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult -func (a APIIntersectionReconcileFunc) Reconcile(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { +func (a APIIntersectionReconcileFunc) Reconcile(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { return a(add, group, otherGroups...) } -func ReconcileAPIIntersection(add APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { +func ReconcileAPIIntersection(add cache.APISet, group OperatorGroupSurface, otherGroups ...OperatorGroupSurface) APIReconciliationResult { groupIntersection := group.GroupIntersection(otherGroups...) - providedAPIIntersection := make(APISet) + providedAPIIntersection := make(cache.APISet) for _, g := range groupIntersection { providedAPIIntersection = providedAPIIntersection.Union(g.ProvidedAPIs()) } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index a76361d3f2..94302d53ee 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" operatorregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -55,14 +56,13 @@ func bundleId(bundle, channel string, catalog registry.CatalogKey) solver.Identi return solver.IdentifierFromString(fmt.Sprintf("%s/%s/%s", catalog.String(), channel, bundle)) } -func NewBundleInstallableFromOperator(o *Operator) (BundleInstallable, error) { - src := o.SourceInfo() - if src == nil { - return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Identifier()) +func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, error) { + if o.SourceInfo == nil { + return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Name) } - id := bundleId(o.Identifier(), o.Channel(), src.Catalog) + id := bundleId(o.Identifier(), o.Channel(), o.SourceInfo.Catalog) var constraints []solver.Constraint - if src.Catalog.Virtual() && src.Subscription == nil { + if o.SourceInfo.Catalog.Virtual() && o.SourceInfo.Subscription == nil { // CSVs already associated with a Subscription // may be replaced, but freestanding CSVs must // appear in any solution. @@ -71,7 +71,7 @@ func NewBundleInstallableFromOperator(o *Operator) (BundleInstallable, error) { fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Identifier()), )) } - for _, p := range o.bundle.GetProperties() { + for _, p := range o.Properties { if p.GetType() == operatorregistry.DeprecatedType { constraints = append(constraints, PrettyConstraint( solver.Prohibited(), diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go index cf408ef00d..9b10eb2d6d 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go @@ -1,6 +1,7 @@ package resolver import ( + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" @@ -15,7 +16,7 @@ const ( // Concrete types other than OperatorSurface and CustomResource definition no-op. func LabelSetsFor(obj interface{}) ([]labels.Set, error) { switch v := obj.(type) { - case OperatorSurface: + case cache.OperatorSurface: return labelSetsForOperatorSurface(v) case *extv1beta1.CustomResourceDefinition: return labelSetsForCRD(v) @@ -24,17 +25,17 @@ func LabelSetsFor(obj interface{}) ([]labels.Set, error) { } } -func labelSetsForOperatorSurface(surface OperatorSurface) ([]labels.Set, error) { +func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} - for key := range surface.ProvidedAPIs().StripPlural() { - hash, err := APIKeyToGVKHash(key) + for key := range surface.GetProvidedAPIs().StripPlural() { + hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } labelSet[APILabelKeyPrefix+hash] = "provided" } - for key := range surface.RequiredAPIs().StripPlural() { - hash, err := APIKeyToGVKHash(key) + for key := range surface.GetRequiredAPIs().StripPlural() { + hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } @@ -52,7 +53,7 @@ func labelSetsForCRD(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, er // Add label sets for each version for _, version := range crd.Spec.Versions { - hash, err := APIKeyToGVKHash(registry.APIKey{ + hash, err := cache.APIKeyToGVKHash(registry.APIKey{ Group: crd.Spec.Group, Version: version.Name, Kind: crd.Spec.Names.Kind, diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 96201146a7..a8eeaf51bf 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -14,6 +14,7 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-registry/pkg/api" @@ -21,17 +22,17 @@ import ( ) type OperatorResolver interface { - SolveOperators(csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription, add map[OperatorSourceInfo]struct{}) (OperatorSet, error) + SolveOperators(csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription, add map[cache.OperatorSourceInfo]struct{}) (cache.OperatorSet, error) } type SatResolver struct { - cache OperatorCacheProvider + cache cache.OperatorCacheProvider log logrus.FieldLogger } -func NewDefaultSatResolver(rcp RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { +func NewDefaultSatResolver(rcp cache.RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { return &SatResolver{ - cache: NewOperatorCache(rcp, log, catsrcLister), + cache: cache.NewOperatorCache(rcp, log, catsrcLister), log: log, } } @@ -46,11 +47,11 @@ func (w *debugWriter) Write(b []byte) (int, error) { return n, nil } -func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription) (OperatorSet, error) { +func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.ClusterServiceVersion, subs []*v1alpha1.Subscription) (cache.OperatorSet, error) { var errs []error installables := make(map[solver.Identifier]solver.Installable, 0) - visited := make(map[OperatorSurface]*BundleInstallable, 0) + visited := make(map[cache.OperatorSurface]*BundleInstallable, 0) // TODO: better abstraction startingCSVs := make(map[string]struct{}) @@ -73,10 +74,10 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust // build constraints for each Subscription for _, sub := range subs { // find the currently installed operator (if it exists) - var current *Operator + var current *cache.Operator for _, csv := range csvs { if csv.Name == sub.Status.InstalledCSV { - op, err := NewOperatorFromV1Alpha1CSV(csv) + op, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -140,7 +141,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust } } - operators := make(map[string]OperatorSurface, 0) + operators := make(map[string]cache.OperatorSurface, 0) for _, installableOperator := range operatorInstallables { csvName, channel, catalog, err := installableOperator.BundleSourceInfo() if err != nil { @@ -148,18 +149,18 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust continue } - op, err := ExactlyOne(namespacedCache.Catalog(catalog).Find(CSVNamePredicate(csvName), ChannelPredicate(channel))) + op, err := cache.ExactlyOne(namespacedCache.Catalog(catalog).Find(cache.CSVNamePredicate(csvName), cache.ChannelPredicate(channel))) if err != nil { errs = append(errs, err) continue } if len(installableOperator.Replaces) > 0 { - op.replaces = installableOperator.Replaces + op.Replaces = installableOperator.Replaces // TODO: Don't mutate object from cache! } // lookup if this installable came from a starting CSV if _, ok := startingCSVs[csvName]; ok { - op.sourceInfo.StartingCSV = csvName + op.SourceInfo.StartingCSV = csvName // TODO: Don't mutate object from cache! } operators[csvName] = op @@ -172,8 +173,8 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust return operators, nil } -func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *Operator, namespacedCache MultiCatalogOperatorFinder, visited map[OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { - var cachePredicates, channelPredicates []OperatorPredicate +func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { + var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) catalog := registry.CatalogKey{ @@ -181,24 +182,24 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu Namespace: sub.Spec.CatalogSourceNamespace, } - var bundles []*Operator + var bundles []*cache.Operator { var nall, npkg, nch, ncsv int - csvPredicate := True() + csvPredicate := cache.True() if current != nil { // if we found an existing installed operator, we should filter the channel by operators that can replace it - channelPredicates = append(channelPredicates, Or(SkipRangeIncludesPredicate(*current.Version()), ReplacesPredicate(current.Identifier()))) + channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Identifier()))) } else if sub.Spec.StartingCSV != "" { // if no operator is installed and we have a startingCSV, filter for it - csvPredicate = CSVNamePredicate(sub.Spec.StartingCSV) + csvPredicate = cache.CSVNamePredicate(sub.Spec.StartingCSV) } - cachePredicates = append(cachePredicates, And( - CountingPredicate(True(), &nall), - CountingPredicate(PkgPredicate(sub.Spec.Package), &npkg), - CountingPredicate(ChannelPredicate(sub.Spec.Channel), &nch), - CountingPredicate(csvPredicate, &ncsv), + cachePredicates = append(cachePredicates, cache.And( + cache.CountingPredicate(cache.True(), &nall), + cache.CountingPredicate(cache.PkgPredicate(sub.Spec.Package), &npkg), + cache.CountingPredicate(cache.ChannelPredicate(sub.Spec.Channel), &nch), + cache.CountingPredicate(csvPredicate, &ncsv), )) bundles = namespacedCache.Catalog(catalog).Find(cachePredicates...) @@ -223,23 +224,23 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // bundles in the default channel appear first, then lexicographically order by channel name sort.SliceStable(bundles, func(i, j int) bool { var idef bool - if isrc := bundles[i].SourceInfo(); isrc != nil { + if isrc := bundles[i].SourceInfo; isrc != nil { idef = isrc.DefaultChannel } var jdef bool - if jsrc := bundles[j].SourceInfo(); jsrc != nil { + if jsrc := bundles[j].SourceInfo; jsrc != nil { jdef = jsrc.DefaultChannel } if idef == jdef { - return bundles[i].bundle.ChannelName < bundles[j].bundle.ChannelName + return bundles[i].Bundle.ChannelName < bundles[j].Bundle.ChannelName } return idef }) - var sortedBundles []*Operator + var sortedBundles []*cache.Operator lastChannel, lastIndex := "", 0 for i := 0; i <= len(bundles); i++ { - if i != len(bundles) && bundles[i].bundle.ChannelName == lastChannel { + if i != len(bundles) && bundles[i].Bundle.ChannelName == lastChannel { continue } channel, err := sortChannel(bundles[lastIndex:i]) @@ -249,14 +250,14 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu sortedBundles = append(sortedBundles, channel...) if i != len(bundles) { - lastChannel = bundles[i].bundle.ChannelName + lastChannel = bundles[i].Bundle.ChannelName lastIndex = i } } candidates := make([]*BundleInstallable, 0) - for _, o := range Filter(sortedBundles, channelPredicates...) { - predicates := append(cachePredicates, CSVNamePredicate(o.Identifier())) + for _, o := range cache.Filter(sortedBundles, channelPredicates...) { + predicates := append(cachePredicates, cache.CSVNamePredicate(o.Identifier())) stack := namespacedCache.Catalog(catalog).Find(predicates...) id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) if err != nil { @@ -302,12 +303,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*Operator, namespacedCache MultiCatalogOperatorFinder, visited map[OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies // track the first layer of installable ids - var initial = make(map[*Operator]struct{}) + var initial = make(map[*cache.Operator]struct{}) for _, o := range bundleStack { initial[o] = struct{}{} } @@ -340,15 +341,15 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS } for _, d := range dependencyPredicates { - sourcePredicate := False() + sourcePredicate := cache.False() // Build a filter matching all (catalog, // package, channel) combinations that contain // at least one candidate bundle, even if only // a subset of those bundles actually satisfy // the dependency. - sources := map[OperatorSourceInfo]struct{}{} + sources := map[cache.OperatorSourceInfo]struct{}{} for _, b := range namespacedCache.Find(d) { - si := b.SourceInfo() + si := b.SourceInfo if _, ok := sources[*si]; ok { // Predicate already covers this source. @@ -357,19 +358,19 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS sources[*si] = struct{}{} if si.Catalog.Virtual() { - sourcePredicate = Or(sourcePredicate, And( - CSVNamePredicate(b.Identifier()), - CatalogPredicate(si.Catalog), + sourcePredicate = cache.Or(sourcePredicate, cache.And( + cache.CSVNamePredicate(b.Identifier()), + cache.CatalogPredicate(si.Catalog), )) } else { - sourcePredicate = Or(sourcePredicate, And( - PkgPredicate(si.Package), - ChannelPredicate(si.Channel), - CatalogPredicate(si.Catalog), + sourcePredicate = cache.Or(sourcePredicate, cache.And( + cache.PkgPredicate(si.Package), + cache.ChannelPredicate(si.Channel), + cache.CatalogPredicate(si.Catalog), )) } } - sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.sourceInfo.Catalog, sourcePredicate)) + sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, sourcePredicate)) if err != nil { errs = append(errs, err) continue @@ -378,7 +379,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS // The dependency predicate is applied here // (after sorting) to remove all bundles that // don't satisfy the dependency. - for _, b := range Filter(sortedBundles, d) { + for _, b := range cache.Filter(sortedBundles, d) { i, err := NewBundleInstallableFromOperator(b) if err != nil { errs = append(errs, err) @@ -390,7 +391,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS } bundleInstallable.AddConstraint(PrettyConstraint( solver.Dependency(bundleDependencies...), - fmt.Sprintf("bundle %s requires an operator %s", bundle.name, d.String()), + fmt.Sprintf("bundle %s requires an operator %s", bundle.Name, d.String()), )) } @@ -421,7 +422,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs // package against catalog contents, updates to the // Subscription spec could result in a bad package // inference. - for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(And(CSVNamePredicate(csv.Name), PkgPredicate(sub.Spec.Package))) { + for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { if pkg := entry.Package(); pkg != "" { packages[pkg] = struct{}{} } @@ -454,7 +455,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs return properties, nil } -func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*CatalogSnapshot, error) { +func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.CatalogSnapshot, error) { existingOperatorCatalog := registry.NewVirtualCatalogKey(namespace) // build a catalog snapshot of CSVs without subscriptions csvSubscriptions := make(map[*v1alpha1.ClusterServiceVersion]*v1alpha1.Subscription) @@ -467,9 +468,9 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 } } var csvsMissingProperties []*v1alpha1.ClusterServiceVersion - standaloneOperators := make([]*Operator, 0) + standaloneOperators := make([]*cache.Operator, 0) for _, csv := range csvs { - op, err := NewOperatorFromV1Alpha1CSV(csv) + op, err := cache.NewOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -479,20 +480,20 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 if inferred, err := r.inferProperties(csv, subs); err != nil { r.log.Warnf("unable to infer properties for csv %q: %w", csv.Name, err) } else { - op.properties = append(op.properties, inferred...) + op.Properties = append(op.Properties, inferred...) } } else if props, err := projection.PropertyListFromPropertiesAnnotation(anno); err != nil { return nil, fmt.Errorf("failed to retrieve properties of csv %q: %w", csv.GetName(), err) } else { - op.properties = props + op.Properties = props } - op.sourceInfo = &OperatorSourceInfo{ + op.SourceInfo = &cache.OperatorSourceInfo{ Catalog: existingOperatorCatalog, Subscription: csvSubscriptions[csv], } // Try to determine source package name from properties and add to SourceInfo. - for _, p := range op.properties { + for _, p := range op.Properties { if p.Type != opregistry.PackageType { continue } @@ -502,7 +503,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Warnf("failed to unmarshal package property of csv %q: %w", csv.Name, err) continue } - op.sourceInfo.Package = pp.PackageName + op.SourceInfo.Package = pp.PackageName } standaloneOperators = append(standaloneOperators, op) @@ -516,10 +517,10 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Infof("considered csvs without properties annotation during resolution: %v", names) } - return NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil + return cache.NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil } -func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { +func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { // no two operators may provide the same GVK or Package in a namespace gvkConflictToInstallable := make(map[opregistry.GVKProperty][]solver.Identifier) packageConflictToInstallable := make(map[string][]solver.Identifier) @@ -533,13 +534,13 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, continue } - op, err := ExactlyOne(namespacedCache.Catalog(catalog).Find(CSVNamePredicate(csvName), ChannelPredicate(channel))) + op, err := cache.ExactlyOne(namespacedCache.Catalog(catalog).Find(cache.CSVNamePredicate(csvName), cache.ChannelPredicate(channel))) if err != nil { continue } // cannot provide the same GVK - for _, p := range op.Properties() { + for _, p := range op.Properties { if p.Type != opregistry.GVKType { continue } @@ -552,7 +553,7 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, } // cannot have the same package - for _, p := range op.Properties() { + for _, p := range op.Properties { if p.Type != opregistry.PackageType { continue } @@ -576,7 +577,7 @@ func (r *SatResolver) addInvariants(namespacedCache MultiCatalogOperatorFinder, } } -func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { +func (r *SatResolver) sortBundles(bundles []*cache.Operator) ([]*cache.Operator, error) { // assume bundles have been passed in sorted by catalog already catalogOrder := make([]registry.CatalogKey, 0) @@ -588,22 +589,22 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { channelOrder := make(map[registry.CatalogKey][]PackageChannel) // partition by catalog -> channel -> bundle - partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*Operator{} + partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*cache.Operator{} for _, b := range bundles { pc := PackageChannel{ Package: b.Package(), Channel: b.Channel(), - DefaultChannel: b.SourceInfo().DefaultChannel, + DefaultChannel: b.SourceInfo.DefaultChannel, } - if _, ok := partitionedBundles[b.sourceInfo.Catalog]; !ok { - catalogOrder = append(catalogOrder, b.sourceInfo.Catalog) - partitionedBundles[b.sourceInfo.Catalog] = make(map[PackageChannel][]*Operator) + if _, ok := partitionedBundles[b.SourceInfo.Catalog]; !ok { + catalogOrder = append(catalogOrder, b.SourceInfo.Catalog) + partitionedBundles[b.SourceInfo.Catalog] = make(map[PackageChannel][]*cache.Operator) } - if _, ok := partitionedBundles[b.sourceInfo.Catalog][pc]; !ok { - channelOrder[b.sourceInfo.Catalog] = append(channelOrder[b.sourceInfo.Catalog], pc) - partitionedBundles[b.sourceInfo.Catalog][pc] = make([]*Operator, 0) + if _, ok := partitionedBundles[b.SourceInfo.Catalog][pc]; !ok { + channelOrder[b.SourceInfo.Catalog] = append(channelOrder[b.SourceInfo.Catalog], pc) + partitionedBundles[b.SourceInfo.Catalog][pc] = make([]*cache.Operator, 0) } - partitionedBundles[b.sourceInfo.Catalog][pc] = append(partitionedBundles[b.sourceInfo.Catalog][pc], b) + partitionedBundles[b.SourceInfo.Catalog][pc] = append(partitionedBundles[b.SourceInfo.Catalog][pc], b) } for catalog := range partitionedBundles { @@ -625,7 +626,7 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { partitionedBundles[catalog][channel] = sorted } } - all := make([]*Operator, 0) + all := make([]*cache.Operator, 0) for _, catalog := range catalogOrder { for _, channel := range channelOrder[catalog] { all = append(all, partitionedBundles[catalog][channel]...) @@ -636,7 +637,7 @@ func (r *SatResolver) sortBundles(bundles []*Operator) ([]*Operator, error) { // Sorts bundle in a channel by replaces. All entries in the argument // are assumed to have the same Package and Channel. -func sortChannel(bundles []*Operator) ([]*Operator, error) { +func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { if len(bundles) < 1 { return bundles, nil } @@ -644,25 +645,25 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { packageName := bundles[0].Package() channelName := bundles[0].Channel() - bundleLookup := map[string]*Operator{} + bundleLookup := map[string]*cache.Operator{} // if a replaces b, then replacedBy[b] = a - replacedBy := map[*Operator]*Operator{} - replaces := map[*Operator]*Operator{} - skipped := map[string]*Operator{} + replacedBy := map[*cache.Operator]*cache.Operator{} + replaces := map[*cache.Operator]*cache.Operator{} + skipped := map[string]*cache.Operator{} for _, b := range bundles { bundleLookup[b.Identifier()] = b } for _, b := range bundles { - if b.replaces != "" { - if r, ok := bundleLookup[b.replaces]; ok { + if b.Replaces != "" { + if r, ok := bundleLookup[b.Replaces]; ok { replacedBy[r] = b replaces[b] = r } } - for _, skip := range b.skips { + for _, skip := range b.Skips { if r, ok := bundleLookup[skip]; ok { replacedBy[r] = b skipped[skip] = r @@ -672,7 +673,7 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { // a bundle without a replacement is a channel head, but if we // find more than one of those something is weird - headCandidates := []*Operator{} + headCandidates := []*cache.Operator{} for _, b := range bundles { if _, ok := replacedBy[b]; !ok { headCandidates = append(headCandidates, b) @@ -682,10 +683,10 @@ func sortChannel(bundles []*Operator) ([]*Operator, error) { return nil, fmt.Errorf("no channel heads (entries not replaced by another entry) found in channel %q of package %q", channelName, packageName) } - var chains [][]*Operator + var chains [][]*cache.Operator for _, head := range headCandidates { - var chain []*Operator - visited := make(map[*Operator]struct{}) + var chain []*cache.Operator + visited := make(map[*cache.Operator]struct{}) current := head for { visited[current] = struct{}{} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 6f211e1bd4..9fb369ca32 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -19,6 +19,7 @@ import ( v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" ) @@ -48,7 +49,7 @@ type OperatorStepResolver struct { var _ StepResolver = &OperatorStepResolver{} func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versioned.Interface, kubeclient kubernetes.Interface, - globalCatalogNamespace string, provider RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { + globalCatalogNamespace string, provider cache.RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { return &OperatorStepResolver{ subLister: lister.OperatorsV1alpha1().SubscriptionLister(), csvLister: lister.OperatorsV1alpha1().ClusterServiceVersionLister(), @@ -56,7 +57,7 @@ func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versio client: client, kubeclient: kubeclient, globalCatalogNamespace: globalCatalogNamespace, - satResolver: NewDefaultSatResolver(NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), + satResolver: NewDefaultSatResolver(cache.NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), log: log, } } @@ -86,7 +87,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( return nil, nil, nil, err } - var operators OperatorSet + var operators cache.OperatorSet namespaces := []string{namespace, r.globalCatalogNamespace} operators, err = r.satResolver.SolveOperators(namespaces, csvs, subs) if err != nil { @@ -101,7 +102,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( for name, op := range operators { // Find any existing subscriptions that resolve to this operator. existingSubscriptions := make(map[*v1alpha1.Subscription]bool) - sourceInfo := *op.SourceInfo() + sourceInfo := *op.GetSourceInfo() for _, sub := range subs { if sub.Spec.Package != sourceInfo.Package { continue @@ -137,21 +138,21 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( } // add steps for any new bundle - if op.Bundle() != nil { + if op.GetBundle() != nil { if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.Bundle(), namespace, op.Replaces(), op.SourceInfo().Catalog.Name, op.SourceInfo().Catalog.Namespace) + bundleSteps, err := NewStepsFromBundle(op.GetBundle(), namespace, op.GetReplaces(), op.GetSourceInfo().Catalog.Name, op.GetSourceInfo().Catalog.Namespace) if err != nil { return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) } steps = append(steps, bundleSteps...) } else { lookup := v1alpha1.BundleLookup{ - Path: op.Bundle().GetBundlePath(), + Path: op.GetBundle().GetBundlePath(), Identifier: op.Identifier(), - Replaces: op.Replaces(), + Replaces: op.GetReplaces(), CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.SourceInfo().Catalog.Namespace, - Name: op.SourceInfo().Catalog.Name, + Namespace: op.GetSourceInfo().Catalog.Namespace, + Name: op.GetSourceInfo().Catalog.Name, }, Conditions: []v1alpha1.BundleLookupCondition{ { @@ -168,7 +169,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( }, }, } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties()); err != nil { + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.GetProperties()); err != nil { return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Identifier(), err) } else { lookup.Properties = anno @@ -178,8 +179,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) == 0 { // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.SourceInfo().StartingCSV = op.Identifier() - subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo()) + op.GetSourceInfo().StartingCSV = op.Identifier() + subStep, err := NewSubscriptionStepResource(namespace, *op.GetSourceInfo()) if err != nil { return nil, nil, nil, err } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go index d800dff869..7f2270881b 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/steps.go @@ -17,6 +17,7 @@ import ( k8sscheme "k8s.io/client-go/kubernetes/scheme" "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" ) @@ -86,7 +87,7 @@ func NewStepResourceFromObject(obj runtime.Object, catalogSourceName, catalogSou return resource, nil } -func NewSubscriptionStepResource(namespace string, info OperatorSourceInfo) (v1alpha1.StepResource, error) { +func NewSubscriptionStepResource(namespace string, info cache.OperatorSourceInfo) (v1alpha1.StepResource, error) { return NewStepResourceFromObject(&v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Namespace: namespace, diff --git a/vendor/modules.txt b/vendor/modules.txt index 5b1028663d..705e1f54a8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -536,6 +536,7 @@ github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver +github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver github.com/operator-framework/operator-lifecycle-manager/pkg/feature From f0217cb6b7cc454248223cf9ec51acaf1008671f Mon Sep 17 00:00:00 2001 From: Daniel Messer Date: Thu, 5 Aug 2021 18:11:16 +0200 Subject: [PATCH 12/45] add further console customization types Signed-off-by: Daniel Messer Upstream-repository: operator-registry Upstream-commit: 70cec5728f5634fc696e13a0608dd7d01a170e12 --- .../operator-registry/pkg/lib/bundle/supported_resources.go | 6 ++++++ .../operator-registry/pkg/lib/bundle/supported_resources.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/staging/operator-registry/pkg/lib/bundle/supported_resources.go b/staging/operator-registry/pkg/lib/bundle/supported_resources.go index 534e6568c1..20d7e5402e 100644 --- a/staging/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/staging/operator-registry/pkg/lib/bundle/supported_resources.go @@ -17,6 +17,9 @@ const ( PriorityClassKind = "PriorityClass" VerticalPodAutoscalerKind = "VerticalPodAutoscaler" ConsoleYamlSampleKind = "ConsoleYamlSample" + ConsoleQuickStartKind = "ConsoleQuickStart" + ConsoleCLIDownloadKind = "ConsoleCLIDownload" + ConsoleLinkKind = "ConsoleLink" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -41,6 +44,9 @@ var supportedResources = map[string]Namespaced{ PriorityClassKind: false, VerticalPodAutoscalerKind: false, ConsoleYamlSampleKind: false, + ConsoleQuickStartKind: false, + ConsoleCLIDownloadKind: false, + ConsoleLinkKind: false, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go index 534e6568c1..20d7e5402e 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/bundle/supported_resources.go @@ -17,6 +17,9 @@ const ( PriorityClassKind = "PriorityClass" VerticalPodAutoscalerKind = "VerticalPodAutoscaler" ConsoleYamlSampleKind = "ConsoleYamlSample" + ConsoleQuickStartKind = "ConsoleQuickStart" + ConsoleCLIDownloadKind = "ConsoleCLIDownload" + ConsoleLinkKind = "ConsoleLink" ) // Namespaced indicates whether the resource is namespace scoped (true) or cluster-scoped (false). @@ -41,6 +44,9 @@ var supportedResources = map[string]Namespaced{ PriorityClassKind: false, VerticalPodAutoscalerKind: false, ConsoleYamlSampleKind: false, + ConsoleQuickStartKind: false, + ConsoleCLIDownloadKind: false, + ConsoleLinkKind: false, } // IsSupported checks if the object kind is OLM-supported and if it is namespaced From 882460cb8bd45860aa6c7c25e22e65fa3d6130e9 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Thu, 5 Aug 2021 14:06:26 -0400 Subject: [PATCH 13/45] .github/workflows: Replace the e2e-kind job name with e2e in the test workflow (#730) Update the test.yml test workflow and replace the `e2e-kind` job name with `e2e`. Before, the e2e test workflow had ran e2e tests against both kind and minikube clusters before the latter job was removed entirely. Signed-off-by: timflannagan Upstream-repository: operator-registry Upstream-commit: ff2c921e414926a013f82448b7241bc84fc95372 --- staging/operator-registry/.github/workflows/test.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/staging/operator-registry/.github/workflows/test.yml b/staging/operator-registry/.github/workflows/test.yml index ae2f59afc2..1890895861 100644 --- a/staging/operator-registry/.github/workflows/test.yml +++ b/staging/operator-registry/.github/workflows/test.yml @@ -8,22 +8,25 @@ on: - '**' - '!doc/**' jobs: - e2e-kind: + e2e: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: go-version: '~1.16' - - run: | + - name: Install podman + run: | . /etc/os-release echo "deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/ /" | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/xUbuntu_${VERSION_ID}/Release.key | sudo apt-key add - sudo apt-get update sudo apt-get -y install conntrack podman podman version - - run: | + - name: Create kind cluster and setup local docker registry + run: | "${GITHUB_WORKSPACE}/scripts/start_registry.sh" kind-registry export DOCKER_REGISTRY_HOST=localhost:443 - - run: | + - name: Run e2e tests + run: | KUBECONFIG="$HOME/.kube/config" DOCKER_REGISTRY_HOST=localhost:443 make build e2e CLUSTER=kind From ba28d2fc660dd3738d5ad70bfe999fbfe37beb34 Mon Sep 17 00:00:00 2001 From: exdx Date: Wed, 11 Aug 2021 14:32:56 -0400 Subject: [PATCH 14/45] feat: support removing the default channel head in deprecatetrunace (#734) Signed-off-by: Daniel Sover Upstream-repository: operator-registry Upstream-commit: b82684903f7af4e483efe5629d18c9a6db036dcb --- .../cmd/opm/index/deprecatetruncate.go | 27 ++- .../pkg/lib/indexer/indexer.go | 29 +-- .../pkg/lib/registry/registry.go | 24 ++- .../pkg/registry/populator_test.go | 173 ++++++++++++++++++ .../operator-registry/pkg/sqlite/deprecate.go | 99 ++++++++++ staging/operator-registry/pkg/sqlite/query.go | 54 ++++++ .../operator-registry/test/e2e/opm_test.go | 1 - .../cmd/opm/index/deprecatetruncate.go | 27 ++- .../pkg/lib/indexer/indexer.go | 29 +-- .../pkg/lib/registry/registry.go | 24 ++- .../operator-registry/pkg/sqlite/deprecate.go | 99 ++++++++++ .../operator-registry/pkg/sqlite/query.go | 54 ++++++ 12 files changed, 587 insertions(+), 53 deletions(-) diff --git a/staging/operator-registry/cmd/opm/index/deprecatetruncate.go b/staging/operator-registry/cmd/opm/index/deprecatetruncate.go index 4413440a6f..dc76e9ab9c 100644 --- a/staging/operator-registry/cmd/opm/index/deprecatetruncate.go +++ b/staging/operator-registry/cmd/opm/index/deprecatetruncate.go @@ -26,7 +26,9 @@ var deprecateLong = templates.LongDesc(` Produces the following update graph in quay.io/my/index:v2 1.4.0 -- replaces -> 1.3.0 [deprecated] - Deprecating a bundle that removes the default channel is not allowed. Changing the default channel prior to deprecation is possible by publishing a new bundle to the index. + Deprecating a bundle that removes the default channel is not allowed unless the head(s) of all channels are being deprecated (the package is subsequently removed from the index). + This behavior can be enabled via the allow-package-removal flag. + Changing the default channel prior to deprecation is possible by publishing a new bundle to the index. `) + "\n\n" + sqlite.DeprecationMessage func newIndexDeprecateTruncateCmd() *cobra.Command { @@ -61,6 +63,7 @@ func newIndexDeprecateTruncateCmd() *cobra.Command { if err := indexCmd.Flags().MarkHidden("debug"); err != nil { logrus.Panic(err.Error()) } + indexCmd.Flags().Bool("allow-package-removal", false, "removes the entire package if the heads of all channels in the package are deprecated") return indexCmd } @@ -111,6 +114,11 @@ func runIndexDeprecateTruncateCmdFunc(cmd *cobra.Command, args []string) error { return err } + allowPackageRemoval, err := cmd.Flags().GetBool("allow-package-removal") + if err != nil { + return err + } + logger := logrus.WithFields(logrus.Fields{"bundles": bundles}) logger.Info("deprecating bundles from the index") @@ -121,14 +129,15 @@ func runIndexDeprecateTruncateCmdFunc(cmd *cobra.Command, args []string) error { logger) request := indexer.DeprecateFromIndexRequest{ - Generate: generate, - FromIndex: fromIndex, - BinarySourceImage: binaryImage, - OutDockerfile: outDockerfile, - Tag: tag, - Bundles: bundles, - Permissive: permissive, - SkipTLS: skipTLS, + Generate: generate, + FromIndex: fromIndex, + BinarySourceImage: binaryImage, + OutDockerfile: outDockerfile, + Tag: tag, + Bundles: bundles, + Permissive: permissive, + SkipTLS: skipTLS, + AllowPackageRemoval: allowPackageRemoval, } err = indexDeprecator.DeprecateFromIndex(request) diff --git a/staging/operator-registry/pkg/lib/indexer/indexer.go b/staging/operator-registry/pkg/lib/indexer/indexer.go index d15e3472d2..54eae4db1a 100644 --- a/staging/operator-registry/pkg/lib/indexer/indexer.go +++ b/staging/operator-registry/pkg/lib/indexer/indexer.go @@ -643,15 +643,16 @@ func generatePackageYaml(dbQuerier pregistry.Query, packageName, downloadPath st // DeprecateFromIndexRequest defines the parameters to send to the PruneFromIndex API type DeprecateFromIndexRequest struct { - Generate bool - Permissive bool - BinarySourceImage string - FromIndex string - OutDockerfile string - Bundles []string - Tag string - CaFile string - SkipTLS bool + Generate bool + Permissive bool + BinarySourceImage string + FromIndex string + OutDockerfile string + Bundles []string + Tag string + CaFile string + SkipTLS bool + AllowPackageRemoval bool } // DeprecateFromIndex takes a DeprecateFromIndexRequest and deprecates the requested @@ -668,14 +669,14 @@ func (i ImageIndexer) DeprecateFromIndex(request DeprecateFromIndexRequest) erro return err } - // Run opm registry prune on the database deprecateFromRegistryReq := registry.DeprecateFromRegistryRequest{ - Bundles: request.Bundles, - InputDatabase: databasePath, - Permissive: request.Permissive, + Bundles: request.Bundles, + InputDatabase: databasePath, + Permissive: request.Permissive, + AllowPackageRemoval: request.AllowPackageRemoval, } - // Prune the bundles from the registry + // Deprecate the bundles from the registry err = i.RegistryDeprecator.DeprecateFromRegistry(deprecateFromRegistryReq) if err != nil { return err diff --git a/staging/operator-registry/pkg/lib/registry/registry.go b/staging/operator-registry/pkg/lib/registry/registry.go index 34dc493e2c..e8ec05cce2 100644 --- a/staging/operator-registry/pkg/lib/registry/registry.go +++ b/staging/operator-registry/pkg/lib/registry/registry.go @@ -331,9 +331,10 @@ func (r RegistryUpdater) PruneFromRegistry(request PruneFromRegistryRequest) err } type DeprecateFromRegistryRequest struct { - Permissive bool - InputDatabase string - Bundles []string + Permissive bool + InputDatabase string + Bundles []string + AllowPackageRemoval bool } func (r RegistryUpdater) DeprecateFromRegistry(request DeprecateFromRegistryRequest) error { @@ -366,6 +367,23 @@ func (r RegistryUpdater) DeprecateFromRegistry(request DeprecateFromRegistryRequ } deprecator := sqlite.NewSQLDeprecatorForBundles(dbLoader, toDeprecate) + + // Check for deprecation of head of default channel. If deprecation request includes heads of all other channels, + // then remove the package entirely. Otherwise, deprecate provided bundles. This enables deprecating an entire package. + // By default deprecating the head of default channel is not permitted. + if request.AllowPackageRemoval { + packageDeprecator := sqlite.NewSQLDeprecatorForBundlesAndPackages(deprecator, dbQuerier) + if err := packageDeprecator.MaybeRemovePackages(); err != nil { + r.Logger.Debugf("unable to deprecate package from database: %s", err) + if !request.Permissive { + r.Logger.WithError(err).Error("permissive mode disabled") + return err + } + r.Logger.WithError(err).Warn("permissive mode enabled") + } + } + + // Any bundles associated with removed packages are now removed from the list of bundles to deprecate. if err := deprecator.Deprecate(); err != nil { r.Logger.Debugf("unable to deprecate bundles from database: %s", err) if !request.Permissive { diff --git a/staging/operator-registry/pkg/registry/populator_test.go b/staging/operator-registry/pkg/registry/populator_test.go index dc22a5f759..280907964c 100644 --- a/staging/operator-registry/pkg/registry/populator_test.go +++ b/staging/operator-registry/pkg/registry/populator_test.go @@ -943,6 +943,179 @@ func TestDeprecateBundle(t *testing.T) { } } +func TestDeprecatePackage(t *testing.T) { + type args struct { + bundles []string + } + type pkgChannel map[string][]string + type expected struct { + err error + remainingBundles []string + deprecatedBundles []string + remainingPkgChannels pkgChannel + } + tests := []struct { + description string + args args + expected expected + }{ + { + description: "RemoveEntirePackage/BundlesAreAllHeadsOfChannels", + args: args{ + bundles: []string{ + "quay.io/test/etcd.0.9.2", + "quay.io/test/etcd.0.9.0", + }, + }, + expected: expected{ + err: nil, + remainingBundles: []string{ + "quay.io/test/prometheus.0.22.2/preview", + "quay.io/test/prometheus.0.15.0/preview", + "quay.io/test/prometheus.0.15.0/stable", + "quay.io/test/prometheus.0.14.0/preview", + "quay.io/test/prometheus.0.14.0/stable", + }, + deprecatedBundles: []string{}, + remainingPkgChannels: pkgChannel{ + "prometheus": []string{ + "preview", + "stable", + }, + }, + }, + }, + { + description: "RemoveHeadOfDefaultChannelWithoutAllChannelHeads/Error", + args: args{ + bundles: []string{ + "quay.io/test/etcd.0.9.2", + }, + }, + expected: expected{ + err: utilerrors.NewAggregate([]error{fmt.Errorf("cannot deprecate default channel head from package without removing all other channel heads in package %s: must deprecate %s, head of channel %s", "etcd", "quay.io/test/etcd.0.9.0", "beta")}), + remainingBundles: []string{ + "quay.io/test/etcd.0.9.0/alpha", + "quay.io/test/etcd.0.9.0/beta", + "quay.io/test/etcd.0.9.0/stable", + "quay.io/test/etcd.0.9.2/stable", + "quay.io/test/etcd.0.9.2/alpha", + "quay.io/test/prometheus.0.14.0/preview", + "quay.io/test/prometheus.0.14.0/stable", + "quay.io/test/prometheus.0.15.0/preview", + "quay.io/test/prometheus.0.15.0/stable", + "quay.io/test/prometheus.0.22.2/preview", + }, + deprecatedBundles: []string{}, + remainingPkgChannels: pkgChannel{ + "etcd": []string{ + "alpha", + "beta", + "stable", + }, + "prometheus": []string{ + "preview", + "stable", + }, + }, + }, + }, + { + description: "RemoveEntirePackage/AndDeprecateAdditionalBundle", + args: args{ + bundles: []string{ + "quay.io/test/etcd.0.9.2", + "quay.io/test/etcd.0.9.0", + "quay.io/test/prometheus.0.14.0", + }, + }, + expected: expected{ + err: nil, + remainingBundles: []string{ + "quay.io/test/prometheus.0.22.2/preview", + "quay.io/test/prometheus.0.15.0/preview", + "quay.io/test/prometheus.0.15.0/stable", + "quay.io/test/prometheus.0.14.0/preview", + "quay.io/test/prometheus.0.14.0/stable", + }, + deprecatedBundles: []string{ + "quay.io/test/prometheus.0.14.0/preview", + "quay.io/test/prometheus.0.14.0/stable", + }, + remainingPkgChannels: pkgChannel{ + "prometheus": []string{ + "preview", + "stable", + }, + }, + }, + }, + } + + for _, tt := range tests { + t.Run(tt.description, func(t *testing.T) { + logrus.SetLevel(logrus.DebugLevel) + db, cleanup := CreateTestDb(t) + defer cleanup() + + querier, err := createAndPopulateDB(db) + require.NoError(t, err) + + store, err := sqlite.NewSQLLiteLoader(db) + require.NoError(t, err) + + deprecator := sqlite.NewSQLDeprecatorForBundles(store, tt.args.bundles) + packageDeprecator := sqlite.NewSQLDeprecatorForBundlesAndPackages(deprecator, querier) + require.Equal(t, tt.expected.err, packageDeprecator.MaybeRemovePackages()) + if len(tt.expected.deprecatedBundles) > 0 { + require.Equal(t, tt.expected.err, deprecator.Deprecate()) + } + + // Ensure remaining bundlePaths in db match + bundles, err := querier.ListBundles(context.Background()) + require.NoError(t, err) + var bundlePaths []string + for _, bundle := range bundles { + bundlePaths = append(bundlePaths, strings.Join([]string{bundle.BundlePath, bundle.ChannelName}, "/")) + } + require.ElementsMatch(t, tt.expected.remainingBundles, bundlePaths) + + // Ensure deprecated bundles match + var deprecatedBundles []string + deprecatedProperty, err := json.Marshal(registry.DeprecatedProperty{}) + require.NoError(t, err) + for _, bundle := range bundles { + for _, prop := range bundle.Properties { + if prop.Type == registry.DeprecatedType && prop.Value == string(deprecatedProperty) { + deprecatedBundles = append(deprecatedBundles, strings.Join([]string{bundle.BundlePath, bundle.ChannelName}, "/")) + } + } + } + + require.ElementsMatch(t, tt.expected.deprecatedBundles, deprecatedBundles) + + // Ensure remaining channels match + packages, err := querier.ListPackages(context.Background()) + require.NoError(t, err) + + for _, pkg := range packages { + channelEntries, err := querier.GetChannelEntriesFromPackage(context.Background(), pkg) + require.NoError(t, err) + + uniqueChannels := make(map[string]struct{}) + var channels []string + for _, ch := range channelEntries { + uniqueChannels[ch.ChannelName] = struct{}{} + } + for k := range uniqueChannels { + channels = append(channels, k) + } + require.ElementsMatch(t, tt.expected.remainingPkgChannels[pkg], channels) + } + }) + } +} + func TestAddAfterDeprecate(t *testing.T) { type args struct { existing []string diff --git a/staging/operator-registry/pkg/sqlite/deprecate.go b/staging/operator-registry/pkg/sqlite/deprecate.go index a8cdb24fa9..4ac3d61ebf 100644 --- a/staging/operator-registry/pkg/sqlite/deprecate.go +++ b/staging/operator-registry/pkg/sqlite/deprecate.go @@ -1,6 +1,7 @@ package sqlite import ( + "context" "errors" "fmt" @@ -20,7 +21,14 @@ type BundleDeprecator struct { bundles []string } +// PackageDeprecator removes bundles and optionally entire packages from the index +type PackageDeprecator struct { + *BundleDeprecator + querier *SQLQuerier +} + var _ SQLDeprecator = &BundleDeprecator{} +var _ SQLDeprecator = &PackageDeprecator{} func NewSQLDeprecatorForBundles(store registry.Load, bundles []string) *BundleDeprecator { return &BundleDeprecator{ @@ -29,6 +37,13 @@ func NewSQLDeprecatorForBundles(store registry.Load, bundles []string) *BundleDe } } +func NewSQLDeprecatorForBundlesAndPackages(deprecator *BundleDeprecator, querier *SQLQuerier) *PackageDeprecator { + return &PackageDeprecator{ + BundleDeprecator: deprecator, + querier: querier, + } +} + func (d *BundleDeprecator) Deprecate() error { log := logrus.WithField("bundles", d.bundles) log.Info("deprecating bundles") @@ -45,3 +60,87 @@ func (d *BundleDeprecator) Deprecate() error { return utilerrors.NewAggregate(errs) } + +// MaybeRemovePackages queries the DB to establish if any provided bundles are the head of the default channel of a package. +// If so, the list of bundles must also contain the head of all other channels in the package, otherwise an error is produced. +// If the heads of all channels are being deprecated (including the default channel), the package is removed entirely from the index. +// MaybeRemovePackages deletes all bundles from the associated package from the bundles array, so that the subsequent +// Deprecate() call can proceed with deprecating other potential bundles from other packages. +func (d *PackageDeprecator) MaybeRemovePackages() error { + log := logrus.WithField("bundles", d.bundles) + log.Info("allow-package-removal enabled: checking default channel heads for package removal") + + var errs []error + var removedBundlePaths []string + var remainingBundlePaths []string + + // Iterate over bundles list - see if any bundle is the head of a default channel in a package + var packages []string + for _, bundle := range d.bundles { + found, err := d.querier.PackageFromDefaultChannelHeadBundle(context.TODO(), bundle) + if err != nil { + errs = append(errs, fmt.Errorf("error checking if bundle is default channel head %s: %s", bundle, err)) + } + if found != "" { + packages = append(packages, found) + } + } + + if len(packages) == 0 { + log.Info("no head of default channel found - skipping package removal") + return nil + } + + // If so, ensure list contains head of all other channels in that package + // If not, return error + for _, pkg := range packages { + channels, err := d.querier.ListChannels(context.TODO(), pkg) + if err != nil { + errs = append(errs, fmt.Errorf("error listing channels for package %s: %s", pkg, err)) + } + for _, channel := range channels { + found, err := d.querier.BundlePathForChannelHead(context.TODO(), pkg, channel) + if err != nil { + errs = append(errs, fmt.Errorf("error listing channel head for package %s: %s", pkg, err)) + } + if !contains(found, d.bundles) { + // terminal error + errs = append(errs, fmt.Errorf("cannot deprecate default channel head from package without removing all other channel heads in package %s: must deprecate %s, head of channel %s", pkg, found, channel)) + return utilerrors.NewAggregate(errs) + } + removedBundlePaths = append(removedBundlePaths, found) + } + } + + // Remove associated package from index + log.Infof("removing packages %#v", packages) + for _, pkg := range packages { + err := d.store.RemovePackage(pkg) + if err != nil { + errs = append(errs, fmt.Errorf("error removing package %s: %s", pkg, err)) + } + } + + // Remove bundles from the removed package from the deprecation request + // This enables other bundles to be deprecated via the expected flow + // Build a new array with just the outstanding bundles + for _, bundlePath := range d.bundles { + if contains(bundlePath, removedBundlePaths) { + continue + } + remainingBundlePaths = append(remainingBundlePaths, bundlePath) + } + d.bundles = remainingBundlePaths + log.Infof("remaining bundles to deprecate %#v", d.bundles) + + return utilerrors.NewAggregate(errs) +} + +func contains(bundlePath string, bundles []string) bool { + for _, b := range bundles { + if b == bundlePath { + return true + } + } + return false +} diff --git a/staging/operator-registry/pkg/sqlite/query.go b/staging/operator-registry/pkg/sqlite/query.go index 6a30c35bfe..432b998112 100644 --- a/staging/operator-registry/pkg/sqlite/query.go +++ b/staging/operator-registry/pkg/sqlite/query.go @@ -1338,3 +1338,57 @@ func (s *SQLQuerier) listBundleChannels(ctx context.Context, bundleName string) return channels, nil } + +// PackageFromDefaultChannelHeadBundle returns the package name if the provided bundle is the head of its default channel. +func (s *SQLQuerier) PackageFromDefaultChannelHeadBundle(ctx context.Context, bundle string) (string, error) { + packageFromDefaultChannelHeadBundle := ` + SELECT package_name FROM package + INNER JOIN channel ON channel.name = package.default_channel + WHERE channel.head_operatorbundle_name = (SELECT name FROM operatorbundle WHERE bundlepath=? LIMIT 1) ` + + rows, err := s.db.QueryContext(ctx, packageFromDefaultChannelHeadBundle, bundle) + if err != nil { + return "", err + } + defer rows.Close() + + var packageName sql.NullString + for rows.Next() { + if err := rows.Scan(&packageName); err != nil { + return "", err + } + + if !packageName.Valid { + return "", fmt.Errorf("package name column corrupt for bundle %s", bundle) + } + } + + return packageName.String, nil +} + +// BundlePathForChannelHead returns the bundlepath for the given package and channel +func (s *SQLQuerier) BundlePathForChannelHead(ctx context.Context, pkg string, channel string) (string, error) { + bundlePathForChannelHeadQuery := ` + SELECT bundlepath FROM operatorbundle + INNER JOIN channel ON channel.head_operatorbundle_name = operatorbundle.name + WHERE channel.package_name = ? AND channel.name = ? +` + + rows, err := s.db.QueryContext(ctx, bundlePathForChannelHeadQuery, pkg, channel) + if err != nil { + return "", err + } + defer rows.Close() + + var bundlePath sql.NullString + for rows.Next() { + if err := rows.Scan(&bundlePath); err != nil { + return "", err + } + if !bundlePath.Valid { + return "", fmt.Errorf("bundlepath column corrupt for package %s, channel %s", pkg, channel) + } + } + + return bundlePath.String, nil +} diff --git a/staging/operator-registry/test/e2e/opm_test.go b/staging/operator-registry/test/e2e/opm_test.go index 1c09332159..f0598a0eb0 100644 --- a/staging/operator-registry/test/e2e/opm_test.go +++ b/staging/operator-registry/test/e2e/opm_test.go @@ -332,7 +332,6 @@ var _ = Describe("opm", func() { By("loading manifests from a directory") err = initialize() Expect(err).NotTo(HaveOccurred()) - }) It("build bundles and index via inference", func() { diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/index/deprecatetruncate.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/index/deprecatetruncate.go index 4413440a6f..dc76e9ab9c 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/index/deprecatetruncate.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/index/deprecatetruncate.go @@ -26,7 +26,9 @@ var deprecateLong = templates.LongDesc(` Produces the following update graph in quay.io/my/index:v2 1.4.0 -- replaces -> 1.3.0 [deprecated] - Deprecating a bundle that removes the default channel is not allowed. Changing the default channel prior to deprecation is possible by publishing a new bundle to the index. + Deprecating a bundle that removes the default channel is not allowed unless the head(s) of all channels are being deprecated (the package is subsequently removed from the index). + This behavior can be enabled via the allow-package-removal flag. + Changing the default channel prior to deprecation is possible by publishing a new bundle to the index. `) + "\n\n" + sqlite.DeprecationMessage func newIndexDeprecateTruncateCmd() *cobra.Command { @@ -61,6 +63,7 @@ func newIndexDeprecateTruncateCmd() *cobra.Command { if err := indexCmd.Flags().MarkHidden("debug"); err != nil { logrus.Panic(err.Error()) } + indexCmd.Flags().Bool("allow-package-removal", false, "removes the entire package if the heads of all channels in the package are deprecated") return indexCmd } @@ -111,6 +114,11 @@ func runIndexDeprecateTruncateCmdFunc(cmd *cobra.Command, args []string) error { return err } + allowPackageRemoval, err := cmd.Flags().GetBool("allow-package-removal") + if err != nil { + return err + } + logger := logrus.WithFields(logrus.Fields{"bundles": bundles}) logger.Info("deprecating bundles from the index") @@ -121,14 +129,15 @@ func runIndexDeprecateTruncateCmdFunc(cmd *cobra.Command, args []string) error { logger) request := indexer.DeprecateFromIndexRequest{ - Generate: generate, - FromIndex: fromIndex, - BinarySourceImage: binaryImage, - OutDockerfile: outDockerfile, - Tag: tag, - Bundles: bundles, - Permissive: permissive, - SkipTLS: skipTLS, + Generate: generate, + FromIndex: fromIndex, + BinarySourceImage: binaryImage, + OutDockerfile: outDockerfile, + Tag: tag, + Bundles: bundles, + Permissive: permissive, + SkipTLS: skipTLS, + AllowPackageRemoval: allowPackageRemoval, } err = indexDeprecator.DeprecateFromIndex(request) diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/indexer/indexer.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/indexer/indexer.go index d15e3472d2..54eae4db1a 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/indexer/indexer.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/indexer/indexer.go @@ -643,15 +643,16 @@ func generatePackageYaml(dbQuerier pregistry.Query, packageName, downloadPath st // DeprecateFromIndexRequest defines the parameters to send to the PruneFromIndex API type DeprecateFromIndexRequest struct { - Generate bool - Permissive bool - BinarySourceImage string - FromIndex string - OutDockerfile string - Bundles []string - Tag string - CaFile string - SkipTLS bool + Generate bool + Permissive bool + BinarySourceImage string + FromIndex string + OutDockerfile string + Bundles []string + Tag string + CaFile string + SkipTLS bool + AllowPackageRemoval bool } // DeprecateFromIndex takes a DeprecateFromIndexRequest and deprecates the requested @@ -668,14 +669,14 @@ func (i ImageIndexer) DeprecateFromIndex(request DeprecateFromIndexRequest) erro return err } - // Run opm registry prune on the database deprecateFromRegistryReq := registry.DeprecateFromRegistryRequest{ - Bundles: request.Bundles, - InputDatabase: databasePath, - Permissive: request.Permissive, + Bundles: request.Bundles, + InputDatabase: databasePath, + Permissive: request.Permissive, + AllowPackageRemoval: request.AllowPackageRemoval, } - // Prune the bundles from the registry + // Deprecate the bundles from the registry err = i.RegistryDeprecator.DeprecateFromRegistry(deprecateFromRegistryReq) if err != nil { return err diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/registry/registry.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/registry/registry.go index 34dc493e2c..e8ec05cce2 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/registry/registry.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/registry/registry.go @@ -331,9 +331,10 @@ func (r RegistryUpdater) PruneFromRegistry(request PruneFromRegistryRequest) err } type DeprecateFromRegistryRequest struct { - Permissive bool - InputDatabase string - Bundles []string + Permissive bool + InputDatabase string + Bundles []string + AllowPackageRemoval bool } func (r RegistryUpdater) DeprecateFromRegistry(request DeprecateFromRegistryRequest) error { @@ -366,6 +367,23 @@ func (r RegistryUpdater) DeprecateFromRegistry(request DeprecateFromRegistryRequ } deprecator := sqlite.NewSQLDeprecatorForBundles(dbLoader, toDeprecate) + + // Check for deprecation of head of default channel. If deprecation request includes heads of all other channels, + // then remove the package entirely. Otherwise, deprecate provided bundles. This enables deprecating an entire package. + // By default deprecating the head of default channel is not permitted. + if request.AllowPackageRemoval { + packageDeprecator := sqlite.NewSQLDeprecatorForBundlesAndPackages(deprecator, dbQuerier) + if err := packageDeprecator.MaybeRemovePackages(); err != nil { + r.Logger.Debugf("unable to deprecate package from database: %s", err) + if !request.Permissive { + r.Logger.WithError(err).Error("permissive mode disabled") + return err + } + r.Logger.WithError(err).Warn("permissive mode enabled") + } + } + + // Any bundles associated with removed packages are now removed from the list of bundles to deprecate. if err := deprecator.Deprecate(); err != nil { r.Logger.Debugf("unable to deprecate bundles from database: %s", err) if !request.Permissive { diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/deprecate.go b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/deprecate.go index a8cdb24fa9..4ac3d61ebf 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/deprecate.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/deprecate.go @@ -1,6 +1,7 @@ package sqlite import ( + "context" "errors" "fmt" @@ -20,7 +21,14 @@ type BundleDeprecator struct { bundles []string } +// PackageDeprecator removes bundles and optionally entire packages from the index +type PackageDeprecator struct { + *BundleDeprecator + querier *SQLQuerier +} + var _ SQLDeprecator = &BundleDeprecator{} +var _ SQLDeprecator = &PackageDeprecator{} func NewSQLDeprecatorForBundles(store registry.Load, bundles []string) *BundleDeprecator { return &BundleDeprecator{ @@ -29,6 +37,13 @@ func NewSQLDeprecatorForBundles(store registry.Load, bundles []string) *BundleDe } } +func NewSQLDeprecatorForBundlesAndPackages(deprecator *BundleDeprecator, querier *SQLQuerier) *PackageDeprecator { + return &PackageDeprecator{ + BundleDeprecator: deprecator, + querier: querier, + } +} + func (d *BundleDeprecator) Deprecate() error { log := logrus.WithField("bundles", d.bundles) log.Info("deprecating bundles") @@ -45,3 +60,87 @@ func (d *BundleDeprecator) Deprecate() error { return utilerrors.NewAggregate(errs) } + +// MaybeRemovePackages queries the DB to establish if any provided bundles are the head of the default channel of a package. +// If so, the list of bundles must also contain the head of all other channels in the package, otherwise an error is produced. +// If the heads of all channels are being deprecated (including the default channel), the package is removed entirely from the index. +// MaybeRemovePackages deletes all bundles from the associated package from the bundles array, so that the subsequent +// Deprecate() call can proceed with deprecating other potential bundles from other packages. +func (d *PackageDeprecator) MaybeRemovePackages() error { + log := logrus.WithField("bundles", d.bundles) + log.Info("allow-package-removal enabled: checking default channel heads for package removal") + + var errs []error + var removedBundlePaths []string + var remainingBundlePaths []string + + // Iterate over bundles list - see if any bundle is the head of a default channel in a package + var packages []string + for _, bundle := range d.bundles { + found, err := d.querier.PackageFromDefaultChannelHeadBundle(context.TODO(), bundle) + if err != nil { + errs = append(errs, fmt.Errorf("error checking if bundle is default channel head %s: %s", bundle, err)) + } + if found != "" { + packages = append(packages, found) + } + } + + if len(packages) == 0 { + log.Info("no head of default channel found - skipping package removal") + return nil + } + + // If so, ensure list contains head of all other channels in that package + // If not, return error + for _, pkg := range packages { + channels, err := d.querier.ListChannels(context.TODO(), pkg) + if err != nil { + errs = append(errs, fmt.Errorf("error listing channels for package %s: %s", pkg, err)) + } + for _, channel := range channels { + found, err := d.querier.BundlePathForChannelHead(context.TODO(), pkg, channel) + if err != nil { + errs = append(errs, fmt.Errorf("error listing channel head for package %s: %s", pkg, err)) + } + if !contains(found, d.bundles) { + // terminal error + errs = append(errs, fmt.Errorf("cannot deprecate default channel head from package without removing all other channel heads in package %s: must deprecate %s, head of channel %s", pkg, found, channel)) + return utilerrors.NewAggregate(errs) + } + removedBundlePaths = append(removedBundlePaths, found) + } + } + + // Remove associated package from index + log.Infof("removing packages %#v", packages) + for _, pkg := range packages { + err := d.store.RemovePackage(pkg) + if err != nil { + errs = append(errs, fmt.Errorf("error removing package %s: %s", pkg, err)) + } + } + + // Remove bundles from the removed package from the deprecation request + // This enables other bundles to be deprecated via the expected flow + // Build a new array with just the outstanding bundles + for _, bundlePath := range d.bundles { + if contains(bundlePath, removedBundlePaths) { + continue + } + remainingBundlePaths = append(remainingBundlePaths, bundlePath) + } + d.bundles = remainingBundlePaths + log.Infof("remaining bundles to deprecate %#v", d.bundles) + + return utilerrors.NewAggregate(errs) +} + +func contains(bundlePath string, bundles []string) bool { + for _, b := range bundles { + if b == bundlePath { + return true + } + } + return false +} diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/query.go b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/query.go index 6a30c35bfe..432b998112 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/query.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/query.go @@ -1338,3 +1338,57 @@ func (s *SQLQuerier) listBundleChannels(ctx context.Context, bundleName string) return channels, nil } + +// PackageFromDefaultChannelHeadBundle returns the package name if the provided bundle is the head of its default channel. +func (s *SQLQuerier) PackageFromDefaultChannelHeadBundle(ctx context.Context, bundle string) (string, error) { + packageFromDefaultChannelHeadBundle := ` + SELECT package_name FROM package + INNER JOIN channel ON channel.name = package.default_channel + WHERE channel.head_operatorbundle_name = (SELECT name FROM operatorbundle WHERE bundlepath=? LIMIT 1) ` + + rows, err := s.db.QueryContext(ctx, packageFromDefaultChannelHeadBundle, bundle) + if err != nil { + return "", err + } + defer rows.Close() + + var packageName sql.NullString + for rows.Next() { + if err := rows.Scan(&packageName); err != nil { + return "", err + } + + if !packageName.Valid { + return "", fmt.Errorf("package name column corrupt for bundle %s", bundle) + } + } + + return packageName.String, nil +} + +// BundlePathForChannelHead returns the bundlepath for the given package and channel +func (s *SQLQuerier) BundlePathForChannelHead(ctx context.Context, pkg string, channel string) (string, error) { + bundlePathForChannelHeadQuery := ` + SELECT bundlepath FROM operatorbundle + INNER JOIN channel ON channel.head_operatorbundle_name = operatorbundle.name + WHERE channel.package_name = ? AND channel.name = ? +` + + rows, err := s.db.QueryContext(ctx, bundlePathForChannelHeadQuery, pkg, channel) + if err != nil { + return "", err + } + defer rows.Close() + + var bundlePath sql.NullString + for rows.Next() { + if err := rows.Scan(&bundlePath); err != nil { + return "", err + } + if !bundlePath.Valid { + return "", fmt.Errorf("bundlepath column corrupt for package %s, channel %s", pkg, channel) + } + } + + return bundlePath.String, nil +} From e187a72ed8442282145f3aa86e8dc6fed86ef806 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Wed, 11 Aug 2021 13:54:32 -0700 Subject: [PATCH 15/45] feat(release): X.Y, X, and latest opm image tags (#738) build X.Y, X, and latest opm images but only latest if X.Y.Z is latest semver in HEAD and X.Y/X if the current HEAD commit is tagged. Signed-off-by: Eric Stroczynski Upstream-repository: operator-registry Upstream-commit: 6f1a54f7b7b4f5e4f062fde42cb477ae25d438f6 --- staging/operator-registry/.goreleaser.yaml | 22 +++++++++++++++ staging/operator-registry/Makefile | 32 ++++++++++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/staging/operator-registry/.goreleaser.yaml b/staging/operator-registry/.goreleaser.yaml index 2a5db02c10..38f0d5b876 100644 --- a/staging/operator-registry/.goreleaser.yaml +++ b/staging/operator-registry/.goreleaser.yaml @@ -158,12 +158,34 @@ dockers: build_flag_templates: - --platform=linux/s390x docker_manifests: + # IMAGE_TAG is either set by the Makefile or the goreleaser action workflow, + # This image is intended to be tagged/pushed on all trunk (master, release branch) commits and tags. - name_template: "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}" image_templates: - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + # Release image builds will be skipped if *_IMAGE_OR_EMPTY variables are empty. + # https://github.com/goreleaser/goreleaser/blob/9ed3c0c/internal/pipe/docker/manifest.go#L105 + - name_template: "{{ .Env.MAJ_MIN_IMAGE_OR_EMPTY }}" + image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + - name_template: "{{ .Env.MAJ_IMAGE_OR_EMPTY }}" + image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" + - name_template: "{{ .Env.LATEST_IMAGE_OR_EMPTY }}" + image_templates: + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-amd64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-arm64" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-ppc64le" + - "{{ .Env.OPM_IMAGE_REPO }}:{{ .Env.IMAGE_TAG }}-s390x" checksum: name_template: 'checksums.txt' snapshot: diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index ad2004a1bc..9cc53655f6 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -14,7 +14,7 @@ comma := , # default to json1 for sqlite3 TAGS := -tags=json1 -# Cluster to use for e2e testing +# Cluster to use for e2e testing CLUSTER ?= "" ifeq ($(CLUSTER), kind) # add kind to the list of tags @@ -113,12 +113,38 @@ clean: .PHONY: e2e e2e: - $(GO) run github.com/onsi/ginkgo/ginkgo --v --randomizeAllSpecs --randomizeSuites --race $(if $(TEST),-focus '$(TEST)') $(TAGS) ./test/e2e -- $(if $(SKIPTLS),-skip-tls true) + $(GO) run github.com/onsi/ginkgo/ginkgo --v --randomizeAllSpecs --randomizeSuites --race $(if $(TEST),-focus '$(TEST)') $(TAGS) ./test/e2e -- $(if $(SKIPTLS),-skip-tls true) .PHONY: release export OPM_IMAGE_REPO ?= quay.io/operator-framework/opm export IMAGE_TAG ?= $(OPM_VERSION) -release: RELEASE_ARGS?=release --rm-dist --snapshot +export MAJ_MIN_IMAGE_OR_EMPTY ?= $(call tagged-or-empty,$(shell echo $(OPM_VERSION) | grep -Eo 'v[0-9]+\.[0-9]+')) +export MAJ_IMAGE_OR_EMPTY ?= $(call tagged-or-empty,$(shell echo $(OPM_VERSION) | grep -Eo 'v[0-9]+')) +# LATEST_TAG is the latest semver tag in HEAD. Used to deduce whether +# OPM_VERSION is the new latest tag, or a prior minor/patch tag, below. +# NOTE: this can only be relied upon if full git history is present. +# An actions/checkout step must use "fetch-depth: 0", for example. +LATEST_TAG := $(shell git tag -l | tr - \~ | sort -V | tr \~ - | tail -n1) +# LATEST_IMAGE_OR_EMPTY is set to OPM_IMAGE_REPO:latest when OPM_VERSION +# is not a prerelase tag and == LATEST_TAG, otherwise the empty string. +# An empty string causes goreleaser to skip building the manifest image for latest, +# which we do not want when cutting a non-latest release (old minor/patch tag). +export LATEST_IMAGE_OR_EMPTY ?= $(shell \ + echo $(OPM_VERSION) | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$$' \ + && [ "$(shell echo -e "$(OPM_VERSION)\n$(LATEST_TAG)" | sort -rV | head -n1)" == "$(OPM_VERSION)" ] \ + && echo "$(OPM_IMAGE_REPO):latest" || echo "") +release: RELEASE_ARGS ?= release --rm-dist --snapshot release: ./scripts/fetch goreleaser 0.173.2 && ./bin/goreleaser $(RELEASE_ARGS) + +# tagged-or-empty returns $(OPM_IMAGE_REPO):$(1) when HEAD is assigned a non-prerelease semver tag, +# otherwise the empty string. An empty string causes goreleaser to skip building +# the manifest image for a trunk commit when it is not a release commit. +# In other words, this function will return "" if the tag is not in vX.Y.Z format. +define tagged-or-empty +$(shell \ + echo $(OPM_VERSION) | grep -Eq '^v[0-9]+\.[0-9]+\.[0-9]+$$' \ + && git describe --exact-match HEAD >/dev/null 2>&1 \ + && echo "$(OPM_IMAGE_REPO):$(1)" || echo "" ) +endef From c97b9c5488bda19cf7ec3539f4710a895ead59d3 Mon Sep 17 00:00:00 2001 From: Daniel Messer Date: Mon, 16 Aug 2021 15:30:35 +0200 Subject: [PATCH 16/45] add further console customization types (#2319) Signed-off-by: Daniel Messer Upstream-repository: operator-lifecycle-manager Upstream-commit: c76e1cd8e24d555f59379f07faff538f6f5a4191 --- .../pkg/controller/operators/catalog/operator.go | 6 ++++++ .../pkg/controller/operators/catalog/operator.go | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index 644c882c8f..bc4cc76160 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -2426,6 +2426,9 @@ const ( PriorityClassKind = "PriorityClass" VerticalPodAutoscalerKind = "VerticalPodAutoscaler" ConsoleYAMLSampleKind = "ConsoleYAMLSample" + ConsoleQuickStartKind = "ConsoleQuickStart" + ConsoleCLIDownloadKind = "ConsoleCLIDownload" + ConsoleLinkKind = "ConsoleLink" ) var supportedKinds = map[string]struct{}{ @@ -2435,6 +2438,9 @@ var supportedKinds = map[string]struct{}{ PriorityClassKind: {}, VerticalPodAutoscalerKind: {}, ConsoleYAMLSampleKind: {}, + ConsoleQuickStartKind: {}, + ConsoleCLIDownloadKind: {}, + ConsoleLinkKind: {}, } // isSupported returns true if OLM supports this type of CustomResource. diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index 644c882c8f..bc4cc76160 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -2426,6 +2426,9 @@ const ( PriorityClassKind = "PriorityClass" VerticalPodAutoscalerKind = "VerticalPodAutoscaler" ConsoleYAMLSampleKind = "ConsoleYAMLSample" + ConsoleQuickStartKind = "ConsoleQuickStart" + ConsoleCLIDownloadKind = "ConsoleCLIDownload" + ConsoleLinkKind = "ConsoleLink" ) var supportedKinds = map[string]struct{}{ @@ -2435,6 +2438,9 @@ var supportedKinds = map[string]struct{}{ PriorityClassKind: {}, VerticalPodAutoscalerKind: {}, ConsoleYAMLSampleKind: {}, + ConsoleQuickStartKind: {}, + ConsoleCLIDownloadKind: {}, + ConsoleLinkKind: {}, } // isSupported returns true if OLM supports this type of CustomResource. From c30ba9c0af8210cf6b7ac918a097123ac7a817e7 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Mon, 16 Aug 2021 09:48:34 -0400 Subject: [PATCH 17/45] cli doc: opm serve does not detect DC changes after startup (#750) Signed-off-by: Joe Lanford Upstream-repository: operator-registry Upstream-commit: 50b78e97a50f952a08c221678f5df7b9bfafc059 --- staging/operator-registry/cmd/opm/serve/serve.go | 9 +++++++-- .../operator-registry/cmd/opm/serve/serve.go | 9 +++++++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/staging/operator-registry/cmd/opm/serve/serve.go b/staging/operator-registry/cmd/opm/serve/serve.go index b2c1c1e52b..b8a9e8ec41 100644 --- a/staging/operator-registry/cmd/opm/serve/serve.go +++ b/staging/operator-registry/cmd/opm/serve/serve.go @@ -39,8 +39,13 @@ func NewCmd() *cobra.Command { cmd := &cobra.Command{ Use: "serve ", Short: "serve declarative configs", - Long: `serve declarative configs via grpc`, - Args: cobra.ExactArgs(1), + Long: `This command serves declarative configs via a GRPC server. + +NOTE: The declarative config directory is loaded by the serve command at +startup. Changes made to the declarative config after the this command starts +will not be reflected in the served content. +`, + Args: cobra.ExactArgs(1), PreRunE: func(_ *cobra.Command, args []string) error { s.configDir = args[0] if s.debug { diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go index b2c1c1e52b..b8a9e8ec41 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go @@ -39,8 +39,13 @@ func NewCmd() *cobra.Command { cmd := &cobra.Command{ Use: "serve ", Short: "serve declarative configs", - Long: `serve declarative configs via grpc`, - Args: cobra.ExactArgs(1), + Long: `This command serves declarative configs via a GRPC server. + +NOTE: The declarative config directory is loaded by the serve command at +startup. Changes made to the declarative config after the this command starts +will not be reflected in the served content. +`, + Args: cobra.ExactArgs(1), PreRunE: func(_ *cobra.Command, args []string) error { s.configDir = args[0] if s.debug { From 9ad4597052d0ce9be6d52488b36a505e5e702644 Mon Sep 17 00:00:00 2001 From: Kevin Rizza Date: Mon, 16 Aug 2021 10:44:24 -0400 Subject: [PATCH 18/45] Add joelanford as an approver in OWNERS (#751) Signed-off-by: kevinrizza Upstream-repository: operator-registry Upstream-commit: 996010910c9ed57f7092fd2bc74e8506f6f4ace3 --- staging/operator-registry/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/staging/operator-registry/OWNERS b/staging/operator-registry/OWNERS index 58152b7436..492072e227 100644 --- a/staging/operator-registry/OWNERS +++ b/staging/operator-registry/OWNERS @@ -5,6 +5,7 @@ approvers: - dinhxuanvu - kevinrizza - benluddy + - joelanford # review == this code is good /lgtm reviewers: - ecordell From 6bcccb77cd871e1852e81cc52467d7e9d92ee2ea Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Wed, 18 Aug 2021 14:02:15 -0400 Subject: [PATCH 19/45] Prune API of the resolver package. (#2330) * Remove generated FakeAPIIntersectionReconciler. It's a test stub that has only one consumer. Generating a fake into pkg/fakes with counterfeiter and using it for tests in pkg/controller/operators/olm introduces a number of transitive package dependencies that make it difficult to unwind the resolver package from other runtime components. Signed-off-by: Ben Luddy * Move OperatorGroup surface logic to the olm package. It has been living in the resolver package as a holdover from earlier generations of resolution, but is only consumed by olm-operator as part of OperatorGroup reconciliation. Signed-off-by: Ben Luddy * Move API labeler from the resolver package to the olm package. The only user of the provided/required API labeling functionality is olm-operator, but it was still residing in the resolver package. Signed-off-by: Ben Luddy * Remove OperatorSurface interface from resolver. This interface is used only by olm-operator and doesn't provide a useful abstraction on top of directly reading fields from Operator structs. Signed-off-by: Ben Luddy * Extract SourceQuerier from the resolver package. SourceQuerier is a holdover from the previous resolution implementation. Now, it only gets minor usage in catalog-operator. Unused methods have been removed, and SourceQuerier has moved to pkg/controller/operators/catalog beside where it is used. Signed-off-by: Ben Luddy Upstream-repository: operator-lifecycle-manager Upstream-commit: 9b537bf1079d55244c0cd733fc55d12d02c31574 --- .../catalog}/fakes/fake_registry_client.go | 0 .../catalog/fakes/fake_registry_interface.go} | 0 .../controller/operators/catalog/operator.go | 6 +- .../operators/catalog/operator_test.go | 2 +- .../controller/operators/catalog/querier.go | 123 ++++ .../catalog}/querier_test.go | 236 +----- .../operators/catalog/subscriptions_test.go | 4 +- .../pkg/controller/operators/olm/config.go | 9 +- .../resolver => operators/olm}/groups.go | 3 +- .../resolver => operators/olm}/groups_test.go | 2 +- .../pkg/controller/operators/olm}/labeler.go | 49 +- .../olm}/labeler_test.go | 33 +- .../pkg/controller/operators/olm/operator.go | 23 +- .../controller/operators/olm/operator_test.go | 56 +- .../controller/operators/olm/operatorgroup.go | 9 +- .../registry/resolver/cache/operators.go | 65 +- .../registry/resolver/cache/operators_test.go | 60 +- .../registry/resolver/cache/predicates.go | 3 +- .../resolver/fakes/fake_registry_interface.go | 676 ------------------ .../registry/resolver/installabletypes.go | 4 +- .../resolver/instrumented_resolver.go | 4 +- .../resolver/instrumented_resolver_test.go | 11 +- .../controller/registry/resolver/querier.go | 197 ----- .../controller/registry/resolver/resolver.go | 30 +- .../registry/resolver/resolver_test.go | 28 +- .../registry/resolver/step_resolver.go | 35 +- .../registry/resolver/step_resolver_test.go | 6 +- .../controller/registry/resolver/util_test.go | 134 ---- .../fakes/fake_api_intersection_reconciler.go | 115 --- .../pkg/fakes/fake_resolver.go | 18 +- .../test/e2e/subscription_e2e_test.go | 3 +- .../controller/operators/catalog/operator.go | 6 +- .../controller/operators/catalog/querier.go | 123 ++++ .../pkg/controller/operators/olm/config.go | 9 +- .../resolver => operators/olm}/groups.go | 3 +- .../pkg/controller/operators/olm}/labeler.go | 49 +- .../pkg/controller/operators/olm/operator.go | 23 +- .../controller/operators/olm/operatorgroup.go | 9 +- .../registry/resolver/cache/operators.go | 65 +- .../registry/resolver/cache/predicates.go | 3 +- .../registry/resolver/installabletypes.go | 4 +- .../resolver/instrumented_resolver.go | 4 +- .../controller/registry/resolver/querier.go | 197 ----- .../controller/registry/resolver/resolver.go | 30 +- .../registry/resolver/step_resolver.go | 35 +- 45 files changed, 600 insertions(+), 1904 deletions(-) rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/catalog}/fakes/fake_registry_client.go (100%) rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver/fakes/fake_registry_client_interface.go => operators/catalog/fakes/fake_registry_interface.go} (100%) create mode 100644 staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/catalog}/querier_test.go (55%) rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/olm}/groups.go (96%) rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/olm}/groups_test.go (99%) rename {vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver => staging/operator-lifecycle-manager/pkg/controller/operators/olm}/labeler.go (61%) rename staging/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/olm}/labeler_test.go (72%) delete mode 100644 staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_interface.go delete mode 100644 staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go delete mode 100644 staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go create mode 100644 vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go rename vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/{registry/resolver => operators/olm}/groups.go (96%) rename {staging/operator-lifecycle-manager/pkg/controller/registry/resolver => vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm}/labeler.go (61%) delete mode 100644 vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_client.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/fakes/fake_registry_client.go similarity index 100% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_client.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/catalog/fakes/fake_registry_client.go diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_client_interface.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/fakes/fake_registry_interface.go similarity index 100% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_client_interface.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/catalog/fakes/fake_registry_interface.go diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index bc4cc76160..c91029a3a7 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -890,7 +890,7 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error { // get the set of sources that should be used for resolution and best-effort get their connections working logger.Debug("resolving sources") - querier := resolver.NewNamespaceSourceQuerier(o.sources.AsClients(o.namespace, namespace)) + querier := NewNamespaceSourceQuerier(o.sources.AsClients(o.namespace, namespace)) logger.Debug("checking if subscriptions need update") @@ -950,7 +950,7 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error { logger.Debug("resolving subscriptions in namespace") // resolve a set of steps to apply to a cluster, a set of subscriptions to create/update, and any errors - steps, bundleLookups, updatedSubs, err := o.resolver.ResolveSteps(namespace, querier) + steps, bundleLookups, updatedSubs, err := o.resolver.ResolveSteps(namespace) if err != nil { go o.recorder.Event(ns, corev1.EventTypeWarning, "ResolutionFailed", err.Error()) // If the error is constraints not satisfiable, then simply project the @@ -1096,7 +1096,7 @@ func (o *Operator) ensureSubscriptionInstallPlanState(logger *logrus.Entry, sub return updated, true, nil } -func (o *Operator) ensureSubscriptionCSVState(logger *logrus.Entry, sub *v1alpha1.Subscription, querier resolver.SourceQuerier) (*v1alpha1.Subscription, bool, error) { +func (o *Operator) ensureSubscriptionCSVState(logger *logrus.Entry, sub *v1alpha1.Subscription, querier SourceQuerier) (*v1alpha1.Subscription, bool, error) { if sub.Status.CurrentCSV == "" { return sub, false, nil } diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go index b519af62ed..5aa398ab55 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator_test.go @@ -1204,7 +1204,7 @@ func TestSyncResolvingNamespace(t *testing.T) { o.sourcesLastUpdate.Set(tt.fields.sourcesLastUpdate.Time) o.resolver = &fakes.FakeStepResolver{ - ResolveStepsStub: func(string, resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { + ResolveStepsStub: func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { return nil, nil, nil, tt.fields.resolveErr }, } diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go new file mode 100644 index 0000000000..1faf2c05cc --- /dev/null +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go @@ -0,0 +1,123 @@ +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_client.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/api.RegistryClient +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../registry/registry_client.go ClientInterface +package catalog + +import ( + "context" + "fmt" + + "github.com/blang/semver/v4" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/errors" + + "github.com/operator-framework/operator-registry/pkg/api" + "github.com/operator-framework/operator-registry/pkg/client" + + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" +) + +const SkipPackageAnnotationKey = "olm.skipRange" + +type SourceRef struct { + Address string + Client client.Interface + LastConnect metav1.Time + LastHealthy metav1.Time +} + +type SourceQuerier interface { + FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) + Queryable() error +} + +type NamespaceSourceQuerier struct { + sources map[registry.CatalogKey]registry.ClientInterface +} + +var _ SourceQuerier = &NamespaceSourceQuerier{} + +func NewNamespaceSourceQuerier(sources map[registry.CatalogKey]registry.ClientInterface) *NamespaceSourceQuerier { + return &NamespaceSourceQuerier{ + sources: sources, + } +} + +func (q *NamespaceSourceQuerier) Queryable() error { + if len(q.sources) == 0 { + return fmt.Errorf("no catalog sources available") + } + return nil +} + +func (q *NamespaceSourceQuerier) FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { + errs := []error{} + + if initialSource.Name != "" && initialSource.Namespace != "" { + source, ok := q.sources[initialSource] + if !ok { + return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource.Name) + } + + bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + return nil, nil, errors.NewAggregate(errs) + } + + for key, source := range q.sources { + bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) + if bundle != nil { + return bundle, &key, nil + } + if err != nil { + errs = append(errs, err) + } + } + return nil, nil, errors.NewAggregate(errs) +} + +func (q *NamespaceSourceQuerier) findChannelHead(currentVersion *semver.Version, pkgName, channelName string, source client.Interface) (*api.Bundle, error) { + if currentVersion == nil { + return nil, nil + } + + latest, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) + if err != nil { + return nil, err + } + + if latest.SkipRange == "" { + return nil, nil + } + + r, err := semver.ParseRange(latest.SkipRange) + if err != nil { + return nil, err + } + + if r(*currentVersion) { + return latest, nil + } + return nil, nil +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier_test.go similarity index 55% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier_test.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier_test.go index 20d1c0e700..6a220a854d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/querier_test.go @@ -1,4 +1,4 @@ -package resolver +package catalog import ( "context" @@ -9,14 +9,13 @@ import ( "github.com/blang/semver/v4" "github.com/operator-framework/operator-registry/pkg/api" "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/fakes" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes" ) func TestNewNamespaceSourceQuerier(t *testing.T) { @@ -114,237 +113,6 @@ func TestNamespaceSourceQuerier_Queryable(t *testing.T) { } } -func TestNamespaceSourceQuerier_FindProvider(t *testing.T) { - fakeSource := fakes.FakeClientInterface{} - fakeSource2 := fakes.FakeClientInterface{} - sources := map[registry.CatalogKey]registry.ClientInterface{ - registry.CatalogKey{"test", "ns"}: &fakeSource, - registry.CatalogKey{"test2", "ns"}: &fakeSource2, - } - excludedPkgs := make(map[string]struct{}) - bundle := &api.Bundle{CsvName: "test", PackageName: "testPkg", ChannelName: "testChannel"} - bundle2 := &api.Bundle{CsvName: "test2", PackageName: "testPkg2", ChannelName: "testChannel2"} - fakeSource.GetBundleThatProvidesStub = func(ctx context.Context, group, version, kind string) (*api.Bundle, error) { - if group != "group" || version != "version" || kind != "kind" { - return nil, fmt.Errorf("Not Found") - } - return bundle, nil - } - fakeSource2.GetBundleThatProvidesStub = func(ctx context.Context, group, version, kind string) (*api.Bundle, error) { - if group != "group2" || version != "version2" || kind != "kind2" { - return nil, fmt.Errorf("Not Found") - } - return bundle2, nil - } - fakeSource.FindBundleThatProvidesStub = func(ctx context.Context, group, version, kind string, excludedPkgs map[string]struct{}) (*api.Bundle, error) { - if group != "group" || version != "version" || kind != "kind" { - return nil, fmt.Errorf("Not Found") - } - return bundle, nil - } - fakeSource2.FindBundleThatProvidesStub = func(ctx context.Context, group, version, kind string, excludedPkgs map[string]struct{}) (*api.Bundle, error) { - if group != "group2" || version != "version2" || kind != "kind2" { - return nil, fmt.Errorf("Not Found") - } - return bundle2, nil - } - - type fields struct { - sources map[registry.CatalogKey]registry.ClientInterface - } - type args struct { - api opregistry.APIKey - catalogKey registry.CatalogKey - } - type out struct { - bundle *api.Bundle - key *registry.CatalogKey - err error - } - tests := []struct { - name string - fields fields - args args - out out - }{ - { - fields: fields{ - sources: sources, - }, - args: args{ - api: opregistry.APIKey{"group", "version", "kind", "plural"}, - catalogKey: registry.CatalogKey{}, - }, - out: out{ - bundle: bundle, - key: ®istry.CatalogKey{Name: "test", Namespace: "ns"}, - err: nil, - }, - }, - { - fields: fields{ - sources: nil, - }, - args: args{ - api: opregistry.APIKey{"group", "version", "kind", "plural"}, - catalogKey: registry.CatalogKey{}, - }, - out: out{ - bundle: nil, - key: nil, - err: fmt.Errorf("group/version/kind (plural) not provided by a package in any CatalogSource"), - }, - }, - { - fields: fields{ - sources: sources, - }, - args: args{ - api: opregistry.APIKey{"group2", "version2", "kind2", "plural2"}, - catalogKey: registry.CatalogKey{Name: "test2", Namespace: "ns"}, - }, - out: out{ - bundle: bundle2, - key: ®istry.CatalogKey{Name: "test2", Namespace: "ns"}, - err: nil, - }, - }, - { - fields: fields{ - sources: sources, - }, - args: args{ - api: opregistry.APIKey{"group2", "version2", "kind2", "plural2"}, - catalogKey: registry.CatalogKey{Name: "test3", Namespace: "ns"}, - }, - out: out{ - bundle: bundle2, - key: ®istry.CatalogKey{Name: "test2", Namespace: "ns"}, - err: nil, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - q := &NamespaceSourceQuerier{ - sources: tt.fields.sources, - } - bundle, key, err := q.FindProvider(tt.args.api, tt.args.catalogKey, excludedPkgs) - require.Equal(t, tt.out.err, err) - require.Equal(t, tt.out.bundle, bundle) - require.Equal(t, tt.out.key, key) - }) - } -} - -func TestNamespaceSourceQuerier_FindPackage(t *testing.T) { - initialSource := fakes.FakeClientInterface{} - otherSource := fakes.FakeClientInterface{} - initalBundle := &api.Bundle{CsvName: "test", PackageName: "testPkg", ChannelName: "testChannel"} - startingBundle := &api.Bundle{CsvName: "starting-test", PackageName: "testPkg", ChannelName: "testChannel"} - otherBundle := &api.Bundle{CsvName: "other", PackageName: "otherPkg", ChannelName: "otherChannel"} - initialSource.GetBundleStub = func(ctx context.Context, pkgName, channelName, csvName string) (*api.Bundle, error) { - if csvName != startingBundle.CsvName { - return nil, fmt.Errorf("not found") - } - return startingBundle, nil - } - initialSource.GetBundleInPackageChannelStub = func(ctx context.Context, pkgName, channelName string) (*api.Bundle, error) { - if pkgName != initalBundle.CsvName { - return nil, fmt.Errorf("not found") - } - return initalBundle, nil - } - otherSource.GetBundleInPackageChannelStub = func(ctx context.Context, pkgName, channelName string) (*api.Bundle, error) { - if pkgName != otherBundle.CsvName { - return nil, fmt.Errorf("not found") - } - return otherBundle, nil - } - initialKey := registry.CatalogKey{"initial", "ns"} - otherKey := registry.CatalogKey{"other", "other"} - sources := map[registry.CatalogKey]registry.ClientInterface{ - initialKey: &initialSource, - otherKey: &otherSource, - } - - type fields struct { - sources map[registry.CatalogKey]registry.ClientInterface - } - type args struct { - pkgName string - channelName string - startingCSV string - initialSource registry.CatalogKey - } - type out struct { - bundle *api.Bundle - key *registry.CatalogKey - err error - } - tests := []struct { - name string - fields fields - args args - out out - }{ - { - name: "Initial/Found", - fields: fields{sources: sources}, - args: args{"test", "testChannel", "", registry.CatalogKey{"initial", "ns"}}, - out: out{bundle: initalBundle, key: &initialKey, err: nil}, - }, - { - name: "Initial/CatalogNotFound", - fields: fields{sources: sources}, - args: args{"test", "testChannel", "", registry.CatalogKey{"absent", "found"}}, - out: out{bundle: nil, key: nil, err: fmt.Errorf("CatalogSource {absent found} not found")}, - }, - { - name: "Initial/StartingCSVFound", - fields: fields{sources: sources}, - args: args{"test", "testChannel", "starting-test", registry.CatalogKey{"initial", "ns"}}, - out: out{bundle: startingBundle, key: &initialKey, err: nil}, - }, - { - name: "Initial/StartingCSVNotFound", - fields: fields{sources: sources}, - args: args{"test", "testChannel", "non-existent", registry.CatalogKey{"initial", "ns"}}, - out: out{bundle: nil, key: nil, err: fmt.Errorf("not found")}, - }, - { - name: "Other/Found", - fields: fields{sources: sources}, - args: args{"other", "testChannel", "", registry.CatalogKey{"", ""}}, - out: out{bundle: otherBundle, key: &otherKey, err: nil}, - }, - { - name: "NotFound", - fields: fields{sources: sources}, - args: args{"nope", "not", "", registry.CatalogKey{"", ""}}, - out: out{bundle: nil, err: fmt.Errorf("nope/not not found in any available CatalogSource")}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - q := &NamespaceSourceQuerier{ - sources: tt.fields.sources, - } - var got *api.Bundle - var key *registry.CatalogKey - var err error - if tt.args.startingCSV != "" { - got, key, err = q.FindBundle(tt.args.pkgName, tt.args.channelName, tt.args.startingCSV, tt.args.initialSource) - } else { - got, key, err = q.FindLatestBundle(tt.args.pkgName, tt.args.channelName, tt.args.initialSource) - } - require.Equal(t, tt.out.err, err) - require.Equal(t, tt.out.bundle, got) - require.Equal(t, tt.out.key, key) - }) - } -} - func TestNamespaceSourceQuerier_FindReplacement(t *testing.T) { // TODO: clean up this test setup initialSource := fakes.FakeClientInterface{} diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go index 9d3d2212f3..4d35a80394 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/subscriptions_test.go @@ -1079,7 +1079,7 @@ func TestSyncSubscriptions(t *testing.T) { o.sourcesLastUpdate.Set(tt.fields.sourcesLastUpdate.Time) o.resolver = &fakes.FakeStepResolver{ - ResolveStepsStub: func(string, resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { + ResolveStepsStub: func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { return tt.fields.resolveSteps, tt.fields.bundleLookups, tt.fields.resolveSubs, tt.fields.resolveErr }, } @@ -1215,7 +1215,7 @@ func BenchmarkSyncResolvingNamespace(b *testing.B) { }, }, resolver: &fakes.FakeStepResolver{ - ResolveStepsStub: func(string, resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { + ResolveStepsStub: func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { steps := []*v1alpha1.Step{ { Resolving: "csv.v.2", diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/config.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/config.go index 69f156ecf3..98ac5ff958 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/config.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/config.go @@ -14,7 +14,6 @@ import ( configv1client "github.com/openshift/client-go/config/clientset/versioned" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/labeler" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" ) @@ -30,7 +29,7 @@ type operatorConfig struct { operatorClient operatorclient.ClientInterface externalClient versioned.Interface strategyResolver install.StrategyResolverInterface - apiReconciler resolver.APIIntersectionReconciler + apiReconciler APIIntersectionReconciler apiLabeler labeler.Labeler restConfig *rest.Config configClient configv1client.Interface @@ -84,8 +83,8 @@ func defaultOperatorConfig() *operatorConfig { clock: utilclock.RealClock{}, logger: logrus.New(), strategyResolver: &install.StrategyResolver{}, - apiReconciler: resolver.APIIntersectionReconcileFunc(resolver.ReconcileAPIIntersection), - apiLabeler: labeler.Func(resolver.LabelSetsFor), + apiReconciler: APIIntersectionReconcileFunc(ReconcileAPIIntersection), + apiLabeler: labeler.Func(LabelSetsFor), } } @@ -137,7 +136,7 @@ func WithStrategyResolver(strategyResolver install.StrategyResolverInterface) Op } } -func WithAPIReconciler(apiReconciler resolver.APIIntersectionReconciler) OperatorOption { +func WithAPIReconciler(apiReconciler APIIntersectionReconciler) OperatorOption { return func(config *operatorConfig) { config.apiReconciler = apiReconciler } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go similarity index 96% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go index 72f3e68ebf..90481c5f4a 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go @@ -1,5 +1,4 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../../fakes/fake_api_intersection_reconciler.go . APIIntersectionReconciler -package resolver +package olm import ( "strings" diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups_test.go similarity index 99% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups_test.go index 6b2be428d4..9534ab4593 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/groups_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/groups_test.go @@ -1,4 +1,4 @@ -package resolver +package olm import ( "strings" diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go similarity index 61% rename from vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go index 9b10eb2d6d..c0d003da5c 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go @@ -1,8 +1,9 @@ -package resolver +package olm import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" + extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" ) @@ -12,20 +13,27 @@ const ( APILabelKeyPrefix = "olm.api." ) +type operatorSurface interface { + GetProvidedAPIs() cache.APISet + GetRequiredAPIs() cache.APISet +} + // LabelSetsFor returns API label sets for the given object. // Concrete types other than OperatorSurface and CustomResource definition no-op. func LabelSetsFor(obj interface{}) ([]labels.Set, error) { switch v := obj.(type) { - case cache.OperatorSurface: + case operatorSurface: return labelSetsForOperatorSurface(v) case *extv1beta1.CustomResourceDefinition: - return labelSetsForCRD(v) + return labelSetsForCRDv1beta1(v) + case *extv1.CustomResourceDefinition: + return labelSetsForCRDv1(v) default: return nil, nil } } -func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, error) { +func labelSetsForOperatorSurface(surface operatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} for key := range surface.GetProvidedAPIs().StripPlural() { hash, err := cache.APIKeyToGVKHash(key) @@ -45,7 +53,38 @@ func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, e return []labels.Set{labelSet}, nil } -func labelSetsForCRD(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, error) { +func labelSetsForCRDv1beta1(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, error) { + labelSets := []labels.Set{} + if crd == nil { + return labelSets, nil + } + + // Add label sets for each version + for _, version := range crd.Spec.Versions { + hash, err := cache.APIKeyToGVKHash(registry.APIKey{ + Group: crd.Spec.Group, + Version: version.Name, + Kind: crd.Spec.Names.Kind, + }) + if err != nil { + return nil, err + } + key := APILabelKeyPrefix + hash + sets := []labels.Set{ + { + key: "provided", + }, + { + key: "required", + }, + } + labelSets = append(labelSets, sets...) + } + + return labelSets, nil +} + +func labelSetsForCRDv1(crd *extv1.CustomResourceDefinition) ([]labels.Set, error) { labelSets := []labels.Set{} if crd == nil { return labelSets, nil diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go similarity index 72% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go rename to staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go index caf16f972e..ca3722e034 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go @@ -1,4 +1,4 @@ -package resolver +package olm import ( "testing" @@ -6,6 +6,8 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" opregistry "github.com/operator-framework/operator-registry/pkg/registry" "github.com/stretchr/testify/require" + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" ) @@ -27,12 +29,29 @@ func TestLabelSetsFor(t *testing.T) { }, { name: "CRD/ProvidedAndRequired", - obj: crd(opregistry.APIKey{ - Group: "ghouls", - Version: "v1alpha1", - Kind: "Ghost", - Plural: "Ghosts", - }), + obj: &v1beta1.CustomResourceDefinition{ + TypeMeta: metav1.TypeMeta{ + Kind: "CustomResourceDefinition", + APIVersion: v1beta1.SchemeGroupVersion.String(), + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "Ghosts.ghouls", + }, + Spec: v1beta1.CustomResourceDefinitionSpec{ + Group: "ghouls", + Versions: []v1beta1.CustomResourceDefinitionVersion{ + { + Name: "v1alpha1", + Storage: true, + Served: true, + }, + }, + Names: v1beta1.CustomResourceDefinitionNames{ + Kind: "Ghost", + Plural: "Ghosts", + }, + }, + }, expected: []labels.Set{ { APILabelKeyPrefix + "6435ab0d7c6bda64": "provided", diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index b71abe2115..39018ee376 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -37,7 +37,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" @@ -79,7 +78,7 @@ type Operator struct { csvIndexers map[string]cache.Indexer recorder record.EventRecorder resolver install.StrategyResolverInterface - apiReconciler resolver.APIIntersectionReconciler + apiReconciler APIIntersectionReconciler apiLabeler labeler.Labeler csvSetGenerator csvutility.SetGenerator csvReplaceFinder csvutility.ReplaceFinder @@ -846,7 +845,7 @@ func (a *Operator) namespaceAddedOrRemoved(obj interface{}) { } for _, group := range operatorGroupList { - if resolver.NewNamespaceSet(group.Status.Namespaces).Contains(namespace.GetName()) { + if NewNamespaceSet(group.Status.Namespaces).Contains(namespace.GetName()) { if err := a.ogQueueSet.Requeue(group.Namespace, group.Name); err != nil { logger.WithError(err).Warn("error requeuing operatorgroup") } @@ -881,7 +880,7 @@ func (a *Operator) syncNamespace(obj interface{}) error { } for _, group := range operatorGroupList { - namespaceSet := resolver.NewNamespaceSet(group.Status.Namespaces) + namespaceSet := NewNamespaceSet(group.Status.Namespaces) // Apply the label if not an All Namespaces OperatorGroup. if namespaceSet.Contains(namespace.GetName()) && !namespaceSet.IsAllNamespaces() { @@ -1098,7 +1097,7 @@ func (a *Operator) removeDanglingChildCSVs(csv *v1alpha1.ClusterServiceVersion) } if annotations := parent.GetAnnotations(); annotations != nil { - if !resolver.NewNamespaceSetFromString(annotations[v1.OperatorGroupTargetsAnnotationKey]).Contains(csv.GetNamespace()) { + if !NewNamespaceSetFromString(annotations[v1.OperatorGroupTargetsAnnotationKey]).Contains(csv.GetNamespace()) { logger.WithField("parentTargets", annotations[v1.OperatorGroupTargetsAnnotationKey]). Debug("deleting copied CSV since parent no longer lists this as a target namespace") return a.deleteChild(csv, logger) @@ -1226,7 +1225,7 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) { }).Debug("copying csv to targets") // Check if we need to do any copying / annotation for the operatorgroup - if err := a.ensureCSVsInNamespaces(clusterServiceVersion, operatorGroup, resolver.NewNamespaceSet(operatorGroup.Status.Namespaces)); err != nil { + if err := a.ensureCSVsInNamespaces(clusterServiceVersion, operatorGroup, NewNamespaceSet(operatorGroup.Status.Namespaces)); err != nil { logger.WithError(err).Info("couldn't copy CSV to target namespaces") syncError = err } @@ -1427,12 +1426,12 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v } } - groupSurface := resolver.NewOperatorGroup(operatorGroup) - otherGroupSurfaces := resolver.NewOperatorGroupSurfaces(otherGroups...) + groupSurface := NewOperatorGroup(operatorGroup) + otherGroupSurfaces := NewOperatorGroupSurfaces(otherGroups...) providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { - case operatorGroup.Spec.StaticProvidedAPIs && (result == resolver.AddAPIs || result == resolver.RemoveAPIs): + case operatorGroup.Spec.StaticProvidedAPIs && (result == AddAPIs || result == RemoveAPIs): // Transition the CSV to FAILED with status reason "CannotModifyStaticOperatorGroupProvidedAPIs" if out.Status.Reason != v1alpha1.CSVReasonInterOperatorGroupOwnerConflict { logger.WithField("apis", providedAPIs).Warn("cannot modify provided apis of static provided api operatorgroup") @@ -1440,7 +1439,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.cleanupCSVDeployments(logger, out) } return - case result == resolver.APIConflict: + case result == APIConflict: // Transition the CSV to FAILED with status reason "InterOperatorGroupOwnerConflict" if out.Status.Reason != v1alpha1.CSVReasonInterOperatorGroupOwnerConflict { logger.WithField("apis", providedAPIs).Warn("intersecting operatorgroups provide the same apis") @@ -1448,7 +1447,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.cleanupCSVDeployments(logger, out) } return - case result == resolver.AddAPIs: + case result == AddAPIs: // Add the CSV's provided APIs to its OperatorGroup's annotation logger.WithField("apis", providedAPIs).Debug("adding csv provided apis to operatorgroup") union := groupSurface.ProvidedAPIs().Union(providedAPIs) @@ -1471,7 +1470,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.logger.WithError(err).Warn("unable to requeue") } return - case result == resolver.RemoveAPIs: + case result == RemoveAPIs: // Remove the CSV's provided APIs from its OperatorGroup's annotation logger.WithField("apis", providedAPIs).Debug("removing csv provided apis from operatorgroup") difference := groupSurface.ProvidedAPIs().Difference(providedAPIs) diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go index f7d9abbded..7a28654cae 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator_test.go @@ -54,9 +54,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/certs" olmerrors "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/errors" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" - "github.com/operator-framework/operator-lifecycle-manager/pkg/fakes" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clientfake" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/labeler" @@ -200,7 +198,7 @@ func withStrategyResolver(strategyResolver install.StrategyResolverInterface) fa } } -func withAPIReconciler(apiReconciler resolver.APIIntersectionReconciler) fakeOperatorOption { +func withAPIReconciler(apiReconciler APIIntersectionReconciler) fakeOperatorOption { return func(config *fakeOperatorConfig) { if apiReconciler != nil { config.apiReconciler = apiReconciler @@ -269,8 +267,8 @@ func NewFakeOperator(ctx context.Context, options ...fakeOperatorOption) (*Opera clock: &utilclock.RealClock{}, logger: logrus.New(), strategyResolver: &install.StrategyResolver{}, - apiReconciler: resolver.APIIntersectionReconcileFunc(resolver.ReconcileAPIIntersection), - apiLabeler: labeler.Func(resolver.LabelSetsFor), + apiReconciler: APIIntersectionReconcileFunc(ReconcileAPIIntersection), + apiLabeler: labeler.Func(LabelSetsFor), restConfig: &rest.Config{}, }, recorder: &record.FakeRecorder{}, @@ -328,10 +326,18 @@ func NewFakeOperator(ctx context.Context, options ...fakeOperatorOption) (*Opera return op, nil } -func buildFakeAPIIntersectionReconcilerThatReturns(result resolver.APIReconciliationResult) *fakes.FakeAPIIntersectionReconciler { - reconciler := &fakes.FakeAPIIntersectionReconciler{} - reconciler.ReconcileReturns(result) - return reconciler +type fakeAPIIntersectionReconciler struct { + Result APIReconciliationResult +} + +func (f fakeAPIIntersectionReconciler) Reconcile(resolvercache.APISet, OperatorGroupSurface, ...OperatorGroupSurface) APIReconciliationResult { + return f.Result +} + +func buildFakeAPIIntersectionReconcilerThatReturns(result APIReconciliationResult) APIIntersectionReconciler { + return fakeAPIIntersectionReconciler{ + Result: result, + } } func deployment(deploymentName, namespace, serviceAccountName string, templateAnnotations map[string]string) *appsv1.Deployment { @@ -916,7 +922,7 @@ func TestTransitionCSV(t *testing.T) { reason v1alpha1.ConditionReason } type operatorConfig struct { - apiReconciler resolver.APIIntersectionReconciler + apiReconciler APIIntersectionReconciler apiLabeler labeler.Labeler } type initial struct { @@ -2573,7 +2579,7 @@ func TestTransitionCSV(t *testing.T) { []*apiextensionsv1.CustomResourceDefinition{}, v1alpha1.CSVPhaseSucceeded, ), defaultTemplateAnnotations), labels.Set{ - resolver.APILabelKeyPrefix + apiHash: "provided", + APILabelKeyPrefix + apiHash: "provided", }), csvWithLabels(csvWithAnnotations(csv("csv1", namespace, @@ -2584,7 +2590,7 @@ func TestTransitionCSV(t *testing.T) { []*apiextensionsv1.CustomResourceDefinition{}, v1alpha1.CSVPhaseReplacing, ), defaultTemplateAnnotations), labels.Set{ - resolver.APILabelKeyPrefix + apiHash: "provided", + APILabelKeyPrefix + apiHash: "provided", }), csvWithLabels(csvWithAnnotations(csv("csv2", namespace, @@ -2595,7 +2601,7 @@ func TestTransitionCSV(t *testing.T) { []*apiextensionsv1.CustomResourceDefinition{}, v1alpha1.CSVPhaseReplacing, ), defaultTemplateAnnotations), labels.Set{ - resolver.APILabelKeyPrefix + apiHash: "provided", + APILabelKeyPrefix + apiHash: "provided", }), }, clientObjs: []runtime.Object{defaultOperatorGroup}, @@ -2777,7 +2783,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToFailed/InterOperatorGroupOwnerConflict", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.APIConflict)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(APIConflict)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2800,7 +2806,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToNone/AddAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.AddAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(AddAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2823,7 +2829,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToNone/RemoveAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.RemoveAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(RemoveAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2846,7 +2852,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToFailed/StaticOperatorGroup/AddAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.AddAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(AddAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2876,7 +2882,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToFailed/StaticOperatorGroup/RemoveAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.RemoveAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(RemoveAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2906,7 +2912,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVNoneToPending/StaticOperatorGroup/NoAPIConflict", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.NoAPIConflict)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(NoAPIConflict)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csv("csv1", @@ -2936,7 +2942,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVFailedToPending/InterOperatorGroupOwnerConflict/NoAPIConflict", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.NoAPIConflict)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(NoAPIConflict)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csvWithStatusReason(csv("csv1", @@ -2959,7 +2965,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVFailedToPending/StaticOperatorGroup/CannotModifyStaticOperatorGroupProvidedAPIs/NoAPIConflict", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.NoAPIConflict)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(NoAPIConflict)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csvWithStatusReason(csv("csv1", @@ -2989,7 +2995,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVFailedToFailed/InterOperatorGroupOwnerConflict/APIConflict", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.APIConflict)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(APIConflict)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csvWithStatusReason(csv("csv1", @@ -3012,7 +3018,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVFailedToFailed/StaticOperatorGroup/CannotModifyStaticOperatorGroupProvidedAPIs/AddAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.AddAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(AddAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csvWithStatusReason(csv("csv1", @@ -3042,7 +3048,7 @@ func TestTransitionCSV(t *testing.T) { }, { name: "SingleCSVFailedToFailed/StaticOperatorGroup/CannotModifyStaticOperatorGroupProvidedAPIs/RemoveAPIs", - config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(resolver.RemoveAPIs)}, + config: operatorConfig{apiReconciler: buildFakeAPIIntersectionReconcilerThatReturns(RemoveAPIs)}, initial: initial{ csvs: []runtime.Object{ csvWithAnnotations(csvWithStatusReason(csv("csv1", @@ -3692,7 +3698,7 @@ func TestSyncOperatorGroups(t *testing.T) { []*apiextensionsv1.CustomResourceDefinition{crd}, []*apiextensionsv1.CustomResourceDefinition{}, v1alpha1.CSVPhaseNone, - ), labels.Set{resolver.APILabelKeyPrefix + "9f4c46c37bdff8d0": "provided"}) + ), labels.Set{APILabelKeyPrefix + "9f4c46c37bdff8d0": "provided"}) operatorCSV.Spec.InstallStrategy.StrategySpec.DeploymentSpecs[0].Spec.Template.Spec.Containers[0].Env = []corev1.EnvVar{{ Name: "OPERATOR_CONDITION_NAME", diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index 8c28ef0d1e..8a2871a312 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -21,7 +21,6 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" @@ -186,7 +185,7 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error { // Requeue all CSVs that provide the same APIs (including those removed). This notifies conflicting CSVs in // intersecting groups that their conflict has possibly been resolved, either through resizing or through // deletion of the conflicting CSV. - groupSurface := resolver.NewOperatorGroup(op) + groupSurface := NewOperatorGroup(op) groupProvidedAPIs := groupSurface.ProvidedAPIs() providedAPIsForCSVs := a.providedAPIsFromCSVs(op, logger) providedAPIsForGroup := make(cache.APISet) @@ -255,7 +254,7 @@ func (a *Operator) operatorGroupDeleted(obj interface{}) { func (a *Operator) annotateCSVs(group *v1.OperatorGroup, targetNamespaces []string, logger *logrus.Entry) error { updateErrs := []error{} - targetNamespaceSet := resolver.NewNamespaceSet(targetNamespaces) + targetNamespaceSet := NewNamespaceSet(targetNamespaces) for _, csv := range a.csvSet(group.GetNamespace(), v1alpha1.CSVPhaseAny) { if csv.IsCopied() { @@ -264,7 +263,7 @@ func (a *Operator) annotateCSVs(group *v1.OperatorGroup, targetNamespaces []stri logger := logger.WithField("csv", csv.GetName()) originalNamespacesAnnotation, _ := a.copyOperatorGroupAnnotations(&csv.ObjectMeta)[v1.OperatorGroupTargetsAnnotationKey] - originalNamespaceSet := resolver.NewNamespaceSetFromString(originalNamespacesAnnotation) + originalNamespaceSet := NewNamespaceSetFromString(originalNamespacesAnnotation) if a.operatorGroupAnnotationsDiffer(&csv.ObjectMeta, group) { a.setOperatorGroupAnnotations(&csv.ObjectMeta, group, true) @@ -689,7 +688,7 @@ func (a *Operator) ensureTenantRBAC(operatorNamespace, targetNamespace string, c return nil } -func (a *Operator) ensureCSVsInNamespaces(csv *v1alpha1.ClusterServiceVersion, operatorGroup *v1.OperatorGroup, targets resolver.NamespaceSet) error { +func (a *Operator) ensureCSVsInNamespaces(csv *v1alpha1.ClusterServiceVersion, operatorGroup *v1.OperatorGroup, targets NamespaceSet) error { namespaces, err := a.lister.CoreV1().NamespaceLister().List(labels.Everything()) if err != nil { return err diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 7b85124133..1df76b270d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -137,21 +137,21 @@ func (s APISet) StripPlural() APISet { return set } -type APIOwnerSet map[opregistry.APIKey]OperatorSurface +type APIOwnerSet map[opregistry.APIKey]*Operator func EmptyAPIOwnerSet() APIOwnerSet { - return map[opregistry.APIKey]OperatorSurface{} + return map[opregistry.APIKey]*Operator{} } -type OperatorSet map[string]OperatorSurface +type OperatorSet map[string]*Operator func EmptyOperatorSet() OperatorSet { - return map[string]OperatorSurface{} + return map[string]*Operator{} } // Snapshot returns a new set, pointing to the same values func (o OperatorSet) Snapshot() OperatorSet { - out := make(map[string]OperatorSurface) + out := make(map[string]*Operator) for key, val := range o { out[key] = val } @@ -206,34 +206,19 @@ func (i *OperatorSourceInfo) String() string { var NoCatalog = registry.CatalogKey{Name: "", Namespace: ""} var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: "", Catalog: NoCatalog, DefaultChannel: false} -// OperatorSurface describes the API surfaces provided and required by an Operator. -type OperatorSurface interface { - GetProvidedAPIs() APISet - GetRequiredAPIs() APISet - Identifier() string - GetReplaces() string - GetVersion() *semver.Version - GetSourceInfo() *OperatorSourceInfo - GetBundle() *api.Bundle - Inline() bool - GetProperties() []*api.Property - GetSkips() []string -} - type Operator struct { Name string Replaces string + Skips []string + SkipRange semver.Range ProvidedAPIs APISet RequiredAPIs APISet Version *semver.Version Bundle *api.Bundle SourceInfo *OperatorSourceInfo Properties []*api.Property - Skips []string } -var _ OperatorSurface = &Operator{} - func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey registry.CatalogKey, defaultChannel string) (*Operator, error) { parsedVersion, err := semver.ParseTolerant(bundle.Version) version := &parsedVersion @@ -290,6 +275,10 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg Skips: bundle.Skips, } + if r, err := semver.ParseRange(o.Bundle.SkipRange); err == nil { + o.SkipRange = r + } + if !o.Inline() { // TODO: Extract any necessary information from the Bundle // up-front and remove the bundle field altogether. For now, @@ -355,18 +344,6 @@ func (o *Operator) GetRequiredAPIs() APISet { return o.RequiredAPIs } -func (o *Operator) Identifier() string { - return o.Name -} - -func (o *Operator) GetReplaces() string { - return o.Replaces -} - -func (o *Operator) GetSkips() []string { - return o.Skips -} - func (o *Operator) Package() string { if o.Bundle != nil { return o.Bundle.PackageName @@ -381,30 +358,10 @@ func (o *Operator) Channel() string { return "" } -func (o *Operator) GetSourceInfo() *OperatorSourceInfo { - return o.SourceInfo -} - -func (o *Operator) GetBundle() *api.Bundle { - return o.Bundle -} - -func (o *Operator) GetVersion() *semver.Version { - return o.Version -} - -func (o *Operator) SemverRange() (semver.Range, error) { - return semver.ParseRange(o.Bundle.SkipRange) -} - func (o *Operator) Inline() bool { return o.Bundle != nil && o.Bundle.GetBundlePath() == "" } -func (o *Operator) GetProperties() []*api.Property { - return o.Properties -} - func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { predicates = make([]OperatorPredicate, 0) for _, property := range o.Properties { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go index 5e08f8b089..cf46ad80f0 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go @@ -736,30 +736,30 @@ func TestAPIMultiOwnerSet_PopAPIKey(t *testing.T) { { name: "OneApi/OneOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, }, }, }, { name: "OneApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, }, { name: "MultipleApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, - {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, }, @@ -796,42 +796,42 @@ func TestAPIMultiOwnerSet_PopAPIRequirers(t *testing.T) { { name: "OneApi/OneOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, }, }, - want: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, + want: map[string]*Operator{ + "owner1": {Name: "op1"}, }, }, { name: "OneApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, - want: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + want: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, { name: "MultipleApi/MultiOwner", s: map[opregistry.APIKey]OperatorSet{ - {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g", Version: "v", Kind: "k", Plural: "p"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, - {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + {Group: "g2", Version: "v2", Kind: "k2", Plural: "p2"}: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, - want: map[string]OperatorSurface{ - "owner1": &Operator{Name: "op1"}, - "owner2": &Operator{Name: "op2"}, + want: map[string]*Operator{ + "owner1": {Name: "op1"}, + "owner2": {Name: "op2"}, }, }, } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 171ee5ac91..7e8649d5dc 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -195,8 +195,7 @@ func SkipRangeIncludesPredicate(version semver.Version) OperatorPredicate { } func (s skipRangeIncludesPredication) Test(o *Operator) bool { - semverRange, err := o.SemverRange() - return err == nil && semverRange(s.version) + return o.SkipRange != nil && o.SkipRange(s.version) } func (s skipRangeIncludesPredication) String() string { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_interface.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_interface.go deleted file mode 100644 index c86f56572d..0000000000 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes/fake_registry_interface.go +++ /dev/null @@ -1,676 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "context" - "sync" - "time" - - "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" -) - -type FakeInterface struct { - CloseStub func() error - closeMutex sync.RWMutex - closeArgsForCall []struct { - } - closeReturns struct { - result1 error - } - closeReturnsOnCall map[int]struct { - result1 error - } - GetBundleStub func(context.Context, string, string, string) (*api.Bundle, error) - getBundleMutex sync.RWMutex - getBundleArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - } - getBundleReturns struct { - result1 *api.Bundle - result2 error - } - getBundleReturnsOnCall map[int]struct { - result1 *api.Bundle - result2 error - } - GetBundleInPackageChannelStub func(context.Context, string, string) (*api.Bundle, error) - getBundleInPackageChannelMutex sync.RWMutex - getBundleInPackageChannelArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - } - getBundleInPackageChannelReturns struct { - result1 *api.Bundle - result2 error - } - getBundleInPackageChannelReturnsOnCall map[int]struct { - result1 *api.Bundle - result2 error - } - GetBundleThatProvidesStub func(context.Context, string, string, string) (*api.Bundle, error) - getBundleThatProvidesMutex sync.RWMutex - getBundleThatProvidesArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - } - getBundleThatProvidesReturns struct { - result1 *api.Bundle - result2 error - } - getBundleThatProvidesReturnsOnCall map[int]struct { - result1 *api.Bundle - result2 error - } - GetPackageStub func(context.Context, string) (*api.Package, error) - getPackageMutex sync.RWMutex - getPackageArgsForCall []struct { - arg1 context.Context - arg2 string - } - getPackageReturns struct { - result1 *api.Package - result2 error - } - getPackageReturnsOnCall map[int]struct { - result1 *api.Package - result2 error - } - GetReplacementBundleInPackageChannelStub func(context.Context, string, string, string) (*api.Bundle, error) - getReplacementBundleInPackageChannelMutex sync.RWMutex - getReplacementBundleInPackageChannelArgsForCall []struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - } - getReplacementBundleInPackageChannelReturns struct { - result1 *api.Bundle - result2 error - } - getReplacementBundleInPackageChannelReturnsOnCall map[int]struct { - result1 *api.Bundle - result2 error - } - HealthCheckStub func(context.Context, time.Duration) (bool, error) - healthCheckMutex sync.RWMutex - healthCheckArgsForCall []struct { - arg1 context.Context - arg2 time.Duration - } - healthCheckReturns struct { - result1 bool - result2 error - } - healthCheckReturnsOnCall map[int]struct { - result1 bool - result2 error - } - ListBundlesStub func(context.Context) (*client.BundleIterator, error) - listBundlesMutex sync.RWMutex - listBundlesArgsForCall []struct { - arg1 context.Context - } - listBundlesReturns struct { - result1 *client.BundleIterator - result2 error - } - listBundlesReturnsOnCall map[int]struct { - result1 *client.BundleIterator - result2 error - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeInterface) Close() error { - fake.closeMutex.Lock() - ret, specificReturn := fake.closeReturnsOnCall[len(fake.closeArgsForCall)] - fake.closeArgsForCall = append(fake.closeArgsForCall, struct { - }{}) - fake.recordInvocation("Close", []interface{}{}) - fake.closeMutex.Unlock() - if fake.CloseStub != nil { - return fake.CloseStub() - } - if specificReturn { - return ret.result1 - } - fakeReturns := fake.closeReturns - return fakeReturns.result1 -} - -func (fake *FakeInterface) CloseCallCount() int { - fake.closeMutex.RLock() - defer fake.closeMutex.RUnlock() - return len(fake.closeArgsForCall) -} - -func (fake *FakeInterface) CloseCalls(stub func() error) { - fake.closeMutex.Lock() - defer fake.closeMutex.Unlock() - fake.CloseStub = stub -} - -func (fake *FakeInterface) CloseReturns(result1 error) { - fake.closeMutex.Lock() - defer fake.closeMutex.Unlock() - fake.CloseStub = nil - fake.closeReturns = struct { - result1 error - }{result1} -} - -func (fake *FakeInterface) CloseReturnsOnCall(i int, result1 error) { - fake.closeMutex.Lock() - defer fake.closeMutex.Unlock() - fake.CloseStub = nil - if fake.closeReturnsOnCall == nil { - fake.closeReturnsOnCall = make(map[int]struct { - result1 error - }) - } - fake.closeReturnsOnCall[i] = struct { - result1 error - }{result1} -} - -func (fake *FakeInterface) GetBundle(arg1 context.Context, arg2 string, arg3 string, arg4 string) (*api.Bundle, error) { - fake.getBundleMutex.Lock() - ret, specificReturn := fake.getBundleReturnsOnCall[len(fake.getBundleArgsForCall)] - fake.getBundleArgsForCall = append(fake.getBundleArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - fake.recordInvocation("GetBundle", []interface{}{arg1, arg2, arg3, arg4}) - fake.getBundleMutex.Unlock() - if fake.GetBundleStub != nil { - return fake.GetBundleStub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.getBundleReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) GetBundleCallCount() int { - fake.getBundleMutex.RLock() - defer fake.getBundleMutex.RUnlock() - return len(fake.getBundleArgsForCall) -} - -func (fake *FakeInterface) GetBundleCalls(stub func(context.Context, string, string, string) (*api.Bundle, error)) { - fake.getBundleMutex.Lock() - defer fake.getBundleMutex.Unlock() - fake.GetBundleStub = stub -} - -func (fake *FakeInterface) GetBundleArgsForCall(i int) (context.Context, string, string, string) { - fake.getBundleMutex.RLock() - defer fake.getBundleMutex.RUnlock() - argsForCall := fake.getBundleArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *FakeInterface) GetBundleReturns(result1 *api.Bundle, result2 error) { - fake.getBundleMutex.Lock() - defer fake.getBundleMutex.Unlock() - fake.GetBundleStub = nil - fake.getBundleReturns = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetBundleReturnsOnCall(i int, result1 *api.Bundle, result2 error) { - fake.getBundleMutex.Lock() - defer fake.getBundleMutex.Unlock() - fake.GetBundleStub = nil - if fake.getBundleReturnsOnCall == nil { - fake.getBundleReturnsOnCall = make(map[int]struct { - result1 *api.Bundle - result2 error - }) - } - fake.getBundleReturnsOnCall[i] = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetBundleInPackageChannel(arg1 context.Context, arg2 string, arg3 string) (*api.Bundle, error) { - fake.getBundleInPackageChannelMutex.Lock() - ret, specificReturn := fake.getBundleInPackageChannelReturnsOnCall[len(fake.getBundleInPackageChannelArgsForCall)] - fake.getBundleInPackageChannelArgsForCall = append(fake.getBundleInPackageChannelArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - }{arg1, arg2, arg3}) - fake.recordInvocation("GetBundleInPackageChannel", []interface{}{arg1, arg2, arg3}) - fake.getBundleInPackageChannelMutex.Unlock() - if fake.GetBundleInPackageChannelStub != nil { - return fake.GetBundleInPackageChannelStub(arg1, arg2, arg3) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.getBundleInPackageChannelReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) GetBundleInPackageChannelCallCount() int { - fake.getBundleInPackageChannelMutex.RLock() - defer fake.getBundleInPackageChannelMutex.RUnlock() - return len(fake.getBundleInPackageChannelArgsForCall) -} - -func (fake *FakeInterface) GetBundleInPackageChannelCalls(stub func(context.Context, string, string) (*api.Bundle, error)) { - fake.getBundleInPackageChannelMutex.Lock() - defer fake.getBundleInPackageChannelMutex.Unlock() - fake.GetBundleInPackageChannelStub = stub -} - -func (fake *FakeInterface) GetBundleInPackageChannelArgsForCall(i int) (context.Context, string, string) { - fake.getBundleInPackageChannelMutex.RLock() - defer fake.getBundleInPackageChannelMutex.RUnlock() - argsForCall := fake.getBundleInPackageChannelArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *FakeInterface) GetBundleInPackageChannelReturns(result1 *api.Bundle, result2 error) { - fake.getBundleInPackageChannelMutex.Lock() - defer fake.getBundleInPackageChannelMutex.Unlock() - fake.GetBundleInPackageChannelStub = nil - fake.getBundleInPackageChannelReturns = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetBundleInPackageChannelReturnsOnCall(i int, result1 *api.Bundle, result2 error) { - fake.getBundleInPackageChannelMutex.Lock() - defer fake.getBundleInPackageChannelMutex.Unlock() - fake.GetBundleInPackageChannelStub = nil - if fake.getBundleInPackageChannelReturnsOnCall == nil { - fake.getBundleInPackageChannelReturnsOnCall = make(map[int]struct { - result1 *api.Bundle - result2 error - }) - } - fake.getBundleInPackageChannelReturnsOnCall[i] = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetBundleThatProvides(arg1 context.Context, arg2 string, arg3 string, arg4 string) (*api.Bundle, error) { - fake.getBundleThatProvidesMutex.Lock() - ret, specificReturn := fake.getBundleThatProvidesReturnsOnCall[len(fake.getBundleThatProvidesArgsForCall)] - fake.getBundleThatProvidesArgsForCall = append(fake.getBundleThatProvidesArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - fake.recordInvocation("GetBundleThatProvides", []interface{}{arg1, arg2, arg3, arg4}) - fake.getBundleThatProvidesMutex.Unlock() - if fake.GetBundleThatProvidesStub != nil { - return fake.GetBundleThatProvidesStub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.getBundleThatProvidesReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) GetBundleThatProvidesCallCount() int { - fake.getBundleThatProvidesMutex.RLock() - defer fake.getBundleThatProvidesMutex.RUnlock() - return len(fake.getBundleThatProvidesArgsForCall) -} - -func (fake *FakeInterface) GetBundleThatProvidesCalls(stub func(context.Context, string, string, string) (*api.Bundle, error)) { - fake.getBundleThatProvidesMutex.Lock() - defer fake.getBundleThatProvidesMutex.Unlock() - fake.GetBundleThatProvidesStub = stub -} - -func (fake *FakeInterface) GetBundleThatProvidesArgsForCall(i int) (context.Context, string, string, string) { - fake.getBundleThatProvidesMutex.RLock() - defer fake.getBundleThatProvidesMutex.RUnlock() - argsForCall := fake.getBundleThatProvidesArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *FakeInterface) GetBundleThatProvidesReturns(result1 *api.Bundle, result2 error) { - fake.getBundleThatProvidesMutex.Lock() - defer fake.getBundleThatProvidesMutex.Unlock() - fake.GetBundleThatProvidesStub = nil - fake.getBundleThatProvidesReturns = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetBundleThatProvidesReturnsOnCall(i int, result1 *api.Bundle, result2 error) { - fake.getBundleThatProvidesMutex.Lock() - defer fake.getBundleThatProvidesMutex.Unlock() - fake.GetBundleThatProvidesStub = nil - if fake.getBundleThatProvidesReturnsOnCall == nil { - fake.getBundleThatProvidesReturnsOnCall = make(map[int]struct { - result1 *api.Bundle - result2 error - }) - } - fake.getBundleThatProvidesReturnsOnCall[i] = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetPackage(arg1 context.Context, arg2 string) (*api.Package, error) { - fake.getPackageMutex.Lock() - ret, specificReturn := fake.getPackageReturnsOnCall[len(fake.getPackageArgsForCall)] - fake.getPackageArgsForCall = append(fake.getPackageArgsForCall, struct { - arg1 context.Context - arg2 string - }{arg1, arg2}) - fake.recordInvocation("GetPackage", []interface{}{arg1, arg2}) - fake.getPackageMutex.Unlock() - if fake.GetPackageStub != nil { - return fake.GetPackageStub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.getPackageReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) GetPackageCallCount() int { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - return len(fake.getPackageArgsForCall) -} - -func (fake *FakeInterface) GetPackageCalls(stub func(context.Context, string) (*api.Package, error)) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = stub -} - -func (fake *FakeInterface) GetPackageArgsForCall(i int) (context.Context, string) { - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - argsForCall := fake.getPackageArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *FakeInterface) GetPackageReturns(result1 *api.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - fake.getPackageReturns = struct { - result1 *api.Package - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetPackageReturnsOnCall(i int, result1 *api.Package, result2 error) { - fake.getPackageMutex.Lock() - defer fake.getPackageMutex.Unlock() - fake.GetPackageStub = nil - if fake.getPackageReturnsOnCall == nil { - fake.getPackageReturnsOnCall = make(map[int]struct { - result1 *api.Package - result2 error - }) - } - fake.getPackageReturnsOnCall[i] = struct { - result1 *api.Package - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannel(arg1 context.Context, arg2 string, arg3 string, arg4 string) (*api.Bundle, error) { - fake.getReplacementBundleInPackageChannelMutex.Lock() - ret, specificReturn := fake.getReplacementBundleInPackageChannelReturnsOnCall[len(fake.getReplacementBundleInPackageChannelArgsForCall)] - fake.getReplacementBundleInPackageChannelArgsForCall = append(fake.getReplacementBundleInPackageChannelArgsForCall, struct { - arg1 context.Context - arg2 string - arg3 string - arg4 string - }{arg1, arg2, arg3, arg4}) - fake.recordInvocation("GetReplacementBundleInPackageChannel", []interface{}{arg1, arg2, arg3, arg4}) - fake.getReplacementBundleInPackageChannelMutex.Unlock() - if fake.GetReplacementBundleInPackageChannelStub != nil { - return fake.GetReplacementBundleInPackageChannelStub(arg1, arg2, arg3, arg4) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.getReplacementBundleInPackageChannelReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannelCallCount() int { - fake.getReplacementBundleInPackageChannelMutex.RLock() - defer fake.getReplacementBundleInPackageChannelMutex.RUnlock() - return len(fake.getReplacementBundleInPackageChannelArgsForCall) -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannelCalls(stub func(context.Context, string, string, string) (*api.Bundle, error)) { - fake.getReplacementBundleInPackageChannelMutex.Lock() - defer fake.getReplacementBundleInPackageChannelMutex.Unlock() - fake.GetReplacementBundleInPackageChannelStub = stub -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannelArgsForCall(i int) (context.Context, string, string, string) { - fake.getReplacementBundleInPackageChannelMutex.RLock() - defer fake.getReplacementBundleInPackageChannelMutex.RUnlock() - argsForCall := fake.getReplacementBundleInPackageChannelArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3, argsForCall.arg4 -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannelReturns(result1 *api.Bundle, result2 error) { - fake.getReplacementBundleInPackageChannelMutex.Lock() - defer fake.getReplacementBundleInPackageChannelMutex.Unlock() - fake.GetReplacementBundleInPackageChannelStub = nil - fake.getReplacementBundleInPackageChannelReturns = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) GetReplacementBundleInPackageChannelReturnsOnCall(i int, result1 *api.Bundle, result2 error) { - fake.getReplacementBundleInPackageChannelMutex.Lock() - defer fake.getReplacementBundleInPackageChannelMutex.Unlock() - fake.GetReplacementBundleInPackageChannelStub = nil - if fake.getReplacementBundleInPackageChannelReturnsOnCall == nil { - fake.getReplacementBundleInPackageChannelReturnsOnCall = make(map[int]struct { - result1 *api.Bundle - result2 error - }) - } - fake.getReplacementBundleInPackageChannelReturnsOnCall[i] = struct { - result1 *api.Bundle - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) HealthCheck(arg1 context.Context, arg2 time.Duration) (bool, error) { - fake.healthCheckMutex.Lock() - ret, specificReturn := fake.healthCheckReturnsOnCall[len(fake.healthCheckArgsForCall)] - fake.healthCheckArgsForCall = append(fake.healthCheckArgsForCall, struct { - arg1 context.Context - arg2 time.Duration - }{arg1, arg2}) - fake.recordInvocation("HealthCheck", []interface{}{arg1, arg2}) - fake.healthCheckMutex.Unlock() - if fake.HealthCheckStub != nil { - return fake.HealthCheckStub(arg1, arg2) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.healthCheckReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) HealthCheckCallCount() int { - fake.healthCheckMutex.RLock() - defer fake.healthCheckMutex.RUnlock() - return len(fake.healthCheckArgsForCall) -} - -func (fake *FakeInterface) HealthCheckCalls(stub func(context.Context, time.Duration) (bool, error)) { - fake.healthCheckMutex.Lock() - defer fake.healthCheckMutex.Unlock() - fake.HealthCheckStub = stub -} - -func (fake *FakeInterface) HealthCheckArgsForCall(i int) (context.Context, time.Duration) { - fake.healthCheckMutex.RLock() - defer fake.healthCheckMutex.RUnlock() - argsForCall := fake.healthCheckArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 -} - -func (fake *FakeInterface) HealthCheckReturns(result1 bool, result2 error) { - fake.healthCheckMutex.Lock() - defer fake.healthCheckMutex.Unlock() - fake.HealthCheckStub = nil - fake.healthCheckReturns = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) HealthCheckReturnsOnCall(i int, result1 bool, result2 error) { - fake.healthCheckMutex.Lock() - defer fake.healthCheckMutex.Unlock() - fake.HealthCheckStub = nil - if fake.healthCheckReturnsOnCall == nil { - fake.healthCheckReturnsOnCall = make(map[int]struct { - result1 bool - result2 error - }) - } - fake.healthCheckReturnsOnCall[i] = struct { - result1 bool - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) ListBundles(arg1 context.Context) (*client.BundleIterator, error) { - fake.listBundlesMutex.Lock() - ret, specificReturn := fake.listBundlesReturnsOnCall[len(fake.listBundlesArgsForCall)] - fake.listBundlesArgsForCall = append(fake.listBundlesArgsForCall, struct { - arg1 context.Context - }{arg1}) - fake.recordInvocation("ListBundles", []interface{}{arg1}) - fake.listBundlesMutex.Unlock() - if fake.ListBundlesStub != nil { - return fake.ListBundlesStub(arg1) - } - if specificReturn { - return ret.result1, ret.result2 - } - fakeReturns := fake.listBundlesReturns - return fakeReturns.result1, fakeReturns.result2 -} - -func (fake *FakeInterface) ListBundlesCallCount() int { - fake.listBundlesMutex.RLock() - defer fake.listBundlesMutex.RUnlock() - return len(fake.listBundlesArgsForCall) -} - -func (fake *FakeInterface) ListBundlesCalls(stub func(context.Context) (*client.BundleIterator, error)) { - fake.listBundlesMutex.Lock() - defer fake.listBundlesMutex.Unlock() - fake.ListBundlesStub = stub -} - -func (fake *FakeInterface) ListBundlesArgsForCall(i int) context.Context { - fake.listBundlesMutex.RLock() - defer fake.listBundlesMutex.RUnlock() - argsForCall := fake.listBundlesArgsForCall[i] - return argsForCall.arg1 -} - -func (fake *FakeInterface) ListBundlesReturns(result1 *client.BundleIterator, result2 error) { - fake.listBundlesMutex.Lock() - defer fake.listBundlesMutex.Unlock() - fake.ListBundlesStub = nil - fake.listBundlesReturns = struct { - result1 *client.BundleIterator - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) ListBundlesReturnsOnCall(i int, result1 *client.BundleIterator, result2 error) { - fake.listBundlesMutex.Lock() - defer fake.listBundlesMutex.Unlock() - fake.ListBundlesStub = nil - if fake.listBundlesReturnsOnCall == nil { - fake.listBundlesReturnsOnCall = make(map[int]struct { - result1 *client.BundleIterator - result2 error - }) - } - fake.listBundlesReturnsOnCall[i] = struct { - result1 *client.BundleIterator - result2 error - }{result1, result2} -} - -func (fake *FakeInterface) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.closeMutex.RLock() - defer fake.closeMutex.RUnlock() - fake.getBundleMutex.RLock() - defer fake.getBundleMutex.RUnlock() - fake.getBundleInPackageChannelMutex.RLock() - defer fake.getBundleInPackageChannelMutex.RUnlock() - fake.getBundleThatProvidesMutex.RLock() - defer fake.getBundleThatProvidesMutex.RUnlock() - fake.getPackageMutex.RLock() - defer fake.getPackageMutex.RUnlock() - fake.getReplacementBundleInPackageChannelMutex.RLock() - defer fake.getReplacementBundleInPackageChannelMutex.RUnlock() - fake.healthCheckMutex.RLock() - defer fake.healthCheckMutex.RUnlock() - fake.listBundlesMutex.RLock() - defer fake.listBundlesMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeInterface) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ client.Interface = new(FakeInterface) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index 94302d53ee..ba9cd602bf 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -60,7 +60,7 @@ func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, err if o.SourceInfo == nil { return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Name) } - id := bundleId(o.Identifier(), o.Channel(), o.SourceInfo.Catalog) + id := bundleId(o.Name, o.Channel(), o.SourceInfo.Catalog) var constraints []solver.Constraint if o.SourceInfo.Catalog.Virtual() && o.SourceInfo.Subscription == nil { // CSVs already associated with a Subscription @@ -68,7 +68,7 @@ func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, err // appear in any solution. constraints = append(constraints, PrettyConstraint( solver.Mandatory(), - fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Identifier()), + fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Name), )) } for _, p := range o.Properties { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go index 823ceb3979..d8af9350cd 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go @@ -24,9 +24,9 @@ func NewInstrumentedResolver(resolver StepResolver, successMetricsEmitter, failu } } -func (ir *InstrumentedResolver) ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (ir *InstrumentedResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { start := time.Now() - steps, lookups, subs, err := ir.resolver.ResolveSteps(namespace, sourceQuerier) + steps, lookups, subs, err := ir.resolver.ResolveSteps(namespace) if err != nil { ir.failureMetricsEmitter(time.Now().Sub(start)) } else { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go index dac60b533a..4b4c57fcf0 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go @@ -2,10 +2,11 @@ package resolver import ( "errors" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "testing" "time" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/stretchr/testify/require" ) @@ -19,14 +20,14 @@ const ( type fakeResolverWithError struct{} type fakeResolverWithoutError struct{} -func (r *fakeResolverWithError) ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (r *fakeResolverWithError) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { return nil, nil, nil, errors.New("Fake error") } func (r *fakeResolverWithError) Expire(key registry.CatalogKey) { } -func (r *fakeResolverWithoutError) ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (r *fakeResolverWithoutError) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { return nil, nil, nil, nil } @@ -53,7 +54,7 @@ func TestInstrumentedResolverFailure(t *testing.T) { } instrumentedResolver := NewInstrumentedResolver(newFakeResolverWithError(), changeToSuccess, changeToFailure) - instrumentedResolver.ResolveSteps("", nil) + instrumentedResolver.ResolveSteps("") require.Equal(t, len(result), 1) // check that only one call was made to a change function require.Equal(t, result[0], failure) // check that the call was made to changeToFailure function } @@ -70,7 +71,7 @@ func TestInstrumentedResolverSuccess(t *testing.T) { } instrumentedResolver := NewInstrumentedResolver(newFakeResolverWithoutError(), changeToSuccess, changeToFailure) - instrumentedResolver.ResolveSteps("", nil) + instrumentedResolver.ResolveSteps("") require.Equal(t, len(result), 1) // check that only one call was made to a change function require.Equal(t, result[0], success) // check that the call was made to changeToSuccess function } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go deleted file mode 100644 index 7acbc8a8a3..0000000000 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go +++ /dev/null @@ -1,197 +0,0 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_client.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/api.RegistryClient -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/client/client.go Interface -package resolver - -import ( - "context" - "fmt" - - "github.com/blang/semver/v4" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/errors" - - "github.com/operator-framework/operator-registry/pkg/api" - registryapi "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" - - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" -) - -const SkipPackageAnnotationKey = "olm.skipRange" - -type SourceRef struct { - Address string - Client client.Interface - LastConnect metav1.Time - LastHealthy metav1.Time -} - -type SourceQuerier interface { - FindProvider(api opregistry.APIKey, initialSource registry.CatalogKey, excludedPackages map[string]struct{}) (*api.Bundle, *registry.CatalogKey, error) - FindBundle(pkgName, channelName, bundleName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - FindLatestBundle(pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - Queryable() error -} - -type NamespaceSourceQuerier struct { - sources map[registry.CatalogKey]registry.ClientInterface -} - -var _ SourceQuerier = &NamespaceSourceQuerier{} - -func NewNamespaceSourceQuerier(sources map[registry.CatalogKey]registry.ClientInterface) *NamespaceSourceQuerier { - return &NamespaceSourceQuerier{ - sources: sources, - } -} - -func (q *NamespaceSourceQuerier) Queryable() error { - if len(q.sources) == 0 { - return fmt.Errorf("no catalog sources available") - } - return nil -} - -func (q *NamespaceSourceQuerier) FindProvider(api opregistry.APIKey, initialSource registry.CatalogKey, excludedPackages map[string]struct{}) (*registryapi.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if ok { - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &initialSource, nil - } - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Plural+"."+api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &initialSource, nil - } - } - } - for key, source := range q.sources { - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &key, nil - } - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Plural+"."+api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s not provided by a package in any CatalogSource", api) -} - -func (q *NamespaceSourceQuerier) FindBundle(pkgName, channelName, bundleName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource) - } - - bundle, err := source.GetBundle(context.TODO(), pkgName, channelName, bundleName) - if err != nil { - return nil, nil, err - } - return bundle, &initialSource, nil - } - - for key, source := range q.sources { - bundle, err := source.GetBundle(context.TODO(), pkgName, channelName, bundleName) - if err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s/%s/%s not found in any available CatalogSource", pkgName, channelName, bundleName) -} - -func (q *NamespaceSourceQuerier) FindLatestBundle(pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource) - } - - bundle, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err != nil { - return nil, nil, err - } - return bundle, &initialSource, nil - } - - for key, source := range q.sources { - bundle, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s/%s not found in any available CatalogSource", pkgName, channelName) -} - -func (q *NamespaceSourceQuerier) FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - errs := []error{} - - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource.Name) - } - - bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - return nil, nil, errors.NewAggregate(errs) - } - - for key, source := range q.sources { - bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) - if bundle != nil { - return bundle, &key, nil - } - if err != nil { - errs = append(errs, err) - } - } - return nil, nil, errors.NewAggregate(errs) -} - -func (q *NamespaceSourceQuerier) findChannelHead(currentVersion *semver.Version, pkgName, channelName string, source client.Interface) (*api.Bundle, error) { - if currentVersion == nil { - return nil, nil - } - - latest, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err != nil { - return nil, err - } - - if latest.SkipRange == "" { - return nil, nil - } - - r, err := semver.ParseRange(latest.SkipRange) - if err != nil { - return nil, err - } - - if r(*currentVersion) { - return latest, nil - } - return nil, nil -} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index a8eeaf51bf..06d9c10c71 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -51,7 +51,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust var errs []error installables := make(map[solver.Identifier]solver.Installable, 0) - visited := make(map[cache.OperatorSurface]*BundleInstallable, 0) + visited := make(map[*cache.Operator]*BundleInstallable, 0) // TODO: better abstraction startingCSVs := make(map[string]struct{}) @@ -141,7 +141,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust } } - operators := make(map[string]cache.OperatorSurface, 0) + operators := make(map[string]*cache.Operator, 0) for _, installableOperator := range operatorInstallables { csvName, channel, catalog, err := installableOperator.BundleSourceInfo() if err != nil { @@ -173,7 +173,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust return operators, nil } -func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { +func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) @@ -189,7 +189,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu csvPredicate := cache.True() if current != nil { // if we found an existing installed operator, we should filter the channel by operators that can replace it - channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Identifier()))) + channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Name))) } else if sub.Spec.StartingCSV != "" { // if no operator is installed and we have a startingCSV, filter for it csvPredicate = cache.CSVNamePredicate(sub.Spec.StartingCSV) @@ -257,7 +257,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu candidates := make([]*BundleInstallable, 0) for _, o := range cache.Filter(sortedBundles, channelPredicates...) { - predicates := append(cachePredicates, cache.CSVNamePredicate(o.Identifier())) + predicates := append(cachePredicates, cache.CSVNamePredicate(o.Name)) stack := namespacedCache.Catalog(catalog).Find(predicates...) id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) if err != nil { @@ -279,7 +279,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu for _, c := range candidates { // track which operator this is replacing, so that it can be realized when creating the resources on cluster if current != nil { - c.Replaces = current.Identifier() + c.Replaces = current.Name // Package name can't be reliably inferred // from a CSV without a projected package // property, so for the replacement case, a @@ -288,12 +288,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // safe to remove this conflict if properties // annotations are made mandatory for // resolution. - c.AddConflict(bundleId(current.Identifier(), current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + c.AddConflict(bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) } depIds = append(depIds, c.Identifier()) } if current != nil { - depIds = append(depIds, bundleId(current.Identifier(), current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + depIds = append(depIds, bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) } // all candidates added as options for this constraint @@ -303,7 +303,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies @@ -359,7 +359,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS if si.Catalog.Virtual() { sourcePredicate = cache.Or(sourcePredicate, cache.And( - cache.CSVNamePredicate(b.Identifier()), + cache.CSVNamePredicate(b.Name), cache.CatalogPredicate(si.Catalog), )) } else { @@ -653,7 +653,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { skipped := map[string]*cache.Operator{} for _, b := range bundles { - bundleLookup[b.Identifier()] = b + bundleLookup[b.Name] = b } for _, b := range bundles { @@ -690,7 +690,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { current := head for { visited[current] = struct{}{} - if _, ok := skipped[current.Identifier()]; !ok { + if _, ok := skipped[current.Name]; !ok { chain = append(chain, current) } next, ok := replaces[current] @@ -698,7 +698,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { break } if _, ok := visited[next]; ok { - return nil, fmt.Errorf("a cycle exists in the chain of replacement beginning with %q in channel %q of package %q", head.Identifier(), channelName, packageName) + return nil, fmt.Errorf("a cycle exists in the chain of replacement beginning with %q in channel %q of package %q", head.Name, channelName, packageName) } current = next } @@ -712,9 +712,9 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { case 0: schains[i] = "[]" // Bug? case 1: - schains[i] = chain[0].Identifier() + schains[i] = chain[0].Name default: - schains[i] = fmt.Sprintf("%s...%s", chain[0].Identifier(), chain[len(chain)-1].Identifier()) + schains[i] = fmt.Sprintf("%s...%s", chain[0].Name, chain[len(chain)-1].Name) } } return nil, fmt.Errorf("a unique replacement chain within a channel is required to determine the relative order between channel entries, but %d replacement chains were found in channel %q of package %q: %s", len(schains), channelName, packageName, strings.Join(schains, ", ")) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go index fc9b3eb336..a686cbdcf1 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go @@ -208,7 +208,7 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { assert.NoError(t, err) assert.Equal(t, 2, len(operators)) for _, op := range operators { - assert.Equal(t, "1.0.1", op.GetVersion().String()) + assert.Equal(t, "1.0.1", op.Version.String()) } expected := cache.OperatorSet{ @@ -286,7 +286,7 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { } for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -362,7 +362,7 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { } for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -565,7 +565,7 @@ func TestSolveOperators_WithDependencies(t *testing.T) { } for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -618,7 +618,7 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { assert.Equal(t, len(expected), len(operators)) for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -679,7 +679,7 @@ func TestSolveOperators_WithLabelDependencies(t *testing.T) { } for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -801,12 +801,12 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { } got := []string{} for _, o := range operators { - got = append(got, o.Identifier()) + got = append(got, o.Name) } for k := range expected { assert.NotNil(t, operators[k], "did not find expected operator %s in results. have: %s", k, got) if _, ok := operators[k]; ok { - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } } @@ -877,7 +877,7 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { assert.Equal(t, len(expected), len(operators)) for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -1095,7 +1095,7 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. assert.Equal(t, len(expected), len(operators)) for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } } @@ -1189,7 +1189,7 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { } for k := range expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } assert.Equal(t, 3, len(operators)) } @@ -1276,11 +1276,11 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { csvs := make([]*v1alpha1.ClusterServiceVersion, 0) for _, o := range operators { var pkg, channel string - if b := o.GetBundle(); b != nil { + if b := o.Bundle; b != nil { pkg = b.PackageName channel = b.ChannelName } - csvs = append(csvs, existingOperator(namespace, o.Identifier(), pkg, channel, o.GetReplaces(), o.GetProvidedAPIs(), o.GetRequiredAPIs(), nil, nil)) + csvs = append(csvs, existingOperator(namespace, o.Name, pkg, channel, o.Replaces, o.ProvidedAPIs, o.RequiredAPIs, nil, nil)) } var err error @@ -1288,7 +1288,7 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { assert.NoError(t, err) for k := range p.expected { require.NotNil(t, operators[k]) - assert.EqualValues(t, k, operators[k].Identifier()) + assert.EqualValues(t, k, operators[k].Name) } assert.Equal(t, len(p.expected), len(operators)) }) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 9fb369ca32..a696dfd657 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -1,4 +1,3 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/client/client.go Interface //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../../fakes/fake_resolver.go . StepResolver package resolver @@ -31,7 +30,7 @@ const ( var timeNow = func() metav1.Time { return metav1.NewTime(time.Now().UTC()) } type StepResolver interface { - ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) + ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) Expire(key registry.CatalogKey) } @@ -66,7 +65,7 @@ func (r *OperatorStepResolver) Expire(key registry.CatalogKey) { r.satResolver.cache.Expire(key) } -func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { // create a generation - a representation of the current set of installed operators and their provided/required apis allCSVs, err := r.csvLister.ClusterServiceVersions(namespace).List(labels.Everything()) if err != nil { @@ -102,7 +101,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( for name, op := range operators { // Find any existing subscriptions that resolve to this operator. existingSubscriptions := make(map[*v1alpha1.Subscription]bool) - sourceInfo := *op.GetSourceInfo() + sourceInfo := *op.SourceInfo for _, sub := range subs { if sub.Spec.Package != sourceInfo.Package { continue @@ -127,7 +126,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) > 0 { upToDate := true for sub, exists := range existingSubscriptions { - if !exists || sub.Status.CurrentCSV != op.Identifier() { + if !exists || sub.Status.CurrentCSV != op.Name { upToDate = false } } @@ -138,21 +137,21 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( } // add steps for any new bundle - if op.GetBundle() != nil { + if op.Bundle != nil { if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.GetBundle(), namespace, op.GetReplaces(), op.GetSourceInfo().Catalog.Name, op.GetSourceInfo().Catalog.Namespace) + bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) if err != nil { return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) } steps = append(steps, bundleSteps...) } else { lookup := v1alpha1.BundleLookup{ - Path: op.GetBundle().GetBundlePath(), - Identifier: op.Identifier(), - Replaces: op.GetReplaces(), + Path: op.Bundle.GetBundlePath(), + Identifier: op.Name, + Replaces: op.Replaces, CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.GetSourceInfo().Catalog.Namespace, - Name: op.GetSourceInfo().Catalog.Name, + Namespace: op.SourceInfo.Catalog.Namespace, + Name: op.SourceInfo.Catalog.Name, }, Conditions: []v1alpha1.BundleLookupCondition{ { @@ -169,8 +168,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( }, }, } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.GetProperties()); err != nil { - return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Identifier(), err) + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { + return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) } else { lookup.Properties = anno } @@ -179,8 +178,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) == 0 { // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.GetSourceInfo().StartingCSV = op.Identifier() - subStep, err := NewSubscriptionStepResource(namespace, *op.GetSourceInfo()) + op.SourceInfo.StartingCSV = op.Name + subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) if err != nil { return nil, nil, nil, err } @@ -194,11 +193,11 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( // add steps for subscriptions for bundles that were added through resolution for sub := range existingSubscriptions { - if sub.Status.CurrentCSV == op.Identifier() { + if sub.Status.CurrentCSV == op.Name { continue } // update existing subscription status - sub.Status.CurrentCSV = op.Identifier() + sub.Status.CurrentCSV = op.Name updatedSubs = append(updatedSubs, sub) } } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go index 27225f556b..eeed54fee1 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go @@ -62,7 +62,6 @@ func TestResolver(t *testing.T) { type resolverTest struct { name string clusterState []runtime.Object - querier SourceQuerier bundlesByCatalog map[registry.CatalogKey][]*api.Bundle out resolverTestOut } @@ -852,7 +851,7 @@ func TestResolver(t *testing.T) { resolver := NewOperatorStepResolver(lister, clientFake, kClientFake, "", nil, log) resolver.satResolver = satresolver - steps, lookups, subs, err := resolver.ResolveSteps(namespace, nil) + steps, lookups, subs, err := resolver.ResolveSteps(namespace) if tt.out.solverError == nil { if tt.out.errAssert == nil { assert.NoError(t, err) @@ -999,8 +998,7 @@ func TestNamespaceResolverRBAC(t *testing.T) { } resolver := NewOperatorStepResolver(lister, clientFake, kClientFake, "", nil, logrus.New()) resolver.satResolver = satresolver - querier := NewFakeSourceQuerier(map[registry.CatalogKey][]*api.Bundle{catalog: tt.bundlesInCatalog}) - steps, _, subs, err := resolver.ResolveSteps(namespace, querier) + steps, _, subs, err := resolver.ResolveSteps(namespace) require.Equal(t, tt.out.err, err) RequireStepsEqual(t, expectedSteps, steps) require.ElementsMatch(t, tt.out.subs, subs) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go index 533013a38d..6586277b5b 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go @@ -1,10 +1,7 @@ package resolver import ( - "context" "encoding/json" - "fmt" - "strings" "testing" "github.com/operator-framework/operator-registry/pkg/api" @@ -18,9 +15,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/fakes" ) // RequireStepsEqual is similar to require.ElementsMatch, but produces better error messages @@ -305,132 +300,3 @@ func withReplaces(operator *cache.Operator, replaces string) *cache.Operator { operator.Replaces = replaces return operator } - -// NewFakeSourceQuerier builds a querier that talks to fake registry stubs for testing -func NewFakeSourceQuerier(bundlesByCatalog map[registry.CatalogKey][]*api.Bundle) *NamespaceSourceQuerier { - sources := map[registry.CatalogKey]registry.ClientInterface{} - for catKey, bundles := range bundlesByCatalog { - source := &fakes.FakeClientInterface{} - source.GetBundleThatProvidesStub = func(ctx context.Context, groupOrName, version, kind string) (*api.Bundle, error) { - for _, b := range bundles { - apis := b.GetProvidedApis() - for _, api := range apis { - if api.Version == version && api.Kind == kind && strings.Contains(groupOrName, api.Group) && strings.Contains(groupOrName, api.Plural) { - return b, nil - } - } - } - return nil, fmt.Errorf("no bundle found") - } - // note: this only allows for one bundle per package/channel, which may be enough for tests - source.GetBundleInPackageChannelStub = func(ctx context.Context, packageName, channelName string) (*api.Bundle, error) { - for _, b := range bundles { - if b.ChannelName == channelName && b.PackageName == packageName { - return b, nil - } - } - return nil, fmt.Errorf("no bundle found") - } - - source.GetBundleStub = func(ctx context.Context, packageName, channelName, csvName string) (*api.Bundle, error) { - for _, b := range bundles { - if b.ChannelName == channelName && b.PackageName == packageName && b.CsvName == csvName { - return b, nil - } - } - return nil, fmt.Errorf("no bundle found") - } - - source.GetReplacementBundleInPackageChannelStub = func(ctx context.Context, bundleName, packageName, channelName string) (*api.Bundle, error) { - for _, b := range bundles { - if b.Replaces == bundleName && b.ChannelName == channelName && b.PackageName == packageName { - return b, nil - } - } - - return nil, fmt.Errorf("no bundle found") - } - - source.FindBundleThatProvidesStub = func(ctx context.Context, groupOrName, version, kind string, excludedPkgs map[string]struct{}) (*api.Bundle, error) { - bundles, ok := bundlesByCatalog[catKey] - if !ok { - return nil, fmt.Errorf("API (%s/%s/%s) not provided by a package in %s CatalogSource", groupOrName, version, kind, catKey) - } - sortedBundles := SortBundleInPackageChannel(bundles) - for k, v := range sortedBundles { - pkgname := getPkgName(k) - if _, ok := excludedPkgs[pkgname]; ok { - continue - } - - for i := len(v) - 1; i >= 0; i-- { - b := v[i] - apis := b.GetProvidedApis() - for _, api := range apis { - if api.Version == version && api.Kind == kind && strings.Contains(groupOrName, api.Group) && strings.Contains(groupOrName, api.Plural) { - return b, nil - } - } - } - } - return nil, fmt.Errorf("no bundle found") - } - - sources[catKey] = source - } - return NewNamespaceSourceQuerier(sources) -} - -// SortBundleInPackageChannel will sort into map of package-channel key and list -// sorted (oldest to latest version) of bundles as value -func SortBundleInPackageChannel(bundles []*api.Bundle) map[string][]*api.Bundle { - sorted := map[string][]*api.Bundle{} - var initialReplaces string - for _, v := range bundles { - pkgChanKey := v.PackageName + "/" + v.ChannelName - sorted[pkgChanKey] = append(sorted[pkgChanKey], v) - } - - for k, v := range sorted { - resorted := []*api.Bundle{} - bundleMap := map[string]*api.Bundle{} - // Find the first (oldest) bundle in upgrade graph - for _, bundle := range v { - csv, err := V1alpha1CSVFromBundle(bundle) - if err != nil { - initialReplaces = bundle.CsvName - resorted = append(resorted, bundle) - continue - } - - if replaces := csv.Spec.Replaces; replaces == "" { - initialReplaces = bundle.CsvName - resorted = append(resorted, bundle) - } else { - bundleMap[replaces] = bundle - } - } - resorted = sortBundleInChannel(initialReplaces, bundleMap, resorted) - sorted[k] = resorted - } - return sorted -} - -// sortBundleInChannel recursively sorts a list of bundles to form a update graph -// of a specific channel. The first item in the returned list is the start -// (oldest version) of the upgrade graph and the last item is the head -// (latest version) of a channel -func sortBundleInChannel(replaces string, replacedBundle map[string]*api.Bundle, updated []*api.Bundle) []*api.Bundle { - bundle, ok := replacedBundle[replaces] - if ok { - updated = append(updated, bundle) - return sortBundleInChannel(bundle.CsvName, replacedBundle, updated) - } - return updated -} - -// getPkgName splits the package/channel string and return package name -func getPkgName(pkgChan string) string { - s := strings.Split(pkgChan, "/") - return s[0] -} diff --git a/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go b/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go deleted file mode 100644 index 1cfbf3d137..0000000000 --- a/staging/operator-lifecycle-manager/pkg/fakes/fake_api_intersection_reconciler.go +++ /dev/null @@ -1,115 +0,0 @@ -// Code generated by counterfeiter. DO NOT EDIT. -package fakes - -import ( - "sync" - - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" -) - -type FakeAPIIntersectionReconciler struct { - ReconcileStub func(cache.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult - reconcileMutex sync.RWMutex - reconcileArgsForCall []struct { - arg1 cache.APISet - arg2 resolver.OperatorGroupSurface - arg3 []resolver.OperatorGroupSurface - } - reconcileReturns struct { - result1 resolver.APIReconciliationResult - } - reconcileReturnsOnCall map[int]struct { - result1 resolver.APIReconciliationResult - } - invocations map[string][][]interface{} - invocationsMutex sync.RWMutex -} - -func (fake *FakeAPIIntersectionReconciler) Reconcile(arg1 cache.APISet, arg2 resolver.OperatorGroupSurface, arg3 ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult { - fake.reconcileMutex.Lock() - ret, specificReturn := fake.reconcileReturnsOnCall[len(fake.reconcileArgsForCall)] - fake.reconcileArgsForCall = append(fake.reconcileArgsForCall, struct { - arg1 cache.APISet - arg2 resolver.OperatorGroupSurface - arg3 []resolver.OperatorGroupSurface - }{arg1, arg2, arg3}) - fake.recordInvocation("Reconcile", []interface{}{arg1, arg2, arg3}) - fake.reconcileMutex.Unlock() - if fake.ReconcileStub != nil { - return fake.ReconcileStub(arg1, arg2, arg3...) - } - if specificReturn { - return ret.result1 - } - fakeReturns := fake.reconcileReturns - return fakeReturns.result1 -} - -func (fake *FakeAPIIntersectionReconciler) ReconcileCallCount() int { - fake.reconcileMutex.RLock() - defer fake.reconcileMutex.RUnlock() - return len(fake.reconcileArgsForCall) -} - -func (fake *FakeAPIIntersectionReconciler) ReconcileCalls(stub func(cache.APISet, resolver.OperatorGroupSurface, ...resolver.OperatorGroupSurface) resolver.APIReconciliationResult) { - fake.reconcileMutex.Lock() - defer fake.reconcileMutex.Unlock() - fake.ReconcileStub = stub -} - -func (fake *FakeAPIIntersectionReconciler) ReconcileArgsForCall(i int) (cache.APISet, resolver.OperatorGroupSurface, []resolver.OperatorGroupSurface) { - fake.reconcileMutex.RLock() - defer fake.reconcileMutex.RUnlock() - argsForCall := fake.reconcileArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2, argsForCall.arg3 -} - -func (fake *FakeAPIIntersectionReconciler) ReconcileReturns(result1 resolver.APIReconciliationResult) { - fake.reconcileMutex.Lock() - defer fake.reconcileMutex.Unlock() - fake.ReconcileStub = nil - fake.reconcileReturns = struct { - result1 resolver.APIReconciliationResult - }{result1} -} - -func (fake *FakeAPIIntersectionReconciler) ReconcileReturnsOnCall(i int, result1 resolver.APIReconciliationResult) { - fake.reconcileMutex.Lock() - defer fake.reconcileMutex.Unlock() - fake.ReconcileStub = nil - if fake.reconcileReturnsOnCall == nil { - fake.reconcileReturnsOnCall = make(map[int]struct { - result1 resolver.APIReconciliationResult - }) - } - fake.reconcileReturnsOnCall[i] = struct { - result1 resolver.APIReconciliationResult - }{result1} -} - -func (fake *FakeAPIIntersectionReconciler) Invocations() map[string][][]interface{} { - fake.invocationsMutex.RLock() - defer fake.invocationsMutex.RUnlock() - fake.reconcileMutex.RLock() - defer fake.reconcileMutex.RUnlock() - copiedInvocations := map[string][][]interface{}{} - for key, value := range fake.invocations { - copiedInvocations[key] = value - } - return copiedInvocations -} - -func (fake *FakeAPIIntersectionReconciler) recordInvocation(key string, args []interface{}) { - fake.invocationsMutex.Lock() - defer fake.invocationsMutex.Unlock() - if fake.invocations == nil { - fake.invocations = map[string][][]interface{}{} - } - if fake.invocations[key] == nil { - fake.invocations[key] = [][]interface{}{} - } - fake.invocations[key] = append(fake.invocations[key], args) -} - -var _ resolver.APIIntersectionReconciler = new(FakeAPIIntersectionReconciler) diff --git a/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go b/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go index b24cdcbc1f..07ec94e0f3 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go @@ -15,11 +15,10 @@ type FakeStepResolver struct { expireArgsForCall []struct { arg1 registry.CatalogKey } - ResolveStepsStub func(string, resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) + ResolveStepsStub func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) resolveStepsMutex sync.RWMutex resolveStepsArgsForCall []struct { arg1 string - arg2 resolver.SourceQuerier } resolveStepsReturns struct { result1 []*v1alpha1.Step @@ -68,17 +67,16 @@ func (fake *FakeStepResolver) ExpireArgsForCall(i int) registry.CatalogKey { return argsForCall.arg1 } -func (fake *FakeStepResolver) ResolveSteps(arg1 string, arg2 resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (fake *FakeStepResolver) ResolveSteps(arg1 string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { fake.resolveStepsMutex.Lock() ret, specificReturn := fake.resolveStepsReturnsOnCall[len(fake.resolveStepsArgsForCall)] fake.resolveStepsArgsForCall = append(fake.resolveStepsArgsForCall, struct { arg1 string - arg2 resolver.SourceQuerier - }{arg1, arg2}) - fake.recordInvocation("ResolveSteps", []interface{}{arg1, arg2}) + }{arg1}) + fake.recordInvocation("ResolveSteps", []interface{}{arg1}) fake.resolveStepsMutex.Unlock() if fake.ResolveStepsStub != nil { - return fake.ResolveStepsStub(arg1, arg2) + return fake.ResolveStepsStub(arg1) } if specificReturn { return ret.result1, ret.result2, ret.result3, ret.result4 @@ -93,17 +91,17 @@ func (fake *FakeStepResolver) ResolveStepsCallCount() int { return len(fake.resolveStepsArgsForCall) } -func (fake *FakeStepResolver) ResolveStepsCalls(stub func(string, resolver.SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error)) { +func (fake *FakeStepResolver) ResolveStepsCalls(stub func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error)) { fake.resolveStepsMutex.Lock() defer fake.resolveStepsMutex.Unlock() fake.ResolveStepsStub = stub } -func (fake *FakeStepResolver) ResolveStepsArgsForCall(i int) (string, resolver.SourceQuerier) { +func (fake *FakeStepResolver) ResolveStepsArgsForCall(i int) string { fake.resolveStepsMutex.RLock() defer fake.resolveStepsMutex.RUnlock() argsForCall := fake.resolveStepsArgsForCall[i] - return argsForCall.arg1, argsForCall.arg2 + return argsForCall.arg1 } func (fake *FakeStepResolver) ResolveStepsReturns(result1 []*v1alpha1.Step, result2 []v1alpha1.BundleLookup, result3 []*v1alpha1.Subscription, result4 error) { diff --git a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go index 85f1381bd5..a8ab2b676a 100644 --- a/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/subscription_e2e_test.go @@ -31,7 +31,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/comparison" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" @@ -219,7 +218,7 @@ var _ = Describe("Subscription", func() { stableChannel := "stable" mainCSV := newCSV(mainPackageStable, testNamespace, "", semver.MustParse("0.1.0-1556661347"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) updatedCSV := newCSV(updatedPackageStable, testNamespace, "", semver.MustParse("0.1.0-1556661832"), []apiextensions.CustomResourceDefinition{crd}, nil, nil) - updatedCSV.SetAnnotations(map[string]string{resolver.SkipPackageAnnotationKey: ">=0.1.0-1556661347 <0.1.0-1556661832"}) + updatedCSV.SetAnnotations(map[string]string{"olm.skipRange": ">=0.1.0-1556661347 <0.1.0-1556661832"}) c := newKubeClient() crc := newCRClient() diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index bc4cc76160..c91029a3a7 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -890,7 +890,7 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error { // get the set of sources that should be used for resolution and best-effort get their connections working logger.Debug("resolving sources") - querier := resolver.NewNamespaceSourceQuerier(o.sources.AsClients(o.namespace, namespace)) + querier := NewNamespaceSourceQuerier(o.sources.AsClients(o.namespace, namespace)) logger.Debug("checking if subscriptions need update") @@ -950,7 +950,7 @@ func (o *Operator) syncResolvingNamespace(obj interface{}) error { logger.Debug("resolving subscriptions in namespace") // resolve a set of steps to apply to a cluster, a set of subscriptions to create/update, and any errors - steps, bundleLookups, updatedSubs, err := o.resolver.ResolveSteps(namespace, querier) + steps, bundleLookups, updatedSubs, err := o.resolver.ResolveSteps(namespace) if err != nil { go o.recorder.Event(ns, corev1.EventTypeWarning, "ResolutionFailed", err.Error()) // If the error is constraints not satisfiable, then simply project the @@ -1096,7 +1096,7 @@ func (o *Operator) ensureSubscriptionInstallPlanState(logger *logrus.Entry, sub return updated, true, nil } -func (o *Operator) ensureSubscriptionCSVState(logger *logrus.Entry, sub *v1alpha1.Subscription, querier resolver.SourceQuerier) (*v1alpha1.Subscription, bool, error) { +func (o *Operator) ensureSubscriptionCSVState(logger *logrus.Entry, sub *v1alpha1.Subscription, querier SourceQuerier) (*v1alpha1.Subscription, bool, error) { if sub.Status.CurrentCSV == "" { return sub, false, nil } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go new file mode 100644 index 0000000000..1faf2c05cc --- /dev/null +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/querier.go @@ -0,0 +1,123 @@ +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_client.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/api.RegistryClient +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../registry/registry_client.go ClientInterface +package catalog + +import ( + "context" + "fmt" + + "github.com/blang/semver/v4" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/errors" + + "github.com/operator-framework/operator-registry/pkg/api" + "github.com/operator-framework/operator-registry/pkg/client" + + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" +) + +const SkipPackageAnnotationKey = "olm.skipRange" + +type SourceRef struct { + Address string + Client client.Interface + LastConnect metav1.Time + LastHealthy metav1.Time +} + +type SourceQuerier interface { + FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) + Queryable() error +} + +type NamespaceSourceQuerier struct { + sources map[registry.CatalogKey]registry.ClientInterface +} + +var _ SourceQuerier = &NamespaceSourceQuerier{} + +func NewNamespaceSourceQuerier(sources map[registry.CatalogKey]registry.ClientInterface) *NamespaceSourceQuerier { + return &NamespaceSourceQuerier{ + sources: sources, + } +} + +func (q *NamespaceSourceQuerier) Queryable() error { + if len(q.sources) == 0 { + return fmt.Errorf("no catalog sources available") + } + return nil +} + +func (q *NamespaceSourceQuerier) FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { + errs := []error{} + + if initialSource.Name != "" && initialSource.Namespace != "" { + source, ok := q.sources[initialSource] + if !ok { + return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource.Name) + } + + bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + return nil, nil, errors.NewAggregate(errs) + } + + for key, source := range q.sources { + bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) + if bundle != nil { + return bundle, &initialSource, nil + } + if err != nil { + errs = append(errs, err) + } + + bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) + if bundle != nil { + return bundle, &key, nil + } + if err != nil { + errs = append(errs, err) + } + } + return nil, nil, errors.NewAggregate(errs) +} + +func (q *NamespaceSourceQuerier) findChannelHead(currentVersion *semver.Version, pkgName, channelName string, source client.Interface) (*api.Bundle, error) { + if currentVersion == nil { + return nil, nil + } + + latest, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) + if err != nil { + return nil, err + } + + if latest.SkipRange == "" { + return nil, nil + } + + r, err := semver.ParseRange(latest.SkipRange) + if err != nil { + return nil, err + } + + if r(*currentVersion) { + return latest, nil + } + return nil, nil +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/config.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/config.go index 69f156ecf3..98ac5ff958 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/config.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/config.go @@ -14,7 +14,6 @@ import ( configv1client "github.com/openshift/client-go/config/clientset/versioned" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/labeler" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorclient" ) @@ -30,7 +29,7 @@ type operatorConfig struct { operatorClient operatorclient.ClientInterface externalClient versioned.Interface strategyResolver install.StrategyResolverInterface - apiReconciler resolver.APIIntersectionReconciler + apiReconciler APIIntersectionReconciler apiLabeler labeler.Labeler restConfig *rest.Config configClient configv1client.Interface @@ -84,8 +83,8 @@ func defaultOperatorConfig() *operatorConfig { clock: utilclock.RealClock{}, logger: logrus.New(), strategyResolver: &install.StrategyResolver{}, - apiReconciler: resolver.APIIntersectionReconcileFunc(resolver.ReconcileAPIIntersection), - apiLabeler: labeler.Func(resolver.LabelSetsFor), + apiReconciler: APIIntersectionReconcileFunc(ReconcileAPIIntersection), + apiLabeler: labeler.Func(LabelSetsFor), } } @@ -137,7 +136,7 @@ func WithStrategyResolver(strategyResolver install.StrategyResolverInterface) Op } } -func WithAPIReconciler(apiReconciler resolver.APIIntersectionReconciler) OperatorOption { +func WithAPIReconciler(apiReconciler APIIntersectionReconciler) OperatorOption { return func(config *operatorConfig) { config.apiReconciler = apiReconciler } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go similarity index 96% rename from vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go rename to vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go index 72f3e68ebf..90481c5f4a 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/groups.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/groups.go @@ -1,5 +1,4 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../../fakes/fake_api_intersection_reconciler.go . APIIntersectionReconciler -package resolver +package olm import ( "strings" diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go similarity index 61% rename from staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go rename to vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go index 9b10eb2d6d..c0d003da5c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/labeler.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go @@ -1,8 +1,9 @@ -package resolver +package olm import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" + extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" ) @@ -12,20 +13,27 @@ const ( APILabelKeyPrefix = "olm.api." ) +type operatorSurface interface { + GetProvidedAPIs() cache.APISet + GetRequiredAPIs() cache.APISet +} + // LabelSetsFor returns API label sets for the given object. // Concrete types other than OperatorSurface and CustomResource definition no-op. func LabelSetsFor(obj interface{}) ([]labels.Set, error) { switch v := obj.(type) { - case cache.OperatorSurface: + case operatorSurface: return labelSetsForOperatorSurface(v) case *extv1beta1.CustomResourceDefinition: - return labelSetsForCRD(v) + return labelSetsForCRDv1beta1(v) + case *extv1.CustomResourceDefinition: + return labelSetsForCRDv1(v) default: return nil, nil } } -func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, error) { +func labelSetsForOperatorSurface(surface operatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} for key := range surface.GetProvidedAPIs().StripPlural() { hash, err := cache.APIKeyToGVKHash(key) @@ -45,7 +53,38 @@ func labelSetsForOperatorSurface(surface cache.OperatorSurface) ([]labels.Set, e return []labels.Set{labelSet}, nil } -func labelSetsForCRD(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, error) { +func labelSetsForCRDv1beta1(crd *extv1beta1.CustomResourceDefinition) ([]labels.Set, error) { + labelSets := []labels.Set{} + if crd == nil { + return labelSets, nil + } + + // Add label sets for each version + for _, version := range crd.Spec.Versions { + hash, err := cache.APIKeyToGVKHash(registry.APIKey{ + Group: crd.Spec.Group, + Version: version.Name, + Kind: crd.Spec.Names.Kind, + }) + if err != nil { + return nil, err + } + key := APILabelKeyPrefix + hash + sets := []labels.Set{ + { + key: "provided", + }, + { + key: "required", + }, + } + labelSets = append(labelSets, sets...) + } + + return labelSets, nil +} + +func labelSetsForCRDv1(crd *extv1.CustomResourceDefinition) ([]labels.Set, error) { labelSets := []labels.Set{} if crd == nil { return labelSets, nil diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index b71abe2115..39018ee376 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -37,7 +37,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" @@ -79,7 +78,7 @@ type Operator struct { csvIndexers map[string]cache.Indexer recorder record.EventRecorder resolver install.StrategyResolverInterface - apiReconciler resolver.APIIntersectionReconciler + apiReconciler APIIntersectionReconciler apiLabeler labeler.Labeler csvSetGenerator csvutility.SetGenerator csvReplaceFinder csvutility.ReplaceFinder @@ -846,7 +845,7 @@ func (a *Operator) namespaceAddedOrRemoved(obj interface{}) { } for _, group := range operatorGroupList { - if resolver.NewNamespaceSet(group.Status.Namespaces).Contains(namespace.GetName()) { + if NewNamespaceSet(group.Status.Namespaces).Contains(namespace.GetName()) { if err := a.ogQueueSet.Requeue(group.Namespace, group.Name); err != nil { logger.WithError(err).Warn("error requeuing operatorgroup") } @@ -881,7 +880,7 @@ func (a *Operator) syncNamespace(obj interface{}) error { } for _, group := range operatorGroupList { - namespaceSet := resolver.NewNamespaceSet(group.Status.Namespaces) + namespaceSet := NewNamespaceSet(group.Status.Namespaces) // Apply the label if not an All Namespaces OperatorGroup. if namespaceSet.Contains(namespace.GetName()) && !namespaceSet.IsAllNamespaces() { @@ -1098,7 +1097,7 @@ func (a *Operator) removeDanglingChildCSVs(csv *v1alpha1.ClusterServiceVersion) } if annotations := parent.GetAnnotations(); annotations != nil { - if !resolver.NewNamespaceSetFromString(annotations[v1.OperatorGroupTargetsAnnotationKey]).Contains(csv.GetNamespace()) { + if !NewNamespaceSetFromString(annotations[v1.OperatorGroupTargetsAnnotationKey]).Contains(csv.GetNamespace()) { logger.WithField("parentTargets", annotations[v1.OperatorGroupTargetsAnnotationKey]). Debug("deleting copied CSV since parent no longer lists this as a target namespace") return a.deleteChild(csv, logger) @@ -1226,7 +1225,7 @@ func (a *Operator) syncCopyCSV(obj interface{}) (syncError error) { }).Debug("copying csv to targets") // Check if we need to do any copying / annotation for the operatorgroup - if err := a.ensureCSVsInNamespaces(clusterServiceVersion, operatorGroup, resolver.NewNamespaceSet(operatorGroup.Status.Namespaces)); err != nil { + if err := a.ensureCSVsInNamespaces(clusterServiceVersion, operatorGroup, NewNamespaceSet(operatorGroup.Status.Namespaces)); err != nil { logger.WithError(err).Info("couldn't copy CSV to target namespaces") syncError = err } @@ -1427,12 +1426,12 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v } } - groupSurface := resolver.NewOperatorGroup(operatorGroup) - otherGroupSurfaces := resolver.NewOperatorGroupSurfaces(otherGroups...) + groupSurface := NewOperatorGroup(operatorGroup) + otherGroupSurfaces := NewOperatorGroupSurfaces(otherGroups...) providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { - case operatorGroup.Spec.StaticProvidedAPIs && (result == resolver.AddAPIs || result == resolver.RemoveAPIs): + case operatorGroup.Spec.StaticProvidedAPIs && (result == AddAPIs || result == RemoveAPIs): // Transition the CSV to FAILED with status reason "CannotModifyStaticOperatorGroupProvidedAPIs" if out.Status.Reason != v1alpha1.CSVReasonInterOperatorGroupOwnerConflict { logger.WithField("apis", providedAPIs).Warn("cannot modify provided apis of static provided api operatorgroup") @@ -1440,7 +1439,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.cleanupCSVDeployments(logger, out) } return - case result == resolver.APIConflict: + case result == APIConflict: // Transition the CSV to FAILED with status reason "InterOperatorGroupOwnerConflict" if out.Status.Reason != v1alpha1.CSVReasonInterOperatorGroupOwnerConflict { logger.WithField("apis", providedAPIs).Warn("intersecting operatorgroups provide the same apis") @@ -1448,7 +1447,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.cleanupCSVDeployments(logger, out) } return - case result == resolver.AddAPIs: + case result == AddAPIs: // Add the CSV's provided APIs to its OperatorGroup's annotation logger.WithField("apis", providedAPIs).Debug("adding csv provided apis to operatorgroup") union := groupSurface.ProvidedAPIs().Union(providedAPIs) @@ -1471,7 +1470,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v a.logger.WithError(err).Warn("unable to requeue") } return - case result == resolver.RemoveAPIs: + case result == RemoveAPIs: // Remove the CSV's provided APIs from its OperatorGroup's annotation logger.WithField("apis", providedAPIs).Debug("removing csv provided apis from operatorgroup") difference := groupSurface.ProvidedAPIs().Difference(providedAPIs) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index 8c28ef0d1e..8a2871a312 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -21,7 +21,6 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/decorators" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" hashutil "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/kubernetes/pkg/util/hash" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/ownerutil" @@ -186,7 +185,7 @@ func (a *Operator) syncOperatorGroups(obj interface{}) error { // Requeue all CSVs that provide the same APIs (including those removed). This notifies conflicting CSVs in // intersecting groups that their conflict has possibly been resolved, either through resizing or through // deletion of the conflicting CSV. - groupSurface := resolver.NewOperatorGroup(op) + groupSurface := NewOperatorGroup(op) groupProvidedAPIs := groupSurface.ProvidedAPIs() providedAPIsForCSVs := a.providedAPIsFromCSVs(op, logger) providedAPIsForGroup := make(cache.APISet) @@ -255,7 +254,7 @@ func (a *Operator) operatorGroupDeleted(obj interface{}) { func (a *Operator) annotateCSVs(group *v1.OperatorGroup, targetNamespaces []string, logger *logrus.Entry) error { updateErrs := []error{} - targetNamespaceSet := resolver.NewNamespaceSet(targetNamespaces) + targetNamespaceSet := NewNamespaceSet(targetNamespaces) for _, csv := range a.csvSet(group.GetNamespace(), v1alpha1.CSVPhaseAny) { if csv.IsCopied() { @@ -264,7 +263,7 @@ func (a *Operator) annotateCSVs(group *v1.OperatorGroup, targetNamespaces []stri logger := logger.WithField("csv", csv.GetName()) originalNamespacesAnnotation, _ := a.copyOperatorGroupAnnotations(&csv.ObjectMeta)[v1.OperatorGroupTargetsAnnotationKey] - originalNamespaceSet := resolver.NewNamespaceSetFromString(originalNamespacesAnnotation) + originalNamespaceSet := NewNamespaceSetFromString(originalNamespacesAnnotation) if a.operatorGroupAnnotationsDiffer(&csv.ObjectMeta, group) { a.setOperatorGroupAnnotations(&csv.ObjectMeta, group, true) @@ -689,7 +688,7 @@ func (a *Operator) ensureTenantRBAC(operatorNamespace, targetNamespace string, c return nil } -func (a *Operator) ensureCSVsInNamespaces(csv *v1alpha1.ClusterServiceVersion, operatorGroup *v1.OperatorGroup, targets resolver.NamespaceSet) error { +func (a *Operator) ensureCSVsInNamespaces(csv *v1alpha1.ClusterServiceVersion, operatorGroup *v1.OperatorGroup, targets NamespaceSet) error { namespaces, err := a.lister.CoreV1().NamespaceLister().List(labels.Everything()) if err != nil { return err diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 7b85124133..1df76b270d 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -137,21 +137,21 @@ func (s APISet) StripPlural() APISet { return set } -type APIOwnerSet map[opregistry.APIKey]OperatorSurface +type APIOwnerSet map[opregistry.APIKey]*Operator func EmptyAPIOwnerSet() APIOwnerSet { - return map[opregistry.APIKey]OperatorSurface{} + return map[opregistry.APIKey]*Operator{} } -type OperatorSet map[string]OperatorSurface +type OperatorSet map[string]*Operator func EmptyOperatorSet() OperatorSet { - return map[string]OperatorSurface{} + return map[string]*Operator{} } // Snapshot returns a new set, pointing to the same values func (o OperatorSet) Snapshot() OperatorSet { - out := make(map[string]OperatorSurface) + out := make(map[string]*Operator) for key, val := range o { out[key] = val } @@ -206,34 +206,19 @@ func (i *OperatorSourceInfo) String() string { var NoCatalog = registry.CatalogKey{Name: "", Namespace: ""} var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: "", Catalog: NoCatalog, DefaultChannel: false} -// OperatorSurface describes the API surfaces provided and required by an Operator. -type OperatorSurface interface { - GetProvidedAPIs() APISet - GetRequiredAPIs() APISet - Identifier() string - GetReplaces() string - GetVersion() *semver.Version - GetSourceInfo() *OperatorSourceInfo - GetBundle() *api.Bundle - Inline() bool - GetProperties() []*api.Property - GetSkips() []string -} - type Operator struct { Name string Replaces string + Skips []string + SkipRange semver.Range ProvidedAPIs APISet RequiredAPIs APISet Version *semver.Version Bundle *api.Bundle SourceInfo *OperatorSourceInfo Properties []*api.Property - Skips []string } -var _ OperatorSurface = &Operator{} - func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey registry.CatalogKey, defaultChannel string) (*Operator, error) { parsedVersion, err := semver.ParseTolerant(bundle.Version) version := &parsedVersion @@ -290,6 +275,10 @@ func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey reg Skips: bundle.Skips, } + if r, err := semver.ParseRange(o.Bundle.SkipRange); err == nil { + o.SkipRange = r + } + if !o.Inline() { // TODO: Extract any necessary information from the Bundle // up-front and remove the bundle field altogether. For now, @@ -355,18 +344,6 @@ func (o *Operator) GetRequiredAPIs() APISet { return o.RequiredAPIs } -func (o *Operator) Identifier() string { - return o.Name -} - -func (o *Operator) GetReplaces() string { - return o.Replaces -} - -func (o *Operator) GetSkips() []string { - return o.Skips -} - func (o *Operator) Package() string { if o.Bundle != nil { return o.Bundle.PackageName @@ -381,30 +358,10 @@ func (o *Operator) Channel() string { return "" } -func (o *Operator) GetSourceInfo() *OperatorSourceInfo { - return o.SourceInfo -} - -func (o *Operator) GetBundle() *api.Bundle { - return o.Bundle -} - -func (o *Operator) GetVersion() *semver.Version { - return o.Version -} - -func (o *Operator) SemverRange() (semver.Range, error) { - return semver.ParseRange(o.Bundle.SkipRange) -} - func (o *Operator) Inline() bool { return o.Bundle != nil && o.Bundle.GetBundlePath() == "" } -func (o *Operator) GetProperties() []*api.Property { - return o.Properties -} - func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { predicates = make([]OperatorPredicate, 0) for _, property := range o.Properties { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 171ee5ac91..7e8649d5dc 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -195,8 +195,7 @@ func SkipRangeIncludesPredicate(version semver.Version) OperatorPredicate { } func (s skipRangeIncludesPredication) Test(o *Operator) bool { - semverRange, err := o.SemverRange() - return err == nil && semverRange(s.version) + return o.SkipRange != nil && o.SkipRange(s.version) } func (s skipRangeIncludesPredication) String() string { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index 94302d53ee..ba9cd602bf 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -60,7 +60,7 @@ func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, err if o.SourceInfo == nil { return BundleInstallable{}, fmt.Errorf("unable to resolve the source of bundle %s", o.Name) } - id := bundleId(o.Identifier(), o.Channel(), o.SourceInfo.Catalog) + id := bundleId(o.Name, o.Channel(), o.SourceInfo.Catalog) var constraints []solver.Constraint if o.SourceInfo.Catalog.Virtual() && o.SourceInfo.Subscription == nil { // CSVs already associated with a Subscription @@ -68,7 +68,7 @@ func NewBundleInstallableFromOperator(o *cache.Operator) (BundleInstallable, err // appear in any solution. constraints = append(constraints, PrettyConstraint( solver.Mandatory(), - fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Identifier()), + fmt.Sprintf("clusterserviceversion %s exists and is not referenced by a subscription", o.Name), )) } for _, p := range o.Properties { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go index 823ceb3979..d8af9350cd 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go @@ -24,9 +24,9 @@ func NewInstrumentedResolver(resolver StepResolver, successMetricsEmitter, failu } } -func (ir *InstrumentedResolver) ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (ir *InstrumentedResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { start := time.Now() - steps, lookups, subs, err := ir.resolver.ResolveSteps(namespace, sourceQuerier) + steps, lookups, subs, err := ir.resolver.ResolveSteps(namespace) if err != nil { ir.failureMetricsEmitter(time.Now().Sub(start)) } else { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go deleted file mode 100644 index 7acbc8a8a3..0000000000 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/querier.go +++ /dev/null @@ -1,197 +0,0 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_client.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/api.RegistryClient -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/client/client.go Interface -package resolver - -import ( - "context" - "fmt" - - "github.com/blang/semver/v4" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/util/errors" - - "github.com/operator-framework/operator-registry/pkg/api" - registryapi "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" - - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" -) - -const SkipPackageAnnotationKey = "olm.skipRange" - -type SourceRef struct { - Address string - Client client.Interface - LastConnect metav1.Time - LastHealthy metav1.Time -} - -type SourceQuerier interface { - FindProvider(api opregistry.APIKey, initialSource registry.CatalogKey, excludedPackages map[string]struct{}) (*api.Bundle, *registry.CatalogKey, error) - FindBundle(pkgName, channelName, bundleName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - FindLatestBundle(pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) - Queryable() error -} - -type NamespaceSourceQuerier struct { - sources map[registry.CatalogKey]registry.ClientInterface -} - -var _ SourceQuerier = &NamespaceSourceQuerier{} - -func NewNamespaceSourceQuerier(sources map[registry.CatalogKey]registry.ClientInterface) *NamespaceSourceQuerier { - return &NamespaceSourceQuerier{ - sources: sources, - } -} - -func (q *NamespaceSourceQuerier) Queryable() error { - if len(q.sources) == 0 { - return fmt.Errorf("no catalog sources available") - } - return nil -} - -func (q *NamespaceSourceQuerier) FindProvider(api opregistry.APIKey, initialSource registry.CatalogKey, excludedPackages map[string]struct{}) (*registryapi.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if ok { - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &initialSource, nil - } - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Plural+"."+api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &initialSource, nil - } - } - } - for key, source := range q.sources { - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &key, nil - } - if bundle, err := source.FindBundleThatProvides(context.TODO(), api.Plural+"."+api.Group, api.Version, api.Kind, excludedPackages); err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s not provided by a package in any CatalogSource", api) -} - -func (q *NamespaceSourceQuerier) FindBundle(pkgName, channelName, bundleName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource) - } - - bundle, err := source.GetBundle(context.TODO(), pkgName, channelName, bundleName) - if err != nil { - return nil, nil, err - } - return bundle, &initialSource, nil - } - - for key, source := range q.sources { - bundle, err := source.GetBundle(context.TODO(), pkgName, channelName, bundleName) - if err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s/%s/%s not found in any available CatalogSource", pkgName, channelName, bundleName) -} - -func (q *NamespaceSourceQuerier) FindLatestBundle(pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource) - } - - bundle, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err != nil { - return nil, nil, err - } - return bundle, &initialSource, nil - } - - for key, source := range q.sources { - bundle, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err == nil { - return bundle, &key, nil - } - } - return nil, nil, fmt.Errorf("%s/%s not found in any available CatalogSource", pkgName, channelName) -} - -func (q *NamespaceSourceQuerier) FindReplacement(currentVersion *semver.Version, bundleName, pkgName, channelName string, initialSource registry.CatalogKey) (*api.Bundle, *registry.CatalogKey, error) { - errs := []error{} - - if initialSource.Name != "" && initialSource.Namespace != "" { - source, ok := q.sources[initialSource] - if !ok { - return nil, nil, fmt.Errorf("CatalogSource %s not found", initialSource.Name) - } - - bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - return nil, nil, errors.NewAggregate(errs) - } - - for key, source := range q.sources { - bundle, err := q.findChannelHead(currentVersion, pkgName, channelName, source) - if bundle != nil { - return bundle, &initialSource, nil - } - if err != nil { - errs = append(errs, err) - } - - bundle, err = source.GetReplacementBundleInPackageChannel(context.TODO(), bundleName, pkgName, channelName) - if bundle != nil { - return bundle, &key, nil - } - if err != nil { - errs = append(errs, err) - } - } - return nil, nil, errors.NewAggregate(errs) -} - -func (q *NamespaceSourceQuerier) findChannelHead(currentVersion *semver.Version, pkgName, channelName string, source client.Interface) (*api.Bundle, error) { - if currentVersion == nil { - return nil, nil - } - - latest, err := source.GetBundleInPackageChannel(context.TODO(), pkgName, channelName) - if err != nil { - return nil, err - } - - if latest.SkipRange == "" { - return nil, nil - } - - r, err := semver.ParseRange(latest.SkipRange) - if err != nil { - return nil, err - } - - if r(*currentVersion) { - return latest, nil - } - return nil, nil -} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index a8eeaf51bf..06d9c10c71 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -51,7 +51,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust var errs []error installables := make(map[solver.Identifier]solver.Installable, 0) - visited := make(map[cache.OperatorSurface]*BundleInstallable, 0) + visited := make(map[*cache.Operator]*BundleInstallable, 0) // TODO: better abstraction startingCSVs := make(map[string]struct{}) @@ -141,7 +141,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust } } - operators := make(map[string]cache.OperatorSurface, 0) + operators := make(map[string]*cache.Operator, 0) for _, installableOperator := range operatorInstallables { csvName, channel, catalog, err := installableOperator.BundleSourceInfo() if err != nil { @@ -173,7 +173,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust return operators, nil } -func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { +func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, current *cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]solver.Installable, error) { var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) @@ -189,7 +189,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu csvPredicate := cache.True() if current != nil { // if we found an existing installed operator, we should filter the channel by operators that can replace it - channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Identifier()))) + channelPredicates = append(channelPredicates, cache.Or(cache.SkipRangeIncludesPredicate(*current.Version), cache.ReplacesPredicate(current.Name))) } else if sub.Spec.StartingCSV != "" { // if no operator is installed and we have a startingCSV, filter for it csvPredicate = cache.CSVNamePredicate(sub.Spec.StartingCSV) @@ -257,7 +257,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu candidates := make([]*BundleInstallable, 0) for _, o := range cache.Filter(sortedBundles, channelPredicates...) { - predicates := append(cachePredicates, cache.CSVNamePredicate(o.Identifier())) + predicates := append(cachePredicates, cache.CSVNamePredicate(o.Name)) stack := namespacedCache.Catalog(catalog).Find(predicates...) id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) if err != nil { @@ -279,7 +279,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu for _, c := range candidates { // track which operator this is replacing, so that it can be realized when creating the resources on cluster if current != nil { - c.Replaces = current.Identifier() + c.Replaces = current.Name // Package name can't be reliably inferred // from a CSV without a projected package // property, so for the replacement case, a @@ -288,12 +288,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // safe to remove this conflict if properties // annotations are made mandatory for // resolution. - c.AddConflict(bundleId(current.Identifier(), current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + c.AddConflict(bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) } depIds = append(depIds, c.Identifier()) } if current != nil { - depIds = append(depIds, bundleId(current.Identifier(), current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + depIds = append(depIds, bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) } // all candidates added as options for this constraint @@ -303,7 +303,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[cache.OperatorSurface]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies @@ -359,7 +359,7 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS if si.Catalog.Virtual() { sourcePredicate = cache.Or(sourcePredicate, cache.And( - cache.CSVNamePredicate(b.Identifier()), + cache.CSVNamePredicate(b.Name), cache.CatalogPredicate(si.Catalog), )) } else { @@ -653,7 +653,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { skipped := map[string]*cache.Operator{} for _, b := range bundles { - bundleLookup[b.Identifier()] = b + bundleLookup[b.Name] = b } for _, b := range bundles { @@ -690,7 +690,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { current := head for { visited[current] = struct{}{} - if _, ok := skipped[current.Identifier()]; !ok { + if _, ok := skipped[current.Name]; !ok { chain = append(chain, current) } next, ok := replaces[current] @@ -698,7 +698,7 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { break } if _, ok := visited[next]; ok { - return nil, fmt.Errorf("a cycle exists in the chain of replacement beginning with %q in channel %q of package %q", head.Identifier(), channelName, packageName) + return nil, fmt.Errorf("a cycle exists in the chain of replacement beginning with %q in channel %q of package %q", head.Name, channelName, packageName) } current = next } @@ -712,9 +712,9 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { case 0: schains[i] = "[]" // Bug? case 1: - schains[i] = chain[0].Identifier() + schains[i] = chain[0].Name default: - schains[i] = fmt.Sprintf("%s...%s", chain[0].Identifier(), chain[len(chain)-1].Identifier()) + schains[i] = fmt.Sprintf("%s...%s", chain[0].Name, chain[len(chain)-1].Name) } } return nil, fmt.Errorf("a unique replacement chain within a channel is required to determine the relative order between channel entries, but %d replacement chains were found in channel %q of package %q: %s", len(schains), channelName, packageName, strings.Join(schains, ", ")) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 9fb369ca32..a696dfd657 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -1,4 +1,3 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o fakes/fake_registry_interface.go ../../../../vendor/github.com/operator-framework/operator-registry/pkg/client/client.go Interface //go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o ../../../fakes/fake_resolver.go . StepResolver package resolver @@ -31,7 +30,7 @@ const ( var timeNow = func() metav1.Time { return metav1.NewTime(time.Now().UTC()) } type StepResolver interface { - ResolveSteps(namespace string, sourceQuerier SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) + ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) Expire(key registry.CatalogKey) } @@ -66,7 +65,7 @@ func (r *OperatorStepResolver) Expire(key registry.CatalogKey) { r.satResolver.cache.Expire(key) } -func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { +func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { // create a generation - a representation of the current set of installed operators and their provided/required apis allCSVs, err := r.csvLister.ClusterServiceVersions(namespace).List(labels.Everything()) if err != nil { @@ -102,7 +101,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( for name, op := range operators { // Find any existing subscriptions that resolve to this operator. existingSubscriptions := make(map[*v1alpha1.Subscription]bool) - sourceInfo := *op.GetSourceInfo() + sourceInfo := *op.SourceInfo for _, sub := range subs { if sub.Spec.Package != sourceInfo.Package { continue @@ -127,7 +126,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) > 0 { upToDate := true for sub, exists := range existingSubscriptions { - if !exists || sub.Status.CurrentCSV != op.Identifier() { + if !exists || sub.Status.CurrentCSV != op.Name { upToDate = false } } @@ -138,21 +137,21 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( } // add steps for any new bundle - if op.GetBundle() != nil { + if op.Bundle != nil { if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.GetBundle(), namespace, op.GetReplaces(), op.GetSourceInfo().Catalog.Name, op.GetSourceInfo().Catalog.Namespace) + bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) if err != nil { return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) } steps = append(steps, bundleSteps...) } else { lookup := v1alpha1.BundleLookup{ - Path: op.GetBundle().GetBundlePath(), - Identifier: op.Identifier(), - Replaces: op.GetReplaces(), + Path: op.Bundle.GetBundlePath(), + Identifier: op.Name, + Replaces: op.Replaces, CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.GetSourceInfo().Catalog.Namespace, - Name: op.GetSourceInfo().Catalog.Name, + Namespace: op.SourceInfo.Catalog.Namespace, + Name: op.SourceInfo.Catalog.Name, }, Conditions: []v1alpha1.BundleLookupCondition{ { @@ -169,8 +168,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( }, }, } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.GetProperties()); err != nil { - return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Identifier(), err) + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { + return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) } else { lookup.Properties = anno } @@ -179,8 +178,8 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( if len(existingSubscriptions) == 0 { // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.GetSourceInfo().StartingCSV = op.Identifier() - subStep, err := NewSubscriptionStepResource(namespace, *op.GetSourceInfo()) + op.SourceInfo.StartingCSV = op.Name + subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) if err != nil { return nil, nil, nil, err } @@ -194,11 +193,11 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string, _ SourceQuerier) ( // add steps for subscriptions for bundles that were added through resolution for sub := range existingSubscriptions { - if sub.Status.CurrentCSV == op.Identifier() { + if sub.Status.CurrentCSV == op.Name { continue } // update existing subscription status - sub.Status.CurrentCSV = op.Identifier() + sub.Status.CurrentCSV = op.Name updatedSubs = append(updatedSubs, sub) } } From cb3d9a759eaf3fde5f1c50fedf667fb4ae28c5c4 Mon Sep 17 00:00:00 2001 From: Kevin Rizza Date: Wed, 18 Aug 2021 17:56:10 -0400 Subject: [PATCH 20/45] Add vu dinh to OLM approvers (#2332) Signed-off-by: kevinrizza Upstream-repository: operator-lifecycle-manager Upstream-commit: cf3b8a4ff857cd40092c8f21c70604abeb966332 --- staging/operator-lifecycle-manager/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/staging/operator-lifecycle-manager/OWNERS b/staging/operator-lifecycle-manager/OWNERS index d731930b70..3e90f9515e 100644 --- a/staging/operator-lifecycle-manager/OWNERS +++ b/staging/operator-lifecycle-manager/OWNERS @@ -6,6 +6,7 @@ approvers: - kevinrizza - benluddy - awgreene + - dinhxuanvu # review == this code is good /lgtm reviewers: - ecordell From b0f0c92eb38ddcae123bb13277ead02aad4b5cd0 Mon Sep 17 00:00:00 2001 From: Kevin Rizza Date: Wed, 18 Aug 2021 18:15:11 -0400 Subject: [PATCH 21/45] Use of/gini instead of inifrance/gini (#2331) The github.com/irifrance/gini package has been purged from github An existing version that preserved that history has been forked to the operator-framework org, and this commit updates that dependency to use the forked version. Signed-off-by: kevinrizza Upstream-repository: operator-lifecycle-manager Upstream-commit: 51fe6da356c4e4658820031ffe0fe4117a2dcf59 --- go.sum | 4 +- staging/operator-lifecycle-manager/go.mod | 2 +- staging/operator-lifecycle-manager/go.sum | 4 +- .../registry/resolver/solver/constraints.go | 4 +- .../registry/resolver/solver/lit_mapping.go | 6 +- .../registry/resolver/solver/search.go | 4 +- .../registry/resolver/solver/search_test.go | 6 +- .../registry/resolver/solver/solve.go | 6 +- .../resolver/solver/zz_search_test.go | 4 +- vendor/github.com/irifrance/gini/go.mod | 1 - .../gini/.travis.yml | 0 .../gini/LICENSE | 0 .../gini/README.md | 65 ++++++++++++++----- .../gini/dimacs/cfilt.go | 0 .../gini/dimacs/cnf.go | 3 +- .../gini/dimacs/doc.go | 0 .../gini/dimacs/icnf.go | 3 +- .../gini/dimacs/int.go | 0 .../gini/dimacs/lit.go | 3 +- .../gini/dimacs/solve.go | 0 .../gini/dimacs/vis.go | 2 +- .../gini/doc.go | 0 .../gini/gini.go | 8 +-- .../github.com/operator-framework/gini/go.mod | 1 + .../gini/go.sum | 0 .../gini/inter/doc.go | 0 .../gini/inter/s.go | 2 +- .../gini/inter/solve.go | 0 .../gini/internal/xo/active.go | 2 +- .../gini/internal/xo/cdat.go | 2 +- .../gini/internal/xo/cdb.go | 2 +- .../gini/internal/xo/cgc.go | 2 +- .../gini/internal/xo/chd.go | 0 .../gini/internal/xo/cloc.go | 2 +- .../gini/internal/xo/ctl.go | 3 +- .../gini/internal/xo/derive.go | 2 +- .../gini/internal/xo/dimacs.go | 2 +- .../gini/internal/xo/doc.go | 0 .../gini/internal/xo/guess.go | 2 +- .../gini/internal/xo/luby.go | 0 .../gini/internal/xo/phases.go | 2 +- .../gini/internal/xo/s.go | 6 +- .../gini/internal/xo/stats.go | 0 .../gini/internal/xo/tracer.go | 0 .../gini/internal/xo/trail.go | 2 +- .../gini/internal/xo/vars.go | 2 +- .../gini/internal/xo/watch.go | 2 +- .../gini/logic/c.go | 4 +- .../gini/logic/card.go | 2 +- .../gini/logic/doc.go | 0 .../gini/logic/roll.go | 2 +- .../gini/logic/s.go | 2 +- .../gini/s.go | 2 +- .../gini/sv.go | 4 +- .../gini/z/c.go | 0 .../gini/z/doc.go | 0 .../gini/z/dv.go | 0 .../gini/z/lit.go | 0 .../gini/z/var.go | 0 .../registry/resolver/solver/constraints.go | 4 +- .../registry/resolver/solver/lit_mapping.go | 6 +- .../registry/resolver/solver/search.go | 4 +- .../registry/resolver/solver/solve.go | 6 +- vendor/modules.txt | 14 ++-- 64 files changed, 122 insertions(+), 89 deletions(-) delete mode 100644 vendor/github.com/irifrance/gini/go.mod rename vendor/github.com/{irifrance => operator-framework}/gini/.travis.yml (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/LICENSE (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/README.md (94%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/cfilt.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/cnf.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/icnf.go (96%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/int.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/lit.go (88%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/solve.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/dimacs/vis.go (96%) rename vendor/github.com/{irifrance => operator-framework}/gini/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/gini.go (97%) create mode 100644 vendor/github.com/operator-framework/gini/go.mod rename vendor/github.com/{irifrance => operator-framework}/gini/go.sum (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/inter/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/inter/s.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/inter/solve.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/active.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/cdat.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/cdb.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/cgc.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/chd.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/cloc.go (82%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/ctl.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/derive.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/dimacs.go (91%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/guess.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/luby.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/phases.go (93%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/s.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/stats.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/tracer.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/trail.go (99%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/vars.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/internal/xo/watch.go (97%) rename vendor/github.com/{irifrance => operator-framework}/gini/logic/c.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/logic/card.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/logic/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/logic/roll.go (97%) rename vendor/github.com/{irifrance => operator-framework}/gini/logic/s.go (98%) rename vendor/github.com/{irifrance => operator-framework}/gini/s.go (84%) rename vendor/github.com/{irifrance => operator-framework}/gini/sv.go (95%) rename vendor/github.com/{irifrance => operator-framework}/gini/z/c.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/z/doc.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/z/dv.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/z/lit.go (100%) rename vendor/github.com/{irifrance => operator-framework}/gini/z/var.go (100%) diff --git a/go.sum b/go.sum index 60c360e124..36b3765776 100644 --- a/go.sum +++ b/go.sum @@ -612,8 +612,6 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/irifrance/gini v1.0.1 h1:oTABiARLoRsnTmda0uY2u2e5kfm8e6meBZB19lf5xhE= -github.com/irifrance/gini v1.0.1/go.mod h1:swH5OTtiG/X/YrU06r288qZwq6I1agpbuXQOB55xqGU= 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= @@ -857,6 +855,8 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/operator-framework/gini v1.1.0 h1:w84bE/pi0nlnIRAxzYguoYAnL9s5T6RSVZKYWcxO3yI= +github.com/operator-framework/gini v1.1.0/go.mod h1:L4GlF3xPPfQUoWglKhaBcR8/LZn3fWtMB1mwUyOGv98= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index e559ae9f54..326b311852 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -15,7 +15,6 @@ require ( github.com/golang/mock v1.4.1 github.com/google/go-cmp v0.5.6 github.com/googleapis/gnostic v0.5.5 - github.com/irifrance/gini v1.0.1 github.com/itchyny/gojq v0.11.0 github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2 github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 @@ -26,6 +25,7 @@ require ( github.com/openshift/api v0.0.0-20200331152225-585af27e34fd github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 github.com/operator-framework/api v0.10.3 + github.com/operator-framework/gini v1.1.0 github.com/operator-framework/operator-registry v1.17.5 github.com/otiai10/copy v1.2.0 github.com/pkg/errors v0.9.1 diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index a6ef80bb07..d862aed784 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -631,8 +631,6 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= -github.com/irifrance/gini v1.0.1 h1:oTABiARLoRsnTmda0uY2u2e5kfm8e6meBZB19lf5xhE= -github.com/irifrance/gini v1.0.1/go.mod h1:swH5OTtiG/X/YrU06r288qZwq6I1agpbuXQOB55xqGU= 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= @@ -880,6 +878,8 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/operator-framework/api v0.7.1/go.mod h1:L7IvLd/ckxJEJg/t4oTTlnHKAJIP/p51AvEslW3wYdY= github.com/operator-framework/api v0.10.3 h1:C4DE7Rr3+ztUw3mKiFyfAiUJSVOty/cJmpwE90/kYro= github.com/operator-framework/api v0.10.3/go.mod h1:tV0BUNvly7szq28ZPBXhjp1Sqg5yHCOeX19ui9K4vjI= +github.com/operator-framework/gini v1.1.0 h1:w84bE/pi0nlnIRAxzYguoYAnL9s5T6RSVZKYWcxO3yI= +github.com/operator-framework/gini v1.1.0/go.mod h1:L4GlF3xPPfQUoWglKhaBcR8/LZn3fWtMB1mwUyOGv98= github.com/operator-framework/operator-registry v1.17.5 h1:LR8m1rFz5Gcyje8WK6iYt+gIhtzqo52zMRALdmTYHT0= github.com/operator-framework/operator-registry v1.17.5/go.mod h1:sRQIgDMZZdUcmHltzyCnM6RUoDF+WS8Arj1BQIARDS8= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go index 84ecb2fc1a..ca3c4f5331 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/irifrance/gini/logic" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/logic" + "github.com/operator-framework/gini/z" ) // Constraint implementations limit the circumstances under which a diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go index 39220fd52e..f837ffc3e8 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/logic" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/logic" + "github.com/operator-framework/gini/z" ) type DuplicateIdentifier Identifier diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go index 4344b444ed..f36678f1ee 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go @@ -3,8 +3,8 @@ package solver import ( "context" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) type choice struct { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go index a57443a207..53dff9c748 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go @@ -1,4 +1,4 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o zz_search_test.go ../../../../../vendor/github.com/irifrance/gini/inter S +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o zz_search_test.go ../../../../../vendor/github.com/operator-framework/gini/inter S package solver @@ -6,8 +6,8 @@ import ( "context" "testing" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" "github.com/stretchr/testify/assert" ) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go index 8f559569d7..712ae3bcc7 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "github.com/irifrance/gini" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) var Incomplete = errors.New("cancelled before a solution could be found") diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go index 4b0a96701c..5ef7eed2c6 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go @@ -5,8 +5,8 @@ import ( "sync" "time" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) type FakeS struct { diff --git a/vendor/github.com/irifrance/gini/go.mod b/vendor/github.com/irifrance/gini/go.mod deleted file mode 100644 index cb2fe6da4d..0000000000 --- a/vendor/github.com/irifrance/gini/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/irifrance/gini diff --git a/vendor/github.com/irifrance/gini/.travis.yml b/vendor/github.com/operator-framework/gini/.travis.yml similarity index 100% rename from vendor/github.com/irifrance/gini/.travis.yml rename to vendor/github.com/operator-framework/gini/.travis.yml diff --git a/vendor/github.com/irifrance/gini/LICENSE b/vendor/github.com/operator-framework/gini/LICENSE similarity index 100% rename from vendor/github.com/irifrance/gini/LICENSE rename to vendor/github.com/operator-framework/gini/LICENSE diff --git a/vendor/github.com/irifrance/gini/README.md b/vendor/github.com/operator-framework/gini/README.md similarity index 94% rename from vendor/github.com/irifrance/gini/README.md rename to vendor/github.com/operator-framework/gini/README.md index ea1e025912..42d6ff2fb1 100644 --- a/vendor/github.com/irifrance/gini/README.md +++ b/vendor/github.com/operator-framework/gini/README.md @@ -9,7 +9,7 @@ the first ever performant pure-Go SAT solver made available. This solver is fully open source, originally developped at IRI France. -# Build/Install +## Build/Install For the impatient: @@ -22,7 +22,7 @@ safety threat to client code. This makes a signficant speed difference (maybe 1 problems. -# The SAT Problem +## The SAT Problem The SAT problem is perhaps the most famous NP-complete problem. As such, SAT solvers can be used to try to solve hard problems, such as travelling salesman @@ -40,7 +40,8 @@ useful. Readers interested in more depth should consult Wikipedia, or The Handbook of Satisfiability, or Donald Knuth's latest volume of The Art of Computer Programming. -## CNF +### CNF + A CNF is a conjunction of clauses c1 and c2 and ... and cM @@ -73,15 +74,16 @@ which expresses a set of clauses whose satisfying assignments are or {-1,-2,-3,-4} -## Models +### Models + A model of a CNF is a value for each of the variables which makes every clause in the CNF true. The SAT problem is determining whether or not a model exists for a given set of clauses. -## Proofs +### Proofs -### Resolution +#### Resolution Resolution is a form of logical reasoning with conjunctions of clauses. Given 2 clauses of the form @@ -114,7 +116,8 @@ even hard problems become tractable. With up to several tens of millions of resolutions happening per second on one modern single core CPU, even problems with known exponential bounds on resolution steps can be solved. -# Solving Formulas and Circuits +## Solving Formulas and Circuits + Gini provides a simple and efficient logic modelling library which supports easy construction of arbitrary Boolean formulas. The library uses and-inverter graphs, structural hashing, constant propagation and can be used for @@ -141,12 +144,14 @@ also contains lots of purely Boolean logic (implicitly or not). Most SAT use cases use a front end for modelling arbitrary formulas. When formats are needed for interchange, Gini supports the following. -## Aiger +### Aiger + Gini supports [aiger version 1.9](http://fmv.jku.at/aiger/) in conjunction with its logic library. The logic.C and logic.S circuit types can be stored, exchanged, read and written in aiger ascii and binary formats. -## Dimacs +### Dimacs + CNF Dimacs files, which are an ancient widely used format for representing CNF formulas. Dimacs files are usually used for benchmarking solvers, to eliminate the formula representation layer. The fact that the format is more or less @@ -155,7 +160,8 @@ format, even though there is I/O, CNF translation, and parsing overhead by comparison to using a logic library. -# Optimisation +## Optimisation + With Cardinality constraints, optimisation is easy import "github.com/irifrance/gini" @@ -193,7 +199,8 @@ With Cardinality constraints, optimisation is easy // use the model, if one was found, from s to propose a build -# Activation Literals +## Activation Literals + Gini supports recycling activation literals with the [Activatable interface](http://godoc.org/github.com/irifrance/gini/inter#Activatable) @@ -206,7 +213,8 @@ and constructing the clauses on the fly. Activations work underneath test scope assumptions, making the interface for Gini perhaps the most flexible available. -# Performance +## Performance + In applications, SAT problems normally have an exponential tail runtime distribution with a strong bias towards bigger problems populating the longer runtime part of the distribution. So in practice, a good rule of thumb is 1 in @@ -239,7 +247,8 @@ but we are confident Gini's core solver is a well positioned alternative to stan high-performance CDCL solvers in C/C++. We encourage you to give it a try and welcome any comparisons. -## Benchmarking +### Benchmarking + To that end, gini comes with a nifty SAT solver benchmarking tool which allows to easily select benchmarks into a "bench" format, which is just a particular structure of directories and files. The tool can then also run solvers @@ -254,21 +263,24 @@ software (SMT, CPLEX, etc) where runtimes vary and are unpredictable and potentially high. If you do so, please follow the license or ask for alternatives. -# Concurrency +## Concurrency + Gini is written in Go and uses several goroutines by default for garbage collection and system call scheduling. There is a "core" single-goroutine solver, xo, which is in an internal package for gutsy low level SAT hackers. -## Connections to solving processes +### Connections to solving processes + Gini provides safe connections to solving processes which are guaranteed to not lose any solution found, can pause and resume, run with a timeout, test without solving, etc. -## Solve-time copyable solvers. +### Solve-time copyable solvers. + Gini provides copyable solvers, which can be safely copied *at solvetime during a pause*. -## Ax +### Ax Gini provides an "Assumption eXchange" package for deploying solves under different sets of assumptions to the same set of underlying constraints in parallel. This can give linear speed up in tasks, such as PDR/IC3, which @@ -277,7 +289,7 @@ generate lots of assumptions. We hope to extend this with clause sharing soon, which would give superlinear speedup according to the literature. -# Distributed and CRISP +## Distributed and CRISP Gini provides a definition and reference implementation for [CRISP-1.0](https://github.com/irifrance/gini/blob/master/doc/crisp/crisp.pdf), @@ -308,3 +320,20 @@ a CRISP-1.0 client and server. A command, crispd, is supplied for the CRISP server. +## Citing Gini + +Zenodo DOI based citations and download: +[![DOI](https://zenodo.org/badge/64034957.svg)](https://zenodo.org/badge/latestdoi/64034957) + +BibText: +``` +@misc{scott_cotton_2019_2553490, + author = {Scott Cotton}, + title = {irifrance/gini: Sapeur}, + month = jan, + year = 2019, + doi = {10.5281/zenodo.2553490}, + url = {https://doi.org/10.5281/zenodo.2553490} +} +``` + diff --git a/vendor/github.com/irifrance/gini/dimacs/cfilt.go b/vendor/github.com/operator-framework/gini/dimacs/cfilt.go similarity index 100% rename from vendor/github.com/irifrance/gini/dimacs/cfilt.go rename to vendor/github.com/operator-framework/gini/dimacs/cfilt.go diff --git a/vendor/github.com/irifrance/gini/dimacs/cnf.go b/vendor/github.com/operator-framework/gini/dimacs/cnf.go similarity index 98% rename from vendor/github.com/irifrance/gini/dimacs/cnf.go rename to vendor/github.com/operator-framework/gini/dimacs/cnf.go index ef85dda700..c00451f51d 100644 --- a/vendor/github.com/irifrance/gini/dimacs/cnf.go +++ b/vendor/github.com/operator-framework/gini/dimacs/cnf.go @@ -6,8 +6,9 @@ package dimacs import ( "bufio" "fmt" - "github.com/irifrance/gini/z" "io" + + "github.com/operator-framework/gini/z" ) // Type Reader holds info for reading dimacs formatted intput. diff --git a/vendor/github.com/irifrance/gini/dimacs/doc.go b/vendor/github.com/operator-framework/gini/dimacs/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/dimacs/doc.go rename to vendor/github.com/operator-framework/gini/dimacs/doc.go diff --git a/vendor/github.com/irifrance/gini/dimacs/icnf.go b/vendor/github.com/operator-framework/gini/dimacs/icnf.go similarity index 96% rename from vendor/github.com/irifrance/gini/dimacs/icnf.go rename to vendor/github.com/operator-framework/gini/dimacs/icnf.go index b58ccc66fe..567762a1e9 100644 --- a/vendor/github.com/irifrance/gini/dimacs/icnf.go +++ b/vendor/github.com/operator-framework/gini/dimacs/icnf.go @@ -6,8 +6,9 @@ package dimacs import ( "bufio" "fmt" - "github.com/irifrance/gini/z" "io" + + "github.com/operator-framework/gini/z" ) type iCnfReader struct { diff --git a/vendor/github.com/irifrance/gini/dimacs/int.go b/vendor/github.com/operator-framework/gini/dimacs/int.go similarity index 100% rename from vendor/github.com/irifrance/gini/dimacs/int.go rename to vendor/github.com/operator-framework/gini/dimacs/int.go diff --git a/vendor/github.com/irifrance/gini/dimacs/lit.go b/vendor/github.com/operator-framework/gini/dimacs/lit.go similarity index 88% rename from vendor/github.com/irifrance/gini/dimacs/lit.go rename to vendor/github.com/operator-framework/gini/dimacs/lit.go index 2c4c41c1ab..9ed081687f 100644 --- a/vendor/github.com/irifrance/gini/dimacs/lit.go +++ b/vendor/github.com/operator-framework/gini/dimacs/lit.go @@ -5,7 +5,8 @@ package dimacs import ( "bufio" - "github.com/irifrance/gini/z" + + "github.com/operator-framework/gini/z" ) func readLit(r *bufio.Reader) (m z.Lit, e error) { diff --git a/vendor/github.com/irifrance/gini/dimacs/solve.go b/vendor/github.com/operator-framework/gini/dimacs/solve.go similarity index 100% rename from vendor/github.com/irifrance/gini/dimacs/solve.go rename to vendor/github.com/operator-framework/gini/dimacs/solve.go diff --git a/vendor/github.com/irifrance/gini/dimacs/vis.go b/vendor/github.com/operator-framework/gini/dimacs/vis.go similarity index 96% rename from vendor/github.com/irifrance/gini/dimacs/vis.go rename to vendor/github.com/operator-framework/gini/dimacs/vis.go index e0a5b4dff3..9934b37032 100644 --- a/vendor/github.com/irifrance/gini/dimacs/vis.go +++ b/vendor/github.com/operator-framework/gini/dimacs/vis.go @@ -3,7 +3,7 @@ package dimacs -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" // Type Vis provides a visitor interface to reading dimacs files. // diff --git a/vendor/github.com/irifrance/gini/doc.go b/vendor/github.com/operator-framework/gini/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/doc.go rename to vendor/github.com/operator-framework/gini/doc.go diff --git a/vendor/github.com/irifrance/gini/gini.go b/vendor/github.com/operator-framework/gini/gini.go similarity index 97% rename from vendor/github.com/irifrance/gini/gini.go rename to vendor/github.com/operator-framework/gini/gini.go index 30a254c48c..52a6d4d054 100644 --- a/vendor/github.com/irifrance/gini/gini.go +++ b/vendor/github.com/operator-framework/gini/gini.go @@ -7,10 +7,10 @@ import ( "io" "time" - "github.com/irifrance/gini/dimacs" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/internal/xo" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/dimacs" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/internal/xo" + "github.com/operator-framework/gini/z" ) // Gini is a concrete implementation of solver diff --git a/vendor/github.com/operator-framework/gini/go.mod b/vendor/github.com/operator-framework/gini/go.mod new file mode 100644 index 0000000000..15f34b3a9f --- /dev/null +++ b/vendor/github.com/operator-framework/gini/go.mod @@ -0,0 +1 @@ +module github.com/operator-framework/gini diff --git a/vendor/github.com/irifrance/gini/go.sum b/vendor/github.com/operator-framework/gini/go.sum similarity index 100% rename from vendor/github.com/irifrance/gini/go.sum rename to vendor/github.com/operator-framework/gini/go.sum diff --git a/vendor/github.com/irifrance/gini/inter/doc.go b/vendor/github.com/operator-framework/gini/inter/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/inter/doc.go rename to vendor/github.com/operator-framework/gini/inter/doc.go diff --git a/vendor/github.com/irifrance/gini/inter/s.go b/vendor/github.com/operator-framework/gini/inter/s.go similarity index 99% rename from vendor/github.com/irifrance/gini/inter/s.go rename to vendor/github.com/operator-framework/gini/inter/s.go index 7cd5f99f14..835a93375c 100644 --- a/vendor/github.com/irifrance/gini/inter/s.go +++ b/vendor/github.com/operator-framework/gini/inter/s.go @@ -6,7 +6,7 @@ package inter import ( "time" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Interface Solveable encapsulates a decision diff --git a/vendor/github.com/irifrance/gini/inter/solve.go b/vendor/github.com/operator-framework/gini/inter/solve.go similarity index 100% rename from vendor/github.com/irifrance/gini/inter/solve.go rename to vendor/github.com/operator-framework/gini/inter/solve.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/active.go b/vendor/github.com/operator-framework/gini/internal/xo/active.go similarity index 98% rename from vendor/github.com/irifrance/gini/internal/xo/active.go rename to vendor/github.com/operator-framework/gini/internal/xo/active.go index 2c991abf9b..786f76204f 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/active.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/active.go @@ -1,7 +1,7 @@ package xo import ( - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) type Active struct { diff --git a/vendor/github.com/irifrance/gini/internal/xo/cdat.go b/vendor/github.com/operator-framework/gini/internal/xo/cdat.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/cdat.go rename to vendor/github.com/operator-framework/gini/internal/xo/cdat.go index 5bb2b8d8b1..41b8367f0c 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/cdat.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/cdat.go @@ -9,7 +9,7 @@ import ( "io" "math" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Type CDat: basic operations for storing all the literals (and Chds) in a CNF diff --git a/vendor/github.com/irifrance/gini/internal/xo/cdb.go b/vendor/github.com/operator-framework/gini/internal/xo/cdb.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/cdb.go rename to vendor/github.com/operator-framework/gini/internal/xo/cdb.go index 5853e9d758..d4615220b9 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/cdb.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/cdb.go @@ -8,7 +8,7 @@ import ( "fmt" "io" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Type Cdb is the main interface to clauses. diff --git a/vendor/github.com/irifrance/gini/internal/xo/cgc.go b/vendor/github.com/operator-framework/gini/internal/xo/cgc.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/cgc.go rename to vendor/github.com/operator-framework/gini/internal/xo/cgc.go index 2f605660bd..94cc04e747 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/cgc.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/cgc.go @@ -6,7 +6,7 @@ package xo import ( "sort" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Type Cgc encapsulates clause compaction/garbage collection. diff --git a/vendor/github.com/irifrance/gini/internal/xo/chd.go b/vendor/github.com/operator-framework/gini/internal/xo/chd.go similarity index 100% rename from vendor/github.com/irifrance/gini/internal/xo/chd.go rename to vendor/github.com/operator-framework/gini/internal/xo/chd.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/cloc.go b/vendor/github.com/operator-framework/gini/internal/xo/cloc.go similarity index 82% rename from vendor/github.com/irifrance/gini/internal/xo/cloc.go rename to vendor/github.com/operator-framework/gini/internal/xo/cloc.go index ef08e9af49..158d40c3e1 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/cloc.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/cloc.go @@ -3,7 +3,7 @@ package xo -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" const ( CNull z.C = 0 diff --git a/vendor/github.com/irifrance/gini/internal/xo/ctl.go b/vendor/github.com/operator-framework/gini/internal/xo/ctl.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/ctl.go rename to vendor/github.com/operator-framework/gini/internal/xo/ctl.go index 3ac1969d97..5a2d25ee21 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/ctl.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/ctl.go @@ -4,9 +4,10 @@ package xo import ( - "github.com/irifrance/gini/z" "sync" "time" + + "github.com/operator-framework/gini/z" ) // Type Ctl encapsulates low level asynchronous control diff --git a/vendor/github.com/irifrance/gini/internal/xo/derive.go b/vendor/github.com/operator-framework/gini/internal/xo/derive.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/derive.go rename to vendor/github.com/operator-framework/gini/internal/xo/derive.go index 303de7b3dc..988acf99fc 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/derive.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/derive.go @@ -6,7 +6,7 @@ package xo import ( "fmt" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) type Deriver struct { diff --git a/vendor/github.com/irifrance/gini/internal/xo/dimacs.go b/vendor/github.com/operator-framework/gini/internal/xo/dimacs.go similarity index 91% rename from vendor/github.com/irifrance/gini/internal/xo/dimacs.go rename to vendor/github.com/operator-framework/gini/internal/xo/dimacs.go index 422e0a273a..9478b14a8b 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/dimacs.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/dimacs.go @@ -3,7 +3,7 @@ package xo -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" // Type DimacsVis implements dimacs.Vis for constructing // solvers from dimacs cnf files. diff --git a/vendor/github.com/irifrance/gini/internal/xo/doc.go b/vendor/github.com/operator-framework/gini/internal/xo/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/internal/xo/doc.go rename to vendor/github.com/operator-framework/gini/internal/xo/doc.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/guess.go b/vendor/github.com/operator-framework/gini/internal/xo/guess.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/guess.go rename to vendor/github.com/operator-framework/gini/internal/xo/guess.go index 84c94ce47f..f5d8414df8 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/guess.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/guess.go @@ -6,7 +6,7 @@ package xo import ( "math" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) const ( diff --git a/vendor/github.com/irifrance/gini/internal/xo/luby.go b/vendor/github.com/operator-framework/gini/internal/xo/luby.go similarity index 100% rename from vendor/github.com/irifrance/gini/internal/xo/luby.go rename to vendor/github.com/operator-framework/gini/internal/xo/luby.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/phases.go b/vendor/github.com/operator-framework/gini/internal/xo/phases.go similarity index 93% rename from vendor/github.com/irifrance/gini/internal/xo/phases.go rename to vendor/github.com/operator-framework/gini/internal/xo/phases.go index 295fbbe6c3..1f3bda755a 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/phases.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/phases.go @@ -1,6 +1,6 @@ package xo -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" type phases z.Var diff --git a/vendor/github.com/irifrance/gini/internal/xo/s.go b/vendor/github.com/operator-framework/gini/internal/xo/s.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/s.go rename to vendor/github.com/operator-framework/gini/internal/xo/s.go index 1ecbc24fb2..7d10639622 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/s.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/s.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "github.com/irifrance/gini/dimacs" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/dimacs" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) const ( diff --git a/vendor/github.com/irifrance/gini/internal/xo/stats.go b/vendor/github.com/operator-framework/gini/internal/xo/stats.go similarity index 100% rename from vendor/github.com/irifrance/gini/internal/xo/stats.go rename to vendor/github.com/operator-framework/gini/internal/xo/stats.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/tracer.go b/vendor/github.com/operator-framework/gini/internal/xo/tracer.go similarity index 100% rename from vendor/github.com/irifrance/gini/internal/xo/tracer.go rename to vendor/github.com/operator-framework/gini/internal/xo/tracer.go diff --git a/vendor/github.com/irifrance/gini/internal/xo/trail.go b/vendor/github.com/operator-framework/gini/internal/xo/trail.go similarity index 99% rename from vendor/github.com/irifrance/gini/internal/xo/trail.go rename to vendor/github.com/operator-framework/gini/internal/xo/trail.go index 2673242f9c..9f67388c8a 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/trail.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/trail.go @@ -7,7 +7,7 @@ import ( "bytes" "fmt" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) type late struct { diff --git a/vendor/github.com/irifrance/gini/internal/xo/vars.go b/vendor/github.com/operator-framework/gini/internal/xo/vars.go similarity index 98% rename from vendor/github.com/irifrance/gini/internal/xo/vars.go rename to vendor/github.com/operator-framework/gini/internal/xo/vars.go index 5f1dd03d41..02a25fd985 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/vars.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/vars.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) type Vars struct { diff --git a/vendor/github.com/irifrance/gini/internal/xo/watch.go b/vendor/github.com/operator-framework/gini/internal/xo/watch.go similarity index 97% rename from vendor/github.com/irifrance/gini/internal/xo/watch.go rename to vendor/github.com/operator-framework/gini/internal/xo/watch.go index ddf9050bb6..4e30635742 100644 --- a/vendor/github.com/irifrance/gini/internal/xo/watch.go +++ b/vendor/github.com/operator-framework/gini/internal/xo/watch.go @@ -6,7 +6,7 @@ package xo import ( "fmt" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Watch holds other blocking literal, clause location ( diff --git a/vendor/github.com/irifrance/gini/logic/c.go b/vendor/github.com/operator-framework/gini/logic/c.go similarity index 98% rename from vendor/github.com/irifrance/gini/logic/c.go rename to vendor/github.com/operator-framework/gini/logic/c.go index 9055ce2992..081d32cc62 100644 --- a/vendor/github.com/irifrance/gini/logic/c.go +++ b/vendor/github.com/operator-framework/gini/logic/c.go @@ -4,8 +4,8 @@ package logic import ( - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) // C represents a formula or combinational circuit. diff --git a/vendor/github.com/irifrance/gini/logic/card.go b/vendor/github.com/operator-framework/gini/logic/card.go similarity index 98% rename from vendor/github.com/irifrance/gini/logic/card.go rename to vendor/github.com/operator-framework/gini/logic/card.go index 4620141437..af63f2ff22 100644 --- a/vendor/github.com/irifrance/gini/logic/card.go +++ b/vendor/github.com/operator-framework/gini/logic/card.go @@ -4,7 +4,7 @@ package logic import ( - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/z" ) // Card provides an interface for different implementations diff --git a/vendor/github.com/irifrance/gini/logic/doc.go b/vendor/github.com/operator-framework/gini/logic/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/logic/doc.go rename to vendor/github.com/operator-framework/gini/logic/doc.go diff --git a/vendor/github.com/irifrance/gini/logic/roll.go b/vendor/github.com/operator-framework/gini/logic/roll.go similarity index 97% rename from vendor/github.com/irifrance/gini/logic/roll.go rename to vendor/github.com/operator-framework/gini/logic/roll.go index 967d2423e6..abd501997f 100644 --- a/vendor/github.com/irifrance/gini/logic/roll.go +++ b/vendor/github.com/operator-framework/gini/logic/roll.go @@ -3,7 +3,7 @@ package logic -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" // Roll creates an unroller of sequential logic into // combinational logic. diff --git a/vendor/github.com/irifrance/gini/logic/s.go b/vendor/github.com/operator-framework/gini/logic/s.go similarity index 98% rename from vendor/github.com/irifrance/gini/logic/s.go rename to vendor/github.com/operator-framework/gini/logic/s.go index 6b7e2e2e41..badcae2843 100644 --- a/vendor/github.com/irifrance/gini/logic/s.go +++ b/vendor/github.com/operator-framework/gini/logic/s.go @@ -3,7 +3,7 @@ package logic -import "github.com/irifrance/gini/z" +import "github.com/operator-framework/gini/z" // S adds sequential elements to C, gini's combinational // logic representation. diff --git a/vendor/github.com/irifrance/gini/s.go b/vendor/github.com/operator-framework/gini/s.go similarity index 84% rename from vendor/github.com/irifrance/gini/s.go rename to vendor/github.com/operator-framework/gini/s.go index 55d8ca319b..caa6281b6a 100644 --- a/vendor/github.com/irifrance/gini/s.go +++ b/vendor/github.com/operator-framework/gini/s.go @@ -3,7 +3,7 @@ package gini -import "github.com/irifrance/gini/inter" +import "github.com/operator-framework/gini/inter" // NewS creates a new solver, which is the Gini // implementation of inter.S. diff --git a/vendor/github.com/irifrance/gini/sv.go b/vendor/github.com/operator-framework/gini/sv.go similarity index 95% rename from vendor/github.com/irifrance/gini/sv.go rename to vendor/github.com/operator-framework/gini/sv.go index 58c6fc50a1..546b93c0c2 100644 --- a/vendor/github.com/irifrance/gini/sv.go +++ b/vendor/github.com/operator-framework/gini/sv.go @@ -6,8 +6,8 @@ package gini import ( "time" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) type svWrap struct { diff --git a/vendor/github.com/irifrance/gini/z/c.go b/vendor/github.com/operator-framework/gini/z/c.go similarity index 100% rename from vendor/github.com/irifrance/gini/z/c.go rename to vendor/github.com/operator-framework/gini/z/c.go diff --git a/vendor/github.com/irifrance/gini/z/doc.go b/vendor/github.com/operator-framework/gini/z/doc.go similarity index 100% rename from vendor/github.com/irifrance/gini/z/doc.go rename to vendor/github.com/operator-framework/gini/z/doc.go diff --git a/vendor/github.com/irifrance/gini/z/dv.go b/vendor/github.com/operator-framework/gini/z/dv.go similarity index 100% rename from vendor/github.com/irifrance/gini/z/dv.go rename to vendor/github.com/operator-framework/gini/z/dv.go diff --git a/vendor/github.com/irifrance/gini/z/lit.go b/vendor/github.com/operator-framework/gini/z/lit.go similarity index 100% rename from vendor/github.com/irifrance/gini/z/lit.go rename to vendor/github.com/operator-framework/gini/z/lit.go diff --git a/vendor/github.com/irifrance/gini/z/var.go b/vendor/github.com/operator-framework/gini/z/var.go similarity index 100% rename from vendor/github.com/irifrance/gini/z/var.go rename to vendor/github.com/operator-framework/gini/z/var.go diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go index 84ecb2fc1a..ca3c4f5331 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/irifrance/gini/logic" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/logic" + "github.com/operator-framework/gini/z" ) // Constraint implementations limit the circumstances under which a diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go index 39220fd52e..f837ffc3e8 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/logic" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/logic" + "github.com/operator-framework/gini/z" ) type DuplicateIdentifier Identifier diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go index 4344b444ed..f36678f1ee 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go @@ -3,8 +3,8 @@ package solver import ( "context" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) type choice struct { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go index 8f559569d7..712ae3bcc7 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "github.com/irifrance/gini" - "github.com/irifrance/gini/inter" - "github.com/irifrance/gini/z" + "github.com/operator-framework/gini" + "github.com/operator-framework/gini/inter" + "github.com/operator-framework/gini/z" ) var Incomplete = errors.New("cancelled before a solution could be found") diff --git a/vendor/modules.txt b/vendor/modules.txt index 705e1f54a8..b9012b727f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -331,13 +331,6 @@ github.com/huandu/xstrings github.com/imdario/mergo # github.com/inconshreveable/mousetrap v1.0.0 github.com/inconshreveable/mousetrap -# github.com/irifrance/gini v1.0.1 -github.com/irifrance/gini -github.com/irifrance/gini/dimacs -github.com/irifrance/gini/inter -github.com/irifrance/gini/internal/xo -github.com/irifrance/gini/logic -github.com/irifrance/gini/z # github.com/itchyny/astgen-go v0.0.0-20200519013840-cf3ea398f645 github.com/itchyny/astgen-go # github.com/itchyny/gojq v0.11.0 @@ -493,6 +486,13 @@ github.com/operator-framework/api/pkg/validation github.com/operator-framework/api/pkg/validation/errors github.com/operator-framework/api/pkg/validation/interfaces github.com/operator-framework/api/pkg/validation/internal +# github.com/operator-framework/gini v1.1.0 +github.com/operator-framework/gini +github.com/operator-framework/gini/dimacs +github.com/operator-framework/gini/inter +github.com/operator-framework/gini/internal/xo +github.com/operator-framework/gini/logic +github.com/operator-framework/gini/z # github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 => ./staging/operator-lifecycle-manager ## explicit github.com/operator-framework/operator-lifecycle-manager/cmd/catalog From ff357661bafa0f9d061d1c326ae224408b6b26a7 Mon Sep 17 00:00:00 2001 From: Kevin Rizza Date: Thu, 19 Aug 2021 12:07:47 -0400 Subject: [PATCH 22/45] Fix upstream-opm-builder (#758) Use mirrored base images as a temporary workaround for the docker.io rate limiting we are currently seeing in our builds Signed-off-by: kevinrizza Upstream-repository: operator-registry Upstream-commit: d487288d9a2ee9b8d68009a10a0541133ee1090f --- staging/operator-registry/upstream-opm-builder.Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/staging/operator-registry/upstream-opm-builder.Dockerfile b/staging/operator-registry/upstream-opm-builder.Dockerfile index 7d4d202562..ba8ca75b6a 100644 --- a/staging/operator-registry/upstream-opm-builder.Dockerfile +++ b/staging/operator-registry/upstream-opm-builder.Dockerfile @@ -3,7 +3,7 @@ ## GoReleaser to build and push multi-arch images for opm ## -FROM golang:1.16-alpine AS builder +FROM quay.io/operator-framework/golang:1.16-alpine AS builder RUN apk update && apk add sqlite build-base git mercurial bash WORKDIR /build @@ -14,7 +14,7 @@ RUN GRPC_HEALTH_PROBE_VERSION=v0.3.2 && \ wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-$(go env GOARCH) && \ chmod +x /bin/grpc_health_probe -FROM alpine +FROM quay.io/operator-framework/alpine RUN apk update && apk add ca-certificates COPY ["nsswitch.conf", "/etc/nsswitch.conf"] COPY --from=builder /build/bin/opm /bin/opm From a9f42e1e836ec075c597e9d0b2bbc4e78aaa9c5c Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 19 Aug 2021 09:12:46 -0700 Subject: [PATCH 23/45] feat(opm): configure diff to not include dependency bundles with --skip-deps (#753) Signed-off-by: Eric Stroczynski Upstream-repository: operator-registry Upstream-commit: 7fba6adb47680d28632f83b8418b75889af5cb3d --- .../cmd/opm/alpha/diff/cmd.go | 47 +++++--- .../operator-registry/internal/action/diff.go | 9 +- .../internal/declcfg/diff.go | 34 +++++- .../internal/declcfg/diff_test.go | 111 +++++++++++++++++- .../cmd/opm/alpha/diff/cmd.go | 47 +++++--- .../operator-registry/internal/action/diff.go | 9 +- .../internal/declcfg/diff.go | 34 +++++- 7 files changed, 241 insertions(+), 50 deletions(-) diff --git a/staging/operator-registry/cmd/opm/alpha/diff/cmd.go b/staging/operator-registry/cmd/opm/alpha/diff/cmd.go index 5da7e92887..eb07262963 100644 --- a/staging/operator-registry/cmd/opm/alpha/diff/cmd.go +++ b/staging/operator-registry/cmd/opm/alpha/diff/cmd.go @@ -24,8 +24,9 @@ const ( ) type diff struct { - oldRefs []string - newRefs []string + oldRefs []string + newRefs []string + skipDeps bool output string caFile string @@ -59,6 +60,8 @@ in which case they are not included in the diff, or a new ref, in which case they are included. Dependencies provided by some catalog unknown to 'opm alpha diff' will not cause the command to error, but an error will occur if that catalog is not serving these dependencies at runtime. +Dependency inclusion can be turned off with --no-deps, although this is not recommended +unless you are certain some in-cluster catalog satisfies all dependencies. NOTE: for now, if any dependency exists, the entire dependency's package is added to the diff. In the future, these packages will be pruned such that only the latest dependencies @@ -66,19 +69,24 @@ satisfying a package version range or GVK, and their upgrade graph(s) to their l channel head(s), are included in the diff. `), Example: templates.Examples(` -# Diff a catalog at some old state and latest state into a declarative config index. -mkdir -p catalog-index -opm alpha diff registry.org/my-catalog:abc123 registry.org/my-catalog:def456 -o yaml > ./my-catalog-index/index.yaml +# Create a directory for your declarative config diff. +mkdir -p my-catalog-index -# Build and push this index into an index image. -opm alpha generate dockerfile ./my-catalog-index -docker build -t registry.org/my-catalog:latest-abc123-def456 -f index.Dockerfile . -docker push registry.org/my-catalog:latest-abc123-def456 +# THEN: +# Create a new catalog from a diff between an old and the latest +# state of a catalog as a declarative config index. +opm alpha diff registry.org/my-catalog:abc123 registry.org/my-catalog:def456 -o yaml > ./my-catalog-index/index.yaml -# Create a new catalog from the heads of an existing catalog, then build and push the image like above. +# OR: +# Create a new catalog from the heads of an existing catalog. opm alpha diff registry.org/my-catalog:def456 -o yaml > my-catalog-index/index.yaml -docker build -t registry.org/my-catalog:headsonly-def456 -f index.Dockerfile . -docker push registry.org/my-catalog:headsonly-def456 + +# FINALLY: +# Build an index image containing the diff-ed declarative config, +# then tag and push it. +opm alpha generate dockerfile ./my-catalog-index +docker build -t registry.org/my-catalog:diff-latest -f index.Dockerfile . +docker push registry.org/my-catalog:diff-latest `), Args: cobra.RangeArgs(1, 2), PreRunE: func(cmd *cobra.Command, args []string) error { @@ -91,6 +99,8 @@ docker push registry.org/my-catalog:headsonly-def456 RunE: a.addFunc, } + cmd.Flags().BoolVar(&a.skipDeps, "skip-deps", false, "do not include bundle dependencies in the output catalog") + cmd.Flags().StringVarP(&a.output, "output", "o", "yaml", "Output format (json|yaml)") cmd.Flags().StringVarP(&a.caFile, "ca-file", "", "", "the root Certificates to use with this command") @@ -103,7 +113,7 @@ func (a *diff) addFunc(cmd *cobra.Command, args []string) error { skipTLS, err := cmd.Flags().GetBool("skip-tls") if err != nil { - panic(err) + logrus.Panic(err) } var write func(declcfg.DeclarativeConfig, io.Writer) error @@ -134,10 +144,11 @@ func (a *diff) addFunc(cmd *cobra.Command, args []string) error { defer cancel() diff := action.Diff{ - Registry: reg, - OldRefs: a.oldRefs, - NewRefs: a.newRefs, - Logger: a.logger, + Registry: reg, + OldRefs: a.oldRefs, + NewRefs: a.newRefs, + SkipDependencies: a.skipDeps, + Logger: a.logger, } cfg, err := diff.Run(ctx) if err != nil { @@ -159,7 +170,7 @@ func (a *diff) parseArgs(args []string) { case 2: old, new = args[0], args[1] default: - panic("should never be here, CLI must enforce arg size") + logrus.Panic("should never be here, CLI must enforce arg size") } if old != "" { a.oldRefs = strings.Split(old, ",") diff --git a/staging/operator-registry/internal/action/diff.go b/staging/operator-registry/internal/action/diff.go index 6b022a1379..7dd192f607 100644 --- a/staging/operator-registry/internal/action/diff.go +++ b/staging/operator-registry/internal/action/diff.go @@ -17,6 +17,9 @@ type Diff struct { OldRefs []string NewRefs []string + // SkipDependencies directs Run() to not include dependencies + // of bundles included in the diff if true. + SkipDependencies bool Logger *logrus.Entry } @@ -59,7 +62,11 @@ func (a Diff) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { return nil, fmt.Errorf("error converting new declarative config to model: %v", err) } - diffModel, err := declcfg.Diff(oldModel, newModel) + g := &declcfg.DiffGenerator{ + Logger: a.Logger, + SkipDependencies: a.SkipDependencies, + } + diffModel, err := g.Run(oldModel, newModel) if err != nil { return nil, fmt.Errorf("error generating diff: %v", err) } diff --git a/staging/operator-registry/internal/declcfg/diff.go b/staging/operator-registry/internal/declcfg/diff.go index f1fb9259b0..8f1cf6b41c 100644 --- a/staging/operator-registry/internal/declcfg/diff.go +++ b/staging/operator-registry/internal/declcfg/diff.go @@ -3,19 +3,41 @@ package declcfg import ( "reflect" "sort" + "sync" "github.com/blang/semver" "github.com/mitchellh/hashstructure/v2" + "github.com/sirupsen/logrus" "github.com/operator-framework/operator-registry/internal/model" "github.com/operator-framework/operator-registry/internal/property" ) -// Diff returns a Model containing everything in newModel not in oldModel, +// DiffGenerator configures how diffs are created via Run(). +type DiffGenerator struct { + Logger *logrus.Entry + + // SkipDependencies directs Run() to not include dependencies + // of bundles included in the diff if true. + SkipDependencies bool + + initOnce sync.Once +} + +func (g *DiffGenerator) init() { + g.initOnce.Do(func() { + if g.Logger == nil { + g.Logger = &logrus.Entry{} + } + }) +} + +// Run returns a Model containing everything in newModel not in oldModel, // and all bundles that exist in oldModel but are different in newModel. // If oldModel is empty, only channel heads in newModel's packages are // added to the output Model. All dependencies not in oldModel are also added. -func Diff(oldModel, newModel model.Model) (model.Model, error) { +func (g *DiffGenerator) Run(oldModel, newModel model.Model) (model.Model, error) { + g.init() // TODO(estroz): loading both oldModel and newModel into memory may // exceed process/hardware limits. Instead, store models on-disk then @@ -71,9 +93,11 @@ func Diff(oldModel, newModel model.Model) (model.Model, error) { } } - // Add dependencies to outputModel not already present in oldModel. - if err := addAllDependencies(newModel, oldModel, outputModel); err != nil { - return nil, err + if !g.SkipDependencies { + // Add dependencies to outputModel not already present in oldModel. + if err := addAllDependencies(newModel, oldModel, outputModel); err != nil { + return nil, err + } } // Default channel may not have been copied, so set it to the new default channel here. diff --git a/staging/operator-registry/internal/declcfg/diff_test.go b/staging/operator-registry/internal/declcfg/diff_test.go index fd52b625eb..3cfc17d81c 100644 --- a/staging/operator-registry/internal/declcfg/diff_test.go +++ b/staging/operator-registry/internal/declcfg/diff_test.go @@ -20,6 +20,7 @@ func init() { func TestDiffLatest(t *testing.T) { type spec struct { name string + g *DiffGenerator oldCfg DeclarativeConfig newCfg DeclarativeConfig expCfg DeclarativeConfig @@ -31,6 +32,7 @@ func TestDiffLatest(t *testing.T) { name: "NoDiff/Empty", oldCfg: DeclarativeConfig{}, newCfg: DeclarativeConfig{}, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{}, }, { @@ -77,6 +79,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{}, }, { @@ -123,6 +126,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{}, }, { @@ -170,6 +174,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, @@ -304,6 +309,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, @@ -420,6 +426,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, @@ -501,6 +508,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -607,6 +615,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -725,6 +734,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -826,6 +836,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -942,6 +953,7 @@ func TestDiffLatest(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -993,7 +1005,7 @@ func TestDiffLatest(t *testing.T) { newModel, err := ConvertToModel(s.newCfg) require.NoError(t, err) - outputModel, err := Diff(oldModel, newModel) + outputModel, err := s.g.Run(oldModel, newModel) s.assertion(t, err) outputCfg := ConvertFromModel(outputModel) @@ -1005,6 +1017,7 @@ func TestDiffLatest(t *testing.T) { func TestDiffHeadsOnly(t *testing.T) { type spec struct { name string + g *DiffGenerator newCfg DeclarativeConfig expCfg DeclarativeConfig assertion require.ErrorAssertionFunc @@ -1014,6 +1027,7 @@ func TestDiffHeadsOnly(t *testing.T) { { name: "NoDiff/Empty", newCfg: DeclarativeConfig{}, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{}, }, { @@ -1039,6 +1053,7 @@ func TestDiffHeadsOnly(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, @@ -1152,6 +1167,7 @@ func TestDiffHeadsOnly(t *testing.T) { }, }, }, + g: &DiffGenerator{}, expCfg: DeclarativeConfig{ Packages: []Package{ {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, @@ -1202,6 +1218,97 @@ func TestDiffHeadsOnly(t *testing.T) { }, }, }, + { + // Testing SkipDependencies only really makes sense in heads-only mode, + // since new dependencies are always added. + name: "HasDiff/SkipDependencies", + newCfg: DeclarativeConfig{ + Packages: []Package{ + {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, + }, + Channels: []Channel{ + {Schema: schemaChannel, Name: "stable", Package: "etcd", Entries: []ChannelEntry{ + {Name: "etcd.v0.9.1"}, + {Name: "etcd.v0.9.2", Replaces: "etcd.v0.9.1"}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "foo", Entries: []ChannelEntry{ + {Name: "foo.v0.1.0"}, + }}, + }, + Bundles: []Bundle{ + { + Schema: schemaBundle, + Name: "foo.v0.1.0", + Package: "foo", + Image: "reg/foo:latest", + Properties: []property.Property{ + property.MustBuildPackageRequired("etcd", "<=0.9.1"), + property.MustBuildPackage("foo", "0.1.0"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.1", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.1"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.2", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.2"), + }, + }, + }, + }, + g: &DiffGenerator{ + SkipDependencies: true, + }, + expCfg: DeclarativeConfig{ + Packages: []Package{ + {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, + }, + Channels: []Channel{ + {Schema: schemaChannel, Name: "stable", Package: "etcd", Entries: []ChannelEntry{ + {Name: "etcd.v0.9.2", Replaces: "etcd.v0.9.1"}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "foo", Entries: []ChannelEntry{ + {Name: "foo.v0.1.0"}, + }}, + }, + Bundles: []Bundle{ + { + Schema: schemaBundle, + Name: "etcd.v0.9.2", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.2"), + }, + }, + { + Schema: schemaBundle, + Name: "foo.v0.1.0", + Package: "foo", + Image: "reg/foo:latest", + Properties: []property.Property{ + property.MustBuildPackage("foo", "0.1.0"), + property.MustBuildPackageRequired("etcd", "<=0.9.1"), + }, + }, + }, + }, + }, } for _, s := range specs { @@ -1213,7 +1320,7 @@ func TestDiffHeadsOnly(t *testing.T) { newModel, err := ConvertToModel(s.newCfg) require.NoError(t, err) - outputModel, err := Diff(model.Model{}, newModel) + outputModel, err := s.g.Run(model.Model{}, newModel) s.assertion(t, err) outputCfg := ConvertFromModel(outputModel) diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go index 5da7e92887..eb07262963 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go @@ -24,8 +24,9 @@ const ( ) type diff struct { - oldRefs []string - newRefs []string + oldRefs []string + newRefs []string + skipDeps bool output string caFile string @@ -59,6 +60,8 @@ in which case they are not included in the diff, or a new ref, in which case they are included. Dependencies provided by some catalog unknown to 'opm alpha diff' will not cause the command to error, but an error will occur if that catalog is not serving these dependencies at runtime. +Dependency inclusion can be turned off with --no-deps, although this is not recommended +unless you are certain some in-cluster catalog satisfies all dependencies. NOTE: for now, if any dependency exists, the entire dependency's package is added to the diff. In the future, these packages will be pruned such that only the latest dependencies @@ -66,19 +69,24 @@ satisfying a package version range or GVK, and their upgrade graph(s) to their l channel head(s), are included in the diff. `), Example: templates.Examples(` -# Diff a catalog at some old state and latest state into a declarative config index. -mkdir -p catalog-index -opm alpha diff registry.org/my-catalog:abc123 registry.org/my-catalog:def456 -o yaml > ./my-catalog-index/index.yaml +# Create a directory for your declarative config diff. +mkdir -p my-catalog-index -# Build and push this index into an index image. -opm alpha generate dockerfile ./my-catalog-index -docker build -t registry.org/my-catalog:latest-abc123-def456 -f index.Dockerfile . -docker push registry.org/my-catalog:latest-abc123-def456 +# THEN: +# Create a new catalog from a diff between an old and the latest +# state of a catalog as a declarative config index. +opm alpha diff registry.org/my-catalog:abc123 registry.org/my-catalog:def456 -o yaml > ./my-catalog-index/index.yaml -# Create a new catalog from the heads of an existing catalog, then build and push the image like above. +# OR: +# Create a new catalog from the heads of an existing catalog. opm alpha diff registry.org/my-catalog:def456 -o yaml > my-catalog-index/index.yaml -docker build -t registry.org/my-catalog:headsonly-def456 -f index.Dockerfile . -docker push registry.org/my-catalog:headsonly-def456 + +# FINALLY: +# Build an index image containing the diff-ed declarative config, +# then tag and push it. +opm alpha generate dockerfile ./my-catalog-index +docker build -t registry.org/my-catalog:diff-latest -f index.Dockerfile . +docker push registry.org/my-catalog:diff-latest `), Args: cobra.RangeArgs(1, 2), PreRunE: func(cmd *cobra.Command, args []string) error { @@ -91,6 +99,8 @@ docker push registry.org/my-catalog:headsonly-def456 RunE: a.addFunc, } + cmd.Flags().BoolVar(&a.skipDeps, "skip-deps", false, "do not include bundle dependencies in the output catalog") + cmd.Flags().StringVarP(&a.output, "output", "o", "yaml", "Output format (json|yaml)") cmd.Flags().StringVarP(&a.caFile, "ca-file", "", "", "the root Certificates to use with this command") @@ -103,7 +113,7 @@ func (a *diff) addFunc(cmd *cobra.Command, args []string) error { skipTLS, err := cmd.Flags().GetBool("skip-tls") if err != nil { - panic(err) + logrus.Panic(err) } var write func(declcfg.DeclarativeConfig, io.Writer) error @@ -134,10 +144,11 @@ func (a *diff) addFunc(cmd *cobra.Command, args []string) error { defer cancel() diff := action.Diff{ - Registry: reg, - OldRefs: a.oldRefs, - NewRefs: a.newRefs, - Logger: a.logger, + Registry: reg, + OldRefs: a.oldRefs, + NewRefs: a.newRefs, + SkipDependencies: a.skipDeps, + Logger: a.logger, } cfg, err := diff.Run(ctx) if err != nil { @@ -159,7 +170,7 @@ func (a *diff) parseArgs(args []string) { case 2: old, new = args[0], args[1] default: - panic("should never be here, CLI must enforce arg size") + logrus.Panic("should never be here, CLI must enforce arg size") } if old != "" { a.oldRefs = strings.Split(old, ",") diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go b/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go index 6b022a1379..7dd192f607 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go +++ b/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go @@ -17,6 +17,9 @@ type Diff struct { OldRefs []string NewRefs []string + // SkipDependencies directs Run() to not include dependencies + // of bundles included in the diff if true. + SkipDependencies bool Logger *logrus.Entry } @@ -59,7 +62,11 @@ func (a Diff) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { return nil, fmt.Errorf("error converting new declarative config to model: %v", err) } - diffModel, err := declcfg.Diff(oldModel, newModel) + g := &declcfg.DiffGenerator{ + Logger: a.Logger, + SkipDependencies: a.SkipDependencies, + } + diffModel, err := g.Run(oldModel, newModel) if err != nil { return nil, fmt.Errorf("error generating diff: %v", err) } diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go b/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go index f1fb9259b0..8f1cf6b41c 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go +++ b/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go @@ -3,19 +3,41 @@ package declcfg import ( "reflect" "sort" + "sync" "github.com/blang/semver" "github.com/mitchellh/hashstructure/v2" + "github.com/sirupsen/logrus" "github.com/operator-framework/operator-registry/internal/model" "github.com/operator-framework/operator-registry/internal/property" ) -// Diff returns a Model containing everything in newModel not in oldModel, +// DiffGenerator configures how diffs are created via Run(). +type DiffGenerator struct { + Logger *logrus.Entry + + // SkipDependencies directs Run() to not include dependencies + // of bundles included in the diff if true. + SkipDependencies bool + + initOnce sync.Once +} + +func (g *DiffGenerator) init() { + g.initOnce.Do(func() { + if g.Logger == nil { + g.Logger = &logrus.Entry{} + } + }) +} + +// Run returns a Model containing everything in newModel not in oldModel, // and all bundles that exist in oldModel but are different in newModel. // If oldModel is empty, only channel heads in newModel's packages are // added to the output Model. All dependencies not in oldModel are also added. -func Diff(oldModel, newModel model.Model) (model.Model, error) { +func (g *DiffGenerator) Run(oldModel, newModel model.Model) (model.Model, error) { + g.init() // TODO(estroz): loading both oldModel and newModel into memory may // exceed process/hardware limits. Instead, store models on-disk then @@ -71,9 +93,11 @@ func Diff(oldModel, newModel model.Model) (model.Model, error) { } } - // Add dependencies to outputModel not already present in oldModel. - if err := addAllDependencies(newModel, oldModel, outputModel); err != nil { - return nil, err + if !g.SkipDependencies { + // Add dependencies to outputModel not already present in oldModel. + if err := addAllDependencies(newModel, oldModel, outputModel); err != nil { + return nil, err + } } // Default channel may not have been copied, so set it to the new default channel here. From 0e7d985a5042269b61ed75e8e0d566fb750937d3 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Thu, 19 Aug 2021 14:03:46 -0400 Subject: [PATCH 24/45] move internal to alpha to make subpackages available for importing from other projects (#759) Signed-off-by: Joe Lanford Upstream-repository: operator-registry Upstream-commit: a0bb1e5b6d1ad34154fe205401dbd6ee6c4276bb --- staging/operator-registry/Makefile | 2 +- .../operator-registry/{internal => alpha}/action/diff.go | 4 ++-- .../{internal => alpha}/action/diff_test.go | 4 ++-- .../{internal => alpha}/action/generate_dockerfile.go | 0 .../action/generate_dockerfile_test.go | 0 .../operator-registry/{internal => alpha}/action/init.go | 2 +- .../{internal => alpha}/action/init_test.go | 4 ++-- .../operator-registry/alpha}/action/list.go | 4 ++-- .../{internal => alpha}/action/list_test.go | 0 .../{internal => alpha}/action/render.go | 4 ++-- .../{internal => alpha}/action/render_test.go | 6 +++--- .../action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile | 0 .../testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v0.1.0/metadata/annotations.yaml | 0 .../action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile | 0 .../testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v0.2.0/metadata/annotations.yaml | 0 .../action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile | 0 .../testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v1.0.0/metadata/annotations.yaml | 0 .../action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile | 0 .../testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.0.0/metadata/annotations.yaml | 0 .../action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile | 0 .../testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.0.1/metadata/annotations.yaml | 0 .../action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile | 0 .../testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.1.0/metadata/annotations.yaml | 0 .../action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile | 0 .../foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml | 0 .../foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.1.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.1.0/metadata/dependencies.yaml | 0 .../action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile | 0 .../foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml | 0 .../foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.2.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.2.0/metadata/dependencies.yaml | 0 .../action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile | 0 .../testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml | 0 .../foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.3.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.3.0/metadata/dependencies.yaml | 0 .../action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile | 0 .../testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml | 0 .../foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.3.1/metadata/annotations.yaml | 0 .../foo-bundle-v0.3.1/metadata/dependencies.yaml | 0 .../testdata/foo-index-v0.2.0-declcfg/foo/index.yaml | 0 .../testdata/index-declcfgs/exp-headsonly/index.yaml | 0 .../action/testdata/index-declcfgs/exp-latest/index.yaml | 0 .../action/testdata/index-declcfgs/latest/index.yaml | 0 .../action/testdata/index-declcfgs/old/index.yaml | 0 .../action/testdata/list-index/bar/index.yaml | 0 .../action/testdata/list-index/foo/index.yaml | 0 .../operator-registry/alpha}/declcfg/declcfg.go | 2 +- .../operator-registry/alpha}/declcfg/declcfg_to_model.go | 5 +++-- .../{internal => alpha}/declcfg/declcfg_to_model_test.go | 3 ++- .../{internal => alpha}/declcfg/diff.go | 4 ++-- .../{internal => alpha}/declcfg/diff_test.go | 4 ++-- .../{internal => alpha}/declcfg/helpers_test.go | 4 ++-- .../{internal => alpha}/declcfg/load.go | 2 +- .../{internal => alpha}/declcfg/load_test.go | 2 +- .../operator-registry/alpha}/declcfg/model_to_declcfg.go | 4 ++-- .../{internal => alpha}/declcfg/model_to_declcfg_test.go | 2 +- .../{internal => alpha}/declcfg/write.go | 0 .../{internal => alpha}/declcfg/write_test.go | 0 staging/operator-registry/alpha/doc.go | 9 +++++++++ .../operator-registry/{internal => alpha}/model/error.go | 0 .../{internal => alpha}/model/error_test.go | 0 .../operator-registry/alpha}/model/model.go | 2 +- .../{internal => alpha}/model/model_test.go | 2 +- .../{internal => alpha}/property/errors.go | 0 .../{internal => alpha}/property/property.go | 0 .../{internal => alpha}/property/property_test.go | 0 .../{internal => alpha}/property/scheme.go | 0 .../{internal => alpha}/property/scheme_test.go | 0 staging/operator-registry/cmd/opm/alpha/diff/cmd.go | 4 ++-- staging/operator-registry/cmd/opm/alpha/generate/cmd.go | 2 +- staging/operator-registry/cmd/opm/alpha/list/cmd.go | 2 +- staging/operator-registry/cmd/opm/init/cmd.go | 4 ++-- staging/operator-registry/cmd/opm/render/cmd.go | 4 ++-- staging/operator-registry/cmd/opm/serve/serve.go | 2 +- staging/operator-registry/pkg/api/api_to_model.go | 4 ++-- staging/operator-registry/pkg/api/conversion_test.go | 4 ++-- staging/operator-registry/pkg/api/model_to_api.go | 4 ++-- staging/operator-registry/pkg/lib/config/validate.go | 2 +- .../operator-registry/pkg/lib/registry/registry_test.go | 4 ++-- staging/operator-registry/pkg/registry/query.go | 2 +- staging/operator-registry/pkg/registry/query_test.go | 2 +- .../operator-registry/pkg/registry/registry_to_model.go | 4 ++-- .../pkg/registry/registry_to_model_test.go | 4 ++-- staging/operator-registry/pkg/sqlite/conversion.go | 2 +- .../operator-registry/{internal => alpha}/action/diff.go | 4 ++-- .../{internal => alpha}/action/generate_dockerfile.go | 0 .../operator-registry/{internal => alpha}/action/init.go | 2 +- .../operator-registry/alpha}/action/list.go | 4 ++-- .../{internal => alpha}/action/render.go | 4 ++-- .../testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v0.1.0/metadata/annotations.yaml | 0 .../testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v0.2.0/metadata/annotations.yaml | 0 .../testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml | 0 .../bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml | 0 .../testdata/bar-bundle-v1.0.0/metadata/annotations.yaml | 0 .../testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.0.0/metadata/annotations.yaml | 0 .../testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.0.1/metadata/annotations.yaml | 0 .../testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml | 0 .../baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml | 0 .../testdata/baz-bundle-v1.1.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml | 0 .../foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.1.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.1.0/metadata/dependencies.yaml | 0 .../foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml | 0 .../foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.2.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.2.0/metadata/dependencies.yaml | 0 .../testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml | 0 .../foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.3.0/metadata/annotations.yaml | 0 .../foo-bundle-v0.3.0/metadata/dependencies.yaml | 0 .../testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml | 0 .../foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml | 0 .../testdata/foo-bundle-v0.3.1/metadata/annotations.yaml | 0 .../foo-bundle-v0.3.1/metadata/dependencies.yaml | 0 .../testdata/foo-index-v0.2.0-declcfg/foo/index.yaml | 0 .../testdata/index-declcfgs/exp-headsonly/index.yaml | 0 .../action/testdata/index-declcfgs/exp-latest/index.yaml | 0 .../action/testdata/index-declcfgs/latest/index.yaml | 0 .../action/testdata/index-declcfgs/old/index.yaml | 0 .../operator-registry/alpha}/declcfg/declcfg.go | 2 +- .../operator-registry/alpha}/declcfg/declcfg_to_model.go | 5 +++-- .../{internal => alpha}/declcfg/diff.go | 4 ++-- .../{internal => alpha}/declcfg/load.go | 2 +- .../operator-registry/alpha}/declcfg/model_to_declcfg.go | 4 ++-- .../{internal => alpha}/declcfg/write.go | 0 .../operator-registry/{internal => alpha}/model/error.go | 0 .../operator-registry/alpha}/model/model.go | 2 +- .../{internal => alpha}/property/errors.go | 0 .../{internal => alpha}/property/property.go | 0 .../{internal => alpha}/property/scheme.go | 0 .../operator-registry/cmd/opm/alpha/diff/cmd.go | 4 ++-- .../operator-registry/cmd/opm/alpha/generate/cmd.go | 2 +- .../operator-registry/cmd/opm/alpha/list/cmd.go | 2 +- .../operator-registry/cmd/opm/init/cmd.go | 4 ++-- .../operator-registry/cmd/opm/render/cmd.go | 4 ++-- .../operator-registry/cmd/opm/serve/serve.go | 2 +- .../operator-registry/pkg/api/api_to_model.go | 4 ++-- .../operator-registry/pkg/api/model_to_api.go | 4 ++-- .../operator-registry/pkg/lib/config/validate.go | 2 +- .../operator-registry/pkg/registry/query.go | 2 +- .../operator-registry/pkg/registry/registry_to_model.go | 4 ++-- .../operator-registry/pkg/sqlite/conversion.go | 2 +- vendor/modules.txt | 8 ++++---- 168 files changed, 107 insertions(+), 95 deletions(-) rename staging/operator-registry/{internal => alpha}/action/diff.go (94%) rename staging/operator-registry/{internal => alpha}/action/diff_test.go (97%) rename staging/operator-registry/{internal => alpha}/action/generate_dockerfile.go (100%) rename staging/operator-registry/{internal => alpha}/action/generate_dockerfile_test.go (100%) rename staging/operator-registry/{internal => alpha}/action/init.go (94%) rename staging/operator-registry/{internal => alpha}/action/init_test.go (95%) rename {vendor/github.com/operator-framework/operator-registry/internal => staging/operator-registry/alpha}/action/list.go (97%) rename staging/operator-registry/{internal => alpha}/action/list_test.go (100%) rename staging/operator-registry/{internal => alpha}/action/render.go (98%) rename staging/operator-registry/{internal => alpha}/action/render_test.go (99%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/exp-headsonly/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/exp-latest/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/latest/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/old/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/list-index/bar/index.yaml (100%) rename staging/operator-registry/{internal => alpha}/action/testdata/list-index/foo/index.yaml (100%) rename {vendor/github.com/operator-framework/operator-registry/internal => staging/operator-registry/alpha}/declcfg/declcfg.go (97%) rename {vendor/github.com/operator-framework/operator-registry/internal => staging/operator-registry/alpha}/declcfg/declcfg_to_model.go (96%) rename staging/operator-registry/{internal => alpha}/declcfg/declcfg_to_model_test.go (99%) rename staging/operator-registry/{internal => alpha}/declcfg/diff.go (98%) rename staging/operator-registry/{internal => alpha}/declcfg/diff_test.go (99%) rename staging/operator-registry/{internal => alpha}/declcfg/helpers_test.go (98%) rename staging/operator-registry/{internal => alpha}/declcfg/load.go (98%) rename staging/operator-registry/{internal => alpha}/declcfg/load_test.go (99%) rename {vendor/github.com/operator-framework/operator-registry/internal => staging/operator-registry/alpha}/declcfg/model_to_declcfg.go (95%) rename staging/operator-registry/{internal => alpha}/declcfg/model_to_declcfg_test.go (90%) rename staging/operator-registry/{internal => alpha}/declcfg/write.go (100%) rename staging/operator-registry/{internal => alpha}/declcfg/write_test.go (100%) create mode 100644 staging/operator-registry/alpha/doc.go rename staging/operator-registry/{internal => alpha}/model/error.go (100%) rename staging/operator-registry/{internal => alpha}/model/error_test.go (100%) rename {vendor/github.com/operator-framework/operator-registry/internal => staging/operator-registry/alpha}/model/model.go (99%) rename staging/operator-registry/{internal => alpha}/model/model_test.go (99%) rename staging/operator-registry/{internal => alpha}/property/errors.go (100%) rename staging/operator-registry/{internal => alpha}/property/property.go (100%) rename staging/operator-registry/{internal => alpha}/property/property_test.go (100%) rename staging/operator-registry/{internal => alpha}/property/scheme.go (100%) rename staging/operator-registry/{internal => alpha}/property/scheme_test.go (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/diff.go (94%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/generate_dockerfile.go (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/init.go (94%) rename {staging/operator-registry/internal => vendor/github.com/operator-framework/operator-registry/alpha}/action/list.go (97%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/render.go (98%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/exp-headsonly/index.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/exp-latest/index.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/latest/index.yaml (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/action/testdata/index-declcfgs/old/index.yaml (100%) rename {staging/operator-registry/internal => vendor/github.com/operator-framework/operator-registry/alpha}/declcfg/declcfg.go (97%) rename {staging/operator-registry/internal => vendor/github.com/operator-framework/operator-registry/alpha}/declcfg/declcfg_to_model.go (96%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/declcfg/diff.go (98%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/declcfg/load.go (98%) rename {staging/operator-registry/internal => vendor/github.com/operator-framework/operator-registry/alpha}/declcfg/model_to_declcfg.go (95%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/declcfg/write.go (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/model/error.go (100%) rename {staging/operator-registry/internal => vendor/github.com/operator-framework/operator-registry/alpha}/model/model.go (99%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/property/errors.go (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/property/property.go (100%) rename vendor/github.com/operator-framework/operator-registry/{internal => alpha}/property/scheme.go (100%) diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index 9cc53655f6..74aa69f4a9 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -57,7 +57,7 @@ static: build .PHONY: unit unit: - $(GO) test -coverprofile=coverage.out $(SPECIFIC_UNIT_TEST) $(TAGS) $(TEST_RACE) -count=1 -v ./pkg/... ./internal/... + $(GO) test -coverprofile=coverage.out $(SPECIFIC_UNIT_TEST) $(TAGS) $(TEST_RACE) -count=1 -v ./pkg/... ./alpha/... .PHONY: sanity-check sanity-check: diff --git a/staging/operator-registry/internal/action/diff.go b/staging/operator-registry/alpha/action/diff.go similarity index 94% rename from staging/operator-registry/internal/action/diff.go rename to staging/operator-registry/alpha/action/diff.go index 7dd192f607..4f7427f95a 100644 --- a/staging/operator-registry/internal/action/diff.go +++ b/staging/operator-registry/alpha/action/diff.go @@ -7,8 +7,8 @@ import ( "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/image" ) diff --git a/staging/operator-registry/internal/action/diff_test.go b/staging/operator-registry/alpha/action/diff_test.go similarity index 97% rename from staging/operator-registry/internal/action/diff_test.go rename to staging/operator-registry/alpha/action/diff_test.go index 67951d6b9b..4ab09caf2b 100644 --- a/staging/operator-registry/internal/action/diff_test.go +++ b/staging/operator-registry/alpha/action/diff_test.go @@ -13,8 +13,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/containertools" "github.com/operator-framework/operator-registry/pkg/image" "github.com/operator-framework/operator-registry/pkg/lib/bundle" diff --git a/staging/operator-registry/internal/action/generate_dockerfile.go b/staging/operator-registry/alpha/action/generate_dockerfile.go similarity index 100% rename from staging/operator-registry/internal/action/generate_dockerfile.go rename to staging/operator-registry/alpha/action/generate_dockerfile.go diff --git a/staging/operator-registry/internal/action/generate_dockerfile_test.go b/staging/operator-registry/alpha/action/generate_dockerfile_test.go similarity index 100% rename from staging/operator-registry/internal/action/generate_dockerfile_test.go rename to staging/operator-registry/alpha/action/generate_dockerfile_test.go diff --git a/staging/operator-registry/internal/action/init.go b/staging/operator-registry/alpha/action/init.go similarity index 94% rename from staging/operator-registry/internal/action/init.go rename to staging/operator-registry/alpha/action/init.go index 335e70a171..910b882cd6 100644 --- a/staging/operator-registry/internal/action/init.go +++ b/staging/operator-registry/alpha/action/init.go @@ -7,7 +7,7 @@ import ( "github.com/h2non/filetype" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) type Init struct { diff --git a/staging/operator-registry/internal/action/init_test.go b/staging/operator-registry/alpha/action/init_test.go similarity index 95% rename from staging/operator-registry/internal/action/init_test.go rename to staging/operator-registry/alpha/action/init_test.go index 4b6b773ac2..3825571d5a 100644 --- a/staging/operator-registry/internal/action/init_test.go +++ b/staging/operator-registry/alpha/action/init_test.go @@ -8,8 +8,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) const ( diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/list.go b/staging/operator-registry/alpha/action/list.go similarity index 97% rename from vendor/github.com/operator-framework/operator-registry/internal/action/list.go rename to staging/operator-registry/alpha/action/list.go index 0ba4726c96..4c67dc628d 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/action/list.go +++ b/staging/operator-registry/alpha/action/list.go @@ -12,8 +12,8 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/model" ) type ListPackages struct { diff --git a/staging/operator-registry/internal/action/list_test.go b/staging/operator-registry/alpha/action/list_test.go similarity index 100% rename from staging/operator-registry/internal/action/list_test.go rename to staging/operator-registry/alpha/action/list_test.go diff --git a/staging/operator-registry/internal/action/render.go b/staging/operator-registry/alpha/action/render.go similarity index 98% rename from staging/operator-registry/internal/action/render.go rename to staging/operator-registry/alpha/action/render.go index f819180135..042fcf5646 100644 --- a/staging/operator-registry/internal/action/render.go +++ b/staging/operator-registry/alpha/action/render.go @@ -17,8 +17,8 @@ import ( "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/util/sets" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/containertools" "github.com/operator-framework/operator-registry/pkg/image" "github.com/operator-framework/operator-registry/pkg/image/containerdregistry" diff --git a/staging/operator-registry/internal/action/render_test.go b/staging/operator-registry/alpha/action/render_test.go similarity index 99% rename from staging/operator-registry/internal/action/render_test.go rename to staging/operator-registry/alpha/action/render_test.go index 8999e62dab..5a27b2c882 100644 --- a/staging/operator-registry/internal/action/render_test.go +++ b/staging/operator-registry/alpha/action/render_test.go @@ -14,9 +14,9 @@ import ( "github.com/stretchr/testify/require" "k8s.io/apimachinery/pkg/util/yaml" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/containertools" "github.com/operator-framework/operator-registry/pkg/image" "github.com/operator-framework/operator-registry/pkg/lib/bundle" diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/bundle.Dockerfile diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml rename to staging/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml diff --git a/staging/operator-registry/internal/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml b/staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml rename to staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/index-declcfgs/exp-headsonly/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/index-declcfgs/exp-headsonly/index.yaml rename to staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/index-declcfgs/exp-latest/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-latest/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/index-declcfgs/exp-latest/index.yaml rename to staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-latest/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/index-declcfgs/latest/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/index-declcfgs/latest/index.yaml rename to staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/index-declcfgs/old/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/index-declcfgs/old/index.yaml rename to staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/list-index/bar/index.yaml b/staging/operator-registry/alpha/action/testdata/list-index/bar/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/list-index/bar/index.yaml rename to staging/operator-registry/alpha/action/testdata/list-index/bar/index.yaml diff --git a/staging/operator-registry/internal/action/testdata/list-index/foo/index.yaml b/staging/operator-registry/alpha/action/testdata/list-index/foo/index.yaml similarity index 100% rename from staging/operator-registry/internal/action/testdata/list-index/foo/index.yaml rename to staging/operator-registry/alpha/action/testdata/list-index/foo/index.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg.go b/staging/operator-registry/alpha/declcfg/declcfg.go similarity index 97% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg.go rename to staging/operator-registry/alpha/declcfg/declcfg.go index 2f893cdc2e..688d5982a6 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg.go +++ b/staging/operator-registry/alpha/declcfg/declcfg.go @@ -3,7 +3,7 @@ package declcfg import ( "encoding/json" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) const ( diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg_to_model.go b/staging/operator-registry/alpha/declcfg/declcfg_to_model.go similarity index 96% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg_to_model.go rename to staging/operator-registry/alpha/declcfg/declcfg_to_model.go index a193ffbba2..d539c165f6 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/declcfg_to_model.go +++ b/staging/operator-registry/alpha/declcfg/declcfg_to_model.go @@ -4,9 +4,10 @@ import ( "fmt" "github.com/blang/semver" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" "k8s.io/apimachinery/pkg/util/sets" + + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertToModel(cfg DeclarativeConfig) (model.Model, error) { diff --git a/staging/operator-registry/internal/declcfg/declcfg_to_model_test.go b/staging/operator-registry/alpha/declcfg/declcfg_to_model_test.go similarity index 99% rename from staging/operator-registry/internal/declcfg/declcfg_to_model_test.go rename to staging/operator-registry/alpha/declcfg/declcfg_to_model_test.go index a6716376bf..6cfceedb22 100644 --- a/staging/operator-registry/internal/declcfg/declcfg_to_model_test.go +++ b/staging/operator-registry/alpha/declcfg/declcfg_to_model_test.go @@ -4,9 +4,10 @@ import ( "encoding/json" "testing" - "github.com/operator-framework/operator-registry/internal/property" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + + "github.com/operator-framework/operator-registry/alpha/property" ) func TestConvertToModel(t *testing.T) { diff --git a/staging/operator-registry/internal/declcfg/diff.go b/staging/operator-registry/alpha/declcfg/diff.go similarity index 98% rename from staging/operator-registry/internal/declcfg/diff.go rename to staging/operator-registry/alpha/declcfg/diff.go index 8f1cf6b41c..37cf72b052 100644 --- a/staging/operator-registry/internal/declcfg/diff.go +++ b/staging/operator-registry/alpha/declcfg/diff.go @@ -9,8 +9,8 @@ import ( "github.com/mitchellh/hashstructure/v2" "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) // DiffGenerator configures how diffs are created via Run(). diff --git a/staging/operator-registry/internal/declcfg/diff_test.go b/staging/operator-registry/alpha/declcfg/diff_test.go similarity index 99% rename from staging/operator-registry/internal/declcfg/diff_test.go rename to staging/operator-registry/alpha/declcfg/diff_test.go index 3cfc17d81c..0f0a25fff1 100644 --- a/staging/operator-registry/internal/declcfg/diff_test.go +++ b/staging/operator-registry/alpha/declcfg/diff_test.go @@ -5,8 +5,8 @@ import ( "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) type deprecated struct{} diff --git a/staging/operator-registry/internal/declcfg/helpers_test.go b/staging/operator-registry/alpha/declcfg/helpers_test.go similarity index 98% rename from staging/operator-registry/internal/declcfg/helpers_test.go rename to staging/operator-registry/alpha/declcfg/helpers_test.go index 3c6545ae9b..86111c770a 100644 --- a/staging/operator-registry/internal/declcfg/helpers_test.go +++ b/staging/operator-registry/alpha/declcfg/helpers_test.go @@ -10,8 +10,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func buildValidDeclarativeConfig(includeUnrecognized bool) DeclarativeConfig { diff --git a/staging/operator-registry/internal/declcfg/load.go b/staging/operator-registry/alpha/declcfg/load.go similarity index 98% rename from staging/operator-registry/internal/declcfg/load.go rename to staging/operator-registry/alpha/declcfg/load.go index c53c61d7e9..aa601a1d6a 100644 --- a/staging/operator-registry/internal/declcfg/load.go +++ b/staging/operator-registry/alpha/declcfg/load.go @@ -14,7 +14,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/yaml" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) const ( diff --git a/staging/operator-registry/internal/declcfg/load_test.go b/staging/operator-registry/alpha/declcfg/load_test.go similarity index 99% rename from staging/operator-registry/internal/declcfg/load_test.go rename to staging/operator-registry/alpha/declcfg/load_test.go index 9ec79a9416..995861c78e 100644 --- a/staging/operator-registry/internal/declcfg/load_test.go +++ b/staging/operator-registry/alpha/declcfg/load_test.go @@ -10,7 +10,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) func TestReadYAMLOrJSON(t *testing.T) { diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/model_to_declcfg.go b/staging/operator-registry/alpha/declcfg/model_to_declcfg.go similarity index 95% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/model_to_declcfg.go rename to staging/operator-registry/alpha/declcfg/model_to_declcfg.go index 468eb3019f..9d6651e8b8 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/model_to_declcfg.go +++ b/staging/operator-registry/alpha/declcfg/model_to_declcfg.go @@ -3,8 +3,8 @@ package declcfg import ( "sort" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertFromModel(mpkgs model.Model) DeclarativeConfig { diff --git a/staging/operator-registry/internal/declcfg/model_to_declcfg_test.go b/staging/operator-registry/alpha/declcfg/model_to_declcfg_test.go similarity index 90% rename from staging/operator-registry/internal/declcfg/model_to_declcfg_test.go rename to staging/operator-registry/alpha/declcfg/model_to_declcfg_test.go index 24aa3707e3..a24a70661a 100644 --- a/staging/operator-registry/internal/declcfg/model_to_declcfg_test.go +++ b/staging/operator-registry/alpha/declcfg/model_to_declcfg_test.go @@ -5,7 +5,7 @@ import ( "github.com/stretchr/testify/assert" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/model" ) func TestConvertFromModel(t *testing.T) { diff --git a/staging/operator-registry/internal/declcfg/write.go b/staging/operator-registry/alpha/declcfg/write.go similarity index 100% rename from staging/operator-registry/internal/declcfg/write.go rename to staging/operator-registry/alpha/declcfg/write.go diff --git a/staging/operator-registry/internal/declcfg/write_test.go b/staging/operator-registry/alpha/declcfg/write_test.go similarity index 100% rename from staging/operator-registry/internal/declcfg/write_test.go rename to staging/operator-registry/alpha/declcfg/write_test.go diff --git a/staging/operator-registry/alpha/doc.go b/staging/operator-registry/alpha/doc.go new file mode 100644 index 0000000000..e22855b2d8 --- /dev/null +++ b/staging/operator-registry/alpha/doc.go @@ -0,0 +1,9 @@ +// Package alpha contains subpackages that have unstable Go APIs. +// Subpackages that achieve maturity will be deprecated and moved +// to other modules or packages within operator-registry. +// +// Presence in the alpha package should not be construed as being +// of less quality than non-alpha packages. Subpackages in the +// alpha package have the same standard for testing as all other +// packages in this repository. +package alpha diff --git a/staging/operator-registry/internal/model/error.go b/staging/operator-registry/alpha/model/error.go similarity index 100% rename from staging/operator-registry/internal/model/error.go rename to staging/operator-registry/alpha/model/error.go diff --git a/staging/operator-registry/internal/model/error_test.go b/staging/operator-registry/alpha/model/error_test.go similarity index 100% rename from staging/operator-registry/internal/model/error_test.go rename to staging/operator-registry/alpha/model/error_test.go diff --git a/vendor/github.com/operator-framework/operator-registry/internal/model/model.go b/staging/operator-registry/alpha/model/model.go similarity index 99% rename from vendor/github.com/operator-framework/operator-registry/internal/model/model.go rename to staging/operator-registry/alpha/model/model.go index 48bd11609e..babcd08cc7 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/model/model.go +++ b/staging/operator-registry/alpha/model/model.go @@ -13,7 +13,7 @@ import ( svg "github.com/h2non/go-is-svg" "k8s.io/apimachinery/pkg/util/sets" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) func init() { diff --git a/staging/operator-registry/internal/model/model_test.go b/staging/operator-registry/alpha/model/model_test.go similarity index 99% rename from staging/operator-registry/internal/model/model_test.go rename to staging/operator-registry/alpha/model/model_test.go index 5fae479ed0..c286dcdb4b 100644 --- a/staging/operator-registry/internal/model/model_test.go +++ b/staging/operator-registry/alpha/model/model_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) type validator interface { diff --git a/staging/operator-registry/internal/property/errors.go b/staging/operator-registry/alpha/property/errors.go similarity index 100% rename from staging/operator-registry/internal/property/errors.go rename to staging/operator-registry/alpha/property/errors.go diff --git a/staging/operator-registry/internal/property/property.go b/staging/operator-registry/alpha/property/property.go similarity index 100% rename from staging/operator-registry/internal/property/property.go rename to staging/operator-registry/alpha/property/property.go diff --git a/staging/operator-registry/internal/property/property_test.go b/staging/operator-registry/alpha/property/property_test.go similarity index 100% rename from staging/operator-registry/internal/property/property_test.go rename to staging/operator-registry/alpha/property/property_test.go diff --git a/staging/operator-registry/internal/property/scheme.go b/staging/operator-registry/alpha/property/scheme.go similarity index 100% rename from staging/operator-registry/internal/property/scheme.go rename to staging/operator-registry/alpha/property/scheme.go diff --git a/staging/operator-registry/internal/property/scheme_test.go b/staging/operator-registry/alpha/property/scheme_test.go similarity index 100% rename from staging/operator-registry/internal/property/scheme_test.go rename to staging/operator-registry/alpha/property/scheme_test.go diff --git a/staging/operator-registry/cmd/opm/alpha/diff/cmd.go b/staging/operator-registry/cmd/opm/alpha/diff/cmd.go index eb07262963..f1a83f759e 100644 --- a/staging/operator-registry/cmd/opm/alpha/diff/cmd.go +++ b/staging/operator-registry/cmd/opm/alpha/diff/cmd.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/cobra" "k8s.io/kubectl/pkg/util/templates" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" containerd "github.com/operator-framework/operator-registry/pkg/image/containerdregistry" "github.com/operator-framework/operator-registry/pkg/lib/certs" ) diff --git a/staging/operator-registry/cmd/opm/alpha/generate/cmd.go b/staging/operator-registry/cmd/opm/alpha/generate/cmd.go index dff7400c6f..092f2310af 100644 --- a/staging/operator-registry/cmd/opm/alpha/generate/cmd.go +++ b/staging/operator-registry/cmd/opm/alpha/generate/cmd.go @@ -10,7 +10,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" + "github.com/operator-framework/operator-registry/alpha/action" "github.com/operator-framework/operator-registry/pkg/containertools" ) diff --git a/staging/operator-registry/cmd/opm/alpha/list/cmd.go b/staging/operator-registry/cmd/opm/alpha/list/cmd.go index 8309b089a1..c1c09ab0f3 100644 --- a/staging/operator-registry/cmd/opm/alpha/list/cmd.go +++ b/staging/operator-registry/cmd/opm/alpha/list/cmd.go @@ -6,7 +6,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" + "github.com/operator-framework/operator-registry/alpha/action" ) const humanReadabilityOnlyNote = `NOTE: This is meant to be used for convenience and human-readability only. The diff --git a/staging/operator-registry/cmd/opm/init/cmd.go b/staging/operator-registry/cmd/opm/init/cmd.go index 7233b8e6ac..a4e7050b13 100644 --- a/staging/operator-registry/cmd/opm/init/cmd.go +++ b/staging/operator-registry/cmd/opm/init/cmd.go @@ -7,8 +7,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) func NewCmd() *cobra.Command { diff --git a/staging/operator-registry/cmd/opm/render/cmd.go b/staging/operator-registry/cmd/opm/render/cmd.go index a866cb2828..913eb21a08 100644 --- a/staging/operator-registry/cmd/opm/render/cmd.go +++ b/staging/operator-registry/cmd/opm/render/cmd.go @@ -9,8 +9,8 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/sqlite" ) diff --git a/staging/operator-registry/cmd/opm/serve/serve.go b/staging/operator-registry/cmd/opm/serve/serve.go index b8a9e8ec41..0549262221 100644 --- a/staging/operator-registry/cmd/opm/serve/serve.go +++ b/staging/operator-registry/cmd/opm/serve/serve.go @@ -11,7 +11,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/reflection" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/api" health "github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1" "github.com/operator-framework/operator-registry/pkg/lib/dns" diff --git a/staging/operator-registry/pkg/api/api_to_model.go b/staging/operator-registry/pkg/api/api_to_model.go index 2d37cca6ba..d203f40b4a 100644 --- a/staging/operator-registry/pkg/api/api_to_model.go +++ b/staging/operator-registry/pkg/api/api_to_model.go @@ -5,8 +5,8 @@ import ( "fmt" "sort" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertAPIBundleToModelBundle(b *Bundle) (*model.Bundle, error) { diff --git a/staging/operator-registry/pkg/api/conversion_test.go b/staging/operator-registry/pkg/api/conversion_test.go index a6f2ca75f5..0a332b91a4 100644 --- a/staging/operator-registry/pkg/api/conversion_test.go +++ b/staging/operator-registry/pkg/api/conversion_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func TestConvertAPIBundleToModelBundle(t *testing.T) { diff --git a/staging/operator-registry/pkg/api/model_to_api.go b/staging/operator-registry/pkg/api/model_to_api.go index 8263d4d67f..26f8b745c3 100644 --- a/staging/operator-registry/pkg/api/model_to_api.go +++ b/staging/operator-registry/pkg/api/model_to_api.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) { diff --git a/staging/operator-registry/pkg/lib/config/validate.go b/staging/operator-registry/pkg/lib/config/validate.go index 5f9763bd45..5017d3da71 100644 --- a/staging/operator-registry/pkg/lib/config/validate.go +++ b/staging/operator-registry/pkg/lib/config/validate.go @@ -3,7 +3,7 @@ package config import ( "io/fs" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) // Validate takes a filesystem containing the declarative config file(s) diff --git a/staging/operator-registry/pkg/lib/registry/registry_test.go b/staging/operator-registry/pkg/lib/registry/registry_test.go index 8af5306016..ff3e7d58ec 100644 --- a/staging/operator-registry/pkg/lib/registry/registry_test.go +++ b/staging/operator-registry/pkg/lib/registry/registry_test.go @@ -19,8 +19,8 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "sigs.k8s.io/yaml" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/image" "github.com/operator-framework/operator-registry/pkg/lib/bundle" "github.com/operator-framework/operator-registry/pkg/registry" diff --git a/staging/operator-registry/pkg/registry/query.go b/staging/operator-registry/pkg/registry/query.go index 20f0e9f95d..00b654b99a 100644 --- a/staging/operator-registry/pkg/registry/query.go +++ b/staging/operator-registry/pkg/registry/query.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/api" ) diff --git a/staging/operator-registry/pkg/registry/query_test.go b/staging/operator-registry/pkg/registry/query_test.go index 9946e11460..4a3988b980 100644 --- a/staging/operator-registry/pkg/registry/query_test.go +++ b/staging/operator-registry/pkg/registry/query_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) var testModelQuerier = genTestModelQuerier() diff --git a/staging/operator-registry/pkg/registry/registry_to_model.go b/staging/operator-registry/pkg/registry/registry_to_model.go index 6b2b69d87a..2deba2c15c 100644 --- a/staging/operator-registry/pkg/registry/registry_to_model.go +++ b/staging/operator-registry/pkg/registry/registry_to_model.go @@ -6,8 +6,8 @@ import ( "sort" "strings" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertRegistryBundleToModelBundles(b *Bundle) ([]model.Bundle, error) { diff --git a/staging/operator-registry/pkg/registry/registry_to_model_test.go b/staging/operator-registry/pkg/registry/registry_to_model_test.go index a2bfbc5eee..265894b02d 100644 --- a/staging/operator-registry/pkg/registry/registry_to_model_test.go +++ b/staging/operator-registry/pkg/registry/registry_to_model_test.go @@ -6,8 +6,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/image" ) diff --git a/staging/operator-registry/pkg/sqlite/conversion.go b/staging/operator-registry/pkg/sqlite/conversion.go index 6f132fbb52..e94d052cf0 100644 --- a/staging/operator-registry/pkg/sqlite/conversion.go +++ b/staging/operator-registry/pkg/sqlite/conversion.go @@ -10,7 +10,7 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/api" "github.com/operator-framework/operator-registry/pkg/registry" ) diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/diff.go similarity index 94% rename from vendor/github.com/operator-framework/operator-registry/internal/action/diff.go rename to vendor/github.com/operator-framework/operator-registry/alpha/action/diff.go index 7dd192f607..4f7427f95a 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/action/diff.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/diff.go @@ -7,8 +7,8 @@ import ( "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/image" ) diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/generate_dockerfile.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/generate_dockerfile.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/generate_dockerfile.go rename to vendor/github.com/operator-framework/operator-registry/alpha/action/generate_dockerfile.go diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/init.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/init.go similarity index 94% rename from vendor/github.com/operator-framework/operator-registry/internal/action/init.go rename to vendor/github.com/operator-framework/operator-registry/alpha/action/init.go index 335e70a171..910b882cd6 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/action/init.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/init.go @@ -7,7 +7,7 @@ import ( "github.com/h2non/filetype" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) type Init struct { diff --git a/staging/operator-registry/internal/action/list.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/list.go similarity index 97% rename from staging/operator-registry/internal/action/list.go rename to vendor/github.com/operator-framework/operator-registry/alpha/action/list.go index 0ba4726c96..4c67dc628d 100644 --- a/staging/operator-registry/internal/action/list.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/list.go @@ -12,8 +12,8 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/model" ) type ListPackages struct { diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/render.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go similarity index 98% rename from vendor/github.com/operator-framework/operator-registry/internal/action/render.go rename to vendor/github.com/operator-framework/operator-registry/alpha/action/render.go index f819180135..042fcf5646 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/action/render.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go @@ -17,8 +17,8 @@ import ( "github.com/sirupsen/logrus" "k8s.io/apimachinery/pkg/util/sets" - "github.com/operator-framework/operator-registry/internal/declcfg" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/declcfg" + "github.com/operator-framework/operator-registry/alpha/property" "github.com/operator-framework/operator-registry/pkg/containertools" "github.com/operator-framework/operator-registry/pkg/image" "github.com/operator-framework/operator-registry/pkg/image/containerdregistry" diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bar.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/manifests/bars.test.bar.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.1.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bar.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/manifests/bars.test.bar.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v0.2.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bar.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/manifests/bars.test.bar.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/bar-bundle-v1.0.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/baz.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/manifests/bazs.test.baz.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/baz.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/manifests/bazs.test.baz.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.0.1/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/baz.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/manifests/bazs.test.baz.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/baz-bundle-v1.1.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foo.v0.1.0.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/manifests/foos.test.foo.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.1.0/metadata/dependencies.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foos.test.foo.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/metadata/dependencies.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foo.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/manifests/foos.test.foo.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.0/metadata/dependencies.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foo.csv.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/manifests/foos.test.foo.crd.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/annotations.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.3.1/metadata/dependencies.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/exp-headsonly/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/exp-headsonly/index.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/exp-latest/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-latest/index.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/exp-latest/index.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-latest/index.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/latest/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/latest/index.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml diff --git a/vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/old/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/action/testdata/index-declcfgs/old/index.yaml rename to vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml diff --git a/staging/operator-registry/internal/declcfg/declcfg.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go similarity index 97% rename from staging/operator-registry/internal/declcfg/declcfg.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go index 2f893cdc2e..688d5982a6 100644 --- a/staging/operator-registry/internal/declcfg/declcfg.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg.go @@ -3,7 +3,7 @@ package declcfg import ( "encoding/json" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) const ( diff --git a/staging/operator-registry/internal/declcfg/declcfg_to_model.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg_to_model.go similarity index 96% rename from staging/operator-registry/internal/declcfg/declcfg_to_model.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg_to_model.go index a193ffbba2..d539c165f6 100644 --- a/staging/operator-registry/internal/declcfg/declcfg_to_model.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/declcfg_to_model.go @@ -4,9 +4,10 @@ import ( "fmt" "github.com/blang/semver" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" "k8s.io/apimachinery/pkg/util/sets" + + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertToModel(cfg DeclarativeConfig) (model.Model, error) { diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go similarity index 98% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go index 8f1cf6b41c..37cf72b052 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/diff.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go @@ -9,8 +9,8 @@ import ( "github.com/mitchellh/hashstructure/v2" "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) // DiffGenerator configures how diffs are created via Run(). diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go similarity index 98% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go index c53c61d7e9..aa601a1d6a 100644 --- a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/load.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/load.go @@ -14,7 +14,7 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/util/yaml" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) const ( diff --git a/staging/operator-registry/internal/declcfg/model_to_declcfg.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/model_to_declcfg.go similarity index 95% rename from staging/operator-registry/internal/declcfg/model_to_declcfg.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/model_to_declcfg.go index 468eb3019f..9d6651e8b8 100644 --- a/staging/operator-registry/internal/declcfg/model_to_declcfg.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/model_to_declcfg.go @@ -3,8 +3,8 @@ package declcfg import ( "sort" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertFromModel(mpkgs model.Model) DeclarativeConfig { diff --git a/vendor/github.com/operator-framework/operator-registry/internal/declcfg/write.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/declcfg/write.go rename to vendor/github.com/operator-framework/operator-registry/alpha/declcfg/write.go diff --git a/vendor/github.com/operator-framework/operator-registry/internal/model/error.go b/vendor/github.com/operator-framework/operator-registry/alpha/model/error.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/model/error.go rename to vendor/github.com/operator-framework/operator-registry/alpha/model/error.go diff --git a/staging/operator-registry/internal/model/model.go b/vendor/github.com/operator-framework/operator-registry/alpha/model/model.go similarity index 99% rename from staging/operator-registry/internal/model/model.go rename to vendor/github.com/operator-framework/operator-registry/alpha/model/model.go index 48bd11609e..babcd08cc7 100644 --- a/staging/operator-registry/internal/model/model.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/model/model.go @@ -13,7 +13,7 @@ import ( svg "github.com/h2non/go-is-svg" "k8s.io/apimachinery/pkg/util/sets" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/property" ) func init() { diff --git a/vendor/github.com/operator-framework/operator-registry/internal/property/errors.go b/vendor/github.com/operator-framework/operator-registry/alpha/property/errors.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/property/errors.go rename to vendor/github.com/operator-framework/operator-registry/alpha/property/errors.go diff --git a/vendor/github.com/operator-framework/operator-registry/internal/property/property.go b/vendor/github.com/operator-framework/operator-registry/alpha/property/property.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/property/property.go rename to vendor/github.com/operator-framework/operator-registry/alpha/property/property.go diff --git a/vendor/github.com/operator-framework/operator-registry/internal/property/scheme.go b/vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go similarity index 100% rename from vendor/github.com/operator-framework/operator-registry/internal/property/scheme.go rename to vendor/github.com/operator-framework/operator-registry/alpha/property/scheme.go diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go index eb07262963..f1a83f759e 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/diff/cmd.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/cobra" "k8s.io/kubectl/pkg/util/templates" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" containerd "github.com/operator-framework/operator-registry/pkg/image/containerdregistry" "github.com/operator-framework/operator-registry/pkg/lib/certs" ) diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/generate/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/generate/cmd.go index dff7400c6f..092f2310af 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/generate/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/generate/cmd.go @@ -10,7 +10,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" + "github.com/operator-framework/operator-registry/alpha/action" "github.com/operator-framework/operator-registry/pkg/containertools" ) diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/list/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/list/cmd.go index 8309b089a1..c1c09ab0f3 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/list/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/alpha/list/cmd.go @@ -6,7 +6,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" + "github.com/operator-framework/operator-registry/alpha/action" ) const humanReadabilityOnlyNote = `NOTE: This is meant to be used for convenience and human-readability only. The diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/init/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/init/cmd.go index 7233b8e6ac..a4e7050b13 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/init/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/init/cmd.go @@ -7,8 +7,8 @@ import ( log "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) func NewCmd() *cobra.Command { diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/render/cmd.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/render/cmd.go index a866cb2828..913eb21a08 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/render/cmd.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/render/cmd.go @@ -9,8 +9,8 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" - "github.com/operator-framework/operator-registry/internal/action" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/action" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/sqlite" ) diff --git a/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go b/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go index b8a9e8ec41..0549262221 100644 --- a/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go +++ b/vendor/github.com/operator-framework/operator-registry/cmd/opm/serve/serve.go @@ -11,7 +11,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/reflection" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" "github.com/operator-framework/operator-registry/pkg/api" health "github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1" "github.com/operator-framework/operator-registry/pkg/lib/dns" diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go b/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go index 2d37cca6ba..d203f40b4a 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/api/api_to_model.go @@ -5,8 +5,8 @@ import ( "fmt" "sort" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertAPIBundleToModelBundle(b *Bundle) (*model.Bundle, error) { diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go b/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go index 8263d4d67f..26f8b745c3 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/api/model_to_api.go @@ -4,8 +4,8 @@ import ( "encoding/json" "fmt" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertModelBundleToAPIBundle(b model.Bundle) (*Bundle, error) { diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/lib/config/validate.go b/vendor/github.com/operator-framework/operator-registry/pkg/lib/config/validate.go index 5f9763bd45..5017d3da71 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/lib/config/validate.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/lib/config/validate.go @@ -3,7 +3,7 @@ package config import ( "io/fs" - "github.com/operator-framework/operator-registry/internal/declcfg" + "github.com/operator-framework/operator-registry/alpha/declcfg" ) // Validate takes a filesystem containing the declarative config file(s) diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/registry/query.go b/vendor/github.com/operator-framework/operator-registry/pkg/registry/query.go index 20f0e9f95d..00b654b99a 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/registry/query.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/registry/query.go @@ -5,7 +5,7 @@ import ( "fmt" "sort" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/api" ) diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go b/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go index 6b2b69d87a..2deba2c15c 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/registry/registry_to_model.go @@ -6,8 +6,8 @@ import ( "sort" "strings" - "github.com/operator-framework/operator-registry/internal/model" - "github.com/operator-framework/operator-registry/internal/property" + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" ) func ConvertRegistryBundleToModelBundles(b *Bundle) ([]model.Bundle, error) { diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/conversion.go b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/conversion.go index 6f132fbb52..e94d052cf0 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/conversion.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/sqlite/conversion.go @@ -10,7 +10,7 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/sirupsen/logrus" - "github.com/operator-framework/operator-registry/internal/model" + "github.com/operator-framework/operator-registry/alpha/model" "github.com/operator-framework/operator-registry/pkg/api" "github.com/operator-framework/operator-registry/pkg/registry" ) diff --git a/vendor/modules.txt b/vendor/modules.txt index b9012b727f..09ff8703c0 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -587,6 +587,10 @@ github.com/operator-framework/operator-lifecycle-manager/pkg/version github.com/operator-framework/operator-lifecycle-manager/util/cpb # github.com/operator-framework/operator-registry v1.17.5 => ./staging/operator-registry ## explicit +github.com/operator-framework/operator-registry/alpha/action +github.com/operator-framework/operator-registry/alpha/declcfg +github.com/operator-framework/operator-registry/alpha/model +github.com/operator-framework/operator-registry/alpha/property github.com/operator-framework/operator-registry/cmd/configmap-server github.com/operator-framework/operator-registry/cmd/initializer github.com/operator-framework/operator-registry/cmd/opm @@ -604,10 +608,6 @@ github.com/operator-framework/operator-registry/cmd/opm/serve github.com/operator-framework/operator-registry/cmd/opm/validate github.com/operator-framework/operator-registry/cmd/opm/version github.com/operator-framework/operator-registry/cmd/registry-server -github.com/operator-framework/operator-registry/internal/action -github.com/operator-framework/operator-registry/internal/declcfg -github.com/operator-framework/operator-registry/internal/model -github.com/operator-framework/operator-registry/internal/property github.com/operator-framework/operator-registry/pkg/api github.com/operator-framework/operator-registry/pkg/api/grpc_health_v1 github.com/operator-framework/operator-registry/pkg/client From 6ef0755800bcc451c6954bb3e99cd992d389f6e9 Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Tue, 24 Aug 2021 14:48:05 +0200 Subject: [PATCH 25/45] fix broken URL in unit.yaml GH action (#2335) Signed-off-by: Josef Karasek Upstream-repository: operator-lifecycle-manager Upstream-commit: 35deef283a7b0595d6213a66c395731fd0588cdd --- staging/operator-lifecycle-manager/.github/workflows/unit.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staging/operator-lifecycle-manager/.github/workflows/unit.yml b/staging/operator-lifecycle-manager/.github/workflows/unit.yml index a8656c0ee6..ff854dee6d 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/unit.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/unit.yml @@ -19,7 +19,7 @@ jobs: run: | os=$(go env GOOS) arch=$(go env GOARCH) - curl -L https://go.kubebuilder.io/dl/2.3.1/${os}/${arch} | tar -xz -C /tmp/ + curl -L https://github.com/kubernetes-sigs/kubebuilder/releases/download/v2.3.1/kubebuilder_2.3.1_${os}_${arch}.tar.gz | tar -xz -C /tmp/ sudo mv /tmp/kubebuilder_2.3.1_${os}_${arch} /usr/local/kubebuilder - name: Run unit tests run: make unit From 4441e74793b83f1f9e7dff1e16d6275cfc03162e Mon Sep 17 00:00:00 2001 From: Evan Cordell Date: Thu, 26 Aug 2021 12:29:45 -0400 Subject: [PATCH 26/45] bump gini (#2336) new version has logic.C performance improvements that should help see: - https://github.com/go-air/gini/pull/17 - https://github.com/go-air/gini/commit/3a1a4d9135f5ef6217be78e3a3e7f498531f4ef1 - https://github.com/go-air/gini/commit/8dd68056dc66c83d9e6674c4a2facd93c0b202e0 - https://github.com/go-air/gini/pull/18 Signed-off-by: Evan Upstream-repository: operator-lifecycle-manager Upstream-commit: c20784d3e2a372c2a6a03dbcfedf512ca84b1eca --- go.sum | 4 +- staging/operator-lifecycle-manager/go.mod | 2 +- staging/operator-lifecycle-manager/go.sum | 4 +- .../registry/resolver/solver/bench_test.go | 9 + .../registry/resolver/solver/constraints.go | 4 +- .../registry/resolver/solver/lit_mapping.go | 6 +- .../registry/resolver/solver/search.go | 4 +- .../registry/resolver/solver/search_test.go | 6 +- .../registry/resolver/solver/solve.go | 6 +- .../resolver/solver/zz_search_test.go | 4 +- .../gini/.travis.yml | 0 .../gini/LICENSE | 0 vendor/github.com/go-air/gini/README.md | 51 +++ .../gini/dimacs/cfilt.go | 0 .../gini/dimacs/cnf.go | 2 +- .../gini/dimacs/doc.go | 0 .../gini/dimacs/icnf.go | 2 +- .../gini/dimacs/int.go | 0 .../gini/dimacs/lit.go | 2 +- .../gini/dimacs/solve.go | 0 .../gini/dimacs/vis.go | 2 +- .../gini/doc.go | 0 .../gini/gini.go | 8 +- vendor/github.com/go-air/gini/go.mod | 3 + .../gini/go.sum | 0 .../gini/inter/doc.go | 0 .../gini/inter/s.go | 2 +- .../gini/inter/solve.go | 0 .../gini/internal/xo/active.go | 2 +- .../gini/internal/xo/cdat.go | 2 +- .../gini/internal/xo/cdb.go | 2 +- .../gini/internal/xo/cgc.go | 2 +- .../gini/internal/xo/chd.go | 0 .../gini/internal/xo/cloc.go | 2 +- .../gini/internal/xo/ctl.go | 2 +- .../gini/internal/xo/derive.go | 2 +- .../gini/internal/xo/dimacs.go | 2 +- .../gini/internal/xo/doc.go | 0 .../gini/internal/xo/guess.go | 2 +- .../gini/internal/xo/luby.go | 0 .../gini/internal/xo/phases.go | 2 +- .../gini/internal/xo/s.go | 6 +- .../gini/internal/xo/stats.go | 0 .../gini/internal/xo/tracer.go | 0 .../gini/internal/xo/trail.go | 2 +- .../gini/internal/xo/vars.go | 2 +- .../gini/internal/xo/watch.go | 2 +- .../gini/logic/c.go | 6 +- .../gini/logic/card.go | 2 +- .../gini/logic/doc.go | 0 .../gini/logic/roll.go | 2 +- .../gini/logic/s.go | 2 +- .../{operator-framework => go-air}/gini/s.go | 2 +- .../{operator-framework => go-air}/gini/sv.go | 4 +- .../gini/z/c.go | 0 .../gini/z/doc.go | 0 .../gini/z/dv.go | 0 .../gini/z/lit.go | 0 .../gini/z/var.go | 0 .../operator-framework/gini/README.md | 339 ------------------ .../github.com/operator-framework/gini/go.mod | 1 - .../registry/resolver/solver/constraints.go | 4 +- .../registry/resolver/solver/lit_mapping.go | 6 +- .../registry/resolver/solver/search.go | 4 +- .../registry/resolver/solver/solve.go | 6 +- vendor/modules.txt | 14 +- 66 files changed, 134 insertions(+), 411 deletions(-) rename vendor/github.com/{operator-framework => go-air}/gini/.travis.yml (100%) rename vendor/github.com/{operator-framework => go-air}/gini/LICENSE (100%) create mode 100644 vendor/github.com/go-air/gini/README.md rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/cfilt.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/cnf.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/icnf.go (97%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/int.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/lit.go (89%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/solve.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/dimacs/vis.go (96%) rename vendor/github.com/{operator-framework => go-air}/gini/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/gini.go (97%) create mode 100644 vendor/github.com/go-air/gini/go.mod rename vendor/github.com/{operator-framework => go-air}/gini/go.sum (100%) rename vendor/github.com/{operator-framework => go-air}/gini/inter/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/inter/s.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/inter/solve.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/active.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/cdat.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/cdb.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/cgc.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/chd.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/cloc.go (82%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/ctl.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/derive.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/dimacs.go (91%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/guess.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/luby.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/phases.go (93%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/s.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/stats.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/tracer.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/trail.go (99%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/vars.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/internal/xo/watch.go (97%) rename vendor/github.com/{operator-framework => go-air}/gini/logic/c.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/logic/card.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/logic/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/logic/roll.go (97%) rename vendor/github.com/{operator-framework => go-air}/gini/logic/s.go (98%) rename vendor/github.com/{operator-framework => go-air}/gini/s.go (84%) rename vendor/github.com/{operator-framework => go-air}/gini/sv.go (95%) rename vendor/github.com/{operator-framework => go-air}/gini/z/c.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/z/doc.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/z/dv.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/z/lit.go (100%) rename vendor/github.com/{operator-framework => go-air}/gini/z/var.go (100%) delete mode 100644 vendor/github.com/operator-framework/gini/README.md delete mode 100644 vendor/github.com/operator-framework/gini/go.mod diff --git a/go.sum b/go.sum index 36b3765776..e472ee3b3b 100644 --- a/go.sum +++ b/go.sum @@ -336,6 +336,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= +github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= @@ -855,8 +857,6 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/operator-framework/gini v1.1.0 h1:w84bE/pi0nlnIRAxzYguoYAnL9s5T6RSVZKYWcxO3yI= -github.com/operator-framework/gini v1.1.0/go.mod h1:L4GlF3xPPfQUoWglKhaBcR8/LZn3fWtMB1mwUyOGv98= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index 326b311852..c96c72b6f9 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -10,6 +10,7 @@ require ( github.com/distribution/distribution v2.7.1+incompatible github.com/fsnotify/fsnotify v1.4.9 github.com/ghodss/yaml v1.0.0 + github.com/go-air/gini v1.0.4 github.com/go-bindata/go-bindata/v3 v3.1.3 github.com/go-logr/logr v0.4.0 github.com/golang/mock v1.4.1 @@ -25,7 +26,6 @@ require ( github.com/openshift/api v0.0.0-20200331152225-585af27e34fd github.com/openshift/client-go v0.0.0-20200326155132-2a6cd50aedd0 github.com/operator-framework/api v0.10.3 - github.com/operator-framework/gini v1.1.0 github.com/operator-framework/operator-registry v1.17.5 github.com/otiai10/copy v1.2.0 github.com/pkg/errors v0.9.1 diff --git a/staging/operator-lifecycle-manager/go.sum b/staging/operator-lifecycle-manager/go.sum index d862aed784..ef1e00aa99 100644 --- a/staging/operator-lifecycle-manager/go.sum +++ b/staging/operator-lifecycle-manager/go.sum @@ -350,6 +350,8 @@ github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeME github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= +github.com/go-air/gini v1.0.4 h1:lteMAxHKNOAjIqazL/klOJJmxq6YxxSuJ17MnMXny+s= +github.com/go-air/gini v1.0.4/go.mod h1:dd8RvT1xcv6N1da33okvBd8DhMh1/A4siGy6ErjTljs= github.com/go-bindata/go-bindata/v3 v3.1.3 h1:F0nVttLC3ws0ojc7p60veTurcOm//D4QBODNM7EGrCI= github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= @@ -878,8 +880,6 @@ github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnh github.com/operator-framework/api v0.7.1/go.mod h1:L7IvLd/ckxJEJg/t4oTTlnHKAJIP/p51AvEslW3wYdY= github.com/operator-framework/api v0.10.3 h1:C4DE7Rr3+ztUw3mKiFyfAiUJSVOty/cJmpwE90/kYro= github.com/operator-framework/api v0.10.3/go.mod h1:tV0BUNvly7szq28ZPBXhjp1Sqg5yHCOeX19ui9K4vjI= -github.com/operator-framework/gini v1.1.0 h1:w84bE/pi0nlnIRAxzYguoYAnL9s5T6RSVZKYWcxO3yI= -github.com/operator-framework/gini v1.1.0/go.mod h1:L4GlF3xPPfQUoWglKhaBcR8/LZn3fWtMB1mwUyOGv98= github.com/operator-framework/operator-registry v1.17.5 h1:LR8m1rFz5Gcyje8WK6iYt+gIhtzqo52zMRALdmTYHT0= github.com/operator-framework/operator-registry v1.17.5/go.mod h1:sRQIgDMZZdUcmHltzyCnM6RUoDF+WS8Arj1BQIARDS8= github.com/otiai10/copy v1.2.0 h1:HvG945u96iNadPoG2/Ja2+AUJeW5YuFQMixq9yirC+k= diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/bench_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/bench_test.go index af07d55ce1..72f586e1e0 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/bench_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/bench_test.go @@ -72,3 +72,12 @@ func BenchmarkSolve(b *testing.B) { s.Solve(context.Background()) } } + +func BenchmarkNewInput(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := New(WithInput(BenchmarkInput)) + if err != nil { + b.Fatalf("failed to initialize solver: %s", err) + } + } +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go index ca3c4f5331..785ee409fd 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini/logic" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/logic" + "github.com/go-air/gini/z" ) // Constraint implementations limit the circumstances under which a diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go index f837ffc3e8..dedb5fb8da 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/logic" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/logic" + "github.com/go-air/gini/z" ) type DuplicateIdentifier Identifier diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go index f36678f1ee..ed84ea9309 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go @@ -3,8 +3,8 @@ package solver import ( "context" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) type choice struct { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go index 53dff9c748..5b00bcfd2c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search_test.go @@ -1,4 +1,4 @@ -//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o zz_search_test.go ../../../../../vendor/github.com/operator-framework/gini/inter S +//go:generate go run github.com/maxbrunsfeld/counterfeiter/v6 -o zz_search_test.go ../../../../../vendor/github.com/go-air/gini/inter S package solver @@ -6,8 +6,8 @@ import ( "context" "testing" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" "github.com/stretchr/testify/assert" ) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go index 712ae3bcc7..5d81f459a2 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) var Incomplete = errors.New("cancelled before a solution could be found") diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go index 5ef7eed2c6..6fbdbccc46 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/zz_search_test.go @@ -5,8 +5,8 @@ import ( "sync" "time" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) type FakeS struct { diff --git a/vendor/github.com/operator-framework/gini/.travis.yml b/vendor/github.com/go-air/gini/.travis.yml similarity index 100% rename from vendor/github.com/operator-framework/gini/.travis.yml rename to vendor/github.com/go-air/gini/.travis.yml diff --git a/vendor/github.com/operator-framework/gini/LICENSE b/vendor/github.com/go-air/gini/LICENSE similarity index 100% rename from vendor/github.com/operator-framework/gini/LICENSE rename to vendor/github.com/go-air/gini/LICENSE diff --git a/vendor/github.com/go-air/gini/README.md b/vendor/github.com/go-air/gini/README.md new file mode 100644 index 0000000000..558b5c84bc --- /dev/null +++ b/vendor/github.com/go-air/gini/README.md @@ -0,0 +1,51 @@ +# ⊧ Gini: A fast SAT solver. + +The Gini sat solver is a fast, clean SAT solver written in Go. It is to our knowledge +the first ever performant pure-Go SAT solver made available. + + +[![GoDoc](https://godoc.org/github.com/go-air/gini?status.svg)](https://godoc.org/github.com/go-air/gini) + +[Google Group](https://groups.google.com/d/forum/ginisat) + +This solver is fully open source, originally developped at IRI France. + +## Build/Install + +For the impatient: + + go install github.com/go-air/gini/...@latest + +I recommend however building the package github.com/go-air/gini/internal/xo with bounds checking +turned off. This package is all about anything-goes performance and is the workhorse behind most of +the gini sat solver. It is also extensively tested and well benchmarked, so it should not pose any +safety threat to client code. This makes a signficant speed difference (maybe 10%) on long running +problems. + +## The SAT problem in 5 minutes + +[The SAT Problem](docs/satprob.md) + +## Usage + +Our [user guide](docs/manual.md) shows how to solve SAT problems, circuits, do Boolean optimisation, +use concurrency, using our distributed CRISP protocol, and more. + + +## Citing Gini + +Zenodo DOI based citations and download: +[![DOI](https://zenodo.org/badge/64034957.svg)](https://zenodo.org/badge/latestdoi/64034957) + +BibText: +``` +@misc{scott_cotton_2019_2553490, + author = {Scott Cotton}, + title = {go-air/gini: Sapeur}, + month = jan, + year = 2019, + doi = {10.5281/zenodo.2553490}, + url = {https://doi.org/10.5281/zenodo.2553490} +} +``` + diff --git a/vendor/github.com/operator-framework/gini/dimacs/cfilt.go b/vendor/github.com/go-air/gini/dimacs/cfilt.go similarity index 100% rename from vendor/github.com/operator-framework/gini/dimacs/cfilt.go rename to vendor/github.com/go-air/gini/dimacs/cfilt.go diff --git a/vendor/github.com/operator-framework/gini/dimacs/cnf.go b/vendor/github.com/go-air/gini/dimacs/cnf.go similarity index 98% rename from vendor/github.com/operator-framework/gini/dimacs/cnf.go rename to vendor/github.com/go-air/gini/dimacs/cnf.go index c00451f51d..c426f7d3bf 100644 --- a/vendor/github.com/operator-framework/gini/dimacs/cnf.go +++ b/vendor/github.com/go-air/gini/dimacs/cnf.go @@ -8,7 +8,7 @@ import ( "fmt" "io" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Type Reader holds info for reading dimacs formatted intput. diff --git a/vendor/github.com/operator-framework/gini/dimacs/doc.go b/vendor/github.com/go-air/gini/dimacs/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/dimacs/doc.go rename to vendor/github.com/go-air/gini/dimacs/doc.go diff --git a/vendor/github.com/operator-framework/gini/dimacs/icnf.go b/vendor/github.com/go-air/gini/dimacs/icnf.go similarity index 97% rename from vendor/github.com/operator-framework/gini/dimacs/icnf.go rename to vendor/github.com/go-air/gini/dimacs/icnf.go index 567762a1e9..5f058d2252 100644 --- a/vendor/github.com/operator-framework/gini/dimacs/icnf.go +++ b/vendor/github.com/go-air/gini/dimacs/icnf.go @@ -8,7 +8,7 @@ import ( "fmt" "io" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) type iCnfReader struct { diff --git a/vendor/github.com/operator-framework/gini/dimacs/int.go b/vendor/github.com/go-air/gini/dimacs/int.go similarity index 100% rename from vendor/github.com/operator-framework/gini/dimacs/int.go rename to vendor/github.com/go-air/gini/dimacs/int.go diff --git a/vendor/github.com/operator-framework/gini/dimacs/lit.go b/vendor/github.com/go-air/gini/dimacs/lit.go similarity index 89% rename from vendor/github.com/operator-framework/gini/dimacs/lit.go rename to vendor/github.com/go-air/gini/dimacs/lit.go index 9ed081687f..fdfd52441a 100644 --- a/vendor/github.com/operator-framework/gini/dimacs/lit.go +++ b/vendor/github.com/go-air/gini/dimacs/lit.go @@ -6,7 +6,7 @@ package dimacs import ( "bufio" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) func readLit(r *bufio.Reader) (m z.Lit, e error) { diff --git a/vendor/github.com/operator-framework/gini/dimacs/solve.go b/vendor/github.com/go-air/gini/dimacs/solve.go similarity index 100% rename from vendor/github.com/operator-framework/gini/dimacs/solve.go rename to vendor/github.com/go-air/gini/dimacs/solve.go diff --git a/vendor/github.com/operator-framework/gini/dimacs/vis.go b/vendor/github.com/go-air/gini/dimacs/vis.go similarity index 96% rename from vendor/github.com/operator-framework/gini/dimacs/vis.go rename to vendor/github.com/go-air/gini/dimacs/vis.go index 9934b37032..7fc57be38b 100644 --- a/vendor/github.com/operator-framework/gini/dimacs/vis.go +++ b/vendor/github.com/go-air/gini/dimacs/vis.go @@ -3,7 +3,7 @@ package dimacs -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" // Type Vis provides a visitor interface to reading dimacs files. // diff --git a/vendor/github.com/operator-framework/gini/doc.go b/vendor/github.com/go-air/gini/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/doc.go rename to vendor/github.com/go-air/gini/doc.go diff --git a/vendor/github.com/operator-framework/gini/gini.go b/vendor/github.com/go-air/gini/gini.go similarity index 97% rename from vendor/github.com/operator-framework/gini/gini.go rename to vendor/github.com/go-air/gini/gini.go index 52a6d4d054..5f32dc8e8b 100644 --- a/vendor/github.com/operator-framework/gini/gini.go +++ b/vendor/github.com/go-air/gini/gini.go @@ -7,10 +7,10 @@ import ( "io" "time" - "github.com/operator-framework/gini/dimacs" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/internal/xo" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/dimacs" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/internal/xo" + "github.com/go-air/gini/z" ) // Gini is a concrete implementation of solver diff --git a/vendor/github.com/go-air/gini/go.mod b/vendor/github.com/go-air/gini/go.mod new file mode 100644 index 0000000000..e5a95f859f --- /dev/null +++ b/vendor/github.com/go-air/gini/go.mod @@ -0,0 +1,3 @@ +module github.com/go-air/gini + +go 1.16 diff --git a/vendor/github.com/operator-framework/gini/go.sum b/vendor/github.com/go-air/gini/go.sum similarity index 100% rename from vendor/github.com/operator-framework/gini/go.sum rename to vendor/github.com/go-air/gini/go.sum diff --git a/vendor/github.com/operator-framework/gini/inter/doc.go b/vendor/github.com/go-air/gini/inter/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/inter/doc.go rename to vendor/github.com/go-air/gini/inter/doc.go diff --git a/vendor/github.com/operator-framework/gini/inter/s.go b/vendor/github.com/go-air/gini/inter/s.go similarity index 99% rename from vendor/github.com/operator-framework/gini/inter/s.go rename to vendor/github.com/go-air/gini/inter/s.go index 835a93375c..248068d11f 100644 --- a/vendor/github.com/operator-framework/gini/inter/s.go +++ b/vendor/github.com/go-air/gini/inter/s.go @@ -6,7 +6,7 @@ package inter import ( "time" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Interface Solveable encapsulates a decision diff --git a/vendor/github.com/operator-framework/gini/inter/solve.go b/vendor/github.com/go-air/gini/inter/solve.go similarity index 100% rename from vendor/github.com/operator-framework/gini/inter/solve.go rename to vendor/github.com/go-air/gini/inter/solve.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/active.go b/vendor/github.com/go-air/gini/internal/xo/active.go similarity index 98% rename from vendor/github.com/operator-framework/gini/internal/xo/active.go rename to vendor/github.com/go-air/gini/internal/xo/active.go index 786f76204f..b0c906db6b 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/active.go +++ b/vendor/github.com/go-air/gini/internal/xo/active.go @@ -1,7 +1,7 @@ package xo import ( - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) type Active struct { diff --git a/vendor/github.com/operator-framework/gini/internal/xo/cdat.go b/vendor/github.com/go-air/gini/internal/xo/cdat.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/cdat.go rename to vendor/github.com/go-air/gini/internal/xo/cdat.go index 41b8367f0c..b97be0075b 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/cdat.go +++ b/vendor/github.com/go-air/gini/internal/xo/cdat.go @@ -9,7 +9,7 @@ import ( "io" "math" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Type CDat: basic operations for storing all the literals (and Chds) in a CNF diff --git a/vendor/github.com/operator-framework/gini/internal/xo/cdb.go b/vendor/github.com/go-air/gini/internal/xo/cdb.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/cdb.go rename to vendor/github.com/go-air/gini/internal/xo/cdb.go index d4615220b9..98c062c75f 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/cdb.go +++ b/vendor/github.com/go-air/gini/internal/xo/cdb.go @@ -8,7 +8,7 @@ import ( "fmt" "io" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Type Cdb is the main interface to clauses. diff --git a/vendor/github.com/operator-framework/gini/internal/xo/cgc.go b/vendor/github.com/go-air/gini/internal/xo/cgc.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/cgc.go rename to vendor/github.com/go-air/gini/internal/xo/cgc.go index 94cc04e747..01c7d6451b 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/cgc.go +++ b/vendor/github.com/go-air/gini/internal/xo/cgc.go @@ -6,7 +6,7 @@ package xo import ( "sort" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Type Cgc encapsulates clause compaction/garbage collection. diff --git a/vendor/github.com/operator-framework/gini/internal/xo/chd.go b/vendor/github.com/go-air/gini/internal/xo/chd.go similarity index 100% rename from vendor/github.com/operator-framework/gini/internal/xo/chd.go rename to vendor/github.com/go-air/gini/internal/xo/chd.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/cloc.go b/vendor/github.com/go-air/gini/internal/xo/cloc.go similarity index 82% rename from vendor/github.com/operator-framework/gini/internal/xo/cloc.go rename to vendor/github.com/go-air/gini/internal/xo/cloc.go index 158d40c3e1..46fabfdd8b 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/cloc.go +++ b/vendor/github.com/go-air/gini/internal/xo/cloc.go @@ -3,7 +3,7 @@ package xo -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" const ( CNull z.C = 0 diff --git a/vendor/github.com/operator-framework/gini/internal/xo/ctl.go b/vendor/github.com/go-air/gini/internal/xo/ctl.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/ctl.go rename to vendor/github.com/go-air/gini/internal/xo/ctl.go index 5a2d25ee21..dc267a2dd5 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/ctl.go +++ b/vendor/github.com/go-air/gini/internal/xo/ctl.go @@ -7,7 +7,7 @@ import ( "sync" "time" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Type Ctl encapsulates low level asynchronous control diff --git a/vendor/github.com/operator-framework/gini/internal/xo/derive.go b/vendor/github.com/go-air/gini/internal/xo/derive.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/derive.go rename to vendor/github.com/go-air/gini/internal/xo/derive.go index 988acf99fc..a2e2b6267c 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/derive.go +++ b/vendor/github.com/go-air/gini/internal/xo/derive.go @@ -6,7 +6,7 @@ package xo import ( "fmt" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) type Deriver struct { diff --git a/vendor/github.com/operator-framework/gini/internal/xo/dimacs.go b/vendor/github.com/go-air/gini/internal/xo/dimacs.go similarity index 91% rename from vendor/github.com/operator-framework/gini/internal/xo/dimacs.go rename to vendor/github.com/go-air/gini/internal/xo/dimacs.go index 9478b14a8b..0ac4113dce 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/dimacs.go +++ b/vendor/github.com/go-air/gini/internal/xo/dimacs.go @@ -3,7 +3,7 @@ package xo -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" // Type DimacsVis implements dimacs.Vis for constructing // solvers from dimacs cnf files. diff --git a/vendor/github.com/operator-framework/gini/internal/xo/doc.go b/vendor/github.com/go-air/gini/internal/xo/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/internal/xo/doc.go rename to vendor/github.com/go-air/gini/internal/xo/doc.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/guess.go b/vendor/github.com/go-air/gini/internal/xo/guess.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/guess.go rename to vendor/github.com/go-air/gini/internal/xo/guess.go index f5d8414df8..7816467955 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/guess.go +++ b/vendor/github.com/go-air/gini/internal/xo/guess.go @@ -6,7 +6,7 @@ package xo import ( "math" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) const ( diff --git a/vendor/github.com/operator-framework/gini/internal/xo/luby.go b/vendor/github.com/go-air/gini/internal/xo/luby.go similarity index 100% rename from vendor/github.com/operator-framework/gini/internal/xo/luby.go rename to vendor/github.com/go-air/gini/internal/xo/luby.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/phases.go b/vendor/github.com/go-air/gini/internal/xo/phases.go similarity index 93% rename from vendor/github.com/operator-framework/gini/internal/xo/phases.go rename to vendor/github.com/go-air/gini/internal/xo/phases.go index 1f3bda755a..a04be18aab 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/phases.go +++ b/vendor/github.com/go-air/gini/internal/xo/phases.go @@ -1,6 +1,6 @@ package xo -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" type phases z.Var diff --git a/vendor/github.com/operator-framework/gini/internal/xo/s.go b/vendor/github.com/go-air/gini/internal/xo/s.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/s.go rename to vendor/github.com/go-air/gini/internal/xo/s.go index 7d10639622..9f7d865693 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/s.go +++ b/vendor/github.com/go-air/gini/internal/xo/s.go @@ -11,9 +11,9 @@ import ( "sync" "time" - "github.com/operator-framework/gini/dimacs" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/dimacs" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) const ( diff --git a/vendor/github.com/operator-framework/gini/internal/xo/stats.go b/vendor/github.com/go-air/gini/internal/xo/stats.go similarity index 100% rename from vendor/github.com/operator-framework/gini/internal/xo/stats.go rename to vendor/github.com/go-air/gini/internal/xo/stats.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/tracer.go b/vendor/github.com/go-air/gini/internal/xo/tracer.go similarity index 100% rename from vendor/github.com/operator-framework/gini/internal/xo/tracer.go rename to vendor/github.com/go-air/gini/internal/xo/tracer.go diff --git a/vendor/github.com/operator-framework/gini/internal/xo/trail.go b/vendor/github.com/go-air/gini/internal/xo/trail.go similarity index 99% rename from vendor/github.com/operator-framework/gini/internal/xo/trail.go rename to vendor/github.com/go-air/gini/internal/xo/trail.go index 9f67388c8a..b7aa04d646 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/trail.go +++ b/vendor/github.com/go-air/gini/internal/xo/trail.go @@ -7,7 +7,7 @@ import ( "bytes" "fmt" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) type late struct { diff --git a/vendor/github.com/operator-framework/gini/internal/xo/vars.go b/vendor/github.com/go-air/gini/internal/xo/vars.go similarity index 98% rename from vendor/github.com/operator-framework/gini/internal/xo/vars.go rename to vendor/github.com/go-air/gini/internal/xo/vars.go index 02a25fd985..431dccf2ec 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/vars.go +++ b/vendor/github.com/go-air/gini/internal/xo/vars.go @@ -7,7 +7,7 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) type Vars struct { diff --git a/vendor/github.com/operator-framework/gini/internal/xo/watch.go b/vendor/github.com/go-air/gini/internal/xo/watch.go similarity index 97% rename from vendor/github.com/operator-framework/gini/internal/xo/watch.go rename to vendor/github.com/go-air/gini/internal/xo/watch.go index 4e30635742..fdd753f79f 100644 --- a/vendor/github.com/operator-framework/gini/internal/xo/watch.go +++ b/vendor/github.com/go-air/gini/internal/xo/watch.go @@ -6,7 +6,7 @@ package xo import ( "fmt" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Watch holds other blocking literal, clause location ( diff --git a/vendor/github.com/operator-framework/gini/logic/c.go b/vendor/github.com/go-air/gini/logic/c.go similarity index 98% rename from vendor/github.com/operator-framework/gini/logic/c.go rename to vendor/github.com/go-air/gini/logic/c.go index 081d32cc62..c42c9e582c 100644 --- a/vendor/github.com/operator-framework/gini/logic/c.go +++ b/vendor/github.com/go-air/gini/logic/c.go @@ -4,8 +4,8 @@ package logic import ( - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) // C represents a formula or combinational circuit. @@ -376,5 +376,5 @@ func (p *C) grow() { } func strashCode(a, b z.Lit) uint32 { - return uint32((a << 13) * b) + return uint32(^(a << 13) * b) } diff --git a/vendor/github.com/operator-framework/gini/logic/card.go b/vendor/github.com/go-air/gini/logic/card.go similarity index 98% rename from vendor/github.com/operator-framework/gini/logic/card.go rename to vendor/github.com/go-air/gini/logic/card.go index af63f2ff22..2f8a074ce4 100644 --- a/vendor/github.com/operator-framework/gini/logic/card.go +++ b/vendor/github.com/go-air/gini/logic/card.go @@ -4,7 +4,7 @@ package logic import ( - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/z" ) // Card provides an interface for different implementations diff --git a/vendor/github.com/operator-framework/gini/logic/doc.go b/vendor/github.com/go-air/gini/logic/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/logic/doc.go rename to vendor/github.com/go-air/gini/logic/doc.go diff --git a/vendor/github.com/operator-framework/gini/logic/roll.go b/vendor/github.com/go-air/gini/logic/roll.go similarity index 97% rename from vendor/github.com/operator-framework/gini/logic/roll.go rename to vendor/github.com/go-air/gini/logic/roll.go index abd501997f..3ec3c8af64 100644 --- a/vendor/github.com/operator-framework/gini/logic/roll.go +++ b/vendor/github.com/go-air/gini/logic/roll.go @@ -3,7 +3,7 @@ package logic -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" // Roll creates an unroller of sequential logic into // combinational logic. diff --git a/vendor/github.com/operator-framework/gini/logic/s.go b/vendor/github.com/go-air/gini/logic/s.go similarity index 98% rename from vendor/github.com/operator-framework/gini/logic/s.go rename to vendor/github.com/go-air/gini/logic/s.go index badcae2843..2669aba57f 100644 --- a/vendor/github.com/operator-framework/gini/logic/s.go +++ b/vendor/github.com/go-air/gini/logic/s.go @@ -3,7 +3,7 @@ package logic -import "github.com/operator-framework/gini/z" +import "github.com/go-air/gini/z" // S adds sequential elements to C, gini's combinational // logic representation. diff --git a/vendor/github.com/operator-framework/gini/s.go b/vendor/github.com/go-air/gini/s.go similarity index 84% rename from vendor/github.com/operator-framework/gini/s.go rename to vendor/github.com/go-air/gini/s.go index caa6281b6a..bdea6ae82e 100644 --- a/vendor/github.com/operator-framework/gini/s.go +++ b/vendor/github.com/go-air/gini/s.go @@ -3,7 +3,7 @@ package gini -import "github.com/operator-framework/gini/inter" +import "github.com/go-air/gini/inter" // NewS creates a new solver, which is the Gini // implementation of inter.S. diff --git a/vendor/github.com/operator-framework/gini/sv.go b/vendor/github.com/go-air/gini/sv.go similarity index 95% rename from vendor/github.com/operator-framework/gini/sv.go rename to vendor/github.com/go-air/gini/sv.go index 546b93c0c2..f6a525fa39 100644 --- a/vendor/github.com/operator-framework/gini/sv.go +++ b/vendor/github.com/go-air/gini/sv.go @@ -6,8 +6,8 @@ package gini import ( "time" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) type svWrap struct { diff --git a/vendor/github.com/operator-framework/gini/z/c.go b/vendor/github.com/go-air/gini/z/c.go similarity index 100% rename from vendor/github.com/operator-framework/gini/z/c.go rename to vendor/github.com/go-air/gini/z/c.go diff --git a/vendor/github.com/operator-framework/gini/z/doc.go b/vendor/github.com/go-air/gini/z/doc.go similarity index 100% rename from vendor/github.com/operator-framework/gini/z/doc.go rename to vendor/github.com/go-air/gini/z/doc.go diff --git a/vendor/github.com/operator-framework/gini/z/dv.go b/vendor/github.com/go-air/gini/z/dv.go similarity index 100% rename from vendor/github.com/operator-framework/gini/z/dv.go rename to vendor/github.com/go-air/gini/z/dv.go diff --git a/vendor/github.com/operator-framework/gini/z/lit.go b/vendor/github.com/go-air/gini/z/lit.go similarity index 100% rename from vendor/github.com/operator-framework/gini/z/lit.go rename to vendor/github.com/go-air/gini/z/lit.go diff --git a/vendor/github.com/operator-framework/gini/z/var.go b/vendor/github.com/go-air/gini/z/var.go similarity index 100% rename from vendor/github.com/operator-framework/gini/z/var.go rename to vendor/github.com/go-air/gini/z/var.go diff --git a/vendor/github.com/operator-framework/gini/README.md b/vendor/github.com/operator-framework/gini/README.md deleted file mode 100644 index 42d6ff2fb1..0000000000 --- a/vendor/github.com/operator-framework/gini/README.md +++ /dev/null @@ -1,339 +0,0 @@ -# Gini SAT Solver - -The Gini sat solver is a fast, clean SAT solver written in Go. It is to our knowledge -the first ever performant pure-Go SAT solver made available. - -| [![Build Status](https://travis-ci.org/irifrance/gini.svg?branch=master)](https://travis-ci.org/irifrance/gini) | [![GoDoc](https://godoc.org/github.com/irifrance/gini?status.svg)](https://godoc.org/github.com/irifrance/gini) | [Google Group](https://groups.google.com/d/forum/ginisat) | -------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------| - -This solver is fully open source, originally developped at IRI France. - - -## Build/Install - -For the impatient: - - go get github.com/irifrance/gini... - -I recommend however building the package github.com/irifrance/gini/internal/xo with bounds checking -turned off. This package is all about anything-goes performance and is the workhorse behind most of -the gini sat solver. It is also extensively tested and well benchmarked, so it should not pose any -safety threat to client code. This makes a signficant speed difference (maybe 10%) on long running -problems. - - -## The SAT Problem - -The SAT problem is perhaps the most famous NP-complete problem. As such, SAT -solvers can be used to try to solve hard problems, such as travelling salesman -or RSA cracking. In practice, many SAT problems are quite easy (but not -decryption problems...yet). The solvers are used in software verification, -hardware verification and testing, AI planning, routing, etc. - -The SAT problem is a Boolean problem. All variables can either be true or -false, but nothing else. The SAT problem solves systems of Boolean -constraints, called clauses. Namely, SAT solvers work on conjunctive normal -form problems (CNFs). There are many ways to efficiently code arbitrary logic -into CNF, so this is not so much a restricting factor. Nonetheless, we present -CNF and the problem below in a brief self-contained fashion which we find -useful. Readers interested in more depth should consult Wikipedia, or The -Handbook of Satisfiability, or Donald Knuth's latest volume of The Art of -Computer Programming. - -### CNF - -A CNF is a conjunction of clauses - - c1 and c2 and ... and cM - -Each c[i], i in [1..M], is a clause, which is of the form - - m1 or m2 or ... or mN - -where each m[i], i in [1..N] is either a Boolean variable (such as x), or the -negation of a Boolean variable (such as not(y)). An expression which is either -a Boolean variable or its negation is called a "literal". - -In the following, we refer to variables simply by integers 1,2,3,... - -Clauses are often written in succint form - - -3 11 12 14 -257 - -Numerical negation indicates logical negation, and spaces are disjunctions -"or". Sometimes "+" is used for "or". - -Conjunctions are just concatenation of clauses. We can parenthesize clauses -such as - - (1 -2) (2 -3) (3 -4) (4 -1) - -which expresses a set of clauses whose satisfying assignments are - - {1,2,3,4} - or - {-1,-2,-3,-4} - -### Models - -A model of a CNF is a value for each of the variables which makes every clause -in the CNF true. The SAT problem is determining whether or not a model exists -for a given set of clauses. - - -### Proofs - -#### Resolution - -Resolution is a form of logical reasoning with conjunctions of clauses. Given -2 clauses of the form - - C + v -and - - D + -v - -We can conclude that - - C + D - -must be true. - -Here, C and D are arbitrary clauses. - -Resolution proof of unsatisfiability is a derivation of the empty disjuction -(false) by means of resolution. Resolution proofs, even minimally sized ones, -can be very large, exponentially larger than the input problem. - -Modern SAT solvers mostly rely on performing operations which correspond to -bounded size (in terms of number of variables) number of resolutions. Given -this fact together with the fact that the minimal proofs can be exponentially -large in the number of variables, some problems can take an exponential amount -of time. - -Nonetheless, many SAT solvers have heuristics and are optimised so much that -even hard problems become tractable. With up to several tens of millions of -resolutions happening per second on one modern single core CPU, even problems -with known exponential bounds on resolution steps can be solved. - -## Solving Formulas and Circuits - -Gini provides a simple and efficient logic modelling library which supports -easy construction of arbitrary Boolean formulas. The library uses and-inverter -graphs, structural hashing, constant propagation and can be used for -constructing compact formulas with a rich set of Boolean operators. The -circuit type implements an interface which makes it plug into a solver -automatically. In fact, the circuit type uses the same representation for -literals as the solver, so there is no need to map between solver and circuit -variables. - -Additionally, sequential circuits are supported. The sequential part of the -logic library provides memory elements (latches) which are evaluated initially -as inputs and take a "next" value which provides input to the next cycle of the -circuit. The library supports unrolling sequential circuits for a fixed number -of cycles to arrive at a non-sequential formula which can then be checked for -satisfiability using solving tools. - -Gini also supports cardinality constraints which can constrain how many of a -set of Boolean variables are true. Cardinality constraints in turn provide -an easy means of doing optimisation. Gini uses sorting networks to code -cardinality constraints into clauses. Sorting networks are a good general -purpose means of handling cardinality constraints in a problem context which -also contains lots of purely Boolean logic (implicitly or not). - -Most SAT use cases use a front end for modelling arbitrary formulas. When formats -are needed for interchange, Gini supports the following. - -### Aiger - -Gini supports [aiger version 1.9](http://fmv.jku.at/aiger/) in conjunction -with its logic library. The logic.C and logic.S circuit types can be -stored, exchanged, read and written in aiger ascii and binary formats. - -### Dimacs - -CNF Dimacs files, which are an ancient widely used format for representing CNF -formulas. Dimacs files are usually used for benchmarking solvers, to eliminate -the formula representation layer. The fact that the format is more or less -universally supported amongst SAT solvers leads some SAT users to use this -format, even though there is I/O, CNF translation, and parsing overhead by -comparison to using a logic library. - - -## Optimisation - -With Cardinality constraints, optimisation is easy - - import "github.com/irifrance/gini" - import "github.com/irifrance/gini/logic" - - c := logic.NewC() - - - // suppose we encode package constraints for a module in the circuit c - // and we have a slice S of dependent packages P each of which has an attribute - // P.needsRepl which indicates whether or not it needs to be replaced (of type - // github.com/irifrance/gini/z.Lit) - - repls := make([]z.Lit, 0, 1<<23) - for _, p := range pkgs { - repls = append(repls, p.needsRepl) - } - - // make a cardinality constraints object - cards := c.CardSort(repls) - - // loop through the constraints (note a linear search - // can be faster than a binary search in this case because the underlying solver - // often has locality of logic cache w.r.t. cardinality constraints) - s := gini.New() - c.ToCnf(s) - minRepls := -1 - for i := range repls { - s.Assume(cards.Leq(i)) - if s.Solve() == 1 { - minRepls = i - break - } - } - - // use the model, if one was found, from s to propose a build - -## Activation Literals - -Gini supports recycling activation literals with the -[Activatable interface](http://godoc.org/github.com/irifrance/gini/inter#Activatable) - -Even without recycling, activation literals provide an easy way to solve MAXSAT problems: -just activate each clause, use a cardinality constraint on the activation literals, -and then optimize the output. - -With recycling, one can do much more, such as activating and deactivating sets of clauses, -and constructing the clauses on the fly. Activations work underneath test scopes and -assumptions, making the interface for Gini perhaps the most flexible available. - - -## Performance - -In applications, SAT problems normally have an exponential tail runtime -distribution with a strong bias towards bigger problems populating the longer -runtime part of the distribution. So in practice, a good rule of thumb is 1 in -N problems will on average take longer than time alotted to solve it for a -problem of a given size, and then one measures N experimentally. Very often, -despite the NP nature of SAT, an application can be designed to use a SAT solver -in a way that problems almost never take too long. Additionally, the hardest known -hand-crafted problems for CDCL solvers which take significant time involve at least -a few hundred variables. So if you're application has only a few hundred variables, -you're probably not going to have any performance problems at all with any solver. - -As in almost every solver, the core CDCL solver in Gini is the workhorse and is a -good general purpose solver. Some specific applications do benefit from -pre- or in-processing, and some some applications may not be useable with such -techniques. Other solvers provide more and better pre- or in-processing than Gini -and help is welcome in adding such solving techniques to Gini. - -The core CDCL solver in Gini has been compared with that in MiniSAT and PicoSAT, -two standard such solvers on randomly chosen SAT competition problems. In this -evaluation, Gini out performed PicoSAT and was neck-in-neck with MiniSAT. The -core CDCL solver in Gini also measures up to PicoSAT and MiniSAT in terms of -"propagations per second", indicating the core routines are themselves competitive -with these solvers, not only the heuristics. This level of performance has not to -our knowledge been achieved by other sat solvers in Go, such as go-sat or gophersat. - -While the above evaluation casts a fairly wide net over application domains and -problem difficulty, the performance of sat solvers and underlying algorithms are -fundamentally hard to predict in any rigorous way. So your experience may differ, -but we are confident Gini's core solver is a well positioned alternative to standard -high-performance CDCL solvers in C/C++. We encourage you to give it a try and welcome -any comparisons. - -### Benchmarking - -To that end, gini comes with a nifty SAT solver benchmarking tool which allows -to easily select benchmarks into a "bench" format, which is just a particular -structure of directories and files. The tool can then also run solvers -on such generated "bench"'s, enforcing various timeouts and logging all details, -again in a standard format. To tool then can compare the results in various -fashions, printing out scatter and cactus plots (in UTF8/ascii art) of various -user selectable subsets of the benchmark run. - -You may find this tool useful to fork and adopt to benchmark a new kind of -program. The benchmarking mechanism is appropriate for any "solver" like -software (SMT, CPLEX, etc) where runtimes vary and are unpredictable and -potentially high. If you do so, please follow the license or ask for -alternatives. - -## Concurrency - -Gini is written in Go and uses several goroutines by default for garbage -collection and system call scheduling. There is a "core" single-goroutine -solver, xo, which is in an internal package for gutsy low level SAT hackers. - -### Connections to solving processes - -Gini provides safe connections to solving processes which are guaranteed to not -lose any solution found, can pause and resume, run with a timeout, test without -solving, etc. - -### Solve-time copyable solvers. - -Gini provides copyable solvers, which can be safely copied *at solvetime during -a pause*. - -### Ax -Gini provides an "Assumption eXchange" package for deploying solves -under different sets of assumptions to the same set of underlying constraints -in parallel. This can give linear speed up in tasks, such as PDR/IC3, which -generate lots of assumptions. - -We hope to extend this with clause sharing soon, which would give -superlinear speedup according to the literature. - -## Distributed and CRISP - -Gini provides a definition and reference implementation for -[CRISP-1.0](https://github.com/irifrance/gini/blob/master/doc/crisp/crisp.pdf), -the compressed incremental SAT protocol. The protocol is a client-server wire -protocol which can dispatch an incremental sat solver with very little overhead -as compared to direct API calls. The advantage of using a protocol is that it -allows arbitrary tools to implement the solving on arbitrary hardware without -affecting the client. - -Many SAT applications are incremental and easily solve huge numbers of problems -while only a few problems are hard. CRISP facilitates pulling out the big guns -for the hard problems while not affecting performance for easy problems. Big -guns tend to be harder to integrate into applications because of compilation -issues, hardware requirements, size and complexity of the code base, etc. -Applications that use CRISP can truly isolate themselves from the woes of -integrating big guns while benefiting on hard problems. - -CRISP also allows language independent incremental SAT solving. The -applications and solvers can be readily implemented without the headache of -synchronizing programming language, compilers, or coding style. - -We are planning on implementing some CRISP extensions, namely the multiplexing -interface which will enable (possibly remote) clients to control -programmatically partitioning or queuing of related SAT problems. - -The CRISP protocol provides a basis for distributed solving. Gini implements -a CRISP-1.0 client and server. - -A command, crispd, is supplied for the CRISP server. - -## Citing Gini - -Zenodo DOI based citations and download: -[![DOI](https://zenodo.org/badge/64034957.svg)](https://zenodo.org/badge/latestdoi/64034957) - -BibText: -``` -@misc{scott_cotton_2019_2553490, - author = {Scott Cotton}, - title = {irifrance/gini: Sapeur}, - month = jan, - year = 2019, - doi = {10.5281/zenodo.2553490}, - url = {https://doi.org/10.5281/zenodo.2553490} -} -``` - diff --git a/vendor/github.com/operator-framework/gini/go.mod b/vendor/github.com/operator-framework/gini/go.mod deleted file mode 100644 index 15f34b3a9f..0000000000 --- a/vendor/github.com/operator-framework/gini/go.mod +++ /dev/null @@ -1 +0,0 @@ -module github.com/operator-framework/gini diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go index ca3c4f5331..785ee409fd 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/constraints.go @@ -4,8 +4,8 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini/logic" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/logic" + "github.com/go-air/gini/z" ) // Constraint implementations limit the circumstances under which a diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go index f837ffc3e8..dedb5fb8da 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/lit_mapping.go @@ -4,9 +4,9 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/logic" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/logic" + "github.com/go-air/gini/z" ) type DuplicateIdentifier Identifier diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go index f36678f1ee..ed84ea9309 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/search.go @@ -3,8 +3,8 @@ package solver import ( "context" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) type choice struct { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go index 712ae3bcc7..5d81f459a2 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver/solve.go @@ -6,9 +6,9 @@ import ( "fmt" "strings" - "github.com/operator-framework/gini" - "github.com/operator-framework/gini/inter" - "github.com/operator-framework/gini/z" + "github.com/go-air/gini" + "github.com/go-air/gini/inter" + "github.com/go-air/gini/z" ) var Incomplete = errors.New("cancelled before a solution could be found") diff --git a/vendor/modules.txt b/vendor/modules.txt index 09ff8703c0..5ce7c4a3a8 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -199,6 +199,13 @@ github.com/form3tech-oss/jwt-go github.com/fsnotify/fsnotify # github.com/ghodss/yaml v1.0.0 github.com/ghodss/yaml +# github.com/go-air/gini v1.0.4 +github.com/go-air/gini +github.com/go-air/gini/dimacs +github.com/go-air/gini/inter +github.com/go-air/gini/internal/xo +github.com/go-air/gini/logic +github.com/go-air/gini/z # github.com/go-bindata/go-bindata/v3 v3.1.3 ## explicit github.com/go-bindata/go-bindata/v3 @@ -486,13 +493,6 @@ github.com/operator-framework/api/pkg/validation github.com/operator-framework/api/pkg/validation/errors github.com/operator-framework/api/pkg/validation/interfaces github.com/operator-framework/api/pkg/validation/internal -# github.com/operator-framework/gini v1.1.0 -github.com/operator-framework/gini -github.com/operator-framework/gini/dimacs -github.com/operator-framework/gini/inter -github.com/operator-framework/gini/internal/xo -github.com/operator-framework/gini/logic -github.com/operator-framework/gini/z # github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 => ./staging/operator-lifecycle-manager ## explicit github.com/operator-framework/operator-lifecycle-manager/cmd/catalog From e8ed9cd753f6a5d6c7904d54ff589c7a9cf483ca Mon Sep 17 00:00:00 2001 From: Camila Macedo Date: Fri, 27 Aug 2021 15:03:29 +0100 Subject: [PATCH 27/45] (fix) : Fix check to verify OCP label versions when it is =v4.x (#148) Upstream-repository: api Upstream-commit: e4b9266c693b1443c33fff99aabd49c07232e6ba --- .../api/pkg/validation/internal/community.go | 139 +++++++++--------- .../pkg/validation/internal/community_test.go | 12 ++ .../validation/internal/operatorhub_test.go | 6 +- .../dockerfile/valid_bundle_4_8.Dockerfile | 18 +++ .../api/pkg/validation/internal/community.go | 139 +++++++++--------- 5 files changed, 179 insertions(+), 135 deletions(-) create mode 100644 staging/api/pkg/validation/internal/testdata/dockerfile/valid_bundle_4_8.Dockerfile diff --git a/staging/api/pkg/validation/internal/community.go b/staging/api/pkg/validation/internal/community.go index 0ff7a9b4e0..4157332370 100644 --- a/staging/api/pkg/validation/internal/community.go +++ b/staging/api/pkg/validation/internal/community.go @@ -239,75 +239,71 @@ func validateImageFile(checks CommunityOperatorChecks, deprecatedAPImsg string) } value := strings.Split(line[i], "=") - indexRange := value[1] - doubleCote := "\"" - singleCote := "'" - indexRange = strings.ReplaceAll(indexRange, singleCote, "") - indexRange = strings.ReplaceAll(indexRange, doubleCote, "") + // It means that the OCP label is =OCP version + if len(value) > 2 && len(value[2]) > 0 { + version := cleanStringToGetTheVersionToParse(value[2]) + verParsed, err := semver.ParseTolerant(version) + if err != nil { + checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", + version, ocpLabelindex)) + return checks + } + + if verParsed.GE(semVerOCPV1beta1Unsupported) { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ + "Migrate the API(s) for "+ + "%s or provide compatible version(s) by using the %s annotation in "+ + "`metadata/annotations.yaml` to ensure that the index image will be geneared "+ + "with its label. (e.g. LABEL %s='4.6-4.8')", + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks + } + return checks + } + indexRange := cleanStringToGetTheVersionToParse(value[1]) if len(indexRange) > 1 { // if has the = then, the value needs to be < 4.9 - if strings.Contains(indexRange, "=") { - version := strings.Split(indexRange, "=")[1] - verParsed, err := semver.ParseTolerant(version) - if err != nil { - checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", - version, ocpLabelindex)) - return checks - } - - if verParsed.GE(semVerOCPV1beta1Unsupported) { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ - "Migrate the API(s) for "+ - "%s or provide compatible version(s) by using the %s annotation in "+ - "`metadata/annotations.yaml` to ensure that the index image will be geneared "+ - "with its label. (e.g. LABEL %s='4.6-4.8')", - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } - } else { - // if not has not the = then the value needs contains - value less < 4.9 - if !strings.Contains(indexRange, "-") { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22 "+ - "The %s allows to distribute it on >= %s. Migrate the API(s) for "+ - "%s or provide compatible version(s) by using the %s annotation in "+ - "`metadata/annotations.yaml` to ensure that the index image will be generated "+ - "with its label. (e.g. LABEL %s='4.6-4.8')", - indexRange, - ocpVerV1beta1Unsupported, - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } - - version := strings.Split(indexRange, "-")[1] - verParsed, err := semver.ParseTolerant(version) - if err != nil { - checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", - version, ocpLabelindex)) - return checks - } - - if verParsed.GE(semVerOCPV1beta1Unsupported) { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ - "Upgrade the APIs from "+ - "for %s or provide compatible distribution version(s) by using the %s "+ - "annotation in `metadata/annotations.yaml` to ensure that the index image will "+ - "be generated with its label. (e.g. LABEL %s='4.6-4.8')", - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } + // if not has not the = then the value needs contains - value less < 4.9 + if !strings.Contains(indexRange, "-") { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22 "+ + "The %s allows to distribute it on >= %s. Migrate the API(s) for "+ + "%s or provide compatible version(s) by using the %s annotation in "+ + "`metadata/annotations.yaml` to ensure that the index image will be generated "+ + "with its label. (e.g. LABEL %s='4.6-4.8')", + indexRange, + ocpVerV1beta1Unsupported, + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks + } + + version := strings.Split(indexRange, "-")[1] + verParsed, err := semver.ParseTolerant(version) + if err != nil { + checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", + version, ocpLabelindex)) + return checks + } + if verParsed.GE(semVerOCPV1beta1Unsupported) { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ + "Upgrade the APIs from "+ + "for %s or provide compatible distribution version(s) by using the %s "+ + "annotation in `metadata/annotations.yaml` to ensure that the index image will "+ + "be generated with its label. (e.g. LABEL %s='4.6-4.8')", + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks } } else { checks.errs = append(checks.errs, fmt.Errorf("unable to get the range informed on %s", @@ -328,3 +324,14 @@ func validateImageFile(checks CommunityOperatorChecks, deprecatedAPImsg string) } return checks } + +// cleanStringToGetTheVersionToParse will remove the expected characters for +// we are able to parse the version informed. +func cleanStringToGetTheVersionToParse(value string) string { + doubleQuote := "\"" + singleQuote := "'" + value = strings.ReplaceAll(value, singleQuote, "") + value = strings.ReplaceAll(value, doubleQuote, "") + value = strings.ReplaceAll(value, "v", "") + return value +} diff --git a/staging/api/pkg/validation/internal/community_test.go b/staging/api/pkg/validation/internal/community_test.go index 7ed693209b..0f91e8934c 100644 --- a/staging/api/pkg/validation/internal/community_test.go +++ b/staging/api/pkg/validation/internal/community_test.go @@ -129,6 +129,18 @@ func Test_communityValidator(t *testing.T) { }, }, }, + { + name: "should pass when the olm annotation and index label are set with a " + + "value =v4.8 and has deprecated apis", + wantError: false, + args: args{ + bundleDir: "./testdata/valid_bundle_v1beta1", + imageIndexPath: "./testdata/dockerfile/valid_bundle_4_8.Dockerfile", + annotations: map[string]string{ + "olm.properties": fmt.Sprintf(`[{"type": "olm.maxOpenShiftVersion", "value": "4.8"}]`), + }, + }, + }, } for _, tt := range tests { diff --git a/staging/api/pkg/validation/internal/operatorhub_test.go b/staging/api/pkg/validation/internal/operatorhub_test.go index b4aa2ef854..f616276b1b 100644 --- a/staging/api/pkg/validation/internal/operatorhub_test.go +++ b/staging/api/pkg/validation/internal/operatorhub_test.go @@ -397,8 +397,8 @@ func TestValidateHubDeprecatedAPIS(t *testing.T) { minKubeVersion: "", directory: "./testdata/valid_bundle_v1beta1", }, - wantError: true, - errStrings: []string{"this bundle is using APIs which were deprecated and removed in v1.22. " + + wantError: true, + errStrings: []string{"this bundle is using APIs which were deprecated and removed in v1.22. " + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. " + "Migrate the API(s) for CRD: ([\"etcdbackups.etcd.database.coreos.com\"" + " \"etcdclusters.etcd.database.coreos.com\" \"etcdrestores.etcd.database.coreos.com\"])"}, @@ -423,7 +423,7 @@ func TestValidateHubDeprecatedAPIS(t *testing.T) { }, wantError: true, wantWarning: true, - errStrings: []string{"unable to use csv.Spec.MinKubeVersion to verify the CRD/Webhook apis because it " + + errStrings: []string{"unable to use csv.Spec.MinKubeVersion to verify the CRD/Webhook apis because it " + "has an invalid value: invalid"}, warnStrings: []string{"this bundle is using APIs which were deprecated and removed in v1.22. " + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. " + diff --git a/staging/api/pkg/validation/internal/testdata/dockerfile/valid_bundle_4_8.Dockerfile b/staging/api/pkg/validation/internal/testdata/dockerfile/valid_bundle_4_8.Dockerfile new file mode 100644 index 0000000000..9f96edfb62 --- /dev/null +++ b/staging/api/pkg/validation/internal/testdata/dockerfile/valid_bundle_4_8.Dockerfile @@ -0,0 +1,18 @@ +FROM scratch + +# Core bundle labels. +LABEL operators.operatorframework.io.bundle.mediatype.v1=registry+v1 +LABEL operators.operatorframework.io.bundle.manifests.v1=manifests/ +LABEL operators.operatorframework.io.bundle.metadata.v1=metadata/ +LABEL operators.operatorframework.io.bundle.package.v1=memcached-operator +LABEL operators.operatorframework.io.bundle.channels.v1=alpha +LABEL com.redhat.openshift.versions="=v4.8" + +# Labels for testing. +LABEL operators.operatorframework.io.test.mediatype.v1=scorecard+v1 +LABEL operators.operatorframework.io.test.config.v1=tests/scorecard/ + +# Copy files to locations specified by labels. +COPY bundle/manifests /manifests/ +COPY bundle/metadata /metadata/ +COPY bundle/tests/scorecard /tests/scorecard/ diff --git a/vendor/github.com/operator-framework/api/pkg/validation/internal/community.go b/vendor/github.com/operator-framework/api/pkg/validation/internal/community.go index 0ff7a9b4e0..4157332370 100644 --- a/vendor/github.com/operator-framework/api/pkg/validation/internal/community.go +++ b/vendor/github.com/operator-framework/api/pkg/validation/internal/community.go @@ -239,75 +239,71 @@ func validateImageFile(checks CommunityOperatorChecks, deprecatedAPImsg string) } value := strings.Split(line[i], "=") - indexRange := value[1] - doubleCote := "\"" - singleCote := "'" - indexRange = strings.ReplaceAll(indexRange, singleCote, "") - indexRange = strings.ReplaceAll(indexRange, doubleCote, "") + // It means that the OCP label is =OCP version + if len(value) > 2 && len(value[2]) > 0 { + version := cleanStringToGetTheVersionToParse(value[2]) + verParsed, err := semver.ParseTolerant(version) + if err != nil { + checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", + version, ocpLabelindex)) + return checks + } + + if verParsed.GE(semVerOCPV1beta1Unsupported) { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ + "Migrate the API(s) for "+ + "%s or provide compatible version(s) by using the %s annotation in "+ + "`metadata/annotations.yaml` to ensure that the index image will be geneared "+ + "with its label. (e.g. LABEL %s='4.6-4.8')", + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks + } + return checks + } + indexRange := cleanStringToGetTheVersionToParse(value[1]) if len(indexRange) > 1 { // if has the = then, the value needs to be < 4.9 - if strings.Contains(indexRange, "=") { - version := strings.Split(indexRange, "=")[1] - verParsed, err := semver.ParseTolerant(version) - if err != nil { - checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", - version, ocpLabelindex)) - return checks - } - - if verParsed.GE(semVerOCPV1beta1Unsupported) { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ - "Migrate the API(s) for "+ - "%s or provide compatible version(s) by using the %s annotation in "+ - "`metadata/annotations.yaml` to ensure that the index image will be geneared "+ - "with its label. (e.g. LABEL %s='4.6-4.8')", - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } - } else { - // if not has not the = then the value needs contains - value less < 4.9 - if !strings.Contains(indexRange, "-") { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22 "+ - "The %s allows to distribute it on >= %s. Migrate the API(s) for "+ - "%s or provide compatible version(s) by using the %s annotation in "+ - "`metadata/annotations.yaml` to ensure that the index image will be generated "+ - "with its label. (e.g. LABEL %s='4.6-4.8')", - indexRange, - ocpVerV1beta1Unsupported, - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } - - version := strings.Split(indexRange, "-")[1] - verParsed, err := semver.ParseTolerant(version) - if err != nil { - checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", - version, ocpLabelindex)) - return checks - } - - if verParsed.GE(semVerOCPV1beta1Unsupported) { - checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ - "deprecated and removed in v1.22. "+ - "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ - "Upgrade the APIs from "+ - "for %s or provide compatible distribution version(s) by using the %s "+ - "annotation in `metadata/annotations.yaml` to ensure that the index image will "+ - "be generated with its label. (e.g. LABEL %s='4.6-4.8')", - deprecatedAPImsg, - ocpLabelindex, - ocpLabelindex)) - return checks - } + // if not has not the = then the value needs contains - value less < 4.9 + if !strings.Contains(indexRange, "-") { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22 "+ + "The %s allows to distribute it on >= %s. Migrate the API(s) for "+ + "%s or provide compatible version(s) by using the %s annotation in "+ + "`metadata/annotations.yaml` to ensure that the index image will be generated "+ + "with its label. (e.g. LABEL %s='4.6-4.8')", + indexRange, + ocpVerV1beta1Unsupported, + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks + } + + version := strings.Split(indexRange, "-")[1] + verParsed, err := semver.ParseTolerant(version) + if err != nil { + checks.errs = append(checks.errs, fmt.Errorf("unable to parse the value (%s) on (%s)", + version, ocpLabelindex)) + return checks + } + if verParsed.GE(semVerOCPV1beta1Unsupported) { + checks.errs = append(checks.errs, fmt.Errorf("this bundle is using APIs which were "+ + "deprecated and removed in v1.22. "+ + "More info: https://kubernetes.io/docs/reference/using-api/deprecation-guide/#v1-22. "+ + "Upgrade the APIs from "+ + "for %s or provide compatible distribution version(s) by using the %s "+ + "annotation in `metadata/annotations.yaml` to ensure that the index image will "+ + "be generated with its label. (e.g. LABEL %s='4.6-4.8')", + deprecatedAPImsg, + ocpLabelindex, + ocpLabelindex)) + return checks } } else { checks.errs = append(checks.errs, fmt.Errorf("unable to get the range informed on %s", @@ -328,3 +324,14 @@ func validateImageFile(checks CommunityOperatorChecks, deprecatedAPImsg string) } return checks } + +// cleanStringToGetTheVersionToParse will remove the expected characters for +// we are able to parse the version informed. +func cleanStringToGetTheVersionToParse(value string) string { + doubleQuote := "\"" + singleQuote := "'" + value = strings.ReplaceAll(value, singleQuote, "") + value = strings.ReplaceAll(value, doubleQuote, "") + value = strings.ReplaceAll(value, "v", "") + return value +} From 0e9cefce87e3180200f9abe9e1613660a406a346 Mon Sep 17 00:00:00 2001 From: MorningSpace Date: Wed, 1 Sep 2021 02:56:10 +0800 Subject: [PATCH 28/45] Fix 2327: Detecting OLM existence before start to install (#2334) * Fix 2327 Signed-off-by: Ying Mo * Remove -o=jsonpath='{.spec}' Signed-off-by: Ying Mo Upstream-repository: operator-lifecycle-manager Upstream-commit: 03493b5e7178f3312f0220b0a2ee75db2b7c6459 --- staging/operator-lifecycle-manager/scripts/install.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/staging/operator-lifecycle-manager/scripts/install.sh b/staging/operator-lifecycle-manager/scripts/install.sh index 35c65b35ce..8d592a9ede 100755 --- a/staging/operator-lifecycle-manager/scripts/install.sh +++ b/staging/operator-lifecycle-manager/scripts/install.sh @@ -14,7 +14,7 @@ if [[ ${#@} -lt 1 || ${#@} -gt 2 ]]; then exit 1 fi -if kubectl get deployment olm-operator -n openshift-operator-lifecycle-manager -o=jsonpath='{.spec}' > /dev/null 2>&1; then +if kubectl get deployment olm-operator -n openshift-operator-lifecycle-manager > /dev/null 2>&1; then echo "OLM is already installed in a different configuration. This is common if you are not running a vanilla Kubernetes cluster. Exiting..." exit 1 fi @@ -24,6 +24,11 @@ base_url="${2:-${default_base_url}}" url="${base_url}/${release}" namespace=olm +if kubectl get deployment olm-operator -n ${namespace} > /dev/null 2>&1; then + echo "OLM is already installed in ${namespace} namespace. Exiting..." + exit 1 +fi + kubectl apply -f "${url}/crds.yaml" kubectl wait --for=condition=Established -f "${url}/crds.yaml" kubectl apply -f "${url}/olm.yaml" From 8236403f99013c215464edecc49f060ebd726f7b Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Tue, 31 Aug 2021 15:11:47 -0400 Subject: [PATCH 29/45] update default scaffolded opm base image (#762) - Change default base image scaffolded during `opm index` and `opm alpha generate dockerfile` to `quay.io/operator-framework/opm:latest` - update opm-example.Dockerfile to reflect this change (and to focus on file-based configs rather than sqlite databases) Signed-off-by: Joe Lanford Upstream-repository: operator-registry Upstream-commit: 0a190a8a95abd690062816b4f5b0dc2143cddf1c --- .../operator-registry/opm-example.Dockerfile | 23 +++++++++++-------- .../pkg/containertools/dockerfilegenerator.go | 2 +- .../dockerfilegenerator_test.go | 6 ++--- .../pkg/containertools/dockerfilegenerator.go | 2 +- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/staging/operator-registry/opm-example.Dockerfile b/staging/operator-registry/opm-example.Dockerfile index 85309a8248..a59dfb1af5 100644 --- a/staging/operator-registry/opm-example.Dockerfile +++ b/staging/operator-registry/opm-example.Dockerfile @@ -1,11 +1,14 @@ -FROM quay.io/operator-framework/upstream-opm-builder AS builder +# The base image is expected to contain +# /bin/opm (with a serve subcommand) and /bin/grpc_health_probe +FROM quay.io/operator-framework/opm:latest -FROM scratch -LABEL operators.operatorframework.io.index.database.v1=./index.db -COPY ["nsswitch.conf", "/etc/nsswitch.conf"] -COPY database ./ -COPY --from=builder /bin/opm /opm -COPY --from=builder /bin/grpc_health_probe /bin/grpc_health_probe -EXPOSE 50051 -ENTRYPOINT ["/opm"] -CMD ["registry", "serve", "--database", "index.db"] +# Configure the entrypoint and command +ENTRYPOINT ["/bin/opm"] +CMD ["serve", "/configs"] + +# Copy declarative config root into image at /configs +ADD index /configs + +# Set DC-specific label for the location of the DC root directory +# in the image +LABEL operators.operatorframework.io.index.configs.v1=/configs diff --git a/staging/operator-registry/pkg/containertools/dockerfilegenerator.go b/staging/operator-registry/pkg/containertools/dockerfilegenerator.go index f580b3168c..2ec06f41d2 100644 --- a/staging/operator-registry/pkg/containertools/dockerfilegenerator.go +++ b/staging/operator-registry/pkg/containertools/dockerfilegenerator.go @@ -8,7 +8,7 @@ import ( ) const ( - DefaultBinarySourceImage = "quay.io/operator-framework/upstream-opm-builder" + DefaultBinarySourceImage = "quay.io/operator-framework/opm:latest" DefaultDbLocation = "/database/index.db" DbLocationLabel = "operators.operatorframework.io.index.database.v1" ConfigsLocationLabel = "operators.operatorframework.io.index.configs.v1" diff --git a/staging/operator-registry/pkg/containertools/dockerfilegenerator_test.go b/staging/operator-registry/pkg/containertools/dockerfilegenerator_test.go index 6343974665..9952812bc8 100644 --- a/staging/operator-registry/pkg/containertools/dockerfilegenerator_test.go +++ b/staging/operator-registry/pkg/containertools/dockerfilegenerator_test.go @@ -3,11 +3,11 @@ package containertools_test import ( "testing" - "github.com/operator-framework/operator-registry/pkg/containertools" - "github.com/golang/mock/gomock" "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" + + "github.com/operator-framework/operator-registry/pkg/containertools" ) func TestGenerateDockerfile(t *testing.T) { @@ -39,7 +39,7 @@ func TestGenerateDockerfile_EmptyBaseImage(t *testing.T) { defer controller.Finish() databasePath := "database/index.db" - expectedDockerfile := `FROM quay.io/operator-framework/upstream-opm-builder + expectedDockerfile := `FROM quay.io/operator-framework/opm:latest LABEL operators.operatorframework.io.index.database.v1=/database/index.db ADD database/index.db /database/index.db EXPOSE 50051 diff --git a/vendor/github.com/operator-framework/operator-registry/pkg/containertools/dockerfilegenerator.go b/vendor/github.com/operator-framework/operator-registry/pkg/containertools/dockerfilegenerator.go index f580b3168c..2ec06f41d2 100644 --- a/vendor/github.com/operator-framework/operator-registry/pkg/containertools/dockerfilegenerator.go +++ b/vendor/github.com/operator-framework/operator-registry/pkg/containertools/dockerfilegenerator.go @@ -8,7 +8,7 @@ import ( ) const ( - DefaultBinarySourceImage = "quay.io/operator-framework/upstream-opm-builder" + DefaultBinarySourceImage = "quay.io/operator-framework/opm:latest" DefaultDbLocation = "/database/index.db" DbLocationLabel = "operators.operatorframework.io.index.database.v1" ConfigsLocationLabel = "operators.operatorframework.io.index.configs.v1" From 8bb37343beaa3874ebf75f470fc356fc57d744a1 Mon Sep 17 00:00:00 2001 From: Joe Lanford Date: Wed, 1 Sep 2021 11:02:12 -0400 Subject: [PATCH 30/45] fix: ensure operator images are included in rendered bundles related images (#771) Signed-off-by: Joe Lanford Upstream-repository: operator-registry Upstream-commit: f5dcf40f01b8707194fdde07818c8b440ee010fa --- .../operator-registry/alpha/action/render.go | 36 ++++++ .../alpha/action/render_test.go | 108 ++++++++++++++---- .../manifests/foo.v0.2.0.csv.yaml | 22 ++++ .../foo-index-v0.2.0-declcfg/foo/index.yaml | 9 +- .../operator-registry/alpha/action/render.go | 36 ++++++ .../manifests/foo.v0.2.0.csv.yaml | 22 ++++ .../foo-index-v0.2.0-declcfg/foo/index.yaml | 9 +- 7 files changed, 218 insertions(+), 24 deletions(-) diff --git a/staging/operator-registry/alpha/action/render.go b/staging/operator-registry/alpha/action/render.go index 042fcf5646..389c8ff44c 100644 --- a/staging/operator-registry/alpha/action/render.go +++ b/staging/operator-registry/alpha/action/render.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sort" "strings" "sync" @@ -76,6 +77,13 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { return nil, fmt.Errorf("render reference %q: %w", ref, err) } renderBundleObjects(cfg) + + for _, b := range cfg.Bundles { + sort.Slice(b.RelatedImages, func(i, j int) bool { + return b.RelatedImages[i].Image < b.RelatedImages[j].Image + }) + } + cfgs = append(cfgs, *cfg) } @@ -233,6 +241,7 @@ func sqliteToDeclcfg(ctx context.Context, dbFile string) (*declcfg.DeclarativeCo if err := populateDBRelatedImages(ctx, &cfg, db); err != nil { return nil, err } + return &cfg, nil } @@ -322,6 +331,33 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) { if err = json.Unmarshal(*rawValue, &relatedImages); err != nil { return nil, err } + + // Keep track of the images we've already found, so that we don't add + // them multiple times. + allImages := sets.NewString() + for _, ri := range relatedImages { + allImages = allImages.Insert(ri.Image) + } + + if !allImages.Has(b.BundleImage) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: b.BundleImage, + }) + } + + opImages, err := csv.GetOperatorImages() + if err != nil { + return nil, err + } + for img := range opImages { + if !allImages.Has(img) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: img, + }) + } + allImages = allImages.Insert(img) + } + return relatedImages, nil } diff --git a/staging/operator-registry/alpha/action/render_test.go b/staging/operator-registry/alpha/action/render_test.go index 5a27b2c882..40cef52504 100644 --- a/staging/operator-registry/alpha/action/render_test.go +++ b/staging/operator-registry/alpha/action/render_test.go @@ -101,11 +101,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -126,12 +126,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + Image: "test.registry/foo-operator/foo-2:v0.2.0", }, { Image: "test.registry/foo-operator/foo-bundle:v0.2.0", }, + { + Image: "test.registry/foo-operator/foo-init-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init:v0.2.0", + }, + { + Name: "other", + Image: "test.registry/foo-operator/foo-other:v0.2.0", + }, + { + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.2.0", + }, }, CsvJSON: string(foov2csv), Objects: []string{string(foov2csv), string(foov2crd)}, @@ -180,11 +193,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -205,12 +218,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + Image: "test.registry/foo-operator/foo-2:v0.2.0", }, { Image: "test.registry/foo-operator/foo-bundle:v0.2.0", }, + { + Image: "test.registry/foo-operator/foo-init-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init:v0.2.0", + }, + { + Name: "other", + Image: "test.registry/foo-operator/foo-other:v0.2.0", + }, + { + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.2.0", + }, }, CsvJSON: string(foov2csv), Objects: []string{string(foov2csv), string(foov2crd)}, @@ -258,11 +284,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -283,12 +309,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + Image: "test.registry/foo-operator/foo-2:v0.2.0", }, { Image: "test.registry/foo-operator/foo-bundle:v0.2.0", }, + { + Image: "test.registry/foo-operator/foo-init-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init:v0.2.0", + }, + { + Name: "other", + Image: "test.registry/foo-operator/foo-other:v0.2.0", + }, + { + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.2.0", + }, }, CsvJSON: string(foov2csv), Objects: []string{string(foov2csv), string(foov2crd)}, @@ -336,11 +375,11 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.1.0", + Image: "test.registry/foo-operator/foo-bundle:v0.1.0", }, { - Image: "test.registry/foo-operator/foo-bundle:v0.1.0", + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.1.0", }, }, CsvJSON: string(foov1csv), @@ -361,12 +400,25 @@ func TestRender(t *testing.T) { }, RelatedImages: []declcfg.RelatedImage{ { - Name: "operator", - Image: "test.registry/foo-operator/foo:v0.2.0", + Image: "test.registry/foo-operator/foo-2:v0.2.0", }, { Image: "test.registry/foo-operator/foo-bundle:v0.2.0", }, + { + Image: "test.registry/foo-operator/foo-init-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init:v0.2.0", + }, + { + Name: "other", + Image: "test.registry/foo-operator/foo-other:v0.2.0", + }, + { + Name: "operator", + Image: "test.registry/foo-operator/foo:v0.2.0", + }, }, CsvJSON: string(foov2csv), Objects: []string{string(foov2csv), string(foov2crd)}, @@ -395,6 +447,22 @@ func TestRender(t *testing.T) { property.MustBuildPackageRequired("bar", "<0.1.0"), }, RelatedImages: []declcfg.RelatedImage{ + { + Image: "test.registry/foo-operator/foo-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-bundle:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init-2:v0.2.0", + }, + { + Image: "test.registry/foo-operator/foo-init:v0.2.0", + }, + { + Name: "other", + Image: "test.registry/foo-operator/foo-other:v0.2.0", + }, { Name: "operator", Image: "test.registry/foo-operator/foo:v0.2.0", diff --git a/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml index d7e30bee03..823f91c0fd 100644 --- a/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml +++ b/staging/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml @@ -18,6 +18,28 @@ spec: skips: - foo.v0.1.1 - foo.v0.1.2 + install: + strategy: deployment + spec: + deployments: + - name: foo-operator + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init:v0.2.0 + containers: + - image: test.registry/foo-operator/foo:v0.2.0 + - name: foo-operator-2 + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + containers: + - image: test.registry/foo-operator/foo-2:v0.2.0 relatedImages: - name: operator image: test.registry/foo-operator/foo:v0.2.0 + - name: other + image: test.registry/foo-operator/foo-other:v0.2.0 diff --git a/staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml b/staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml index 900df7684e..7a126ee502 100644 --- a/staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml +++ b/staging/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml @@ -86,11 +86,16 @@ properties: versionRange: <0.1.0 - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMi4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJyZXBsYWNlcyI6ImZvby52MC4xLjAiLCJza2lwcyI6WyJmb28udjAuMS4xIiwiZm9vLnYwLjEuMiJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0= + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19 - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19 relatedImages: + - image: test.registry/foo-operator/foo-2:v0.2.0 + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + - image: test.registry/foo-operator/foo-init:v0.2.0 + - image: test.registry/foo-operator/foo-bundle:v0.2.0 + - image: test.registry/foo-operator/foo-other:v0.2.0 + name: other - image: test.registry/foo-operator/foo:v0.2.0 name: operator - - image: test.registry/foo-operator/foo-bundle:v0.2.0 diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go b/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go index 042fcf5646..389c8ff44c 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/render.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "os" "path/filepath" + "sort" "strings" "sync" @@ -76,6 +77,13 @@ func (r Render) Run(ctx context.Context) (*declcfg.DeclarativeConfig, error) { return nil, fmt.Errorf("render reference %q: %w", ref, err) } renderBundleObjects(cfg) + + for _, b := range cfg.Bundles { + sort.Slice(b.RelatedImages, func(i, j int) bool { + return b.RelatedImages[i].Image < b.RelatedImages[j].Image + }) + } + cfgs = append(cfgs, *cfg) } @@ -233,6 +241,7 @@ func sqliteToDeclcfg(ctx context.Context, dbFile string) (*declcfg.DeclarativeCo if err := populateDBRelatedImages(ctx, &cfg, db); err != nil { return nil, err } + return &cfg, nil } @@ -322,6 +331,33 @@ func getRelatedImages(b *registry.Bundle) ([]declcfg.RelatedImage, error) { if err = json.Unmarshal(*rawValue, &relatedImages); err != nil { return nil, err } + + // Keep track of the images we've already found, so that we don't add + // them multiple times. + allImages := sets.NewString() + for _, ri := range relatedImages { + allImages = allImages.Insert(ri.Image) + } + + if !allImages.Has(b.BundleImage) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: b.BundleImage, + }) + } + + opImages, err := csv.GetOperatorImages() + if err != nil { + return nil, err + } + for img := range opImages { + if !allImages.Has(img) { + relatedImages = append(relatedImages, declcfg.RelatedImage{ + Image: img, + }) + } + allImages = allImages.Insert(img) + } + return relatedImages, nil } diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml index d7e30bee03..823f91c0fd 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-bundle-v0.2.0/manifests/foo.v0.2.0.csv.yaml @@ -18,6 +18,28 @@ spec: skips: - foo.v0.1.1 - foo.v0.1.2 + install: + strategy: deployment + spec: + deployments: + - name: foo-operator + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init:v0.2.0 + containers: + - image: test.registry/foo-operator/foo:v0.2.0 + - name: foo-operator-2 + spec: + template: + spec: + initContainers: + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + containers: + - image: test.registry/foo-operator/foo-2:v0.2.0 relatedImages: - name: operator image: test.registry/foo-operator/foo:v0.2.0 + - name: other + image: test.registry/foo-operator/foo-other:v0.2.0 diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml index 900df7684e..7a126ee502 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/foo-index-v0.2.0-declcfg/foo/index.yaml @@ -86,11 +86,16 @@ properties: versionRange: <0.1.0 - type: olm.bundle.object value: - data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwicmVsYXRlZEltYWdlcyI6W3siaW1hZ2UiOiJ0ZXN0LnJlZ2lzdHJ5L2Zvby1vcGVyYXRvci9mb286djAuMi4wIiwibmFtZSI6Im9wZXJhdG9yIn1dLCJyZXBsYWNlcyI6ImZvby52MC4xLjAiLCJza2lwcyI6WyJmb28udjAuMS4xIiwiZm9vLnYwLjEuMiJdLCJ2ZXJzaW9uIjoiMC4yLjAifX0= + data: eyJhcGlWZXJzaW9uIjoib3BlcmF0b3JzLmNvcmVvcy5jb20vdjFhbHBoYTEiLCJraW5kIjoiQ2x1c3RlclNlcnZpY2VWZXJzaW9uIiwibWV0YWRhdGEiOnsiYW5ub3RhdGlvbnMiOnsib2xtLnNraXBSYW5nZSI6Ilx1MDAzYzAuMi4wIn0sIm5hbWUiOiJmb28udjAuMi4wIn0sInNwZWMiOnsiY3VzdG9tcmVzb3VyY2VkZWZpbml0aW9ucyI6eyJvd25lZCI6W3siZ3JvdXAiOiJ0ZXN0LmZvbyIsImtpbmQiOiJGb28iLCJuYW1lIjoiZm9vcy50ZXN0LmZvbyIsInZlcnNpb24iOiJ2MSJ9XX0sImRpc3BsYXlOYW1lIjoiRm9vIE9wZXJhdG9yIiwiaW5zdGFsbCI6eyJzcGVjIjp7ImRlcGxveW1lbnRzIjpbeyJuYW1lIjoiZm9vLW9wZXJhdG9yIiwic3BlYyI6eyJ0ZW1wbGF0ZSI6eyJzcGVjIjp7ImNvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQ6djAuMi4wIn1dfX19fSx7Im5hbWUiOiJmb28tb3BlcmF0b3ItMiIsInNwZWMiOnsidGVtcGxhdGUiOnsic3BlYyI6eyJjb250YWluZXJzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvby0yOnYwLjIuMCJ9XSwiaW5pdENvbnRhaW5lcnMiOlt7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLWluaXQtMjp2MC4yLjAifV19fX19XX0sInN0cmF0ZWd5IjoiZGVwbG95bWVudCJ9LCJyZWxhdGVkSW1hZ2VzIjpbeyJpbWFnZSI6InRlc3QucmVnaXN0cnkvZm9vLW9wZXJhdG9yL2Zvbzp2MC4yLjAiLCJuYW1lIjoib3BlcmF0b3IifSx7ImltYWdlIjoidGVzdC5yZWdpc3RyeS9mb28tb3BlcmF0b3IvZm9vLW90aGVyOnYwLjIuMCIsIm5hbWUiOiJvdGhlciJ9XSwicmVwbGFjZXMiOiJmb28udjAuMS4wIiwic2tpcHMiOlsiZm9vLnYwLjEuMSIsImZvby52MC4xLjIiXSwidmVyc2lvbiI6IjAuMi4wIn19 - type: olm.bundle.object value: data: eyJhcGlWZXJzaW9uIjoiYXBpZXh0ZW5zaW9ucy5rOHMuaW8vdjEiLCJraW5kIjoiQ3VzdG9tUmVzb3VyY2VEZWZpbml0aW9uIiwibWV0YWRhdGEiOnsibmFtZSI6ImZvb3MudGVzdC5mb28ifSwic3BlYyI6eyJncm91cCI6InRlc3QuZm9vIiwibmFtZXMiOnsia2luZCI6IkZvbyIsInBsdXJhbCI6ImZvb3MifSwidmVyc2lvbnMiOlt7Im5hbWUiOiJ2MSJ9XX19 relatedImages: + - image: test.registry/foo-operator/foo-2:v0.2.0 + - image: test.registry/foo-operator/foo-init-2:v0.2.0 + - image: test.registry/foo-operator/foo-init:v0.2.0 + - image: test.registry/foo-operator/foo-bundle:v0.2.0 + - image: test.registry/foo-operator/foo-other:v0.2.0 + name: other - image: test.registry/foo-operator/foo:v0.2.0 name: operator - - image: test.registry/foo-operator/foo-bundle:v0.2.0 From 3a6c3207bc772a7796ffe4d518518e5831ea89d8 Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Wed, 1 Sep 2021 17:54:31 -0400 Subject: [PATCH 31/45] Reduce resolver dependencies on operator-registry and operator-lifecycle-manager. (#2337) * Remove resolver dependency on registry.CatalogKey. Signed-off-by: Ben Luddy * Remove hard resolver dependency on the gRPC registry client. The most significant change is the introduction of a new Source interface, which represents a single source of cache entries. In the existing implementation, the cache was hardcoded to fetch content from the operator-registry gRPC API on misses. This was a barrier to off-cluster tools and other applications that should be able to perform resolution without running a registry server. A number of test fixtures were affected (for the better) because it's now possible to directly configure the real Cache implementation to retrieve test content without using of test doubles. Signed-off-by: Ben Luddy Upstream-repository: operator-lifecycle-manager Upstream-commit: 9e4a778a44abb8705fb8ef95ad0bdaaebfa0ecfc --- .../controller/operators/catalog/operator.go | 3 +- .../registry/resolver/cache/cache.go | 403 +++++---- .../registry/resolver/cache/cache_test.go | 290 +++--- .../registry/resolver/cache/operators.go | 7 +- .../registry/resolver/cache/operators_test.go | 27 +- .../registry/resolver/cache/predicates.go | 5 +- .../registry/resolver/installabletypes.go | 9 +- .../resolver/instrumented_resolver.go | 5 +- .../resolver/instrumented_resolver_test.go | 7 +- .../controller/registry/resolver/resolver.go | 38 +- .../registry/resolver/resolver_test.go | 837 ++++++++---------- .../registry/resolver/source_registry.go | 109 +++ .../registry/resolver/step_resolver.go | 11 +- .../registry/resolver/step_resolver_test.go | 113 ++- .../pkg/fakes/fake_resolver.go | 14 +- .../controller/operators/catalog/operator.go | 3 +- .../registry/resolver/cache/cache.go | 403 +++++---- .../registry/resolver/cache/operators.go | 7 +- .../registry/resolver/cache/predicates.go | 5 +- .../registry/resolver/installabletypes.go | 9 +- .../resolver/instrumented_resolver.go | 5 +- .../controller/registry/resolver/resolver.go | 38 +- .../registry/resolver/source_registry.go | 109 +++ .../registry/resolver/step_resolver.go | 11 +- 24 files changed, 1225 insertions(+), 1243 deletions(-) create mode 100644 staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go create mode 100644 vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index c91029a3a7..e83e77c282 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -55,6 +55,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/catalogsource" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" @@ -463,7 +464,7 @@ func (o *Operator) syncSourceState(state grpc.SourceState) { switch state.State { case connectivity.Ready: - o.resolver.Expire(state.Key) + o.resolver.Expire(resolvercache.SourceKey(state.Key)) if o.namespace == state.Key.Namespace { namespaces, err := index.CatalogSubscriberNamespaces(o.catalogSubscriberIndexer, state.Key.Name, state.Key.Namespace) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go index c26f30d434..10ca6d07d8 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go @@ -2,88 +2,140 @@ package cache import ( "context" - "encoding/json" "fmt" + "io" "sort" "sync" "time" - "k8s.io/apimachinery/pkg/util/errors" - "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/util/errors" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" ) -type RegistryClientProvider interface { - ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface +const existingOperatorKey = "@existing" + +type SourceKey struct { + Name string + Namespace string } -type DefaultRegistryClientProvider struct { - logger logrus.FieldLogger - s RegistryClientProvider +func (k *SourceKey) String() string { + return fmt.Sprintf("%s/%s", k.Name, k.Namespace) } -func NewDefaultRegistryClientProvider(log logrus.FieldLogger, store RegistryClientProvider) *DefaultRegistryClientProvider { - return &DefaultRegistryClientProvider{ - logger: log, - s: store, +func (k *SourceKey) Empty() bool { + return k.Name == "" && k.Namespace == "" +} + +func (k *SourceKey) Equal(compare SourceKey) bool { + return k.Name == compare.Name && k.Namespace == compare.Namespace +} + +// Virtual indicates if this is a "virtual" catalog representing the currently installed operators in a namespace +func (k *SourceKey) Virtual() bool { + return k.Name == existingOperatorKey && k.Namespace != "" +} + +func NewVirtualSourceKey(namespace string) SourceKey { + return SourceKey{ + Name: existingOperatorKey, + Namespace: namespace, } } -func (rcp *DefaultRegistryClientProvider) ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface { - return rcp.s.ClientsForNamespaces(namespaces...) +type Source interface { + Snapshot(context.Context) (*Snapshot, error) +} + +type SourceProvider interface { + // TODO: namespaces parameter is an artifact of SourceStore + Sources(namespaces ...string) map[SourceKey]Source +} + +type StaticSourceProvider map[SourceKey]Source + +func (p StaticSourceProvider) Sources(namespaces ...string) map[SourceKey]Source { + result := make(map[SourceKey]Source) + for key, source := range p { + for _, namespace := range namespaces { + if key.Namespace == namespace { + result[key] = source + break + } + } + } + return result } type OperatorCacheProvider interface { Namespaced(namespaces ...string) MultiCatalogOperatorFinder - Expire(catalog registry.CatalogKey) + Expire(catalog SourceKey) } -type OperatorCache struct { - logger logrus.FieldLogger - rcp RegistryClientProvider +type Cache struct { + logger logrus.StdLogger + sp SourceProvider catsrcLister v1alpha1.CatalogSourceLister - snapshots map[registry.CatalogKey]*CatalogSnapshot + snapshots map[SourceKey]*snapshotHeader ttl time.Duration sem chan struct{} m sync.RWMutex } -const defaultCatalogSourcePriority int = 0 - type catalogSourcePriority int -var _ OperatorCacheProvider = &OperatorCache{} +var _ OperatorCacheProvider = &Cache{} + +type Option func(*Cache) + +func WithLogger(logger logrus.StdLogger) Option { + return func(c *Cache) { + c.logger = logger + } +} + +func WithCatalogSourceLister(catalogSourceLister v1alpha1.CatalogSourceLister) Option { + return func(c *Cache) { + c.catsrcLister = catalogSourceLister + } +} -func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger, catsrcLister v1alpha1.CatalogSourceLister) *OperatorCache { +func New(sp SourceProvider, options ...Option) *Cache { const ( MaxConcurrentSnapshotUpdates = 4 ) - return &OperatorCache{ - logger: log, - rcp: rcp, - catsrcLister: catsrcLister, - snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + cache := Cache{ + logger: func() logrus.StdLogger { + logger := logrus.New() + logger.SetOutput(io.Discard) + return logger + }(), + sp: sp, + catsrcLister: operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister(), + snapshots: make(map[SourceKey]*snapshotHeader), ttl: 5 * time.Minute, sem: make(chan struct{}, MaxConcurrentSnapshotUpdates), } + + for _, opt := range options { + opt(&cache) + } + + return &cache } type NamespacedOperatorCache struct { - Namespaces []string - existing *registry.CatalogKey - Snapshots map[registry.CatalogKey]*CatalogSnapshot + existing *SourceKey + snapshots map[SourceKey]*snapshotHeader } func (c *NamespacedOperatorCache) Error() error { var errs []error - for key, snapshot := range c.Snapshots { + for key, snapshot := range c.snapshots { snapshot.m.Lock() err := snapshot.err snapshot.m.Unlock() @@ -94,7 +146,7 @@ func (c *NamespacedOperatorCache) Error() error { return errors.NewAggregate(errs) } -func (c *OperatorCache) Expire(catalog registry.CatalogKey) { +func (c *Cache) Expire(catalog SourceKey) { c.m.Lock() defer c.m.Unlock() s, ok := c.snapshots[catalog] @@ -104,31 +156,30 @@ func (c *OperatorCache) Expire(catalog registry.CatalogKey) { s.expiry = time.Unix(0, 0) } -func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { +func (c *Cache) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { const ( CachePopulateTimeout = time.Minute ) now := time.Now() - clients := c.rcp.ClientsForNamespaces(namespaces...) + sources := c.sp.Sources(namespaces...) result := NamespacedOperatorCache{ - Namespaces: namespaces, - Snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + snapshots: make(map[SourceKey]*snapshotHeader), } - var misses []registry.CatalogKey + var misses []SourceKey func() { c.m.RLock() defer c.m.RUnlock() - for key := range clients { + for key := range sources { snapshot, ok := c.snapshots[key] if ok { func() { snapshot.m.RLock() defer snapshot.m.RUnlock() - if !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { - result.Snapshots[key] = snapshot + if snapshot.Valid(now) { + result.snapshots[key] = snapshot } else { misses = append(misses, key) } @@ -148,9 +199,9 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin defer c.m.Unlock() // Take the opportunity to clear expired snapshots while holding the lock. - var expired []registry.CatalogKey + var expired []SourceKey for key, snapshot := range c.snapshots { - if snapshot.Expired(now) { + if !snapshot.Valid(now) { snapshot.Cancel() expired = append(expired, key) } @@ -162,8 +213,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin // Check for any snapshots that were populated while waiting to acquire the lock. var found int for i := range misses { - if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { - result.Snapshots[misses[i]] = snapshot + if hdr, ok := c.snapshots[misses[i]]; ok && hdr.Valid(now) { + result.snapshots[misses[i]] = hdr misses[found], misses[i] = misses[i], misses[found] found++ } @@ -173,120 +224,49 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin for _, miss := range misses { ctx, cancel := context.WithTimeout(context.Background(), CachePopulateTimeout) - catsrcPriority := defaultCatalogSourcePriority - // Ignoring error and treat catsrc priority as 0 if not found. - catsrc, err := c.catsrcLister.CatalogSources(miss.Namespace).Get(miss.Name) - if err == nil { - catsrcPriority = catsrc.Spec.Priority - } - - s := CatalogSnapshot{ - logger: c.logger.WithField("catalog", miss), - Key: miss, - expiry: now.Add(c.ttl), - pop: cancel, - Priority: catalogSourcePriority(catsrcPriority), + hdr := snapshotHeader{ + key: miss, + expiry: now.Add(c.ttl), + pop: cancel, } - s.m.Lock() - c.snapshots[miss] = &s - result.Snapshots[miss] = &s - go c.populate(ctx, &s, clients[miss]) - } - - return &result -} -func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, registry client.Interface) { - defer snapshot.m.Unlock() - defer func() { - // Don't cache an errorred snapshot. - if snapshot.err != nil { - snapshot.expiry = time.Time{} + // Ignoring error and treat catsrc priority as 0 if not found. + if catsrc, _ := c.catsrcLister.CatalogSources(miss.Namespace).Get(miss.Name); catsrc != nil { + hdr.priority = catsrc.Spec.Priority } - }() - c.sem <- struct{}{} - defer func() { <-c.sem }() + hdr.m.Lock() + c.snapshots[miss] = &hdr + result.snapshots[miss] = &hdr - // Fetching default channels this way makes many round trips - // -- may need to either add a new API to fetch all at once, - // or embed the information into Bundle. - defaultChannels := make(map[string]string) - - it, err := registry.ListBundles(ctx) - if err != nil { - snapshot.logger.Errorf("failed to list bundles: %s", err.Error()) - snapshot.err = err - return + go func(ctx context.Context, hdr *snapshotHeader, source Source) { + defer hdr.m.Unlock() + c.sem <- struct{}{} + defer func() { <-c.sem }() + hdr.snapshot, hdr.err = source.Snapshot(ctx) + }(ctx, &hdr, sources[miss]) } - c.logger.WithField("catalog", snapshot.Key.String()).Debug("updating cache") - var operators []*Operator - for b := it.Next(); b != nil; b = it.Next() { - defaultChannel, ok := defaultChannels[b.PackageName] - if !ok { - if p, err := registry.GetPackage(ctx, b.PackageName); err != nil { - snapshot.logger.Warnf("failed to retrieve default channel for bundle, continuing: %v", err) - continue - } else { - defaultChannels[b.PackageName] = p.DefaultChannelName - defaultChannel = p.DefaultChannelName - } - } - o, err := NewOperatorFromBundle(b, "", snapshot.Key, defaultChannel) - if err != nil { - snapshot.logger.Warnf("failed to construct operator from bundle, continuing: %v", err) - continue - } - o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() - o.RequiredAPIs = o.RequiredAPIs.StripPlural() - o.Replaces = b.Replaces - EnsurePackageProperty(o, b.PackageName, b.Version) - operators = append(operators, o) - } - if err := it.Error(); err != nil { - snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) - snapshot.err = err - } - snapshot.Operators = operators -} -func EnsurePackageProperty(o *Operator, name, version string) { - for _, p := range o.Properties { - if p.Type == opregistry.PackageType { - return - } - } - prop := opregistry.PackageProperty{ - PackageName: name, - Version: version, - } - bytes, err := json.Marshal(prop) - if err != nil { - return - } - o.Properties = append(o.Properties, &api.Property{ - Type: opregistry.PackageType, - Value: string(bytes), - }) + return &result } -func (c *NamespacedOperatorCache) Catalog(k registry.CatalogKey) OperatorFinder { +func (c *NamespacedOperatorCache) Catalog(k SourceKey) OperatorFinder { // all catalogs match the empty catalog if k.Empty() { return c } - if snapshot, ok := c.Snapshots[k]; ok { + if snapshot, ok := c.snapshots[k]; ok { return snapshot } return EmptyOperatorFinder{} } -func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, p ...OperatorPredicate) []*Operator { +func (c *NamespacedOperatorCache) FindPreferred(preferred *SourceKey, preferredNamespace string, p ...OperatorPredicate) []*Operator { var result []*Operator if preferred != nil && preferred.Empty() { preferred = nil } - sorted := NewSortableSnapshots(c.existing, preferred, c.Namespaces, c.Snapshots) + sorted := newSortableSnapshots(c.existing, preferred, preferredNamespace, c.snapshots) sort.Sort(sorted) for _, snapshot := range sorted.snapshots { result = append(result, snapshot.Find(p...)...) @@ -294,65 +274,71 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, return result } -func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *CatalogSnapshot) MultiCatalogOperatorFinder { +func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *Snapshot, namespace string) MultiCatalogOperatorFinder { + key := NewVirtualSourceKey(namespace) o := &NamespacedOperatorCache{ - Namespaces: c.Namespaces, - existing: &snapshot.Key, - Snapshots: c.Snapshots, + existing: &key, + snapshots: map[SourceKey]*snapshotHeader{ + key: { + key: key, + snapshot: snapshot, + }, + }, + } + for k, v := range c.snapshots { + o.snapshots[k] = v } - o.Snapshots[snapshot.Key] = snapshot return o } func (c *NamespacedOperatorCache) Find(p ...OperatorPredicate) []*Operator { - return c.FindPreferred(nil, p...) + return c.FindPreferred(nil, "", p...) +} + +type Snapshot struct { + Entries []*Operator } -type CatalogSnapshot struct { - logger logrus.FieldLogger - Key registry.CatalogKey - expiry time.Time - Operators []*Operator - m sync.RWMutex - pop context.CancelFunc - Priority catalogSourcePriority - err error +var _ Source = &Snapshot{} + +func (s *Snapshot) Snapshot(context.Context) (*Snapshot, error) { + return s, nil } -func (s *CatalogSnapshot) Cancel() { - s.pop() +type snapshotHeader struct { + snapshot *Snapshot + + key SourceKey + expiry time.Time + m sync.RWMutex + pop context.CancelFunc + err error + priority int } -func (s *CatalogSnapshot) Expired(at time.Time) bool { - return !at.Before(s.expiry) +func (hdr *snapshotHeader) Cancel() { + hdr.pop() } -// NewRunningOperatorSnapshot creates a CatalogSnapshot that represents a set of existing installed operators -// in the cluster. -func NewRunningOperatorSnapshot(logger logrus.FieldLogger, key registry.CatalogKey, o []*Operator) *CatalogSnapshot { - return &CatalogSnapshot{ - logger: logger, - Key: key, - Operators: o, - } +func (hdr *snapshotHeader) Valid(at time.Time) bool { + hdr.m.RLock() + defer hdr.m.RUnlock() + return hdr.snapshot != nil && hdr.err == nil && at.Before(hdr.expiry) } -type SortableSnapshots struct { - snapshots []*CatalogSnapshot - namespaces map[string]int - preferred *registry.CatalogKey - existing *registry.CatalogKey +type sortableSnapshots struct { + snapshots []*snapshotHeader + preferredNamespace string + preferred *SourceKey + existing *SourceKey } -func NewSortableSnapshots(existing, preferred *registry.CatalogKey, namespaces []string, snapshots map[registry.CatalogKey]*CatalogSnapshot) SortableSnapshots { - sorted := SortableSnapshots{ - existing: existing, - preferred: preferred, - snapshots: make([]*CatalogSnapshot, 0), - namespaces: make(map[string]int, 0), - } - for i, n := range namespaces { - sorted.namespaces[n] = i +func newSortableSnapshots(existing, preferred *SourceKey, preferredNamespace string, snapshots map[SourceKey]*snapshotHeader) sortableSnapshots { + sorted := sortableSnapshots{ + existing: existing, + preferred: preferred, + snapshots: make([]*snapshotHeader, 0), + preferredNamespace: preferredNamespace, } for _, s := range snapshots { sorted.snapshots = append(sorted.snapshots, s) @@ -360,60 +346,69 @@ func NewSortableSnapshots(existing, preferred *registry.CatalogKey, namespaces [ return sorted } -var _ sort.Interface = SortableSnapshots{} +var _ sort.Interface = sortableSnapshots{} // Len is the number of elements in the collection. -func (s SortableSnapshots) Len() int { +func (s sortableSnapshots) Len() int { return len(s.snapshots) } // Less reports whether the element with // index i should sort before the element with index j. -func (s SortableSnapshots) Less(i, j int) bool { +func (s sortableSnapshots) Less(i, j int) bool { // existing operators are preferred over catalog operators if s.existing != nil && - s.snapshots[i].Key.Name == s.existing.Name && - s.snapshots[i].Key.Namespace == s.existing.Namespace { + s.snapshots[i].key.Name == s.existing.Name && + s.snapshots[i].key.Namespace == s.existing.Namespace { return true } if s.existing != nil && - s.snapshots[j].Key.Name == s.existing.Name && - s.snapshots[j].Key.Namespace == s.existing.Namespace { + s.snapshots[j].key.Name == s.existing.Name && + s.snapshots[j].key.Namespace == s.existing.Namespace { return false } // preferred catalog is less than all other catalogs if s.preferred != nil && - s.snapshots[i].Key.Name == s.preferred.Name && - s.snapshots[i].Key.Namespace == s.preferred.Namespace { + s.snapshots[i].key.Name == s.preferred.Name && + s.snapshots[i].key.Namespace == s.preferred.Namespace { return true } if s.preferred != nil && - s.snapshots[j].Key.Name == s.preferred.Name && - s.snapshots[j].Key.Namespace == s.preferred.Namespace { + s.snapshots[j].key.Name == s.preferred.Name && + s.snapshots[j].key.Namespace == s.preferred.Namespace { return false } // the rest are sorted first on priority, namespace and then by name - if s.snapshots[i].Priority != s.snapshots[j].Priority { - return s.snapshots[i].Priority > s.snapshots[j].Priority + if s.snapshots[i].priority != s.snapshots[j].priority { + return s.snapshots[i].priority > s.snapshots[j].priority } - if s.snapshots[i].Key.Namespace != s.snapshots[j].Key.Namespace { - return s.namespaces[s.snapshots[i].Key.Namespace] < s.namespaces[s.snapshots[j].Key.Namespace] + + if s.snapshots[i].key.Namespace != s.snapshots[j].key.Namespace { + if s.snapshots[i].key.Namespace == s.preferredNamespace { + return true + } + if s.snapshots[j].key.Namespace == s.preferredNamespace { + return false + } } - return s.snapshots[i].Key.Name < s.snapshots[j].Key.Name + return s.snapshots[i].key.Name < s.snapshots[j].key.Name } // Swap swaps the elements with indexes i and j. -func (s SortableSnapshots) Swap(i, j int) { +func (s sortableSnapshots) Swap(i, j int) { s.snapshots[i], s.snapshots[j] = s.snapshots[j], s.snapshots[i] } -func (s *CatalogSnapshot) Find(p ...OperatorPredicate) []*Operator { +func (s *snapshotHeader) Find(p ...OperatorPredicate) []*Operator { s.m.RLock() defer s.m.RUnlock() - return Filter(s.Operators, p...) + if s.snapshot == nil { + return nil + } + return Filter(s.snapshot.Entries, p...) } type OperatorFinder interface { @@ -421,9 +416,9 @@ type OperatorFinder interface { } type MultiCatalogOperatorFinder interface { - Catalog(registry.CatalogKey) OperatorFinder - FindPreferred(*registry.CatalogKey, ...OperatorPredicate) []*Operator - WithExistingOperators(*CatalogSnapshot) MultiCatalogOperatorFinder + Catalog(SourceKey) OperatorFinder + FindPreferred(preferred *SourceKey, preferredNamespace string, predicates ...OperatorPredicate) []*Operator + WithExistingOperators(snapshot *Snapshot, namespace string) MultiCatalogOperatorFinder Error() error OperatorFinder } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go index ecb4f14b24..f095456456 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go @@ -4,113 +4,37 @@ import ( "context" "errors" "fmt" - "io" "math/rand" "strconv" "testing" "time" - "github.com/sirupsen/logrus" - "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) -type BundleStreamStub struct { - Bundles []*api.Bundle -} - -func (s *BundleStreamStub) Recv() (*api.Bundle, error) { - if len(s.Bundles) == 0 { - return nil, io.EOF - } - b := s.Bundles[0] - s.Bundles = s.Bundles[1:] - return b, nil -} - -type RegistryClientStub struct { - BundleIterator *client.BundleIterator - - ListBundlesError error -} - -func (s *RegistryClientStub) Get() (client.Interface, error) { - return s, nil -} - -func (s *RegistryClientStub) GetBundle(ctx context.Context, packageName, channelName, csvName string) (*api.Bundle, error) { - return nil, nil -} - -func (s *RegistryClientStub) GetBundleInPackageChannel(ctx context.Context, packageName, channelName string) (*api.Bundle, error) { - return nil, nil -} - -func (s *RegistryClientStub) GetReplacementBundleInPackageChannel(ctx context.Context, currentName, packageName, channelName string) (*api.Bundle, error) { - return nil, nil -} - -func (s *RegistryClientStub) GetBundleThatProvides(ctx context.Context, group, version, kind string) (*api.Bundle, error) { - return nil, nil -} - -func (s *RegistryClientStub) ListBundles(ctx context.Context) (*client.BundleIterator, error) { - return s.BundleIterator, s.ListBundlesError -} - -func (s *RegistryClientStub) GetPackage(ctx context.Context, packageName string) (*api.Package, error) { - return &api.Package{Name: packageName}, nil -} - -func (s *RegistryClientStub) HealthCheck(ctx context.Context, reconnectTimeout time.Duration) (bool, error) { - return false, nil -} - -func (s *RegistryClientStub) Close() error { - return nil -} - -type RegistryClientProviderStub map[registry.CatalogKey]client.Interface - -func (s RegistryClientProviderStub) ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface { - return s -} - func TestOperatorCacheConcurrency(t *testing.T) { const ( NWorkers = 64 ) - rcp := RegistryClientProviderStub{} - catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() - var keys []registry.CatalogKey + + sp := make(StaticSourceProvider) + var keys []SourceKey for i := 0; i < 128; i++ { for j := 0; j < 8; j++ { - key := registry.CatalogKey{Namespace: strconv.Itoa(i), Name: strconv.Itoa(j)} + key := SourceKey{Namespace: strconv.Itoa(i), Name: strconv.Itoa(j)} keys = append(keys, key) - rcp[key] = &RegistryClientStub{ - BundleIterator: client.NewBundleIterator(&BundleStreamStub{ - Bundles: []*api.Bundle{{ - CsvName: fmt.Sprintf("%s/%s", key.Namespace, key.Name), - ProvidedApis: []*api.GroupVersionKind{{ - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }}, - }}, - }), + sp[key] = &Snapshot{ + Entries: []*Operator{ + {Name: fmt.Sprintf("%s/%s", key.Namespace, key.Name)}, + }, } } } - c := NewOperatorCache(rcp, logrus.New(), catsrcLister) + c := New(sp) errs := make(chan error) for w := 0; w < NWorkers; w++ { @@ -143,56 +67,52 @@ func TestOperatorCacheConcurrency(t *testing.T) { } func TestOperatorCacheExpiration(t *testing.T) { - rcp := RegistryClientProviderStub{} - catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() - key := registry.CatalogKey{Namespace: "dummynamespace", Name: "dummyname"} - rcp[key] = &RegistryClientStub{ - BundleIterator: client.NewBundleIterator(&BundleStreamStub{ - Bundles: []*api.Bundle{{ - CsvName: "csvname", - ProvidedApis: []*api.GroupVersionKind{{ - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }}, - }}, - }), - } - - c := NewOperatorCache(rcp, logrus.New(), catsrcLister) + key := SourceKey{Namespace: "dummynamespace", Name: "dummyname"} + ssp := make(StaticSourceProvider) + c := New(ssp) c.ttl = 0 // instantly stale - require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("csvname")), 1) + ssp[key] = &Snapshot{ + Entries: []*Operator{ + {Name: "v1"}, + }, + } + require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("v1")), 1) + + ssp[key] = &Snapshot{ + Entries: []*Operator{ + {Name: "v2"}, + }, + } + require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("v1")), 0) } func TestOperatorCacheReuse(t *testing.T) { - rcp := RegistryClientProviderStub{} - catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() - key := registry.CatalogKey{Namespace: "dummynamespace", Name: "dummyname"} - rcp[key] = &RegistryClientStub{ - BundleIterator: client.NewBundleIterator(&BundleStreamStub{ - Bundles: []*api.Bundle{{ - CsvName: "csvname", - ProvidedApis: []*api.GroupVersionKind{{ - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }}, - }}, - }), - } + key := SourceKey{Namespace: "dummynamespace", Name: "dummyname"} + ssp := make(StaticSourceProvider) + c := New(ssp) - c := NewOperatorCache(rcp, logrus.New(), catsrcLister) + ssp[key] = &Snapshot{ + Entries: []*Operator{ + {Name: "v1"}, + }, + } + require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("v1")), 1) - require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("csvname")), 1) + ssp[key] = &Snapshot{ + Entries: []*Operator{ + {Name: "v2"}, + }, + } + require.Len(t, c.Namespaced("dummynamespace").Catalog(key).Find(CSVNamePredicate("v1")), 1) } -func TestCatalogSnapshotExpired(t *testing.T) { +func TestCatalogSnapshotValid(t *testing.T) { type tc struct { Name string Expiry time.Time + Snapshot *Snapshot + Error error At time.Time Expected bool } @@ -201,25 +121,51 @@ func TestCatalogSnapshotExpired(t *testing.T) { { Name: "after expiry", Expiry: time.Unix(0, 1), + Snapshot: &Snapshot{}, + Error: nil, At: time.Unix(0, 2), - Expected: true, + Expected: false, }, { Name: "before expiry", Expiry: time.Unix(0, 2), + Snapshot: &Snapshot{}, + Error: nil, + At: time.Unix(0, 1), + Expected: true, + }, + { + Name: "nil snapshot", + Expiry: time.Unix(0, 2), + Snapshot: nil, + Error: errors.New(""), + At: time.Unix(0, 1), + Expected: false, + }, + { + Name: "non-nil error", + Expiry: time.Unix(0, 2), + Snapshot: &Snapshot{}, + Error: errors.New(""), At: time.Unix(0, 1), Expected: false, }, { Name: "at expiry", Expiry: time.Unix(0, 1), + Snapshot: &Snapshot{}, + Error: nil, At: time.Unix(0, 1), - Expected: true, + Expected: false, }, } { t.Run(tt.Name, func(t *testing.T) { - s := CatalogSnapshot{expiry: tt.Expiry} - assert.Equal(t, tt.Expected, s.Expired(tt.At)) + s := snapshotHeader{ + expiry: tt.Expiry, + snapshot: tt.Snapshot, + err: tt.Error, + } + assert.Equal(t, tt.Expected, s.Valid(tt.At)) }) } @@ -287,7 +233,7 @@ func TestCatalogSnapshotFind(t *testing.T) { }, } { t.Run(tt.Name, func(t *testing.T) { - s := CatalogSnapshot{Operators: tt.Operators} + s := snapshotHeader{snapshot: &Snapshot{Entries: tt.Operators}} assert.Equal(t, tt.Expected, s.Find(tt.Predicate)) }) } @@ -295,69 +241,41 @@ func TestCatalogSnapshotFind(t *testing.T) { } func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { - rcp := RegistryClientProviderStub{} - catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() - key := registry.CatalogKey{Namespace: "testnamespace", Name: "testname"} - rcp[key] = &RegistryClientStub{ - BundleIterator: client.NewBundleIterator(&BundleStreamStub{ - Bundles: []*api.Bundle{{ - CsvName: fmt.Sprintf("%s/%s", key.Namespace, key.Name), - ProvidedApis: []*api.GroupVersionKind{{ - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }}, - RequiredApis: []*api.GroupVersionKind{{ - Group: "g2", - Version: "v2", - Kind: "K2", - Plural: "ks2", - }}, - Properties: APISetToProperties(map[opregistry.APIKey]struct{}{ - { - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }: {}, - }, nil, false), - Dependencies: APISetToDependencies(map[opregistry.APIKey]struct{}{ - { - Group: "g2", - Version: "v2", - Kind: "K2", - Plural: "ks2", - }: {}, - }, nil), - }}, - }), - } - - c := NewOperatorCache(rcp, logrus.New(), catsrcLister) + key := SourceKey{Namespace: "testnamespace", Name: "testname"} + o, err := NewOperatorFromBundle(&api.Bundle{ + CsvName: fmt.Sprintf("%s/%s", key.Namespace, key.Name), + ProvidedApis: []*api.GroupVersionKind{{ + Group: "g", + Version: "v1", + Kind: "K", + Plural: "ks", + }}, + RequiredApis: []*api.GroupVersionKind{{ + Group: "g2", + Version: "v2", + Kind: "K2", + Plural: "ks2", + }}, + }, "", key, "") - nc := c.Namespaced("testnamespace") - result, err := AtLeast(1, nc.Find(ProvidingAPIPredicate(opregistry.APIKey{Group: "g", Version: "v1", Kind: "K"}))) assert.NoError(t, err) - assert.Equal(t, 1, len(result)) - assert.Equal(t, "K.v1.g", result[0].ProvidedAPIs.String()) - assert.Equal(t, "K2.v2.g2", result[0].RequiredAPIs.String()) + assert.Equal(t, "K.v1.g", o.ProvidedAPIs.String()) + assert.Equal(t, "K2.v2.g2", o.RequiredAPIs.String()) +} + +type ErrorSource struct { + Error error +} + +func (s ErrorSource) Snapshot(context.Context) (*Snapshot, error) { + return nil, s.Error } func TestNamespaceOperatorCacheError(t *testing.T) { - rcp := RegistryClientProviderStub{} - catsrcLister := operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister() - key := registry.CatalogKey{Namespace: "dummynamespace", Name: "dummyname"} - rcp[key] = &RegistryClientStub{ - ListBundlesError: errors.New("testing"), - } + key := SourceKey{Namespace: "dummynamespace", Name: "dummyname"} + c := New(StaticSourceProvider{ + key: ErrorSource{Error: errors.New("testing")}, + }) - logger, _ := test.NewNullLogger() - c := NewOperatorCache(rcp, logger, catsrcLister) require.EqualError(t, c.Namespaced("dummynamespace").Error(), "error using catalog dummyname (in namespace dummynamespace): testing") - if snapshot, ok := c.snapshots[key]; !ok { - t.Fatalf("cache snapshot not found") - } else { - require.Zero(t, snapshot.expiry) - } } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 1df76b270d..1c43077935 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -11,7 +11,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -194,7 +193,7 @@ type OperatorSourceInfo struct { Package string Channel string StartingCSV string - Catalog registry.CatalogKey + Catalog SourceKey DefaultChannel bool Subscription *v1alpha1.Subscription } @@ -203,7 +202,7 @@ func (i *OperatorSourceInfo) String() string { return fmt.Sprintf("%s/%s in %s/%s", i.Package, i.Channel, i.Catalog.Name, i.Catalog.Namespace) } -var NoCatalog = registry.CatalogKey{Name: "", Namespace: ""} +var NoCatalog = SourceKey{Name: "", Namespace: ""} var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: "", Catalog: NoCatalog, DefaultChannel: false} type Operator struct { @@ -219,7 +218,7 @@ type Operator struct { Properties []*api.Property } -func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey registry.CatalogKey, defaultChannel string) (*Operator, error) { +func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey SourceKey, defaultChannel string) (*Operator, error) { parsedVersion, err := semver.ParseTolerant(bundle.Version) version := &parsedVersion if err != nil { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go index cf46ad80f0..5337a5b25d 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go @@ -11,7 +11,6 @@ import ( opver "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -713,7 +712,7 @@ func TestCatalogKey_String(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - k := ®istry.CatalogKey{ + k := &SourceKey{ Name: tt.fields.Name, Namespace: tt.fields.Namespace, } @@ -878,7 +877,7 @@ func TestOperatorSourceInfo_String(t *testing.T) { i := &OperatorSourceInfo{ Package: tt.fields.Package, Channel: tt.fields.Channel, - Catalog: registry.CatalogKey{Name: tt.fields.CatalogSource, Namespace: tt.fields.CatalogSourceNamespace}, + Catalog: SourceKey{Name: tt.fields.CatalogSource, Namespace: tt.fields.CatalogSourceNamespace}, } if got := i.String(); got != tt.want { t.Errorf("OperatorSourceInfo.String() = %v, want %v", got, tt.want) @@ -1060,7 +1059,7 @@ func TestNewOperatorFromBundle(t *testing.T) { type args struct { bundle *api.Bundle - sourceKey registry.CatalogKey + sourceKey SourceKey replaces string defaultChannel string } @@ -1074,7 +1073,7 @@ func TestNewOperatorFromBundle(t *testing.T) { name: "BundleNoAPIs", args: args{ bundle: bundleNoAPIs, - sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ Name: "testBundle", @@ -1085,7 +1084,7 @@ func TestNewOperatorFromBundle(t *testing.T) { SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", - Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, }, }, }, @@ -1093,7 +1092,7 @@ func TestNewOperatorFromBundle(t *testing.T) { name: "BundleWithAPIs", args: args{ bundle: bundleWithAPIs, - sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ Name: "testBundle", @@ -1148,7 +1147,7 @@ func TestNewOperatorFromBundle(t *testing.T) { SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", - Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, }, }, }, @@ -1156,7 +1155,7 @@ func TestNewOperatorFromBundle(t *testing.T) { name: "BundleIgnoreCSV", args: args{ bundle: bundleWithAPIsUnextracted, - sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ Name: "testBundle", @@ -1166,7 +1165,7 @@ func TestNewOperatorFromBundle(t *testing.T) { SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", - Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, }, }, }, @@ -1174,7 +1173,7 @@ func TestNewOperatorFromBundle(t *testing.T) { name: "BundleInDefaultChannel", args: args{ bundle: bundleNoAPIs, - sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, defaultChannel: "testChannel", }, want: &Operator{ @@ -1186,7 +1185,7 @@ func TestNewOperatorFromBundle(t *testing.T) { SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", - Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, DefaultChannel: true, }, }, @@ -1195,7 +1194,7 @@ func TestNewOperatorFromBundle(t *testing.T) { name: "BundleWithPropertiesAndDependencies", args: args{ bundle: bundleWithPropsAndDeps, - sourceKey: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, }, want: &Operator{ Name: "testBundle", @@ -1224,7 +1223,7 @@ func TestNewOperatorFromBundle(t *testing.T) { SourceInfo: &OperatorSourceInfo{ Package: "testPackage", Channel: "testChannel", - Catalog: registry.CatalogKey{Name: "source", Namespace: "testNamespace"}, + Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, }, }, }, diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 7e8649d5dc..292dda4805 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -7,7 +7,6 @@ import ( "github.com/blang/semver/v4" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -140,10 +139,10 @@ func (l labelPredicate) String() string { } type catalogPredicate struct { - key registry.CatalogKey + key SourceKey } -func CatalogPredicate(key registry.CatalogKey) OperatorPredicate { +func CatalogPredicate(key SourceKey) OperatorPredicate { return catalogPredicate{key: key} } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index ba9cd602bf..695c2b07ab 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -4,7 +4,6 @@ import ( "fmt" "strings" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" operatorregistry "github.com/operator-framework/operator-registry/pkg/registry" @@ -37,13 +36,13 @@ func (i *BundleInstallable) AddConstraint(c solver.Constraint) { i.constraints = append(i.constraints, c) } -func (i *BundleInstallable) BundleSourceInfo() (string, string, registry.CatalogKey, error) { +func (i *BundleInstallable) BundleSourceInfo() (string, string, cache.SourceKey, error) { info := strings.Split(i.identifier.String(), "/") // This should be enforced by Kube naming constraints if len(info) != 4 { - return "", "", registry.CatalogKey{}, fmt.Errorf("Unable to parse identifier %s for source info", i.identifier) + return "", "", cache.SourceKey{}, fmt.Errorf("Unable to parse identifier %s for source info", i.identifier) } - catalog := registry.CatalogKey{ + catalog := cache.SourceKey{ Name: info[0], Namespace: info[1], } @@ -52,7 +51,7 @@ func (i *BundleInstallable) BundleSourceInfo() (string, string, registry.Catalog return csvName, channel, catalog, nil } -func bundleId(bundle, channel string, catalog registry.CatalogKey) solver.Identifier { +func bundleId(bundle, channel string, catalog cache.SourceKey) solver.Identifier { return solver.IdentifierFromString(fmt.Sprintf("%s/%s/%s", catalog.String(), channel, bundle)) } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go index d8af9350cd..453ae4a0b8 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go @@ -4,8 +4,7 @@ import ( "time" "github.com/operator-framework/api/pkg/operators/v1alpha1" - - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type InstrumentedResolver struct { @@ -35,6 +34,6 @@ func (ir *InstrumentedResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step return steps, lookups, subs, err } -func (ir *InstrumentedResolver) Expire(key registry.CatalogKey) { +func (ir *InstrumentedResolver) Expire(key cache.SourceKey) { ir.resolver.Expire(key) } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go index 4b4c57fcf0..3b0aa0d59a 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver_test.go @@ -5,9 +5,8 @@ import ( "testing" "time" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/stretchr/testify/require" ) @@ -24,14 +23,14 @@ func (r *fakeResolverWithError) ResolveSteps(namespace string) ([]*v1alpha1.Step return nil, nil, nil, errors.New("Fake error") } -func (r *fakeResolverWithError) Expire(key registry.CatalogKey) { +func (r *fakeResolverWithError) Expire(key cache.SourceKey) { } func (r *fakeResolverWithoutError) ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) { return nil, nil, nil, nil } -func (r *fakeResolverWithoutError) Expire(key registry.CatalogKey) { +func (r *fakeResolverWithoutError) Expire(key cache.SourceKey) { } func newFakeResolverWithError() *fakeResolverWithError { diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 06d9c10c71..38e779acd3 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -13,7 +13,6 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" @@ -30,10 +29,10 @@ type SatResolver struct { log logrus.FieldLogger } -func NewDefaultSatResolver(rcp cache.RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { +func NewDefaultSatResolver(rcp cache.SourceProvider, catsrcLister v1alpha1listers.CatalogSourceLister, logger logrus.FieldLogger) *SatResolver { return &SatResolver{ - cache: cache.NewOperatorCache(rcp, log, catsrcLister), - log: log, + cache: cache.New(rcp, cache.WithLogger(logger), cache.WithCatalogSourceLister(catsrcLister)), + log: logger, } } @@ -61,9 +60,9 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust if err != nil { return nil, err } - namespacedCache := r.cache.Namespaced(namespaces...).WithExistingOperators(existingSnapshot) + namespacedCache := r.cache.Namespaced(namespaces...).WithExistingOperators(existingSnapshot, namespaces[0]) - _, existingInstallables, err := r.getBundleInstallables(registry.NewVirtualCatalogKey(namespaces[0]), existingSnapshot.Find(), namespacedCache, visited) + _, existingInstallables, err := r.getBundleInstallables(namespaces[0], cache.Filter(existingSnapshot.Entries, cache.True()), namespacedCache, visited) if err != nil { return nil, err } @@ -177,7 +176,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) - catalog := registry.CatalogKey{ + catalog := cache.SourceKey{ Name: sub.Spec.CatalogSource, Namespace: sub.Spec.CatalogSourceNamespace, } @@ -259,7 +258,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu for _, o := range cache.Filter(sortedBundles, channelPredicates...) { predicates := append(cachePredicates, cache.CSVNamePredicate(o.Name)) stack := namespacedCache.Catalog(catalog).Find(predicates...) - id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) + id, installable, err := r.getBundleInstallables(sub.Namespace, stack, namespacedCache, visited) if err != nil { return nil, err } @@ -288,12 +287,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // safe to remove this conflict if properties // annotations are made mandatory for // resolution. - c.AddConflict(bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + c.AddConflict(bundleId(current.Name, current.Channel(), cache.NewVirtualSourceKey(sub.GetNamespace()))) } depIds = append(depIds, c.Identifier()) } if current != nil { - depIds = append(depIds, bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + depIds = append(depIds, bundleId(current.Name, current.Channel(), cache.NewVirtualSourceKey(sub.GetNamespace()))) } // all candidates added as options for this constraint @@ -303,7 +302,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(preferredNamespace string, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies @@ -370,7 +369,8 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS )) } } - sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, sourcePredicate)) + + sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, preferredNamespace, sourcePredicate)) if err != nil { errs = append(errs, err) continue @@ -422,7 +422,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs // package against catalog contents, updates to the // Subscription spec could result in a bad package // inference. - for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { + for _, entry := range r.cache.Namespaced(sub.Spec.CatalogSourceNamespace).Catalog(cache.SourceKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { if pkg := entry.Package(); pkg != "" { packages[pkg] = struct{}{} } @@ -455,8 +455,8 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs return properties, nil } -func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.CatalogSnapshot, error) { - existingOperatorCatalog := registry.NewVirtualCatalogKey(namespace) +func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.Snapshot, error) { + existingOperatorCatalog := cache.NewVirtualSourceKey(namespace) // build a catalog snapshot of CSVs without subscriptions csvSubscriptions := make(map[*v1alpha1.ClusterServiceVersion]*v1alpha1.Subscription) for _, sub := range subs { @@ -517,7 +517,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Infof("considered csvs without properties annotation during resolution: %v", names) } - return cache.NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil + return &cache.Snapshot{Entries: standaloneOperators}, nil } func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { @@ -579,17 +579,17 @@ func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFi func (r *SatResolver) sortBundles(bundles []*cache.Operator) ([]*cache.Operator, error) { // assume bundles have been passed in sorted by catalog already - catalogOrder := make([]registry.CatalogKey, 0) + catalogOrder := make([]cache.SourceKey, 0) type PackageChannel struct { Package, Channel string DefaultChannel bool } // TODO: for now channels will be sorted lexicographically - channelOrder := make(map[registry.CatalogKey][]PackageChannel) + channelOrder := make(map[cache.SourceKey][]PackageChannel) // partition by catalog -> channel -> bundle - partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*cache.Operator{} + partitionedBundles := map[cache.SourceKey]map[PackageChannel][]*cache.Operator{} for _, b := range bundles { pc := PackageChannel{ Package: b.Package(), diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go index a686cbdcf1..1d80b0cd13 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go @@ -12,10 +12,11 @@ import ( "github.com/stretchr/testify/require" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/labels" "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + listersv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-registry/pkg/api" @@ -27,7 +28,7 @@ func TestSolveOperators(t *testing.T) { Provides := APISet const namespace = "test-namespace" - catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} + catalog := cache.SourceKey{Name: "test-catalog", Namespace: namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -35,20 +36,16 @@ func TestSolveOperators(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.1", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) @@ -62,27 +59,23 @@ func TestSolveOperators(t *testing.T) { func TestDisjointChannelGraph(t *testing.T) { const namespace = "test-namespace" - catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} + catalog := cache.SourceKey{Name: "test-catalog", Namespace: namespace} newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.side1.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageA.side1.v2", "0.0.2", "packageA.side1.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageA.side2.v1", "1.0.0", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), genOperator("packageA.side2.v2", "2.0.0", "packageA.side2.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } _, err := satResolver.SolveOperators([]string{namespace}, nil, subs) @@ -93,7 +86,7 @@ func TestPropertiesAnnotationHonored(t *testing.T) { const ( namespace = "olm" ) - community := registry.CatalogKey{"community", namespace} + community := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", nil, nil, nil, nil) csv.Annotations = map[string]string{"operatorframework.io/properties": `{"properties":[{"type":"olm.package","value":{"packageName":"packageA","version":"1.0.0"}}]}`} @@ -104,17 +97,13 @@ func TestPropertiesAnnotationHonored(t *testing.T) { b := genOperator("packageB.v1", "1.0.1", "", "packageB", "alpha", "community", "olm", nil, nil, []*api.Dependency{{Type: "olm.package", Value: `{"packageName":"packageA","version":"1.0.0"}`}}, "", false) - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - community: { - Key: community, - Operators: []*cache.Operator{b}, - }, - }, - } satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + cache: cache.New(cache.StaticSourceProvider{ + community: &cache.Snapshot{ + Entries: []*cache.Operator{b}, + }, + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -131,7 +120,7 @@ func TestSolveOperators_MultipleChannels(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -139,21 +128,17 @@ func TestSolveOperators_MultipleChannels(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "beta", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -172,7 +157,7 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -180,28 +165,21 @@ func TestSolveOperators_FindLatestVersion(t *testing.T) { newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{sub, newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + cache.SourceKey{ Namespace: "olm", Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + }: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -226,7 +204,7 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -245,17 +223,10 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -267,11 +238,8 @@ func TestSolveOperators_FindLatestVersionWithDependencies(t *testing.T) { genOperator("packageD.v1.0.2", "1.0.2", "packageD.v1.0.1", "packageD", "alpha", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -295,7 +263,7 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -320,17 +288,10 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v0.9.0", "0.9.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "packageB.v0.9.0", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), @@ -342,11 +303,8 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { genOperator("packageE.v1.0.0", "1.0.0", "", "packageE", "alpha", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -366,6 +324,40 @@ func TestSolveOperators_FindLatestVersionWithNestedDependencies(t *testing.T) { } } +type stubCatalogSourceLister struct { + catsrcs []*v1alpha1.CatalogSource + namespace string +} + +func (l *stubCatalogSourceLister) List(labels.Selector) ([]*v1alpha1.CatalogSource, error) { + if l.namespace == "" { + return l.catsrcs, nil + } + var result []*v1alpha1.CatalogSource + for _, cs := range l.catsrcs { + if cs.Namespace == l.namespace { + result = append(result, cs) + } + } + return result, nil +} + +func (l *stubCatalogSourceLister) Get(name string) (*v1alpha1.CatalogSource, error) { + for _, cs := range l.catsrcs { + if cs.Name == name { + return cs, nil + } + } + return nil, errors.New("stub not found") +} + +func (l *stubCatalogSourceLister) CatalogSources(namespace string) listersv1alpha1.CatalogSourceNamespaceLister { + return &stubCatalogSourceLister{ + catsrcs: l.catsrcs, + namespace: namespace, + } +} + func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { opToAddVersionDeps := []*api.Dependency{ { @@ -375,58 +367,45 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } namespace := "olm" - customCatalog := registry.CatalogKey{"community", namespace} + customCatalog := cache.SourceKey{"community", namespace} newSub := newSub(namespace, "packageA", "alpha", customCatalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ - genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", namespace, nil, - nil, opToAddVersionDeps, "", false), - }, + ssp := cache.StaticSourceProvider{ + cache.SourceKey{Namespace: "olm", Name: "community"}: &cache.Snapshot{ + Entries: []*cache.Operator{ + genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", namespace, nil, + nil, opToAddVersionDeps, "", false), }, - registry.CatalogKey{ - Namespace: "olm", - Name: "community-operator", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community-operator", - }, - Operators: []*cache.Operator{ - genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", - namespace, nil, nil, nil, "", false), - }, + }, + cache.SourceKey{Namespace: "olm", Name: "community-operator"}: &cache.Snapshot{ + Entries: []*cache.Operator{ + genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", + namespace, nil, nil, nil, "", false), }, - registry.CatalogKey{ - Namespace: "olm", - Name: "high-priority-operator", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "high-priority-operator", - }, - Priority: 100, - Operators: []*cache.Operator{ - genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator", - namespace, nil, nil, nil, "", false), - }, + }, + cache.SourceKey{Namespace: "olm", Name: "high-priority-operator"}: &cache.Snapshot{ + Entries: []*cache.Operator{ + genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "high-priority-operator", + namespace, nil, nil, nil, "", false), }, }, } - // operators sorted by priority. satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), + cache: cache.New(ssp, cache.WithCatalogSourceLister(&stubCatalogSourceLister{ + catsrcs: []*v1alpha1.CatalogSource{ + { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "olm", + Name: "high-priority-operator", + }, + Spec: v1alpha1.CatalogSourceSpec{ + Priority: 100, + }, + }, + }, + })), } operators, err := satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) @@ -443,23 +422,39 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } // Catsrc with the same priority, ns, different name - fakeNamespacedOperatorCache.Snapshots[registry.CatalogKey{ + ssp[cache.SourceKey{ Namespace: "olm", Name: "community-operator", - }] = &cache.CatalogSnapshot{ - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community-operator", - }, - Priority: 100, - Operators: []*cache.Operator{ + }] = &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community-operator", namespace, nil, nil, nil, "", false), }, } satResolver = SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), + cache: cache.New(ssp, cache.WithCatalogSourceLister(&stubCatalogSourceLister{ + catsrcs: []*v1alpha1.CatalogSource{ + { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "olm", + Name: "high-priority-operator", + }, + Spec: v1alpha1.CatalogSourceSpec{ + Priority: 100, + }, + }, + { + ObjectMeta: metav1.ObjectMeta{ + Namespace: "olm", + Name: "community-operator", + }, + Spec: v1alpha1.CatalogSourceSpec{ + Priority: 100, + }, + }, + }, + })), } operators, err = satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) @@ -476,15 +471,11 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } // operators from the same catalogs source should be prioritized. - fakeNamespacedOperatorCache.Snapshots[registry.CatalogKey{ + ssp[cache.SourceKey{ Namespace: "olm", Name: "community", - }] = &cache.CatalogSnapshot{ - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + }] = &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", namespace, nil, nil, opToAddVersionDeps, "", false), genOperator("packageB.v1", "0.0.1", "", "packageB", "alpha", "community", @@ -493,7 +484,7 @@ func TestSolveOperators_CatsrcPrioritySorting(t *testing.T) { } satResolver = SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), + cache: cache.New(ssp), } operators, err = satResolver.SolveOperators([]string{"olm"}, []*v1alpha1.ClusterServiceVersion{}, subs) @@ -516,7 +507,7 @@ func TestSolveOperators_WithDependencies(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -531,27 +522,17 @@ func TestSolveOperators_WithDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -574,7 +555,7 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { Provides := APISet namespace := "olm" - community := registry.CatalogKey{"community", namespace} + community := cache.SourceKey{"community", namespace} csvs := []*v1alpha1.ClusterServiceVersion{ existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", nil, nil, nil, nil), @@ -591,21 +572,17 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - community: { - Key: community, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + community: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, Provides, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -624,7 +601,7 @@ func TestSolveOperators_WithGVKDependencies(t *testing.T) { func TestSolveOperators_WithLabelDependencies(t *testing.T) { namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} @@ -648,25 +625,15 @@ func TestSolveOperators_WithLabelDependencies(t *testing.T) { operatorBv1.Properties = append(operatorBv1.Properties, p) } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, "", false), operatorBv1, }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), + }), } operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) @@ -685,7 +652,7 @@ func TestSolveOperators_WithLabelDependencies(t *testing.T) { func TestSolveOperators_WithUnsatisfiableLabelDependencies(t *testing.T) { namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} @@ -697,25 +664,15 @@ func TestSolveOperators_WithUnsatisfiableLabelDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, deps, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), + }), } operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) @@ -728,7 +685,7 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -750,17 +707,13 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + cache.SourceKey{ Namespace: "olm", Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + }: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1.0.1", "1.0.1", "packageA.v1", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), @@ -769,25 +722,18 @@ func TestSolveOperators_WithNestedGVKDependencies(t *testing.T) { genOperator("packageD.v1.0.1", "1.0.1", "", "packageD", "alpha", "community", "olm", nil, Provides2, deps2, "", false), }, }, - registry.CatalogKey{ + cache.SourceKey{ Namespace: "olm", Name: "certified", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "certified", - }, - Operators: []*cache.Operator{ + }: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageC.v1.0.0", "1.0.0", "", "packageC", "alpha", "certified", "olm", Provides2, Provides, deps2, "", false), genOperator("packageC.v1.0.1", "1.0.1", "packageC.v1.0.0", "packageC", "alpha", "certified", "olm", Provides2, Provides, deps2, "", false), genOperator("packageD.v1.0.1", "1.0.1", "", "packageD", "alpha", "certified", "olm", nil, Provides2, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -815,7 +761,7 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { const namespace = "olm" Provides := cache.APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} - community := registry.CatalogKey{Name: "community", Namespace: namespace} + community := cache.SourceKey{Name: "community", Namespace: namespace} csvs := []*v1alpha1.ClusterServiceVersion{ existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil), } @@ -837,35 +783,24 @@ func TestSolveOperators_IgnoreUnsatisfiableDependencies(t *testing.T) { }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - community: { - Key: community, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + community: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "community", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "community", "olm", nil, nil, unsatisfiableVersionDeps, "", false), }, }, - { - Namespace: "olm", - Name: "certified", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "certified", - }, - Operators: []*cache.Operator{ + {Namespace: "olm", Name: "certified"}: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", "certified", "olm", nil, nil, nil, "", false), genOperator("packageB.v1", "1.0.0", "", "packageB", "alpha", "certified", "olm", nil, nil, opToAddVersionDeps, "", false), genOperator("packageC.v1", "0.1.0", "", "packageC", "alpha", "certified", "olm", nil, nil, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -889,32 +824,28 @@ func TestSolveOperators_PreferCatalogInSameNamespace(t *testing.T) { namespace := "olm" altNamespace := "alt-olm" - catalog := registry.CatalogKey{"community", namespace} - altnsCatalog := registry.CatalogKey{"alt-community", altNamespace} + catalog := cache.SourceKey{"community", namespace} + altnsCatalog := cache.SourceKey{"alt-community", altNamespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} sub := existingSub(namespace, "packageA.v1", "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{sub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, "", false), }, }, - altnsCatalog: { - Operators: []*cache.Operator{ + altnsCatalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", altnsCatalog.Name, altnsCatalog.Namespace, nil, Provides, nil, "", false), }, }, - }, - Namespaces: []string{namespace, altNamespace}, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) @@ -933,27 +864,23 @@ func TestSolveOperators_ResolveOnlyInCachedNamespaces(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} - otherCatalog := registry.CatalogKey{Name: "secret", Namespace: "secret"} + catalog := cache.SourceKey{"community", namespace} + otherCatalog := cache.SourceKey{Name: "secret", Namespace: "secret"} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} newSub := newSub(namespace, "packageA", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", otherCatalog.Name, otherCatalog.Namespace, nil, Provides, nil, "", false), }, }, - }, - Namespaces: []string{otherCatalog.Namespace}, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) @@ -968,7 +895,7 @@ func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{Name: "community", Namespace: namespace} + catalog := cache.SourceKey{Name: "community", Namespace: namespace} csvs := []*v1alpha1.ClusterServiceVersion{} @@ -977,21 +904,17 @@ func TestSolveOperators_PreferDefaultChannelInResolution(t *testing.T) { newSub := newSub(namespace, "packageA", "", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ // Default channel is stable in this case genOperator("packageA.v0.0.2", "0.0.2", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), }, }, - }, - } - - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) @@ -1010,7 +933,7 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{Name: "community", Namespace: namespace} + catalog := cache.SourceKey{Name: "community", Namespace: namespace} csvs := []*v1alpha1.ClusterServiceVersion{} @@ -1018,21 +941,18 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie subs := []*v1alpha1.Subscription{newSub} const defaultChannel = "stable" - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Operators: []*cache.Operator{ + + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(nil, Provides), defaultChannel, false), genOperator("packageB.v0.0.1", "0.0.1", "packageB.v1", "packageB", defaultChannel, catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), genOperator("packageB.v0.0.2", "0.0.2", "packageB.v0.0.1", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), }, }, - }, - } - - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, csvs, subs) @@ -1051,7 +971,7 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} @@ -1065,26 +985,16 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. }, } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", Provides, nil, deps, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -1104,33 +1014,23 @@ func TestSolveOperators_SubscriptionlessOperatorsCanConflict(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} csv := existingOperator(namespace, "packageA.v1", "packageA", "alpha", "", Provides, nil, nil, nil) csvs := []*v1alpha1.ClusterServiceVersion{csv} newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageB.v1.0.0", "1.0.0", "", "packageB", "alpha", "community", "olm", nil, Provides, nil, "", false), genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", "community", "olm", nil, Provides, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } _, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) @@ -1146,17 +1046,16 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { RequiresBoth := Requires1.Union(Requires2) namespace := "olm" - catalog := registry.CatalogKey{Name: "community", Namespace: namespace} - secondaryCatalog := registry.CatalogKey{Namespace: "olm", Name: "secondary"} + catalog := cache.SourceKey{Name: "community", Namespace: namespace} + secondaryCatalog := cache.SourceKey{Namespace: "olm", Name: "secondary"} newSub := newSub(namespace, "packageA", "stable", catalog) subs := []*v1alpha1.Subscription{newSub} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, RequiresBoth, nil, nil, "", false), // Despite satisfying dependencies of opA, this is not chosen because it is in the same package genOperator("opABC.v1.0.0", "1.0.0", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, ProvidesBoth, nil, "", false), @@ -1165,19 +1064,15 @@ func TestSolveOperators_PackageCannotSelfSatisfy(t *testing.T) { genOperator("opD.v1.0.0", "1.0.0", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, Provides1, nil, "stable", false), }, }, - secondaryCatalog: { - Key: secondaryCatalog, - Operators: []*cache.Operator{ + secondaryCatalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("opC.v1.0.0", "1.0.0", "", "packageB", "stable", secondaryCatalog.Name, secondaryCatalog.Namespace, nil, Provides2, nil, "stable", false), genOperator("opE.v1.0.0", "1.0.0", "", "packageC", "stable", secondaryCatalog.Name, secondaryCatalog.Namespace, nil, Provides2, nil, "", false), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) @@ -1201,18 +1096,17 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { ProvidesBoth := Provides1.Union(Provides2) namespace := "olm" - catalog := registry.CatalogKey{Name: "community", Namespace: namespace} + catalog := cache.SourceKey{Name: "community", Namespace: namespace} phases := []struct { subs []*v1alpha1.Subscription - catalog *cache.CatalogSnapshot + catalog cache.Source expected cache.OperatorSet }{ { subs: []*v1alpha1.Subscription{newSub(namespace, "packageB", "stable", catalog)}, - catalog: &cache.CatalogSnapshot{ - Key: catalog, - Operators: []*cache.Operator{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), }, @@ -1228,9 +1122,8 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { existingSub(namespace, "opA.v1.0.0", "packageA", "stable", catalog), existingSub(namespace, "opB.v1.0.0", "packageB", "stable", catalog), }, - catalog: &cache.CatalogSnapshot{ - Key: catalog, - Operators: []*cache.Operator{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opA.v1.0.1", "1.0.1", "opA.v1.0.0", "packageA", "stable", catalog.Name, catalog.Namespace, Requires1, nil, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), @@ -1245,9 +1138,8 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { existingSub(namespace, "opA.v1.0.0", "packageA", "stable", catalog), existingSub(namespace, "opB.v1.0.0", "packageB", "stable", catalog), }, - catalog: &cache.CatalogSnapshot{ - Key: catalog, - Operators: []*cache.Operator{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("opA.v1.0.0", "1.0.0", "", "packageA", "stable", catalog.Name, catalog.Namespace, nil, Provides1, nil, "", false), genOperator("opA.v1.0.1", "1.0.1", "opA.v1.0.0", "packageA", "stable", catalog.Name, catalog.Namespace, Requires1, nil, nil, "", false), genOperator("opB.v1.0.0", "1.0.0", "", "packageB", "stable", catalog.Name, catalog.Namespace, Requires1, Provides2, nil, "stable", false), @@ -1264,14 +1156,11 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { var operators cache.OperatorSet for i, p := range phases { t.Run(fmt.Sprintf("phase %d", i+1), func(t *testing.T) { - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: p.catalog, - }, - } satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + cache: cache.New(cache.StaticSourceProvider{ + catalog: p.catalog, + }), + log: logrus.New(), } csvs := make([]*v1alpha1.ClusterServiceVersion, 0) for _, o := range operators { @@ -1295,24 +1184,6 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { } } -type FakeOperatorCache struct { - fakedNamespacedOperatorCache cache.NamespacedOperatorCache -} - -func (f *FakeOperatorCache) Namespaced(namespaces ...string) cache.MultiCatalogOperatorFinder { - return &f.fakedNamespacedOperatorCache -} - -func (f *FakeOperatorCache) Expire(key registry.CatalogKey) { - return -} - -func getFakeOperatorCache(fakedNamespacedOperatorCache cache.NamespacedOperatorCache) cache.OperatorCacheProvider { - return &FakeOperatorCache{ - fakedNamespacedOperatorCache: fakedNamespacedOperatorCache, - } -} - func genOperator(name, version, replaces, pkg, channel, catalogName, catalogNamespace string, requiredAPIs, providedAPIs cache.APISet, dependencies []*api.Dependency, defaultChannel string, deprecated bool) *cache.Operator { semversion, _ := semver.Make(version) properties := cache.APISetToProperties(providedAPIs, nil, deprecated) @@ -1341,7 +1212,7 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName }, Properties: properties, SourceInfo: &cache.OperatorSourceInfo{ - Catalog: registry.CatalogKey{ + Catalog: cache.SourceKey{ Name: catalogName, Namespace: catalogNamespace, }, @@ -1352,7 +1223,7 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName ProvidedAPIs: providedAPIs, RequiredAPIs: requiredAPIs, } - cache.EnsurePackageProperty(o, pkg, version) + EnsurePackageProperty(o, pkg, version) return o } @@ -1362,25 +1233,21 @@ func stripBundle(o *cache.Operator) *cache.Operator { } func TestSolveOperators_WithoutDeprecated(t *testing.T) { - catalog := registry.CatalogKey{Name: "catalog", Namespace: "namespace"} + catalog := cache.SourceKey{Name: "catalog", Namespace: "namespace"} subs := []*v1alpha1.Subscription{ newSub(catalog.Namespace, "packageA", "alpha", catalog), } - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ genOperator("packageA.v1", "0.0.1", "", "packageA", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", true), }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{catalog.Namespace}, nil, subs) @@ -1389,22 +1256,19 @@ func TestSolveOperators_WithoutDeprecated(t *testing.T) { } func TestSolveOperatorsWithDeprecatedInnerChannelEntry(t *testing.T) { - catalog := registry.CatalogKey{Name: "catalog", Namespace: "namespace"} + catalog := cache.SourceKey{Name: "catalog", Namespace: "namespace"} subs := []*v1alpha1.Subscription{ newSub(catalog.Namespace, "a", "c", catalog), } logger, _ := test.NewNullLogger() resolver := SatResolver{ - cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ - genOperator("a-1", "1.0.0", "", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), - genOperator("a-2", "2.0.0", "a-1", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", true), - genOperator("a-3", "3.0.0", "a-2", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), - }, + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ + genOperator("a-1", "1.0.0", "", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), + genOperator("a-2", "2.0.0", "a-1", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", true), + genOperator("a-3", "3.0.0", "a-2", "a", "c", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, }, }), @@ -1422,7 +1286,7 @@ func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { Provides := APISet namespace := "olm" - catalog := registry.CatalogKey{"community", namespace} + catalog := cache.SourceKey{"community", namespace} newSub := newSub(namespace, "packageB", "alpha", catalog, withStartingCSV("packageB.v1")) subs := []*v1alpha1.Subscription{newSub} @@ -1446,25 +1310,15 @@ func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { op5.Skips = []string{"packageA.v2", "packageA.v3", "packageA.v4"} op6 := genOperator("packageA.v6", "6.0.0", "packageA.v5", "packageA", "alpha", "community", "olm", nil, Provides, nil, "", false) - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }: { - Key: registry.CatalogKey{ - Namespace: "olm", - Name: "community", - }, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ opB, opB2, op1, op2, op3, op4, op5, op6, }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{"olm"}, nil, subs) @@ -1479,7 +1333,7 @@ func TestSolveOperators_WithSkipsAndStartingCSV(t *testing.T) { func TestSolveOperators_WithSkips(t *testing.T) { const namespace = "test-namespace" - catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} + catalog := cache.SourceKey{Name: "test-catalog", Namespace: namespace} newSub := newSub(namespace, "packageB", "alpha", catalog) subs := []*v1alpha1.Subscription{newSub} @@ -1488,19 +1342,15 @@ func TestSolveOperators_WithSkips(t *testing.T) { opB2 := genOperator("packageB.v2", "2.0.0", "", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, nil, nil, "", false) opB2.Skips = []string{"packageB.v1"} - fakeNamespacedOperatorCache := cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ + satResolver := SatResolver{ + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ opB, opB2, }, }, - }, - } - satResolver := SatResolver{ - cache: getFakeOperatorCache(fakeNamespacedOperatorCache), - log: logrus.New(), + }), + log: logrus.New(), } operators, err := satResolver.SolveOperators([]string{namespace}, nil, subs) @@ -1513,7 +1363,7 @@ func TestSolveOperators_WithSkips(t *testing.T) { func TestSolveOperatorsWithSkipsPreventingSelection(t *testing.T) { const namespace = "test-namespace" - catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} + catalog := cache.SourceKey{Name: "test-catalog", Namespace: namespace} gvks := cache.APISet{opregistry.APIKey{Group: "g", Version: "v", Kind: "k", Plural: "ks"}: struct{}{}} // Subscription candidate a-1 requires a GVK provided @@ -1528,12 +1378,9 @@ func TestSolveOperatorsWithSkipsPreventingSelection(t *testing.T) { logger, _ := test.NewNullLogger() satResolver := SatResolver{ - cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{a1, b3, b2, b1}, - }, + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{a1, b3, b2, b1}, }, }), log: logger, @@ -1545,7 +1392,7 @@ func TestSolveOperatorsWithSkipsPreventingSelection(t *testing.T) { func TestSolveOperatorsWithClusterServiceVersionHavingDependency(t *testing.T) { const namespace = "test-namespace" - catalog := registry.CatalogKey{Name: "test-catalog", Namespace: namespace} + catalog := cache.SourceKey{Name: "test-catalog", Namespace: namespace} a1 := existingOperator(namespace, "a-1", "a", "default", "", nil, nil, nil, nil) a1.Annotations = map[string]string{ @@ -1564,13 +1411,10 @@ func TestSolveOperatorsWithClusterServiceVersionHavingDependency(t *testing.T) { log, _ := test.NewNullLogger() r := SatResolver{ - cache: getFakeOperatorCache(cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ - genOperator("b-2", "2.0.0", "b-1", "b", "default", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), - }, + cache: cache.New(cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ + genOperator("b-2", "2.0.0", "b-1", "b", "default", catalog.Name, catalog.Namespace, nil, nil, nil, "", false), }, }, }), @@ -1583,11 +1427,11 @@ func TestSolveOperatorsWithClusterServiceVersionHavingDependency(t *testing.T) { } func TestInferProperties(t *testing.T) { - catalog := registry.CatalogKey{Namespace: "namespace", Name: "name"} + catalog := cache.SourceKey{Namespace: "namespace", Name: "name"} for _, tc := range []struct { Name string - Cache cache.NamespacedOperatorCache + Cache cache.StaticSourceProvider CSV *v1alpha1.ClusterServiceVersion Subscriptions []*v1alpha1.Subscription Expected []*api.Property @@ -1664,16 +1508,13 @@ func TestInferProperties(t *testing.T) { }, { Name: "one matching subscription infers package property", - Cache: cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ - { - Name: "a", - Bundle: &api.Bundle{ - PackageName: "x", - }, + Cache: cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ + { + Name: "a", + Bundle: &api.Bundle{ + PackageName: "x", }, }, }, @@ -1706,6 +1547,47 @@ func TestInferProperties(t *testing.T) { }, }, }, + { + Name: "one matching subscription to other-namespace catalogsource infers package property", + Cache: cache.StaticSourceProvider{ + {Namespace: "other-namespace", Name: "other-name"}: &cache.Snapshot{ + Entries: []*cache.Operator{ + { + Name: "a", + Bundle: &api.Bundle{ + PackageName: "x", + }, + }, + }, + }, + }, + CSV: &v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "a", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Version: version.OperatorVersion{Version: semver.MustParse("1.2.3")}, + }, + }, + Subscriptions: []*v1alpha1.Subscription{ + { + Spec: &v1alpha1.SubscriptionSpec{ + Package: "x", + CatalogSource: "other-name", + CatalogSourceNamespace: "other-namespace", + }, + Status: v1alpha1.SubscriptionStatus{ + InstalledCSV: "a", + }, + }, + }, + Expected: []*api.Property{ + { + Type: "olm.package", + Value: `{"packageName":"x","version":"1.2.3"}`, + }, + }, + }, { Name: "one matching subscription without catalog entry infers no properties", CSV: &v1alpha1.ClusterServiceVersion{ @@ -1729,16 +1611,13 @@ func TestInferProperties(t *testing.T) { }, { Name: "one matching subscription infers package property without csv version", - Cache: cache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*cache.CatalogSnapshot{ - catalog: { - Key: catalog, - Operators: []*cache.Operator{ - { - Name: "a", - Bundle: &api.Bundle{ - PackageName: "x", - }, + Cache: cache.StaticSourceProvider{ + catalog: &cache.Snapshot{ + Entries: []*cache.Operator{ + { + Name: "a", + Bundle: &api.Bundle{ + PackageName: "x", }, }, }, @@ -1773,10 +1652,8 @@ func TestInferProperties(t *testing.T) { require := require.New(t) logger, _ := test.NewNullLogger() r := SatResolver{ - log: logger, - cache: &FakeOperatorCache{ - fakedNamespacedOperatorCache: tc.Cache, - }, + log: logger, + cache: cache.New(tc.Cache), } actual, err := r.inferProperties(tc.CSV, tc.Subscriptions) require.NoError(err) diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go new file mode 100644 index 0000000000..6c5c11998d --- /dev/null +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go @@ -0,0 +1,109 @@ +package resolver + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" + "github.com/operator-framework/operator-registry/pkg/api" + "github.com/operator-framework/operator-registry/pkg/client" + opregistry "github.com/operator-framework/operator-registry/pkg/registry" + "github.com/sirupsen/logrus" +) + +type RegistryClientProvider interface { + ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface +} + +type registryClientAdapter struct { + rcp RegistryClientProvider + logger logrus.StdLogger +} + +func SourceProviderFromRegistryClientProvider(rcp RegistryClientProvider, logger logrus.StdLogger) cache.SourceProvider { + return ®istryClientAdapter{ + rcp: rcp, + logger: logger, + } +} + +type registrySource struct { + key cache.SourceKey + client client.Interface + logger logrus.StdLogger +} + +func (s *registrySource) Snapshot(ctx context.Context) (*cache.Snapshot, error) { + // Fetching default channels this way makes many round trips + // -- may need to either add a new API to fetch all at once, + // or embed the information into Bundle. + defaultChannels := make(map[string]string) + + it, err := s.client.ListBundles(ctx) + if err != nil { + return nil, fmt.Errorf("failed to list bundles: %w", err) + } + + var operators []*cache.Operator + for b := it.Next(); b != nil; b = it.Next() { + defaultChannel, ok := defaultChannels[b.PackageName] + if !ok { + if p, err := s.client.GetPackage(ctx, b.PackageName); err != nil { + s.logger.Printf("failed to retrieve default channel for bundle, continuing: %v", err) + continue + } else { + defaultChannels[b.PackageName] = p.DefaultChannelName + defaultChannel = p.DefaultChannelName + } + } + o, err := cache.NewOperatorFromBundle(b, "", s.key, defaultChannel) + if err != nil { + s.logger.Printf("failed to construct operator from bundle, continuing: %v", err) + continue + } + o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() + o.RequiredAPIs = o.RequiredAPIs.StripPlural() + o.Replaces = b.Replaces + EnsurePackageProperty(o, b.PackageName, b.Version) + operators = append(operators, o) + } + if err := it.Error(); err != nil { + return nil, fmt.Errorf("error encountered while listing bundles: %w", err) + } + + return &cache.Snapshot{Entries: operators}, nil +} + +func (a *registryClientAdapter) Sources(namespaces ...string) map[cache.SourceKey]cache.Source { + result := make(map[cache.SourceKey]cache.Source) + for key, client := range a.rcp.ClientsForNamespaces(namespaces...) { + result[cache.SourceKey(key)] = ®istrySource{ + key: cache.SourceKey(key), + client: client, + logger: a.logger, + } + } + return result +} + +func EnsurePackageProperty(o *cache.Operator, name, version string) { + for _, p := range o.Properties { + if p.Type == opregistry.PackageType { + return + } + } + prop := opregistry.PackageProperty{ + PackageName: name, + Version: version, + } + bytes, err := json.Marshal(prop) + if err != nil { + return + } + o.Properties = append(o.Properties, &api.Property{ + Type: opregistry.PackageType, + Value: string(bytes), + }) +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index a696dfd657..7574dda57c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -17,7 +17,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" @@ -31,7 +30,7 @@ var timeNow = func() metav1.Time { return metav1.NewTime(time.Now().UTC()) } type StepResolver interface { ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) - Expire(key registry.CatalogKey) + Expire(key cache.SourceKey) } type OperatorStepResolver struct { @@ -48,7 +47,7 @@ type OperatorStepResolver struct { var _ StepResolver = &OperatorStepResolver{} func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versioned.Interface, kubeclient kubernetes.Interface, - globalCatalogNamespace string, provider cache.RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { + globalCatalogNamespace string, provider RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { return &OperatorStepResolver{ subLister: lister.OperatorsV1alpha1().SubscriptionLister(), csvLister: lister.OperatorsV1alpha1().ClusterServiceVersionLister(), @@ -56,12 +55,12 @@ func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versio client: client, kubeclient: kubeclient, globalCatalogNamespace: globalCatalogNamespace, - satResolver: NewDefaultSatResolver(cache.NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), + satResolver: NewDefaultSatResolver(SourceProviderFromRegistryClientProvider(provider, log), lister.OperatorsV1alpha1().CatalogSourceLister(), log), log: log, } } -func (r *OperatorStepResolver) Expire(key registry.CatalogKey) { +func (r *OperatorStepResolver) Expire(key cache.SourceKey) { r.satResolver.cache.Expire(key) } @@ -109,7 +108,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, if sub.Spec.Channel != "" && sub.Spec.Channel != sourceInfo.Channel { continue } - subCatalogKey := registry.CatalogKey{ + subCatalogKey := cache.SourceKey{ Name: sub.Spec.CatalogSource, Namespace: sub.Spec.CatalogSourceNamespace, } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go index eeed54fee1..77faa38b9c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go @@ -23,7 +23,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned/fake" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/informers/externalversions" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" @@ -50,7 +49,7 @@ var ( func TestResolver(t *testing.T) { const namespace = "catsrc-namespace" - catalog := registry.CatalogKey{Name: "catsrc", Namespace: namespace} + catalog := resolvercache.SourceKey{Name: "catsrc", Namespace: namespace} type resolverTestOut struct { steps [][]*v1alpha1.Step @@ -62,7 +61,7 @@ func TestResolver(t *testing.T) { type resolverTest struct { name string clusterState []runtime.Object - bundlesByCatalog map[registry.CatalogKey][]*api.Bundle + bundlesByCatalog map[resolvercache.SourceKey][]*api.Bundle out resolverTestOut } @@ -77,7 +76,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "package", "", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("bundle", "package", "channel", "", nil, nil, nil, nil), }, @@ -114,7 +113,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("bundle", "package", "channel", "", nil, nil, nil, nil), }, @@ -137,7 +136,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("bundle", "a", "channel", "", nil, nil, nil, nil), }, @@ -160,7 +159,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog, withStartingCSV("notfound")), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("bundle", "a", "alpha", "", nil, nil, nil, nil), }, @@ -183,7 +182,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), }, @@ -202,7 +201,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), @@ -224,7 +223,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), stripManifests(withBundlePath(bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), "quay.io/test/bundle@sha256:abcd")), @@ -270,7 +269,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { withBundleObject(bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), u(&rbacv1.RoleBinding{TypeMeta: metav1.TypeMeta{Kind: "RoleBinding", APIVersion: "rbac.authorization.k8s.io/v1"}, ObjectMeta: metav1.ObjectMeta{Name: "test-rb"}})), bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), @@ -292,7 +291,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { withBundleObject(bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), u(&corev1.Service{TypeMeta: metav1.TypeMeta{Kind: "Service", APIVersion: ""}, ObjectMeta: metav1.ObjectMeta{Name: "test-service"}})), bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), @@ -314,7 +313,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), }, @@ -348,7 +347,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, @@ -362,7 +361,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "b.v1", "b", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), bundle("b.v1", "b", "alpha", "", Provides1, nil, nil, nil), @@ -380,7 +379,7 @@ func TestResolver(t *testing.T) { newSub(namespace, "a", "alpha", catalog), newSub(namespace, "a", "beta", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), bundle("a.v2", "a", "beta", "", Provides1, nil, nil, nil), @@ -406,7 +405,7 @@ func TestResolver(t *testing.T) { return }(), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, @@ -439,7 +438,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v2", "a", "alpha", "a.v1", Provides1, nil, nil, nil), bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), @@ -460,7 +459,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{catalog: { + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: { stripManifests(withBundlePath(bundle("a.v2", "a", "alpha", "a.v1", Provides1, nil, nil, nil), "quay.io/test/bundle@sha256:abcd"))}, }, out: resolverTestOut{ @@ -501,7 +500,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ existingSub(namespace, "a.v1", "a", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, @@ -520,7 +519,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, Requires1, nil, nil), @@ -544,7 +543,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", nil, nil, Provides1, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, nil, nil, Requires1), @@ -569,7 +568,7 @@ func TestResolver(t *testing.T) { existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), newSub(namespace, "b", "beta", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, nil, nil, nil), @@ -593,7 +592,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), newSub(namespace, "b", "beta", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), bundle("b.v1", "b", "beta", "", nil, nil, nil, nil), @@ -615,7 +614,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), newSub(namespace, "b", "beta", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, Provides1, nil), bundle("b.v1", "b", "beta", "", nil, nil, nil, nil), @@ -640,7 +639,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "b.v1", "b", "alpha", catalog), existingOperator(namespace, "b.v1", "b", "alpha", "", Provides2, Requires1, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v2", "a", "alpha", "a.v1", Provides3, Requires4, nil, nil), bundle("b.v2", "b", "alpha", "b.v1", Provides4, Requires3, nil, nil), @@ -666,7 +665,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "b.v1", "b", "alpha", catalog), existingOperator(namespace, "b.v1", "b", "alpha", "", nil, Requires1, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v2", "a", "alpha", "a.v1", nil, nil, nil, nil), bundle("b.v2", "b", "alpha", "b.v1", Provides1, nil, nil, nil), @@ -688,7 +687,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "b", "alpha", catalog), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { bundle("a.v1", "a", "alpha", "", Provides1, nil, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, nil, nil, nil), @@ -712,7 +711,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{catalog: { + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: { bundle("a.v3", "a", "alpha", "a.v2", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")), }}, out: resolverTestOut{ @@ -732,9 +731,9 @@ func TestResolver(t *testing.T) { existingOperator(namespace, "a.v1", "a", "alpha", "", nil, Requires1, nil, nil), existingOperator(namespace, "b.v1", "b", "beta", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{ + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{ catalog: { - bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), + bundle("a.v1", "a", "alpha", "", nil, Requires1, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, Requires1, nil, nil), bundle("b.v1", "b", "beta", "", Provides1, nil, nil, nil), bundle("b.v2", "b", "beta", "b.v1", Provides1, nil, nil, nil), @@ -757,7 +756,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{catalog: { + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: { bundle("a.v2", "a", "alpha", "", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")), bundle("a.v3", "a", "alpha", "a.v2", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")), bundle("a.v4", "a", "alpha", "a.v3", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0 !0.0.0")), @@ -776,7 +775,7 @@ func TestResolver(t *testing.T) { clusterState: []runtime.Object{ newSub(namespace, "a", "alpha", catalog, withStartingCSV("a.v2")), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{catalog: { + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: { bundle("a.v1", "a", "alpha", "", nil, nil, nil, nil), bundle("a.v2", "a", "alpha", "a.v1", nil, nil, nil, nil), bundle("a.v3", "a", "alpha", "a.v2", nil, nil, nil, nil, withVersion("1.0.0"), withSkipRange("< 1.0.0")), @@ -796,7 +795,7 @@ func TestResolver(t *testing.T) { existingSub(namespace, "a.v1", "a", "alpha", catalog), existingOperator(namespace, "a.v1", "a", "alpha", "", Provides1, nil, nil, nil), }, - bundlesByCatalog: map[registry.CatalogKey][]*api.Bundle{catalog: { + bundlesByCatalog: map[resolvercache.SourceKey][]*api.Bundle{catalog: { bundle("a.v2", "a", "alpha", "", nil, nil, nil, nil, withVersion("1.0.0"), withSkips([]string{"a.v1"})), bundle("a.v3", "a", "alpha", "a.v2", nil, nil, nil, nil, withVersion("1.0.0"), withSkips([]string{"a.v1"})), }}, @@ -826,26 +825,21 @@ func TestResolver(t *testing.T) { lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(namespace, informerFactory.Operators().V1alpha1().ClusterServiceVersions().Lister()) kClientFake := k8sfake.NewSimpleClientset() - stubSnapshot := &resolvercache.CatalogSnapshot{} - for _, bundles := range tt.bundlesByCatalog { + ssp := make(resolvercache.StaticSourceProvider) + for catalog, bundles := range tt.bundlesByCatalog { + snapshot := &resolvercache.Snapshot{} for _, bundle := range bundles { op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } - stubSnapshot.Operators = append(stubSnapshot.Operators, op) + snapshot.Entries = append(snapshot.Entries, op) } - } - stubCache := &stubOperatorCacheProvider{ - noc: &resolvercache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*resolvercache.CatalogSnapshot{ - catalog: stubSnapshot, - }, - }, + ssp[catalog] = snapshot } log := logrus.New() satresolver := &SatResolver{ - cache: stubCache, + cache: resolvercache.New(ssp), log: log, } resolver := NewOperatorStepResolver(lister, clientFake, kClientFake, "", nil, log) @@ -886,13 +880,13 @@ func (stub *stubOperatorCacheProvider) Namespaced(namespaces ...string) resolver return stub.noc } -func (stub *stubOperatorCacheProvider) Expire(key registry.CatalogKey) { +func (stub *stubOperatorCacheProvider) Expire(key resolvercache.SourceKey) { return } func TestNamespaceResolverRBAC(t *testing.T) { namespace := "catsrc-namespace" - catalog := registry.CatalogKey{"catsrc", namespace} + catalog := resolvercache.SourceKey{"catsrc", namespace} simplePermissions := []v1alpha1.StrategyDeploymentPermissions{ { @@ -978,23 +972,18 @@ func TestNamespaceResolverRBAC(t *testing.T) { lister.OperatorsV1alpha1().RegisterSubscriptionLister(namespace, informerFactory.Operators().V1alpha1().Subscriptions().Lister()) lister.OperatorsV1alpha1().RegisterClusterServiceVersionLister(namespace, informerFactory.Operators().V1alpha1().ClusterServiceVersions().Lister()) - stubSnapshot := &resolvercache.CatalogSnapshot{} + stubSnapshot := &resolvercache.Snapshot{} for _, bundle := range tt.bundlesInCatalog { op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } - stubSnapshot.Operators = append(stubSnapshot.Operators, op) - } - stubCache := &stubOperatorCacheProvider{ - noc: &resolvercache.NamespacedOperatorCache{ - Snapshots: map[registry.CatalogKey]*resolvercache.CatalogSnapshot{ - catalog: stubSnapshot, - }, - }, + stubSnapshot.Entries = append(stubSnapshot.Entries, op) } satresolver := &SatResolver{ - cache: stubCache, + cache: resolvercache.New(resolvercache.StaticSourceProvider{ + catalog: stubSnapshot, + }), } resolver := NewOperatorStepResolver(lister, clientFake, kClientFake, "", nil, logrus.New()) resolver.satResolver = satresolver @@ -1038,7 +1027,7 @@ func withStartingCSV(name string) subOption { } } -func newSub(namespace, pkg, channel string, catalog registry.CatalogKey, option ...subOption) *v1alpha1.Subscription { +func newSub(namespace, pkg, channel string, catalog resolvercache.SourceKey, option ...subOption) *v1alpha1.Subscription { s := &v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Name: pkg + "-" + channel, @@ -1057,7 +1046,7 @@ func newSub(namespace, pkg, channel string, catalog registry.CatalogKey, option return s } -func updatedSub(namespace, currentOperatorName, installedOperatorName, pkg, channel string, catalog registry.CatalogKey, option ...subOption) *v1alpha1.Subscription { +func updatedSub(namespace, currentOperatorName, installedOperatorName, pkg, channel string, catalog resolvercache.SourceKey, option ...subOption) *v1alpha1.Subscription { s := &v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Name: pkg + "-" + channel, @@ -1080,7 +1069,7 @@ func updatedSub(namespace, currentOperatorName, installedOperatorName, pkg, chan return s } -func existingSub(namespace, operatorName, pkg, channel string, catalog registry.CatalogKey) *v1alpha1.Subscription { +func existingSub(namespace, operatorName, pkg, channel string, catalog resolvercache.SourceKey) *v1alpha1.Subscription { return &v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Name: pkg + "-" + channel, @@ -1109,7 +1098,7 @@ func existingOperator(namespace, operatorName, pkg, channel, replaces string, pr return csv } -func bundleSteps(bundle *api.Bundle, ns, replaces string, catalog registry.CatalogKey) []*v1alpha1.Step { +func bundleSteps(bundle *api.Bundle, ns, replaces string, catalog resolvercache.SourceKey) []*v1alpha1.Step { if replaces == "" { csv, _ := V1alpha1CSVFromBundle(bundle) replaces = csv.Spec.Replaces @@ -1142,7 +1131,7 @@ func withoutResourceKind(kind string, steps []*v1alpha1.Step) []*v1alpha1.Step { return filtered } -func subSteps(namespace, operatorName, pkgName, channelName string, catalog registry.CatalogKey) []*v1alpha1.Step { +func subSteps(namespace, operatorName, pkgName, channelName string, catalog resolvercache.SourceKey) []*v1alpha1.Step { sub := &v1alpha1.Subscription{ ObjectMeta: metav1.ObjectMeta{ Name: strings.Join([]string{pkgName, channelName, catalog.Name, catalog.Namespace}, "-"), diff --git a/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go b/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go index 07ec94e0f3..46f1ba9f8e 100644 --- a/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/fakes/fake_resolver.go @@ -5,15 +5,15 @@ import ( "sync" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type FakeStepResolver struct { - ExpireStub func(registry.CatalogKey) + ExpireStub func(cache.SourceKey) expireMutex sync.RWMutex expireArgsForCall []struct { - arg1 registry.CatalogKey + arg1 cache.SourceKey } ResolveStepsStub func(string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) resolveStepsMutex sync.RWMutex @@ -36,10 +36,10 @@ type FakeStepResolver struct { invocationsMutex sync.RWMutex } -func (fake *FakeStepResolver) Expire(arg1 registry.CatalogKey) { +func (fake *FakeStepResolver) Expire(arg1 cache.SourceKey) { fake.expireMutex.Lock() fake.expireArgsForCall = append(fake.expireArgsForCall, struct { - arg1 registry.CatalogKey + arg1 cache.SourceKey }{arg1}) fake.recordInvocation("Expire", []interface{}{arg1}) fake.expireMutex.Unlock() @@ -54,13 +54,13 @@ func (fake *FakeStepResolver) ExpireCallCount() int { return len(fake.expireArgsForCall) } -func (fake *FakeStepResolver) ExpireCalls(stub func(registry.CatalogKey)) { +func (fake *FakeStepResolver) ExpireCalls(stub func(cache.SourceKey)) { fake.expireMutex.Lock() defer fake.expireMutex.Unlock() fake.ExpireStub = stub } -func (fake *FakeStepResolver) ExpireArgsForCall(i int) registry.CatalogKey { +func (fake *FakeStepResolver) ExpireArgsForCall(i int) cache.SourceKey { fake.expireMutex.RLock() defer fake.expireMutex.RUnlock() argsForCall := fake.expireArgsForCall[i] diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go index c91029a3a7..e83e77c282 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/catalog/operator.go @@ -55,6 +55,7 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/grpc" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/reconciler" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver" + resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/catalogsource" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" @@ -463,7 +464,7 @@ func (o *Operator) syncSourceState(state grpc.SourceState) { switch state.State { case connectivity.Ready: - o.resolver.Expire(state.Key) + o.resolver.Expire(resolvercache.SourceKey(state.Key)) if o.namespace == state.Key.Namespace { namespaces, err := index.CatalogSubscriberNamespaces(o.catalogSubscriberIndexer, state.Key.Name, state.Key.Namespace) diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go index c26f30d434..10ca6d07d8 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache.go @@ -2,88 +2,140 @@ package cache import ( "context" - "encoding/json" "fmt" + "io" "sort" "sync" "time" - "k8s.io/apimachinery/pkg/util/errors" - "github.com/sirupsen/logrus" + "k8s.io/apimachinery/pkg/util/errors" "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" - "github.com/operator-framework/operator-registry/pkg/api" - "github.com/operator-framework/operator-registry/pkg/client" - opregistry "github.com/operator-framework/operator-registry/pkg/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" ) -type RegistryClientProvider interface { - ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface +const existingOperatorKey = "@existing" + +type SourceKey struct { + Name string + Namespace string } -type DefaultRegistryClientProvider struct { - logger logrus.FieldLogger - s RegistryClientProvider +func (k *SourceKey) String() string { + return fmt.Sprintf("%s/%s", k.Name, k.Namespace) } -func NewDefaultRegistryClientProvider(log logrus.FieldLogger, store RegistryClientProvider) *DefaultRegistryClientProvider { - return &DefaultRegistryClientProvider{ - logger: log, - s: store, +func (k *SourceKey) Empty() bool { + return k.Name == "" && k.Namespace == "" +} + +func (k *SourceKey) Equal(compare SourceKey) bool { + return k.Name == compare.Name && k.Namespace == compare.Namespace +} + +// Virtual indicates if this is a "virtual" catalog representing the currently installed operators in a namespace +func (k *SourceKey) Virtual() bool { + return k.Name == existingOperatorKey && k.Namespace != "" +} + +func NewVirtualSourceKey(namespace string) SourceKey { + return SourceKey{ + Name: existingOperatorKey, + Namespace: namespace, } } -func (rcp *DefaultRegistryClientProvider) ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface { - return rcp.s.ClientsForNamespaces(namespaces...) +type Source interface { + Snapshot(context.Context) (*Snapshot, error) +} + +type SourceProvider interface { + // TODO: namespaces parameter is an artifact of SourceStore + Sources(namespaces ...string) map[SourceKey]Source +} + +type StaticSourceProvider map[SourceKey]Source + +func (p StaticSourceProvider) Sources(namespaces ...string) map[SourceKey]Source { + result := make(map[SourceKey]Source) + for key, source := range p { + for _, namespace := range namespaces { + if key.Namespace == namespace { + result[key] = source + break + } + } + } + return result } type OperatorCacheProvider interface { Namespaced(namespaces ...string) MultiCatalogOperatorFinder - Expire(catalog registry.CatalogKey) + Expire(catalog SourceKey) } -type OperatorCache struct { - logger logrus.FieldLogger - rcp RegistryClientProvider +type Cache struct { + logger logrus.StdLogger + sp SourceProvider catsrcLister v1alpha1.CatalogSourceLister - snapshots map[registry.CatalogKey]*CatalogSnapshot + snapshots map[SourceKey]*snapshotHeader ttl time.Duration sem chan struct{} m sync.RWMutex } -const defaultCatalogSourcePriority int = 0 - type catalogSourcePriority int -var _ OperatorCacheProvider = &OperatorCache{} +var _ OperatorCacheProvider = &Cache{} + +type Option func(*Cache) + +func WithLogger(logger logrus.StdLogger) Option { + return func(c *Cache) { + c.logger = logger + } +} + +func WithCatalogSourceLister(catalogSourceLister v1alpha1.CatalogSourceLister) Option { + return func(c *Cache) { + c.catsrcLister = catalogSourceLister + } +} -func NewOperatorCache(rcp RegistryClientProvider, log logrus.FieldLogger, catsrcLister v1alpha1.CatalogSourceLister) *OperatorCache { +func New(sp SourceProvider, options ...Option) *Cache { const ( MaxConcurrentSnapshotUpdates = 4 ) - return &OperatorCache{ - logger: log, - rcp: rcp, - catsrcLister: catsrcLister, - snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + cache := Cache{ + logger: func() logrus.StdLogger { + logger := logrus.New() + logger.SetOutput(io.Discard) + return logger + }(), + sp: sp, + catsrcLister: operatorlister.NewLister().OperatorsV1alpha1().CatalogSourceLister(), + snapshots: make(map[SourceKey]*snapshotHeader), ttl: 5 * time.Minute, sem: make(chan struct{}, MaxConcurrentSnapshotUpdates), } + + for _, opt := range options { + opt(&cache) + } + + return &cache } type NamespacedOperatorCache struct { - Namespaces []string - existing *registry.CatalogKey - Snapshots map[registry.CatalogKey]*CatalogSnapshot + existing *SourceKey + snapshots map[SourceKey]*snapshotHeader } func (c *NamespacedOperatorCache) Error() error { var errs []error - for key, snapshot := range c.Snapshots { + for key, snapshot := range c.snapshots { snapshot.m.Lock() err := snapshot.err snapshot.m.Unlock() @@ -94,7 +146,7 @@ func (c *NamespacedOperatorCache) Error() error { return errors.NewAggregate(errs) } -func (c *OperatorCache) Expire(catalog registry.CatalogKey) { +func (c *Cache) Expire(catalog SourceKey) { c.m.Lock() defer c.m.Unlock() s, ok := c.snapshots[catalog] @@ -104,31 +156,30 @@ func (c *OperatorCache) Expire(catalog registry.CatalogKey) { s.expiry = time.Unix(0, 0) } -func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { +func (c *Cache) Namespaced(namespaces ...string) MultiCatalogOperatorFinder { const ( CachePopulateTimeout = time.Minute ) now := time.Now() - clients := c.rcp.ClientsForNamespaces(namespaces...) + sources := c.sp.Sources(namespaces...) result := NamespacedOperatorCache{ - Namespaces: namespaces, - Snapshots: make(map[registry.CatalogKey]*CatalogSnapshot), + snapshots: make(map[SourceKey]*snapshotHeader), } - var misses []registry.CatalogKey + var misses []SourceKey func() { c.m.RLock() defer c.m.RUnlock() - for key := range clients { + for key := range sources { snapshot, ok := c.snapshots[key] if ok { func() { snapshot.m.RLock() defer snapshot.m.RUnlock() - if !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { - result.Snapshots[key] = snapshot + if snapshot.Valid(now) { + result.snapshots[key] = snapshot } else { misses = append(misses, key) } @@ -148,9 +199,9 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin defer c.m.Unlock() // Take the opportunity to clear expired snapshots while holding the lock. - var expired []registry.CatalogKey + var expired []SourceKey for key, snapshot := range c.snapshots { - if snapshot.Expired(now) { + if !snapshot.Valid(now) { snapshot.Cancel() expired = append(expired, key) } @@ -162,8 +213,8 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin // Check for any snapshots that were populated while waiting to acquire the lock. var found int for i := range misses { - if snapshot, ok := c.snapshots[misses[i]]; ok && !snapshot.Expired(now) && snapshot.Operators != nil && len(snapshot.Operators) > 0 { - result.Snapshots[misses[i]] = snapshot + if hdr, ok := c.snapshots[misses[i]]; ok && hdr.Valid(now) { + result.snapshots[misses[i]] = hdr misses[found], misses[i] = misses[i], misses[found] found++ } @@ -173,120 +224,49 @@ func (c *OperatorCache) Namespaced(namespaces ...string) MultiCatalogOperatorFin for _, miss := range misses { ctx, cancel := context.WithTimeout(context.Background(), CachePopulateTimeout) - catsrcPriority := defaultCatalogSourcePriority - // Ignoring error and treat catsrc priority as 0 if not found. - catsrc, err := c.catsrcLister.CatalogSources(miss.Namespace).Get(miss.Name) - if err == nil { - catsrcPriority = catsrc.Spec.Priority - } - - s := CatalogSnapshot{ - logger: c.logger.WithField("catalog", miss), - Key: miss, - expiry: now.Add(c.ttl), - pop: cancel, - Priority: catalogSourcePriority(catsrcPriority), + hdr := snapshotHeader{ + key: miss, + expiry: now.Add(c.ttl), + pop: cancel, } - s.m.Lock() - c.snapshots[miss] = &s - result.Snapshots[miss] = &s - go c.populate(ctx, &s, clients[miss]) - } - - return &result -} -func (c *OperatorCache) populate(ctx context.Context, snapshot *CatalogSnapshot, registry client.Interface) { - defer snapshot.m.Unlock() - defer func() { - // Don't cache an errorred snapshot. - if snapshot.err != nil { - snapshot.expiry = time.Time{} + // Ignoring error and treat catsrc priority as 0 if not found. + if catsrc, _ := c.catsrcLister.CatalogSources(miss.Namespace).Get(miss.Name); catsrc != nil { + hdr.priority = catsrc.Spec.Priority } - }() - c.sem <- struct{}{} - defer func() { <-c.sem }() + hdr.m.Lock() + c.snapshots[miss] = &hdr + result.snapshots[miss] = &hdr - // Fetching default channels this way makes many round trips - // -- may need to either add a new API to fetch all at once, - // or embed the information into Bundle. - defaultChannels := make(map[string]string) - - it, err := registry.ListBundles(ctx) - if err != nil { - snapshot.logger.Errorf("failed to list bundles: %s", err.Error()) - snapshot.err = err - return + go func(ctx context.Context, hdr *snapshotHeader, source Source) { + defer hdr.m.Unlock() + c.sem <- struct{}{} + defer func() { <-c.sem }() + hdr.snapshot, hdr.err = source.Snapshot(ctx) + }(ctx, &hdr, sources[miss]) } - c.logger.WithField("catalog", snapshot.Key.String()).Debug("updating cache") - var operators []*Operator - for b := it.Next(); b != nil; b = it.Next() { - defaultChannel, ok := defaultChannels[b.PackageName] - if !ok { - if p, err := registry.GetPackage(ctx, b.PackageName); err != nil { - snapshot.logger.Warnf("failed to retrieve default channel for bundle, continuing: %v", err) - continue - } else { - defaultChannels[b.PackageName] = p.DefaultChannelName - defaultChannel = p.DefaultChannelName - } - } - o, err := NewOperatorFromBundle(b, "", snapshot.Key, defaultChannel) - if err != nil { - snapshot.logger.Warnf("failed to construct operator from bundle, continuing: %v", err) - continue - } - o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() - o.RequiredAPIs = o.RequiredAPIs.StripPlural() - o.Replaces = b.Replaces - EnsurePackageProperty(o, b.PackageName, b.Version) - operators = append(operators, o) - } - if err := it.Error(); err != nil { - snapshot.logger.Warnf("error encountered while listing bundles: %s", err.Error()) - snapshot.err = err - } - snapshot.Operators = operators -} -func EnsurePackageProperty(o *Operator, name, version string) { - for _, p := range o.Properties { - if p.Type == opregistry.PackageType { - return - } - } - prop := opregistry.PackageProperty{ - PackageName: name, - Version: version, - } - bytes, err := json.Marshal(prop) - if err != nil { - return - } - o.Properties = append(o.Properties, &api.Property{ - Type: opregistry.PackageType, - Value: string(bytes), - }) + return &result } -func (c *NamespacedOperatorCache) Catalog(k registry.CatalogKey) OperatorFinder { +func (c *NamespacedOperatorCache) Catalog(k SourceKey) OperatorFinder { // all catalogs match the empty catalog if k.Empty() { return c } - if snapshot, ok := c.Snapshots[k]; ok { + if snapshot, ok := c.snapshots[k]; ok { return snapshot } return EmptyOperatorFinder{} } -func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, p ...OperatorPredicate) []*Operator { +func (c *NamespacedOperatorCache) FindPreferred(preferred *SourceKey, preferredNamespace string, p ...OperatorPredicate) []*Operator { var result []*Operator if preferred != nil && preferred.Empty() { preferred = nil } - sorted := NewSortableSnapshots(c.existing, preferred, c.Namespaces, c.Snapshots) + sorted := newSortableSnapshots(c.existing, preferred, preferredNamespace, c.snapshots) sort.Sort(sorted) for _, snapshot := range sorted.snapshots { result = append(result, snapshot.Find(p...)...) @@ -294,65 +274,71 @@ func (c *NamespacedOperatorCache) FindPreferred(preferred *registry.CatalogKey, return result } -func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *CatalogSnapshot) MultiCatalogOperatorFinder { +func (c *NamespacedOperatorCache) WithExistingOperators(snapshot *Snapshot, namespace string) MultiCatalogOperatorFinder { + key := NewVirtualSourceKey(namespace) o := &NamespacedOperatorCache{ - Namespaces: c.Namespaces, - existing: &snapshot.Key, - Snapshots: c.Snapshots, + existing: &key, + snapshots: map[SourceKey]*snapshotHeader{ + key: { + key: key, + snapshot: snapshot, + }, + }, + } + for k, v := range c.snapshots { + o.snapshots[k] = v } - o.Snapshots[snapshot.Key] = snapshot return o } func (c *NamespacedOperatorCache) Find(p ...OperatorPredicate) []*Operator { - return c.FindPreferred(nil, p...) + return c.FindPreferred(nil, "", p...) +} + +type Snapshot struct { + Entries []*Operator } -type CatalogSnapshot struct { - logger logrus.FieldLogger - Key registry.CatalogKey - expiry time.Time - Operators []*Operator - m sync.RWMutex - pop context.CancelFunc - Priority catalogSourcePriority - err error +var _ Source = &Snapshot{} + +func (s *Snapshot) Snapshot(context.Context) (*Snapshot, error) { + return s, nil } -func (s *CatalogSnapshot) Cancel() { - s.pop() +type snapshotHeader struct { + snapshot *Snapshot + + key SourceKey + expiry time.Time + m sync.RWMutex + pop context.CancelFunc + err error + priority int } -func (s *CatalogSnapshot) Expired(at time.Time) bool { - return !at.Before(s.expiry) +func (hdr *snapshotHeader) Cancel() { + hdr.pop() } -// NewRunningOperatorSnapshot creates a CatalogSnapshot that represents a set of existing installed operators -// in the cluster. -func NewRunningOperatorSnapshot(logger logrus.FieldLogger, key registry.CatalogKey, o []*Operator) *CatalogSnapshot { - return &CatalogSnapshot{ - logger: logger, - Key: key, - Operators: o, - } +func (hdr *snapshotHeader) Valid(at time.Time) bool { + hdr.m.RLock() + defer hdr.m.RUnlock() + return hdr.snapshot != nil && hdr.err == nil && at.Before(hdr.expiry) } -type SortableSnapshots struct { - snapshots []*CatalogSnapshot - namespaces map[string]int - preferred *registry.CatalogKey - existing *registry.CatalogKey +type sortableSnapshots struct { + snapshots []*snapshotHeader + preferredNamespace string + preferred *SourceKey + existing *SourceKey } -func NewSortableSnapshots(existing, preferred *registry.CatalogKey, namespaces []string, snapshots map[registry.CatalogKey]*CatalogSnapshot) SortableSnapshots { - sorted := SortableSnapshots{ - existing: existing, - preferred: preferred, - snapshots: make([]*CatalogSnapshot, 0), - namespaces: make(map[string]int, 0), - } - for i, n := range namespaces { - sorted.namespaces[n] = i +func newSortableSnapshots(existing, preferred *SourceKey, preferredNamespace string, snapshots map[SourceKey]*snapshotHeader) sortableSnapshots { + sorted := sortableSnapshots{ + existing: existing, + preferred: preferred, + snapshots: make([]*snapshotHeader, 0), + preferredNamespace: preferredNamespace, } for _, s := range snapshots { sorted.snapshots = append(sorted.snapshots, s) @@ -360,60 +346,69 @@ func NewSortableSnapshots(existing, preferred *registry.CatalogKey, namespaces [ return sorted } -var _ sort.Interface = SortableSnapshots{} +var _ sort.Interface = sortableSnapshots{} // Len is the number of elements in the collection. -func (s SortableSnapshots) Len() int { +func (s sortableSnapshots) Len() int { return len(s.snapshots) } // Less reports whether the element with // index i should sort before the element with index j. -func (s SortableSnapshots) Less(i, j int) bool { +func (s sortableSnapshots) Less(i, j int) bool { // existing operators are preferred over catalog operators if s.existing != nil && - s.snapshots[i].Key.Name == s.existing.Name && - s.snapshots[i].Key.Namespace == s.existing.Namespace { + s.snapshots[i].key.Name == s.existing.Name && + s.snapshots[i].key.Namespace == s.existing.Namespace { return true } if s.existing != nil && - s.snapshots[j].Key.Name == s.existing.Name && - s.snapshots[j].Key.Namespace == s.existing.Namespace { + s.snapshots[j].key.Name == s.existing.Name && + s.snapshots[j].key.Namespace == s.existing.Namespace { return false } // preferred catalog is less than all other catalogs if s.preferred != nil && - s.snapshots[i].Key.Name == s.preferred.Name && - s.snapshots[i].Key.Namespace == s.preferred.Namespace { + s.snapshots[i].key.Name == s.preferred.Name && + s.snapshots[i].key.Namespace == s.preferred.Namespace { return true } if s.preferred != nil && - s.snapshots[j].Key.Name == s.preferred.Name && - s.snapshots[j].Key.Namespace == s.preferred.Namespace { + s.snapshots[j].key.Name == s.preferred.Name && + s.snapshots[j].key.Namespace == s.preferred.Namespace { return false } // the rest are sorted first on priority, namespace and then by name - if s.snapshots[i].Priority != s.snapshots[j].Priority { - return s.snapshots[i].Priority > s.snapshots[j].Priority + if s.snapshots[i].priority != s.snapshots[j].priority { + return s.snapshots[i].priority > s.snapshots[j].priority } - if s.snapshots[i].Key.Namespace != s.snapshots[j].Key.Namespace { - return s.namespaces[s.snapshots[i].Key.Namespace] < s.namespaces[s.snapshots[j].Key.Namespace] + + if s.snapshots[i].key.Namespace != s.snapshots[j].key.Namespace { + if s.snapshots[i].key.Namespace == s.preferredNamespace { + return true + } + if s.snapshots[j].key.Namespace == s.preferredNamespace { + return false + } } - return s.snapshots[i].Key.Name < s.snapshots[j].Key.Name + return s.snapshots[i].key.Name < s.snapshots[j].key.Name } // Swap swaps the elements with indexes i and j. -func (s SortableSnapshots) Swap(i, j int) { +func (s sortableSnapshots) Swap(i, j int) { s.snapshots[i], s.snapshots[j] = s.snapshots[j], s.snapshots[i] } -func (s *CatalogSnapshot) Find(p ...OperatorPredicate) []*Operator { +func (s *snapshotHeader) Find(p ...OperatorPredicate) []*Operator { s.m.RLock() defer s.m.RUnlock() - return Filter(s.Operators, p...) + if s.snapshot == nil { + return nil + } + return Filter(s.snapshot.Entries, p...) } type OperatorFinder interface { @@ -421,9 +416,9 @@ type OperatorFinder interface { } type MultiCatalogOperatorFinder interface { - Catalog(registry.CatalogKey) OperatorFinder - FindPreferred(*registry.CatalogKey, ...OperatorPredicate) []*Operator - WithExistingOperators(*CatalogSnapshot) MultiCatalogOperatorFinder + Catalog(SourceKey) OperatorFinder + FindPreferred(preferred *SourceKey, preferredNamespace string, predicates ...OperatorPredicate) []*Operator + WithExistingOperators(snapshot *Snapshot, namespace string) MultiCatalogOperatorFinder Error() error OperatorFinder } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 1df76b270d..1c43077935 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -11,7 +11,6 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -194,7 +193,7 @@ type OperatorSourceInfo struct { Package string Channel string StartingCSV string - Catalog registry.CatalogKey + Catalog SourceKey DefaultChannel bool Subscription *v1alpha1.Subscription } @@ -203,7 +202,7 @@ func (i *OperatorSourceInfo) String() string { return fmt.Sprintf("%s/%s in %s/%s", i.Package, i.Channel, i.Catalog.Name, i.Catalog.Namespace) } -var NoCatalog = registry.CatalogKey{Name: "", Namespace: ""} +var NoCatalog = SourceKey{Name: "", Namespace: ""} var ExistingOperator = OperatorSourceInfo{Package: "", Channel: "", StartingCSV: "", Catalog: NoCatalog, DefaultChannel: false} type Operator struct { @@ -219,7 +218,7 @@ type Operator struct { Properties []*api.Property } -func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey registry.CatalogKey, defaultChannel string) (*Operator, error) { +func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey SourceKey, defaultChannel string) (*Operator, error) { parsedVersion, err := semver.ParseTolerant(bundle.Version) version := &parsedVersion if err != nil { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 7e8649d5dc..292dda4805 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -7,7 +7,6 @@ import ( "github.com/blang/semver/v4" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -140,10 +139,10 @@ func (l labelPredicate) String() string { } type catalogPredicate struct { - key registry.CatalogKey + key SourceKey } -func CatalogPredicate(key registry.CatalogKey) OperatorPredicate { +func CatalogPredicate(key SourceKey) OperatorPredicate { return catalogPredicate{key: key} } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go index ba9cd602bf..695c2b07ab 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/installabletypes.go @@ -4,7 +4,6 @@ import ( "fmt" "strings" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" operatorregistry "github.com/operator-framework/operator-registry/pkg/registry" @@ -37,13 +36,13 @@ func (i *BundleInstallable) AddConstraint(c solver.Constraint) { i.constraints = append(i.constraints, c) } -func (i *BundleInstallable) BundleSourceInfo() (string, string, registry.CatalogKey, error) { +func (i *BundleInstallable) BundleSourceInfo() (string, string, cache.SourceKey, error) { info := strings.Split(i.identifier.String(), "/") // This should be enforced by Kube naming constraints if len(info) != 4 { - return "", "", registry.CatalogKey{}, fmt.Errorf("Unable to parse identifier %s for source info", i.identifier) + return "", "", cache.SourceKey{}, fmt.Errorf("Unable to parse identifier %s for source info", i.identifier) } - catalog := registry.CatalogKey{ + catalog := cache.SourceKey{ Name: info[0], Namespace: info[1], } @@ -52,7 +51,7 @@ func (i *BundleInstallable) BundleSourceInfo() (string, string, registry.Catalog return csvName, channel, catalog, nil } -func bundleId(bundle, channel string, catalog registry.CatalogKey) solver.Identifier { +func bundleId(bundle, channel string, catalog cache.SourceKey) solver.Identifier { return solver.IdentifierFromString(fmt.Sprintf("%s/%s/%s", catalog.String(), channel, bundle)) } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go index d8af9350cd..453ae4a0b8 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/instrumented_resolver.go @@ -4,8 +4,7 @@ import ( "time" "github.com/operator-framework/api/pkg/operators/v1alpha1" - - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" ) type InstrumentedResolver struct { @@ -35,6 +34,6 @@ func (ir *InstrumentedResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step return steps, lookups, subs, err } -func (ir *InstrumentedResolver) Expire(key registry.CatalogKey) { +func (ir *InstrumentedResolver) Expire(key cache.SourceKey) { ir.resolver.Expire(key) } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 06d9c10c71..38e779acd3 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -13,7 +13,6 @@ import ( "github.com/operator-framework/api/pkg/operators/v1alpha1" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/solver" @@ -30,10 +29,10 @@ type SatResolver struct { log logrus.FieldLogger } -func NewDefaultSatResolver(rcp cache.RegistryClientProvider, catsrcLister v1alpha1listers.CatalogSourceLister, log logrus.FieldLogger) *SatResolver { +func NewDefaultSatResolver(rcp cache.SourceProvider, catsrcLister v1alpha1listers.CatalogSourceLister, logger logrus.FieldLogger) *SatResolver { return &SatResolver{ - cache: cache.NewOperatorCache(rcp, log, catsrcLister), - log: log, + cache: cache.New(rcp, cache.WithLogger(logger), cache.WithCatalogSourceLister(catsrcLister)), + log: logger, } } @@ -61,9 +60,9 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust if err != nil { return nil, err } - namespacedCache := r.cache.Namespaced(namespaces...).WithExistingOperators(existingSnapshot) + namespacedCache := r.cache.Namespaced(namespaces...).WithExistingOperators(existingSnapshot, namespaces[0]) - _, existingInstallables, err := r.getBundleInstallables(registry.NewVirtualCatalogKey(namespaces[0]), existingSnapshot.Find(), namespacedCache, visited) + _, existingInstallables, err := r.getBundleInstallables(namespaces[0], cache.Filter(existingSnapshot.Entries, cache.True()), namespacedCache, visited) if err != nil { return nil, err } @@ -177,7 +176,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu var cachePredicates, channelPredicates []cache.OperatorPredicate installables := make(map[solver.Identifier]solver.Installable, 0) - catalog := registry.CatalogKey{ + catalog := cache.SourceKey{ Name: sub.Spec.CatalogSource, Namespace: sub.Spec.CatalogSourceNamespace, } @@ -259,7 +258,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu for _, o := range cache.Filter(sortedBundles, channelPredicates...) { predicates := append(cachePredicates, cache.CSVNamePredicate(o.Name)) stack := namespacedCache.Catalog(catalog).Find(predicates...) - id, installable, err := r.getBundleInstallables(catalog, stack, namespacedCache, visited) + id, installable, err := r.getBundleInstallables(sub.Namespace, stack, namespacedCache, visited) if err != nil { return nil, err } @@ -288,12 +287,12 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu // safe to remove this conflict if properties // annotations are made mandatory for // resolution. - c.AddConflict(bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + c.AddConflict(bundleId(current.Name, current.Channel(), cache.NewVirtualSourceKey(sub.GetNamespace()))) } depIds = append(depIds, c.Identifier()) } if current != nil { - depIds = append(depIds, bundleId(current.Name, current.Channel(), registry.NewVirtualCatalogKey(sub.GetNamespace()))) + depIds = append(depIds, bundleId(current.Name, current.Channel(), cache.NewVirtualSourceKey(sub.GetNamespace()))) } // all candidates added as options for this constraint @@ -303,7 +302,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu return installables, nil } -func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { +func (r *SatResolver) getBundleInstallables(preferredNamespace string, bundleStack []*cache.Operator, namespacedCache cache.MultiCatalogOperatorFinder, visited map[*cache.Operator]*BundleInstallable) (map[solver.Identifier]struct{}, map[solver.Identifier]*BundleInstallable, error) { errs := make([]error, 0) installables := make(map[solver.Identifier]*BundleInstallable, 0) // all installables, including dependencies @@ -370,7 +369,8 @@ func (r *SatResolver) getBundleInstallables(catalog registry.CatalogKey, bundleS )) } } - sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, sourcePredicate)) + + sortedBundles, err := r.sortBundles(namespacedCache.FindPreferred(&bundle.SourceInfo.Catalog, preferredNamespace, sourcePredicate)) if err != nil { errs = append(errs, err) continue @@ -422,7 +422,7 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs // package against catalog contents, updates to the // Subscription spec could result in a bad package // inference. - for _, entry := range r.cache.Namespaced(sub.Namespace).Catalog(registry.CatalogKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { + for _, entry := range r.cache.Namespaced(sub.Spec.CatalogSourceNamespace).Catalog(cache.SourceKey{Namespace: sub.Spec.CatalogSourceNamespace, Name: sub.Spec.CatalogSource}).Find(cache.And(cache.CSVNamePredicate(csv.Name), cache.PkgPredicate(sub.Spec.Package))) { if pkg := entry.Package(); pkg != "" { packages[pkg] = struct{}{} } @@ -455,8 +455,8 @@ func (r *SatResolver) inferProperties(csv *v1alpha1.ClusterServiceVersion, subs return properties, nil } -func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.CatalogSnapshot, error) { - existingOperatorCatalog := registry.NewVirtualCatalogKey(namespace) +func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1.Subscription, csvs []*v1alpha1.ClusterServiceVersion) (*cache.Snapshot, error) { + existingOperatorCatalog := cache.NewVirtualSourceKey(namespace) // build a catalog snapshot of CSVs without subscriptions csvSubscriptions := make(map[*v1alpha1.ClusterServiceVersion]*v1alpha1.Subscription) for _, sub := range subs { @@ -517,7 +517,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 r.log.Infof("considered csvs without properties annotation during resolution: %v", names) } - return cache.NewRunningOperatorSnapshot(r.log, existingOperatorCatalog, standaloneOperators), nil + return &cache.Snapshot{Entries: standaloneOperators}, nil } func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFinder, installables map[solver.Identifier]solver.Installable) { @@ -579,17 +579,17 @@ func (r *SatResolver) addInvariants(namespacedCache cache.MultiCatalogOperatorFi func (r *SatResolver) sortBundles(bundles []*cache.Operator) ([]*cache.Operator, error) { // assume bundles have been passed in sorted by catalog already - catalogOrder := make([]registry.CatalogKey, 0) + catalogOrder := make([]cache.SourceKey, 0) type PackageChannel struct { Package, Channel string DefaultChannel bool } // TODO: for now channels will be sorted lexicographically - channelOrder := make(map[registry.CatalogKey][]PackageChannel) + channelOrder := make(map[cache.SourceKey][]PackageChannel) // partition by catalog -> channel -> bundle - partitionedBundles := map[registry.CatalogKey]map[PackageChannel][]*cache.Operator{} + partitionedBundles := map[cache.SourceKey]map[PackageChannel][]*cache.Operator{} for _, b := range bundles { pc := PackageChannel{ Package: b.Package(), diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go new file mode 100644 index 0000000000..6c5c11998d --- /dev/null +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go @@ -0,0 +1,109 @@ +package resolver + +import ( + "context" + "encoding/json" + "fmt" + + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" + "github.com/operator-framework/operator-registry/pkg/api" + "github.com/operator-framework/operator-registry/pkg/client" + opregistry "github.com/operator-framework/operator-registry/pkg/registry" + "github.com/sirupsen/logrus" +) + +type RegistryClientProvider interface { + ClientsForNamespaces(namespaces ...string) map[registry.CatalogKey]client.Interface +} + +type registryClientAdapter struct { + rcp RegistryClientProvider + logger logrus.StdLogger +} + +func SourceProviderFromRegistryClientProvider(rcp RegistryClientProvider, logger logrus.StdLogger) cache.SourceProvider { + return ®istryClientAdapter{ + rcp: rcp, + logger: logger, + } +} + +type registrySource struct { + key cache.SourceKey + client client.Interface + logger logrus.StdLogger +} + +func (s *registrySource) Snapshot(ctx context.Context) (*cache.Snapshot, error) { + // Fetching default channels this way makes many round trips + // -- may need to either add a new API to fetch all at once, + // or embed the information into Bundle. + defaultChannels := make(map[string]string) + + it, err := s.client.ListBundles(ctx) + if err != nil { + return nil, fmt.Errorf("failed to list bundles: %w", err) + } + + var operators []*cache.Operator + for b := it.Next(); b != nil; b = it.Next() { + defaultChannel, ok := defaultChannels[b.PackageName] + if !ok { + if p, err := s.client.GetPackage(ctx, b.PackageName); err != nil { + s.logger.Printf("failed to retrieve default channel for bundle, continuing: %v", err) + continue + } else { + defaultChannels[b.PackageName] = p.DefaultChannelName + defaultChannel = p.DefaultChannelName + } + } + o, err := cache.NewOperatorFromBundle(b, "", s.key, defaultChannel) + if err != nil { + s.logger.Printf("failed to construct operator from bundle, continuing: %v", err) + continue + } + o.ProvidedAPIs = o.ProvidedAPIs.StripPlural() + o.RequiredAPIs = o.RequiredAPIs.StripPlural() + o.Replaces = b.Replaces + EnsurePackageProperty(o, b.PackageName, b.Version) + operators = append(operators, o) + } + if err := it.Error(); err != nil { + return nil, fmt.Errorf("error encountered while listing bundles: %w", err) + } + + return &cache.Snapshot{Entries: operators}, nil +} + +func (a *registryClientAdapter) Sources(namespaces ...string) map[cache.SourceKey]cache.Source { + result := make(map[cache.SourceKey]cache.Source) + for key, client := range a.rcp.ClientsForNamespaces(namespaces...) { + result[cache.SourceKey(key)] = ®istrySource{ + key: cache.SourceKey(key), + client: client, + logger: a.logger, + } + } + return result +} + +func EnsurePackageProperty(o *cache.Operator, name, version string) { + for _, p := range o.Properties { + if p.Type == opregistry.PackageType { + return + } + } + prop := opregistry.PackageProperty{ + PackageName: name, + Version: version, + } + bytes, err := json.Marshal(prop) + if err != nil { + return + } + o.Properties = append(o.Properties, &api.Property{ + Type: opregistry.PackageType, + Value: string(bytes), + }) +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index a696dfd657..7574dda57c 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -17,7 +17,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/clientset/versioned" v1alpha1listers "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" controllerbundle "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/bundle" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/projection" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/operatorlister" @@ -31,7 +30,7 @@ var timeNow = func() metav1.Time { return metav1.NewTime(time.Now().UTC()) } type StepResolver interface { ResolveSteps(namespace string) ([]*v1alpha1.Step, []v1alpha1.BundleLookup, []*v1alpha1.Subscription, error) - Expire(key registry.CatalogKey) + Expire(key cache.SourceKey) } type OperatorStepResolver struct { @@ -48,7 +47,7 @@ type OperatorStepResolver struct { var _ StepResolver = &OperatorStepResolver{} func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versioned.Interface, kubeclient kubernetes.Interface, - globalCatalogNamespace string, provider cache.RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { + globalCatalogNamespace string, provider RegistryClientProvider, log logrus.FieldLogger) *OperatorStepResolver { return &OperatorStepResolver{ subLister: lister.OperatorsV1alpha1().SubscriptionLister(), csvLister: lister.OperatorsV1alpha1().ClusterServiceVersionLister(), @@ -56,12 +55,12 @@ func NewOperatorStepResolver(lister operatorlister.OperatorLister, client versio client: client, kubeclient: kubeclient, globalCatalogNamespace: globalCatalogNamespace, - satResolver: NewDefaultSatResolver(cache.NewDefaultRegistryClientProvider(log, provider), lister.OperatorsV1alpha1().CatalogSourceLister(), log), + satResolver: NewDefaultSatResolver(SourceProviderFromRegistryClientProvider(provider, log), lister.OperatorsV1alpha1().CatalogSourceLister(), log), log: log, } } -func (r *OperatorStepResolver) Expire(key registry.CatalogKey) { +func (r *OperatorStepResolver) Expire(key cache.SourceKey) { r.satResolver.cache.Expire(key) } @@ -109,7 +108,7 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, if sub.Spec.Channel != "" && sub.Spec.Channel != sourceInfo.Channel { continue } - subCatalogKey := registry.CatalogKey{ + subCatalogKey := cache.SourceKey{ Name: sub.Spec.CatalogSource, Namespace: sub.Spec.CatalogSourceNamespace, } From f2654b811e5b15515c7cc86c7441ae3013543148 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Thu, 2 Sep 2021 13:07:43 -0400 Subject: [PATCH 32/45] Remove unneeded replace pin for sigs.k8s.io/structured-merge-diff (#2338) Update the root go.mod and remove the replace pin for sigs.k8s.io/structured-merge-diff. It looks like the "// pinned because no tag supports 1.18 yet" message may have also been an artifact of removing the helm replace pin that was previously in place. Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 3eb0d7be413d7c185441cb3fc81dadb2b67706e7 --- staging/operator-lifecycle-manager/go.mod | 3 --- 1 file changed, 3 deletions(-) diff --git a/staging/operator-lifecycle-manager/go.mod b/staging/operator-lifecycle-manager/go.mod index c96c72b6f9..39d01b89ca 100644 --- a/staging/operator-lifecycle-manager/go.mod +++ b/staging/operator-lifecycle-manager/go.mod @@ -64,7 +64,4 @@ replace ( // Patch for a race condition involving metadata-only // informers until it can be resolved upstream: sigs.k8s.io/controller-runtime v0.9.2 => github.com/benluddy/controller-runtime v0.9.3-0.20210720171926-9bcb99bd9bd3 - - // pinned because no tag supports 1.18 yet - sigs.k8s.io/structured-merge-diff => sigs.k8s.io/structured-merge-diff v1.0.1-0.20191108220359-b1b620dd3f06 ) From 0f30a193876f5fc28b6b12717e3b9b1fcee7531b Mon Sep 17 00:00:00 2001 From: Ish Shah Date: Thu, 2 Sep 2021 10:18:44 -0700 Subject: [PATCH 33/45] Add Timestamp to Scorecard Test Results (#137) * add timestamp field Signed-off-by: Ish Shah * Add timestamp to scorecard test result Signed-off-by: Ish Shah * Change type and struct Signed-off-by: Ish Shah * Update pkg/apis/scorecard/v1alpha3/test_types.go Co-authored-by: Joe Lanford * make manifests/generate; Signed-off-by: Ish Shah * Update pkg/apis/scorecard/v1alpha3/test_types.go Co-authored-by: Joe Lanford Co-authored-by: Joe Lanford Upstream-repository: api Upstream-commit: 7d591fff8bd551160e51dedef17debbe52145019 --- staging/api/pkg/apis/scorecard/v1alpha3/test_types.go | 2 ++ .../api/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go | 1 + 2 files changed, 3 insertions(+) diff --git a/staging/api/pkg/apis/scorecard/v1alpha3/test_types.go b/staging/api/pkg/apis/scorecard/v1alpha3/test_types.go index cba7d3a58c..52678524d2 100644 --- a/staging/api/pkg/apis/scorecard/v1alpha3/test_types.go +++ b/staging/api/pkg/apis/scorecard/v1alpha3/test_types.go @@ -28,6 +28,8 @@ type TestResult struct { Errors []string `json:"errors,omitempty"` // Suggestions is a list of suggestions for the user to improve their score (if applicable) Suggestions []string `json:"suggestions,omitempty"` + // CreationTimestamp of the result from an individual test + CreationTimestamp metav1.Time `json:"creationTimestamp,omitempty"` } // TestStatus contains collection of testResults. diff --git a/staging/api/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go b/staging/api/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go index 8f4e5aad6a..3f60a88ba3 100644 --- a/staging/api/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go +++ b/staging/api/pkg/apis/scorecard/v1alpha3/zz_generated.deepcopy.go @@ -207,6 +207,7 @@ func (in *TestResult) DeepCopyInto(out *TestResult) { *out = make([]string, len(*in)) copy(*out, *in) } + in.CreationTimestamp.DeepCopyInto(&out.CreationTimestamp) } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TestResult. From a4c39afa2b47ed33909d33dc8fefc2ca66792ace Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Fri, 3 Sep 2021 16:38:54 +0200 Subject: [PATCH 34/45] Add validation for Kind and APIVersion (#152) * Add validation for Kind and APIVersion Signed-off-by: Josef Karasek * Update pkg/validation/internal/csv.go Co-authored-by: Eric Stroczynski Co-authored-by: Eric Stroczynski Upstream-repository: api Upstream-commit: c9b1e7ef82b8081a3eb52c48d0ca9039f2e3a27e --- staging/api/pkg/validation/internal/csv.go | 14 ++++++++++++++ .../api/pkg/validation/internal/csv.go | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/staging/api/pkg/validation/internal/csv.go b/staging/api/pkg/validation/internal/csv.go index 8da328f7ff..ea7145d078 100644 --- a/staging/api/pkg/validation/internal/csv.go +++ b/staging/api/pkg/validation/internal/csv.go @@ -48,6 +48,8 @@ func validateCSV(csv *v1alpha1.ClusterServiceVersion) errors.ManifestResult { result.Add(checkFields(*csv)...) // validate case sensitive annotation names result.Add(ValidateAnnotationNames(csv.GetAnnotations(), csv.GetName())...) + // validate Version and Kind + result.Add(validateVersionKind(csv)...) return result } @@ -194,3 +196,15 @@ func validateInstallModes(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Er } return errs } + +// validateVersionKind checks presence of GroupVersionKind.Version and GroupVersionKind.Kind +func validateVersionKind(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Error) { + gvk := csv.GroupVersionKind() + if gvk.Version == "" { + errs = append(errs, errors.ErrInvalidCSV("'apiVersion' is missing", csv.GetName())) + } + if gvk.Kind == "" { + errs = append(errs, errors.ErrInvalidCSV("'kind' is missing", csv.GetName())) + } + return +} 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 8da328f7ff..ea7145d078 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 @@ -48,6 +48,8 @@ func validateCSV(csv *v1alpha1.ClusterServiceVersion) errors.ManifestResult { result.Add(checkFields(*csv)...) // validate case sensitive annotation names result.Add(ValidateAnnotationNames(csv.GetAnnotations(), csv.GetName())...) + // validate Version and Kind + result.Add(validateVersionKind(csv)...) return result } @@ -194,3 +196,15 @@ func validateInstallModes(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Er } return errs } + +// validateVersionKind checks presence of GroupVersionKind.Version and GroupVersionKind.Kind +func validateVersionKind(csv *v1alpha1.ClusterServiceVersion) (errs []errors.Error) { + gvk := csv.GroupVersionKind() + if gvk.Version == "" { + errs = append(errs, errors.ErrInvalidCSV("'apiVersion' is missing", csv.GetName())) + } + if gvk.Kind == "" { + errs = append(errs, errors.ErrInvalidCSV("'kind' is missing", csv.GetName())) + } + return +} From ef5ec282d07be088e9a9d61aab4e3ee0cd2f092e Mon Sep 17 00:00:00 2001 From: Josef Karasek Date: Fri, 3 Sep 2021 17:20:55 +0200 Subject: [PATCH 35/45] Emit CSV metric on startup (#2216) Signed-off-by: Josef Karasek Upstream-repository: operator-lifecycle-manager Upstream-commit: de4bebe06ba076f804d28c594d7dc52dfd95ef20 --- .../cmd/olm/main.go | 5 ++ .../pkg/controller/operators/olm/operator.go | 17 ++++ .../test/e2e/metrics_e2e_test.go | 84 +++++++++++++++++++ .../cmd/olm/main.go | 5 ++ .../pkg/controller/operators/olm/operator.go | 17 ++++ 5 files changed, 128 insertions(+) diff --git a/staging/operator-lifecycle-manager/cmd/olm/main.go b/staging/operator-lifecycle-manager/cmd/olm/main.go index f9bec9f689..72e2a4b429 100644 --- a/staging/operator-lifecycle-manager/cmd/olm/main.go +++ b/staging/operator-lifecycle-manager/cmd/olm/main.go @@ -171,6 +171,11 @@ func main() { op.Run(ctx) <-op.Ready() + // Emit CSV metric + if err = op.EnsureCSVMetric(); err != nil { + logger.WithError(err).Fatalf("error emitting metrics for existing CSV") + } + if *writeStatusName != "" { reconciler, err := openshift.NewClusterOperatorReconciler( openshift.WithClient(mgr.GetClient()), diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index 39018ee376..b2e6e80662 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -655,6 +655,23 @@ func (a *Operator) RegisterCSVWatchNotification(csvNotification csvutility.Watch a.csvNotification = csvNotification } +func (a *Operator) EnsureCSVMetric() error { + csvs, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().List(labels.Everything()) + if err != nil { + return err + } + for _, csv := range csvs { + logger := a.logger.WithFields(logrus.Fields{ + "name": csv.GetName(), + "namespace": csv.GetNamespace(), + "self": csv.GetSelfLink(), + }) + logger.Debug("emitting metrics for existing CSV") + metrics.EmitCSVMetric(csv, csv) + } + return nil +} + func (a *Operator) syncGCObject(obj interface{}) (syncError error) { metaObj, ok := obj.(metav1.Object) if !ok { diff --git a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go index 56cef82d3e..2769091e3a 100644 --- a/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go +++ b/staging/operator-lifecycle-manager/test/e2e/metrics_e2e_test.go @@ -16,6 +16,7 @@ import ( . "github.com/onsi/gomega" io_prometheus_client "github.com/prometheus/client_model/go" "github.com/prometheus/common/expfmt" + appsv1 "k8s.io/api/apps/v1" corev1 "k8s.io/api/core/v1" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -116,6 +117,44 @@ var _ = Describe("Metrics are generated for OLM managed resources", func() { }) }) }) + + When("a CSV is created", func() { + var ( + cleanupCSV cleanupFunc + csv v1alpha1.ClusterServiceVersion + ) + BeforeEach(func() { + packageName := genName("csv-test-") + packageStable := fmt.Sprintf("%s-stable", packageName) + csv = newCSV(packageStable, testNamespace, "", semver.MustParse("0.1.0"), nil, nil, nil) + + var err error + _, err = createCSV(c, crc, csv, testNamespace, false, false) + Expect(err).ToNot(HaveOccurred()) + _, err = fetchCSV(crc, csv.Name, testNamespace, csvSucceededChecker) + Expect(err).ToNot(HaveOccurred()) + }) + AfterEach(func() { + if cleanupCSV != nil { + cleanupCSV() + } + }) + It("emits a CSV metrics", func() { + Expect(getMetricsFromPod(c, getPodWithLabel(c, "app=olm-operator"))).To( + ContainElement(LikeMetric(WithFamily("csv_succeeded"), WithName(csv.Name), WithValue(1))), + ) + }) + When("the OLM pod restarts", func() { + BeforeEach(func() { + restartDeploymentWithLabel(c, "app=olm-operator") + }) + It("CSV metric is preserved", func() { + Expect(getMetricsFromPod(c, getPodWithLabel(c, "app=olm-operator"))).To( + ContainElement(LikeMetric(WithFamily("csv_succeeded"), WithName(csv.Name), WithValue(1))), + ) + }) + }) + }) }) Context("Metrics emitted by objects during operator installation", func() { @@ -396,6 +435,51 @@ func getPodWithLabel(client operatorclient.ClientInterface, label string) *corev return &podList.Items[0] } +func getDeploymentWithLabel(client operatorclient.ClientInterface, label string) *appsv1.Deployment { + listOptions := metav1.ListOptions{LabelSelector: label} + var deploymentList *appsv1.DeploymentList + EventuallyWithOffset(1, func() (numDeps int, err error) { + deploymentList, err = client.KubernetesInterface().AppsV1().Deployments(operatorNamespace).List(context.TODO(), listOptions) + if deploymentList != nil { + numDeps = len(deploymentList.Items) + } + + return + }).Should(Equal(1), "expected exactly one Deployment") + + return &deploymentList.Items[0] +} + +func restartDeploymentWithLabel(client operatorclient.ClientInterface, l string) { + d := getDeploymentWithLabel(client, l) + z := int32(0) + oldZ := *d.Spec.Replicas + d.Spec.Replicas = &z + _, err := client.KubernetesInterface().AppsV1().Deployments(operatorNamespace).Update(context.TODO(), d, metav1.UpdateOptions{}) + Expect(err).ToNot(HaveOccurred()) + + EventuallyWithOffset(1, func() (replicas int32, err error) { + deployment, err := client.KubernetesInterface().AppsV1().Deployments(operatorNamespace).Get(context.TODO(), d.Name, metav1.GetOptions{}) + if deployment != nil { + replicas = deployment.Status.Replicas + } + return + }).Should(Equal(int32(0)), "expected exactly 0 Deployments") + + updated := getDeploymentWithLabel(client, l) + updated.Spec.Replicas = &oldZ + _, err = client.KubernetesInterface().AppsV1().Deployments(operatorNamespace).Update(context.TODO(), updated, metav1.UpdateOptions{}) + Expect(err).ToNot(HaveOccurred()) + + EventuallyWithOffset(1, func() (replicas int32, err error) { + deployment, err := client.KubernetesInterface().AppsV1().Deployments(operatorNamespace).Get(context.TODO(), d.Name, metav1.GetOptions{}) + if deployment != nil { + replicas = deployment.Status.Replicas + } + return + }).Should(Equal(oldZ), "expected exactly 1 Deployment") +} + func extractMetricPortFromPod(pod *corev1.Pod) string { for _, container := range pod.Spec.Containers { for _, port := range container.Ports { diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go index f9bec9f689..72e2a4b429 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/cmd/olm/main.go @@ -171,6 +171,11 @@ func main() { op.Run(ctx) <-op.Ready() + // Emit CSV metric + if err = op.EnsureCSVMetric(); err != nil { + logger.WithError(err).Fatalf("error emitting metrics for existing CSV") + } + if *writeStatusName != "" { reconciler, err := openshift.NewClusterOperatorReconciler( openshift.WithClient(mgr.GetClient()), diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index 39018ee376..b2e6e80662 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -655,6 +655,23 @@ func (a *Operator) RegisterCSVWatchNotification(csvNotification csvutility.Watch a.csvNotification = csvNotification } +func (a *Operator) EnsureCSVMetric() error { + csvs, err := a.lister.OperatorsV1alpha1().ClusterServiceVersionLister().List(labels.Everything()) + if err != nil { + return err + } + for _, csv := range csvs { + logger := a.logger.WithFields(logrus.Fields{ + "name": csv.GetName(), + "namespace": csv.GetNamespace(), + "self": csv.GetSelfLink(), + }) + logger.Debug("emitting metrics for existing CSV") + metrics.EmitCSVMetric(csv, csv) + } + return nil +} + func (a *Operator) syncGCObject(obj interface{}) (syncError error) { metaObj, ok := obj.(metav1.Object) if !ok { From d9c8bd6133c0affbfe361a3314e4986c71c6e0b5 Mon Sep 17 00:00:00 2001 From: Ben Luddy Date: Tue, 7 Sep 2021 13:37:23 -0400 Subject: [PATCH 36/45] Remove hardcoded references to the registry gRPC API from the resolver packages. (#2340) * Stop using the registry's Bundle proto type for resolution. The resolver component does not care whether a given cache entry was populated by use of the registry gRPC API, so it should ultimately be possible to drop the "Bundle" field from cache entries altogether. For now, catalog-operator's "step resolver" still depends on a Bundle proto field in order to unpack inline (as opposed to image-based) packages. Signed-off-by: Ben Luddy * Remove exported resolver cache entry creation funcs. NewOperatorForBundle and NewOperatorFromV1Alpha1CSV couple the resolver cache package to the registry gRPC API and the operators/v1alpha1 CSV API, respectively. They're effectively used only by the resolver package, so they can be moved there and unexported. The remaining calls to NewOperatorFromV1Alpha1CSV can be extracted from core resolver logic into a Source implementation that is responsible for the conversion from ClusterServiceVersion to cache.Snapshot entry, and the remaining call to NewOperatorFromBundle is used only by the Source implementation based on the registry gRPC API. Signed-off-by: Ben Luddy Upstream-repository: operator-lifecycle-manager Upstream-commit: b849eb79c6fbb1c445ed3e9945e1668f6066ea6e --- .../pkg/controller/operators/olm/labeler.go | 47 +- .../controller/operators/olm/labeler_test.go | 11 +- .../pkg/controller/operators/olm/operator.go | 5 +- .../controller/operators/olm/operatorgroup.go | 8 +- .../registry/resolver/cache/cache_test.go | 25 - .../registry/resolver/cache/operators.go | 355 +--------- .../registry/resolver/cache/operators_test.go | 610 ------------------ .../registry/resolver/cache/predicates.go | 67 +- .../controller/registry/resolver/resolver.go | 203 +++++- .../registry/resolver/resolver_test.go | 345 ++++++++-- .../registry/resolver/source_registry.go | 132 +++- .../registry/resolver/source_registry_test.go | 394 +++++++++++ .../registry/resolver/step_resolver.go | 90 ++- .../registry/resolver/step_resolver_test.go | 4 +- .../controller/registry/resolver/util_test.go | 114 +++- .../pkg/controller/operators/olm/labeler.go | 47 +- .../pkg/controller/operators/olm/operator.go | 5 +- .../controller/operators/olm/operatorgroup.go | 8 +- .../registry/resolver/cache/operators.go | 355 +--------- .../registry/resolver/cache/predicates.go | 67 +- .../controller/registry/resolver/resolver.go | 203 +++++- .../registry/resolver/source_registry.go | 132 +++- .../registry/resolver/step_resolver.go | 90 ++- 23 files changed, 1645 insertions(+), 1672 deletions(-) create mode 100644 staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry_test.go diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go index c0d003da5c..77d16234a8 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go @@ -1,8 +1,13 @@ package olm import ( + "fmt" + "strings" + + "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" + opregistry "github.com/operator-framework/operator-registry/pkg/registry" extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" @@ -13,9 +18,41 @@ const ( APILabelKeyPrefix = "olm.api." ) -type operatorSurface interface { - GetProvidedAPIs() cache.APISet - GetRequiredAPIs() cache.APISet +type operatorSurface struct { + ProvidedAPIs cache.APISet + RequiredAPIs cache.APISet +} + +func apiSurfaceOfCSV(csv *v1alpha1.ClusterServiceVersion) (*operatorSurface, error) { + surface := operatorSurface{ + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + } + + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + surface.ProvidedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Owned { + surface.ProvidedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + requiredAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Required { + requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + return &surface, nil } // LabelSetsFor returns API label sets for the given object. @@ -35,14 +72,14 @@ func LabelSetsFor(obj interface{}) ([]labels.Set, error) { func labelSetsForOperatorSurface(surface operatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} - for key := range surface.GetProvidedAPIs().StripPlural() { + for key := range surface.ProvidedAPIs.StripPlural() { hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } labelSet[APILabelKeyPrefix+hash] = "provided" } - for key := range surface.GetRequiredAPIs().StripPlural() { + for key := range surface.RequiredAPIs.StripPlural() { hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go index ca3722e034..d662a90cae 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/labeler_test.go @@ -3,7 +3,6 @@ package olm import ( "testing" - "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" opregistry "github.com/operator-framework/operator-registry/pkg/registry" "github.com/stretchr/testify/require" "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" @@ -63,9 +62,9 @@ func TestLabelSetsFor(t *testing.T) { }, { name: "OperatorSurface/Provided", - obj: &cache.Operator{ + obj: operatorSurface{ ProvidedAPIs: map[opregistry.APIKey]struct{}{ - opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, + {Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, }, }, expected: []labels.Set{ @@ -76,12 +75,12 @@ func TestLabelSetsFor(t *testing.T) { }, { name: "OperatorSurface/ProvidedAndRequired", - obj: &cache.Operator{ + obj: operatorSurface{ ProvidedAPIs: map[opregistry.APIKey]struct{}{ - opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, + {Group: "ghouls", Version: "v1alpha1", Kind: "Ghost", Plural: "Ghosts"}: {}, }, RequiredAPIs: map[opregistry.APIKey]struct{}{ - opregistry.APIKey{Group: "ghouls", Version: "v1alpha1", Kind: "Goblin", Plural: "Goblins"}: {}, + {Group: "ghouls", Version: "v1alpha1", Kind: "Goblin", Plural: "Goblins"}: {}, }, }, expected: []labels.Set{ diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index b2e6e80662..0e9ef969d2 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -37,7 +37,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" - resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/event" @@ -1381,7 +1380,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v out = in.DeepCopy() now := a.now() - operatorSurface, err := resolvercache.NewOperatorFromV1Alpha1CSV(out) + operatorSurface, err := apiSurfaceOfCSV(out) if err != nil { // If the resolver is unable to retrieve the operator info from the CSV the CSV requires changes, a syncError should not be returned. logger.WithError(err).Warn("Unable to retrieve operator information from CSV") @@ -1445,7 +1444,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v groupSurface := NewOperatorGroup(operatorGroup) otherGroupSurfaces := NewOperatorGroupSurfaces(otherGroups...) - providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() + providedAPIs := operatorSurface.ProvidedAPIs.StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { case operatorGroup.Spec.StaticProvidedAPIs && (result == AddAPIs || result == RemoveAPIs): diff --git a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index 8a2871a312..0bc563d020 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/staging/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -309,12 +309,12 @@ func (a *Operator) providedAPIsFromCSVs(group *v1.OperatorGroup, logger *logrus. // TODO: Throw out CSVs that aren't members of the group due to group related failures? // Union the providedAPIsFromCSVs from existing members of the group - operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := apiSurfaceOfCSV(csv) if err != nil { logger.WithError(err).Warn("could not create OperatorSurface from csv") continue } - for providedAPI := range operatorSurface.GetProvidedAPIs().StripPlural() { + for providedAPI := range operatorSurface.ProvidedAPIs.StripPlural() { providedAPIsFromCSVs[providedAPI] = csv } } @@ -1051,12 +1051,12 @@ func (a *Operator) findCSVsThatProvideAnyOf(provide cache.APISet) ([]*v1alpha1.C continue } - operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := apiSurfaceOfCSV(csv) if err != nil { continue } - if len(operatorSurface.GetProvidedAPIs().StripPlural().Intersection(provide)) > 0 { + if len(operatorSurface.ProvidedAPIs.StripPlural().Intersection(provide)) > 0 { providers = append(providers, csv) } } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go index f095456456..b5471a2f2f 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/cache_test.go @@ -11,8 +11,6 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - - "github.com/operator-framework/operator-registry/pkg/api" ) func TestOperatorCacheConcurrency(t *testing.T) { @@ -240,29 +238,6 @@ func TestCatalogSnapshotFind(t *testing.T) { } -func TestStripPluralRequiredAndProvidedAPIKeys(t *testing.T) { - key := SourceKey{Namespace: "testnamespace", Name: "testname"} - o, err := NewOperatorFromBundle(&api.Bundle{ - CsvName: fmt.Sprintf("%s/%s", key.Namespace, key.Name), - ProvidedApis: []*api.GroupVersionKind{{ - Group: "g", - Version: "v1", - Kind: "K", - Plural: "ks", - }}, - RequiredApis: []*api.GroupVersionKind{{ - Group: "g2", - Version: "v2", - Kind: "K2", - Plural: "ks2", - }}, - }, "", key, "") - - assert.NoError(t, err) - assert.Equal(t, "K.v1.g", o.ProvidedAPIs.String()) - assert.Equal(t, "K2.v2.g2", o.RequiredAPIs.String()) -} - type ErrorSource struct { Error error } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 1c43077935..ae71784b45 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -1,7 +1,6 @@ package cache import ( - "encoding/json" "fmt" "hash/fnv" "sort" @@ -213,361 +212,27 @@ type Operator struct { ProvidedAPIs APISet RequiredAPIs APISet Version *semver.Version - Bundle *api.Bundle SourceInfo *OperatorSourceInfo Properties []*api.Property -} - -func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey SourceKey, defaultChannel string) (*Operator, error) { - parsedVersion, err := semver.ParseTolerant(bundle.Version) - version := &parsedVersion - if err != nil { - version = nil - } - provided := APISet{} - for _, gvk := range bundle.ProvidedApis { - provided[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} - } - required := APISet{} - for _, gvk := range bundle.RequiredApis { - required[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} - } - sourceInfo := &OperatorSourceInfo{ - Package: bundle.PackageName, - Channel: bundle.ChannelName, - StartingCSV: startingCSV, - Catalog: sourceKey, - } - sourceInfo.DefaultChannel = sourceInfo.Channel == defaultChannel - - // legacy support - if the api doesn't contain properties/dependencies, build them from required/provided apis - properties := bundle.Properties - if len(properties) == 0 { - properties, err = providedAPIsToProperties(provided) - if err != nil { - return nil, err - } - } - if len(bundle.Dependencies) > 0 { - ps, err := LegacyDependenciesToProperties(bundle.Dependencies) - if err != nil { - return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) - } - properties = append(properties, ps...) - } else { - ps, err := RequiredAPIsToProperties(required) - if err != nil { - return nil, err - } - properties = append(properties, ps...) - } - - o := &Operator{ - Name: bundle.CsvName, - Replaces: bundle.Replaces, - Version: version, - ProvidedAPIs: provided, - RequiredAPIs: required, - Bundle: bundle, - SourceInfo: sourceInfo, - Properties: properties, - Skips: bundle.Skips, - } + BundlePath string - if r, err := semver.ParseRange(o.Bundle.SkipRange); err == nil { - o.SkipRange = r - } - - if !o.Inline() { - // TODO: Extract any necessary information from the Bundle - // up-front and remove the bundle field altogether. For now, - // take the easy opportunity to save heap space by discarding - // two of the worst offenders. - bundle.CsvJson = "" - bundle.Object = nil - } - - return o, nil -} - -func NewOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*Operator, error) { - providedAPIs := EmptyAPISet() - for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { - parts := strings.SplitN(crdDef.Name, ".", 2) - if len(parts) < 2 { - return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) - } - providedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} - } - for _, api := range csv.Spec.APIServiceDefinitions.Owned { - providedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} - } - - requiredAPIs := EmptyAPISet() - for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { - parts := strings.SplitN(crdDef.Name, ".", 2) - if len(parts) < 2 { - return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) - } - requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} - } - for _, api := range csv.Spec.APIServiceDefinitions.Required { - requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} - } - - properties, err := providedAPIsToProperties(providedAPIs) - if err != nil { - return nil, err - } - dependencies, err := RequiredAPIsToProperties(requiredAPIs) - if err != nil { - return nil, err - } - properties = append(properties, dependencies...) - - return &Operator{ - Name: csv.GetName(), - Version: &csv.Spec.Version.Version, - ProvidedAPIs: providedAPIs, - RequiredAPIs: requiredAPIs, - SourceInfo: &ExistingOperator, - Properties: properties, - }, nil -} - -func (o *Operator) GetProvidedAPIs() APISet { - return o.ProvidedAPIs -} - -func (o *Operator) GetRequiredAPIs() APISet { - return o.RequiredAPIs + // Present exclusively to pipe inlined bundle + // content. Resolver components shouldn't need to read this, + // and it should eventually be possible to remove the field + // altogether. + Bundle *api.Bundle } func (o *Operator) Package() string { - if o.Bundle != nil { - return o.Bundle.PackageName + if si := o.SourceInfo; si != nil { + return si.Package } return "" } func (o *Operator) Channel() string { - if o.Bundle != nil { - return o.Bundle.ChannelName + if si := o.SourceInfo; si != nil { + return si.Channel } return "" } - -func (o *Operator) Inline() bool { - return o.Bundle != nil && o.Bundle.GetBundlePath() == "" -} - -func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { - predicates = make([]OperatorPredicate, 0) - for _, property := range o.Properties { - predicate, err := PredicateForProperty(property) - if err != nil { - return nil, err - } - if predicate == nil { - continue - } - predicates = append(predicates, predicate) - } - return -} - -func RequiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { - if len(apis) == 0 { - return - } - out = make([]*api.Property, 0) - for a := range apis { - val, err := json.Marshal(struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - }{ - Group: a.Group, - Version: a.Version, - Kind: a.Kind, - }) - if err != nil { - return nil, err - } - out = append(out, &api.Property{ - Type: "olm.gvk.required", - Value: string(val), - }) - } - if len(out) > 0 { - return - } - return nil, nil -} - -func providedAPIsToProperties(apis APISet) (out []*api.Property, err error) { - out = make([]*api.Property, 0) - for a := range apis { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Version: a.Version, - Kind: a.Kind, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if len(out) > 0 { - return - } - return nil, nil -} - -func LegacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { - var result []*api.Property - for _, dependency := range dependencies { - switch dependency.Type { - case "olm.gvk": - type gvk struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - } - var vfrom gvk - if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { - return nil, fmt.Errorf("failed to unmarshal legacy 'olm.gvk' dependency: %w", err) - } - vto := gvk{ - Group: vfrom.Group, - Version: vfrom.Version, - Kind: vfrom.Kind, - } - vb, err := json.Marshal(&vto) - if err != nil { - return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) - } - result = append(result, &api.Property{ - Type: "olm.gvk.required", - Value: string(vb), - }) - case "olm.package": - var vfrom struct { - PackageName string `json:"packageName"` - VersionRange string `json:"version"` - } - if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { - return nil, fmt.Errorf("failed to unmarshal legacy 'olm.package' dependency: %w", err) - } - vto := struct { - PackageName string `json:"packageName"` - VersionRange string `json:"versionRange"` - }{ - PackageName: vfrom.PackageName, - VersionRange: vfrom.VersionRange, - } - vb, err := json.Marshal(&vto) - if err != nil { - return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) - } - result = append(result, &api.Property{ - Type: "olm.package.required", - Value: string(vb), - }) - case "olm.label": - result = append(result, &api.Property{ - Type: "olm.label.required", - Value: dependency.Value, - }) - } - } - return result, nil -} - -func APISetToProperties(crds, apis APISet, deprecated bool) (out []*api.Property) { - out = make([]*api.Property, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if deprecated { - val, err := json.Marshal(opregistry.DeprecatedProperty{}) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.DeprecatedType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} - -func APISetToDependencies(crds, apis APISet) (out []*api.Dependency) { - if len(crds)+len(apis) == 0 { - return nil - } - out = make([]*api.Dependency, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go index 5337a5b25d..cedad87f37 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators_test.go @@ -1,17 +1,10 @@ package cache import ( - "encoding/json" "testing" - "github.com/blang/semver/v4" "github.com/stretchr/testify/require" - "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - opver "github.com/operator-framework/api/pkg/lib/version" - "github.com/operator-framework/api/pkg/operators/v1alpha1" - "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -885,606 +878,3 @@ func TestOperatorSourceInfo_String(t *testing.T) { }) } } - -func TestNewOperatorFromBundle(t *testing.T) { - version := opver.OperatorVersion{Version: semver.MustParse("0.1.0-abc")} - csv := v1alpha1.ClusterServiceVersion{ - TypeMeta: metav1.TypeMeta{ - Kind: v1alpha1.ClusterServiceVersionKind, - APIVersion: v1alpha1.GroupVersion, - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "testCSV", - Namespace: "testNamespace", - }, - Spec: v1alpha1.ClusterServiceVersionSpec{ - Replaces: "v1", - CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ - Owned: []v1alpha1.CRDDescription{}, - Required: []v1alpha1.CRDDescription{}, - }, - APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ - Owned: []v1alpha1.APIServiceDescription{}, - Required: []v1alpha1.APIServiceDescription{}, - }, - Version: version, - }, - } - - csvJson, err := json.Marshal(csv) - require.NoError(t, err) - bundleNoAPIs := &api.Bundle{ - CsvName: "testBundle", - PackageName: "testPackage", - ChannelName: "testChannel", - Version: version.String(), - CsvJson: string(csvJson), - Object: []string{string(csvJson)}, - } - - csv.Spec.CustomResourceDefinitions.Owned = []v1alpha1.CRDDescription{ - { - Name: "owneds.crd.group.com", - Version: "v1", - Kind: "OwnedCRD", - }, - } - csv.Spec.CustomResourceDefinitions.Required = []v1alpha1.CRDDescription{ - { - Name: "requireds.crd.group.com", - Version: "v1", - Kind: "RequiredCRD", - }, - } - csv.Spec.APIServiceDefinitions.Owned = []v1alpha1.APIServiceDescription{ - { - Name: "ownedapis", - Group: "apis.group.com", - Version: "v1", - Kind: "OwnedAPI", - }, - } - csv.Spec.APIServiceDefinitions.Required = []v1alpha1.APIServiceDescription{ - { - Name: "requiredapis", - Group: "apis.group.com", - Version: "v1", - Kind: "RequiredAPI", - }, - } - - csvJsonWithApis, err := json.Marshal(csv) - require.NoError(t, err) - - crd := v1beta1.CustomResourceDefinition{ - TypeMeta: metav1.TypeMeta{ - Kind: "CustomResourceDefinition", - APIVersion: "apiextensions.k8s.io/v1beta1", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "owneds.crd.group.com", - }, - Spec: v1beta1.CustomResourceDefinitionSpec{ - Group: "crd.group.com", - Versions: []v1beta1.CustomResourceDefinitionVersion{ - { - Name: "v1", - Served: true, - Storage: true, - }, - }, - Names: v1beta1.CustomResourceDefinitionNames{ - Plural: "owneds", - Singular: "owned", - Kind: "OwnedCRD", - ListKind: "OwnedCRDList", - }, - }, - } - crdJson, err := json.Marshal(crd) - require.NoError(t, err) - - bundleWithAPIs := &api.Bundle{ - CsvName: "testBundle", - PackageName: "testPackage", - ChannelName: "testChannel", - Version: version.String(), - CsvJson: string(csvJsonWithApis), - Object: []string{string(csvJsonWithApis), string(crdJson)}, - ProvidedApis: []*api.GroupVersionKind{ - { - Group: "crd.group.com", - Version: "v1", - Kind: "OwnedCRD", - Plural: "owneds", - }, - { - Plural: "ownedapis", - Group: "apis.group.com", - Version: "v1", - Kind: "OwnedAPI", - }, - }, - RequiredApis: []*api.GroupVersionKind{ - { - Group: "crd.group.com", - Version: "v1", - Kind: "RequiredCRD", - Plural: "requireds", - }, - { - Plural: "requiredapis", - Group: "apis.group.com", - Version: "v1", - Kind: "RequiredAPI", - }, - }, - } - - bundleWithPropsAndDeps := &api.Bundle{ - CsvName: "testBundle", - PackageName: "testPackage", - ChannelName: "testChannel", - Version: version.String(), - BundlePath: "image", - Properties: []*api.Property{ - { - Type: "olm.gvk", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", - }, - }, - Dependencies: []*api.Dependency{ - { - Type: "olm.gvk", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", - }, - }, - } - - bundleWithAPIsUnextracted := &api.Bundle{ - CsvName: "testBundle", - PackageName: "testPackage", - ChannelName: "testChannel", - CsvJson: string(csvJsonWithApis), - Object: []string{string(csvJsonWithApis), string(crdJson)}, - } - - type args struct { - bundle *api.Bundle - sourceKey SourceKey - replaces string - defaultChannel string - } - tests := []struct { - name string - args args - want *Operator - wantErr error - }{ - { - name: "BundleNoAPIs", - args: args{ - bundle: bundleNoAPIs, - sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - want: &Operator{ - Name: "testBundle", - Version: &version.Version, - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: EmptyAPISet(), - Bundle: bundleNoAPIs, - SourceInfo: &OperatorSourceInfo{ - Package: "testPackage", - Channel: "testChannel", - Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - }, - }, - { - name: "BundleWithAPIs", - args: args{ - bundle: bundleWithAPIs, - sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - want: &Operator{ - Name: "testBundle", - Version: &version.Version, - ProvidedAPIs: APISet{ - opregistry.APIKey{ - Group: "crd.group.com", - Version: "v1", - Kind: "OwnedCRD", - Plural: "owneds", - }: struct{}{}, - opregistry.APIKey{ - Group: "apis.group.com", - Version: "v1", - Kind: "OwnedAPI", - Plural: "ownedapis", - }: struct{}{}, - }, - RequiredAPIs: APISet{ - opregistry.APIKey{ - Group: "crd.group.com", - Version: "v1", - Kind: "RequiredCRD", - Plural: "requireds", - }: struct{}{}, - opregistry.APIKey{ - Group: "apis.group.com", - Version: "v1", - Kind: "RequiredAPI", - Plural: "requiredapis", - }: struct{}{}, - }, - Properties: []*api.Property{ - { - Type: "olm.gvk", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", - }, - }, - Bundle: bundleWithAPIs, - SourceInfo: &OperatorSourceInfo{ - Package: "testPackage", - Channel: "testChannel", - Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - }, - }, - { - name: "BundleIgnoreCSV", - args: args{ - bundle: bundleWithAPIsUnextracted, - sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - want: &Operator{ - Name: "testBundle", - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: EmptyAPISet(), - Bundle: bundleWithAPIsUnextracted, - SourceInfo: &OperatorSourceInfo{ - Package: "testPackage", - Channel: "testChannel", - Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - }, - }, - { - name: "BundleInDefaultChannel", - args: args{ - bundle: bundleNoAPIs, - sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, - defaultChannel: "testChannel", - }, - want: &Operator{ - Name: "testBundle", - Version: &version.Version, - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: EmptyAPISet(), - Bundle: bundleNoAPIs, - SourceInfo: &OperatorSourceInfo{ - Package: "testPackage", - Channel: "testChannel", - Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, - DefaultChannel: true, - }, - }, - }, - { - name: "BundleWithPropertiesAndDependencies", - args: args{ - bundle: bundleWithPropsAndDeps, - sourceKey: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - want: &Operator{ - Name: "testBundle", - Version: &version.Version, - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: EmptyAPISet(), - Properties: []*api.Property{ - { - Type: "olm.gvk", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", - }, - }, - Bundle: bundleWithPropsAndDeps, - SourceInfo: &OperatorSourceInfo{ - Package: "testPackage", - Channel: "testChannel", - Catalog: SourceKey{Name: "source", Namespace: "testNamespace"}, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := NewOperatorFromBundle(tt.args.bundle, "", tt.args.sourceKey, tt.args.defaultChannel) - require.Equal(t, tt.wantErr, err) - requirePropertiesEqual(t, tt.want.Properties, got.Properties) - tt.want.Properties, got.Properties = nil, nil - require.Equal(t, tt.want, got) - }) - } -} - -func TestNewOperatorFromCSV(t *testing.T) { - version := opver.OperatorVersion{Version: semver.MustParse("0.1.0-abc")} - type args struct { - csv *v1alpha1.ClusterServiceVersion - } - tests := []struct { - name string - args args - want *Operator - wantErr error - }{ - { - name: "NoProvided/NoRequired", - args: args{ - csv: &v1alpha1.ClusterServiceVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "operator.v1", - }, - Spec: v1alpha1.ClusterServiceVersionSpec{ - Version: version, - }, - }, - }, - want: &Operator{ - Name: "operator.v1", - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: EmptyAPISet(), - SourceInfo: &ExistingOperator, - Version: &version.Version, - }, - }, - { - name: "Provided/NoRequired", - args: args{ - csv: &v1alpha1.ClusterServiceVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "operator.v1", - }, - Spec: v1alpha1.ClusterServiceVersionSpec{ - Version: version, - CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ - Owned: []v1alpha1.CRDDescription{ - { - Name: "crdkinds.g", - Version: "v1", - Kind: "CRDKind", - }, - }, - }, - APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ - Owned: []v1alpha1.APIServiceDescription{ - { - Name: "apikinds", - Group: "g", - Version: "v1", - Kind: "APIKind", - }, - }, - }, - }, - }, - }, - want: &Operator{ - Name: "operator.v1", - ProvidedAPIs: map[opregistry.APIKey]struct{}{ - {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, - {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, - }, - Properties: []*api.Property{ - { - Type: "olm.gvk", - Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", - }, - }, - RequiredAPIs: EmptyAPISet(), - SourceInfo: &ExistingOperator, - Version: &version.Version, - }, - }, - { - name: "NoProvided/Required", - args: args{ - csv: &v1alpha1.ClusterServiceVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "operator.v1", - }, - Spec: v1alpha1.ClusterServiceVersionSpec{ - Version: version, - CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ - Required: []v1alpha1.CRDDescription{ - { - Name: "crdkinds.g", - Version: "v1", - Kind: "CRDKind", - }, - }, - }, - APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ - Required: []v1alpha1.APIServiceDescription{ - { - Name: "apikinds", - Group: "g", - Version: "v1", - Kind: "APIKind", - }, - }, - }, - }, - }, - }, - want: &Operator{ - Name: "operator.v1", - ProvidedAPIs: EmptyAPISet(), - RequiredAPIs: map[opregistry.APIKey]struct{}{ - {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, - {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, - }, - Properties: []*api.Property{ - { - Type: "olm.gvk.required", - Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", - }, - }, - SourceInfo: &ExistingOperator, - Version: &version.Version, - }, - }, - { - name: "Provided/Required", - args: args{ - csv: &v1alpha1.ClusterServiceVersion{ - ObjectMeta: metav1.ObjectMeta{ - Name: "operator.v1", - }, - Spec: v1alpha1.ClusterServiceVersionSpec{ - Version: version, - CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ - Owned: []v1alpha1.CRDDescription{ - { - Name: "crdownedkinds.g", - Version: "v1", - Kind: "CRDOwnedKind", - }, - }, - Required: []v1alpha1.CRDDescription{ - { - Name: "crdreqkinds.g2", - Version: "v1", - Kind: "CRDReqKind", - }, - }, - }, - APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ - Owned: []v1alpha1.APIServiceDescription{ - { - Name: "apiownedkinds", - Group: "g", - Version: "v1", - Kind: "APIOwnedKind", - }, - }, - Required: []v1alpha1.APIServiceDescription{ - { - Name: "apireqkinds", - Group: "g2", - Version: "v1", - Kind: "APIReqKind", - }, - }, - }, - }, - }, - }, - want: &Operator{ - Name: "operator.v1", - ProvidedAPIs: map[opregistry.APIKey]struct{}{ - {Group: "g", Version: "v1", Kind: "APIOwnedKind", Plural: "apiownedkinds"}: {}, - {Group: "g", Version: "v1", Kind: "CRDOwnedKind", Plural: "crdownedkinds"}: {}, - }, - RequiredAPIs: map[opregistry.APIKey]struct{}{ - {Group: "g2", Version: "v1", Kind: "APIReqKind", Plural: "apireqkinds"}: {}, - {Group: "g2", Version: "v1", Kind: "CRDReqKind", Plural: "crdreqkinds"}: {}, - }, - Properties: []*api.Property{ - { - Type: "olm.gvk", - Value: "{\"group\":\"g\",\"kind\":\"APIOwnedKind\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk", - Value: "{\"group\":\"g\",\"kind\":\"CRDOwnedKind\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"g2\",\"kind\":\"APIReqKind\",\"version\":\"v1\"}", - }, - { - Type: "olm.gvk.required", - Value: "{\"group\":\"g2\",\"kind\":\"CRDReqKind\",\"version\":\"v1\"}", - }, - }, - SourceInfo: &ExistingOperator, - Version: &version.Version, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := NewOperatorFromV1Alpha1CSV(tt.args.csv) - require.Equal(t, tt.wantErr, err) - requirePropertiesEqual(t, tt.want.Properties, got.Properties) - tt.want.Properties, got.Properties = nil, nil - require.Equal(t, tt.want, got) - }) - } -} - -func requirePropertiesEqual(t *testing.T, a, b []*api.Property) { - type Property struct { - Type string - Value interface{} - } - nice := func(in *api.Property) Property { - var i interface{} - if err := json.Unmarshal([]byte(in.Value), &i); err != nil { - t.Fatalf("property value %q could not be unmarshaled as json: %s", in.Value, err) - } - return Property{ - Type: in.Type, - Value: i, - } - } - var l, r []Property - for _, p := range a { - l = append(l, nice(p)) - } - for _, p := range b { - r = append(r, nice(p)) - } - require.ElementsMatch(t, l, r) -} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 292dda4805..66f1d28c5a 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -7,7 +7,6 @@ import ( "github.com/blang/semver/v4" - "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -41,10 +40,10 @@ func (ch channelPredicate) Test(o *Operator) bool { if string(ch) == "" { return true } - if o.Bundle == nil { - return false + if si := o.SourceInfo; si != nil { + return si.Channel == string(ch) } - return o.Bundle.ChannelName == string(ch) + return false } func (ch channelPredicate) String() string { @@ -322,67 +321,11 @@ func (c countingPredicate) Test(o *Operator) bool { } return false } + func (c countingPredicate) String() string { return c.p.String() } + func CountingPredicate(p OperatorPredicate, n *int) OperatorPredicate { return countingPredicate{p: p, n: n} } - -func PredicateForProperty(property *api.Property) (OperatorPredicate, error) { - if property == nil { - return nil, nil - } - p, ok := predicates[property.Type] - if !ok { - return nil, nil - } - return p(property.Value) -} - -var predicates = map[string]func(string) (OperatorPredicate, error){ - "olm.gvk.required": predicateForRequiredGVKProperty, - "olm.package.required": predicateForRequiredPackageProperty, - "olm.label.required": predicateForRequiredLabelProperty, -} - -func predicateForRequiredGVKProperty(value string) (OperatorPredicate, error) { - var gvk struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - } - if err := json.Unmarshal([]byte(value), &gvk); err != nil { - return nil, err - } - return ProvidingAPIPredicate(opregistry.APIKey{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind, - }), nil -} - -func predicateForRequiredPackageProperty(value string) (OperatorPredicate, error) { - var pkg struct { - PackageName string `json:"packageName"` - VersionRange string `json:"versionRange"` - } - if err := json.Unmarshal([]byte(value), &pkg); err != nil { - return nil, err - } - ver, err := semver.ParseRange(pkg.VersionRange) - if err != nil { - return nil, err - } - return And(PkgPredicate(pkg.PackageName), VersionInRangePredicate(ver, pkg.VersionRange)), nil -} - -func predicateForRequiredLabelProperty(value string) (OperatorPredicate, error) { - var label struct { - Label string `json:"label"` - } - if err := json.Unmarshal([]byte(value), &label); err != nil { - return nil, err - } - return LabelPredicate(label.Label), nil -} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 38e779acd3..f7a5e6afeb 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -76,7 +76,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust var current *cache.Operator for _, csv := range csvs { if csv.Name == sub.Status.InstalledCSV { - op, err := cache.NewOperatorFromV1Alpha1CSV(csv) + op, err := newOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -181,7 +181,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu Namespace: sub.Spec.CatalogSourceNamespace, } - var bundles []*cache.Operator + var entries []*cache.Operator { var nall, npkg, nch, ncsv int @@ -200,7 +200,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu cache.CountingPredicate(cache.ChannelPredicate(sub.Spec.Channel), &nch), cache.CountingPredicate(csvPredicate, &ncsv), )) - bundles = namespacedCache.Catalog(catalog).Find(cachePredicates...) + entries = namespacedCache.Catalog(catalog).Find(cachePredicates...) var si solver.Installable switch { @@ -220,36 +220,40 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu } } - // bundles in the default channel appear first, then lexicographically order by channel name - sort.SliceStable(bundles, func(i, j int) bool { + // entries in the default channel appear first, then lexicographically order by channel name + sort.SliceStable(entries, func(i, j int) bool { var idef bool - if isrc := bundles[i].SourceInfo; isrc != nil { + var ichan string + if isrc := entries[i].SourceInfo; isrc != nil { idef = isrc.DefaultChannel + ichan = isrc.Channel } var jdef bool - if jsrc := bundles[j].SourceInfo; jsrc != nil { + var jchan string + if jsrc := entries[j].SourceInfo; jsrc != nil { jdef = jsrc.DefaultChannel + jchan = jsrc.Channel } if idef == jdef { - return bundles[i].Bundle.ChannelName < bundles[j].Bundle.ChannelName + return ichan < jchan } return idef }) var sortedBundles []*cache.Operator lastChannel, lastIndex := "", 0 - for i := 0; i <= len(bundles); i++ { - if i != len(bundles) && bundles[i].Bundle.ChannelName == lastChannel { + for i := 0; i <= len(entries); i++ { + if i != len(entries) && entries[i].Channel() == lastChannel { continue } - channel, err := sortChannel(bundles[lastIndex:i]) + channel, err := sortChannel(entries[lastIndex:i]) if err != nil { return nil, err } sortedBundles = append(sortedBundles, channel...) - if i != len(bundles) { - lastChannel = bundles[i].Bundle.ChannelName + if i != len(entries) { + lastChannel = entries[i].Channel() lastIndex = i } } @@ -333,7 +337,7 @@ func (r *SatResolver) getBundleInstallables(preferredNamespace string, bundleSta visited[bundle] = &bundleInstallable - dependencyPredicates, err := bundle.DependencyPredicates() + dependencyPredicates, err := DependencyPredicates(bundle.Properties) if err != nil { errs = append(errs, err) continue @@ -470,7 +474,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 var csvsMissingProperties []*v1alpha1.ClusterServiceVersion standaloneOperators := make([]*cache.Operator, 0) for _, csv := range csvs { - op, err := cache.NewOperatorFromV1Alpha1CSV(csv) + op, err := newOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -728,3 +732,172 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { // TODO: do we care if the channel doesn't include every bundle in the input? return chains[0], nil } + +func DependencyPredicates(properties []*api.Property) ([]cache.OperatorPredicate, error) { + var predicates []cache.OperatorPredicate + for _, property := range properties { + predicate, err := predicateForProperty(property) + if err != nil { + return nil, err + } + if predicate == nil { + continue + } + predicates = append(predicates, predicate) + } + return predicates, nil +} + +func predicateForProperty(property *api.Property) (cache.OperatorPredicate, error) { + if property == nil { + return nil, nil + } + p, ok := predicates[property.Type] + if !ok { + return nil, nil + } + return p(property.Value) +} + +var predicates = map[string]func(string) (cache.OperatorPredicate, error){ + "olm.gvk.required": predicateForRequiredGVKProperty, + "olm.package.required": predicateForRequiredPackageProperty, + "olm.label.required": predicateForRequiredLabelProperty, +} + +func predicateForRequiredGVKProperty(value string) (cache.OperatorPredicate, error) { + var gvk struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + } + if err := json.Unmarshal([]byte(value), &gvk); err != nil { + return nil, err + } + return cache.ProvidingAPIPredicate(opregistry.APIKey{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + }), nil +} + +func predicateForRequiredPackageProperty(value string) (cache.OperatorPredicate, error) { + var pkg struct { + PackageName string `json:"packageName"` + VersionRange string `json:"versionRange"` + } + if err := json.Unmarshal([]byte(value), &pkg); err != nil { + return nil, err + } + ver, err := semver.ParseRange(pkg.VersionRange) + if err != nil { + return nil, err + } + return cache.And(cache.PkgPredicate(pkg.PackageName), cache.VersionInRangePredicate(ver, pkg.VersionRange)), nil +} + +func predicateForRequiredLabelProperty(value string) (cache.OperatorPredicate, error) { + var label struct { + Label string `json:"label"` + } + if err := json.Unmarshal([]byte(value), &label); err != nil { + return nil, err + } + return cache.LabelPredicate(label.Label), nil +} + +func newOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*cache.Operator, error) { + providedAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + providedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Owned { + providedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + requiredAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Required { + requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + properties, err := providedAPIsToProperties(providedAPIs) + if err != nil { + return nil, err + } + dependencies, err := requiredAPIsToProperties(requiredAPIs) + if err != nil { + return nil, err + } + properties = append(properties, dependencies...) + + return &cache.Operator{ + Name: csv.GetName(), + Version: &csv.Spec.Version.Version, + ProvidedAPIs: providedAPIs, + RequiredAPIs: requiredAPIs, + SourceInfo: &cache.ExistingOperator, + Properties: properties, + }, nil +} + +func providedAPIsToProperties(apis cache.APISet) (out []*api.Property, err error) { + out = make([]*api.Property, 0) + for a := range apis { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Version: a.Version, + Kind: a.Kind, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if len(out) > 0 { + return + } + return nil, nil +} + +func requiredAPIsToProperties(apis cache.APISet) (out []*api.Property, err error) { + if len(apis) == 0 { + return + } + out = make([]*api.Property, 0) + for a := range apis { + val, err := json.Marshal(struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + }{ + Group: a.Group, + Version: a.Version, + Kind: a.Kind, + }) + if err != nil { + return nil, err + } + out = append(out, &api.Property{ + Type: "olm.gvk.required", + Value: string(val), + }) + } + if len(out) > 0 { + return + } + return nil, nil +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go index 1d80b0cd13..1931d5e1f5 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver_test.go @@ -15,6 +15,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "github.com/operator-framework/api/pkg/lib/version" + opver "github.com/operator-framework/api/pkg/lib/version" "github.com/operator-framework/api/pkg/operators/v1alpha1" listersv1alpha1 "github.com/operator-framework/operator-lifecycle-manager/pkg/api/client/listers/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" @@ -946,7 +947,7 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie cache: cache.New(cache.StaticSourceProvider{ catalog: &cache.Snapshot{ Entries: []*cache.Operator{ - genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(nil, Provides), defaultChannel, false), + genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(nil, Provides), defaultChannel, false), genOperator("packageB.v0.0.1", "0.0.1", "packageB.v1", "packageB", defaultChannel, catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), genOperator("packageB.v0.0.2", "0.0.2", "packageB.v0.0.1", "packageB", "alpha", catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), }, @@ -960,7 +961,7 @@ func TestSolveOperators_PreferDefaultChannelInResolutionForTransitiveDependencie // operator should be from the default stable channel expected := cache.OperatorSet{ - "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(nil, Provides), defaultChannel, false), + "packageA.v0.0.1": genOperator("packageA.v0.0.1", "0.0.1", "packageA.v1", "packageA", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(nil, Provides), defaultChannel, false), "packageB.v0.0.1": genOperator("packageB.v0.0.1", "0.0.1", "packageB.v1", "packageB", defaultChannel, catalog.Name, catalog.Namespace, nil, Provides, nil, defaultChannel, false), } require.EqualValues(t, expected, operators) @@ -1000,7 +1001,7 @@ func TestSolveOperators_SubscriptionlessOperatorsSatisfyDependencies(t *testing. operators, err := satResolver.SolveOperators([]string{"olm"}, csvs, subs) assert.NoError(t, err) expected := cache.OperatorSet{ - "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", catalog.Name, catalog.Namespace, Provides, nil, cache.APISetToDependencies(Provides, nil), "", false), + "packageB.v1.0.1": genOperator("packageB.v1.0.1", "1.0.1", "packageB.v1.0.0", "packageB", "alpha", catalog.Name, catalog.Namespace, Provides, nil, apiSetToDependencies(Provides, nil), "", false), } assert.Equal(t, len(expected), len(operators)) for k := range expected { @@ -1165,9 +1166,9 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { csvs := make([]*v1alpha1.ClusterServiceVersion, 0) for _, o := range operators { var pkg, channel string - if b := o.Bundle; b != nil { - pkg = b.PackageName - channel = b.ChannelName + if si := o.SourceInfo; si != nil { + pkg = si.Package + channel = si.Channel } csvs = append(csvs, existingOperator(namespace, o.Name, pkg, channel, o.Replaces, o.ProvidedAPIs, o.RequiredAPIs, nil, nil)) } @@ -1186,30 +1187,24 @@ func TestSolveOperators_TransferApiOwnership(t *testing.T) { func genOperator(name, version, replaces, pkg, channel, catalogName, catalogNamespace string, requiredAPIs, providedAPIs cache.APISet, dependencies []*api.Dependency, defaultChannel string, deprecated bool) *cache.Operator { semversion, _ := semver.Make(version) - properties := cache.APISetToProperties(providedAPIs, nil, deprecated) + properties := apiSetToProperties(providedAPIs, nil, deprecated) if len(dependencies) == 0 { - ps, err := cache.RequiredAPIsToProperties(requiredAPIs) + ps, err := requiredAPIsToProperties(requiredAPIs) if err != nil { panic(err) } properties = append(properties, ps...) } else { - ps, err := cache.LegacyDependenciesToProperties(dependencies) + ps, err := legacyDependenciesToProperties(dependencies) if err != nil { panic(err) } properties = append(properties, ps...) } o := &cache.Operator{ - Name: name, - Version: &semversion, - Replaces: replaces, - Bundle: &api.Bundle{ - PackageName: pkg, - ChannelName: channel, - Dependencies: dependencies, - Properties: properties, - }, + Name: name, + Version: &semversion, + Replaces: replaces, Properties: properties, SourceInfo: &cache.OperatorSourceInfo{ Catalog: cache.SourceKey{ @@ -1227,11 +1222,6 @@ func genOperator(name, version, replaces, pkg, channel, catalogName, catalogName return o } -func stripBundle(o *cache.Operator) *cache.Operator { - o.Bundle = nil - return o -} - func TestSolveOperators_WithoutDeprecated(t *testing.T) { catalog := cache.SourceKey{Name: "catalog", Namespace: "namespace"} @@ -1513,8 +1503,8 @@ func TestInferProperties(t *testing.T) { Entries: []*cache.Operator{ { Name: "a", - Bundle: &api.Bundle{ - PackageName: "x", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "x", }, }, }, @@ -1554,8 +1544,8 @@ func TestInferProperties(t *testing.T) { Entries: []*cache.Operator{ { Name: "a", - Bundle: &api.Bundle{ - PackageName: "x", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "x", }, }, }, @@ -1616,8 +1606,8 @@ func TestInferProperties(t *testing.T) { Entries: []*cache.Operator{ { Name: "a", - Bundle: &api.Bundle{ - PackageName: "x", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "x", }, }, }, @@ -1674,17 +1664,17 @@ func TestSortChannel(t *testing.T) { In: []*cache.Operator{ { Name: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "a", Replaces: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, }, @@ -1692,16 +1682,16 @@ func TestSortChannel(t *testing.T) { { Name: "a", Replaces: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, }, @@ -1717,17 +1707,17 @@ func TestSortChannel(t *testing.T) { { Name: "a", Replaces: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "b", Replaces: "a", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, }, @@ -1739,25 +1729,25 @@ func TestSortChannel(t *testing.T) { { Name: "a", Replaces: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "b", Replaces: "c", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "c", Replaces: "b", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, }, @@ -1816,24 +1806,24 @@ func TestSortChannel(t *testing.T) { In: []*cache.Operator{ { Name: "a", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "b", Replaces: "c", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, { Name: "c", - Bundle: &api.Bundle{ - PackageName: "package", - ChannelName: "channel", + SourceInfo: &cache.OperatorSourceInfo{ + Package: "package", + Channel: "channel", }, }, }, @@ -1852,3 +1842,228 @@ func TestSortChannel(t *testing.T) { }) } } + +func TestNewOperatorFromCSV(t *testing.T) { + version := opver.OperatorVersion{Version: semver.MustParse("0.1.0-abc")} + type args struct { + csv *v1alpha1.ClusterServiceVersion + } + tests := []struct { + name string + args args + want *cache.Operator + wantErr error + }{ + { + name: "NoProvided/NoRequired", + args: args{ + csv: &v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "operator.v1", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Version: version, + }, + }, + }, + want: &cache.Operator{ + Name: "operator.v1", + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + SourceInfo: &cache.ExistingOperator, + Version: &version.Version, + }, + }, + { + name: "Provided/NoRequired", + args: args{ + csv: &v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "operator.v1", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Version: version, + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{ + { + Name: "crdkinds.g", + Version: "v1", + Kind: "CRDKind", + }, + }, + }, + APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ + Owned: []v1alpha1.APIServiceDescription{ + { + Name: "apikinds", + Group: "g", + Version: "v1", + Kind: "APIKind", + }, + }, + }, + }, + }, + }, + want: &cache.Operator{ + Name: "operator.v1", + ProvidedAPIs: map[opregistry.APIKey]struct{}{ + {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, + {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, + }, + Properties: []*api.Property{ + { + Type: "olm.gvk", + Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", + }, + }, + RequiredAPIs: cache.EmptyAPISet(), + SourceInfo: &cache.ExistingOperator, + Version: &version.Version, + }, + }, + { + name: "NoProvided/Required", + args: args{ + csv: &v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "operator.v1", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Version: version, + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Required: []v1alpha1.CRDDescription{ + { + Name: "crdkinds.g", + Version: "v1", + Kind: "CRDKind", + }, + }, + }, + APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ + Required: []v1alpha1.APIServiceDescription{ + { + Name: "apikinds", + Group: "g", + Version: "v1", + Kind: "APIKind", + }, + }, + }, + }, + }, + }, + want: &cache.Operator{ + Name: "operator.v1", + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: map[opregistry.APIKey]struct{}{ + {Group: "g", Version: "v1", Kind: "APIKind", Plural: "apikinds"}: {}, + {Group: "g", Version: "v1", Kind: "CRDKind", Plural: "crdkinds"}: {}, + }, + Properties: []*api.Property{ + { + Type: "olm.gvk.required", + Value: "{\"group\":\"g\",\"kind\":\"APIKind\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"g\",\"kind\":\"CRDKind\",\"version\":\"v1\"}", + }, + }, + SourceInfo: &cache.ExistingOperator, + Version: &version.Version, + }, + }, + { + name: "Provided/Required", + args: args{ + csv: &v1alpha1.ClusterServiceVersion{ + ObjectMeta: metav1.ObjectMeta{ + Name: "operator.v1", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Version: version, + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{ + { + Name: "crdownedkinds.g", + Version: "v1", + Kind: "CRDOwnedKind", + }, + }, + Required: []v1alpha1.CRDDescription{ + { + Name: "crdreqkinds.g2", + Version: "v1", + Kind: "CRDReqKind", + }, + }, + }, + APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ + Owned: []v1alpha1.APIServiceDescription{ + { + Name: "apiownedkinds", + Group: "g", + Version: "v1", + Kind: "APIOwnedKind", + }, + }, + Required: []v1alpha1.APIServiceDescription{ + { + Name: "apireqkinds", + Group: "g2", + Version: "v1", + Kind: "APIReqKind", + }, + }, + }, + }, + }, + }, + want: &cache.Operator{ + Name: "operator.v1", + ProvidedAPIs: map[opregistry.APIKey]struct{}{ + {Group: "g", Version: "v1", Kind: "APIOwnedKind", Plural: "apiownedkinds"}: {}, + {Group: "g", Version: "v1", Kind: "CRDOwnedKind", Plural: "crdownedkinds"}: {}, + }, + RequiredAPIs: map[opregistry.APIKey]struct{}{ + {Group: "g2", Version: "v1", Kind: "APIReqKind", Plural: "apireqkinds"}: {}, + {Group: "g2", Version: "v1", Kind: "CRDReqKind", Plural: "crdreqkinds"}: {}, + }, + Properties: []*api.Property{ + { + Type: "olm.gvk", + Value: "{\"group\":\"g\",\"kind\":\"APIOwnedKind\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"g\",\"kind\":\"CRDOwnedKind\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"g2\",\"kind\":\"APIReqKind\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"g2\",\"kind\":\"CRDReqKind\",\"version\":\"v1\"}", + }, + }, + SourceInfo: &cache.ExistingOperator, + Version: &version.Version, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newOperatorFromV1Alpha1CSV(tt.args.csv) + require.Equal(t, tt.wantErr, err) + requirePropertiesEqual(t, tt.want.Properties, got.Properties) + tt.want.Properties, got.Properties = nil, nil + require.Equal(t, tt.want, got) + }) + } +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go index 6c5c11998d..eaea2568f9 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/blang/semver/v4" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/api" @@ -58,7 +59,7 @@ func (s *registrySource) Snapshot(ctx context.Context) (*cache.Snapshot, error) defaultChannel = p.DefaultChannelName } } - o, err := cache.NewOperatorFromBundle(b, "", s.key, defaultChannel) + o, err := newOperatorFromBundle(b, "", s.key, defaultChannel) if err != nil { s.logger.Printf("failed to construct operator from bundle, continuing: %v", err) continue @@ -107,3 +108,132 @@ func EnsurePackageProperty(o *cache.Operator, name, version string) { Value: string(bytes), }) } + +func newOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey cache.SourceKey, defaultChannel string) (*cache.Operator, error) { + parsedVersion, err := semver.ParseTolerant(bundle.Version) + version := &parsedVersion + if err != nil { + version = nil + } + provided := cache.APISet{} + for _, gvk := range bundle.ProvidedApis { + provided[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} + } + required := cache.APISet{} + for _, gvk := range bundle.RequiredApis { + required[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} + } + sourceInfo := &cache.OperatorSourceInfo{ + Package: bundle.PackageName, + Channel: bundle.ChannelName, + StartingCSV: startingCSV, + Catalog: sourceKey, + } + sourceInfo.DefaultChannel = sourceInfo.Channel == defaultChannel + + // legacy support - if the api doesn't contain properties/dependencies, build them from required/provided apis + properties := bundle.Properties + if len(properties) == 0 { + properties, err = providedAPIsToProperties(provided) + if err != nil { + return nil, err + } + } + if len(bundle.Dependencies) > 0 { + ps, err := legacyDependenciesToProperties(bundle.Dependencies) + if err != nil { + return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) + } + properties = append(properties, ps...) + } else { + ps, err := requiredAPIsToProperties(required) + if err != nil { + return nil, err + } + properties = append(properties, ps...) + } + + o := &cache.Operator{ + Name: bundle.CsvName, + Replaces: bundle.Replaces, + Version: version, + ProvidedAPIs: provided, + RequiredAPIs: required, + SourceInfo: sourceInfo, + Properties: properties, + Skips: bundle.Skips, + BundlePath: bundle.BundlePath, + } + + if r, err := semver.ParseRange(bundle.SkipRange); err == nil { + o.SkipRange = r + } + + if o.BundlePath == "" { + // This bundle's content is embedded within the Bundle + // proto message, not specified via image reference. + o.Bundle = bundle + } + + return o, nil +} + +func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { + var result []*api.Property + for _, dependency := range dependencies { + switch dependency.Type { + case "olm.gvk": + type gvk struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + } + var vfrom gvk + if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { + return nil, fmt.Errorf("failed to unmarshal legacy 'olm.gvk' dependency: %w", err) + } + vto := gvk{ + Group: vfrom.Group, + Version: vfrom.Version, + Kind: vfrom.Kind, + } + vb, err := json.Marshal(&vto) + if err != nil { + return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) + } + result = append(result, &api.Property{ + Type: "olm.gvk.required", + Value: string(vb), + }) + case "olm.package": + var vfrom struct { + PackageName string `json:"packageName"` + VersionRange string `json:"version"` + } + if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { + return nil, fmt.Errorf("failed to unmarshal legacy 'olm.package' dependency: %w", err) + } + vto := struct { + PackageName string `json:"packageName"` + VersionRange string `json:"versionRange"` + }{ + PackageName: vfrom.PackageName, + VersionRange: vfrom.VersionRange, + } + vb, err := json.Marshal(&vto) + if err != nil { + return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) + } + result = append(result, &api.Property{ + Type: "olm.package.required", + Value: string(vb), + }) + case "olm.label": + result = append(result, &api.Property{ + Type: "olm.label.required", + Value: dependency.Value, + }) + } + } + return result, nil +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry_test.go new file mode 100644 index 0000000000..05332ab534 --- /dev/null +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry_test.go @@ -0,0 +1,394 @@ +package resolver + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/blang/semver/v4" + opver "github.com/operator-framework/api/pkg/lib/version" + "github.com/operator-framework/api/pkg/operators/v1alpha1" + "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" + "github.com/operator-framework/operator-registry/pkg/api" + opregistry "github.com/operator-framework/operator-registry/pkg/registry" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +func TestNewOperatorFromBundle(t *testing.T) { + version := opver.OperatorVersion{Version: semver.MustParse("0.1.0-abc")} + csv := v1alpha1.ClusterServiceVersion{ + TypeMeta: metav1.TypeMeta{ + Kind: v1alpha1.ClusterServiceVersionKind, + APIVersion: v1alpha1.GroupVersion, + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "testCSV", + Namespace: "testNamespace", + }, + Spec: v1alpha1.ClusterServiceVersionSpec{ + Replaces: "v1", + CustomResourceDefinitions: v1alpha1.CustomResourceDefinitions{ + Owned: []v1alpha1.CRDDescription{}, + Required: []v1alpha1.CRDDescription{}, + }, + APIServiceDefinitions: v1alpha1.APIServiceDefinitions{ + Owned: []v1alpha1.APIServiceDescription{}, + Required: []v1alpha1.APIServiceDescription{}, + }, + Version: version, + }, + } + + csvJson, err := json.Marshal(csv) + require.NoError(t, err) + bundleNoAPIs := &api.Bundle{ + CsvName: "testBundle", + PackageName: "testPackage", + ChannelName: "testChannel", + Version: version.String(), + CsvJson: string(csvJson), + Object: []string{string(csvJson)}, + } + + csv.Spec.CustomResourceDefinitions.Owned = []v1alpha1.CRDDescription{ + { + Name: "owneds.crd.group.com", + Version: "v1", + Kind: "OwnedCRD", + }, + } + csv.Spec.CustomResourceDefinitions.Required = []v1alpha1.CRDDescription{ + { + Name: "requireds.crd.group.com", + Version: "v1", + Kind: "RequiredCRD", + }, + } + csv.Spec.APIServiceDefinitions.Owned = []v1alpha1.APIServiceDescription{ + { + Name: "ownedapis", + Group: "apis.group.com", + Version: "v1", + Kind: "OwnedAPI", + }, + } + csv.Spec.APIServiceDefinitions.Required = []v1alpha1.APIServiceDescription{ + { + Name: "requiredapis", + Group: "apis.group.com", + Version: "v1", + Kind: "RequiredAPI", + }, + } + + csvJsonWithApis, err := json.Marshal(csv) + require.NoError(t, err) + + crd := v1beta1.CustomResourceDefinition{ + TypeMeta: metav1.TypeMeta{ + Kind: "CustomResourceDefinition", + APIVersion: "apiextensions.k8s.io/v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "owneds.crd.group.com", + }, + Spec: v1beta1.CustomResourceDefinitionSpec{ + Group: "crd.group.com", + Versions: []v1beta1.CustomResourceDefinitionVersion{ + { + Name: "v1", + Served: true, + Storage: true, + }, + }, + Names: v1beta1.CustomResourceDefinitionNames{ + Plural: "owneds", + Singular: "owned", + Kind: "OwnedCRD", + ListKind: "OwnedCRDList", + }, + }, + } + crdJson, err := json.Marshal(crd) + require.NoError(t, err) + + bundleWithAPIs := &api.Bundle{ + CsvName: "testBundle", + PackageName: "testPackage", + ChannelName: "testChannel", + Version: version.String(), + CsvJson: string(csvJsonWithApis), + Object: []string{string(csvJsonWithApis), string(crdJson)}, + ProvidedApis: []*api.GroupVersionKind{ + { + Group: "crd.group.com", + Version: "v1", + Kind: "OwnedCRD", + Plural: "owneds", + }, + { + Plural: "ownedapis", + Group: "apis.group.com", + Version: "v1", + Kind: "OwnedAPI", + }, + }, + RequiredApis: []*api.GroupVersionKind{ + { + Group: "crd.group.com", + Version: "v1", + Kind: "RequiredCRD", + Plural: "requireds", + }, + { + Plural: "requiredapis", + Group: "apis.group.com", + Version: "v1", + Kind: "RequiredAPI", + }, + }, + } + + bundleWithPropsAndDeps := &api.Bundle{ + CsvName: "testBundle", + PackageName: "testPackage", + ChannelName: "testChannel", + Version: version.String(), + BundlePath: "image", + Properties: []*api.Property{ + { + Type: "olm.gvk", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", + }, + }, + Dependencies: []*api.Dependency{ + { + Type: "olm.gvk", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", + }, + }, + } + + bundleWithAPIsUnextracted := &api.Bundle{ + CsvName: "testBundle", + PackageName: "testPackage", + ChannelName: "testChannel", + CsvJson: string(csvJsonWithApis), + Object: []string{string(csvJsonWithApis), string(crdJson)}, + } + + type args struct { + bundle *api.Bundle + sourceKey cache.SourceKey + replaces string + defaultChannel string + } + tests := []struct { + name string + args args + want *cache.Operator + wantErr error + }{ + { + name: "BundleNoAPIs", + args: args{ + bundle: bundleNoAPIs, + sourceKey: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + want: &cache.Operator{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + Bundle: bundleNoAPIs, + SourceInfo: &cache.OperatorSourceInfo{ + Package: "testPackage", + Channel: "testChannel", + Catalog: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + }, + }, + { + name: "BundleWithAPIs", + args: args{ + bundle: bundleWithAPIs, + sourceKey: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + want: &cache.Operator{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: cache.APISet{ + opregistry.APIKey{ + Group: "crd.group.com", + Version: "v1", + Kind: "OwnedCRD", + Plural: "owneds", + }: struct{}{}, + opregistry.APIKey{ + Group: "apis.group.com", + Version: "v1", + Kind: "OwnedAPI", + Plural: "ownedapis", + }: struct{}{}, + }, + RequiredAPIs: cache.APISet{ + opregistry.APIKey{ + Group: "crd.group.com", + Version: "v1", + Kind: "RequiredCRD", + Plural: "requireds", + }: struct{}{}, + opregistry.APIKey{ + Group: "apis.group.com", + Version: "v1", + Kind: "RequiredAPI", + Plural: "requiredapis", + }: struct{}{}, + }, + Properties: []*api.Property{ + { + Type: "olm.gvk", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", + }, + }, + Bundle: bundleWithAPIs, + SourceInfo: &cache.OperatorSourceInfo{ + Package: "testPackage", + Channel: "testChannel", + Catalog: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + }, + }, + { + name: "BundleIgnoreCSV", + args: args{ + bundle: bundleWithAPIsUnextracted, + sourceKey: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + want: &cache.Operator{ + Name: "testBundle", + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + Bundle: bundleWithAPIsUnextracted, + SourceInfo: &cache.OperatorSourceInfo{ + Package: "testPackage", + Channel: "testChannel", + Catalog: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + }, + }, + { + name: "BundleInDefaultChannel", + args: args{ + bundle: bundleNoAPIs, + sourceKey: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + defaultChannel: "testChannel", + }, + want: &cache.Operator{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + Bundle: bundleNoAPIs, + SourceInfo: &cache.OperatorSourceInfo{ + Package: "testPackage", + Channel: "testChannel", + Catalog: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + DefaultChannel: true, + }, + }, + }, + { + name: "BundleWithPropertiesAndDependencies", + args: args{ + bundle: bundleWithPropsAndDeps, + sourceKey: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + want: &cache.Operator{ + Name: "testBundle", + Version: &version.Version, + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + Properties: []*api.Property{ + { + Type: "olm.gvk", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"OwnedCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"OwnedAPI\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"crd.group.com\",\"kind\":\"RequiredCRD\",\"version\":\"v1\"}", + }, + { + Type: "olm.gvk.required", + Value: "{\"group\":\"apis.group.com\",\"kind\":\"RequiredAPI\",\"version\":\"v1\"}", + }, + }, + BundlePath: bundleWithPropsAndDeps.BundlePath, + SourceInfo: &cache.OperatorSourceInfo{ + Package: "testPackage", + Channel: "testChannel", + Catalog: cache.SourceKey{Name: "source", Namespace: "testNamespace"}, + }, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := newOperatorFromBundle(tt.args.bundle, "", tt.args.sourceKey, tt.args.defaultChannel) + require.Equal(t, tt.wantErr, err) + requirePropertiesEqual(t, tt.want.Properties, got.Properties) + tt.want.Properties, got.Properties = nil, nil + require.Equal(t, tt.want, got) + }) + } +} + +func TestNewOperatorFromBundleStripsPluralRequiredAndProvidedAPIKeys(t *testing.T) { + key := cache.SourceKey{Namespace: "testnamespace", Name: "testname"} + o, err := newOperatorFromBundle(&api.Bundle{ + CsvName: fmt.Sprintf("%s/%s", key.Namespace, key.Name), + ProvidedApis: []*api.GroupVersionKind{{ + Group: "g", + Version: "v1", + Kind: "K", + Plural: "ks", + }}, + RequiredApis: []*api.GroupVersionKind{{ + Group: "g2", + Version: "v2", + Kind: "K2", + Plural: "ks2", + }}, + }, "", key, "") + + assert.NoError(t, err) + assert.Equal(t, "K.v1.g", o.ProvidedAPIs.String()) + assert.Equal(t, "K2.v2.g2", o.RequiredAPIs.String()) +} diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 7574dda57c..079b928065 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -137,57 +137,55 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, // add steps for any new bundle if op.Bundle != nil { - if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) - if err != nil { - return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) - } - steps = append(steps, bundleSteps...) - } else { - lookup := v1alpha1.BundleLookup{ - Path: op.Bundle.GetBundlePath(), - Identifier: op.Name, - Replaces: op.Replaces, - CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.SourceInfo.Catalog.Namespace, - Name: op.SourceInfo.Catalog.Name, + bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) + } + steps = append(steps, bundleSteps...) + } else { + lookup := v1alpha1.BundleLookup{ + Path: op.BundlePath, + Identifier: op.Name, + Replaces: op.Replaces, + CatalogSourceRef: &corev1.ObjectReference{ + Namespace: op.SourceInfo.Catalog.Namespace, + Name: op.SourceInfo.Catalog.Name, + }, + Conditions: []v1alpha1.BundleLookupCondition{ + { + Type: BundleLookupConditionPacked, + Status: corev1.ConditionTrue, + Reason: controllerbundle.NotUnpackedReason, + Message: controllerbundle.NotUnpackedMessage, }, - Conditions: []v1alpha1.BundleLookupCondition{ - { - Type: BundleLookupConditionPacked, - Status: corev1.ConditionTrue, - Reason: controllerbundle.NotUnpackedReason, - Message: controllerbundle.NotUnpackedMessage, - }, - { - Type: v1alpha1.BundleLookupPending, - Status: corev1.ConditionTrue, - Reason: controllerbundle.JobNotStartedReason, - Message: controllerbundle.JobNotStartedMessage, - }, + { + Type: v1alpha1.BundleLookupPending, + Status: corev1.ConditionTrue, + Reason: controllerbundle.JobNotStartedReason, + Message: controllerbundle.JobNotStartedMessage, }, - } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { - return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) - } else { - lookup.Properties = anno - } - bundleLookups = append(bundleLookups, lookup) + }, } + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { + return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) + } else { + lookup.Properties = anno + } + bundleLookups = append(bundleLookups, lookup) + } - if len(existingSubscriptions) == 0 { - // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.SourceInfo.StartingCSV = op.Name - subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) - if err != nil { - return nil, nil, nil, err - } - steps = append(steps, &v1alpha1.Step{ - Resolving: name, - Resource: subStep, - Status: v1alpha1.StepStatusUnknown, - }) + if len(existingSubscriptions) == 0 { + // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions + op.SourceInfo.StartingCSV = op.Name + subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) + if err != nil { + return nil, nil, nil, err } + steps = append(steps, &v1alpha1.Step{ + Resolving: name, + Resource: subStep, + Status: v1alpha1.StepStatusUnknown, + }) } // add steps for subscriptions for bundles that were added through resolution diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go index 77faa38b9c..f85056192f 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver_test.go @@ -829,7 +829,7 @@ func TestResolver(t *testing.T) { for catalog, bundles := range tt.bundlesByCatalog { snapshot := &resolvercache.Snapshot{} for _, bundle := range bundles { - op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") + op, err := newOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } @@ -974,7 +974,7 @@ func TestNamespaceResolverRBAC(t *testing.T) { stubSnapshot := &resolvercache.Snapshot{} for _, bundle := range tt.bundlesInCatalog { - op, err := resolvercache.NewOperatorFromBundle(bundle, "", catalog, "") + op, err := newOperatorFromBundle(bundle, "", catalog, "") if err != nil { t.Fatalf("unexpected error: %v", err) } diff --git a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go index 6586277b5b..9d4016cb0c 100644 --- a/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go +++ b/staging/operator-lifecycle-manager/pkg/controller/registry/resolver/util_test.go @@ -239,8 +239,8 @@ func bundle(name, pkg, channel, replaces string, providedCRDs, requiredCRDs, pro ProvidedApis: apiSetToGVK(providedCRDs, providedAPIServices), RequiredApis: apiSetToGVK(requiredCRDs, requiredAPIServices), Replaces: replaces, - Dependencies: cache.APISetToDependencies(requiredCRDs, requiredAPIServices), - Properties: append(cache.APISetToProperties(providedCRDs, providedAPIServices, false), + Dependencies: apiSetToDependencies(requiredCRDs, requiredAPIServices), + Properties: append(apiSetToProperties(providedCRDs, providedAPIServices, false), packageNameToProperty(pkg, "0.0.0"), ), } @@ -300,3 +300,113 @@ func withReplaces(operator *cache.Operator, replaces string) *cache.Operator { operator.Replaces = replaces return operator } + +func requirePropertiesEqual(t *testing.T, a, b []*api.Property) { + type Property struct { + Type string + Value interface{} + } + nice := func(in *api.Property) Property { + var i interface{} + if err := json.Unmarshal([]byte(in.Value), &i); err != nil { + t.Fatalf("property value %q could not be unmarshaled as json: %s", in.Value, err) + } + return Property{ + Type: in.Type, + Value: i, + } + } + var l, r []Property + for _, p := range a { + l = append(l, nice(p)) + } + for _, p := range b { + r = append(r, nice(p)) + } + require.ElementsMatch(t, l, r) +} + +func apiSetToProperties(crds, apis cache.APISet, deprecated bool) (out []*api.Property) { + out = make([]*api.Property, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if deprecated { + val, err := json.Marshal(opregistry.DeprecatedProperty{}) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.DeprecatedType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} + +func apiSetToDependencies(crds, apis cache.APISet) (out []*api.Dependency) { + if len(crds)+len(apis) == 0 { + return nil + } + out = make([]*api.Dependency, 0) + for a := range crds { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + for a := range apis { + val, err := json.Marshal(opregistry.GVKDependency{ + Group: a.Group, + Kind: a.Kind, + Version: a.Version, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Dependency{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if len(out) == 0 { + return nil + } + return +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go index c0d003da5c..77d16234a8 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/labeler.go @@ -1,8 +1,13 @@ package olm import ( + "fmt" + "strings" + + "github.com/operator-framework/api/pkg/operators/v1alpha1" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/registry" + opregistry "github.com/operator-framework/operator-registry/pkg/registry" extv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" extv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" "k8s.io/apimachinery/pkg/labels" @@ -13,9 +18,41 @@ const ( APILabelKeyPrefix = "olm.api." ) -type operatorSurface interface { - GetProvidedAPIs() cache.APISet - GetRequiredAPIs() cache.APISet +type operatorSurface struct { + ProvidedAPIs cache.APISet + RequiredAPIs cache.APISet +} + +func apiSurfaceOfCSV(csv *v1alpha1.ClusterServiceVersion) (*operatorSurface, error) { + surface := operatorSurface{ + ProvidedAPIs: cache.EmptyAPISet(), + RequiredAPIs: cache.EmptyAPISet(), + } + + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + surface.ProvidedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Owned { + surface.ProvidedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + requiredAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Required { + requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + return &surface, nil } // LabelSetsFor returns API label sets for the given object. @@ -35,14 +72,14 @@ func LabelSetsFor(obj interface{}) ([]labels.Set, error) { func labelSetsForOperatorSurface(surface operatorSurface) ([]labels.Set, error) { labelSet := labels.Set{} - for key := range surface.GetProvidedAPIs().StripPlural() { + for key := range surface.ProvidedAPIs.StripPlural() { hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err } labelSet[APILabelKeyPrefix+hash] = "provided" } - for key := range surface.GetRequiredAPIs().StripPlural() { + for key := range surface.RequiredAPIs.StripPlural() { hash, err := cache.APIKeyToGVKHash(key) if err != nil { return nil, err diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go index b2e6e80662..0e9ef969d2 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operator.go @@ -37,7 +37,6 @@ import ( "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/install" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/internal/pruning" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/overrides" - resolvercache "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/clients" csvutility "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/csv" "github.com/operator-framework/operator-lifecycle-manager/pkg/lib/event" @@ -1381,7 +1380,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v out = in.DeepCopy() now := a.now() - operatorSurface, err := resolvercache.NewOperatorFromV1Alpha1CSV(out) + operatorSurface, err := apiSurfaceOfCSV(out) if err != nil { // If the resolver is unable to retrieve the operator info from the CSV the CSV requires changes, a syncError should not be returned. logger.WithError(err).Warn("Unable to retrieve operator information from CSV") @@ -1445,7 +1444,7 @@ func (a *Operator) transitionCSVState(in v1alpha1.ClusterServiceVersion) (out *v groupSurface := NewOperatorGroup(operatorGroup) otherGroupSurfaces := NewOperatorGroupSurfaces(otherGroups...) - providedAPIs := operatorSurface.GetProvidedAPIs().StripPlural() + providedAPIs := operatorSurface.ProvidedAPIs.StripPlural() switch result := a.apiReconciler.Reconcile(providedAPIs, groupSurface, otherGroupSurfaces...); { case operatorGroup.Spec.StaticProvidedAPIs && (result == AddAPIs || result == RemoveAPIs): diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go index 8a2871a312..0bc563d020 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/operators/olm/operatorgroup.go @@ -309,12 +309,12 @@ func (a *Operator) providedAPIsFromCSVs(group *v1.OperatorGroup, logger *logrus. // TODO: Throw out CSVs that aren't members of the group due to group related failures? // Union the providedAPIsFromCSVs from existing members of the group - operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := apiSurfaceOfCSV(csv) if err != nil { logger.WithError(err).Warn("could not create OperatorSurface from csv") continue } - for providedAPI := range operatorSurface.GetProvidedAPIs().StripPlural() { + for providedAPI := range operatorSurface.ProvidedAPIs.StripPlural() { providedAPIsFromCSVs[providedAPI] = csv } } @@ -1051,12 +1051,12 @@ func (a *Operator) findCSVsThatProvideAnyOf(provide cache.APISet) ([]*v1alpha1.C continue } - operatorSurface, err := cache.NewOperatorFromV1Alpha1CSV(csv) + operatorSurface, err := apiSurfaceOfCSV(csv) if err != nil { continue } - if len(operatorSurface.GetProvidedAPIs().StripPlural().Intersection(provide)) > 0 { + if len(operatorSurface.ProvidedAPIs.StripPlural().Intersection(provide)) > 0 { providers = append(providers, csv) } } diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go index 1c43077935..ae71784b45 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/operators.go @@ -1,7 +1,6 @@ package cache import ( - "encoding/json" "fmt" "hash/fnv" "sort" @@ -213,361 +212,27 @@ type Operator struct { ProvidedAPIs APISet RequiredAPIs APISet Version *semver.Version - Bundle *api.Bundle SourceInfo *OperatorSourceInfo Properties []*api.Property -} - -func NewOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey SourceKey, defaultChannel string) (*Operator, error) { - parsedVersion, err := semver.ParseTolerant(bundle.Version) - version := &parsedVersion - if err != nil { - version = nil - } - provided := APISet{} - for _, gvk := range bundle.ProvidedApis { - provided[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} - } - required := APISet{} - for _, gvk := range bundle.RequiredApis { - required[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} - } - sourceInfo := &OperatorSourceInfo{ - Package: bundle.PackageName, - Channel: bundle.ChannelName, - StartingCSV: startingCSV, - Catalog: sourceKey, - } - sourceInfo.DefaultChannel = sourceInfo.Channel == defaultChannel - - // legacy support - if the api doesn't contain properties/dependencies, build them from required/provided apis - properties := bundle.Properties - if len(properties) == 0 { - properties, err = providedAPIsToProperties(provided) - if err != nil { - return nil, err - } - } - if len(bundle.Dependencies) > 0 { - ps, err := LegacyDependenciesToProperties(bundle.Dependencies) - if err != nil { - return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) - } - properties = append(properties, ps...) - } else { - ps, err := RequiredAPIsToProperties(required) - if err != nil { - return nil, err - } - properties = append(properties, ps...) - } - - o := &Operator{ - Name: bundle.CsvName, - Replaces: bundle.Replaces, - Version: version, - ProvidedAPIs: provided, - RequiredAPIs: required, - Bundle: bundle, - SourceInfo: sourceInfo, - Properties: properties, - Skips: bundle.Skips, - } + BundlePath string - if r, err := semver.ParseRange(o.Bundle.SkipRange); err == nil { - o.SkipRange = r - } - - if !o.Inline() { - // TODO: Extract any necessary information from the Bundle - // up-front and remove the bundle field altogether. For now, - // take the easy opportunity to save heap space by discarding - // two of the worst offenders. - bundle.CsvJson = "" - bundle.Object = nil - } - - return o, nil -} - -func NewOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*Operator, error) { - providedAPIs := EmptyAPISet() - for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { - parts := strings.SplitN(crdDef.Name, ".", 2) - if len(parts) < 2 { - return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) - } - providedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} - } - for _, api := range csv.Spec.APIServiceDefinitions.Owned { - providedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} - } - - requiredAPIs := EmptyAPISet() - for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { - parts := strings.SplitN(crdDef.Name, ".", 2) - if len(parts) < 2 { - return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) - } - requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} - } - for _, api := range csv.Spec.APIServiceDefinitions.Required { - requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} - } - - properties, err := providedAPIsToProperties(providedAPIs) - if err != nil { - return nil, err - } - dependencies, err := RequiredAPIsToProperties(requiredAPIs) - if err != nil { - return nil, err - } - properties = append(properties, dependencies...) - - return &Operator{ - Name: csv.GetName(), - Version: &csv.Spec.Version.Version, - ProvidedAPIs: providedAPIs, - RequiredAPIs: requiredAPIs, - SourceInfo: &ExistingOperator, - Properties: properties, - }, nil -} - -func (o *Operator) GetProvidedAPIs() APISet { - return o.ProvidedAPIs -} - -func (o *Operator) GetRequiredAPIs() APISet { - return o.RequiredAPIs + // Present exclusively to pipe inlined bundle + // content. Resolver components shouldn't need to read this, + // and it should eventually be possible to remove the field + // altogether. + Bundle *api.Bundle } func (o *Operator) Package() string { - if o.Bundle != nil { - return o.Bundle.PackageName + if si := o.SourceInfo; si != nil { + return si.Package } return "" } func (o *Operator) Channel() string { - if o.Bundle != nil { - return o.Bundle.ChannelName + if si := o.SourceInfo; si != nil { + return si.Channel } return "" } - -func (o *Operator) Inline() bool { - return o.Bundle != nil && o.Bundle.GetBundlePath() == "" -} - -func (o *Operator) DependencyPredicates() (predicates []OperatorPredicate, err error) { - predicates = make([]OperatorPredicate, 0) - for _, property := range o.Properties { - predicate, err := PredicateForProperty(property) - if err != nil { - return nil, err - } - if predicate == nil { - continue - } - predicates = append(predicates, predicate) - } - return -} - -func RequiredAPIsToProperties(apis APISet) (out []*api.Property, err error) { - if len(apis) == 0 { - return - } - out = make([]*api.Property, 0) - for a := range apis { - val, err := json.Marshal(struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - }{ - Group: a.Group, - Version: a.Version, - Kind: a.Kind, - }) - if err != nil { - return nil, err - } - out = append(out, &api.Property{ - Type: "olm.gvk.required", - Value: string(val), - }) - } - if len(out) > 0 { - return - } - return nil, nil -} - -func providedAPIsToProperties(apis APISet) (out []*api.Property, err error) { - out = make([]*api.Property, 0) - for a := range apis { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Version: a.Version, - Kind: a.Kind, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if len(out) > 0 { - return - } - return nil, nil -} - -func LegacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { - var result []*api.Property - for _, dependency := range dependencies { - switch dependency.Type { - case "olm.gvk": - type gvk struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - } - var vfrom gvk - if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { - return nil, fmt.Errorf("failed to unmarshal legacy 'olm.gvk' dependency: %w", err) - } - vto := gvk{ - Group: vfrom.Group, - Version: vfrom.Version, - Kind: vfrom.Kind, - } - vb, err := json.Marshal(&vto) - if err != nil { - return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) - } - result = append(result, &api.Property{ - Type: "olm.gvk.required", - Value: string(vb), - }) - case "olm.package": - var vfrom struct { - PackageName string `json:"packageName"` - VersionRange string `json:"version"` - } - if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { - return nil, fmt.Errorf("failed to unmarshal legacy 'olm.package' dependency: %w", err) - } - vto := struct { - PackageName string `json:"packageName"` - VersionRange string `json:"versionRange"` - }{ - PackageName: vfrom.PackageName, - VersionRange: vfrom.VersionRange, - } - vb, err := json.Marshal(&vto) - if err != nil { - return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) - } - result = append(result, &api.Property{ - Type: "olm.package.required", - Value: string(vb), - }) - case "olm.label": - result = append(result, &api.Property{ - Type: "olm.label.required", - Value: dependency.Value, - }) - } - } - return result, nil -} - -func APISetToProperties(crds, apis APISet, deprecated bool) (out []*api.Property) { - out = make([]*api.Property, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKProperty{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if deprecated { - val, err := json.Marshal(opregistry.DeprecatedProperty{}) - if err != nil { - panic(err) - } - out = append(out, &api.Property{ - Type: opregistry.DeprecatedType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} - -func APISetToDependencies(crds, apis APISet) (out []*api.Dependency) { - if len(crds)+len(apis) == 0 { - return nil - } - out = make([]*api.Dependency, 0) - for a := range crds { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - for a := range apis { - val, err := json.Marshal(opregistry.GVKDependency{ - Group: a.Group, - Kind: a.Kind, - Version: a.Version, - }) - if err != nil { - panic(err) - } - out = append(out, &api.Dependency{ - Type: opregistry.GVKType, - Value: string(val), - }) - } - if len(out) == 0 { - return nil - } - return -} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go index 292dda4805..66f1d28c5a 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache/predicates.go @@ -7,7 +7,6 @@ import ( "github.com/blang/semver/v4" - "github.com/operator-framework/operator-registry/pkg/api" opregistry "github.com/operator-framework/operator-registry/pkg/registry" ) @@ -41,10 +40,10 @@ func (ch channelPredicate) Test(o *Operator) bool { if string(ch) == "" { return true } - if o.Bundle == nil { - return false + if si := o.SourceInfo; si != nil { + return si.Channel == string(ch) } - return o.Bundle.ChannelName == string(ch) + return false } func (ch channelPredicate) String() string { @@ -322,67 +321,11 @@ func (c countingPredicate) Test(o *Operator) bool { } return false } + func (c countingPredicate) String() string { return c.p.String() } + func CountingPredicate(p OperatorPredicate, n *int) OperatorPredicate { return countingPredicate{p: p, n: n} } - -func PredicateForProperty(property *api.Property) (OperatorPredicate, error) { - if property == nil { - return nil, nil - } - p, ok := predicates[property.Type] - if !ok { - return nil, nil - } - return p(property.Value) -} - -var predicates = map[string]func(string) (OperatorPredicate, error){ - "olm.gvk.required": predicateForRequiredGVKProperty, - "olm.package.required": predicateForRequiredPackageProperty, - "olm.label.required": predicateForRequiredLabelProperty, -} - -func predicateForRequiredGVKProperty(value string) (OperatorPredicate, error) { - var gvk struct { - Group string `json:"group"` - Version string `json:"version"` - Kind string `json:"kind"` - } - if err := json.Unmarshal([]byte(value), &gvk); err != nil { - return nil, err - } - return ProvidingAPIPredicate(opregistry.APIKey{ - Group: gvk.Group, - Version: gvk.Version, - Kind: gvk.Kind, - }), nil -} - -func predicateForRequiredPackageProperty(value string) (OperatorPredicate, error) { - var pkg struct { - PackageName string `json:"packageName"` - VersionRange string `json:"versionRange"` - } - if err := json.Unmarshal([]byte(value), &pkg); err != nil { - return nil, err - } - ver, err := semver.ParseRange(pkg.VersionRange) - if err != nil { - return nil, err - } - return And(PkgPredicate(pkg.PackageName), VersionInRangePredicate(ver, pkg.VersionRange)), nil -} - -func predicateForRequiredLabelProperty(value string) (OperatorPredicate, error) { - var label struct { - Label string `json:"label"` - } - if err := json.Unmarshal([]byte(value), &label); err != nil { - return nil, err - } - return LabelPredicate(label.Label), nil -} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go index 38e779acd3..f7a5e6afeb 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/resolver.go @@ -76,7 +76,7 @@ func (r *SatResolver) SolveOperators(namespaces []string, csvs []*v1alpha1.Clust var current *cache.Operator for _, csv := range csvs { if csv.Name == sub.Status.InstalledCSV { - op, err := cache.NewOperatorFromV1Alpha1CSV(csv) + op, err := newOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -181,7 +181,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu Namespace: sub.Spec.CatalogSourceNamespace, } - var bundles []*cache.Operator + var entries []*cache.Operator { var nall, npkg, nch, ncsv int @@ -200,7 +200,7 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu cache.CountingPredicate(cache.ChannelPredicate(sub.Spec.Channel), &nch), cache.CountingPredicate(csvPredicate, &ncsv), )) - bundles = namespacedCache.Catalog(catalog).Find(cachePredicates...) + entries = namespacedCache.Catalog(catalog).Find(cachePredicates...) var si solver.Installable switch { @@ -220,36 +220,40 @@ func (r *SatResolver) getSubscriptionInstallables(sub *v1alpha1.Subscription, cu } } - // bundles in the default channel appear first, then lexicographically order by channel name - sort.SliceStable(bundles, func(i, j int) bool { + // entries in the default channel appear first, then lexicographically order by channel name + sort.SliceStable(entries, func(i, j int) bool { var idef bool - if isrc := bundles[i].SourceInfo; isrc != nil { + var ichan string + if isrc := entries[i].SourceInfo; isrc != nil { idef = isrc.DefaultChannel + ichan = isrc.Channel } var jdef bool - if jsrc := bundles[j].SourceInfo; jsrc != nil { + var jchan string + if jsrc := entries[j].SourceInfo; jsrc != nil { jdef = jsrc.DefaultChannel + jchan = jsrc.Channel } if idef == jdef { - return bundles[i].Bundle.ChannelName < bundles[j].Bundle.ChannelName + return ichan < jchan } return idef }) var sortedBundles []*cache.Operator lastChannel, lastIndex := "", 0 - for i := 0; i <= len(bundles); i++ { - if i != len(bundles) && bundles[i].Bundle.ChannelName == lastChannel { + for i := 0; i <= len(entries); i++ { + if i != len(entries) && entries[i].Channel() == lastChannel { continue } - channel, err := sortChannel(bundles[lastIndex:i]) + channel, err := sortChannel(entries[lastIndex:i]) if err != nil { return nil, err } sortedBundles = append(sortedBundles, channel...) - if i != len(bundles) { - lastChannel = bundles[i].Bundle.ChannelName + if i != len(entries) { + lastChannel = entries[i].Channel() lastIndex = i } } @@ -333,7 +337,7 @@ func (r *SatResolver) getBundleInstallables(preferredNamespace string, bundleSta visited[bundle] = &bundleInstallable - dependencyPredicates, err := bundle.DependencyPredicates() + dependencyPredicates, err := DependencyPredicates(bundle.Properties) if err != nil { errs = append(errs, err) continue @@ -470,7 +474,7 @@ func (r *SatResolver) newSnapshotForNamespace(namespace string, subs []*v1alpha1 var csvsMissingProperties []*v1alpha1.ClusterServiceVersion standaloneOperators := make([]*cache.Operator, 0) for _, csv := range csvs { - op, err := cache.NewOperatorFromV1Alpha1CSV(csv) + op, err := newOperatorFromV1Alpha1CSV(csv) if err != nil { return nil, err } @@ -728,3 +732,172 @@ func sortChannel(bundles []*cache.Operator) ([]*cache.Operator, error) { // TODO: do we care if the channel doesn't include every bundle in the input? return chains[0], nil } + +func DependencyPredicates(properties []*api.Property) ([]cache.OperatorPredicate, error) { + var predicates []cache.OperatorPredicate + for _, property := range properties { + predicate, err := predicateForProperty(property) + if err != nil { + return nil, err + } + if predicate == nil { + continue + } + predicates = append(predicates, predicate) + } + return predicates, nil +} + +func predicateForProperty(property *api.Property) (cache.OperatorPredicate, error) { + if property == nil { + return nil, nil + } + p, ok := predicates[property.Type] + if !ok { + return nil, nil + } + return p(property.Value) +} + +var predicates = map[string]func(string) (cache.OperatorPredicate, error){ + "olm.gvk.required": predicateForRequiredGVKProperty, + "olm.package.required": predicateForRequiredPackageProperty, + "olm.label.required": predicateForRequiredLabelProperty, +} + +func predicateForRequiredGVKProperty(value string) (cache.OperatorPredicate, error) { + var gvk struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + } + if err := json.Unmarshal([]byte(value), &gvk); err != nil { + return nil, err + } + return cache.ProvidingAPIPredicate(opregistry.APIKey{ + Group: gvk.Group, + Version: gvk.Version, + Kind: gvk.Kind, + }), nil +} + +func predicateForRequiredPackageProperty(value string) (cache.OperatorPredicate, error) { + var pkg struct { + PackageName string `json:"packageName"` + VersionRange string `json:"versionRange"` + } + if err := json.Unmarshal([]byte(value), &pkg); err != nil { + return nil, err + } + ver, err := semver.ParseRange(pkg.VersionRange) + if err != nil { + return nil, err + } + return cache.And(cache.PkgPredicate(pkg.PackageName), cache.VersionInRangePredicate(ver, pkg.VersionRange)), nil +} + +func predicateForRequiredLabelProperty(value string) (cache.OperatorPredicate, error) { + var label struct { + Label string `json:"label"` + } + if err := json.Unmarshal([]byte(value), &label); err != nil { + return nil, err + } + return cache.LabelPredicate(label.Label), nil +} + +func newOperatorFromV1Alpha1CSV(csv *v1alpha1.ClusterServiceVersion) (*cache.Operator, error) { + providedAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Owned { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + providedAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Owned { + providedAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + requiredAPIs := cache.EmptyAPISet() + for _, crdDef := range csv.Spec.CustomResourceDefinitions.Required { + parts := strings.SplitN(crdDef.Name, ".", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("error parsing crd name: %s", crdDef.Name) + } + requiredAPIs[opregistry.APIKey{Plural: parts[0], Group: parts[1], Version: crdDef.Version, Kind: crdDef.Kind}] = struct{}{} + } + for _, api := range csv.Spec.APIServiceDefinitions.Required { + requiredAPIs[opregistry.APIKey{Group: api.Group, Version: api.Version, Kind: api.Kind, Plural: api.Name}] = struct{}{} + } + + properties, err := providedAPIsToProperties(providedAPIs) + if err != nil { + return nil, err + } + dependencies, err := requiredAPIsToProperties(requiredAPIs) + if err != nil { + return nil, err + } + properties = append(properties, dependencies...) + + return &cache.Operator{ + Name: csv.GetName(), + Version: &csv.Spec.Version.Version, + ProvidedAPIs: providedAPIs, + RequiredAPIs: requiredAPIs, + SourceInfo: &cache.ExistingOperator, + Properties: properties, + }, nil +} + +func providedAPIsToProperties(apis cache.APISet) (out []*api.Property, err error) { + out = make([]*api.Property, 0) + for a := range apis { + val, err := json.Marshal(opregistry.GVKProperty{ + Group: a.Group, + Version: a.Version, + Kind: a.Kind, + }) + if err != nil { + panic(err) + } + out = append(out, &api.Property{ + Type: opregistry.GVKType, + Value: string(val), + }) + } + if len(out) > 0 { + return + } + return nil, nil +} + +func requiredAPIsToProperties(apis cache.APISet) (out []*api.Property, err error) { + if len(apis) == 0 { + return + } + out = make([]*api.Property, 0) + for a := range apis { + val, err := json.Marshal(struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + }{ + Group: a.Group, + Version: a.Version, + Kind: a.Kind, + }) + if err != nil { + return nil, err + } + out = append(out, &api.Property{ + Type: "olm.gvk.required", + Value: string(val), + }) + } + if len(out) > 0 { + return + } + return nil, nil +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go index 6c5c11998d..eaea2568f9 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/source_registry.go @@ -5,6 +5,7 @@ import ( "encoding/json" "fmt" + "github.com/blang/semver/v4" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry" "github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/cache" "github.com/operator-framework/operator-registry/pkg/api" @@ -58,7 +59,7 @@ func (s *registrySource) Snapshot(ctx context.Context) (*cache.Snapshot, error) defaultChannel = p.DefaultChannelName } } - o, err := cache.NewOperatorFromBundle(b, "", s.key, defaultChannel) + o, err := newOperatorFromBundle(b, "", s.key, defaultChannel) if err != nil { s.logger.Printf("failed to construct operator from bundle, continuing: %v", err) continue @@ -107,3 +108,132 @@ func EnsurePackageProperty(o *cache.Operator, name, version string) { Value: string(bytes), }) } + +func newOperatorFromBundle(bundle *api.Bundle, startingCSV string, sourceKey cache.SourceKey, defaultChannel string) (*cache.Operator, error) { + parsedVersion, err := semver.ParseTolerant(bundle.Version) + version := &parsedVersion + if err != nil { + version = nil + } + provided := cache.APISet{} + for _, gvk := range bundle.ProvidedApis { + provided[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} + } + required := cache.APISet{} + for _, gvk := range bundle.RequiredApis { + required[opregistry.APIKey{Plural: gvk.Plural, Group: gvk.Group, Kind: gvk.Kind, Version: gvk.Version}] = struct{}{} + } + sourceInfo := &cache.OperatorSourceInfo{ + Package: bundle.PackageName, + Channel: bundle.ChannelName, + StartingCSV: startingCSV, + Catalog: sourceKey, + } + sourceInfo.DefaultChannel = sourceInfo.Channel == defaultChannel + + // legacy support - if the api doesn't contain properties/dependencies, build them from required/provided apis + properties := bundle.Properties + if len(properties) == 0 { + properties, err = providedAPIsToProperties(provided) + if err != nil { + return nil, err + } + } + if len(bundle.Dependencies) > 0 { + ps, err := legacyDependenciesToProperties(bundle.Dependencies) + if err != nil { + return nil, fmt.Errorf("failed to translate legacy dependencies to properties: %w", err) + } + properties = append(properties, ps...) + } else { + ps, err := requiredAPIsToProperties(required) + if err != nil { + return nil, err + } + properties = append(properties, ps...) + } + + o := &cache.Operator{ + Name: bundle.CsvName, + Replaces: bundle.Replaces, + Version: version, + ProvidedAPIs: provided, + RequiredAPIs: required, + SourceInfo: sourceInfo, + Properties: properties, + Skips: bundle.Skips, + BundlePath: bundle.BundlePath, + } + + if r, err := semver.ParseRange(bundle.SkipRange); err == nil { + o.SkipRange = r + } + + if o.BundlePath == "" { + // This bundle's content is embedded within the Bundle + // proto message, not specified via image reference. + o.Bundle = bundle + } + + return o, nil +} + +func legacyDependenciesToProperties(dependencies []*api.Dependency) ([]*api.Property, error) { + var result []*api.Property + for _, dependency := range dependencies { + switch dependency.Type { + case "olm.gvk": + type gvk struct { + Group string `json:"group"` + Version string `json:"version"` + Kind string `json:"kind"` + } + var vfrom gvk + if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { + return nil, fmt.Errorf("failed to unmarshal legacy 'olm.gvk' dependency: %w", err) + } + vto := gvk{ + Group: vfrom.Group, + Version: vfrom.Version, + Kind: vfrom.Kind, + } + vb, err := json.Marshal(&vto) + if err != nil { + return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) + } + result = append(result, &api.Property{ + Type: "olm.gvk.required", + Value: string(vb), + }) + case "olm.package": + var vfrom struct { + PackageName string `json:"packageName"` + VersionRange string `json:"version"` + } + if err := json.Unmarshal([]byte(dependency.Value), &vfrom); err != nil { + return nil, fmt.Errorf("failed to unmarshal legacy 'olm.package' dependency: %w", err) + } + vto := struct { + PackageName string `json:"packageName"` + VersionRange string `json:"versionRange"` + }{ + PackageName: vfrom.PackageName, + VersionRange: vfrom.VersionRange, + } + vb, err := json.Marshal(&vto) + if err != nil { + return nil, fmt.Errorf("unexpected error marshaling generated 'olm.package.required' property: %w", err) + } + result = append(result, &api.Property{ + Type: "olm.package.required", + Value: string(vb), + }) + case "olm.label": + result = append(result, &api.Property{ + Type: "olm.label.required", + Value: dependency.Value, + }) + } + } + return result, nil +} diff --git a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go index 7574dda57c..079b928065 100644 --- a/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go +++ b/vendor/github.com/operator-framework/operator-lifecycle-manager/pkg/controller/registry/resolver/step_resolver.go @@ -137,57 +137,55 @@ func (r *OperatorStepResolver) ResolveSteps(namespace string) ([]*v1alpha1.Step, // add steps for any new bundle if op.Bundle != nil { - if op.Inline() { - bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) - if err != nil { - return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) - } - steps = append(steps, bundleSteps...) - } else { - lookup := v1alpha1.BundleLookup{ - Path: op.Bundle.GetBundlePath(), - Identifier: op.Name, - Replaces: op.Replaces, - CatalogSourceRef: &corev1.ObjectReference{ - Namespace: op.SourceInfo.Catalog.Namespace, - Name: op.SourceInfo.Catalog.Name, + bundleSteps, err := NewStepsFromBundle(op.Bundle, namespace, op.Replaces, op.SourceInfo.Catalog.Name, op.SourceInfo.Catalog.Namespace) + if err != nil { + return nil, nil, nil, fmt.Errorf("failed to turn bundle into steps: %s", err.Error()) + } + steps = append(steps, bundleSteps...) + } else { + lookup := v1alpha1.BundleLookup{ + Path: op.BundlePath, + Identifier: op.Name, + Replaces: op.Replaces, + CatalogSourceRef: &corev1.ObjectReference{ + Namespace: op.SourceInfo.Catalog.Namespace, + Name: op.SourceInfo.Catalog.Name, + }, + Conditions: []v1alpha1.BundleLookupCondition{ + { + Type: BundleLookupConditionPacked, + Status: corev1.ConditionTrue, + Reason: controllerbundle.NotUnpackedReason, + Message: controllerbundle.NotUnpackedMessage, }, - Conditions: []v1alpha1.BundleLookupCondition{ - { - Type: BundleLookupConditionPacked, - Status: corev1.ConditionTrue, - Reason: controllerbundle.NotUnpackedReason, - Message: controllerbundle.NotUnpackedMessage, - }, - { - Type: v1alpha1.BundleLookupPending, - Status: corev1.ConditionTrue, - Reason: controllerbundle.JobNotStartedReason, - Message: controllerbundle.JobNotStartedMessage, - }, + { + Type: v1alpha1.BundleLookupPending, + Status: corev1.ConditionTrue, + Reason: controllerbundle.JobNotStartedReason, + Message: controllerbundle.JobNotStartedMessage, }, - } - if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { - return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) - } else { - lookup.Properties = anno - } - bundleLookups = append(bundleLookups, lookup) + }, } + if anno, err := projection.PropertiesAnnotationFromPropertyList(op.Properties); err != nil { + return nil, nil, nil, fmt.Errorf("failed to serialize operator properties for %q: %w", op.Name, err) + } else { + lookup.Properties = anno + } + bundleLookups = append(bundleLookups, lookup) + } - if len(existingSubscriptions) == 0 { - // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions - op.SourceInfo.StartingCSV = op.Name - subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) - if err != nil { - return nil, nil, nil, err - } - steps = append(steps, &v1alpha1.Step{ - Resolving: name, - Resource: subStep, - Status: v1alpha1.StepStatusUnknown, - }) + if len(existingSubscriptions) == 0 { + // explicitly track the resolved CSV as the starting CSV on the resolved subscriptions + op.SourceInfo.StartingCSV = op.Name + subStep, err := NewSubscriptionStepResource(namespace, *op.SourceInfo) + if err != nil { + return nil, nil, nil, err } + steps = append(steps, &v1alpha1.Step{ + Resolving: name, + Resource: subStep, + Status: v1alpha1.StepStatusUnknown, + }) } // add steps for subscriptions for bundles that were added through resolution From 9ce4dcf4fead9567e4e45a11b7c87bacf901cfa5 Mon Sep 17 00:00:00 2001 From: Laxmikant Bhaskar Pandhare <47066536+laxmikantbpandhare@users.noreply.github.com> Date: Tue, 7 Sep 2021 19:03:20 -0700 Subject: [PATCH 37/45] modified the controller-runtime and controller-tools versions (#154) * modified the controller-runtime and controller-tools versions * ran vendor command and added files * ran make manifests Upstream-repository: api Upstream-commit: a80624eab36b2005fa5d84c9b539bb4817e44daa --- go.mod | 16 +- go.sum | 194 ++++- .../operators.coreos.com_catalogsources.yaml | 2 +- ...ors.coreos.com_clusterserviceversions.yaml | 2 +- .../operators.coreos.com_installplans.yaml | 2 +- ...erators.coreos.com_operatorconditions.yaml | 2 +- .../operators.coreos.com_operatorgroups.yaml | 2 +- .../crds/operators.coreos.com_operators.yaml | 2 +- .../operators.coreos.com_subscriptions.yaml | 2 +- staging/api/crds/zz_defs.go | 14 +- staging/api/go.mod | 14 +- staging/api/go.sum | 231 ++++- .../go/compute/metadata/metadata.go | 3 +- .../mitchellh/mapstructure/.travis.yml | 8 - .../mitchellh/mapstructure/CHANGELOG.md | 52 ++ .../mitchellh/mapstructure/decode_hooks.go | 71 +- .../github.com/mitchellh/mapstructure/go.mod | 2 + .../mitchellh/mapstructure/mapstructure.go | 479 +++++++++-- vendor/github.com/onsi/gomega/types/types.go | 69 +- .../operators.coreos.com_catalogsources.yaml | 2 +- ...ors.coreos.com_clusterserviceversions.yaml | 2 +- .../operators.coreos.com_installplans.yaml | 2 +- ...erators.coreos.com_operatorconditions.yaml | 2 +- .../operators.coreos.com_operatorgroups.yaml | 2 +- .../crds/operators.coreos.com_operators.yaml | 2 +- .../operators.coreos.com_subscriptions.yaml | 2 +- .../operator-framework/api/crds/zz_defs.go | 14 +- vendor/github.com/spf13/cobra/.travis.yml | 28 - vendor/github.com/spf13/cobra/README.md | 663 +-------------- .../spf13/cobra/bash_completions.go | 6 +- .../spf13/cobra/bash_completions.md | 2 + .../spf13/cobra/bash_completionsV2.go | 302 +++++++ vendor/github.com/spf13/cobra/command.go | 30 +- .../{custom_completions.go => completions.go} | 266 +++++- .../spf13/cobra/fish_completions.go | 178 ++-- vendor/github.com/spf13/cobra/go.mod | 5 +- vendor/github.com/spf13/cobra/go.sum | 461 ++++++++-- .../spf13/cobra/powershell_completions.go | 32 +- .../spf13/cobra/shell_completions.md | 69 +- vendor/github.com/spf13/cobra/user_guide.md | 637 ++++++++++++++ .../github.com/spf13/cobra/zsh_completions.go | 50 +- vendor/go.opencensus.io/.travis.yml | 17 - vendor/go.opencensus.io/Makefile | 27 +- vendor/go.opencensus.io/go.mod | 15 +- vendor/go.opencensus.io/go.sum | 82 +- vendor/go.opencensus.io/trace/basetypes.go | 10 + vendor/go.opencensus.io/trace/lrumap.go | 2 +- vendor/go.opencensus.io/trace/spanstore.go | 14 +- vendor/go.opencensus.io/trace/trace.go | 187 ++-- vendor/go.opencensus.io/trace/trace_api.go | 265 ++++++ vendor/go.uber.org/zap/CHANGELOG.md | 44 + vendor/go.uber.org/zap/buffer/buffer.go | 18 + vendor/go.uber.org/zap/go.mod | 2 + vendor/go.uber.org/zap/go.sum | 26 +- vendor/go.uber.org/zap/logger.go | 9 +- vendor/go.uber.org/zap/options.go | 8 + vendor/go.uber.org/zap/sugar.go | 4 +- .../zap/zapcore/buffered_write_syncer.go | 188 +++++ vendor/go.uber.org/zap/zapcore/clock.go | 50 ++ vendor/go.uber.org/zap/zapcore/entry.go | 10 +- vendor/go.uber.org/zap/zapcore/error.go | 2 +- vendor/go.uber.org/zap/zapcore/sampler.go | 14 +- vendor/golang.org/x/oauth2/README.md | 10 +- vendor/golang.org/x/oauth2/go.mod | 7 +- vendor/golang.org/x/oauth2/go.sum | 359 +++++++- .../x/oauth2/google/appengine_gen1.go | 1 + .../x/oauth2/google/appengine_gen2_flex.go | 1 + vendor/golang.org/x/oauth2/google/default.go | 14 +- vendor/golang.org/x/oauth2/google/doc.go | 43 +- vendor/golang.org/x/oauth2/google/google.go | 25 + .../google/internal/externalaccount/aws.go | 466 ++++++++++ .../externalaccount/basecredentials.go | 163 ++++ .../internal/externalaccount/clientauth.go | 41 + .../google/internal/externalaccount/err.go | 18 + .../externalaccount/filecredsource.go | 57 ++ .../internal/externalaccount/impersonate.go | 83 ++ .../internal/externalaccount/sts_exchange.go | 104 +++ .../internal/externalaccount/urlcredsource.go | 74 ++ .../x/oauth2/internal/client_appengine.go | 1 + vendor/golang.org/x/sys/unix/ifreq_linux.go | 109 +++ vendor/golang.org/x/sys/unix/ioctl_linux.go | 78 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 2 - vendor/golang.org/x/sys/unix/syscall_linux.go | 17 +- .../x/sys/unix/syscall_linux_386.go | 4 +- .../x/sys/unix/syscall_linux_arm.go | 4 +- .../x/sys/unix/syscall_linux_arm64.go | 4 +- .../x/sys/unix/syscall_linux_mipsx.go | 4 +- .../x/sys/unix/syscall_linux_ppc.go | 4 +- .../golang.org/x/sys/unix/syscall_solaris.go | 240 ++++++ vendor/golang.org/x/sys/unix/syscall_unix.go | 4 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 34 +- .../x/sys/unix/zerrors_linux_386.go | 1 + .../x/sys/unix/zerrors_linux_amd64.go | 1 + .../x/sys/unix/zerrors_linux_arm.go | 1 + .../x/sys/unix/zerrors_linux_arm64.go | 1 + .../x/sys/unix/zerrors_linux_mips.go | 1 + .../x/sys/unix/zerrors_linux_mips64.go | 1 + .../x/sys/unix/zerrors_linux_mips64le.go | 1 + .../x/sys/unix/zerrors_linux_mipsle.go | 1 + .../x/sys/unix/zerrors_linux_ppc.go | 1 + .../x/sys/unix/zerrors_linux_ppc64.go | 1 + .../x/sys/unix/zerrors_linux_ppc64le.go | 1 + .../x/sys/unix/zerrors_linux_riscv64.go | 1 + .../x/sys/unix/zerrors_linux_s390x.go | 1 + .../x/sys/unix/zerrors_linux_sparc64.go | 1 + .../x/sys/unix/zerrors_openbsd_386.go | 3 + .../x/sys/unix/zerrors_openbsd_arm.go | 3 + .../golang.org/x/sys/unix/zsyscall_linux.go | 12 +- .../x/sys/unix/zsyscall_solaris_amd64.go | 72 +- .../x/sys/unix/zsysnum_linux_386.go | 3 + .../x/sys/unix/zsysnum_linux_amd64.go | 711 ++++++++-------- .../x/sys/unix/zsysnum_linux_arm.go | 3 + .../x/sys/unix/zsysnum_linux_arm64.go | 601 ++++++------- .../x/sys/unix/zsysnum_linux_mips.go | 3 + .../x/sys/unix/zsysnum_linux_mips64.go | 697 +++++++-------- .../x/sys/unix/zsysnum_linux_mips64le.go | 697 +++++++-------- .../x/sys/unix/zsysnum_linux_mipsle.go | 3 + .../x/sys/unix/zsysnum_linux_ppc.go | 3 + .../x/sys/unix/zsysnum_linux_ppc64.go | 795 +++++++++--------- .../x/sys/unix/zsysnum_linux_ppc64le.go | 795 +++++++++--------- .../x/sys/unix/zsysnum_linux_riscv64.go | 599 ++++++------- .../x/sys/unix/zsysnum_linux_s390x.go | 725 ++++++++-------- .../x/sys/unix/zsysnum_linux_sparc64.go | 753 ++++++++--------- vendor/golang.org/x/sys/unix/ztypes_linux.go | 18 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 5 + .../x/sys/unix/ztypes_linux_amd64.go | 5 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 5 + .../x/sys/unix/ztypes_linux_arm64.go | 5 + .../x/sys/unix/ztypes_linux_mips.go | 5 + .../x/sys/unix/ztypes_linux_mips64.go | 5 + .../x/sys/unix/ztypes_linux_mips64le.go | 5 + .../x/sys/unix/ztypes_linux_mipsle.go | 5 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 5 + .../x/sys/unix/ztypes_linux_ppc64.go | 5 + .../x/sys/unix/ztypes_linux_ppc64le.go | 5 + .../x/sys/unix/ztypes_linux_riscv64.go | 5 + .../x/sys/unix/ztypes_linux_s390x.go | 5 + .../x/sys/unix/ztypes_linux_sparc64.go | 5 + .../x/sys/unix/ztypes_solaris_amd64.go | 40 + .../golang.org/x/sys/windows/types_windows.go | 2 +- .../pkg/endpoints/metrics/metrics.go | 17 +- .../pkg/server/deprecated_insecure_serving.go | 3 + .../apiserver/pkg/server/secure_serving.go | 14 +- .../apiserver/pkg/storage/etcd3/store.go | 30 + vendor/k8s.io/utils/pointer/pointer.go | 18 + vendor/modules.txt | 39 +- vendor/sigs.k8s.io/controller-runtime/FAQ.md | 2 +- .../sigs.k8s.io/controller-runtime/Makefile | 2 + .../controller-runtime/OWNERS_ALIASES | 3 +- .../sigs.k8s.io/controller-runtime/README.md | 1 + .../controller-runtime/TMP-LOGGING.md | 2 +- vendor/sigs.k8s.io/controller-runtime/doc.go | 2 +- vendor/sigs.k8s.io/controller-runtime/go.mod | 22 +- vendor/sigs.k8s.io/controller-runtime/go.sum | 220 +++-- .../controller-runtime/pkg/builder/doc.go | 2 +- .../controller-runtime/pkg/cache/cache.go | 42 +- .../pkg/cache/internal/cache_reader.go | 34 +- .../pkg/cache/internal/deleg_map.go | 19 +- .../pkg/cache/internal/disabledeepcopy.go | 35 + .../pkg/cache/internal/informers_map.go | 62 +- .../pkg/client/apiutil/apimachinery.go | 29 +- .../pkg/client/fake/client.go | 22 + .../pkg/client/namespaced_client.go | 63 +- .../pkg/controller/controller.go | 4 + .../controllerutil/controllerutil.go | 2 +- .../pkg/internal/controller/controller.go | 17 +- .../pkg/internal/recorder/recorder.go | 13 +- .../pkg/leaderelection/leader_election.go | 17 +- .../controller-runtime/pkg/log/deleg.go | 2 +- .../pkg/manager/internal.go | 2 +- .../controller-runtime/pkg/manager/manager.go | 4 +- .../pkg/metrics/client_go_adapter.go | 29 +- .../pkg/webhook/conversion/conversion.go | 2 +- .../controller-runtime/pkg/webhook/server.go | 37 + .../controller-tools/pkg/loader/loader.go | 2 +- 175 files changed, 9493 insertions(+), 4832 deletions(-) delete mode 100644 vendor/github.com/mitchellh/mapstructure/.travis.yml delete mode 100644 vendor/github.com/spf13/cobra/.travis.yml create mode 100644 vendor/github.com/spf13/cobra/bash_completionsV2.go rename vendor/github.com/spf13/cobra/{custom_completions.go => completions.go} (70%) create mode 100644 vendor/github.com/spf13/cobra/user_guide.md delete mode 100644 vendor/go.opencensus.io/.travis.yml create mode 100644 vendor/go.opencensus.io/trace/trace_api.go create mode 100644 vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go create mode 100644 vendor/go.uber.org/zap/zapcore/clock.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/clientauth.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/err.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/filecredsource.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/sts_exchange.go create mode 100644 vendor/golang.org/x/oauth2/google/internal/externalaccount/urlcredsource.go create mode 100644 vendor/golang.org/x/sys/unix/ifreq_linux.go create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/disabledeepcopy.go diff --git a/go.mod b/go.mod index df5374f961..e5f63646ef 100644 --- a/go.mod +++ b/go.mod @@ -16,20 +16,20 @@ require ( github.com/operator-framework/operator-lifecycle-manager v0.0.0-00010101000000-000000000000 github.com/operator-framework/operator-registry v1.17.5 github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 + github.com/spf13/cobra v1.2.1 github.com/stretchr/testify v1.7.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/protobuf v1.27.1 gopkg.in/yaml.v2 v2.4.0 helm.sh/helm/v3 v3.6.2 - k8s.io/api v0.22.0 - k8s.io/apimachinery v0.22.0 - k8s.io/client-go v0.22.0 - k8s.io/code-generator v0.22.0 + k8s.io/api v0.22.1 + k8s.io/apimachinery v0.22.1 + k8s.io/client-go v0.22.1 + k8s.io/code-generator v0.22.1 k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d - k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9 - sigs.k8s.io/controller-runtime v0.9.2 - sigs.k8s.io/controller-tools v0.6.1 + k8s.io/utils v0.0.0-20210802155522-efc7438f0176 + sigs.k8s.io/controller-runtime v0.10.0 + sigs.k8s.io/controller-tools v0.6.2 ) replace ( diff --git a/go.sum b/go.sum index e472ee3b3b..e88eefbad8 100644 --- a/go.sum +++ b/go.sum @@ -10,20 +10,35 @@ cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0 h1:3ithwDMr7/3vpAMXiH+ZQnYbuIsh+OPhUPMFC9enmn0= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= @@ -128,8 +143,9 @@ github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZo github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -139,6 +155,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= @@ -171,6 +188,7 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk= @@ -294,6 +312,7 @@ github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4s github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -430,7 +449,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI= github.com/gobuffalo/envy v1.7.1 h1:OQl5ys5MBea7OGCdvPbBJWRgnhC/fGona6QKfvFeau8= github.com/gobuffalo/envy v1.7.1/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w= -github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY= github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= @@ -476,6 +494,9 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -484,6 +505,7 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -508,8 +530,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= @@ -520,11 +545,19 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -607,6 +640,7 @@ github.com/huandu/xstrings v1.3.1 h1:4jgBlKK6tLKFvO8u5pmYjG91cqytmDCDvGh7ECVFfFs github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= @@ -700,6 +734,7 @@ github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -760,8 +795,9 @@ github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4 github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= @@ -826,8 +862,10 @@ github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1Cpa github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.11.0/go.mod h1:azGKhqFUon9Vuj0YmTfLSmx0FUwqXYSTl5re8lQLTUg= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -871,6 +909,7 @@ github.com/pbnjay/strptime v0.0.0-20140226051138-5c05b0d668c9/go.mod h1:6Hr+C/ol github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -987,9 +1026,11 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= 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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -999,6 +1040,7 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/spiffe/go-spiffe/v2 v2.0.0-beta.5 h1:FKeGzmMtP079mo/7jH3UFOnBUO30j/tmsKSiPX6GcmM= github.com/spiffe/go-spiffe/v2 v2.0.0-beta.5/go.mod h1:TEfgrEcyFhuSuvqohJt6IxENUNeHfndWCCV1EX7UaVk= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= @@ -1048,7 +1090,9 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= @@ -1096,8 +1140,11 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 h1:sO4WKdPAudZGKPcpZT4MJn6JaDmpyLrMPDGGyA1SttE= @@ -1138,8 +1185,9 @@ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9i go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1201,6 +1249,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1240,12 +1290,20 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= @@ -1262,14 +1320,23 @@ golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= @@ -1329,20 +1396,30 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1353,8 +1430,9 @@ golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -1424,16 +1502,32 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1453,7 +1547,19 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1461,6 +1567,7 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= @@ -1485,13 +1592,33 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210518161634-ec7691c0a37d/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= @@ -1510,10 +1637,15 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= @@ -1560,6 +1692,7 @@ gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= @@ -1604,31 +1737,40 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.21.0-rc.0/go.mod h1:Dkc/ZauWJrgZhjOjeBgW89xZQiTBJA2RaBKYHXPsi2Y= k8s.io/api v0.21.0/go.mod h1:+YbrhBBGgsxbF6o6Kj4KJPJnBmAKuXDeS3E18bgHNVU= k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= -k8s.io/api v0.22.0 h1:elCpMZ9UE8dLdYxr55E06TmSeji9I3KH494qH70/y+c= +k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= k8s.io/api v0.22.0/go.mod h1:0AoXXqst47OI/L0oGKq9DG61dvGRPXs7X4/B7KyjBCU= +k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY= +k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= k8s.io/apiextensions-apiserver v0.21.0/go.mod h1:gsQGNtGkc/YoDG9loKI0V+oLZM4ljRPjc/sql5tmvzc= k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= k8s.io/apiextensions-apiserver v0.21.2/go.mod h1:+Axoz5/l3AYpGLlhJDfcVQzCerVYq3K3CvDMvw6X1RA= -k8s.io/apiextensions-apiserver v0.22.0 h1:QTuZIQggaE7N8FTjur+1zxLmEPziphK7nNm8t+VNO3g= +k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE= k8s.io/apiextensions-apiserver v0.22.0/go.mod h1:+9w/QQC/lwH2qTbpqndXXjwBgidlSmytvIUww16UACE= +k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= +k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA= k8s.io/apimachinery v0.20.2/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.21.0-rc.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= k8s.io/apimachinery v0.21.0/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= -k8s.io/apimachinery v0.22.0 h1:CqH/BdNAzZl+sr3tc0D3VsK3u6ARVSo3GWyLmfIjbP0= +k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= k8s.io/apimachinery v0.22.0/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= k8s.io/apiserver v0.21.0/go.mod h1:w2YSn4/WIwYuxG5zJmcqtRdtqgW/J2JRgFAqps3bBpg= k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= k8s.io/apiserver v0.21.2/go.mod h1:lN4yBoGyiNT7SC1dmNk0ue6a5Wi6O3SWOIw91TsucQw= -k8s.io/apiserver v0.22.0 h1:KZh2asnRBjawLLfPOi6qiD+A2jaNt31HCnZG6AX3Qcs= +k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU= k8s.io/apiserver v0.22.0/go.mod h1:04kaIEzIQrTGJ5syLppQWvpkLJXQtJECHmae+ZGc/nc= +k8s.io/apiserver v0.22.1 h1:Ul9Iv8OMB2s45h2tl5XWPpAZo1VPIJ/6N+MESeed7L8= +k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= k8s.io/cli-runtime v0.21.0/go.mod h1:XoaHP93mGPF37MkLbjGVYqg3S1MnsFdKtiA/RZzzxOo= k8s.io/cli-runtime v0.22.0 h1:xM0UJ91iPKvPeooS/LS4U3sPVRAeUrUslJ0sUtE7a7Q= k8s.io/cli-runtime v0.22.0/go.mod h1:An6zELQ7udUI0GaXvkuMqyopPA14dIgNqpH8cZu1vig= @@ -1636,20 +1778,26 @@ k8s.io/client-go v0.18.0/go.mod h1:uQSYDYs4WhVZ9i6AIoEZuwUggLVEF64HOD37boKAtF8= k8s.io/client-go v0.21.0/go.mod h1:nNBytTF9qPFDEhoqgEPaarobC8QPae13bElIVHzIglA= k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= -k8s.io/client-go v0.22.0 h1:sD6o9O6tCwUKCENw8v+HFsuAbq2jCu8cWC61/ydwA50= +k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= k8s.io/client-go v0.22.0/go.mod h1:GUjIuXR5PiEv/RVK5OODUsm6eZk7wtSWZSaSJbpFdGg= +k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw= +k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= k8s.io/code-generator v0.18.0/go.mod h1:+UHX5rSbxmR8kzS+FAv7um6dtYrZokQvjHpDSYRVkTc= k8s.io/code-generator v0.21.0-rc.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/code-generator v0.21.0/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= -k8s.io/code-generator v0.22.0 h1:wIo+6NuAEf+aP6dblF+fPJOkY/VnM6wqNHusiW/eQ3o= +k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= k8s.io/code-generator v0.22.0/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= +k8s.io/code-generator v0.22.1 h1:zAcKpn+xe9Iyc4qtZlfg4tD0f+SO2h5+e/s4pZPOVhs= +k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= k8s.io/component-base v0.21.0/go.mod h1:qvtjz6X0USWXbgmbfXR+Agik4RZ3jv2Bgr5QnZzdPYw= k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= k8s.io/component-base v0.21.2/go.mod h1:9lvmIThzdlrJj5Hp8Z/TOgIkdfsNARQ1pT+3PByuiuc= -k8s.io/component-base v0.22.0 h1:ZTmX8hUqH9T9gc0mM42O+KDgtwTYbVTt2MwmLP0eK8A= +k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ= k8s.io/component-base v0.22.0/go.mod h1:SXj6Z+V6P6GsBhHZVbWCw9hFjUdUYnJerlhhPnYCBCg= +k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= +k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= k8s.io/component-helpers v0.21.0/go.mod h1:tezqefP7lxfvJyR+0a+6QtVrkZ/wIkyMLK4WcQ3Cj8U= k8s.io/component-helpers v0.22.0/go.mod h1:YNIbQI59ayNiU8JHlPIxVkOUYycbKhk5Niy0pcyJOEY= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= @@ -1683,8 +1831,9 @@ k8s.io/metrics v0.22.0/go.mod h1:eYnwafAUNLLpVmY/msoq0RKIKH5C4TzfjKnMZ0Xrt3A= k8s.io/utils v0.0.0-20200324210504-a9aa75ae1b89/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9 h1:imL9YgXQ9p7xmPzHFm/vVd/cF78jad+n4wK1ABwYtMM= k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/letsencrypt v0.0.3/go.mod h1:buyQKZ6IXrRnB7TdkHP0RyEybLx18HHyOSoTyoOLqNY= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= @@ -1694,11 +1843,12 @@ sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyz sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22 h1:fmRfl9WJ4ApJn7LxNuED4m0t18qivVQOxP6aAYG9J6c= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= -sigs.k8s.io/controller-runtime v0.9.2 h1:MnCAsopQno6+hI9SgJHKddzXpmv2wtouZz6931Eax+Q= sigs.k8s.io/controller-runtime v0.9.2/go.mod h1:TxzMCHyEUpaeuOiZx/bIdc2T81vfs/aKdvJt9wuu0zk= -sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc= -sigs.k8s.io/controller-tools v0.6.1 h1:nODRx2YrSNcaGd+90+CVC9SGEG6ygHlz3nSJmweR5as= +sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= +sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= sigs.k8s.io/controller-tools v0.6.1/go.mod h1:U6O1RF5w17iX2d+teSXELpJsdexmrTb126DMeJM8r+U= +sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU= +sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8= sigs.k8s.io/kind v0.11.1/go.mod h1:fRpgVhtqAWrtLB9ED7zQahUimpUXuG/iHT88xYqEGIA= sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY= sigs.k8s.io/kustomize/api v0.8.11 h1:LzQzlq6Z023b+mBtc6v72N2mSHYmN8x7ssgbf/hv0H8= diff --git a/staging/api/crds/operators.coreos.com_catalogsources.yaml b/staging/api/crds/operators.coreos.com_catalogsources.yaml index 8464f6c8ec..4518bc3037 100644 --- a/staging/api/crds/operators.coreos.com_catalogsources.yaml +++ b/staging/api/crds/operators.coreos.com_catalogsources.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: catalogsources.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml index 231df701d0..7d3a2abe33 100644 --- a/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/staging/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: clusterserviceversions.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_installplans.yaml b/staging/api/crds/operators.coreos.com_installplans.yaml index 506b2b1554..616f51ba0d 100644 --- a/staging/api/crds/operators.coreos.com_installplans.yaml +++ b/staging/api/crds/operators.coreos.com_installplans.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: installplans.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_operatorconditions.yaml b/staging/api/crds/operators.coreos.com_operatorconditions.yaml index af96a5c20b..eb9a6d5a79 100644 --- a/staging/api/crds/operators.coreos.com_operatorconditions.yaml +++ b/staging/api/crds/operators.coreos.com_operatorconditions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operatorconditions.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_operatorgroups.yaml b/staging/api/crds/operators.coreos.com_operatorgroups.yaml index 0927d45a0e..e59131ac3a 100644 --- a/staging/api/crds/operators.coreos.com_operatorgroups.yaml +++ b/staging/api/crds/operators.coreos.com_operatorgroups.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operatorgroups.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_operators.yaml b/staging/api/crds/operators.coreos.com_operators.yaml index 9c47bf45f3..ef206c5e7a 100644 --- a/staging/api/crds/operators.coreos.com_operators.yaml +++ b/staging/api/crds/operators.coreos.com_operators.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operators.operators.coreos.com spec: diff --git a/staging/api/crds/operators.coreos.com_subscriptions.yaml b/staging/api/crds/operators.coreos.com_subscriptions.yaml index 4b92cac164..f4070f0878 100644 --- a/staging/api/crds/operators.coreos.com_subscriptions.yaml +++ b/staging/api/crds/operators.coreos.com_subscriptions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: subscriptions.operators.coreos.com spec: diff --git a/staging/api/crds/zz_defs.go b/staging/api/crds/zz_defs.go index 762a868c8e..e7af33e538 100644 --- a/staging/api/crds/zz_defs.go +++ b/staging/api/crds/zz_defs.go @@ -84,7 +84,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x5a\x6d\x73\x1b\xb7\x8f\x7f\xef\x4f\x81\xf1\xdd\x4c\xe2\x9c\xb4\x8e\x93\x4e\xae\xd5\x34\xcd\xb8\xce\xa5\xe7\x69\x9c\x78\xec\xa4\x33\x77\xb1\xef\x0a\xed\x42\x2b\xd6\x5c\x72\x4b\x72\x6d\xab\x9d\x7e\xf7\xff\x80\x0f\xbb\x7a\x5a\x49\x76\x1b\xbd\xb1\xc5\x07\x00\x04\x01\xfc\x00\x50\x58\x8b\x5f\xc8\x58\xa1\xd5\x08\xb0\x16\x74\xef\x48\xf1\x37\x9b\xdd\x7c\x6b\x33\xa1\x0f\x6f\x8f\xf6\x6e\x84\x2a\x46\x70\xd2\x58\xa7\xab\x0b\xb2\xba\x31\x39\xbd\xa5\x89\x50\xc2\x09\xad\xf6\x2a\x72\x58\xa0\xc3\xd1\x1e\x00\x2a\xa5\x1d\xf2\xb0\xe5\xaf\x00\xb9\x56\xce\x68\x29\xc9\x0c\x4b\x52\xd9\x4d\x33\xa6\x71\x23\x64\x41\xc6\x13\x4f\xac\x6f\x9f\x67\xaf\xb2\xe7\x7b\x00\xb9\x21\xbf\xfd\x93\xa8\xc8\x3a\xac\xea\x11\xa8\x46\xca\x3d\x00\x85\x15\x8d\x20\x47\x87\x52\x97\x41\x08\x9b\xe9\x9a\x0c\x3a\x6d\x6c\x96\x6b\x43\x9a\xff\x54\x7b\xb6\xa6\x9c\xb9\x97\x46\x37\xf5\x08\xd6\xae\x09\xf4\x92\x90\xe8\xa8\xd4\x46\xa4\xef\x00\x43\xd0\xb2\xf2\xff\xc7\xc3\x07\xb6\x97\x9e\xad\x1f\x97\xc2\xba\x9f\x57\xe7\xde\x0b\xeb\xfc\x7c\x2d\x1b\x83\x72\x59\x60\x3f\x65\xa7\xda\xb8\x0f\x1d\x7b\x66\x97\xa3\xb3\x26\x0f\xd3\x42\x95\x8d\x44\xb3\xb4\x77\x0f\xc0\xe6\xba\xa6\x11\xf8\xad\x35\xe6\x54\xec\x01\x44\x15\x46\x52\x43\xc0\xa2\xf0\xd7\x82\xf2\xdc\x08\xe5\xc8\x9c\x68\xd9\x54\xaa\x65\xc5\x6b\x0a\xb2\xb9\x11\xb5\xf3\xaa\xff\x34\x25\xa8\x0d\x39\x37\xf3\x2a\x01\x3d\x01\x37\xa5\xc4\xbb\xdd\x05\xf0\x9b\xd5\xea\x1c\xdd\x74\x04\x19\x6b\x38\x2b\x84\xad\x25\xce\x58\x9a\xb9\x55\xe1\x9a\xde\x86\xb9\xb9\x71\x37\x63\xd1\xad\x33\x42\x95\x9b\x44\xe1\x75\xbb\xcb\x10\x54\xf3\x69\x56\xaf\x8a\xb0\x34\xb8\x2b\xff\xba\x19\x4b\x61\xa7\x64\x76\x17\xa2\xdd\xb2\x22\xc3\xf9\x9a\x99\x1e\x41\xe6\x88\x26\x87\xca\x56\x9c\x61\x85\xc1\x71\xb9\x7a\xc6\x02\x5d\x1a\x0c\x8b\x6e\x8f\x50\xd6\x53\x3c\x8a\x83\x36\x9f\x52\x85\x9d\x3d\xe8\x9a\xd4\xf1\xf9\xe9\x2f\x2f\x2f\x97\x26\x60\x51\x3b\x0b\x76\x0e\xc2\x02\x82\xa1\x5a\x5b\xe1\xb4\x99\xb1\xb6\x4e\x2e\x7f\xb1\x03\x38\xb9\x78\x6b\x07\x80\xaa\x68\x1d\x0f\x6a\xcc\x6f\xb0\x24\x9b\xad\xc8\xaa\xc7\xbf\x51\xee\xe6\x86\x0d\xfd\xde\x08\x43\xc5\xbc\x14\xac\x9e\xa4\x93\xa5\x61\xd6\xff\xdc\x50\x6d\x98\xa7\x9b\x73\xe4\xf0\x99\x8b\x72\x0b\xe3\x4b\x27\x7c\xc2\x6a\x08\xeb\xa0\xe0\x00\x47\xd6\x9b\x40\xf4\x31\x2a\xa2\xee\x82\x69\x08\xcb\xe7\x37\x64\x49\x85\x90\xc7\xc3\xa8\xe2\x99\x32\xb8\x24\xc3\x1b\xd9\xdd\x1b\x59\x70\x24\xbc\x25\xe3\xc0\x50\xae\x4b\x25\xfe\x68\xa9\x59\x70\xda\xb3\x91\xe8\xc8\x3a\xf0\x5e\xab\x50\xc2\x2d\xca\x86\x82\x2a\x2b\x9c\x81\x21\xa6\x0b\x8d\x9a\xa3\xe0\x97\xd8\x0c\xce\xb4\x21\x10\x6a\xa2\x47\x30\x75\xae\xb6\xa3\xc3\xc3\x52\xb8\x14\xc3\x73\x5d\x55\x8d\x12\x6e\x76\xe8\xc3\xb1\x18\x37\x1c\x0e\x0f\x0b\xba\x25\x79\x68\x45\x39\x44\x93\x4f\x85\xa3\xdc\x35\x86\x0e\xb1\x16\x43\x2f\xac\xf2\x71\x3c\xab\x8a\x7f\x33\x31\xea\xdb\x27\x4b\xea\x5b\x6b\xcc\x90\xc2\xe6\x46\x5d\x73\xf0\x0c\x56\x14\xb6\x87\xb3\x74\x2a\xe5\x21\xd6\xca\xc5\x7f\x5d\x7e\x82\x24\x40\x50\x7b\xd0\x70\xb7\xd4\x76\xca\x66\x45\x09\x35\x21\x13\x56\x4e\x8c\xae\x3c\x15\x52\x45\xad\x85\x72\xc1\xa5\xa5\x20\xe5\xc0\x36\xe3\x4a\x38\xeb\x6d\x8e\xac\xe3\x7b\xc8\xe0\xc4\x43\x18\x8c\x09\x9a\x9a\x3d\xa9\xc8\xe0\x54\xc1\x09\x56\x24\x4f\xd0\xd2\x57\x57\x35\x6b\xd4\x0e\x59\x7d\xbb\x2b\x7b\x1e\x81\x57\x37\xac\xf8\x18\x40\x42\xc8\x9d\x16\xf7\x39\x25\x04\x0f\x5c\x17\x81\x61\x83\x2f\xf2\x07\x8b\xc2\x90\x5d\x33\xb1\xe2\x90\x61\x61\xb0\x93\xa9\xb6\x7c\x7f\xe8\xe0\xe3\xfb\x33\xc8\x51\x41\x63\x89\x9d\x27\xd7\x4a\xb1\x41\x38\x0d\xc8\x58\x36\xa4\x7b\x61\xbd\x01\x19\x2a\x85\x75\x66\x96\xc1\x3b\x6d\x2a\x74\x23\xf8\x3e\x0d\x0d\x3d\x39\x6d\x40\xd4\x3f\x8c\xbe\xaf\xb5\x71\x3f\xc0\x47\x25\x67\x4c\xb4\x80\xbb\x29\x29\xb8\x6c\xcf\x06\xaf\xe7\xbe\xfc\x64\xea\x3c\x83\xd3\x52\x69\x93\x56\xb2\x55\x9d\x56\x58\x12\x4c\x04\x49\x6f\xd7\x96\x5c\xb6\x7c\x83\x1b\x6f\x11\x42\xba\x34\x11\xe5\x19\xd6\x5b\x55\x73\x92\x56\x32\x2f\x66\x3f\x0f\xde\xdd\xa4\xd3\xde\x94\xf9\x48\xfc\x2f\xe6\x37\x80\x91\x4b\x85\xf5\xd0\x7a\xb7\x99\x53\xd3\x6e\x1a\x38\x49\x04\x58\x7f\xdd\xf0\x69\x8c\x5c\xd9\x43\x8f\x3d\x7f\xb2\x07\xef\xed\xd2\x90\xad\x4a\x3b\x5b\x87\x22\x3b\xf0\x10\xf9\x26\xc1\xd6\xfa\x0c\x6c\xf4\x1b\xf0\xbe\x33\x46\x4b\xaf\xbe\xe9\x11\x28\xa0\x5e\x21\xd0\xad\xfa\x16\x6c\xf1\x2f\xfe\x74\xc4\xd7\xcf\x6f\x39\x32\xf8\xb8\x12\xd9\x3f\x8a\x82\x60\x7f\xd8\x7a\x25\xc1\x6b\xd8\xbf\x55\x9b\x30\x0c\x93\x3d\xfa\xf2\x01\x85\x22\x13\xa8\xb1\x0d\x0b\x65\x1d\x2a\x27\xd0\x91\xcf\x40\xa2\x37\x47\x4b\xbe\x13\x6e\xba\xab\x15\x47\x3f\x9e\x40\x84\x91\x81\xf7\x9d\x18\x9b\x3a\x47\x16\xc1\xd1\x1f\x6c\xd4\xb5\x11\xda\x08\x37\xdb\x1e\xe5\xce\xe3\xca\xc8\x13\xad\x15\xa5\xe2\x88\x77\x47\xa2\x9c\xba\x94\x1f\xc4\x4c\x14\x12\x14\xea\xc4\x42\xfc\xc1\xc0\x48\x15\x58\x1d\xe2\xa3\x70\x3e\x3c\x8e\x89\x15\x68\x9b\x8a\x0a\x18\xcf\x3c\x8d\x82\x6a\x52\x05\xa9\x7c\xe6\x31\x55\xde\x92\xc9\xe0\xb3\xe5\x9b\x82\xff\x16\x25\xe7\xbd\x91\xa9\x50\x85\xe0\xc2\xc8\x06\x92\x1e\x4e\x97\x24\x10\x96\x55\x37\x21\xc3\x71\x50\xb3\xfa\xa5\xbe\x6b\x29\x50\xb1\xb4\xde\x42\xd1\x78\xa4\x5f\x16\xa2\x61\x3d\x64\x3e\xfd\x36\xa8\xca\x36\x8c\x25\x0d\xc6\xd4\x80\x8f\x54\xea\x80\xe9\x3e\xef\x14\xb7\x5e\x0b\x8a\x4a\xf4\xff\x8b\x10\x88\x5b\x1a\x42\xb9\x97\x2f\x02\xdd\x82\x26\xd8\x48\x17\x29\x79\xa0\x58\x3a\x0c\x5b\x0e\x34\x2a\x28\x9f\x8a\x8e\xf9\x9d\x4f\xdf\xc6\x04\xcf\x03\xa9\x75\xfb\x98\xad\xe5\x00\xbc\x28\xb2\x85\x3b\x21\x25\xef\x35\xa8\x6e\xa8\x00\x49\xf7\x22\xd7\xa5\xc1\x7a\x2a\x72\x94\x72\xe6\xdd\xb4\x00\xad\x80\x33\x11\x8e\xe1\x1b\x40\x83\x33\xc3\x72\xa1\x98\x88\x96\x96\xca\x8c\x07\x07\x4f\x4b\xb9\x21\xb7\x1d\x88\x2f\xc3\xba\x2e\xe5\x62\x78\x63\x15\x47\x02\xc1\x46\xa2\xcd\x25\xb4\xc1\x3c\x67\x47\xf2\xa6\xab\x95\xe3\x44\x6d\xa9\xa8\xca\xe0\xd4\xb1\x15\x8d\x39\xef\x75\x1a\x6e\x88\xea\x60\x69\x5c\x5e\x83\xad\x50\xca\x01\x17\xc4\x39\x01\x61\x3e\x0d\xea\x54\x14\xd1\x8c\xc0\x19\x41\x05\x4c\xb4\x01\xba\x25\x8e\x17\xf1\x6e\x48\x31\x9a\xf5\x6a\x03\x8d\x59\x28\x4e\xd3\x47\x38\xaa\x7a\xc2\xe9\x66\x35\xb6\x31\x65\xbb\x26\xbb\x58\x14\x81\x3b\x55\xbc\xb6\x6b\x2e\x3c\x80\x75\xc8\x52\x2f\x9d\x41\x47\xe5\xf6\x58\xf3\x79\x61\x79\x5b\xe5\x4c\xf5\x5d\xca\x77\x57\x9c\x9c\x03\xaf\x4d\x77\x5b\x08\x9b\xb3\xa7\x53\xc1\x49\x86\x15\x36\xdc\x29\xaa\x50\xb6\xdc\xa2\x0c\xa6\x90\x08\xd7\x5a\x4a\xef\xf2\x8d\x09\x35\x12\x57\x33\xa8\x80\xaa\x31\x15\x05\xd7\x40\x49\x94\x1e\x98\xdb\x02\xb1\xdb\x50\x30\xe1\xc3\xb9\x96\x72\x33\x8a\xf5\xb2\xd8\x85\x0d\x7f\x92\x02\xfa\x57\x2c\x43\x5f\xd2\x98\xb0\xad\xcf\x14\xe4\xc8\x54\x42\x51\x30\x0d\x51\x51\xa7\xd8\x31\xb9\x3b\x22\x05\xf9\x94\xf2\x9b\xd6\x95\x62\xd5\xb8\x74\x6b\xb1\x64\x5d\x8c\x58\x5d\x41\xae\xa5\xf4\x65\xa7\x25\x02\x31\x01\x04\x45\x77\x69\xcf\x92\x8f\xce\x05\x7b\xbc\x45\x21\x71\x2c\xc9\xa3\x66\xfb\x6d\xb0\x50\xbd\x26\x3c\xaf\x1b\x29\xa9\xf0\xf7\x5d\x5e\x9c\x9f\x80\x33\x38\x99\x88\x9c\xa7\x0a\x61\x28\x77\xe1\xc0\xbd\x47\x58\xe7\xbd\x8b\x37\xb6\xc6\x23\xac\x43\xd7\xac\xdc\xd1\x86\x0b\xde\x74\xb1\xb9\x56\xa1\x97\xb6\x3d\x3e\x5e\xb4\xa5\x68\x80\x02\xc7\xd9\x09\xfb\xc5\x62\xd7\x24\x83\x0f\xda\x51\xf0\x90\x33\xb2\x0c\xbb\x5e\x41\x17\x84\x56\xab\xb9\xe8\xca\x44\xb4\x11\xa5\x50\x28\xe3\xa1\x7c\xcd\xc9\x35\x8c\xd0\x6a\x00\x77\x53\x91\x4f\x7d\xb5\x3b\x26\xa8\x44\x69\xd0\xb5\x41\xb1\x93\x3b\xa2\x4b\xc4\xc5\x49\xc3\x45\x67\x06\xc7\x6a\xe6\xef\x7b\x42\xc8\x03\x4c\xd9\x19\x5d\x34\x39\xe7\x4b\x1c\x60\xb9\xac\xea\x88\xfc\xa3\x61\x74\x41\x6b\xfb\x27\x89\x49\x4a\xf4\x2c\x3b\x00\x0a\x69\x7d\x4c\xd7\x8a\x00\xb9\x56\x75\xad\x4d\x36\xc6\x78\xf4\x49\x0a\xf6\x60\x71\x7c\x7e\x0a\xa9\x31\x9d\xc1\x70\x38\x84\x4f\x3c\x6c\x9d\x69\x72\x8f\x2f\xec\x42\xaa\x88\x48\x11\xac\xcf\x1f\x12\x7d\xda\xe9\x8f\x01\x18\xb4\x1e\x52\xb0\x1a\xdd\x14\xb2\xa0\xf8\x6c\x4e\x15\xc0\x75\x24\xd0\x3d\x56\xb5\xb7\x7b\x0e\xdd\xef\xb4\xbe\x0c\x37\x14\x18\xfe\xe9\x0f\x7a\x78\xb8\x6c\x14\x7a\xcc\x39\x6a\x68\x8e\x07\xdb\x98\x68\xfd\xc4\x2e\x9e\x29\x4b\x9b\x7f\x56\xfa\x4e\xad\x13\xc1\xf3\x44\x43\x23\xb8\xda\x3f\x4e\x2e\x78\xb5\x3f\x80\xab\xfd\x73\xa3\x4b\xce\x5d\x85\x2a\x79\x80\x2d\xeb\x6a\xff\x2d\x95\x06\x0b\x2a\xae\xf6\x13\xe9\xff\xa8\xd1\xe5\xd3\x33\x32\x25\xfd\x4c\xb3\xd7\x9e\xe0\xc2\x54\x82\x87\xd7\x15\xaf\x69\xe7\x18\x93\x19\xb8\x5e\x73\xe1\x37\x3f\x78\x86\xf5\x02\xa1\x93\xce\x00\xbf\x5c\x57\xe4\xf0\xf6\x28\xeb\xae\xfa\xd7\xdf\xac\x56\xa3\xab\xfd\xee\x4c\x03\x5d\xb1\xc9\xd4\x6e\x76\xb5\x0f\x0b\x12\x8c\xae\xf6\xbd\x0c\x69\x3c\x09\x3d\xba\xda\x67\x6e\x3c\x6c\xb4\xd3\xe3\x66\x32\xba\xda\x1f\xcf\x1c\xd9\xc1\xd1\xc0\x50\x3d\xe0\x4c\xea\x75\xc7\xe1\x6a\xff\x57\xb8\x52\x49\x68\xed\x38\xcf\xf5\x37\x6d\xe1\xaf\xfd\x0d\x78\xbf\x01\x14\x36\x17\x77\x5c\xbd\x49\xb4\xee\x93\x41\x65\x45\x6a\xe2\xf6\x2e\xad\x42\x30\xe8\x9d\x37\x3e\x40\xf4\x4e\x07\x2b\xe9\x9d\xee\x81\xd6\x5d\x60\x6d\xf5\x0c\xfd\xf0\xb6\xe0\xdb\xab\x1b\x53\xbe\xc3\x33\x01\xd9\x62\x66\x18\xed\xc2\xb5\xab\xd9\x51\x39\xc9\x67\xff\x8f\xc1\x8f\xd3\x49\xe5\xef\x2d\x8b\xce\x3d\x4d\x69\x79\xdb\x80\x69\x54\x41\x46\xce\x38\xdd\xe8\xa8\xe6\x53\xae\x06\x8a\x0c\x18\xb2\x42\x71\x64\x41\x69\x07\x37\xec\x60\x1e\xba\x14\x34\x36\x75\x1b\xbd\x5c\x2d\x45\x0e\x2c\x21\x20\x44\x32\x1e\x05\xf3\x9c\x6a\xe7\x61\xb0\x57\x15\x5b\x4b\x6b\xfe\x4c\x62\x4b\x8a\xd3\xae\xa1\xeb\x37\x8f\x68\x1c\x3b\x2a\x3e\xae\x8e\x2d\xb3\xa6\x42\xc6\x15\x2c\x58\xde\x6e\x2e\xd4\x76\xa1\x16\x0b\xf1\x16\xc7\xba\x09\x11\xb0\xbb\x87\xa8\xea\x88\x32\x3e\x6b\xab\xdd\x2c\x1e\xeb\x6f\x1e\xbe\xc2\xfb\xf7\xa4\x4a\x37\x1d\xc1\xcb\x17\xff\xf9\xea\xdb\x9e\x85\x21\x68\x52\xf1\x13\x29\x0a\x19\xe4\x8e\x6a\x58\xdd\x38\xd7\x2f\xf6\xe7\xec\xde\x59\xca\x6e\x4d\xac\x75\xe7\xed\xf2\x0e\x7d\x33\x2f\x62\x69\x53\xb3\x5e\x18\x05\x42\x23\x22\xa7\x01\x67\x50\x6b\x89\x89\x36\xb8\xcb\x19\x1c\xbd\x18\xc0\x38\xaa\x78\x35\xac\x7f\xb9\xbf\xce\xd6\x88\x2c\x2c\x7c\x37\x58\x92\x47\x58\xe0\xab\xd2\x13\x6f\x38\xa1\xfe\x34\x14\x60\x32\x75\x0a\x56\x61\x92\x5a\x79\xb7\x5d\x5c\x5f\x95\x99\x3e\xc9\x6c\x85\x72\xaf\xbe\xe9\xbf\x5f\xa1\x44\xd5\x54\x23\x78\xde\xb3\x24\x84\xb4\x1d\x6f\x33\x2c\xee\xb2\x04\xe4\xd0\x55\x1a\xac\x38\x1f\xca\x41\x14\xa4\x9c\x98\x08\x32\xf3\xa6\xed\x7b\x01\x61\x23\xe3\xfe\x82\x16\x9f\xd8\x18\x87\xe6\x8c\xfd\x3c\x24\x41\xc6\xa3\x33\xeb\x53\x70\xbe\x3a\x17\xa0\x66\x35\x05\x6f\x08\xd5\x0d\xd0\x7d\x1d\xf2\xd8\x58\xec\xfb\x97\x1a\x42\x25\x54\x69\x23\x4b\x11\x1b\x49\x01\x8d\xef\xa6\xe4\xa1\xc7\x3f\x2a\xc5\x3d\x26\x34\x69\x44\xe1\x8b\x2a\x84\xb2\x41\x83\xca\x71\x8d\x7b\x7c\x7e\x1a\x12\xf8\xd0\xb5\xe8\x42\x1e\x76\x0f\x12\xc9\x1b\x83\xab\x86\x60\xc5\x22\xc6\x47\x0c\xef\xb1\xff\x9c\xab\x1e\x3d\x7f\xb1\xf1\xca\xdb\x75\xbd\x8b\x6a\x74\x8e\x8c\x1a\xc1\xff\x7d\x39\x1e\xfe\x2f\x0e\xff\xb8\x7e\x1a\xff\x79\x3e\xfc\xee\xff\x07\xa3\xeb\x67\x73\x5f\xaf\x0f\xde\xfc\x7b\x0f\xa5\xf5\x99\x7e\x8f\xf9\x44\x10\x49\x49\x64\xba\xd1\x81\x47\x18\x3d\x81\x4f\xa6\xa1\x01\xbc\x43\x69\x69\x00\x9f\x95\x87\x86\xbf\xa9\x34\x52\x4d\xb5\xa9\x12\x1c\xc2\x3e\x73\x5d\x9f\x7c\xb4\x4b\xbc\x48\x9b\xd7\x44\x71\x37\xd5\xb6\xbb\x29\x29\xf5\x21\xe6\x22\xcd\xdc\xc3\x97\x7f\x29\x61\x47\xd2\x59\x4c\x7f\xb3\x5c\x57\x87\x73\x0f\x63\x9c\x77\x9f\xa1\x9a\x41\x17\xd6\x42\xb2\xba\x6c\xe9\xd6\x71\x6c\xc2\xdc\x68\x6b\xdb\x97\x3d\x0b\x52\xdc\x10\x1c\x77\x45\x25\x07\xcb\x31\xe5\xe8\x13\x75\x33\x16\xce\x60\xe8\x08\xa7\xdc\xb2\x6b\x37\x4d\x1a\x09\x4f\xb9\x96\xcd\x94\x2e\x68\x35\xba\x1e\xc4\xd6\xee\x58\x48\xe1\x66\xa1\xce\xce\xb5\x9a\x48\x11\xeb\x83\xaa\xd6\xc6\xa1\x72\xb1\x09\x49\x25\xdd\x83\x70\x50\x71\xce\x49\xfe\xf9\xe9\x69\xa1\xec\xd1\xd1\x8b\x97\x97\xcd\xb8\xd0\x15\x0a\xf5\xae\x72\x87\x07\x6f\x9e\xfe\xde\xa0\xe4\xc8\x53\x7c\xc0\x8a\xde\x55\xee\xe0\x9f\x83\xc5\xa3\x57\x3b\x78\xd1\xd3\x2f\xc1\x57\xae\x9f\x7e\x19\xc6\xff\x9e\xa5\xa1\x83\x37\x4f\xaf\xb2\x8d\xf3\x07\xcf\xf8\x0c\x73\x1e\x78\xfd\x65\xd8\xb9\x5f\x76\xfd\xec\xe0\xcd\xdc\xdc\xc1\x3a\x67\xbc\x1f\xde\x34\x63\x32\x8a\x1c\xd9\x21\x57\x03\xc3\x0a\xeb\xe1\x0d\xcd\x7a\x9c\xb3\x37\x1d\x5d\x25\x14\x34\x56\x61\xdd\xff\x4e\x76\x41\x13\x32\xa4\xf2\xb5\x46\xfe\x37\x9f\x67\x14\xf6\xa4\x64\x61\xca\xff\x04\xe7\x11\x2d\x29\xc6\x9d\xd0\x86\xdb\x94\x4e\xef\x60\x2d\xbb\xe5\x8f\xaa\xe7\x61\x6c\x27\x26\xed\x39\x1f\x4d\x21\xf9\x77\xcf\xef\x2f\x76\xa6\xd3\x88\xde\x4a\x6b\xb1\xc1\x79\xfa\x36\xa4\xbe\x3e\xf4\xf8\x74\x6e\xaa\xb9\xce\x6b\x94\xf8\xbd\x21\x38\x7d\x1b\xe3\xd1\x00\x84\xca\x65\x53\x70\xa6\xf0\xf9\xf3\xe9\x5b\x2e\xee\x7f\x8c\xe1\xe6\x8e\xa0\xd0\xea\x89\x83\x8f\x1f\xde\xff\x8f\xef\x14\xf8\x15\x83\x00\xe8\xe1\xb1\x0a\xa5\x08\x3f\xdd\x48\x00\x0c\x3f\x12\xd3\x8a\x9c\x73\xac\xdb\xe6\x8a\x0f\x77\xaa\x80\x29\xc9\x9a\x13\x88\x1b\x02\xdb\x98\x28\x1d\x13\xf6\xb3\x5e\xd7\x50\x68\x0f\xdd\x25\x39\x6f\xe4\xd2\xff\x04\xe1\x31\x4a\x8b\x8f\xe2\x42\xab\x4b\xce\x02\xbf\x82\x7f\xb0\x21\x7f\x8c\x39\xab\xe7\xf1\x08\x67\xd8\xf0\x4b\x80\xad\x27\x84\xe8\x4c\x27\xe1\xa4\x5f\xdd\x93\x56\xce\xfb\x28\x8e\xa1\xd9\xe9\x9f\x3d\x2f\xb6\x34\xa7\x57\x7e\x9c\xb6\x58\x3a\x2f\xfd\x20\xcb\x37\x5e\xdb\x97\xd3\x29\x5a\x18\x13\x29\xdf\xeb\x0d\xad\x41\x52\xd1\xea\xa8\xeb\xd2\x36\xf5\xd0\xe9\x61\xb1\xfe\xf2\xb6\x68\x6e\xbb\xd6\x36\x54\xae\x0b\x67\x3b\x7e\x70\xa1\x7a\x37\x9d\xad\xd3\x81\x0d\xbd\x4e\x2e\xbc\xda\x1c\xe4\xa1\x07\xeb\x2f\x4c\x96\x5a\xbe\xbe\xb2\x88\x4d\x8d\x58\x67\xac\x8a\xc4\xd5\xe3\x42\x67\xc3\x69\xff\xd4\xb7\xd8\xf5\x7b\xb8\x8c\xe1\x9a\x2f\xc9\xdc\x8a\x47\x81\xdf\x36\xc7\xf4\xbf\x3d\xa4\xe2\xf8\xeb\xbb\x15\xa7\x5e\x8f\x66\xe2\xdb\x7f\xb9\xde\xf2\xb6\xb3\x81\x80\x0d\x1a\xec\xfb\xf9\xc8\x43\x69\x3c\x14\x2c\x43\x34\x19\x81\x33\x4d\xd2\x8e\x75\xda\xf8\xf7\xf8\xf9\xb1\x66\xdc\x26\xca\x1d\xf5\x58\x03\xc1\x9f\x7f\xed\xfd\x2b\x00\x00\xff\xff\xff\x45\x04\xba\xc8\x2d\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x5a\x6d\x73\x1b\xb7\x8f\x7f\xef\x4f\x81\xf1\xdd\x4c\xe2\x9c\xb4\x8e\x93\x4e\xae\xd5\x34\xcd\xb8\xce\xa5\xe7\x69\x9c\x78\xec\xa4\x33\x77\xb1\xef\x0a\xed\x42\x2b\xd6\x5c\x72\x4b\x72\x6d\xab\x9d\x7e\xf7\xff\x80\x0f\xbb\x7a\x5a\x49\x76\x1b\xbd\xb1\xc5\x07\x00\x04\x01\xfc\x00\x50\x58\x8b\x5f\xc8\x58\xa1\xd5\x08\xb0\x16\x74\xef\x48\xf1\x37\x9b\xdd\x7c\x6b\x33\xa1\x0f\x6f\x8f\xf6\x6e\x84\x2a\x46\x70\xd2\x58\xa7\xab\x0b\xb2\xba\x31\x39\xbd\xa5\x89\x50\xc2\x09\xad\xf6\x2a\x72\x58\xa0\xc3\xd1\x1e\x00\x2a\xa5\x1d\xf2\xb0\xe5\xaf\x00\xb9\x56\xce\x68\x29\xc9\x0c\x4b\x52\xd9\x4d\x33\xa6\x71\x23\x64\x41\xc6\x13\x4f\xac\x6f\x9f\x67\xaf\xb2\x17\x7b\x00\xb9\x21\xbf\xfd\x93\xa8\xc8\x3a\xac\xea\x11\xa8\x46\xca\x3d\x00\x85\x15\x8d\x20\x47\x87\x52\x97\x41\x08\x9b\xe9\x9a\x0c\x3a\x6d\x6c\x96\x6b\x43\x9a\xff\x54\x7b\xb6\xa6\x9c\xb9\x97\x46\x37\xf5\x08\xd6\xae\x09\xf4\x92\x90\xe8\xa8\xd4\x46\xa4\xef\x00\x43\xd0\xb2\xf2\xff\xc7\xc3\x07\xb6\x97\x9e\xad\x1f\x97\xc2\xba\x9f\x57\xe7\xde\x0b\xeb\xfc\x7c\x2d\x1b\x83\x72\x59\x60\x3f\x65\xa7\xda\xb8\x0f\x1d\x7b\x66\x97\xa3\xb3\x26\x0f\xd3\x42\x95\x8d\x44\xb3\xb4\x77\x0f\xc0\xe6\xba\xa6\x11\xf8\xad\x35\xe6\x54\xec\x01\x44\x15\x46\x52\x43\xc0\xa2\xf0\xd7\x82\xf2\xdc\x08\xe5\xc8\x9c\x68\xd9\x54\xaa\x65\xc5\x6b\x0a\xb2\xb9\x11\xb5\xf3\xaa\xff\x34\x25\xa8\x0d\x39\x37\xf3\x2a\x01\x3d\x01\x37\xa5\xc4\xbb\xdd\x05\xf0\x9b\xd5\xea\x1c\xdd\x74\x04\x19\x6b\x38\x2b\x84\xad\x25\xce\x58\x9a\xb9\x55\xe1\x9a\xde\x86\xb9\xb9\x71\x37\x63\xd1\xad\x33\x42\x95\x9b\x44\xe1\x75\xbb\xcb\x10\x54\xf3\x69\x56\xaf\x8a\xb0\x34\xb8\x2b\xff\xba\x19\x4b\x61\xa7\x64\x76\x17\xa2\xdd\xb2\x22\xc3\xf9\x9a\x99\x1e\x41\xe6\x88\x26\x87\xca\x56\x9c\x61\x85\xc1\x71\xb9\x7a\xc6\x02\x5d\x1a\x0c\x8b\x6e\x8f\x50\xd6\x53\x3c\x8a\x83\x36\x9f\x52\x85\x9d\x3d\xe8\x9a\xd4\xf1\xf9\xe9\x2f\x2f\x2f\x97\x26\x60\x51\x3b\x0b\x76\x0e\xc2\x02\x82\xa1\x5a\x5b\xe1\xb4\x99\xb1\xb6\x4e\x2e\x7f\xb1\x03\x38\xb9\x78\x6b\x07\x80\xaa\x68\x1d\x0f\x6a\xcc\x6f\xb0\x24\x9b\xad\xc8\xaa\xc7\xbf\x51\xee\xe6\x86\x0d\xfd\xde\x08\x43\xc5\xbc\x14\xac\x9e\xa4\x93\xa5\x61\xd6\xff\xdc\x50\x6d\x98\xa7\x9b\x73\xe4\xf0\x99\x8b\x72\x0b\xe3\x4b\x27\x7c\xc2\x6a\x08\xeb\xa0\xe0\x00\x47\xd6\x9b\x40\xf4\x31\x2a\xa2\xee\x82\x69\x08\xcb\xe7\x37\x64\x49\x85\x90\xc7\xc3\xa8\xe2\x99\x32\xb8\x24\xc3\x1b\xd9\xdd\x1b\x59\x70\x24\xbc\x25\xe3\xc0\x50\xae\x4b\x25\xfe\x68\xa9\x59\x70\xda\xb3\x91\xe8\xc8\x3a\xf0\x5e\xab\x50\xc2\x2d\xca\x86\x82\x2a\x2b\x9c\x81\x21\xa6\x0b\x8d\x9a\xa3\xe0\x97\xd8\x0c\xce\xb4\x21\x10\x6a\xa2\x47\x30\x75\xae\xb6\xa3\xc3\xc3\x52\xb8\x14\xc3\x73\x5d\x55\x8d\x12\x6e\x76\xe8\xc3\xb1\x18\x37\x1c\x0e\x0f\x0b\xba\x25\x79\x68\x45\x39\x44\x93\x4f\x85\xa3\xdc\x35\x86\x0e\xb1\x16\x43\x2f\xac\xf2\x71\x3c\xab\x8a\x7f\x33\x31\xea\xdb\x27\x4b\xea\x5b\x6b\xcc\x90\xc2\xe6\x46\x5d\x73\xf0\x0c\x56\x14\xb6\x87\xb3\x74\x2a\xe5\x21\xd6\xca\xc5\x7f\x5d\x7e\x82\x24\x40\x50\x7b\xd0\x70\xb7\xd4\x76\xca\x66\x45\x09\x35\x21\x13\x56\x4e\x8c\xae\x3c\x15\x52\x45\xad\x85\x72\xc1\xa5\xa5\x20\xe5\xc0\x36\xe3\x4a\x38\xeb\x6d\x8e\xac\xe3\x7b\xc8\xe0\xc4\x43\x18\x8c\x09\x9a\x9a\x3d\xa9\xc8\xe0\x54\xc1\x09\x56\x24\x4f\xd0\xd2\x57\x57\x35\x6b\xd4\x0e\x59\x7d\xbb\x2b\x7b\x1e\x81\x57\x37\xac\xf8\x18\x40\x42\xc8\x9d\x16\xf7\x39\x25\x04\x0f\x5c\x17\x81\x61\x83\x2f\xf2\x07\x8b\xc2\x90\x5d\x33\xb1\xe2\x90\x61\x61\xb0\x93\xa9\xb6\x7c\x7f\xe8\xe0\xe3\xfb\x33\xc8\x51\x41\x63\x89\x9d\x27\xd7\x4a\xb1\x41\x38\x0d\xc8\x58\x36\xa4\x7b\x61\xbd\x01\x19\x2a\x85\x75\x66\x96\xc1\x3b\x6d\x2a\x74\x23\xf8\x3e\x0d\x0d\x3d\x39\x6d\x40\xd4\x3f\x8c\xbe\xaf\xb5\x71\x3f\xc0\x47\x25\x67\x4c\xb4\x80\xbb\x29\x29\xb8\x6c\xcf\x06\xaf\xe7\xbe\xfc\x64\xea\x3c\x83\xd3\x52\x69\x93\x56\xb2\x55\x9d\x56\x58\x12\x4c\x04\x49\x6f\xd7\x96\x5c\xb6\x7c\x83\x1b\x6f\x11\x42\xba\x34\x11\xe5\x19\xd6\x5b\x55\x73\x92\x56\x32\x2f\x66\x3f\x0f\xde\xdd\xa4\xd3\xde\x94\xf9\x48\xfc\x2f\xe6\x37\x80\x91\x4b\x85\xf5\xd0\x7a\xb7\x99\x53\xd3\x6e\x1a\x38\x49\x04\x58\x7f\xdd\xf0\x69\x8c\x5c\xd9\x43\x8f\x3d\x7f\xb2\x07\xef\xed\xd2\x90\xad\x4a\x3b\x5b\x87\x22\x3b\xf0\x10\xf9\x26\xc1\xd6\xfa\x0c\x6c\xf4\x1b\xf0\xbe\x33\x46\x4b\xaf\xbe\xe9\x11\x28\xa0\x5e\x21\xd0\xad\xfa\x16\x6c\xf1\x2f\xfe\x74\xc4\xd7\xcf\x6f\x39\x32\xf8\xb8\x12\xd9\x3f\x8a\x82\x60\x7f\xd8\x7a\x25\xc1\x6b\xd8\xbf\x55\x9b\x30\x0c\x93\x3d\xfa\xf2\x01\x85\x22\x13\xa8\xb1\x0d\x0b\x65\x1d\x2a\x27\xd0\x91\xcf\x40\xa2\x37\x47\x4b\xbe\x13\x6e\xba\xab\x15\x47\x3f\x9e\x40\x84\x91\x81\xf7\x9d\x18\x9b\x3a\x47\x16\xc1\xd1\x1f\x6c\xd4\xb5\x11\xda\x08\x37\xdb\x1e\xe5\xce\xe3\xca\xc8\x13\xad\x15\xa5\xe2\x88\x77\x47\xa2\x9c\xba\x94\x1f\xc4\x4c\x14\x12\x14\xea\xc4\x42\xfc\xc1\xc0\x48\x15\x58\x1d\xe2\xa3\x70\x3e\x3c\x8e\x89\x15\x68\x9b\x8a\x0a\x18\xcf\x3c\x8d\x82\x6a\x52\x05\xa9\x7c\xe6\x31\x55\xde\x92\xc9\xe0\xb3\xe5\x9b\x82\xff\x16\x25\xe7\xbd\x91\xa9\x50\x85\xe0\xc2\xc8\x06\x92\x1e\x4e\x97\x24\x10\x96\x55\x37\x21\xc3\x71\x50\xb3\xfa\xa5\xbe\x6b\x29\x50\xb1\xb4\xde\x42\xd1\x78\xa4\x5f\x16\xa2\x61\x3d\x64\x3e\xfd\x36\xa8\xca\x36\x8c\x25\x0d\xc6\xd4\x80\x8f\x54\xea\x80\xe9\x3e\xef\x14\xb7\x5e\x0b\x8a\x4a\xf4\xff\x8b\x10\x88\x5b\x1a\x42\xb9\x97\x2f\x02\xdd\x82\x26\xd8\x48\x17\x29\x79\xa0\x58\x3a\x0c\x5b\x0e\x34\x2a\x28\x9f\x8a\x8e\xf9\x9d\x4f\xdf\xc6\x04\xcf\x03\xa9\x75\xfb\x98\xad\xe5\x00\xbc\x28\xb2\x85\x3b\x21\x25\xef\x35\xa8\x6e\xa8\x00\x49\xf7\x22\xd7\xa5\xc1\x7a\x2a\x72\x94\x72\xe6\xdd\xb4\x00\xad\x80\x33\x11\x8e\xe1\x1b\x40\x83\x33\xc3\x72\xa1\x98\x88\x96\x96\xca\x8c\x07\x07\x4f\x4b\xb9\x21\xb7\x1d\x88\x2f\xc3\xba\x2e\xe5\x62\x78\x63\x15\x47\x02\xc1\x46\xa2\xcd\x25\xb4\xc1\x3c\x67\x47\xf2\xa6\xab\x95\xe3\x44\x6d\xa9\xa8\xca\xe0\xd4\xb1\x15\x8d\x39\xef\x75\x1a\x6e\x88\xea\x60\x69\x5c\x5e\x83\xad\x50\xca\x01\x17\xc4\x39\x01\x61\x3e\x0d\xea\x54\x14\xd1\x8c\xc0\x19\x41\x05\x4c\xb4\x01\xba\x25\x8e\x17\xf1\x6e\x48\x31\x9a\xf5\x6a\x03\x8d\x59\x28\x4e\xd3\x47\x38\xaa\x7a\xc2\xe9\x66\x35\xb6\x31\x65\xbb\x26\xbb\x58\x14\x81\x3b\x55\xbc\xb6\x6b\x2e\x3c\x80\x75\xc8\x52\x2f\x9d\x41\x47\xe5\xf6\x58\xf3\x79\x61\x79\x5b\xe5\x4c\xf5\x5d\xca\x77\x57\x9c\x9c\x03\xaf\x4d\x77\x5b\x08\x9b\xb3\xa7\x53\xc1\x49\x86\x15\x36\xdc\x29\xaa\x50\xb6\xdc\xa2\x0c\xa6\x90\x08\xd7\x5a\x4a\xef\xf2\x8d\x09\x35\x12\x57\x33\xa8\x80\xaa\x31\x15\x05\xd7\x40\x49\x94\x1e\x98\xdb\x02\xb1\xdb\x50\x30\xe1\xc3\xb9\x96\x72\x33\x8a\xf5\xb2\xd8\x85\x0d\x7f\x92\x02\xfa\x57\x2c\x43\x5f\xd2\x98\xb0\xad\xcf\x14\xe4\xc8\x54\x42\x51\x30\x0d\x51\x51\xa7\xd8\x31\xb9\x3b\x22\x05\xf9\x94\xf2\x9b\xd6\x95\x62\xd5\xb8\x74\x6b\xb1\x64\x5d\x8c\x58\x5d\x41\xae\xa5\xf4\x65\xa7\x25\x02\x31\x01\x04\x45\x77\x69\xcf\x92\x8f\xce\x05\x7b\xbc\x45\x21\x71\x2c\xc9\xa3\x66\xfb\x6d\xb0\x50\xbd\x26\x3c\xaf\x1b\x29\xa9\xf0\xf7\x5d\x5e\x9c\x9f\x80\x33\x38\x99\x88\x9c\xa7\x0a\x61\x28\x77\xe1\xc0\xbd\x47\x58\xe7\xbd\x8b\x37\xb6\xc6\x23\xac\x43\xd7\xac\xdc\xd1\x86\x0b\xde\x74\xb1\xb9\x56\xa1\x97\xb6\x3d\x3e\x5e\xb4\xa5\x68\x80\x02\xc7\xd9\x09\xfb\xc5\x62\xd7\x24\x83\x0f\xda\x51\xf0\x90\x33\xb2\x0c\xbb\x5e\x41\x17\x84\x56\xab\xb9\xe8\xca\x44\xb4\x11\xa5\x50\x28\xe3\xa1\x7c\xcd\xc9\x35\x8c\xd0\x6a\x00\x77\x53\x91\x4f\x7d\xb5\x3b\x26\xa8\x44\x69\xd0\xb5\x41\xb1\x93\x3b\xa2\x4b\xc4\xc5\x49\xc3\x45\x67\x06\xc7\x6a\xe6\xef\x7b\x42\xc8\x03\x4c\xd9\x19\x5d\x34\x39\xe7\x4b\x1c\x60\xb9\xac\xea\x88\xfc\xa3\x61\x74\x41\x6b\xfb\x27\x89\x49\x4a\xf4\x2c\x3b\x00\x0a\x69\x7d\x4c\xd7\x8a\x00\xb9\x56\x75\xad\x4d\x36\xc6\x78\xf4\x49\x0a\xf6\x60\x71\x7c\x7e\x0a\xa9\x31\x9d\xc1\x70\x38\x84\x4f\x3c\x6c\x9d\x69\x72\x8f\x2f\xec\x42\xaa\x88\x48\x11\xac\xcf\x1f\x12\x7d\xda\xe9\x8f\x01\x18\xb4\x1e\x52\xb0\x1a\xdd\x14\xb2\xa0\xf8\x6c\x4e\x15\xc0\x75\x24\xd0\x3d\x56\xb5\xb7\x7b\x0e\xdd\xef\xb4\xbe\x0c\x37\x14\x18\xfe\xe9\x0f\x7a\x78\xb8\x6c\x14\x7a\xcc\x39\x6a\x68\x8e\x07\xdb\x98\x68\xfd\xc4\x2e\x9e\x29\x4b\x9b\x7f\x56\xfa\x4e\xad\x13\xc1\xf3\x44\x43\x23\xb8\xda\x3f\x4e\x2e\x78\xb5\x3f\x80\xab\xfd\x73\xa3\x4b\xce\x5d\x85\x2a\x79\x80\x2d\xeb\x6a\xff\x2d\x95\x06\x0b\x2a\xae\xf6\x13\xe9\xff\xa8\xd1\xe5\xd3\x33\x32\x25\xfd\x4c\xb3\xd7\x9e\xe0\xc2\x54\x82\x87\xd7\x15\xaf\x69\xe7\x18\x93\x19\xb8\x5e\x73\xe1\x37\x3f\x78\x86\xf5\x02\xa1\x93\xce\x00\xbf\x5c\x57\xe4\xf0\xf6\x28\xeb\xae\xfa\xd7\xdf\xac\x56\xa3\xab\xfd\xee\x4c\x03\x5d\xb1\xc9\xd4\x6e\x76\xb5\x0f\x0b\x12\x8c\xae\xf6\xbd\x0c\x69\x3c\x09\x3d\xba\xda\x67\x6e\x3c\x6c\xb4\xd3\xe3\x66\x32\xba\xda\x1f\xcf\x1c\xd9\xc1\xd1\xc0\x50\x3d\xe0\x4c\xea\x75\xc7\xe1\x6a\xff\x57\xb8\x52\x49\x68\xed\x38\xcf\xf5\x37\x6d\xe1\xaf\xfd\x0d\x78\xbf\x01\x14\x36\x17\x77\x5c\xbd\x49\xb4\xee\x93\x41\x65\x45\x6a\xe2\xf6\x2e\xad\x42\x30\xe8\x9d\x37\x3e\x40\xf4\x4e\x07\x2b\xe9\x9d\xee\x81\xd6\x5d\x60\x6d\xf5\x0c\xfd\xf0\xb6\xe0\xdb\xab\x1b\x53\xbe\xc3\x33\x01\xd9\x62\x66\x18\xed\xc2\xb5\xab\xd9\x51\x39\xc9\x67\xff\x8f\xc1\x8f\xd3\x49\xe5\xef\x2d\x8b\xce\x3d\x4d\x69\x79\xdb\x80\x69\x54\x41\x46\xce\x38\xdd\xe8\xa8\xe6\x53\xae\x06\x8a\x0c\x18\xb2\x42\x71\x64\x41\x69\x07\x37\xec\x60\x1e\xba\x14\x34\x36\x75\x1b\xbd\x5c\x2d\x45\x0e\x2c\x21\x20\x44\x32\x1e\x05\xf3\x9c\x6a\xe7\x61\xb0\x57\x15\x5b\x4b\x6b\xfe\x4c\x62\x4b\x8a\xd3\xae\xa1\xeb\x37\x8f\x68\x1c\x3b\x2a\x3e\xae\x8e\x2d\xb3\xa6\x42\xc6\x15\x2c\x58\xde\x6e\x2e\xd4\x76\xa1\x16\x0b\xf1\x16\xc7\xba\x09\x11\xb0\xbb\x87\xa8\xea\x88\x32\x3e\x6b\xab\xdd\x2c\x1e\xeb\x6f\x1e\xbe\xc2\xfb\xf7\xa4\x4a\x37\x1d\xc1\xcb\x17\xff\xf9\xea\xdb\x9e\x85\x21\x68\x52\xf1\x13\x29\x0a\x19\xe4\x8e\x6a\x58\xdd\x38\xd7\x2f\xf6\xe7\xec\xde\x59\xca\x6e\x4d\xac\x75\xe7\xed\xf2\x0e\x7d\x33\x2f\x62\x69\x53\xb3\x5e\x18\x05\x42\x23\x22\xa7\x01\x67\x50\x6b\x89\x89\x36\xb8\xcb\x19\x1c\xbd\x18\xc0\x38\xaa\x78\x35\xac\x7f\xb9\xbf\xce\xd6\x88\x2c\x2c\x7c\x37\x58\x92\x47\x58\xe0\xab\xd2\x13\x6f\x38\xa1\xfe\x34\x14\x60\x32\x75\x0a\x56\x61\x92\x5a\x79\xb7\x5d\x5c\x5f\x95\x99\x3e\xc9\x6c\x85\x72\xaf\xbe\xe9\xbf\x5f\xa1\x44\xd5\x54\x23\x78\xde\xb3\x24\x84\xb4\x1d\x6f\x33\x2c\xee\xb2\x04\xe4\xd0\x55\x1a\xac\x38\x1f\xca\x41\x14\xa4\x9c\x98\x08\x32\xf3\xa6\xed\x7b\x01\x61\x23\xe3\xfe\x82\x16\x9f\xd8\x18\x87\xe6\x8c\xfd\x3c\x24\x41\xc6\xa3\x33\xeb\x53\x70\xbe\x3a\x17\xa0\x66\x35\x05\x6f\x08\xd5\x0d\xd0\x7d\x1d\xf2\xd8\x58\xec\xfb\x97\x1a\x42\x25\x54\x69\x23\x4b\x11\x1b\x49\x01\x8d\xef\xa6\xe4\xa1\xc7\x3f\x2a\xc5\x3d\x26\x34\x69\x44\xe1\x8b\x2a\x84\xb2\x41\x83\xca\x71\x8d\x7b\x7c\x7e\x1a\x12\xf8\xd0\xb5\xe8\x42\x1e\x76\x0f\x12\xc9\x1b\x83\xab\x86\x60\xc5\x22\xc6\x47\x0c\xef\xb1\xff\x9c\xab\x1e\x3d\x7f\xb1\xf1\xca\xdb\x75\xbd\x8b\x6a\x74\x8e\x8c\x1a\xc1\xff\x7d\x39\x1e\xfe\x2f\x0e\xff\xb8\x7e\x1a\xff\x79\x3e\xfc\xee\xff\x07\xa3\xeb\x67\x73\x5f\xaf\x0f\xde\xfc\x7b\x0f\xa5\xf5\x99\x7e\x8f\xf9\x44\x10\x49\x49\x64\xba\xd1\x81\x47\x18\x3d\x81\x4f\xa6\xa1\x01\xbc\x43\x69\x69\x00\x9f\x95\x87\x86\xbf\xa9\x34\x52\x4d\xb5\xa9\x12\x1c\xc2\x3e\x73\x5d\x9f\x7c\xb4\x4b\xbc\x48\x9b\xd7\x44\x71\x37\xd5\xb6\xbb\x29\x29\xf5\x21\xe6\x22\xcd\xdc\xc3\x97\x7f\x29\x61\x47\xd2\x59\x4c\x7f\xb3\x5c\x57\x87\x73\x0f\x63\x9c\x77\x9f\xa1\x9a\x41\x17\xd6\x42\xb2\xba\x6c\xe9\xd6\x71\x6c\xc2\xdc\x68\x6b\xdb\x97\x3d\x0b\x52\xdc\x10\x1c\x77\x45\x25\x07\xcb\x31\xe5\xe8\x13\x75\x33\x16\xce\x60\xe8\x08\xa7\xdc\xb2\x6b\x37\x4d\x1a\x09\x4f\xb9\x96\xcd\x94\x2e\x68\x35\xba\x1e\xc4\xd6\xee\x58\x48\xe1\x66\xa1\xce\xce\xb5\x9a\x48\x11\xeb\x83\xaa\xd6\xc6\xa1\x72\xb1\x09\x49\x25\xdd\x83\x70\x50\x71\xce\x49\xfe\xf9\xe9\x69\xa1\xec\xd1\xd1\x8b\x97\x97\xcd\xb8\xd0\x15\x0a\xf5\xae\x72\x87\x07\x6f\x9e\xfe\xde\xa0\xe4\xc8\x53\x7c\xc0\x8a\xde\x55\xee\xe0\x9f\x83\xc5\xa3\x57\x3b\x78\xd1\xd3\x2f\xc1\x57\xae\x9f\x7e\x19\xc6\xff\x9e\xa5\xa1\x83\x37\x4f\xaf\xb2\x8d\xf3\x07\xcf\xf8\x0c\x73\x1e\x78\xfd\x65\xd8\xb9\x5f\x76\xfd\xec\xe0\xcd\xdc\xdc\xc1\x3a\x67\xbc\x1f\xde\x34\x63\x32\x8a\x1c\xd9\x21\x57\x03\xc3\x0a\xeb\xe1\x0d\xcd\x7a\x9c\xb3\x37\x1d\x5d\x25\x14\x34\x56\x61\xdd\xff\x4e\x76\x41\x13\x32\xa4\xf2\xb5\x46\xfe\x37\x9f\x67\x14\xf6\xa4\x64\x61\xca\xff\x04\xe7\x11\x2d\x29\xc6\x9d\xd0\x86\xdb\x94\x4e\xef\x60\x2d\xbb\xe5\x8f\xaa\xe7\x61\x6c\x27\x26\xed\x39\x1f\x4d\x21\xf9\x77\xcf\xef\x2f\x76\xa6\xd3\x88\xde\x4a\x6b\xb1\xc1\x79\xfa\x36\xa4\xbe\x3e\xf4\xf8\x74\x6e\xaa\xb9\xce\x6b\x94\xf8\xbd\x21\x38\x7d\x1b\xe3\xd1\x00\x84\xca\x65\x53\x70\xa6\xf0\xf9\xf3\xe9\x5b\x2e\xee\x7f\x8c\xe1\xe6\x8e\xa0\xd0\xea\x89\x83\x8f\x1f\xde\xff\x8f\xef\x14\xf8\x15\x83\x00\xe8\xe1\xb1\x0a\xa5\x08\x3f\xdd\x48\x00\x0c\x3f\x12\xd3\x8a\x9c\x73\xac\xdb\xe6\x8a\x0f\x77\xaa\x80\x29\xc9\x9a\x13\x88\x1b\x02\xdb\x98\x28\x1d\x13\xf6\xb3\x5e\xd7\x50\x68\x0f\xdd\x25\x39\x6f\xe4\xd2\xff\x04\xe1\x31\x4a\x8b\x8f\xe2\x42\xab\x4b\xce\x02\xbf\x82\x7f\xb0\x21\x7f\x8c\x39\xab\xe7\xf1\x08\x67\xd8\xf0\x4b\x80\xad\x27\x84\xe8\x4c\x27\xe1\xa4\x5f\xdd\x93\x56\xce\xfb\x28\x8e\xa1\xd9\xe9\x9f\x3d\x2f\xb6\x34\xa7\x57\x7e\x9c\xb6\x58\x3a\x2f\xfd\x20\xcb\x37\x5e\xdb\x97\xd3\x29\x5a\x18\x13\x29\xdf\xeb\x0d\xad\x41\x52\xd1\xea\xa8\xeb\xd2\x36\xf5\xd0\xe9\x61\xb1\xfe\xf2\xb6\x68\x6e\xbb\xd6\x36\x54\xae\x0b\x67\x3b\x7e\x70\xa1\x7a\x37\x9d\xad\xd3\x81\x0d\xbd\x4e\x2e\xbc\xda\x1c\xe4\xa1\x07\xeb\x2f\x4c\x96\x5a\xbe\xbe\xb2\x88\x4d\x8d\x58\x67\xac\x8a\xc4\xd5\xe3\x42\x67\xc3\x69\xff\xd4\xb7\xd8\xf5\x7b\xb8\x8c\xe1\x9a\x2f\xc9\xdc\x8a\x47\x81\xdf\x36\xc7\xf4\xbf\x3d\xa4\xe2\xf8\xeb\xbb\x15\xa7\x5e\x8f\x66\xe2\xdb\x7f\xb9\xde\xf2\xb6\xb3\x81\x80\x0d\x1a\xec\xfb\xf9\xc8\x43\x69\x3c\x14\x2c\x43\x34\x19\x81\x33\x4d\xd2\x8e\x75\xda\xf8\xf7\xf8\xf9\xb1\x66\xdc\x26\xca\x1d\xf5\x58\x03\xc1\x9f\x7f\xed\xfd\x2b\x00\x00\xff\xff\x50\x85\x51\xd2\xc8\x2d\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -104,7 +104,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\xe4\xb6\x95\x30\x8c\xff\x9f\x4f\x81\x92\xbd\x8f\xa4\x75\x77\x6b\x26\xc9\xe6\xb7\x3b\xbf\xbc\xeb\xd2\x4a\xb2\xa3\xd7\x33\x1a\x95\x24\xdb\x4f\xca\xf1\x3a\x68\xf2\x74\x37\x56\x24\xc0\x00\x60\x4b\x9d\xc7\xcf\x77\x7f\x0b\x07\x00\x09\xf6\x45\xea\x26\x39\xa3\x8b\x81\x54\xc5\xa3\x26\x09\x82\x07\x07\xe7\x7e\xa1\x05\xfb\x01\xa4\x62\x82\xbf\x23\xb4\x60\x70\xaf\x81\x9b\xbf\xd4\xe8\xf6\xdf\xd5\x88\x89\xa3\xf9\xdb\xdf\xdd\x32\x9e\xbe\x23\x27\xa5\xd2\x22\xbf\x02\x25\x4a\x99\xc0\x29\x4c\x18\x67\x9a\x09\xfe\xbb\x1c\x34\x4d\xa9\xa6\xef\x7e\x47\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x38\x05\x3e\xba\x2d\xc7\x30\x2e\x59\x96\x82\xc4\xc9\xfd\xab\xe7\x6f\x46\x7f\x1a\xbd\xf9\x1d\x21\x89\x04\x7c\xfc\x86\xe5\xa0\x34\xcd\x8b\x77\x84\x97\x59\xf6\x3b\x42\x38\xcd\xe1\x1d\x49\xb2\x52\x69\x90\x0a\xe4\x9c\x25\xe0\x9e\x57\x23\x51\x80\xa4\x5a\x48\x35\x4a\x84\x04\x61\xfe\x93\xff\x4e\x15\x90\x98\x55\x4c\xa5\x28\x8b\x77\x64\xed\x3d\x76\x5e\xbf\x58\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\x0e\x08\xf6\xf5\xd7\xf6\xf5\x0e\x72\x78\x3d\x63\x4a\x7f\xb7\xf9\x9e\xf7\x4c\x69\xbc\xaf\xc8\x4a\x49\xb3\x4d\x1f\x82\xb7\xa8\x99\x90\xfa\xa2\x5e\x96\x59\x46\xa2\xe6\xe1\xbf\xdd\x8d\x8c\x4f\xcb\x8c\xca\x0d\xb3\xfd\x8e\x10\x95\x88\x02\xde\x11\x9c\xac\xa0\x09\xa4\xbf\x23\xc4\xbf\xcb\x4e\x3e\x24\x34\x4d\x71\x23\x69\x76\x29\x19\xd7\x20\x4f\x44\x56\xe6\xbc\x7a\xb9\xb9\x27\x05\x95\x48\x56\x68\xdc\xac\x9b\x19\x20\xd4\x88\x98\x10\x3d\x03\x72\x72\xfd\x43\x75\x2b\x21\xff\xa3\x04\xbf\xa4\x7a\xf6\x8e\x8c\xcc\x06\x8c\x52\xa6\x8a\x8c\x2e\xcc\x12\x82\xbb\xec\x6e\x9e\xda\x6b\xc1\xef\x7a\x61\xd6\xab\xb4\x64\x7c\xfa\xd0\xfb\xdd\x47\x6c\xb7\x84\x79\xb0\x4f\xe1\xeb\x7f\x58\xf9\x7d\xdb\xd7\xfb\xcf\xa7\xe6\xcd\x44\xcf\xa8\x26\x7a\xc6\x14\x11\x1c\x88\x84\x22\xa3\x09\xa8\x07\x16\xb4\xe6\x16\xbb\xa2\xab\xd5\x0b\x1b\x96\x14\x4e\xa9\xa9\x2e\xd5\xa8\x98\x51\xb5\x0a\xe2\xcb\xa5\x5f\xd7\x4c\x67\x6f\x9c\xbf\xa5\x59\x31\xa3\x6f\xdd\x8f\x2a\x99\x41\x4e\x6b\x1c\x10\x05\xf0\xe3\xcb\xf3\x1f\xfe\x70\xbd\x74\x81\x34\xa1\xb3\x16\xfb\x09\x53\x06\x54\x48\x41\x88\x27\x21\xb8\x77\x8b\x02\xc8\xdf\xd7\x3e\x73\x5d\x40\xf2\xf7\xd1\xca\xca\xc5\xf8\x7f\x20\xd1\xc1\xcf\x12\xfe\x51\x32\x09\x69\xb8\x22\x03\x20\x4f\x96\x96\x7e\x36\xf0\x0f\x7e\x2a\xa4\x21\x0b\x3a\x38\xf2\x76\x04\x74\xb1\xf1\xfb\xd2\xd7\xee\x1b\x90\xb8\x6f\x4c\x0d\x49\x04\x85\xf8\xe8\x30\x0e\x52\x07\x47\x8b\xa7\x4c\x19\xe4\x90\xa0\x80\x5b\x22\x89\x28\xc4\xdd\x37\x8d\x88\x01\x00\x48\x65\x08\x40\x99\xa5\x86\x76\xce\x41\x6a\x22\x21\x11\x53\xce\xfe\x59\xcd\xa6\x88\x16\xf8\x9a\x8c\x6a\x50\x9a\xe0\xa9\xe5\x34\x23\x73\x9a\x95\x30\x20\x94\xa7\x24\xa7\x0b\x22\xc1\xcc\x4b\x4a\x1e\xcc\x80\xb7\xa8\x11\xf9\x20\x24\x10\xc6\x27\xe2\x1d\x99\x69\x5d\xa8\x77\x47\x47\x53\xa6\x3d\xd5\x4f\x44\x9e\x97\x9c\xe9\xc5\x11\x12\x70\x36\x2e\x0d\xe1\x3c\x4a\x61\x0e\xd9\x91\x62\xd3\x21\x95\xc9\x8c\x69\x48\x74\x29\xe1\x88\x16\x6c\x88\x8b\xe5\x48\xf9\x47\x79\xfa\x85\x74\x9b\xac\xf6\x97\xc0\xb7\x16\x9d\x89\x27\xb0\x0f\xc2\xda\x90\x57\x8b\x49\xf6\x71\xfb\x2d\x35\x48\xcd\x4f\x06\x2a\x57\x67\xd7\x37\xc4\x2f\xc0\x9d\x4b\x84\x70\x7d\xab\xaa\x81\x6d\x00\xc5\xf8\x04\xa4\xbd\x73\x22\x45\x8e\xb3\x00\x4f\x0b\xc1\xb8\xc6\x3f\x92\x8c\x01\xd7\x44\x95\xe3\x9c\x69\x85\x38\x07\x4a\x9b\x7d\x18\x91\x13\x64\x7a\x64\x0c\xa4\x2c\x52\xaa\x21\x1d\x91\x73\x4e\x4e\x68\x0e\xd9\x09\x55\xf0\xc9\x41\x6d\x20\xaa\x86\x06\x7c\xdb\x03\x3b\xe4\xd9\xab\x0f\xac\x9c\x31\x42\x3c\x2f\xdd\xb8\x3b\x1b\xcf\x30\x49\x21\xc9\xa8\xb4\x42\x01\xd1\x90\x65\xe4\xe3\xfb\x0f\x64\x26\xee\x0c\x16\x33\xae\x34\xcd\x32\x3c\x05\x8e\x3f\x5b\x72\x9a\x50\x4e\x72\xca\xe9\x14\x08\x2d\x0a\x45\x26\x42\x12\x4a\xa6\x6c\x0e\xdc\x9f\xae\xd1\xb6\x8b\xdf\x44\x24\x88\x25\xee\x6b\x19\x94\xbf\xea\x16\xb8\x74\x65\x13\xd9\x30\x63\x45\x06\x7a\x00\x6a\xc7\xf5\xbd\x88\xd9\x9c\x94\x5c\x69\x59\xe2\x66\xa7\xe4\x16\x16\x0e\xc9\x73\x5a\x10\xa5\x85\xf9\xf1\x8e\xe9\x19\xa1\x21\x82\x53\x8d\x58\x3c\x06\xa2\x40\x93\xf1\x82\x18\x31\x0e\x09\x82\x16\x22\x43\x6a\x81\xcf\x22\x61\x90\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\x15\x36\x2c\x03\xf4\x11\xa0\xe2\xc7\x06\xc2\xc3\x66\x90\x90\x87\x70\x91\x58\x72\xeb\x64\x97\xb4\x12\x2c\xb7\x80\xde\xe5\xb9\xc3\xb7\x5a\x1c\x55\x0e\xdf\x40\x11\x83\x57\x4e\x3e\xa8\xe4\x5a\x7c\x93\x43\xac\x94\x08\x59\x61\x86\x01\x5b\x88\x84\x63\x30\xe4\x44\x52\x6e\x2e\xac\x45\xee\x16\xd0\x7a\x08\x6d\xcc\x10\x77\x7c\x1d\x8e\x86\x73\x53\x29\x1b\x02\x53\x38\x98\x86\x7c\xc3\xcc\x0f\xc2\xae\xfa\xd9\x2c\x70\xce\x52\x30\x40\xd4\x94\x59\xd4\x31\xa7\x95\x8e\x45\xa9\x2d\xec\xdc\x2d\x29\x99\x33\x4a\xe8\x74\x2a\x61\x8a\x08\xbc\xf1\xb5\x8f\xc0\xc4\x8e\xcd\x07\xb4\x1e\x43\x2b\xc9\x3f\x78\x87\x21\x83\x0f\xde\xc0\xd7\x1d\xf3\xf0\x86\x55\x61\xb1\x39\x1e\xdb\x43\x3b\x68\x62\x60\xe2\x41\x2b\xe4\x83\x37\x6f\xb3\xb7\x76\x3c\xb2\xc3\x76\x34\xf7\x79\x69\x21\xee\xea\xd8\x9c\x8f\x9a\x34\x1b\x72\x80\x37\xd6\xc4\x77\x0c\xa4\x00\x39\x11\x32\x37\x07\x85\x13\x4a\x12\x2b\xbf\x55\x84\x07\x49\x23\x4f\x1e\x02\x27\xd9\x76\xff\xed\xd8\x06\x0b\xec\x18\x92\x82\xea\xd9\x23\xb7\x6d\xb7\x55\x76\x84\x40\x7b\xf4\xe6\x47\xa8\xd9\xca\xdc\x35\x87\xe9\x7d\x6e\x03\x86\xde\x27\x45\x9e\xb3\xcd\xac\x0d\x54\xbb\xa2\x77\x1f\x40\x29\xc3\xb2\x51\x4a\x93\xf4\x8e\x00\x4f\x84\x21\x16\xff\xef\xf5\xc7\x0b\x3b\xed\x88\x9c\x6b\xc2\xf2\x22\x83\xdc\x08\x62\xe4\x03\x95\x6a\x46\x33\x90\xc8\x9d\xbe\xe7\x79\xe3\x6f\x87\x89\xa5\x82\xd4\xd0\xa2\x14\x32\xba\xb0\x93\xa5\x90\x88\xd4\xd0\x68\x21\x49\x61\x04\xdc\xbc\x28\x35\x10\x6a\xaf\xe2\x7b\x19\x9f\xae\x23\xd2\x9d\x40\x43\x8c\x24\x92\x53\xfd\x8e\x8c\x17\xfa\x31\xd4\x27\xe4\x7e\x98\x6e\x4b\x03\xc2\xc5\x3c\x4e\x09\xec\xd8\x8a\x1e\x84\x13\x3f\xfa\x95\x46\x08\xa5\x8c\x83\xbc\x14\x52\x6f\x43\xb4\x8c\xf2\x31\x05\xf9\xe0\x9d\x1e\x64\x8c\xeb\x3f\xfc\xfe\x81\x3b\x53\x28\x32\xb1\x30\x78\xf1\xf8\x59\xd9\xf2\x7b\xb6\x3e\xd7\xdb\xce\xb7\xed\x59\xde\x72\x3e\x6b\x9c\xea\x63\xa6\x75\x0a\x54\xab\x89\x78\x5f\xdf\x56\x29\x81\x4f\xc6\xfc\x2e\xcf\xbd\xb5\xe1\x0a\x26\x20\x81\x27\x8e\x36\x7d\x57\x8e\x41\x72\xd0\xa0\x02\x41\x7a\x51\x38\x4a\x63\x64\xc1\x65\x76\xf7\x34\x5c\xee\x11\x79\xc6\xdf\xf6\x88\x54\xe3\x6f\x7b\x4c\xb6\xb1\x63\x17\xb6\xf9\x38\xd2\xd9\xb1\x13\x8d\x7d\x1c\x01\x5b\x4c\x3a\x5f\x6f\xce\xe9\x30\xaf\xd1\x89\x9f\x81\x84\x77\xdd\x58\x46\x43\xbe\x9b\x30\xc8\x52\xc2\x8c\xf0\x66\x16\x4b\xc6\x99\x48\x6e\x9d\xdd\xf2\xea\x94\x28\x61\xc5\x3d\x23\xe1\x1b\x46\x9b\x08\xae\xca\x1c\x08\x7b\x0c\x83\xa3\x48\x17\x45\xba\x28\xd2\xbd\x14\x91\xce\xfa\x07\x9e\x03\xa5\x5a\x5a\xc8\x46\x5a\x85\xf7\x45\x6a\xf5\xd0\x88\xd4\x0a\x47\xa4\x56\x8f\x8c\x17\x47\xad\xb6\x92\xd3\x1e\x9d\xeb\xb1\x83\x1c\x8d\xa9\xd1\x98\x1a\x8d\xa9\x6e\x44\x5e\xe6\x46\xe4\x65\x91\x97\x45\x63\xea\x43\x53\x46\x63\xea\x8e\x13\x45\x63\x6a\x34\xa6\x46\x63\x6a\x34\xa6\x3e\xf6\x31\x51\xa4\x8b\x22\x5d\x14\xe9\xb6\x5d\x4c\x34\xa6\x46\x63\xea\x43\x23\x52\xab\x60\x44\x6a\xf5\xc0\x78\xdd\xd4\xaa\xbb\x31\x35\xc9\x80\xf2\xf5\x4a\xd5\x52\xfc\x37\xde\x87\xa2\x11\x9b\x30\x97\x07\xe1\x9e\x26\x63\x98\xd1\x39\x13\xa5\x24\x77\x33\xe0\x3e\x65\x87\x4c\x41\x2b\x83\x05\xa0\x61\x9d\x60\xfe\x08\xad\x79\x98\xbe\x0c\x09\x70\x3a\xce\xd6\x4e\xfc\x18\x29\x71\x4f\x3e\x6c\x3c\x1e\x0b\x61\xbe\x6e\x15\x62\xa8\xea\x78\x4d\x67\x97\x78\xe6\xbd\x4d\x39\x76\xeb\x83\x9a\x4f\xae\x4e\xfb\x0a\x65\x26\x7f\xe3\xe4\xbc\x9a\x95\xa0\x65\x1a\x13\x25\x0c\x0f\x31\xbf\x7e\xbc\xe3\x90\x62\x92\xdb\x80\x30\x6d\x6e\x30\x87\x9e\x25\x4c\x67\x8b\xea\xc5\xa3\xbd\xdd\x37\xf1\x19\x85\x44\x9f\x5c\x9d\x6e\x6f\xbe\xf7\x1b\xf0\x39\x2c\xf5\xd1\x0e\x1f\xed\xf0\xd5\x88\x62\x50\xcb\x49\xa3\x18\xf4\xc0\x78\xdd\x62\xd0\x73\xb7\x5b\x47\x6b\x33\x89\xd6\xe6\x87\x6f\x8b\xd6\xe6\x68\x6d\x8e\xf6\x9b\x0d\x23\x0a\x2e\x38\xa2\xe0\xf2\xc8\x78\x71\x82\x4b\xb4\x36\x47\x6a\x15\xa9\x55\xa4\x56\x2f\x83\x5a\xbd\xc4\xd0\xdd\x68\xf4\x8b\x46\xbf\x68\xf4\x8b\xdc\x28\x72\xa3\x47\xc6\x8b\xe3\x46\xd1\xe8\xb7\xeb\x44\xd1\xe8\xb7\x76\x44\xa3\xdf\x23\x23\x1a\xfd\xa2\xd1\x6f\xc3\x88\x82\x4b\xcb\x49\xa3\xe0\xf2\xc0\x78\xdd\x82\x4b\x34\xfa\x45\x6a\x15\xa9\x55\xa4\x56\x2f\x83\x5a\x75\x37\xfa\x3d\x72\x92\x1e\x7e\xf6\xe1\x93\xf2\xe0\xb3\x2c\x79\xe8\x85\x9b\x20\xfa\x00\x04\x1f\x25\x5c\x8f\x91\xab\x21\x19\x53\x05\x7f\xfa\xe3\x4a\xdd\xf2\xf0\x96\x1c\x52\x46\xcd\xab\xd6\xde\xf1\x38\x09\xab\x5f\xb1\x79\xcf\xb6\xd8\xfb\x6a\x19\x2d\x67\x71\x85\x95\x1f\x0d\x8a\x35\x5b\x9b\x9e\xdb\x9b\xaf\xb5\xa4\x1a\xa6\x8b\xa0\x90\x37\xda\x64\x6b\xce\xc3\x37\x14\xa0\xaf\x94\xc6\xbb\x19\x48\xc0\x87\x7c\xe9\x69\xe5\x27\x65\xaa\x8a\x5e\x4e\x5b\x14\xf7\x7d\x2c\x1c\xd9\xbf\x67\xcd\xe5\xc7\x36\x6d\x5d\xf5\xed\xb5\xc0\xf2\x00\x3a\xb5\xd6\xeb\xd3\x2a\x05\x78\x19\x62\x05\x95\x86\x42\x7a\x2b\x37\x32\xed\xe0\xee\x25\x78\x6f\x22\x8a\x5b\x70\xea\xc7\x39\xf4\x30\xc8\x54\xde\x64\x59\xdf\x86\x31\xbb\x1e\x18\x97\x20\x73\xa6\xd4\xa6\x80\xeb\xe6\xd2\x1f\x23\x9b\x5b\x90\xcb\x0d\xf0\xf7\x5f\x14\x2c\xa7\x12\x9f\x70\x07\xe4\x98\x26\x44\x96\x99\x11\xa6\x78\x4a\x5c\xf9\x6b\x42\x93\x44\x94\x5c\x13\x0e\x90\x5a\xcb\xc6\x3a\x5c\xdd\x82\xd8\x6e\x21\x3f\x6d\x2b\x3d\x0d\xed\x3a\x1f\xbd\xcb\x7d\xc3\xb1\xfd\x84\xb5\x05\xd5\xc3\xb1\xbd\xb4\x85\xaf\x7f\x9c\x6b\xed\xc2\x0a\xb7\x66\x84\x8d\xfd\xbd\x14\x19\x4b\x16\x57\x65\x06\x64\x26\xb2\x54\x61\x59\x7f\xc3\xdd\x2b\x87\x43\x28\x22\x17\x78\x37\xae\x7e\x40\xc6\xa5\x26\xa9\x00\x45\xb8\xd0\xbe\x30\x40\xe3\x71\xeb\x62\xba\x9b\xd9\xd6\x0e\xe6\x21\x42\x8b\x22\xc3\x54\x0a\x61\x84\x96\xbb\x19\x4b\x66\xb6\x5f\x4d\x41\x13\x58\x77\xdb\xf6\xd2\xcb\x56\xe2\x35\xd9\x49\xc4\x26\xde\x66\x35\x7e\x0c\x55\xc8\x8e\xb2\x36\xb1\x25\xe2\xbf\x95\xa2\x2c\xb6\xbc\x7d\xd5\xb2\x68\x9f\x36\x54\x5e\x2f\x35\xb0\xf1\x17\x9d\xcb\xc8\xee\x8d\xbd\xad\x32\x89\x8e\x08\x39\x9f\x90\xbc\xcc\x34\x2b\x32\x7c\xc4\x56\x1b\x50\x84\x4a\xa8\xf9\xc6\x80\x50\xbe\xf0\x1e\x28\xd7\x26\x02\x52\x42\xa7\x66\x46\x8d\xfd\x61\x7c\x49\x7a\x5e\xe6\x60\x4e\x73\x5a\xbf\x04\xd5\x29\xbe\xa8\x67\x27\x77\x2c\xcb\x8c\x3c\x4b\xb3\x4c\xdc\xad\x67\x4b\xeb\xc6\x6e\x42\x21\xd9\x4d\x30\x24\xbb\x8b\xc0\x84\x70\xc1\xbd\x69\xf7\xfb\xab\xf7\xed\x36\xf1\xa2\x39\x87\xeb\x05\x02\xda\x80\xb4\xa0\x52\x33\x9a\x91\x52\x66\xca\xee\x23\x35\x4a\x80\xf4\xcd\x54\x66\x14\x3d\x83\x09\x28\xdb\xb5\x83\xfc\xab\xdd\x39\x07\x58\x7b\x3e\x05\xcf\x16\x84\xda\x9d\x9f\x94\x59\x36\x20\x13\xc6\xa9\x21\xbb\x50\xf8\x4c\x18\xa3\x3f\x91\x6b\xc6\x13\x30\xdf\x34\xac\x04\x0b\x5c\x91\x99\xd1\x9c\xef\xea\x90\xa6\x03\xd7\x56\xc4\x6a\xcb\xca\xbd\xc2\x1c\xd8\x84\x8e\x33\xc0\xbe\x16\x4e\x64\xb9\x12\x19\x9a\xb7\x9d\xe1\x3b\xb5\xbd\x48\x68\x78\xf9\xbf\x18\x47\x25\x85\x5c\x21\xe3\x30\xca\x0e\x30\x3d\x33\xba\x4f\x51\x64\x0b\x43\x28\x0c\xee\xd4\x08\x75\xa0\xca\x64\x66\x3e\x69\xaf\x10\xa9\xda\x33\x64\x64\x4f\x41\x22\x41\xab\xbd\x43\xf3\xd7\xf2\x37\xe0\xf7\x85\xcf\x1d\xd1\x82\xed\x1d\x0e\x08\x02\x08\x1b\x9d\x08\x3d\x7b\xb9\x78\xe8\xbf\xb5\xd1\x5f\xeb\xb1\xd1\xd4\x5a\xc3\x19\x5c\xd7\x0e\x51\xd8\x26\x18\x86\x46\x6b\xc0\x3c\x29\x83\x94\x88\x06\xbe\x3d\xd4\x2a\xb1\x26\xe4\x98\x13\xc8\x0b\xbd\x40\x2c\xce\x81\x72\x77\x37\xcc\x41\x2e\xf4\xcc\x68\xab\x4c\xbd\xfc\xc3\xbf\xa5\x63\xa9\x1e\x6b\x01\xee\x0e\xbc\x07\x6e\x8d\xe4\xb6\xb3\xd2\x32\x70\xf7\xff\x75\x3f\x94\x7a\x8d\xf8\x54\x53\xf3\x17\x0b\x4a\x64\xaf\xad\xc0\xf8\x83\x79\xb2\x09\x42\xfb\x93\xa5\x96\x15\xfd\x78\xff\xde\x76\x51\x72\xb0\xfa\x8e\xf1\xd4\x8a\xa8\xc7\xda\xb6\x27\x82\x2b\x30\x0b\x4e\x6c\x66\xa2\xaf\x71\x94\x5a\x02\xe9\x76\x62\x2d\xf8\x71\xed\x2f\x11\xf4\xab\x82\xed\xb6\xc2\xe8\x23\xd3\x07\x9a\xcf\x73\x50\x56\xb0\x5f\x53\x43\xfe\x31\x14\x6c\x60\x9d\x51\x06\x05\x32\x3a\x86\xcc\x36\x63\x32\x57\xeb\xe5\x93\xe3\xf7\x1f\xaa\xbe\x65\x12\xe8\x23\x96\xae\x4f\xa0\xa2\x6c\xe1\x52\x5d\xe9\xfe\xb6\x3a\xb6\x97\x4a\x11\x14\xbb\x99\x89\xc9\x35\x68\x7b\x00\x73\x5a\x98\xf3\x67\xe7\x58\x6b\xe5\x7c\x8f\x90\x7e\xfc\xb0\xec\x24\xcd\x6f\xdf\xad\x69\xdd\x4b\xb6\x3a\x2a\xdb\xf9\x82\x77\x39\x7b\x0f\xd8\x3e\xea\xd1\x00\xf3\x12\x42\x3b\x89\xdf\xc9\xe8\x49\xd5\x79\xcf\x62\xb0\xb2\x29\xd3\x36\x41\x5d\xfa\xdf\xeb\x29\x7a\xde\x82\x5d\xd4\x29\xa3\x51\x67\x90\x68\xf1\x70\x41\x38\x7f\xb3\x86\xbc\xc8\x1e\x3b\x79\x64\x67\xd5\x2b\x67\xfc\x0a\x68\xba\xb8\x86\x44\xf0\x74\x4b\x02\xdb\xd8\x8f\x0f\x8c\xb3\xbc\xcc\x09\x2f\xf3\x31\x20\x88\x95\x9d\x0b\x09\x89\x55\x6b\x29\xe1\x70\x97\x2d\x1c\xf1\x48\x49\x21\x52\x4f\x4f\xc6\x46\x0d\xa3\xe9\x02\x3b\x9f\x61\xe9\x54\xbe\x30\x93\x30\x5d\x73\x1f\x49\x12\x49\x95\x11\x98\x06\x38\x29\xd3\x86\x97\x8d\x01\xbd\x4e\x2c\x05\xb3\xc7\x74\x4e\x59\x66\x84\xee\x11\x39\x85\x09\x2d\x33\x6c\xe0\x47\xde\x90\x03\xf3\x32\xaf\x69\xad\x7b\xc0\x08\xc2\x4a\x18\x1d\x5d\xb9\xec\x77\x5c\xd0\xe1\x0e\x76\xf4\x6d\x2a\xfb\xf9\xb1\x6d\x85\x3f\x3f\x0a\x5a\xaa\x6d\x15\xf4\xc6\xc6\x9c\xf3\xd4\x9c\x87\x50\x46\x0d\x48\x3a\x53\x6e\xe6\xed\x58\xf6\xc3\x55\x11\xd6\xac\x5a\x8a\xa9\x04\xa5\x4e\x81\xa6\x19\xe3\xd0\x1e\xbf\x6e\x66\x40\x72\x7a\x8f\x38\xa6\x59\x0e\x46\x12\x09\x31\x8c\x86\x5f\xa5\x05\xc9\xe9\x2d\x54\xaf\x27\x63\x98\x60\x83\x46\xfc\xe0\x60\xf7\x2d\xfe\x4c\x28\xcb\x20\x1d\xe1\x3b\x82\x59\xea\xbe\xc6\x16\x71\xcc\xdf\x8c\x97\x60\x9e\x2a\xa4\x40\x35\xd3\x3e\x1a\xf2\x78\xe4\xa1\xd4\xdc\x6c\xe9\xb0\xef\xe5\x77\xb9\x04\x8a\xb3\xfb\xc4\x9a\xff\x24\x50\x85\xb7\x59\xdc\x54\xa5\x9c\x18\xa5\xd2\xeb\xa2\xc1\x82\x5c\x13\x58\x72\x21\xb4\x6b\x09\x58\x7d\x20\x3e\xed\x5a\x54\x82\xd2\x2c\xc7\x03\x96\x96\xd2\x37\xcc\x44\x98\xd1\xf5\x5b\xdf\x38\x2a\x7f\x7a\xf3\x66\x4b\xf9\xed\xd3\x23\xbd\x04\xd4\xa1\xdb\xe0\xcb\x45\x45\x87\x3c\xf9\x37\xca\xb1\xd9\x63\xe6\x04\x64\xec\xfc\x09\x12\x3d\x88\x4c\x69\xc6\xa7\x25\x53\x33\x32\x06\x7d\x07\xc0\x09\xdc\xdb\xda\x17\xe4\x9f\x20\x05\x6e\xaa\x01\x6f\xed\x3c\x68\x00\xed\xed\xf3\x81\xd8\x9c\x29\x26\xf8\x5f\x98\xd2\x42\x2e\xde\xb3\x9c\x3d\x52\x94\xd4\x8f\xd5\xfe\xc7\x15\x04\x45\x96\x62\xd7\x62\x96\xd0\x6b\xb0\x1f\x2c\x01\x6d\x9b\x5a\x58\xc5\x95\x98\x73\x32\xa6\xc9\xed\x27\x03\xf0\x9b\xe7\x02\x61\xcf\xae\x5b\x40\x15\xe5\xbd\x6a\x02\x24\x5b\x16\x29\xcf\xee\x2d\x7c\x1a\x50\xbe\x9b\x09\x05\x78\x83\x35\x3f\xe2\x63\xde\x5d\xc0\x54\x45\x30\xcc\xe9\x16\x1c\x14\xa1\x93\x49\xf3\x8e\xfa\xb0\xa3\xe4\x99\x97\x4a\x93\x9c\xea\x64\x66\x8d\x5c\x22\xad\xc4\x89\x7d\xe5\xc4\xfe\x5d\xa0\xbc\xb5\x79\x79\x77\x43\x30\xb1\xeb\x3c\xbb\x37\xba\xe5\xa3\x7e\x9e\xe6\x68\x80\x7c\x79\x9a\xa6\x6e\x9c\x35\x37\xc4\xc9\x6d\xb9\x6d\x1e\x7c\x83\xa6\xe1\xfa\x17\xdc\x85\xe3\x8b\xd3\xed\x8d\x34\x6d\x14\xdc\x9d\x55\xdc\x65\x23\xf8\x03\x1f\xe5\x8d\xa9\xee\x4a\xd3\x12\x6e\x9b\x46\x0f\x08\x25\xb7\xb0\xb0\xfd\xa5\x57\x1a\xf6\x4a\xc8\x9c\x24\x01\xd8\xb7\xd6\xdc\xe4\x9a\x4d\xef\xb0\xde\x9d\xb1\xc7\x8e\xdd\x9c\x14\x7e\x0c\xcd\x42\x77\x7c\xc2\x7f\xf4\x0e\x8f\xed\x8e\xe0\x76\xdc\xc2\x62\xb7\x07\x96\xb6\xdb\xec\x82\xd3\x7d\xec\xbe\x9b\x1f\x2a\x41\xaf\xda\xea\xdd\xbc\x47\xe1\xd8\xd9\x78\xe5\x87\x07\x62\xa7\xcf\xab\xd0\x2f\xb4\x32\x99\x6f\xdc\x57\x16\x19\xcd\x99\x9e\xb1\x02\x19\x91\x77\x13\xf8\xf6\xe7\x3f\xd0\x8c\xa5\xd5\x14\xf6\xfc\x9e\xf3\x81\x11\x9f\xcc\x7f\x90\xe8\x5a\x71\xed\x54\x80\xba\x10\x1a\x7f\xf9\x6c\x00\xb2\xcb\xec\x04\x1e\x3b\x85\xb3\x4f\x23\x95\x41\xc5\x2b\xe8\x9c\xae\x46\xbe\xe6\x57\x05\x4a\xa6\xc8\x39\x27\x42\x7a\x38\x60\x2f\x7b\x3b\x91\x9d\x02\xf9\xc4\xd8\xba\x3e\xd0\x72\xbd\x76\x0e\x07\x3e\x21\x1b\xd0\x7b\x60\x3a\x37\x15\xca\x07\xf6\x8a\xed\x95\x9f\xa1\xb4\xeb\x44\x55\xea\xdd\xdf\x2c\x21\x39\xc8\x29\xfa\x62\x92\xad\x7d\x11\xcd\x4d\xd9\x8d\xee\xda\xb1\x33\xf5\x0d\x5f\xb8\x13\x16\x20\x6b\xb2\x26\xa0\x2e\xcc\xcd\xce\xd0\x30\x39\xfd\x1f\x43\xc1\x71\x0f\xfe\x2f\x29\x28\x93\x6a\x44\x8e\x89\x62\x7c\x9a\x41\xe3\x9a\xd3\x30\xc2\x69\xcc\x0c\x4c\x11\x43\x6a\xe7\x34\x73\xba\x14\xe5\x04\xac\xcd\xca\xcc\xbe\xcc\x52\x07\x4e\x52\x31\x94\xa7\x72\x81\xed\xdd\xc2\x62\x6f\xb0\x82\x34\x7b\xe7\x7c\xcf\xf2\x96\x15\x34\xa9\x18\x11\x7a\xcf\xf6\xf0\xda\x5e\x9f\x5c\x78\x47\x86\xd3\xd6\x8e\xd6\x7c\xe9\xd6\x18\xe1\xa3\x3e\x5a\x0a\xeb\x0d\x2d\xd1\xc5\x3a\x69\x41\x4a\x05\x56\x5a\xc7\x53\x46\xc0\xcb\x99\x28\x55\xa2\x62\xca\xe1\x0e\xa5\xc7\x67\x23\xf8\x19\x4d\x82\xf1\xe9\xf7\x45\x4a\xf5\x56\xe1\xa6\x76\x34\x20\xb2\x7f\x65\x27\x21\x25\xce\x62\x70\x6b\xc2\xa6\xa4\xa0\x92\xe6\x6a\x44\x2e\x5d\xdd\x43\xc4\x34\x36\x09\x6d\x89\x0e\x76\x37\x8b\x02\xc8\xff\x43\xae\xc2\xb5\x8c\xc8\x70\x38\x24\x37\x1f\x4f\x3f\xbe\x23\xf6\x17\x2b\x65\x6b\x41\x26\x02\x95\x20\x51\x4a\xf3\xaa\x39\x70\x54\xfc\x8d\x7c\x2f\x38\x7c\x9c\x98\x13\x42\x35\xcc\x41\x92\x3b\xb3\x55\x09\x4b\xa1\xb2\x5e\x8d\xf6\x3f\x2d\x1e\xb7\x93\x4c\x72\x7a\x7f\x5d\xca\xe9\x0e\x1b\x40\x56\x36\x21\x34\xd9\xd4\xca\x24\xa2\x5e\x98\xb7\xab\x92\x19\xa4\x65\x06\x29\xa1\x63\x31\x87\x86\xc9\xb6\xf9\x18\xb2\xf4\x12\xfc\x83\x86\xe7\x8d\x95\xc8\x4a\x5d\x29\xab\x07\x70\xff\x8e\xfc\x1b\x3a\xbd\x29\x29\x40\x26\xc0\x35\x9d\xc2\xb2\x19\xc0\xde\xf7\xf6\xcd\xbf\x1c\x3a\x7e\x64\x66\x74\xd6\x93\x37\x06\x23\x3e\xd0\xfb\xef\x79\x6d\x1a\x64\x8a\xbc\x19\x91\xe3\xa5\x97\xe1\x73\x59\x52\x66\x68\x6b\x41\x47\x7e\xf0\xca\xf1\x82\x48\x51\xa2\x2b\x9f\x94\x45\x53\x9b\xfd\xfd\xbf\xfd\x8b\x51\xfa\x68\x5e\x64\xf0\xce\x97\x4b\xb5\x6a\xb3\x91\x61\xb4\x20\x7f\x78\xf3\x2f\x96\x7a\x9a\xf3\x59\x6b\x85\x35\xcc\xa8\x01\x58\x59\x10\x96\xdb\x20\x4d\xc8\x16\x75\xdd\x55\xd9\x44\x7f\xa5\xa9\xd4\x6a\x40\xd0\xdf\x5f\x09\x87\x5a\x68\x9a\x2d\x69\xf9\xa8\x85\xc3\x9d\x05\x52\x2a\x10\x26\x80\x86\x2a\xf2\xf6\x0f\x6f\xfe\x65\xd5\x9c\xf2\x91\x27\x80\x4f\xe2\x13\x18\x80\x31\x36\xca\xfd\x2d\xcb\x32\x48\x07\x8f\x2e\x7f\x52\x4a\x3d\x03\x39\x20\xc0\x95\x37\x56\x99\xf5\x2d\xad\x0d\x67\x97\x25\xe7\x28\x23\x58\xeb\x30\x5a\xb4\x02\x0b\x97\xfb\x58\xc3\x08\x35\xc9\x85\xd2\xeb\x97\xbc\xfd\x71\x33\x83\xf2\xc5\xc7\xc9\xae\xe2\xc0\xb0\x85\x19\x62\xf5\xe9\x16\x22\xe5\xfd\xf0\xb6\xca\xa1\x1c\x32\xae\x87\x42\x0e\xed\x34\xef\x88\x96\xe5\xe3\x5e\x83\x7a\xe4\x8d\x13\xf0\x19\xc8\x40\x19\x9c\xb7\x95\x5d\xfd\x24\x27\xbf\xfd\x79\x4e\xc5\x1d\xdf\x4c\x39\x90\x70\x3a\x9a\xd1\xf2\xd4\x37\x2d\x6e\x4b\xc7\xc6\xbc\xdd\xdc\xfd\xff\x5b\xc5\xee\x1d\xc8\x81\x3b\xbb\xd5\x69\x37\x72\x15\x7a\x3c\x06\x5b\xbc\xbd\x3a\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x0d\xe5\x5a\x39\xe1\x6b\x28\x90\x5d\x47\xed\x90\xd1\x18\x51\x60\xce\xb9\xda\x78\xd0\x33\xa0\x4a\xaf\x03\x45\x3c\xe8\x8f\x8f\x87\x43\xfb\x97\x47\x53\xe8\x34\x12\x12\x82\xbc\xb6\x31\x9e\x58\x44\xd9\xbb\x02\xeb\xe1\xb3\xa1\x68\x0d\x21\x6a\xaf\x3a\x12\x66\xff\x9a\xf2\xd5\xa7\x0a\xa8\xf1\x46\xce\x36\xa2\xb5\x7b\x34\x08\xf9\x75\xa6\x53\x47\xbc\x2a\x8f\xa2\x75\x69\x3e\x1b\x29\x3a\x07\x4d\x1f\x4e\xff\x58\x1e\x4d\xa2\x7d\xad\x29\x4f\xa9\x4c\xdd\x2a\xf7\xf7\x55\x35\xe5\x88\x7c\x40\x5f\x1a\x9f\x88\x77\x64\xa6\x75\xa1\xde\x1d\x1d\x4d\x99\x1e\xdd\xfe\xbb\x1a\x31\x71\x94\x88\x3c\x2f\x39\xd3\x8b\x23\x74\xa0\xb1\x71\xa9\x85\x54\x47\x29\xcc\x21\x3b\x52\x6c\x3a\xa4\x32\x99\x31\x0d\x89\x2e\x25\x1c\xd1\x82\x0d\x6b\x99\x59\x8d\xf2\xf4\x0b\xff\xa2\x4f\x2c\x18\x37\xce\x10\x5a\x97\xe4\x1c\x86\x25\xbf\xe5\xe2\x8e\x0f\x51\x93\x55\x3b\x9d\xa6\xed\xa2\x18\xfc\x58\x82\xf7\x2e\x81\x0b\x85\x48\x3f\xf9\x26\x98\x8f\x19\x52\x9e\x0e\xad\xd3\xf1\x13\xef\x45\x1b\xdb\xee\xb0\x0e\x0c\xd8\x26\x16\xdd\x8e\x76\xda\x10\x4d\x34\x9b\x43\x2b\x27\xb6\x1f\x8d\xed\xfe\xe8\x43\x49\xd3\x52\xda\x1d\x0f\xbc\xd9\xde\x37\x93\xd3\x05\xca\x3a\xf8\x6e\x22\x2c\x2b\xe7\x22\x05\x67\xf9\x9c\xa3\x6a\x7f\x6d\x98\xf9\x8d\x11\x85\x9d\x8f\x1b\xed\xbe\x0b\xa5\x21\xb7\xc4\xc9\x3e\x9f\x2d\x88\x96\x0b\xeb\x18\x97\xb7\x46\xf9\x74\x9e\x6b\x23\xf1\xdf\xe2\x7d\x4a\x89\x84\xa1\xe8\x53\xc3\xd5\xcb\x5d\xde\x86\x47\x49\x21\x14\xc3\x77\x3b\x9e\xb7\x9b\x65\xae\x3d\xbb\x0c\xdc\x74\x7f\xfa\xe3\x2e\x5b\x37\xc1\x06\x0b\x3b\x5a\xd9\x9b\x11\x14\x93\x30\xf6\xdf\x6d\xcf\xbe\xf2\x8a\xab\x11\x4b\x12\xc1\x95\x96\x94\x6d\xce\x6e\x5a\x3f\x5a\xba\x42\xda\xfb\x1b\x08\x62\xd0\x71\x2b\xa0\x90\xd5\x18\x2c\xcf\x14\x11\x2d\x3d\xa8\x43\xc0\xd8\xe4\x27\x1f\x4b\x68\x08\x57\x4b\xd3\x6a\x0b\x18\x91\x4e\x70\xb2\x4f\xc3\x04\xa4\x84\xf4\x14\xa5\xcf\xeb\xea\xbb\xce\xa7\x5c\x54\x3f\x9f\xdd\x43\x52\x6e\x9b\x23\xbe\x3a\x56\x6c\x79\xde\x20\xe2\xc2\x4e\xec\x22\xcc\xd1\xf5\x17\x9c\xfc\x21\x10\xec\x4e\x10\x51\x54\x33\x35\xb1\x99\x64\xd5\x46\x40\xe0\xf8\xac\x50\xb8\x72\x0f\x23\x8b\xb3\x49\x11\x4c\x23\xb9\x49\x66\x42\x28\x73\xca\x71\x3f\x71\xde\x39\x13\xd6\xe7\x87\x69\x2d\x92\xe4\x86\xc6\xf8\xf4\x96\x7a\x7a\x6b\xa8\xad\x1f\x63\xca\xaa\xe0\x15\x04\xbd\x97\xca\x4c\x83\x86\x47\xf3\xc7\x14\xa5\x26\xa5\x89\x2a\x73\x33\xe9\x1d\xb0\xe9\x4c\xab\x01\x61\x23\x18\x21\xd6\x00\x4d\x66\xc1\xb4\x39\x80\x6e\xf4\x47\x09\x51\x2d\xb4\x12\x1f\x54\xf9\x0e\x2e\x41\x67\x50\xf1\x98\xe5\xbd\x5c\x0b\xae\x01\x01\x9d\x8c\x0e\x07\xa4\x4e\x21\x37\x6b\x1c\x2f\x08\xd3\x60\x68\x36\xea\x22\x52\x94\x53\xfb\x25\xe0\x63\x3a\x71\x5d\x55\x32\x08\x7a\x51\x53\xd4\x19\xf7\xec\xc7\xed\x99\x7d\xc3\x95\x97\xb9\xd1\x17\x2b\xa2\x8e\x66\x75\xdf\x52\x47\x48\x09\xaa\x10\x56\xdb\x5c\x36\xb8\xff\xff\xab\x87\x0e\xd4\x61\x0d\xcc\x19\x9b\xce\x3c\x2c\xa9\x63\x04\xcd\x3d\xd8\xfd\xec\x91\x4e\xbe\x14\x3b\x5a\x7a\x54\xec\x68\xfa\xb6\x7d\x26\x45\x8d\x55\xc1\xfe\x6b\x90\x79\x05\x45\x44\x11\x24\x19\xce\xce\xed\x5b\xd9\x38\x1c\x23\x6f\xc8\x01\x22\x19\xd3\xfb\x0a\x11\x7e\x28\x8a\xc3\x11\x39\x26\xbc\xac\xce\xdc\x43\x2f\xe0\xa2\x9a\xdf\x4d\x64\x5e\xaa\x44\x3d\x57\xcb\x2f\xee\x44\xee\xec\x68\xe7\x29\x0f\xc7\xd0\x41\x00\x1e\x2f\x98\xf8\xd0\x24\x16\xd6\x2d\x27\xe8\x46\xba\xfd\x1c\xfe\x2b\xda\xcf\xb1\x12\x60\x81\xc7\xb5\x8e\xa2\x00\x99\x0f\x42\xe9\xa9\x3a\x90\xcd\x53\x6c\x61\xd1\x16\x2b\x48\x3f\x98\x41\x7a\x82\x2b\xe9\x14\xa1\xb3\x7e\x2c\x87\xb1\xf8\xfc\xaa\x06\xb4\x1b\x44\x7e\xbc\xc0\xab\x3b\x06\x2f\x6d\x1e\x5d\x29\x5d\x3d\x3a\xd1\xbc\x7a\x3c\x88\x78\xcf\x2f\xb0\x67\xfd\xe8\x09\x6d\xed\xe8\x4e\xda\xea\xb1\x7b\x68\xd0\xa6\x79\x5a\x04\x0c\xad\x1f\x7d\x9d\x4d\x3b\x5a\x04\x17\xad\x1f\x2b\x22\xea\xa7\x89\x35\x5a\x3f\x5a\x1b\x49\xd7\x8f\xb6\x71\x49\xeb\xc7\x52\x12\xe3\x27\x0a\x52\x1a\x34\x23\x94\xc8\xb7\xda\x9e\xe3\xf7\x9d\xf8\x49\x3d\x7a\x06\x71\xbb\xc8\xa6\xf5\x63\x59\x00\x7c\x21\x51\x4e\x6b\xa6\xfa\x56\x9b\x69\xde\x6f\x7c\xd8\x66\xaf\xfb\x38\x1d\xa7\x50\x0c\x5c\xea\x8c\xb7\x33\x63\x44\x75\x21\x01\x0b\x0e\x60\xd8\x97\xb7\xc3\x7c\x9e\xc0\xaa\xf5\xa3\x3f\xc6\x69\x47\x4f\xec\xd3\x8e\xde\x90\x1b\x05\x9e\x6f\xac\x5d\xf8\x09\x65\x1d\x6b\x99\x8e\xb2\x4e\x94\x75\x76\x18\x51\xd6\xd9\x76\x44\x59\x67\xd3\x88\xb2\xce\x9a\x11\x65\x9d\x28\xeb\x74\x1a\xcf\x4f\xd6\xb1\x96\xaa\xde\x0c\x66\x3f\x5a\x83\xeb\xb2\x85\x0c\xa5\x29\x1f\xd2\xd3\x34\x95\x19\xde\x7f\xed\x48\xec\x0d\x9a\xd7\x5c\xa4\xba\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x2d\xd3\x01\xd7\x8f\x2e\x41\x3b\xe1\xd8\x35\x75\x70\x79\x6c\xf2\x48\x7c\x32\xef\x92\x3b\xa9\x95\xc3\xa3\x21\x61\x6e\x70\x10\x55\xf5\xae\x72\xd0\x84\xea\x86\x41\x9c\xe5\x50\x39\x44\x1b\x29\xc8\x75\x4c\xaf\xe0\xce\xdf\x61\x36\x75\xd4\x6e\x05\x09\x50\x1b\xc7\x3e\x86\x6a\x15\x22\x07\x9b\x60\xea\x0f\xbd\x59\x02\x78\x58\x91\x03\x18\x4d\x47\x24\xb5\xc9\xda\x94\xbb\x98\xb1\xc3\x41\xe8\x1e\xcf\x0d\x71\x95\xf8\x1f\xb3\x6c\xe7\x1f\x87\x39\x70\x5d\xd2\x2c\x5b\x10\x98\xb3\x44\x57\xdf\x87\x01\x81\x4c\x5b\x67\x67\x17\x57\x4a\x07\xf1\xb0\xab\x48\x38\x5c\x39\x5b\xbb\xf9\xab\xfd\xe8\x2e\xbb\xad\xac\xa3\x3d\xbd\x59\x92\x4b\x2c\x84\x46\x1b\xd5\x2a\x6d\xde\x66\xfd\x95\xf8\x4f\x44\xf0\x8f\x57\x6d\xdd\x63\xa4\x27\x9e\xd0\x99\x0f\x2c\x2b\x50\x65\x96\x19\xf4\xb6\x1e\xb3\x55\x10\xac\xf1\x64\xad\xc9\xb6\xb1\x6e\xd6\x3c\xc8\xba\xc1\x7b\x6e\x44\x21\x32\x31\x5d\x84\x3b\x68\x7b\xb5\x04\xe5\x6d\x28\x51\xe5\xd8\x89\x80\xe6\x10\x5d\x2c\x6d\x79\xf4\x85\x6c\x1c\xd1\x17\xb2\x32\xa2\x7d\x60\x79\x44\xfb\xc0\x0e\x23\xda\x07\xd6\x8c\x68\x1f\x58\x1d\xd1\x3e\x10\xed\x03\x5d\xc6\xeb\xb7\x0f\x90\xe8\x0b\xd9\x34\xa2\xac\x53\x8f\x28\xeb\x6c\x3f\xa2\xac\xb3\x3a\xa2\xac\x13\x65\x9d\x28\xeb\x44\x59\xa7\xed\xe8\x80\xdc\x85\x48\x7b\x4f\x91\x29\x44\xfa\x40\x86\x8c\xb5\x57\x27\x62\x98\x89\xa4\xaa\x2c\x62\x1e\x71\x9e\x0f\x45\x73\x6b\x42\x1f\x90\x7f\x0a\x0e\x36\x3d\xc1\x96\xac\xcd\x81\x08\x6c\x0f\x51\x88\xf4\x40\x1d\xb6\x08\x3c\x8f\x19\x36\x31\xc3\xe6\x37\x90\x61\x33\xa3\xca\x15\x3e\x42\xd2\xba\x39\xe1\x26\x38\xfe\x37\x20\xf3\xdf\x6c\xbe\x8d\x41\x38\x87\x30\xd8\x3d\xae\x46\x0a\x0b\xbb\xd4\xf9\x76\x21\xbd\x6c\x42\xcc\xe9\x65\xb6\xf9\x4e\x9a\x42\x4a\x0a\x90\x43\x8b\x64\x82\x4c\x98\xab\xff\xb5\x84\xbf\x0e\xc2\x2f\x3c\x6f\xa6\x09\x89\x17\x9d\x3c\xd3\xfc\x94\xde\x7c\x53\xa1\x8b\xae\xc1\x15\x5f\x5c\x2a\x4d\x3f\x5a\xe9\x90\x68\xe7\x4e\xfb\xae\x93\x5e\xda\x97\x12\x89\x4a\xde\xf5\x4e\x65\x8e\x37\x8f\xb5\xc5\x69\xff\x51\x82\x5c\x10\x31\x07\x59\x2b\x46\x55\xdf\x9e\x41\xd5\x64\x26\xa1\xae\x00\x72\x3f\x06\x9e\x5e\x4c\x11\x7d\x6a\xea\x7d\x7b\x0d\xc9\x33\xab\x7e\xbc\x79\xf4\xab\x38\xf4\xa8\x36\xbc\xb4\x5a\xca\x9b\x47\xaf\xe6\x37\xd2\xb3\x09\x8e\xf4\x68\x86\x23\xfd\x9a\xe2\x48\xef\xe6\x38\xd2\xa7\x49\x8e\x7c\xf6\x0a\xd0\x9b\x47\xcf\xe6\x23\xd2\xbb\x95\x8e\xbc\xc0\x7a\xd2\x9b\xc7\x27\x00\x77\x9f\x16\x3b\x12\xab\x53\x77\x1e\x7d\x1b\xd4\x48\xdf\x46\x35\xd2\x37\x1e\xb6\xaa\x82\xbd\x79\xc4\xfa\xd8\x9f\x40\x4e\xeb\x4d\x88\xe8\x5a\x53\xfb\xb1\x85\xf6\x80\x93\x55\x57\xdf\xcf\xa5\x00\x59\x2e\x5d\xb7\x92\x35\xef\x0e\x7a\x75\x61\xa8\x66\xd8\xf2\xd4\xc7\xad\x22\x46\xe3\xef\xa9\x37\x78\x95\x3c\x28\x1e\x17\x4c\xb6\xd2\x3a\xa6\x36\x9d\x55\xcd\x63\x8c\x52\x50\x37\x9d\x0a\x1e\xc6\x7b\x47\x36\x9c\xb4\x96\x26\x78\xba\x1c\x60\x5a\x3f\x81\xfa\x85\x6d\x74\xbb\xe7\xed\xd8\xfb\xaa\xbe\x63\x6f\x14\xf6\xc4\x75\x33\x1e\xfc\x9f\xff\x7b\xd8\xa8\xde\x52\x4f\xe8\xa8\x72\x75\x76\xc6\xa0\xe9\x30\x83\x39\x64\xb8\x0e\xdf\x70\x79\x26\xd0\x62\x6c\xcb\x9e\x06\x06\xa9\x8b\xe5\x1d\x25\x13\xa0\xba\x94\x58\x41\x14\x38\x1d\x67\xdd\xcf\x4a\x54\x30\xa3\x82\xb9\xdd\x88\x0a\xe6\xc6\x11\x15\xcc\x0e\x23\x2a\x98\xdb\x8d\xa8\x60\x6e\x1e\x51\xc1\x8c\x0a\x66\x8b\x11\x15\xcc\xa8\x60\xb6\x1d\xbf\x61\x05\xb3\xdf\xc0\xe9\x50\xdd\x73\x71\x28\x28\x3f\x6a\xaa\x59\x52\x07\x55\xfb\xbb\xec\xbf\xfa\x55\x33\x43\x15\x72\xbd\x92\x19\x2a\xa2\x2b\x8a\xf6\xe8\x11\x8d\xb2\xd2\x39\x57\x9e\x7c\x50\xd9\x7c\x6d\xb1\xe1\xbd\x21\x62\xe0\x74\xee\x15\x13\x6f\x7c\xe8\x5a\xdd\xda\xbd\x8a\x6b\x4b\xc9\x81\xf7\xf6\x63\xab\x16\x2e\x74\xf3\x22\xd7\x6c\x58\xdf\x51\xf9\xff\x31\x6c\xa7\x51\x31\xa0\xe1\xa4\xae\xa2\xe4\xaa\x08\xac\x1a\x79\x0c\x75\x04\xd9\x58\x03\xb6\xc6\x9d\x30\x6e\x63\x29\x7d\x5b\x21\xc1\x7d\x58\x96\x25\xa7\x48\x00\x3d\x9a\x5b\xc9\x17\xd7\x83\xe2\x6f\x0d\xbb\x20\x8e\x88\xe2\x19\xa3\xdc\xa5\xdb\x0a\xee\xfb\xde\xdb\x5e\xf6\xb5\xb8\x5c\x75\x6b\xa9\xde\x3e\x22\x67\x88\xf4\xe1\xc4\x4c\x21\x7c\xa8\xed\xb0\xd2\x8f\x89\xe2\x79\x95\x86\xb8\xdb\xb9\x34\xc4\x52\x4c\x4a\xac\x0c\x11\x2b\x43\x74\xaa\x0c\x81\x17\xed\xe1\xee\xbd\x44\x04\xf9\xd1\x35\x60\x92\x80\xa0\xca\xcb\x4c\xb3\xa2\x8e\xf1\x56\xf6\x55\x99\x55\x24\x26\x2e\xd6\xb4\x89\xef\xe6\x6d\x34\x99\x2d\xe3\x3d\xce\x87\x31\xe1\x0a\xc9\x89\x8b\xe7\xc4\x76\x49\x58\xd3\xc0\x6b\x1d\x36\x68\x95\xbd\xfc\x58\xc4\x53\x24\xd8\xaa\x56\x9a\x6d\x37\x2f\x43\xe7\x33\x83\x12\x86\x62\x3f\xc0\x20\xc2\x96\x19\x18\x17\xcb\xe6\xc0\x6b\x2e\x71\xa0\x0e\x0f\xbd\x30\xd4\x2b\xf7\xfa\x24\xdc\xe7\xcf\x01\x97\xf8\xcf\x6d\xf8\x0f\x7e\x50\xc5\x81\x6a\xf0\xd5\xfc\xe7\x65\x07\x5d\x76\x8f\x9f\xeb\xc3\x20\xd7\x5b\xdc\xdc\x93\xc7\xcc\xfd\x96\xaa\x6b\x3c\x4b\x17\xc6\xb3\xd3\x3a\x5e\x87\xdb\x22\xa6\xa4\x6e\x3f\x5e\x42\x4a\xea\x13\xb9\x26\x5e\x4e\x66\xea\x8b\x75\x47\xbc\x94\xcc\xd4\xe8\x82\xd8\x69\xbc\xd6\x84\xd1\xe6\xe8\xd1\xe5\x10\xdd\x0d\x3d\xcb\x54\xbd\x30\xff\x4f\xe3\x66\xe8\x05\xff\x7a\x8d\x5f\x8b\xb1\x6b\xaf\x3c\x76\x2d\x2a\x7a\x51\xd1\x6b\x8e\xa8\xe8\xad\x8c\xa8\xe8\xed\x30\xa2\xa2\xb7\x79\x44\x45\x6f\x75\x44\x45\x2f\x2a\x7a\x5b\x8c\xa8\xe8\x45\x45\x6f\xdb\xf1\x1b\x53\xf4\xfa\x2b\x1a\x1f\x63\xc8\xfa\x8f\x21\xeb\x87\x10\xf6\x40\xfe\x7a\x41\xba\x9e\x62\xc6\x62\xbc\xd8\xf3\x8e\x17\xeb\x58\x3a\x8f\x6b\xf6\x69\xca\xe7\x85\xbb\xbd\xa9\x86\x1e\x9d\x0b\x96\x92\xa2\xd4\xae\x82\x58\xac\xa3\xf7\x9c\xeb\xe8\x35\x76\x34\x16\xd3\xdb\xaa\x98\xde\x26\x98\xc5\x8a\x7a\x1b\xc6\xf3\x89\x62\x8b\x15\xf5\x76\x1d\xb1\xa2\xde\xfa\x11\x2b\xea\x3d\x30\x62\x45\xbd\x58\x51\x2f\x16\x3c\xe8\x30\x62\xc1\x83\x35\x23\x16\x3c\x68\x3f\x62\xc1\x83\xad\x46\x2c\x78\x10\x0b\x1e\x34\x47\x74\x42\x75\x1b\xb1\xe0\x41\xc7\x11\x1d\x53\xb1\xe0\x41\xa7\x09\x63\x45\xbd\x18\x95\xb8\xfb\x88\x0a\x66\x54\x30\xb7\x1b\x51\xc1\xdc\x38\xa2\x82\xd9\x61\x44\x05\x73\xbb\x11\x15\xcc\xcd\x23\x2a\x98\x51\xc1\x6c\x31\xa2\x82\x19\x15\xcc\xb6\xe3\x37\xac\x60\xc6\x8a\x7a\xcf\x3d\x1a\x92\x3c\xc7\x94\xa7\x58\x51\x2f\x46\x48\xb6\xda\xee\x58\x51\xef\xf1\xf1\x9b\xaf\xa8\xd7\x88\xd6\x7b\xba\xb2\x7a\xbb\x2f\x23\xd6\xd6\x8b\xb5\xf5\x62\x6d\xbd\x58\x5b\x2f\xd6\xd6\x8b\xb5\xf5\xb6\x1f\xcf\xdf\x99\xf1\xec\xf4\x8f\xd7\xe1\xc0\x88\x25\x17\xb6\x1f\xb1\xe4\xc2\xc6\x11\x4b\x2e\xc4\x92\x0b\xd1\x19\xd1\x66\xc4\x92\x0b\x3b\x8e\xe8\x78\x88\x25\x17\x76\x1a\xb1\xb6\x5e\x8c\x62\xdb\x7e\x44\x45\x2f\x2a\x7a\xcd\x11\x15\xbd\x95\x11\x15\xbd\x1d\x46\x54\xf4\x36\x8f\xa8\xe8\xad\x8e\xa8\xe8\x45\x45\x6f\x8b\x11\x15\xbd\xa8\xe8\x6d\x3b\x7e\x63\x8a\x5e\xac\xad\xf7\x9c\xa3\xc9\x62\x6d\xbd\x35\x23\x46\x8e\x3d\xef\xc8\xb1\x96\xb8\x42\x4b\x2d\x72\x51\x72\x7d\x0d\x72\xce\x12\x38\x4e\x12\xf3\xd7\x8d\xb8\x85\x1d\xa3\x95\x9a\x5a\xe8\x03\xd3\x12\xc6\x53\x96\xa0\x1e\x79\x37\x03\x2c\x8d\x67\xc4\x5b\xbc\x8f\x50\x7b\x23\xd1\x78\x67\x8d\x5e\xb8\x4e\x43\xd3\x30\x84\x07\xa7\xde\x15\x5e\x16\x42\x63\x21\x32\xa0\x7c\x87\x27\x1d\x33\x04\xb9\xe3\x69\x6e\x00\xe4\xbd\xa3\xc4\xf5\x64\x64\x0c\x99\xe0\x53\x17\x31\xe4\x4e\xc0\x88\x9c\xd4\x37\x24\x94\xe3\xe1\x29\xa5\x04\xae\xb3\x05\xc2\x01\x8b\x74\xa1\xd2\x90\x8b\x39\xa4\x48\xb1\x31\x50\xc9\x8a\x91\x54\x93\x0c\xa8\x79\x17\x87\xfa\x65\xe6\xf0\x50\x72\x89\xf3\xdb\x49\xc7\xe0\x82\xa7\x5a\x01\x71\x77\xda\xd8\x8a\x1a\x2e\x19\x36\x9c\xd4\x84\x6c\x29\x41\xf5\x28\xf8\x42\x3c\x9a\x0b\x51\x92\x3b\x6a\x05\x25\x59\x72\x3c\xcc\xf8\xe9\x06\xb4\x3b\xbe\xbc\x83\x48\xd2\xde\xfa\x30\x44\xaa\xb6\xe3\x63\x5d\xac\x01\x54\x4e\x5b\x31\xa9\xc6\xd6\xec\x1f\xcb\x69\x69\x25\x42\x87\xca\xc0\xb5\x5c\x60\x44\x9f\x15\x29\x52\x91\xdc\x1a\x34\xcc\xe9\x14\xf6\xf7\x15\x39\xf9\x70\x6a\x68\x5f\xa9\x0c\xa9\x76\x65\x02\x1d\x2d\x2c\xa4\x98\xb3\xd4\x60\xf6\x0f\x54\x32\x3a\xce\x8c\xcc\x39\x01\x09\xdc\x88\x04\x5f\x1e\xfc\x70\x7c\xf5\xcb\xc5\xf1\x87\xb3\x43\x94\x3e\xe1\xbe\xa0\xdc\x1c\x89\x52\xd5\x71\xa8\x0e\x27\xcc\x8b\x80\xcf\x99\x14\xdc\x2c\x0e\xf5\x34\x4a\xe6\x7e\xd6\xa4\x3a\x09\x12\x94\xc8\xe6\x90\x5a\x19\xb9\x7a\x9b\x67\x39\x8c\x17\xa5\xf6\x7a\x23\x46\x47\x9a\xd3\xc3\x93\x19\xe5\x53\xb3\xce\x53\x51\x9a\xf9\xbe\xfc\x12\x57\x24\x21\x2d\x13\x2b\x35\x51\x8f\xb2\x5f\x0e\x3c\x9b\x30\x84\x5e\xd9\x9a\x8e\x2a\xa1\x85\x5f\x73\xf8\x59\x6a\xc1\x35\xbd\x7f\x67\xc3\x03\xf7\xbe\x0c\x2e\xed\xf9\x7a\x98\xc2\xbc\xc2\x32\x1b\xbb\xaa\x0c\x4b\x31\x66\x64\x2f\xbc\x7b\x44\xce\xcc\x3b\x20\x0d\x01\x68\xa3\x3b\x61\x0e\x12\xb5\x4e\x07\xbe\x01\x91\x30\xa5\x32\xcd\x40\x61\x5c\xa3\x27\xcc\x56\x33\x70\x00\x83\x4a\xa7\xe5\x42\xaf\xa3\x24\xe4\x83\xc0\x18\xc7\x89\x78\x47\x66\x5a\x17\xea\xdd\xd1\xd1\x6d\x39\x06\xc9\x41\x83\x1a\x31\x71\x94\x8a\x44\x1d\x69\xaa\x6e\xd5\x11\xe3\xe6\x64\x0d\x53\xaa\xe9\x30\x38\xd2\x47\x96\x6d\x0f\x13\x91\xe7\x94\xa7\x43\xea\x50\x6b\x58\x6d\xeb\xd1\x17\x8e\xa1\x0e\x69\x75\x17\xe3\x43\x3a\x54\x33\xc8\xb2\xfd\x16\xc8\xdc\x4d\xe0\xeb\x20\xe8\x75\x12\xf0\xdc\xb7\x77\x3f\xbd\x67\xd5\x61\xb5\x30\x18\x91\x0b\xa1\x5d\xf8\xad\x8b\xf4\x46\x22\x8a\xf0\x5d\x7f\x9e\xcf\x2e\x6e\xae\xfe\x7a\xf9\xf1\xfc\xe2\x26\x1e\xeb\x78\xac\xe3\xb1\xee\x70\xac\x81\xcf\x3b\x1f\x69\x2f\x6d\x06\xc7\xa4\xda\x6f\xe4\xd1\x0a\xb4\x3f\x06\xd5\x06\x74\x96\x0d\xed\x78\x32\xa8\x37\x20\x70\xc6\xe7\x3f\xd0\xa6\x69\x9d\xaf\x05\x07\x71\x37\x58\x11\xb9\x92\xbe\xbb\xc4\xde\x77\x30\x63\x75\xf5\x5b\xb5\x92\x1f\xed\xe8\xee\x53\x32\xaf\x6e\x6f\x62\x68\x6c\xdf\x05\xcd\xeb\xfa\xda\x6b\x76\x6d\x44\x3e\x78\x85\x87\x9c\xfc\x72\x7e\x7a\x76\x71\x73\xfe\xcd\xf9\xd9\x55\x7b\x0d\xba\x07\x5b\x0b\x5a\x13\x7a\x02\xc0\x7e\x4b\x2e\x59\x48\x98\x33\x51\xaa\x6c\x51\xd9\x3f\xd6\x13\x81\xe5\xd3\xef\x1c\xbe\x8b\x4a\x13\x5f\xfb\x58\x64\xb6\xfd\x32\xdb\x53\x98\xd0\x32\xb3\x7a\xd3\xde\xde\xa8\x0d\x97\xb3\xa3\x2f\xf4\xfd\x46\x8a\x0e\xf5\xa3\x1b\x28\x7c\x6d\x2b\xcf\x4f\x84\xdc\x78\x8c\xf7\x5d\xd8\x41\x83\xf5\x38\xe1\xd1\xda\xe6\x9c\xf4\x68\xbd\x63\x1d\xa1\xd3\xd1\xbd\xd0\x8f\xd3\x3d\x11\x7c\xc2\xa6\x1f\x68\xf1\x1d\x2c\xae\x60\xd2\xcd\x40\xdc\x84\x37\xda\x1d\x9d\x0f\x19\xad\x94\x86\x9d\xd9\x97\x75\xf3\xcf\xf4\xe6\x9d\xe9\x2b\x2c\xa3\x7b\x48\x46\x7f\x11\x14\xbd\x44\x4f\xac\x54\xf3\xb7\x16\x68\x67\x4b\xee\x2b\xb8\xa6\x17\x97\x7d\x37\x2e\xef\x47\x93\xd9\x85\xec\xde\xd1\x59\xbd\xad\xda\x91\x08\x9e\x40\xa1\xd5\x91\x98\x1b\xce\x05\x77\x47\x77\x42\xde\x1a\x3d\xc2\x28\xae\x43\x8b\xb5\xea\x08\xbd\x05\x47\x5f\x58\xff\xd7\xcd\xc7\xd3\x8f\xef\xc8\x71\x9a\xba\xd6\x2c\xa5\x82\x49\x99\xb9\x66\x08\x23\x42\x0b\xf6\x03\x48\xc5\x04\x1f\x90\x5b\xc6\xd3\x01\x29\x59\xfa\x75\x7b\xe2\xec\x47\x8f\xbb\x20\x0a\xeb\xe3\xec\x79\x27\xae\xd1\xbb\xb2\x68\xf0\xae\x8a\x88\x18\xae\xc5\xb4\x42\xdc\xf4\xf6\x66\x27\x64\xf4\x04\x9a\xdd\x8d\xf3\xcb\x03\xb7\xb0\x5f\xba\xba\x5f\x13\x56\xeb\xdb\x74\x88\x5a\x88\xf4\x1d\x51\x65\x51\x08\xa9\x15\xc9\x41\x53\xa3\xf4\x8e\x0c\x86\x0d\x9a\x7f\xa2\x97\x6a\x40\xfe\x5e\xfd\x88\xae\x26\xf5\xd3\xfe\xfe\x9f\xbf\x3b\xfb\xeb\x7f\xee\xef\xff\xfc\xf7\xf0\x2a\xb2\x42\x1b\xfe\xd3\xbc\x45\x15\x90\x8c\xb8\x48\xe1\x02\xdf\x81\x7f\xaa\x86\x83\xc5\x5d\xd0\x54\x97\x6a\x34\x13\x4a\x9f\x5f\x56\x7f\x16\x22\x5d\xfe\x4b\x75\x90\x38\xc8\xf3\x64\x0c\xb8\x45\x97\x54\xcf\x9e\x09\x7b\xa8\x69\x49\xcf\x47\xd5\xcd\x1a\xb6\x00\xca\x29\xfe\xf3\x1b\x0f\x02\x23\x3d\xdd\x49\xa6\x35\x3a\xdd\x5c\x9a\xb9\x98\x0c\xcc\xa9\xad\xc5\xce\xf9\xdb\xbd\x67\xc5\x60\xaa\x1d\xec\x19\x60\x08\x11\x07\x2d\x7b\x90\x2b\x06\xbb\xea\x5c\x3e\xbe\x3c\x27\x73\x0b\xe1\x67\x03\x1c\x9f\x3a\xfc\xcd\x27\xa5\x71\x55\xcb\x28\x07\xaa\x4a\x43\x7c\x67\xa3\x81\xaa\x04\x66\x92\xb1\x9c\xb9\x20\x43\xd7\x5e\x4a\x91\x03\xfb\xe3\x28\x29\xca\x81\xbb\x61\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x46\xd3\x1a\x2a\x2d\x24\x9d\xc2\xa0\x7a\xdc\x3e\x56\xfd\x65\x1f\x6c\xbc\x60\xf5\x69\xab\x0a\xd7\x4e\x52\x47\x91\x21\x7d\x7d\xb4\xcd\x83\xfe\x99\x90\xb6\x0a\x33\x2e\x3e\x81\x48\x58\x59\xe2\xac\xc0\x59\x41\x11\xf5\xc9\xb9\xc8\xca\x1c\xd4\xa0\x12\x83\xac\x35\x80\xcf\x8d\x66\xa9\x9e\x95\xa0\x96\xb2\x39\x53\x7d\xc4\x0f\xaf\x91\xd3\x98\x0b\xc5\x17\xa5\x2e\x4a\xed\x6a\xd9\x04\x6d\xe9\x84\x42\xbb\x45\x55\x70\xa0\x41\xf6\xdf\x76\x2d\xb8\x45\x48\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\xec\xbc\x74\xca\x17\x1f\x3b\x12\x50\x3b\x86\xbd\x95\x22\x5a\x9e\xb1\xa7\x00\xeb\xfb\x61\xad\x34\x0d\x19\xd7\x43\x21\x87\x76\xea\x77\x44\xcb\xb2\x1b\x31\xa9\x99\x52\xdf\xe7\xdf\xf7\x1e\x7b\x57\x33\xa4\x8a\x5d\x3f\x9b\x03\xae\x20\x91\xa0\x3f\x87\x25\xc7\xbe\xc9\xcb\x29\x4b\xc1\x8e\xaf\x8d\xcf\xfd\x16\x8c\x3b\x55\xb0\x20\xee\x6b\x2d\x89\x4e\xa4\xc8\x47\x24\x70\x6f\xcc\x31\xd3\xc3\xdd\x77\x0b\x1d\xac\xa0\x7e\x44\x63\x50\x34\x06\x6d\x18\x8f\x1a\x83\xae\x2d\x1e\x3e\x5b\x4b\x10\xf0\x79\x5b\x17\xc6\x5a\x0f\xba\xd7\x75\xb4\x20\x85\x28\xca\x8c\xea\x0d\x9e\xb1\x35\xee\x74\x77\xd4\xeb\x48\xe4\x3a\x92\xc6\x32\xb4\x7c\xbd\x0f\x93\x1c\x67\x19\x61\xdc\x1e\x7c\x9c\xc0\x3b\xcc\x24\x58\xd5\x86\x50\xeb\xcf\x9e\x9b\x25\xdc\xb9\x92\x75\x61\xb8\xa7\x22\x4a\x53\xa9\x31\xea\x18\x4b\xda\x59\x56\xe2\xbc\x4f\x8c\xd7\x85\xed\x2a\xe1\xb0\x4a\x02\x59\xdb\xd7\x33\xa3\x4a\xfb\x65\xe3\x6a\x34\xbd\x45\x6f\x63\x02\x29\xf0\x04\x30\x23\xad\x84\xfa\x5b\xc7\x46\x6f\x23\x67\x7c\x6e\xe7\xa0\x24\x2d\x6d\x30\x88\x25\x7f\xeb\xe7\x78\x5d\x01\x08\x06\x11\xaf\x7d\xfb\xe5\x2a\x0e\x01\xa9\x7e\xa5\x61\x57\x89\x7d\x95\x95\x55\x3d\x4d\xe4\x41\x77\x9e\x59\x79\xb6\x3a\x09\x43\x2b\xcc\xb2\x36\x3f\x37\x99\xe4\x6b\x70\x06\x76\x67\x9f\xbf\x39\xd6\xd9\x13\xdb\xec\x87\x65\xee\xe0\x3b\xe9\x93\x4d\xf6\xe1\x2c\x29\x24\x4c\xd8\x7d\x4f\xe7\xf4\x98\xd7\x96\x18\x96\x02\xd7\x6c\xc2\x6c\xc7\xfe\x42\x42\x01\x3c\xad\x8a\xa2\x62\x56\x38\x6f\xc2\xe6\x59\x06\xf3\x58\x81\xbb\x5f\x52\x76\xbd\x4e\xd8\x8f\x74\x8c\x44\x3a\xd6\x7a\x7c\x26\x3a\xe6\x30\xf7\xf9\x10\x31\x8c\x3c\xef\x1e\xfa\x7e\x1a\xc4\xb1\x23\x16\xef\x8c\x65\x75\x42\xd7\x11\xce\xa2\x96\xaa\x07\x55\x74\x51\x0b\x1b\xb9\x46\x66\x6c\x6a\xc0\x6a\x2b\x0a\x59\xa1\x89\xe4\x94\xd3\xa9\xcd\xea\xd6\xc2\xdb\x69\x8d\x96\x65\x90\x58\xb2\xb4\x21\xdc\xdb\xd7\x30\x4e\x0c\x62\x67\x82\xa6\x78\x51\x8a\x2c\x03\xa9\x48\xc6\x6e\x81\x9c\x42\x91\x89\x85\x4b\xd2\xe6\x29\xb9\xd6\x54\x1b\x94\xbe\x06\xdd\xce\xe7\xdb\x09\x5d\x71\xc5\x97\x65\x96\x5d\x8a\x8c\x25\xad\x2c\x2a\xcd\x6d\x3b\xc7\xfd\x2a\xca\x2c\x23\x05\x4e\x39\x22\x1f\x39\x52\x8c\xe3\xec\x8e\x2e\xd4\x80\x5c\xc0\x1c\xe4\x80\x9c\x4f\x2e\x84\xbe\xb4\xa2\x77\x33\xda\xce\xde\x48\xd8\x84\xbc\xc3\x9a\x36\x9a\x68\x3a\x45\xc5\xc9\xfb\x00\x07\x06\xfe\xe1\x04\x96\x38\xdc\x31\xb5\x56\x53\xe9\x8c\x38\x5f\xe0\x4c\x86\x50\xd9\xbf\x3f\xfb\x36\x65\x6c\x02\xc9\x22\xc9\xba\x9f\xab\xe3\x04\xa3\x17\xea\x3c\xf3\x00\xbf\x5d\x99\x76\x97\xda\x89\x2a\x20\xe3\xc4\xd6\x4f\xb7\x85\xe1\x6b\x54\xaf\x56\x64\x55\x5d\xd5\xab\x86\xd8\x9a\x73\x76\xe5\x99\x85\x50\xfa\xda\xa8\xe7\xbd\x54\x59\xdf\xbf\xf4\xd3\x11\xac\x25\x9d\x65\x90\x12\x96\xe7\x90\x1a\x15\x3e\x5b\x10\x3a\xd1\x98\x62\xdb\x30\x0f\x24\x12\x2c\xd6\xba\xda\x25\x33\xca\xd3\x0c\x24\x99\x50\x96\x39\x63\x40\xe3\x7e\x0d\x32\x67\x1c\x6d\x02\xd6\x1d\x8b\xf6\x05\xf3\x57\x92\x08\xe9\xeb\xde\x33\xad\xfc\xa5\xfa\x60\x22\x13\x09\x10\x60\xd9\xaf\x4c\xc6\x99\x48\x6e\x15\x29\xb9\x66\x99\x5d\x8c\x10\xb7\x24\x11\x79\x91\xe1\xd1\xe9\x70\xb2\xaa\x7f\x0e\x2b\x54\x1a\x9a\xd9\xd5\xd1\x17\xf5\x25\xfc\xa1\x2d\x37\xef\x41\x0a\xeb\x43\x06\x83\x7b\x48\x7a\x4b\xef\x37\xb4\xd4\xec\x32\xfa\xfb\x05\xaf\x44\xb1\x89\x30\x0c\xcc\xec\x75\x9d\x98\x5d\x91\xcb\x11\x39\xbb\x87\x24\xa8\x42\x81\xfd\x21\x90\x10\x60\x56\x28\xbd\x85\x57\x54\xf6\xae\x43\xf2\x5d\x38\x1a\x60\x3f\xb1\x73\xfa\xaa\x59\xee\x15\x24\x63\x1c\xc9\xa2\x4b\xc8\x23\x8c\x2b\x23\x10\x34\xce\x90\x3d\xb1\x4e\xd0\x25\x29\x93\x58\x33\x61\x51\x05\x5f\xfb\xb9\xb0\x1c\x81\x10\x9a\x1c\xec\x1f\xed\x1f\xae\xd8\x2c\xf7\x8d\xe0\x92\x81\x25\xd1\xd6\x80\x99\xd4\x8b\x52\x2c\x2f\xb2\x05\xae\x63\x3f\x1d\x10\xa6\x7d\x74\xb6\x2c\xb9\x5f\x95\xcb\x12\x1c\x10\x25\x88\x96\xd4\x97\x62\xb1\xbf\x9a\x9b\xb4\x2c\x1d\x73\x38\xd8\xff\x75\x7f\x40\x40\x27\x87\xe4\x4e\xf0\x7d\x8d\xcb\x1f\x91\x1b\x61\xc4\xef\x7a\xa2\x85\x28\x09\x07\x9b\x0c\x00\xf7\x45\xc6\x12\xa6\xb3\x05\x12\x3a\x22\x4a\x6d\x33\x8e\xa9\xf6\xd9\x89\x67\xf7\x4c\xbb\x18\x37\x83\xb6\x6f\x10\x9a\x96\xd8\x11\x6a\xa4\xa3\x39\x1c\xcd\x80\x66\x7a\x66\x03\x4b\xb8\xe0\xc3\x7f\x82\x14\x98\xb7\xc8\xdd\x95\x57\x57\x22\xb0\x17\x6d\xc3\xd0\xde\x6f\xa1\xbf\xa6\x42\x7f\xb9\xb9\xb9\xfc\x16\xf4\x12\xc9\x30\x6f\xf1\xe1\x3e\x68\x41\x00\x39\x11\x32\x7f\x06\xb4\xa3\x1f\x07\xe7\x90\x14\x42\x3e\x07\x12\x36\x13\xaa\xd3\x5e\x92\x95\xfd\x14\x4a\xa3\x12\xe5\x84\x38\x0e\x89\xd9\xc1\x66\xdc\x89\xef\xbb\x73\x7e\x39\x22\x7f\x15\xa5\xf9\x9a\x31\x1d\x67\x8b\xaa\x6e\x83\x02\x4d\xf6\xcc\x54\x7b\x86\x3c\x19\x6c\xf8\x0b\xd0\xd4\x68\x36\x86\x7a\x00\x7d\x1e\xfd\xb5\x88\x3b\x0f\x6e\x6d\xfd\xf2\x81\x52\x69\x91\x93\x99\xfb\xec\x66\xba\xa6\x3b\x19\x23\x3c\x3d\x3e\x17\x4a\x42\x61\x29\x9c\x7b\xe6\xd5\xd1\xaf\x15\xba\x61\xe1\xee\x7e\x1f\x63\xcd\xab\x24\x04\x9b\x6b\x30\x65\x93\x89\xb8\x05\x96\x41\x35\x68\xe7\x5e\x09\xc7\x33\x2e\x54\xda\x3a\xf9\x73\x79\x22\x74\x04\x76\x8f\x0f\xeb\xb5\x4c\x69\x3f\xb1\x06\x64\x9d\x61\xd6\xe1\x8c\x35\xda\xf4\x04\xc4\x4f\x53\x27\xf3\x73\x00\xa0\x9f\xcd\x27\x7d\x42\xa0\xe8\x21\x1c\x7c\x35\x18\x5c\x0b\xa3\xbe\x62\xba\xa6\x25\xae\x48\x26\x14\xc8\x79\xdb\x04\xf0\x7a\xf4\xf7\xe9\xa2\xbd\xa1\xc0\x8f\x35\xb9\xd5\x92\xf0\x32\x1f\x83\xac\xb3\x59\xa4\x5e\x05\x48\x10\xcd\x70\x61\x6f\xf7\x26\xe0\x66\x3b\x47\xf3\xe4\x9f\xfe\xed\xdf\xfe\xf0\x6f\x23\x3b\x7d\x15\xd9\xc0\xc9\xf9\xf1\xc5\xf1\x2f\xd7\x3f\x9c\x60\x42\x6d\x57\xa8\xf6\x14\xb6\xd9\x77\xd0\x66\xaf\x21\x9b\x9f\x34\x60\x13\xd3\x44\x3a\x53\x91\xa6\xbf\x00\xa7\x34\x18\x60\xf4\x36\xa3\x71\x3a\xd9\x2f\x28\x6d\x66\x64\xcd\xa6\xfd\xd5\x1c\xb5\x67\x71\xc6\x74\x52\x5c\x8b\xe4\xb6\x47\xbd\x66\xff\xe6\xe4\xd2\x4e\x19\xd6\xe4\xe4\xde\x18\xc2\xf8\x5c\x64\x73\x5b\xce\xf7\xe6\xe4\x12\x4f\xde\x08\xff\x85\x86\x28\xd4\xa8\x17\xe6\x59\x9f\xc8\xe0\xdc\x53\x46\xfb\xb6\x16\x34\x4a\x24\xd0\x8c\x29\xcd\x12\x7c\xae\x36\x93\x9a\x19\xba\xf8\xa5\xa2\xa6\xb4\x6e\xf4\xae\x29\xed\x7f\xf4\x6e\xbb\x9d\x95\xa6\xae\x81\x87\xcf\x98\x2f\x39\x7e\x64\x33\x3e\x22\x5f\xfa\x4d\xf0\xa5\x42\xc2\xb5\x16\x45\x4f\x9e\x10\x3b\xd9\x06\x3f\xc8\x18\x26\x42\xc2\xb2\x23\x24\x70\x6c\xf8\x06\xc3\x1c\xb3\xff\xbc\x09\x4a\x34\x9c\x17\x36\xe4\x52\x95\xc9\xcc\x5b\x13\x39\x28\x75\x84\x2e\x8f\xb2\xb0\x2a\x26\x3a\x51\x4a\x09\x03\xf3\x75\x90\xe3\xea\x06\x75\x1a\x83\x79\x3d\x70\xfb\x23\xe8\xc4\x9a\x59\xbd\xff\xc5\x59\x54\xfd\xf2\x97\x5d\x25\x89\xa4\x6a\x06\x58\x3f\x04\xee\x59\xdd\xe7\x84\x2a\xc1\xad\xb1\xd7\x7d\x0e\x32\x1a\x45\x0a\xaa\x54\x5d\xc1\xd9\xbd\xc4\x3e\x74\x29\xd2\xfd\x7d\xd5\x78\x60\x2a\x69\x02\xa4\x00\xc9\x44\x4a\x30\x9f\x38\x15\x77\x9c\x8c\x61\xca\xb8\xf2\xf0\x33\x13\x79\x40\x1b\x76\x63\x8b\xed\xfa\x6a\x71\x23\x72\xd5\x28\x82\xe2\xd2\x93\x12\x51\x9f\x68\xb7\x8a\x65\x27\x13\x46\x84\x06\x6d\x9a\xab\x8d\xf1\x61\xb3\xfa\xf1\x45\xf7\xe0\x6d\x32\xa0\xad\xaf\x6d\x84\x0e\x16\xe7\xa7\xc9\xac\x9b\xe3\x37\xba\xa7\xb6\x1c\xd1\x3d\xb5\xdb\x88\xee\xa9\xe8\x9e\xda\x3c\x9e\x9d\x79\x37\xba\xa7\xa2\xd2\xb5\x3c\xa2\x7b\x2a\xba\xa7\x36\x8c\x67\x47\xbf\xa2\x7b\x6a\x8b\x11\xdd\x53\x5b\x8e\xe8\x9e\x8a\xee\xa9\xe8\x9e\x8a\xee\xa9\xdf\x90\x19\xd0\x8f\xe8\x9e\x5a\x99\x24\xba\xa7\x02\x60\x44\x4d\x69\xcd\x88\xee\xa9\x35\x23\xba\xa7\x82\x11\xf9\x52\x0b\xbe\xe4\x9d\x3b\x97\x46\x2f\xeb\x9e\xb3\x76\x89\x8e\x03\x96\x38\x1f\x51\xd8\x0b\xae\x7a\x55\xd0\xfe\x2d\xa8\xf9\xe1\x53\x6d\x9c\x37\xa8\xf6\x31\xad\xcd\x87\xda\xd5\x1d\xe1\x93\x08\xd5\x51\x21\xec\xff\xd5\xce\x88\xc0\x0b\x61\xb5\xd3\xf6\x39\x69\x4f\x96\x6d\xd5\xc5\xf5\xf0\xac\xdd\x0e\xcf\xc4\xb5\xd3\x83\xab\x21\xba\x19\x5e\x9d\x9b\xe1\xf5\xf4\xd0\x75\xce\xfc\x9b\x99\x04\x35\x13\x59\x6b\x44\x6f\x20\xf9\x07\xc6\x59\x5e\xe6\x06\xe7\x94\xc1\x67\x36\xaf\xa2\x06\x54\x85\xae\x96\xd0\x5b\x4b\xa1\xb9\x91\xa5\x80\x05\x50\x29\xcb\xcc\x36\x62\x5a\xe7\x8c\xa2\xa8\xae\xca\x24\x01\xc0\xf6\x6a\xa1\x16\xf3\x87\x51\xf5\xa6\xaa\x9d\xc6\xdb\x6e\xf4\xa6\x1b\xef\xb7\x25\x4a\x71\x96\x3f\xfc\xbe\xd5\x1c\x1d\xbd\x3c\x9f\xdf\xc3\xd3\x03\x99\xee\xae\xaf\x74\xd2\x55\xfa\xe0\x12\x5d\x75\x94\x97\xe6\xc9\xe9\xcd\xa3\xd9\x83\x07\xe7\x19\x79\x6f\x9e\x0d\x5b\x78\x2e\x1e\x9b\x67\x58\x7d\xb5\x07\x07\x43\x1f\x1e\x9a\xfe\xbc\x33\x9f\xa0\x48\xe9\xa7\xf1\xca\xf4\xa8\x0d\xf7\xe4\x8d\xf9\x1c\x9e\x98\x5e\xbe\xba\xab\x07\xe6\xf3\x79\x5f\xfa\xf9\xdc\x8e\xd6\xad\x57\xe1\x71\xe9\xc1\xaa\xd5\xa7\x45\xab\x37\x6b\xd6\x27\xf3\xb0\x74\xf7\xae\x3c\x03\xcf\x4a\x67\x20\x33\xce\x34\xa3\xd9\x29\x64\x74\x71\x0d\x89\xe0\x69\x6b\x0e\xb3\x54\xb5\xae\x3a\x3f\xca\x4e\xeb\x74\xb4\x66\xfc\xf1\x8c\xba\xe2\xbc\x90\xfa\x90\x6a\x6f\xfe\x73\x02\x05\x36\x34\xb1\xab\x7c\x96\x06\x3d\xf2\x6c\x94\x41\x1b\x8c\xdd\xe7\x26\xfe\x45\xdc\x11\x31\xd1\xc0\xc9\x01\xe3\x7e\x1f\x0f\x03\x35\xb0\xd6\xcc\x2b\xb4\x36\x57\xdf\xbe\xf1\x37\xbf\x3e\x95\x1b\x8d\x0b\x4a\x7d\x7a\x0b\x88\x7b\xd1\xe3\x26\x10\x77\xe3\xa4\xcc\x9a\x66\x10\x6b\x1a\x69\xd2\x9b\xb7\x75\x79\xd1\xb7\x38\x6f\x75\xda\x28\x4f\x89\x4b\xdc\x78\x7d\x9b\xd6\xd9\x6f\xfc\x1a\x7c\xc6\xd1\xf6\x42\xfa\xb6\xbd\x3c\x91\x6f\xf8\x19\x4a\xcd\x2f\xd4\x1f\x1c\xa5\xe6\x1d\x46\x90\xff\xf5\xad\xa4\x09\x5c\xf6\x2e\x70\xf8\xe3\x44\xd2\x52\xba\xb4\xbd\x4a\xee\xa8\x0e\x0f\x07\x48\xed\x69\xaa\x92\xe2\x30\x1b\x6d\x52\x66\xd9\x82\x94\x85\xe0\xcd\xcc\x43\xeb\xb4\x5a\x4e\x58\x33\xb3\xad\x7b\x4b\x2d\xa5\x16\x52\x38\x06\x2c\x4b\xce\x0d\x3d\xaf\x1b\x0e\xa1\x54\xaa\x2c\xad\x0e\xd3\xe2\x14\x9b\x9a\xe5\x1b\x66\x8a\x19\x73\x2c\x87\xba\x25\x45\x3d\xa1\x79\x7a\x22\x64\xc2\xc6\xd9\x82\xcc\x68\x56\x75\x97\xa0\xe4\x96\x65\x99\x9b\x66\x44\xae\x41\x13\x3d\x63\xae\x31\x38\xc9\x04\x9f\xe2\xe2\x28\xf7\x5d\xcd\x20\x31\xcf\x26\x19\x50\x5e\x16\xf6\x7d\x86\xad\x2f\x44\x29\xfd\xfb\x5c\x59\xcb\x6a\x16\xa6\x08\x67\xd9\x20\xe8\x9d\xf4\xe0\xc6\xd6\x0d\xea\x15\xf8\x9c\xc2\x3b\xa6\x60\x10\xce\xe9\x2b\xf3\xaa\xa0\x73\x46\x21\xc5\x9c\xa5\xb6\xfb\x85\x07\x1b\x76\x69\xb5\xdd\x31\xaa\xf3\xcc\x05\x1f\x72\x98\x52\x94\x7a\xdc\x29\xb2\x7b\x66\xe7\xb1\xae\x38\x9e\x62\xbf\x0c\xa3\x2e\x88\xa2\x91\xca\x3a\x67\xb6\xd3\x67\x00\x39\x72\xc0\x05\x11\xc8\x5e\x4b\xce\xb4\xed\x1e\x3d\x2b\x35\x49\xc5\x1d\x3f\x1c\xd9\xaa\xc4\x4c\x11\x4a\xc6\xa0\x7d\x27\x5b\xdf\x59\x91\x49\x50\x04\x38\x1d\x67\x66\xcf\x31\xe0\xe1\x66\x2d\x80\xc8\x04\xa8\x2e\x25\x90\x29\xd5\xb0\x56\x68\xb2\xdf\xfb\x30\x78\x99\xaa\xba\xbc\x97\x5c\x41\xeb\xfe\xd6\x3d\x4b\x5a\x7f\xfa\x63\x3b\x1a\xc1\x72\x10\xa5\xfe\x2c\xaa\xe4\xdd\x8c\x25\xb3\x50\x32\x66\x39\x28\x22\xca\x25\x1d\xfb\xad\x7b\x6c\xfd\x0e\x45\x7d\x72\xdd\x68\x6b\x25\x5e\x63\x4a\x5b\x4e\x39\xae\xdb\xca\x52\x73\x00\x4f\x2f\xae\x7f\x79\x7f\xfc\x5f\x67\xef\x47\xe4\x8c\x26\xb3\x30\x1f\x9d\x13\x8a\x44\x03\x09\xc5\x8c\xce\x81\x50\x52\x72\xf6\x8f\xd2\x56\x27\x27\x07\xd5\xb3\x87\xbd\xd6\x42\x6e\xc9\x7d\xb1\xf5\x75\x6f\xbd\x96\x6c\x23\x6d\x1b\xe0\x20\x14\x60\x77\x84\x65\xf1\xe9\xcc\x5c\xb2\x8a\x06\x8a\x5a\x33\x30\xc4\x88\xcd\x1d\x19\x76\xc5\xa5\x69\x5a\x85\x5c\x18\x3c\x37\x68\x61\x58\x15\x1d\x63\xa8\xc4\x0c\x08\x07\x6d\xd0\xba\x32\x58\x09\xae\x1a\x85\x01\x4a\x05\x6a\x40\xc6\x25\x06\x77\x14\x92\xe5\x54\xb2\x6c\x11\x4e\x66\x78\xd5\x85\xf0\xea\xd0\x62\x79\x49\xa7\x1f\xcf\xae\xc9\xc5\xc7\x1b\x52\x48\x5b\x32\x00\xa3\x33\xf0\x3a\x7e\xd6\x18\xcc\x13\xae\x47\xe7\x88\x1c\xf3\x85\xbd\x68\x0f\x38\x53\xc4\xe8\x42\x80\x2c\xd8\xc9\x90\xbe\x28\xfc\xde\x9b\x11\xfe\x6f\xcf\x7c\xa5\x34\x42\x66\x15\x74\x92\xac\x04\x8f\x59\x31\x94\x8d\xb3\x00\x9a\xee\xdb\x5f\x55\xb7\xa5\x2a\x6c\xee\xd2\x00\x31\xe8\xb6\x44\xab\xad\x46\xf0\xda\xee\x5b\x8c\x4f\xb3\x10\xab\xda\x91\xfd\xae\xba\x65\x57\xcd\x72\x58\x7f\xc1\x65\x5b\x05\xb3\x97\xae\x4f\xf5\x1a\x7a\xea\x95\x52\x73\x3f\xaf\x4e\x39\x8a\x20\xc2\xf6\x97\xe7\x97\xfe\x04\x38\xe9\x26\x5f\xea\x99\x88\x0f\x5b\xa7\xc6\x80\xbc\x21\x7f\x26\xf7\xe4\xcf\xa8\x5e\xfd\xa9\x6b\x67\x99\xae\x8a\x4f\x77\xf3\x8e\xd5\xea\xcf\x2f\x7b\x82\xf8\x8f\x86\x3a\x99\x19\x0d\x54\xb5\x20\x63\xe6\xc4\x79\xb8\xd7\x20\x0d\x1d\x75\x3b\xf1\xa4\x3d\x79\xcc\x02\x3f\x23\x9a\x59\xdf\xc5\xf9\x24\x6c\x09\xa1\x77\x44\x34\xf3\xf8\x5f\x84\xd2\x17\x8e\x0a\x35\x1b\x4c\xd4\xb3\xe5\x54\x27\xb3\x26\x19\x33\x82\x9a\xd2\xf5\x01\x53\x24\x15\x68\x49\xb3\x71\x80\x33\xd6\x21\x12\xe3\xf9\xa0\x71\x37\xe7\x7c\x63\x3f\x1f\xda\xa9\x25\x03\x0a\x6a\x3e\x4e\xb0\x0a\xca\xcb\x14\x22\x75\x32\x99\x59\x56\x1a\xf0\x8c\x07\x84\x32\x67\xab\xa9\x4c\xd6\x88\x4b\xe6\x3c\x25\x94\xdb\x00\xee\x09\x48\x69\x43\x37\xc7\x0b\xf4\x20\xb3\x04\x3a\x6f\x5e\xa7\x93\x54\x48\xa1\x45\x22\x3a\xb4\x0d\x6a\x3a\xcc\xdd\x74\x08\x04\x6b\xfc\xf5\x36\xf7\xef\x4f\x2f\x07\xe4\xe6\xe4\x12\xbb\xa9\x5c\x9f\xdc\x5c\x36\x35\x95\xbd\x9b\x93\xcb\xbd\x27\x05\x05\xf1\x92\xd5\x3b\xb3\xcc\x16\x93\x34\x0c\x4f\x46\x6c\x1b\xe6\xb4\x18\xde\xc2\xa2\x25\x4f\xed\x83\xaf\x0f\xab\x1d\xee\xe5\x83\x2c\x98\x73\x5a\xec\x3c\x9b\x04\x9a\xb2\xcf\x94\x45\xe1\x4e\x56\xfd\xce\xf5\xe9\x14\xb9\x98\x43\x6a\xc5\x61\xff\x04\xf0\xb4\x10\xcc\xc8\x8b\x31\xc7\x62\xf7\xa7\x63\x8e\xc5\x43\x23\xe6\x58\xc4\x1c\x8b\x98\x63\xf1\xf0\x88\x39\x16\x6e\x3c\xbd\x19\x94\xc4\x1c\x8b\x96\xe3\x75\xf9\xf9\x63\x8e\xc5\x4e\x23\xe6\x58\xac\x8e\x98\x63\xb1\x61\xc4\x1c\x8b\x0d\x23\xe6\x58\xc4\x1c\x8b\x98\x63\x11\xa3\xc5\x1e\x9d\xeb\x79\x46\x8b\x91\x98\x63\xe1\x46\xcc\xb1\x78\x15\x31\x31\x24\xe6\x58\x6c\x35\x62\x8e\x45\xcc\xb1\x68\x33\x62\x8e\x05\x8e\x68\x7b\x89\x39\x16\x7e\xc4\x1c\x0b\x3b\x7e\x3b\x52\x73\xcc\xb1\x88\x39\x16\x31\xc7\x22\xe6\x58\x3c\xb8\x8a\x98\x63\xf1\x1a\xf4\x49\xdf\x03\xaf\x7b\xce\xc0\xfe\x89\xc8\x8b\x52\x03\xb9\xf2\x53\x56\x52\xa4\x25\x0c\x4c\x85\x12\x41\xf7\x10\x9e\x44\xf0\x09\x9b\x3a\xca\x7e\x64\x1b\xcc\x0d\xab\xef\x19\x06\x4d\xdd\x5e\x60\xfc\x4e\xc6\x72\xd6\x2e\x91\x83\xac\x6c\xcc\x7b\x9c\x2b\x70\xf2\x98\x93\x94\xd3\x7b\x3c\x22\x34\x17\xa5\x6d\xca\x97\xb8\xfd\xab\x40\x68\x5d\x61\xcf\x6e\x67\x48\x3f\x2a\x4e\x9d\x91\x72\xd9\x83\xb6\x51\x50\xad\x41\xf2\x77\xe4\xbf\x0f\xfe\xf6\xd5\xaf\xc3\xc3\xaf\x0f\x0e\x7e\x7a\x33\xfc\x8f\x9f\xbf\x3a\xf8\xdb\x08\xff\xf1\xaf\x87\x5f\x1f\xfe\xea\xff\xf8\xea\xf0\xf0\xe0\xe0\xa7\xef\x3e\x7c\x7b\x73\x79\xf6\x33\x3b\xfc\xf5\x27\x5e\xe6\xb7\xf6\xaf\x5f\x0f\x7e\x82\xb3\x9f\xb7\x9c\xe4\xf0\xf0\xeb\x2f\x5b\x2f\xb9\xb3\x48\xdc\x9f\x40\xdc\x93\x38\xfc\x49\x84\x61\xe7\x1d\xee\xe9\x2c\x5e\xb9\xd9\x96\x4f\xa3\x63\x58\x0f\x9d\x46\x4f\x4d\x51\xcc\xab\xe6\x61\x8a\x88\x9c\x69\x23\x1c\x1a\x79\x90\x86\x71\x61\x4c\x37\x94\x52\x47\x07\x30\xa0\x92\x6a\xdb\x23\xb4\x8a\xa9\x0a\xe2\xb4\x85\x97\xfc\x5c\xef\xd5\xca\x5e\x81\xe7\x79\x98\xc2\x84\x71\x70\x7e\xb0\x48\x1b\x1e\x1f\x91\x36\xbc\x46\xda\xa0\x20\x29\x25\xd3\x8b\x13\xc1\x35\xdc\xb7\xb2\xb0\x34\x49\xc3\x75\x73\x42\x62\xcf\x99\xcb\xa2\x74\xd7\x88\x28\x6c\x00\xe5\x52\x3a\x6b\x15\x82\x2b\x4b\x8e\x0a\xa6\xcd\x92\x01\x6d\xb5\x3f\xd4\x7b\x30\x26\x72\xf9\x25\x5e\x9f\xb3\x6a\xe6\x3f\x4a\x36\xa7\x99\xd1\x76\xeb\x27\x2e\x51\x83\x09\x1f\xda\xf6\xcc\x6b\xaa\x6e\xeb\x03\x0f\x43\x23\x43\x57\x6b\x3e\xf2\x9f\x84\x3f\xc1\xbd\x7e\x89\x52\x1a\x0a\x48\x97\x92\xcd\x59\x06\x53\x38\x53\x09\xcd\x90\xae\xf5\xc3\x2b\x8e\x37\xcc\x8e\x1b\x2f\x45\xa6\xc8\xdd\x0c\xb0\xbb\x32\xf5\x26\x00\xcc\x70\x99\x52\xc6\x49\x6e\xb6\xa8\xf0\x0f\x2b\x6b\x4b\x30\xe4\xbf\xa0\xd2\x6c\x70\x65\x33\x40\x15\x79\x2c\x44\xe6\x42\x87\xb3\x45\x3d\xbf\x8b\xbd\xe7\xe2\x17\x0e\x77\xbf\x98\xd9\x14\x99\x64\x74\x5a\x99\x0a\x14\xe8\x15\x6b\x5f\x3d\xf5\xc6\x0f\xc0\xb8\xdc\x12\x08\xcd\xee\xe8\x42\xd5\x86\x93\xb0\x0f\xf8\x3b\xf2\xf6\x10\xd1\x99\x2a\x52\xcd\x91\x92\xdf\x1f\xa2\x2f\xf1\xe4\xf8\xf2\x97\xeb\xbf\x5e\xff\x72\x7c\xfa\xe1\xfc\xa2\x1b\xa7\x30\xdf\x0e\x94\xb7\x9a\x23\xa1\x05\x1d\xb3\x8c\x75\x61\x10\x2b\xd1\x26\xe1\xa4\xc8\x82\xd3\xf4\x28\x95\xa2\xb0\x70\xf2\x36\xaa\x9a\x53\x36\xb5\xe0\x30\x33\x19\xb7\x67\xd2\x9c\x70\x2a\x29\xd7\xb5\xb1\xa6\x06\xb9\x2c\xb9\x51\xac\x5f\x78\x60\x3e\x4d\xfb\x0b\xca\x3f\x4e\x53\x48\x1b\xd0\x7b\x75\x41\x80\x27\xfe\xe3\x16\x75\x8e\x36\xb9\xfc\x78\x7d\xfe\xbf\x97\xd0\x70\x51\x74\x8b\x79\xea\x27\x2f\x4c\x8a\xa2\xb7\xdd\xbd\x72\x79\x47\x71\x7f\x9f\xc5\xfe\x56\xbc\xaa\x1f\x4f\xfb\x55\xc9\x9b\x65\x3c\xea\xf9\x49\x2e\x52\x18\x91\xcb\xca\x4a\xdf\xbc\x1a\xa4\xf7\x52\x09\xc4\xdc\xc2\x35\xa3\x59\xb6\x08\x05\x24\x2d\x6c\x32\x4d\x23\x33\x39\xa4\xc3\x13\x9a\xa9\x8e\xc4\xb4\x0b\x67\x32\x4c\xf8\x83\x51\x26\x7b\x81\x66\x35\x1b\x49\x81\x0b\xed\xa4\x52\xb3\x4a\x4c\xd6\x96\x22\x21\x56\x73\x0d\xc2\xa2\x1a\xdc\x45\x59\x43\xbf\x67\x4c\x4c\x79\x58\x5d\x56\x33\x5b\x2b\x6f\xa9\x60\x59\xba\x75\x8c\xa9\xd6\x65\xcd\xec\x12\x68\x8a\x39\x69\x05\xd5\x33\x1b\xd5\x90\x53\x75\x0b\xa9\xfd\xc1\xc9\x35\x95\x99\xdf\xcc\x58\xbd\xea\xc6\xac\xdb\xdb\xf4\x51\x9e\xb1\xb1\x16\xe8\x0b\x68\x57\x74\x83\xf4\x71\x04\xcc\x37\x7d\xe4\xd9\xe2\x4a\x08\xfd\x4d\x95\x8b\xd5\xcb\x06\xfe\xe8\x24\xc5\xa6\x19\x16\x45\x29\x0c\x42\x48\x87\x08\x4c\x44\xe9\x30\x0d\xec\xb4\xde\xb0\x27\x46\x68\x59\xf2\x63\xf5\xad\x14\x65\x6b\x0e\xb0\x22\x68\x7d\x7b\x7e\x8a\xe7\xb8\x74\x5e\x36\xae\xe5\x02\xb3\x4e\x57\x0b\x06\x55\x32\xed\xf7\xce\x4f\x18\x62\x64\xed\xd2\x21\x1f\xe8\x82\xd0\x4c\x09\x2f\x1c\x33\xbe\x56\x81\x72\xda\x99\xb9\x3c\x16\x7a\xb6\xa2\x96\x19\x74\x5e\x7d\x6e\x10\x38\xdd\xea\x0a\x46\x8c\xaf\x3c\xae\xe9\x2d\x28\x52\x48\x48\x20\x05\x9e\x74\xdc\xb5\xa7\x76\x35\xe1\xce\x5f\x08\x6e\x8e\x45\x2f\x7b\x7f\x5e\xf9\x18\xd1\x10\xd6\xdc\x69\xf4\x56\x3a\xbd\x83\xa2\xcf\x12\x0f\x45\xa9\x40\x5a\x07\xab\x2c\xc1\x6e\xc4\x77\xe5\x18\x32\xd0\x56\x19\xc2\xba\x13\x54\x5b\x45\x9a\xe5\x74\x0a\x84\xea\x0a\x51\xb4\x20\xc0\x95\x21\x37\xd6\xf4\xa6\x49\x2a\xa0\x4e\xa0\xa4\x8a\x7c\x7f\x7e\x4a\xde\x90\x03\xf3\xae\x43\xdc\xfe\x09\x65\x19\xba\x33\x35\x95\xcb\x6b\x64\x13\x3f\x05\x2e\x09\x71\x8f\x08\x69\x8f\xe8\x80\x70\x41\x54\x99\xcc\xfc\x9a\x8c\xc6\xe5\x15\x36\x17\xcf\x87\x46\xfd\x57\x88\xaa\x9d\x09\xcc\xf7\x0a\x64\x6f\xf4\xe5\xfb\x16\xf4\x25\x14\x21\x0c\xce\x35\xa1\x67\x11\x2b\x07\x4d\x53\xaa\xa9\xa3\x3b\x75\xd6\xf5\x6b\xdc\xd2\xa7\xa6\x3e\x0a\xde\x33\x5e\xde\xdb\x88\x95\xfe\x94\xfc\xeb\x33\x9c\x96\x24\x1e\x68\xb8\x69\xb4\x28\x32\x66\xf3\x9d\x97\x22\xa8\xce\x1b\x5b\x3d\xd8\x20\x22\xe1\x31\xa7\x59\x26\x0c\x79\x33\x9c\x9d\xf2\x54\xe4\x2b\x2f\x33\x02\x14\x34\x0a\xdd\x8d\xc8\xab\x44\x9e\x27\x37\x47\x64\x30\x87\x0e\x35\x5d\x96\xeb\xf2\x99\xd9\x8c\x2c\xe6\x37\x14\xa7\x27\x19\x1d\x43\x66\x39\x8b\x45\x20\xb5\x8a\x40\x4f\x1d\x85\x28\x45\xd6\x5f\x0e\xc6\x95\xc8\xc0\x86\xf5\x78\x40\x98\xe9\x5f\x04\x1c\x70\x92\xbe\xe0\x80\x8a\x4c\x03\x0e\xa8\x92\xbd\x04\x38\x94\x1d\x18\x2d\x59\x86\x83\xe1\xda\x4d\x38\x20\xeb\x7c\xee\x70\x50\x90\x24\x22\x2f\x2e\xa5\x30\x2a\x57\x6f\xac\xc5\x4d\x5b\xfb\x8a\xac\x4e\xbe\x26\x08\x07\x49\x79\xf3\x66\x2a\x83\x80\x3e\xaa\x2d\x8d\xf7\x51\x7d\xff\x2b\xec\x90\x6c\x48\xcf\x32\x1f\xf2\xb3\x34\xdc\x4a\xe6\x49\x77\xe1\x85\x97\x13\xe8\x60\x25\xeb\x85\x99\x88\x84\x66\x58\x72\xaf\x1b\xc6\x90\x65\xac\x59\x9e\x38\x88\xc2\x44\xd7\x12\xfe\xe6\xfd\xfe\x58\x7d\x0d\x7f\x71\xb6\x2f\x2e\x52\x08\x5c\x90\x36\x7c\xf4\xc6\x46\xeb\xe1\x7d\x3e\x00\xd4\x70\x75\xef\x0d\x4c\x1b\x4f\x6b\xe1\x2a\xc0\x7c\xa8\x0a\xf9\x99\x05\x02\x4f\x19\x9f\xa2\x45\x67\x40\x24\x64\x36\x74\xd4\x9d\xe1\x5b\xab\x7e\xed\x23\x46\xfb\x49\x3d\x3a\xfb\x57\xa3\x24\xc4\x04\x77\x33\xa3\x91\xc3\xcb\x37\x13\x4b\x2d\x99\x22\x7b\xef\x3d\x00\x3a\x54\x3e\x7b\x8e\x0c\x62\xcf\x7e\x61\xb5\x9b\xd6\xc6\x76\xcb\x78\xea\xa2\x2c\x1b\xc0\xaa\x6a\xd4\x5a\x29\x14\xe3\x77\x59\x1a\x92\x86\x77\xe4\x6f\x9c\x54\xc0\x22\xc3\xd6\xe8\x71\x65\x05\x56\x6f\x5e\x1a\x3e\x6c\xf2\xab\x5e\xb2\x3c\xcd\xf7\x1c\xf7\xde\xbc\x77\x68\xd4\xde\xd5\xfb\xfc\xb7\xec\x3d\xe5\xbe\xde\x31\x9e\x8a\x3b\xd5\xb7\x0e\xf1\xa3\x9d\xd6\x0b\xd4\x89\x41\x6b\xcd\xf8\x54\x85\x7a\x04\xcd\xb2\x86\x19\x76\x9d\x22\xe1\x77\xb8\xaa\x48\xbc\x2a\xc0\x2f\x45\x87\x47\x25\x60\x87\x31\xcd\x15\x3d\x91\xe6\x53\x34\xa3\xd9\x75\xd1\xbe\x34\x1b\x59\x46\x83\x6f\x3f\x5c\x1f\x37\xa7\x36\xf4\xec\x0e\x2b\x5e\x1b\x60\x9b\xeb\x84\xa6\x39\x53\x0a\xcd\x40\x30\x9e\x09\x71\x4b\x0e\x7c\xd8\xc6\x94\xe9\x59\x39\x1e\x25\x22\x0f\x22\x38\x86\x8a\x4d\xd5\x91\x43\xda\xa1\x59\xfd\x21\x61\x3c\xab\xa2\x51\x50\x8d\xe4\x5a\x79\x33\x06\xbe\x24\xa9\x56\x81\x7b\xeb\xea\x75\x3a\x2f\xf3\xea\x32\x6d\x85\x4e\x06\xd9\xd3\x17\x9c\x59\xdd\x9e\x8b\x8e\xb5\x33\x1e\xd9\x22\xfc\x76\x97\x9a\x12\xa6\x51\xad\x85\xa3\x95\xde\x9e\x1c\x48\x4e\x3a\x48\x40\xf5\x57\x95\xe7\x2f\xf5\x9c\x24\x05\x9b\x3d\x01\x18\x75\x42\x37\x06\x37\xa1\x55\x76\x1f\x93\xf0\xdc\xa3\xfb\xa1\x44\x8b\x5e\x1f\x9b\xe6\x61\xf4\x81\xac\x98\xd1\xa1\x55\x92\x0d\x49\x42\x1a\xe6\x65\x80\x99\xe0\xc2\x05\xa7\x1b\x2e\x28\x38\xa2\x34\x6a\x0b\xd6\x11\x84\x7b\xe2\x68\x6c\xb0\xd4\x93\xda\x3f\x18\xfa\x90\x30\x89\xc7\x16\x01\xa8\xd7\x70\xc7\xf4\xcc\x57\xb8\x6f\x38\x9c\x70\x25\x12\x14\x7a\x0f\x38\x01\x29\x85\x74\x81\x30\xde\x6a\x8b\x33\x21\x29\xc6\x48\x1a\x83\x24\xd4\xfc\xb5\xaf\x42\x17\x65\x5d\x02\x17\xe3\xc4\x0c\x36\xc1\x64\x02\x09\x4a\x4a\x21\x80\x2d\xd9\x3d\xa8\x2b\xf7\xb9\xe8\x6e\x83\x60\xae\x84\x6e\xce\xee\xcd\x5b\xc2\xa7\x42\x67\xa8\xab\x98\xb7\xfe\xf2\xe1\x88\x90\x73\x5e\x45\x4e\x0e\xcc\x2e\x86\x77\xfa\x90\x1f\x6d\x3e\x31\xac\xbf\x8c\x1f\x10\xda\x9d\x8c\x78\x27\xcb\x1e\x30\xbe\x8b\x31\x98\x84\x06\xe1\x5e\xc9\x01\x1a\x86\xdd\xa4\x66\xeb\x3d\x13\xef\x62\x28\x36\xb7\x7c\x2a\x63\xf1\xcb\xe0\xf4\xa4\x2b\x9d\x73\x29\xf1\x3d\x15\xc5\xbd\x0e\x66\x0b\xc4\xef\xca\xdd\x74\x29\x52\x5b\x12\xa3\x4a\xe9\xc7\x5e\x16\x58\xa2\x83\xfd\xd3\x0b\x58\xb5\x90\xc6\x85\x8d\xca\x0e\x6b\x65\xb8\x9a\xa0\x29\x31\xb2\x72\xe6\x75\xfb\xbc\xc8\x00\xb3\xe7\x82\x99\xeb\xc4\xc0\xa0\x8a\xee\xa0\x5a\x48\x5d\x88\xd7\x55\xe8\x18\x90\xff\xc1\x43\x59\x05\x00\xfa\xe2\x01\x97\xd5\xe3\x56\xc5\x63\xca\x97\xd4\xc6\xcc\x36\x2d\xbc\xe9\x80\xa4\x6c\x32\x01\x1f\x68\x68\x54\x3f\x2a\x69\x6e\x48\xbc\x22\x0e\x04\x63\x98\x32\x1b\xc9\x56\x11\xb6\x7d\x55\x67\xc0\x0f\x2c\x31\x64\x9a\xe4\x6c\x3a\xb3\x88\x42\x28\x66\x46\x12\xef\x52\xcb\x04\x4d\x09\xe2\xb6\x90\xe4\x8e\xca\xdc\xf0\x0d\x9a\xcc\xd0\x3f\x47\x39\x49\x4b\x89\x65\x22\x35\xd0\x74\x31\x54\x9a\x6a\x23\xea\x82\x74\x1a\xa1\x5f\x7f\x2c\x25\xfc\xe0\x88\xa5\x84\x37\x8f\x58\x4a\x38\x96\x12\x8e\xa5\x84\x1f\x1e\xb1\x94\xb0\x1b\x4f\x9f\xed\x4b\x62\x29\xe1\x96\xe3\x75\x95\xb3\x89\xa5\x84\x77\x1a\xb1\x94\xf0\xea\x88\xa5\x84\x37\x8c\x58\x4a\x78\xc3\x88\xa5\x84\x63\x29\xe1\x58\x4a\x38\x16\x45\x7b\x74\xae\xe7\x59\x14\x8d\xc4\x52\xc2\x6e\xc4\x52\xc2\xaf\xa2\xf4\x13\x89\xa5\x84\xb7\x1a\xb1\x94\x70\x2c\x25\xdc\x66\xc4\x52\xc2\x38\xa2\xed\x25\x96\x12\xf6\x23\x96\x12\xb6\xe3\xb7\x23\x35\xc7\x52\xc2\xb1\x94\x70\x2c\x25\x1c\x4b\x09\x3f\xb8\x8a\x58\x4a\xf8\x35\xe8\x93\x4a\xa7\xac\x55\xe5\xb3\x6d\x0a\x55\xb8\xc8\x90\x20\xb5\x75\x5c\x4e\x26\x20\x91\x72\xe1\x9b\x57\xa2\x10\xaa\x82\x56\x15\x2d\x73\x71\x06\x58\x16\x4f\x02\x4d\x5d\xc0\xfb\x86\xc7\x5d\x2e\x2d\x56\x28\xab\x23\x35\xcf\x3e\x7e\xd3\x4f\x55\x8c\x6e\x31\x8a\xb8\xe6\x8f\x3c\xe9\x1e\xab\x56\x03\x7c\x5d\x02\x86\x83\x7b\x92\x09\xe5\x22\x4c\x11\x58\xc9\x8c\x72\x0e\x5e\x79\x64\x1a\x8d\x32\x63\x00\x4e\x44\x01\xdc\xd2\x6f\x4a\x14\xe3\xd3\x0c\x08\xd5\x9a\x26\xb3\x91\x79\x13\xf7\xc0\xae\xa3\x41\xdd\x2f\x4a\x4b\xa0\xb9\x8f\x8b\xcd\x29\xb3\x53\x11\x9a\x48\xa1\x14\xc9\xcb\x4c\xb3\xa2\x9a\x8c\x28\xc0\x80\x76\xcb\xa8\x2a\x60\x60\x78\x49\x1d\x42\x3a\xa8\xdf\xe6\x96\x25\xc2\xa2\x40\xa8\xba\x0e\xb0\x0e\x6a\x5e\xe8\x45\x15\x47\x07\x64\xc2\xa4\xd2\x24\xc9\x18\x72\x6b\x7c\xa3\xcd\x1d\xc4\xf9\x06\x9e\x57\x73\xb7\x52\xe5\x96\xca\x53\x14\x5b\x0b\xad\x6c\x54\x5a\x3d\xa1\x9b\x2a\x65\xca\x89\xf9\x6a\x40\xa8\x2f\x79\x63\x01\xed\x57\x8a\xa0\xf6\x9c\xc5\xce\xee\x7e\x0a\xa6\x0b\xea\xe4\xd5\x61\x7b\x35\xa2\x63\x88\xb1\x47\xce\x41\x23\x9a\xba\x16\x28\x30\xdc\x65\xe5\x18\xe0\x06\x70\x98\x1b\x1c\x80\x04\x0c\x7f\xa5\x1b\xb0\xfe\xb3\x23\x7d\xc0\x14\x3f\x80\x52\x74\x0a\x97\x2d\xbd\x16\x9b\x34\x32\x74\x5c\xd4\x1b\x83\xa8\x90\xd9\xf4\xb4\xea\x97\x3a\xcc\xa9\x29\x06\x91\xdc\xae\xa9\x12\x7e\xee\x24\xd3\x1a\x70\x53\xb1\x38\x12\x3a\x3e\x97\x13\x50\xf7\x97\x82\xa5\x3e\xf8\x49\xea\x87\x0d\x51\xe7\xa9\x0d\x5d\x1a\x03\x19\x4b\x06\x13\x32\x61\x18\x0f\x85\x11\x4a\x03\x5b\xee\x83\x5a\x8b\x82\x52\x46\xdf\x15\xdc\xcb\xb2\x7e\x5d\x23\xf2\xa3\x5b\x98\x96\x25\x4f\x68\x50\x04\x10\x53\xb4\xd8\x84\x4c\x31\xc2\xc9\x49\x8b\x7f\x7c\xf3\x1f\x7f\x22\xe3\x85\x61\x69\x28\x59\x69\xa1\x69\x56\x7d\x64\x06\x7c\x6a\x60\x65\x8f\x67\x33\xc9\xa8\x82\x00\x56\x31\xb7\x0b\x7f\xfb\xfb\xdb\x71\x93\xc7\x1e\xa5\x30\x3f\x0a\xe0\x37\xcc\xc4\x74\x5d\x5d\xf8\xf6\x21\x93\x2d\x55\xa2\x35\x68\x26\x32\x96\x2c\x3a\x23\x9a\xaf\x3b\x43\x66\xe2\xce\xca\xfa\x6b\xb0\xa7\x8e\x81\x2c\x44\x51\x66\xd6\x82\xfd\x4d\x95\x9e\x57\x2a\x58\xcd\xc1\x59\x7b\x2e\xd0\xe6\xea\xa6\x58\xae\x17\x6b\x03\xdb\xfc\x2b\x85\x8b\xed\x76\x56\xc1\xaa\xfc\x0c\x2a\x42\xdf\xd0\x2c\x1b\xd3\xe4\xf6\x46\xbc\x17\x53\xf5\x91\x9f\x49\x29\x64\x73\x2d\x19\x35\xd4\x72\x56\xf2\x5b\x5b\xb9\xba\x4a\x11\x16\x53\x23\x5a\x15\xa5\xf6\x81\xc4\xeb\x3e\xd8\x26\x9c\x7a\x22\xec\xd5\xa0\x7a\x16\xb8\x67\xb5\xae\xe3\x52\x25\x2c\x46\x86\xf3\xab\x10\xd9\x7e\xff\xe6\x8f\xff\x6e\x51\x97\x08\x49\xfe\xfd\x0d\x06\x3f\xaa\x81\x3d\xc4\x48\xdb\x0c\xa3\xc8\x69\x96\x19\xb5\x21\x44\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x77\x47\xb7\xad\x45\xa9\x9b\x9b\xbf\xa2\x1c\xc5\xb4\x82\x6c\x32\xb0\x59\x01\x95\x5a\xb3\x8f\x8c\x61\xdf\x51\x1f\x4c\xcd\x78\x06\x02\xd0\x5c\x64\x65\x0e\xa7\x30\x67\x7d\x34\xaf\x68\xcc\xe6\x55\xfd\x8c\x29\x4c\xc0\x18\x67\x22\xb9\x25\xa9\xbb\x18\x84\xb1\x2c\x97\x50\x6d\x0f\x85\xb6\x01\x3d\x1d\x02\x79\x36\x7e\x7f\x23\x84\x27\xa7\x45\x51\xc5\xe8\x4b\x7a\xd7\x00\x06\x9e\x49\xcc\xf7\xed\x58\x4f\xa1\xb3\x99\xb9\xab\x91\x79\xe8\xbe\xc8\xd0\xcd\xd6\x53\xb4\x0e\x61\xe9\x6e\xa3\xae\x57\xdf\xde\x30\xd9\x40\x88\x7a\x42\x7f\x1a\x0a\xfc\xb7\x0d\xcf\x5e\xc9\x4a\xaa\x12\x5b\x2a\xc4\xb0\x02\x80\x41\x1f\x24\xc9\xed\x0d\xae\x3d\x58\x37\xbb\xc5\x2f\x35\xe0\xc2\x2b\xab\x72\x4e\xb5\x13\x08\xbd\xf9\x9a\x92\x02\xa4\x62\xca\xf0\xe5\x1f\xf0\x40\x9d\x64\x94\xe5\x81\x09\xf0\x69\x80\x60\x0f\x37\x56\xbe\xec\x4e\x29\x2f\x45\xea\x26\x44\x52\x68\xab\x7e\xae\x11\x6b\x9b\x52\x6d\x8f\x0c\xf5\xa9\x49\xe5\x0f\x35\x34\x9b\x94\xd2\xfc\x52\x91\x4a\x7b\xd7\x6b\x22\x90\xf8\x7d\x2f\x95\x3e\x56\x8b\xef\x89\x0c\x20\x61\x74\x9b\xdb\xa4\x84\x0d\xe5\xd1\x1e\x94\x40\xa4\x77\x7a\xe0\x88\x58\x97\xba\x39\x13\xee\x51\xb2\xff\x6e\xff\x49\x89\xa4\x05\x91\x14\x05\x9d\x76\xea\x61\xb0\x04\xa9\xe5\x69\xc3\x44\x6f\xa3\x06\xe1\xf5\xaa\xec\x10\xde\x05\x69\x5d\x88\x02\xcb\x8c\x58\xef\xa8\x07\xb0\x53\x10\x6c\x3e\xe4\x1d\x5d\x10\x2a\x45\xc9\x53\x67\x5f\xaa\x0c\x7c\x1f\x96\x5e\x7c\x21\x38\x78\xc3\xf9\x72\x9e\x38\x5a\xf4\x19\x27\x6f\x47\x6f\xdf\xbc\x16\x4e\x85\x5f\xb8\xc4\xa9\x2e\x2a\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x76\xdc\xd3\xf7\x7e\x70\x26\x96\xba\x98\x31\xf3\xc5\x5a\xf1\xa7\x3b\xc9\x34\x04\xbd\x8d\x0e\x50\x71\x31\xfa\x61\x90\x15\x7d\xd8\x63\x0d\xef\x7e\xd2\xd0\x55\x39\xfe\x84\x74\xcb\x11\x28\x3c\x6e\xeb\x2c\x5c\xea\x01\x12\x16\x02\x6a\x6f\x8f\x1c\xd8\x3b\xf7\x6d\x66\xe0\xe1\x93\xa2\x96\x03\xda\xd9\x7d\xd1\xa1\xc6\x5c\x03\x70\x67\xf7\x05\x45\x1b\x5c\xd1\x23\x04\xff\x0b\x66\x74\x0e\x98\x11\xc9\x32\x2a\x33\xf4\x39\x5e\xdb\xb5\x93\x71\xa9\x09\xf0\x39\x93\x82\x63\x80\xcf\x9c\x4a\x86\x55\x29\x24\x60\x66\xb5\xd1\x45\xbf\x3c\xf8\xe1\xf8\x0a\x03\x1a\x0e\x5d\x4a\xb8\x5b\x65\xa9\x7c\xf9\x88\x70\x25\xc1\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9e\xbc\xd4\xa5\x2d\x88\x7f\x9f\x64\xa5\x62\xf3\xa7\xa2\x24\x2e\x55\xf5\x94\xb5\xda\xe7\xa5\xb4\xd9\x1a\x50\x2b\x19\xb0\x68\x5a\x47\xd6\xf2\x48\x05\xd6\x7d\x55\xd5\xac\x0a\x7d\xe0\xce\xf4\xe4\x72\xd9\x6d\x2c\x9e\x2f\x59\xb6\x22\x42\x60\xdd\x86\xa7\x35\x42\xa5\x5c\x9d\xe0\x0a\x77\x03\x6b\x33\xba\xb9\x91\x14\x78\x7a\x71\x1d\x16\x01\xb0\xea\x92\x48\x47\xe4\xb2\xfe\xb1\xae\x14\x81\xf5\x8b\x2a\x25\x12\xe4\xb4\xae\x89\x3b\x05\x0e\x12\x85\x04\x33\x65\xa3\x9d\x1c\x19\x53\x65\x9d\x3c\xa7\x17\xd7\xd6\x66\xbb\x1b\xcc\x5a\x8b\xd9\xed\x25\x54\xc3\xf1\x6d\x4e\x44\x0b\xe1\xb6\xd9\xad\xa6\x32\x58\x19\xc0\xa0\x52\x6a\x27\x26\xe7\x97\x84\xa6\xa9\x44\xb7\x8f\x13\x7d\x82\x52\x6f\x95\x6f\x01\xab\x32\x50\x05\xe1\x9a\x02\x70\x23\x89\xab\x01\x4b\x4e\xcb\x22\x63\xd6\x8d\x10\x3e\x50\x57\x93\xc0\xf6\x2a\xbb\x23\x6d\x17\x35\xaf\xb5\x92\xd7\x81\x0a\x89\xb6\x55\xdd\x1e\xd8\x3d\x09\x4a\x64\xf3\xba\xa0\xe6\xd2\xae\xb9\x13\x81\x26\xf1\x6a\xd7\x7c\x11\xb7\xad\x76\x0c\xb8\x96\xe6\x68\x2e\xef\x16\x76\xef\xcd\x4a\x3c\x4d\xd5\x84\x6c\x0e\xe8\x1f\x77\xf5\xeb\x5c\x19\xa5\xba\xc4\xa7\xf5\x0d\xdb\x2a\xab\x40\xa5\xa7\x68\xb8\xaa\x96\x27\x91\x3c\x15\x22\x2c\x1b\x3b\x4e\x2f\xae\x2d\x25\xb4\x1f\x5f\x75\xe5\x5b\xb7\x4b\x35\x55\x6b\x8d\x81\x4f\x56\xe5\xa3\x8b\xe6\xb1\xd4\x56\xc9\xb5\x29\xed\x14\xc8\xd2\x41\xfc\xeb\x94\xb9\xd7\xe1\xed\x0a\xa8\x4c\x66\x6d\xe0\xff\x00\x21\xb0\x93\x92\x54\xd8\x48\x80\x89\x90\xa8\x12\x0f\x91\xbc\x67\x42\xdc\x96\xc5\x36\x14\xdd\x4d\x63\x7b\xe5\x6c\x45\x20\x1a\x4f\xfc\xa6\x68\x7a\xca\x55\x1b\x7f\x6f\x53\xf6\x01\x6d\x25\x1e\x9c\xa8\xce\xc6\x10\xcb\x7a\xd3\x49\x56\x2a\x0d\xf2\x1b\x26\x95\xde\xf3\x05\x57\x11\x83\xad\x4d\x64\x3f\xbc\xe1\x47\xa6\x67\xae\x74\xda\xfe\xa0\x79\xc9\xfc\xed\x26\xde\x37\x3a\xed\xfe\x85\xe0\xb0\x3f\x5a\x16\xbb\x2a\x52\x5e\x91\xb5\x8d\x3c\xc5\x2d\x5d\x41\x66\xe3\x45\xf1\x42\x80\x2b\x37\xae\x6c\x9c\x79\x83\xa7\x7f\x0a\x34\xa1\x58\xa2\x09\xef\x9e\xd5\x65\xde\x6c\x01\x16\x5b\xa7\x4e\x38\x41\x6f\x11\x82\x28\xa8\xc9\xa2\xc5\xe6\xcf\x6e\x23\xcf\xed\x8c\x01\xb6\xfc\xdf\x35\xc8\x39\x4b\xe0\x3d\xe3\xb7\x3b\xa2\x5f\x33\xba\xe4\x6c\x65\xb6\x46\x41\x5e\xeb\xa3\x65\xdc\x06\xdf\x19\x16\x43\xc7\xa2\xd4\x28\xbb\xa1\xc3\xb1\x56\x1c\x19\xff\x1f\xbb\x17\x68\x6f\x2f\x6c\xc5\xac\x75\x3a\xa2\x1a\x58\xa3\x8f\x57\x02\xd5\x82\x6b\x8a\xb5\xfd\x4e\x45\x72\x0b\x92\x64\x66\x19\x23\x52\x07\xbe\x34\xaa\xc9\xc9\x12\x76\x8c\xba\x68\x6b\xe9\x80\x62\x06\x39\x48\x9a\xd5\x45\x15\x3b\x80\xfa\xbd\x23\x9c\xd5\xac\x61\x4c\x8a\xad\x2e\xe4\xca\xa0\x99\x73\x78\xb6\xee\xae\x9c\x2e\x7c\xa5\x49\xc6\x31\xdc\xe0\x9e\x29\x34\xeb\x17\x22\x0d\xb3\xd8\x4a\x05\x72\x58\xe5\x18\xba\x3c\x1e\x55\x05\xe2\xa4\x30\x2e\xa7\x53\xc6\xa7\x8e\x3a\x23\x4d\xaf\x6b\x8d\xd5\x9a\x0e\x46\x7a\x27\x12\x6c\xc1\x47\x94\x1e\x6c\x7c\x19\x0b\xef\xcf\x45\x6a\x6f\x1f\x2f\xac\x36\xe8\x77\xb6\x0e\x90\x3e\xe7\x44\x48\x57\x67\x81\xa6\x29\xae\x7d\xf5\x0b\x5d\x4b\xef\xf0\xab\x06\x55\x1c\x87\x8d\xec\xae\x9e\x0a\xc0\xa2\xca\xb1\xef\xd1\xfd\x58\x8d\x4d\xa6\x6c\x81\xaf\xa0\xbc\xa6\x57\x0d\x96\x6b\x6b\x9e\xad\xee\xbe\x8f\x8f\x6e\x73\xce\x77\x67\x2f\xad\x58\x4b\x93\x5b\xf3\x35\x5f\x61\xc3\xc4\x97\xbc\xa3\x0e\xb3\x28\xf6\x14\xd5\x90\x17\x42\x52\xc9\x2c\xb9\x5b\xc6\x33\xc3\x2f\xd6\x20\xd8\xdc\xf6\x6a\x5c\x83\x63\x6b\x71\x19\xa9\x2d\x17\x55\x0b\x79\xc3\x17\x54\x32\x83\xb4\xc4\x28\xf5\x69\x49\xb1\x15\xac\xa1\x16\xce\xa8\xbe\x70\xe1\x7f\x16\xe9\xaa\xc0\xc2\x2a\x1d\x61\x81\xc1\x38\x58\x6d\xcf\xfc\x82\xd8\x6a\x43\x10\x6d\x2b\x4d\xec\xcb\x17\x46\x23\x6e\x40\xc2\x84\x62\x9b\x3f\xea\x0f\x15\xdc\x27\x60\xc8\x9a\x56\xf5\x62\x5d\x7c\x0a\xd6\x12\xf5\x98\xee\x60\x08\x73\x96\xe0\x1b\x36\x1e\x61\xf7\x05\x16\xd8\xe3\x45\xdd\xda\x78\xc3\xe1\xb9\x31\xdf\x56\x25\x0b\xe1\x53\x3e\x45\x60\xab\x43\xb1\x0c\xc1\xa6\x22\xe4\xdf\x43\x04\x4f\xdc\xf4\x41\x3e\x01\xb7\x47\xa8\xca\x0c\x70\x5d\x08\x7d\x74\xc9\x03\x87\xc4\xd6\x9d\xdd\x11\x7d\x3b\xe8\x19\xed\x9d\x88\xad\x9c\x7f\x5d\x54\x1a\x2a\xa7\xdd\xd5\xbf\xfd\x63\x39\x2d\x73\x5b\x16\x58\x2c\x55\x66\x75\xfd\x2c\x2d\x3b\x45\x8b\x9d\x61\xc6\x27\x1f\x4e\xc3\xe4\x8c\x30\xea\xdc\xa7\xb6\x18\x21\xaf\xa3\x25\x77\xd9\x94\x6b\x0e\x5a\x6d\x1f\xae\xb9\x86\xd3\x4f\x9d\xad\xb2\x7a\x9b\x47\x4b\xc6\x0b\x23\x67\xa0\x74\x54\x5b\x2b\x79\x32\xa3\x7c\x8a\x06\x7e\x51\x9a\xf9\xbe\xfc\x12\x57\x24\x21\x2d\x13\x57\x52\xde\x47\x76\x7f\xe9\xed\x9a\xae\xd2\x11\xf6\x95\x52\x09\x2d\xfc\x9a\xc3\xcf\xb2\x42\xc8\x3b\xc2\x46\x30\x22\x7b\x5f\x06\x97\xf6\xec\xdb\x0b\x29\xcc\x2b\x5c\x50\x38\xae\x2a\x63\x1a\x8f\xf7\x5e\x78\xf7\x88\x9c\x99\x77\xa0\xaf\xa7\x02\x60\x10\xb7\x3c\xae\xc1\x37\x20\x12\xa6\x54\xa6\x19\xe6\x12\x4e\x2a\x71\xcb\x66\x1c\x39\x80\x21\xe9\xc5\x48\x41\x2e\xf4\x3a\xbb\xeb\x4e\xfd\xee\xad\x90\x36\x4c\xa9\xa6\x43\x2c\xc3\x6f\x89\xd8\x91\x35\x1c\x0c\x5d\x21\xc4\x21\x75\xa8\x15\x74\xc4\xff\xc2\xe5\x8c\x0d\x69\x75\x17\xe3\x43\x3a\xc4\x92\x84\xed\xa3\x60\x9f\x20\x60\xa2\x93\x0e\xdf\xa1\x1e\xe6\xb2\xe0\x5d\x95\x51\x46\x18\x8c\xc8\x85\xd0\x75\xd9\xdc\x2a\x36\xc3\x95\x7c\x5c\x77\x9e\xcf\x2e\x6e\xae\xfe\x7a\xf9\xf1\xfc\xe2\x26\x1e\xeb\x78\xac\xe3\xb1\xee\x70\xac\x81\xcf\x3b\x1f\xe9\x4a\xc1\x5b\xa7\xf3\x2e\x95\xe2\x0b\x52\xc6\x5f\x51\xf4\xd9\x19\x9f\xff\x40\x65\xdd\xcb\x1d\xe5\xc7\xb5\x6e\x62\xdf\xec\x1d\x49\xdc\xc9\x8b\x0f\x3f\x7b\xc2\xe0\xb1\x1e\x83\x72\x2e\x82\x4a\x07\xeb\x76\x2d\x6c\x80\x75\xf2\xcb\xf9\xe9\xd9\xc5\xcd\xf9\x37\xe7\x67\x57\x4f\x1a\x4d\xd1\xb1\x14\x5e\x93\x29\xb7\xe4\x92\x85\x84\x39\x13\xa5\xca\x16\x55\xa3\xa9\xf5\x44\x60\x35\x20\x8f\xa7\x84\xf2\x85\xb7\xa7\xad\x7f\x2c\x32\xdb\x7e\x99\x6d\x33\xb8\xa4\x43\xe1\x92\xbe\xd0\xf7\x1b\x29\x5a\x37\xd2\x5f\xb6\xed\x5b\xfb\x84\xb7\xe9\xaf\xc3\xa7\x7d\x57\xe3\xa0\xc1\x7a\x9c\xf0\x58\x17\x54\x30\xc2\x68\x5e\xe8\x0e\x65\xc2\x7b\x29\x7e\xda\x4f\x9d\x50\x1b\x88\xf1\x81\x16\xdf\xc1\xe2\x0a\x3a\xd6\x47\x59\xf2\xa5\x64\x90\x18\x46\x47\x6e\x61\x61\x5d\xac\x27\xfe\x65\x5d\xea\xb8\x3c\xcb\xda\xb1\xb7\xd0\xa5\xae\x6f\x9f\x45\x5f\x6f\xa1\x43\x64\xa6\x1f\x2b\xe5\x4f\xcd\x16\xa2\x9c\x66\xf6\xb4\xdb\xee\x91\x7e\x0b\xbe\x7e\x82\x22\xb7\xfb\x21\xbb\x77\x74\x56\xef\x5c\x3e\x42\xcc\x0d\xe7\x82\xbb\x23\x17\x95\x36\x34\x8a\xeb\xd0\x62\xad\x3a\xc2\xd0\x9b\xa3\x2f\xf0\x3f\xae\x28\xd8\x71\x9a\xba\xe8\xe8\x52\xc1\xa4\xcc\xac\xad\x5e\x8d\x08\x2d\xd8\x0f\x20\x15\x9a\x54\x6f\x19\x4f\x07\xa4\x64\xe9\xd7\x5d\xaa\x4a\xd9\xd1\xe3\x2e\x08\xef\x91\xea\x77\x27\xae\x9d\xc3\x31\xe4\x5d\x15\x11\x21\x36\xf5\x11\x71\xd3\xdb\x80\x9d\x90\xd1\x13\x68\xba\x76\xa2\x22\x76\x0b\xfb\xa5\xab\xfb\x35\x61\xb5\xce\x9c\xaa\x02\x57\xfa\xce\x17\x9a\x53\x55\xfb\xa8\x91\xc1\xb0\x41\xf3\x4f\x55\xd0\x04\x06\xe4\xef\xd5\x8f\xd8\x70\x59\xfd\xb4\xbf\xff\xe7\xef\xce\xfe\xfa\x9f\xfb\xfb\x3f\xff\x3d\xbc\x8a\xac\x10\xb5\xe6\xa5\x5b\xd0\x06\xcf\x45\x0a\x17\xf8\x0e\xfc\xd3\x89\x6b\xc7\x49\x22\x4a\xae\xdd\x05\x4c\x5b\x1e\xcd\x84\xd2\xe7\x97\xd5\x9f\x85\x48\x97\xff\x52\x9d\x4a\xa5\x3d\x4b\xc6\x80\x5b\xd4\x21\xfd\xc6\x8e\xfe\xd8\x43\x4d\x4b\x7a\x3e\xaa\x6e\x56\x8f\x8d\x58\x72\xd7\x7a\x62\xbe\xf1\x20\xc0\x16\x97\xbe\x3e\x02\xc7\xa4\x72\x23\x99\x36\xeb\xe6\xed\xcd\xdf\x76\x6a\xe6\x6b\x47\x8f\xa4\xad\xda\xc1\x9e\x01\x86\x10\xf1\xad\x94\xf0\x20\x57\x0c\xd6\x6b\x29\xb5\xbb\xf9\xf8\xf2\x9c\xcc\x2d\x84\x9f\x0d\x70\xbc\x13\xed\x9b\x4f\x4a\xe3\x6a\x2f\xe8\x52\xf2\xea\x3b\xeb\xaf\xf6\xd7\x5d\x21\x01\x55\xd5\xf6\x02\xa3\xd8\x1c\xd8\x1f\x47\x49\x51\x0e\xdc\x0d\xa3\x1c\x72\x21\x17\xd5\x9f\x95\x8b\x70\xa8\xb4\x90\x74\x8a\x89\x27\xf6\x71\xfb\x58\xf5\x97\x7d\xb0\xf1\x82\xd5\xa7\xad\x2a\x9c\x94\xd2\x08\x0d\xd9\xa2\x2e\xfd\xf9\xfa\x68\x9b\x07\xfd\x33\x21\x6d\x15\x66\x74\xed\xfb\x68\x47\x13\x21\xeb\x20\x01\x14\x38\x2b\x28\xa2\x3e\xe9\x12\x6b\x07\x95\x18\x64\xad\x01\x7c\x6e\x34\xcb\xd6\xa5\xc1\xea\xd1\x23\x35\x4b\xd9\x9c\x29\xd1\x21\xbd\xa6\x9a\x68\x73\xce\x80\xab\xed\x61\x23\xa3\x2a\xb3\xd9\x7d\x81\xd5\x90\xaa\xf3\xba\x44\xf6\xdf\x76\xe9\xf4\x6d\x47\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\xec\xbc\xf4\x1e\x8a\x93\xda\xd1\x67\x89\xd2\xe6\x8c\xbd\xa0\xdf\x27\x2c\xf2\x6f\x87\x47\xaf\xbe\xcf\xbf\x0f\x8f\x7e\x57\x33\xa4\x8a\x5d\x3f\x9b\x03\xae\x20\x91\xa0\x3f\x87\x25\xc7\xbe\x29\x08\x94\xd9\x57\xa4\x52\x2d\x5e\x1b\x9f\xfb\x2d\x18\x77\xbc\xd8\x6e\xf7\xb5\x96\x44\x27\x52\xe4\x3e\xed\x1d\xdd\x1b\xd8\xe6\xda\xdf\x77\x0b\x9d\x9a\x25\xda\x11\x8d\x41\xd1\x18\xb4\x61\x3c\x6a\x0c\xba\xb6\x78\xf8\x6c\x2d\x41\xc0\xe7\x6d\x5d\x18\x6b\x3d\xe8\x5e\xd7\x09\x6b\xc4\x6d\xe7\x50\x1b\xf9\xa3\xae\x2a\x4f\x5c\x1d\x49\x63\x19\x5a\xbe\xde\x87\x89\x5d\xec\x19\xb7\x07\x1f\x27\xa8\xf3\x4a\x5c\x57\x03\x5b\xc2\x10\xe6\x66\x09\x55\x0d\xec\x46\xb5\x4b\x8c\x2e\xc5\x98\xd7\x1f\x6d\x08\xea\xad\x8d\x4a\x35\x4a\x1a\xe3\x75\x9d\xd0\x4a\x38\xac\x8b\x4b\x53\xa5\x44\x62\xa3\x69\xab\x2c\x07\x2c\x5d\xe7\x96\x8d\xab\xc1\x3e\xd3\x41\x3f\x72\x5b\x78\xba\xfe\xd6\xf1\x02\xeb\x61\xf2\xb9\x2f\xbe\x9d\xfa\x9c\x19\x5c\xc9\xfa\x39\x5e\x57\x00\x82\x41\x44\xe7\x04\x0b\xe2\x10\x90\xea\x57\x1a\x36\xc5\x50\x0c\x31\xa9\xad\xac\xed\xda\xfc\x75\xe6\xe2\xdd\x79\x66\xe5\xd9\xea\x24\x0c\xad\x30\xcb\xda\xfc\xdc\x64\x92\xaf\xc1\x19\xd8\x9d\x7d\xfe\xe6\x58\x67\x4f\x6c\xb3\x1f\x96\xb9\x83\xef\xa4\x4f\x36\xd9\x87\xb3\xa4\x90\x30\x61\xf7\x3d\x9d\xd3\x63\x5e\x5b\x62\x58\x0a\x5c\xb3\x09\xb3\x39\x34\x85\x84\x02\xb8\x4d\x5e\xa0\xc9\x0c\x69\xbf\xe3\x94\xb5\x73\xfa\x39\x06\xf3\x58\x81\xbb\x5f\x52\x76\xbd\x4e\xd8\x8f\x74\x8c\x44\x3a\xd6\x7a\x7c\x26\x3a\xe6\x30\xf7\xf9\x10\x31\x8c\x3c\xef\x1e\xfa\x7e\x1a\xc4\xb1\x23\x16\xef\x8c\x65\x75\x9e\xd3\x11\xce\xd2\xca\xfa\xdc\x09\x19\xf0\xb5\x97\x65\x96\xf5\x54\x7d\x7b\xff\x1c\xa1\x51\x94\x59\xe6\x92\x8e\x47\xe4\x23\xc7\xf3\x78\x8c\x5d\x1e\x06\xe4\x02\xe6\x20\x07\xe4\x7c\x72\x21\xf4\xa5\x15\x6c\x9b\xb1\x6c\xf6\x46\xc2\x26\xe4\x9d\x51\x99\x94\x26\xda\x56\xda\x0f\xea\x02\x09\xd9\x98\xa0\x2e\x39\xd6\x21\x06\x7d\xf3\xb6\x7c\xe1\x33\xda\x86\x4f\xb4\x4d\x55\x2b\x93\x1e\x74\x53\xdf\xb2\xce\x45\xc7\x61\x44\xa4\x73\x8d\xac\xcb\xe9\x7d\x81\x65\x36\x0a\xa1\xf4\xb5\x51\x61\xfb\x69\x73\x73\xe9\xa7\xc3\xce\x11\x34\xcb\x20\x6d\xf4\x39\xb2\xfd\x39\x68\x53\x85\xc6\x6c\xe3\xaa\x5d\x04\x90\x19\xe5\x69\x06\x12\x4b\xbe\xab\xe5\xba\x56\xac\xee\x71\x50\x75\xa5\xf0\x69\xa1\x34\x49\x84\x4c\x5d\xb3\x5a\x97\xbc\x89\x8b\xa9\x8e\x17\x12\xda\x9c\x72\x3a\xb5\x5d\x0a\x57\x0a\x07\x63\x39\x69\x15\xb4\xb6\x98\x09\x71\x4b\x12\x91\x17\x19\x1e\x80\x0e\xe7\xa3\xee\xac\x53\xa1\xe8\x10\xbb\x29\x1e\x05\x4d\x77\xf0\x87\x27\xec\x8e\xd8\x87\x9c\x02\xf7\x90\xf4\xd6\x95\xcf\x50\x44\xb3\xcb\xe8\x13\x17\xbc\x12\x57\x26\xc2\x1c\x46\xb3\xd7\x75\x3d\x82\x8a\xe8\x8d\xc8\xd9\x3d\x24\x41\x67\x4b\xf3\x84\x6b\x6d\xa9\x05\xda\x43\xba\x77\x2c\xee\x6c\xca\xef\xcb\x7c\xde\x21\x41\x2d\x1c\x4b\xd5\xe7\x70\x4e\x5f\x6c\xdb\xbd\x02\xfb\x16\xd8\x04\x69\x4c\x5a\xf3\xf5\xb7\x1b\x67\xc8\x9e\xd8\x95\x92\x75\x55\x80\xb2\x9f\x0b\x13\xb5\x85\xd0\xe4\x60\xff\x68\xff\x70\xc5\xae\xb7\x54\xb1\xf9\x26\x78\x92\x61\x89\xc2\x02\xeb\xfd\x41\xb2\x9f\x0e\x08\xd3\x9e\x46\xdb\x4a\x09\xb8\x2a\x97\x49\x37\x20\x4a\x10\x2d\x69\xca\x9c\xe6\x84\xbf\x9a\x9b\xb4\x2c\x5d\x99\x84\x83\xfd\x5f\xf7\x07\x04\x74\x72\x48\xee\x04\xdf\xd7\xb8\x7c\xac\x29\x52\xaa\x60\xa2\x85\x28\xb1\x75\x9f\x05\x41\x55\x20\xc4\x10\x3a\x22\x4a\xdb\xe7\x67\x46\xb5\xcf\xe0\x3b\xbb\x67\xda\xf7\xb6\x10\x13\xf2\xc6\xb6\x19\x02\xea\x2c\x8b\x19\x9b\xc3\xd1\x0c\x68\xa6\x67\x36\xf8\x82\x0b\x3e\xb4\x9d\xe2\x0c\x05\x72\x57\xba\xfa\x21\xba\x99\xe9\xc2\xd1\xc1\x64\xb7\xba\xa0\x8e\x12\xb9\xa1\xbd\xdf\xb6\xef\x85\x4b\x56\xda\x44\xdf\xdc\x5c\x7e\xdb\x68\x86\x8b\xc4\x5f\xeb\xc2\x87\xc4\x04\xc5\x36\x9e\x01\xed\xe8\xc7\x09\xd8\xa9\x93\x2d\xe9\x91\x84\x75\xed\x68\x4b\x56\xdb\x7e\xef\xd6\xca\x96\xfc\x55\x94\xd8\x82\x8f\x8e\xb3\x05\xb9\xa3\x5c\xfb\xf4\xbd\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\xfe\x02\x34\x05\xa9\x90\x7a\x00\x6d\x5d\x54\xcc\x8f\xde\x9c\x53\xc1\xda\xfa\xe5\x03\xa5\xd2\x22\x27\x33\xf7\xd9\xcd\x94\x46\x77\x32\x46\x78\x7a\x7c\xbe\x90\x84\xc2\x52\x38\xf7\xcc\xab\xa3\x5f\x2b\x74\xc3\xc2\xbd\x51\x7c\x3f\x09\xc1\x16\xb6\x68\x61\xdc\x02\xcb\x36\x57\xec\x89\x96\xf6\x10\x54\x40\x7a\x0c\x2c\x20\xdd\x12\x24\x97\x27\x42\x67\x59\xf7\x18\xaa\xde\x62\x15\x48\x6f\xfe\x78\xb2\xce\x78\xe9\x70\xc6\x46\xce\xf6\x04\xc4\x5e\xbd\xe0\xa4\x7b\x0a\x66\x38\x1e\x06\x40\x3f\x9b\x4f\xfa\x84\x40\xd1\x43\xc8\xf4\x6a\xc0\xf4\x4a\x8b\x71\x24\x13\xb6\x52\xd5\xb3\xe1\x32\x5d\xfb\xad\x93\xf5\xf9\xc7\x92\xf0\xaa\x3d\xae\x7e\x11\x3d\xd7\x49\x7f\xa1\x8d\x7d\x07\x36\xf6\x1a\xd6\xf8\x49\x83\x1a\x31\x95\xa2\x33\x15\x69\xda\xd4\x71\x4a\x83\x01\x46\x6f\x33\x1a\xa7\x93\xfd\x9c\x51\xc8\xb7\xf0\x68\x5a\x51\xcd\x51\x7b\x16\x67\x4c\x27\xc5\xb5\x48\x6e\x7b\xd4\x6b\xf6\x6f\x4e\x2e\xed\x94\x81\x6a\x43\xb9\x37\x86\x30\x3e\x17\xd9\xdc\x56\xfa\xbb\x39\xb9\xc4\x93\x37\xc2\x7f\xa1\x21\x0a\x35\xea\x85\x79\xd6\x07\xfb\x3b\x17\x8e\xd1\xbe\xad\x05\x8d\x12\x09\x34\x63\x4a\xb3\x04\x9f\xab\x6c\x5b\x38\x43\x17\xdf\x4d\xd4\x94\xd6\x8d\xde\x35\xa5\xa0\xdb\xec\xae\x4a\x53\xd7\xe0\xbc\x67\xcc\x97\x1c\x3f\x92\x55\x33\xb5\xc8\x97\x7a\x9a\xef\xf9\xf2\xa5\x42\xc2\xb5\x16\x45\x4f\x9e\x10\x3b\xd9\x06\x3f\xc8\x18\x26\x42\xc2\xb2\x23\x24\x70\x6c\xa4\x25\xb8\x42\x9c\xc7\x97\xe7\x95\x09\x4a\x34\x9c\x17\x36\x2c\xd1\x57\xdf\xcc\xd8\x1c\x38\x28\x75\x84\x2e\x8f\xb2\xb0\x2a\xa6\xef\x9b\x3b\x30\x5f\x07\x79\x61\xeb\x57\x56\xa1\xfe\xae\x6b\x2f\xfe\x08\xda\x16\x9e\xac\xfc\x2f\xce\xa2\xea\x97\xbf\xec\x2a\x49\x24\x55\x33\xdb\xd1\x16\xee\x99\x76\x5d\x99\x25\x50\x25\xb8\x35\xf6\x06\xcd\x75\x99\x22\x05\x55\xaa\x2e\x03\xee\x5e\x62\x1f\xba\xb4\xa5\x83\xc3\x07\xa6\x92\x26\x40\x0a\x90\x4c\xa4\x04\x73\x6e\x53\x71\xc7\xc9\x18\xa6\x8c\x2b\x0f\x3f\x33\x91\x07\xb4\x61\x37\x80\xb6\x61\x5f\x51\x6d\x44\xae\x1a\x85\x42\x5c\x0a\x4f\x22\xea\x13\xed\x56\xb1\xec\x64\xc2\xa8\x49\x04\xaf\x6d\x2b\x53\x6d\x4c\xd8\x69\xe7\x91\x45\xf7\xe0\x6d\xb2\xcd\xa0\xfc\xb5\x8d\xd0\xc1\x82\xa7\x34\x99\x75\x73\xdf\x46\xf7\xd4\x96\x23\xba\xa7\x76\x1b\xd1\x3d\x15\xdd\x53\x9b\xc7\xb3\x33\xef\x46\xf7\x54\x54\xba\x96\x47\x74\x4f\x45\xf7\xd4\x86\xf1\xec\xe8\x57\x74\x4f\x6d\x31\xa2\x7b\x6a\xcb\x11\xdd\x53\xd1\x3d\x15\xdd\x53\xd1\x3d\xf5\x1b\x32\x03\xfa\x11\xdd\x53\x2b\x93\x44\xf7\x54\x00\x8c\xa8\x29\xad\x19\xd1\x3d\xb5\x66\x44\xf7\x54\x30\x22\x5f\x6a\xc1\x97\xbc\x73\xe7\xd2\xe8\x65\xdd\xdb\x08\xa3\x76\x87\xf5\xfc\x5e\x69\x5a\x53\x17\x1b\xff\xb3\xb6\xef\x3f\x13\x1f\x4a\x0f\x36\xfd\x68\xcf\x7f\x75\xf6\xfc\x7e\x6c\x61\x3d\xd8\xc1\x3a\x93\x72\xe7\x35\xbf\x99\x49\x50\x33\x91\xb5\x46\xf4\x06\x92\x7f\x60\x9c\xe5\x65\x6e\x70\x4e\x19\x7c\x66\xf3\xca\x3d\xaf\xea\x96\xcc\xe8\xb5\xb7\x26\x39\x73\x23\x4b\x01\xab\x71\x52\x96\x99\x6d\xc4\xfc\xc9\x19\x45\x99\x58\x95\x49\x02\x80\xbd\xbe\x42\x75\xe1\x0f\xa3\xea\x4d\x55\x6f\x87\xb7\xdd\xe8\x4d\x37\x26\x6b\xeb\x65\xe2\x2c\x7f\xf8\x7d\xab\x39\x3a\xba\x53\x3e\xbf\x2b\xa5\x07\x32\xdd\x5d\x31\xe8\xa4\x14\xf4\xc1\x25\xba\x2a\x03\x2f\xcd\x65\xd2\x9b\xeb\xb0\x07\x57\xc9\x33\x72\x93\x3c\x1b\xb6\xf0\x5c\x5c\x23\xcf\xb0\x14\x68\x0f\x96\xfc\x3e\x5c\x21\xfd\xb9\x41\x3e\x41\xc5\xcc\x4f\xe3\xfe\xe8\x51\xed\xec\xc9\xed\xf1\x39\x5c\x1e\xbd\x7c\x75\x57\x57\xc7\xe7\x73\x73\xf4\xf3\xb9\x1d\xcd\x48\xaf\xc2\xb5\xd1\x83\xf9\xa8\x4f\xd3\x51\x6f\x66\xa3\x4f\xe6\xca\xe8\xee\xc6\x78\x06\x2e\x8c\xce\x40\x66\x9c\x69\x46\xb3\x53\xc8\xe8\xe2\x1a\x12\xc1\xd3\xd6\x1c\x66\xa9\x84\x5a\x75\x7e\x94\x9d\xd6\xe9\x68\xcd\x40\xdf\x19\x75\x95\x62\x21\xf5\xb1\xcb\xde\xa4\xe7\x04\x0a\xb4\xc6\xd9\x55\xb6\xa9\xc3\x74\x27\xe4\x6d\x26\x68\xaa\x8e\x0a\x61\xff\xaf\x0e\xe3\x0d\xe2\x77\xed\xbb\xba\x05\xf0\x3e\xb5\x32\x68\xa3\x9e\xfb\xdc\xc4\xbf\x88\x3b\x22\x26\x1a\x38\x39\x60\xdc\xef\xe3\x61\xa0\x06\xd6\x9a\x79\x85\xd6\xe6\xea\xdb\x37\xfe\xe6\xd7\xa7\x72\xa3\x71\x41\xa9\x4f\x6f\x01\x71\x2f\x7a\xdc\x04\xe2\x6e\x9c\x94\x59\xd3\x0c\x62\x4d\x23\x4d\x7a\xf3\xb6\xae\x75\xf9\x16\xe7\xad\x4e\x1b\xe5\x29\x71\x19\x12\xaf\x6f\xd3\x3a\x3b\x68\x5f\x83\x73\x36\xda\x5e\x48\xdf\xb6\x97\x27\x72\xc2\x3e\x43\xa9\xf9\x85\x3a\x5e\xa3\xd4\xbc\xc3\x08\x12\xad\xbe\x95\x34\x81\xcb\xde\x05\x0e\x7f\x9c\x48\x5a\x4a\x97\x1f\x57\xc9\x1d\xd5\xe1\xe1\x00\xa9\x3d\x4d\x55\xf6\x19\xa6\x7d\x4d\xca\x2c\x5b\x90\xb2\x10\xbc\x99\xe2\x67\x9d\x56\xcb\x99\x61\x66\xb6\x75\x6f\xa9\xa5\xd4\x42\x0a\xc7\x80\x65\xc9\xb9\xa1\xe7\x75\xf7\x1b\x94\x4a\x95\xa5\xd5\x61\xfe\x99\x62\x53\xb3\x7c\xc3\x4c\x31\x35\x8d\xe5\x50\xf7\x47\xa8\x27\x34\x4f\x4f\x84\x4c\xd8\x38\x5b\x90\x19\xcd\xaa\x56\x07\x94\xdc\xb2\x2c\x73\xd3\x8c\xc8\x35\x68\xa2\x67\xcc\x75\xa9\x26\x99\xe0\x53\x5c\x1c\xe5\xbe\xc5\x16\x24\xe6\xd9\x24\x03\xca\xcb\xc2\xbe\xcf\xb0\xf5\x85\x28\xa5\x7f\x9f\xab\x1f\x59\xcd\xc2\x14\xe1\x2c\x1b\x04\x8d\x7c\x1e\xdc\xd8\xba\x5b\xba\x02\x9f\xbc\x77\xc7\x14\x0c\xc2\x39\xc5\x1c\xa4\x64\xa9\x73\x1a\xd8\xdf\x0a\x29\xe6\x2c\xb5\xad\x18\x3c\xd8\xb0\x65\xa8\x6d\xd5\x50\x9d\x67\x2e\xf8\x90\xc3\x94\xa2\xd4\xe3\x4e\x91\xdd\x33\x3b\x8f\x75\xc5\xf1\x14\x9b\x37\x18\x75\x41\x14\x8d\x9c\xd1\x39\xb3\x6d\x27\x03\xc8\x91\x03\x2e\x88\x40\xf6\x5a\x72\xa6\x6d\x2b\xe3\x59\xa9\x49\x2a\xee\xf8\xa1\x99\x9c\x29\x03\x07\x4a\xc6\xa0\x7d\x5b\x55\xdf\xe6\x8f\x49\x50\x04\x38\x1d\x67\x66\xcf\x31\x26\xe0\x66\x2d\x80\xc8\x04\xa8\x2e\x25\x90\x29\xd5\xb0\x56\x68\xb2\xdf\xfb\x30\x78\x99\xaa\x5a\x8e\x97\x5c\x41\xeb\x66\xcb\x3d\x4b\x5a\x7f\xfa\x63\x3b\x1a\xc1\x72\x10\xa5\xfe\x2c\xaa\xa4\x6d\xc7\x1f\x48\xc6\x2c\x07\x45\x44\xb9\xa4\x63\xbf\x75\x8f\xad\xdf\xa1\xa8\x4f\xae\x1b\x6d\xad\xc4\x6b\x4c\x69\xae\x1b\xe0\x6a\xfc\x4c\xd0\xed\x94\x9a\xa3\x78\x7a\x71\xfd\xcb\xfb\xe3\xff\x3a\x7b\xef\xce\x27\x0f\x99\x7e\xc9\xd9\x3f\x4a\x20\x34\x17\x46\xae\xce\xc2\x30\x9c\x01\x9a\x07\x82\x1f\xf0\x24\xf7\x1b\xb0\xd3\x92\x21\x63\x6b\xe6\xee\x61\x49\xd8\xe0\xf9\xd3\x47\x25\x3d\x75\xcb\x9a\xaa\xe5\xa6\xf9\xe0\xb0\x65\x0d\x25\x1c\xb4\x39\x79\x56\xa2\xb4\x2d\x8c\x18\x9f\x66\xa1\x30\xd9\x8e\x5c\x75\xd5\x89\xba\x6a\x44\xc3\xfa\x0b\x2e\xdb\x2a\x46\xbd\xb4\xce\xa9\xd7\xd0\x53\xc3\x89\x9a\x6a\x7b\x35\xc0\x76\x04\xf5\x6a\x80\x15\x3d\xce\x2f\x09\x4d\x53\x89\x62\x0a\x9e\xfa\x7c\xa9\xf1\x1c\x3e\x6c\x8d\xf1\x03\xf2\x86\xfc\x99\xdc\x93\x3f\xa3\x5a\xf0\xa7\xae\xed\x39\xba\x0a\xec\xdd\xcd\x12\x56\x1b\x3d\xbf\xec\x09\xe2\x3f\xce\xa8\xc6\x19\x0d\x54\xb5\x20\x63\xe6\xc4\x50\xb8\xd7\x20\x8d\x58\xe4\x76\xe2\x49\x1b\x9b\x98\x05\x7e\x46\x34\xb3\x36\xf7\xf3\x49\x58\xf9\x5f\xef\x88\x68\xe6\x71\xa3\xdf\x5f\x38\x2a\xd4\xec\x23\x50\xcf\x96\x53\x9d\xcc\x9a\x64\xcc\x08\x18\xaa\xc1\x9c\x52\x81\x64\xdc\xc6\xaf\xcd\x58\x87\x08\x82\xe7\x83\xc6\xdd\x9c\xca\x8d\xfd\x7c\x68\xa7\x96\x14\x7f\xe4\xf3\x4e\x30\x08\xea\x8f\x14\x22\x1d\x91\x33\x9a\xcc\x70\x59\x69\xc0\x33\x8c\x06\x82\x93\xcd\xe8\xdc\x6c\xbc\x7b\xd6\xf6\xdd\x40\x69\xa5\x32\xb5\x22\x2e\x99\xf3\x94\x50\x6e\x3b\xdf\x4d\x40\x4a\x1b\x72\x38\x5e\xa0\xe7\x93\x25\xd0\x79\xf3\x3a\x9d\xa4\x42\x0a\x2d\x12\xd1\xa1\xf7\xca\x72\xf4\x33\x4e\x87\x40\xb0\x46\x4b\x6f\x2b\xfe\xfe\xf4\x72\x40\x6e\x4e\x2e\xb1\x69\xc6\xf5\xc9\xcd\x65\x53\xc2\xde\xbb\x39\xb9\xec\xd0\xc3\xbf\x17\x9b\x87\x33\xb3\xbd\x33\xcb\xdc\x79\x12\x09\x34\x65\x31\x8e\x7c\xfb\x11\xe3\xc8\x37\x8f\x18\x47\x1e\xe3\xc8\x63\x1c\xf9\xc3\x23\xc6\x91\xbb\xf1\xf4\xa6\x1e\x12\xe3\xc8\x5b\x8e\xd7\xe5\xcb\x8c\x71\xe4\x3b\x8d\x18\x47\xbe\x3a\x62\x1c\xf9\x86\x11\xe3\xc8\x37\x8c\x18\x47\x1e\xe3\xc8\x63\x1c\x79\x8c\x88\x79\x74\xae\xe7\x19\x11\x43\x62\x1c\xb9\x1b\x31\x8e\xfc\x55\xf8\xfd\x49\x8c\x23\xdf\x6a\xc4\x38\xf2\x18\x47\xde\x66\xc4\x38\x72\x1c\xd1\xf6\x12\xe3\xc8\xfd\x88\x71\xe4\x76\xfc\x76\xa4\xe6\x18\x47\x1e\xe3\xc8\x63\x1c\x79\x8c\x23\x7f\x70\x15\x31\x8e\xfc\x35\xe8\x93\xbe\xa1\x56\xf7\x20\xe8\x2b\x3f\xd3\xf6\x61\x35\xe4\x6c\xcd\xaf\x68\x56\x51\x85\x99\x44\xd6\x53\x66\x12\x68\xba\xc0\x29\x13\x74\xcb\xd4\x42\xd6\x0b\x8c\xce\xc9\x58\xce\xda\xc5\x9d\x93\x95\x43\xf3\x1e\xe7\x0a\x5c\x38\x06\x2c\x39\xbd\xc7\x03\x40\x73\x51\xda\xfe\x5d\x89\xc8\x8b\x52\x37\x61\x8a\xdb\xd3\xa6\xf5\xd6\x84\x4d\x1d\x47\x3d\xb2\x5d\xc2\x86\xd5\xb4\xc3\xa0\x33\xd7\x13\x2a\x30\x34\xf5\xe1\x27\x97\x3d\xe8\x12\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf5\x92\x3b\x0b\xbc\xfd\x89\xbb\x3d\x09\xbb\x9f\x44\xd4\x75\xbe\xdf\x9e\xce\xe2\x95\x9b\x6d\xf9\x34\x3a\x76\xf4\xd0\x69\xf4\x1a\x37\x0a\x71\xd5\x3c\x4c\x11\x91\x33\xad\x1d\x15\xa5\x61\xd4\x17\xd3\x0d\x95\xd3\xd1\x01\xec\x76\x48\xb5\x6d\x27\x58\x45\x4c\x05\x11\xbb\xc2\xcb\x75\xae\x4d\x63\x65\x8d\xc0\xf3\x3c\x4c\x61\xc2\x38\x38\x2f\x57\xa4\x0d\x8f\x8f\x48\x1b\x5e\x23\x6d\x50\x90\x94\x92\xe9\xc5\x89\xe0\x1a\xee\x5b\xd9\x4f\x36\x19\x90\xae\x9b\x53\x13\x7b\xe2\x2c\xa5\xf0\xaf\x25\xa2\xb0\x81\x92\x1b\x53\xf3\xaa\xa0\x5b\x59\x72\x54\x29\x6d\x0e\x05\x68\xab\xef\xa1\xa6\x83\x51\x90\xcb\xaf\xf3\x1a\x9c\x9d\xfa\x1f\x25\x9b\xd3\xcc\xe8\xb7\xf5\x13\x97\xa8\xb3\x84\x0f\xb5\x32\x62\x3d\xb1\x8c\x85\xe2\xcd\xa5\x64\x73\x96\xc1\x14\xce\x54\x42\x33\xa4\x4a\xfd\x50\xfa\xe3\x0d\xb3\xe3\x16\x49\x91\x29\x72\x37\x03\x6c\xa3\x4a\xbd\x7a\x8e\x99\x0a\x53\xca\x38\xc9\x0d\x51\x2d\xfc\xc3\xca\xea\xf9\x86\x78\x1b\xa9\x97\xeb\x5a\x9f\x47\xf5\x75\x2c\x44\xe6\xc2\x7a\xb3\x45\x3d\xbf\x6b\x6b\xcb\xc5\x2f\x1c\xee\x7e\x31\xb3\x29\x32\xc9\xe8\xb4\x52\xe3\x15\xe8\x15\x4b\x5c\x3d\xf5\xc6\x0f\xc0\x98\xd9\x12\x08\xcd\xee\xe8\x42\xd5\x46\x8d\xb0\xe1\xef\x3b\xf2\xf6\x10\x11\x8f\x2a\x52\xcd\x91\x92\xdf\x1f\xa2\x9f\xef\xe4\xf8\xf2\x97\xeb\xbf\x5e\xff\x72\x7c\xfa\xe1\xfc\xa2\x1b\x9d\x37\xdf\x0e\x94\xb7\x9a\x23\xa1\x05\x1d\xb3\x8c\x75\x21\xef\x2b\x91\x20\xe1\xa4\xc8\x40\xd3\xf4\x28\x95\xa2\xb0\x70\xf2\xf6\xa3\x50\xc7\x39\x5d\x32\x0b\x3b\x9e\x6d\xb7\x67\xd2\x9c\x70\x2a\x29\xd7\xb5\x21\xa5\x06\xb9\x2c\xb9\x51\x7a\x5f\x78\xd0\x3c\x4d\xfb\x0b\x98\x3f\x4e\x53\x48\x1b\xd0\x7b\x75\x01\x7a\x27\xfe\xe3\x16\x75\xae\x2d\xb9\xfc\x78\x7d\xfe\xbf\x97\xd0\x70\x51\x74\x8b\x47\xea\x27\xbf\x47\xb6\xef\x40\x4e\x56\x8d\x09\xb9\x98\xc7\xfd\x7d\x2e\xfb\x5b\xf1\xaa\x7e\xbc\xe0\x57\x25\x0f\xd9\x09\x0f\xe6\x27\xb9\x48\x61\x44\x2e\x2b\x0b\x7a\xf3\x6a\x58\x43\x40\x02\x31\xb7\x70\xcd\xb0\xd5\x79\x20\xca\x68\x61\x13\x5d\x1a\x19\xa6\x21\x1d\x9e\xd0\x4c\x75\x24\xa6\x5d\x38\x93\x61\xc2\x1f\x8c\x2a\xd8\x0b\x34\xab\xd9\x48\x0a\x5c\x68\x27\x49\x9a\x55\x62\xd2\xad\x14\x09\xb1\x7a\x67\x10\xb2\xd4\xe0\x2e\xae\x01\xbe\x67\x4c\x4c\x79\x58\x5d\x56\x33\x5b\x0b\x6c\xa9\x40\xad\x67\x4c\xb5\x26\x6a\x66\x97\x40\x53\xcc\x17\x2b\xa8\x9e\xd9\x88\x83\x9c\xaa\x5b\x48\xed\x0f\x4e\xae\xa9\x4c\xf0\xb6\x19\xbe\x7b\xd5\x8d\x59\xb7\xb7\xb7\xa3\x3c\x63\xe3\x20\xd0\x4e\x0f\xad\xa3\xd3\x3b\x1f\x01\xf3\x4d\x1f\x79\xb6\xb8\x12\x42\x7f\x53\xe5\x49\xf5\xb2\x81\x3f\x3a\x49\x11\xdd\x2c\xcd\x90\x29\x0c\x10\x48\x87\x08\x4c\x44\xe9\x30\x45\xeb\xb4\xde\xb0\x27\x46\x68\x59\xf2\x63\xf5\xad\x14\x65\x6b\x0e\xb0\x22\x68\x7d\x7b\x7e\x8a\xe7\xb8\x74\x1e\x30\xae\xe5\xa2\x10\xcc\x9a\x4f\x36\xc8\xb4\xdf\x3b\x1f\x5e\x88\x91\xb5\xbb\x85\x7c\xa0\x0b\x42\x33\x25\xbc\x70\xcc\xf8\x3a\x55\x87\x38\x3d\xca\x5c\x1e\x0b\x3d\x5b\x51\xa0\x0c\x3a\xaf\x3e\x37\x08\x1c\x62\x75\xdd\x14\xc6\x57\x1e\xd7\xf4\x16\x14\x29\x24\x24\x90\x02\x4f\x3a\xee\xda\x53\xbb\x81\x70\xe7\x2f\x04\x37\xc7\xa2\x97\xbd\x3f\xaf\xfc\x7f\x68\xc6\x6a\xee\x34\x7a\x12\x9d\xde\x41\xd1\x9f\x88\x87\xa2\x54\x20\xad\xf3\x53\x96\x60\x37\xe2\xbb\x72\x0c\x19\x68\xab\x0c\x61\xfd\x00\xaa\xad\xca\xcb\x72\x3a\x05\x42\x75\x85\x28\x5a\x10\xe0\xca\x90\x1b\x6b\x38\xd3\x24\x15\x50\x27\x37\x52\x45\xbe\x3f\x3f\x25\x6f\xc8\x81\x79\xd7\x21\x6e\xff\x84\xb2\x0c\x5d\x8d\x9a\xca\xe5\x35\xb2\x89\x9f\x02\x97\x84\xb8\x47\x84\xb4\x47\x74\x40\xb8\x20\xaa\x4c\x66\x7e\x4d\x46\xe3\xf2\x0a\x9b\x8b\xb5\x43\x93\xfc\x2b\x44\xd5\xce\x04\xe6\x7b\x05\xb2\x37\xfa\xf2\x7d\x0b\xfa\x12\x8a\x10\x06\xe7\x9a\xd0\xb3\x88\x95\x83\xa6\x29\xd5\xd4\xd1\x9d\x3a\x23\xfa\x35\x6e\xe9\x53\x53\x1f\x05\xef\x19\x2f\xef\xad\x6d\xad\x3f\x25\xff\xfa\x0c\xa7\x45\x14\x40\xa0\xe1\xa6\xd1\xa2\xc8\x58\xed\x79\x0c\xa2\x9b\xce\x1b\x5b\x3d\xd8\x20\x22\xe1\x31\xf7\x0e\x4c\xc3\xd9\x29\x4f\x45\xbe\xf2\x32\xf4\x96\xd2\x64\x16\xbe\xe0\x55\x22\xcf\x93\x9b\x23\x32\x98\x43\x87\xda\x1c\x4b\x88\xf3\xde\xcc\x66\x64\x31\xbf\xa1\x38\x3d\xc9\xe8\x18\x32\xcb\x59\x2c\x02\xa9\x55\x04\x7a\xea\x08\x41\x29\xb2\xfe\xf2\x23\xae\x44\x06\x36\xe4\xc6\x03\xc2\x4c\xff\x22\xe0\x80\x93\xf4\x05\x07\x54\x64\x1a\x70\x40\x95\xec\x25\xc0\xa1\xec\xc0\x68\xc9\x32\x1c\x0c\xd7\x6e\xc2\x01\x59\xe7\x73\x87\x83\x82\x24\x11\x79\x71\x29\x85\x51\xb9\x7a\x63\x2d\x6e\xda\xda\xbf\x63\x75\x72\x34\xf8\x86\xda\x9f\xf3\xe6\x34\x6f\xa6\x32\x08\xb6\xa3\xda\xd2\x78\x1f\x71\xf7\xbf\x02\x96\x83\xa4\x67\x99\x0f\xf9\x59\x1a\x0e\x20\xf3\xa4\xbb\xf0\xc2\x53\xfd\x3b\x58\xc9\x7a\x61\x26\x22\xa1\x19\x96\x4e\xeb\x86\x31\x64\x19\x6b\x96\x27\x0e\x22\x24\xd1\xb5\x84\xbf\x79\xaf\x3d\x56\xd1\xc2\x5f\x9c\xed\x8b\x8b\x14\x02\x67\xa1\x0d\xed\xbc\xb1\x91\x74\x78\x9f\x0f\xce\x34\x5c\xdd\x39\xef\x21\x6d\x3c\xad\x85\xab\xce\xf2\xa1\x2a\xc8\x66\x16\x08\x3c\x65\x7c\x8a\x16\x9d\x01\x91\x90\xd9\xb0\x4e\x77\x86\x6f\xad\xfa\xb5\x8f\x18\xed\x27\xf5\xe8\xec\x5f\x8d\x92\x10\x13\xdc\xcd\x8c\x46\x0e\x2f\xdf\x4c\x2c\xb5\x64\x8a\xec\xbd\xf7\x00\xe8\x50\xc1\xea\x39\x32\x88\x3d\xfb\x85\xd5\x6e\x5a\x1b\xdb\x2d\xe3\xa9\x8b\x80\x6c\x00\xcb\x2b\x89\x4e\x0a\xc5\xd8\x5a\x96\x86\xa4\xe1\x1d\xf9\x1b\x27\x15\xb0\xc8\xb0\x35\x7a\x5c\x59\x81\xd5\x9b\x97\x86\x0f\x9b\xfc\xaa\x97\x2c\x4f\xf3\x3d\xc7\xbd\x37\xef\x1d\x1a\xb5\x77\xf5\x3e\xff\x2d\x7b\x4f\xb9\xaf\x77\x8c\xa7\xe2\x4e\xf5\xad\x43\xfc\x68\xa7\xf5\x02\x75\x62\xd0\x5a\x33\x3e\x55\xa1\x1e\xd1\xac\x93\xbb\x5e\x91\xf0\x3b\x3c\x91\xc2\xa6\xe1\xad\x0a\xf0\x4b\x91\xdb\x51\x09\xd8\x61\x4c\x73\x45\x4f\xa4\xf9\x14\xcd\x68\x76\x5d\xb4\x2f\x9b\x46\x96\xd1\xe0\xdb\x0f\xd7\xc7\xcd\xa9\x0d\x3d\xbb\x9b\x81\xb4\xbc\xd7\x5c\x27\x34\xcd\x99\x52\x68\x06\x82\xf1\x4c\x88\x5b\x72\xe0\x03\xad\xa6\x4c\xcf\xca\xf1\x28\x11\x79\x10\x73\x35\x54\x6c\xaa\x8e\x1c\xd2\x0e\xcd\xea\x0f\x09\xe3\x59\x15\x41\x82\x6a\x24\xd7\xca\x9b\x31\xf0\x25\x49\xb5\x0a\xdc\x5b\x57\x77\xd1\x79\x99\x57\x97\x69\x2b\x2d\x32\xc8\x9e\xbe\x18\xcc\xea\xf6\x5c\x74\xac\x6b\xf1\xc8\x16\xe1\xb7\xbb\xb4\x91\x30\xc5\x69\x2d\x1c\xad\xf4\xf6\xe4\x40\x72\xd2\x41\x02\xaa\xbf\x8a\x39\x7f\xa9\xe7\x24\x29\xd8\xcc\x06\xc0\xa8\x13\xba\x31\x0c\x09\xad\xb2\xfb\x98\x20\xe7\x1e\xdd\x0f\x25\x5a\xf4\xfa\xd8\x14\x0c\xa3\x0f\x64\xc5\x8c\x0e\xad\x92\x6c\x48\x12\xd2\x30\x2f\x03\xcc\x04\x17\xd2\xa2\xa8\xe1\x82\x82\x23\x4a\xa3\xb6\x60\x1d\x41\xb8\x27\x8e\xc6\x06\x4b\x3d\xa9\xfd\x83\xa1\x0f\x09\x13\x6c\x6c\x82\x7e\xbd\x86\x3b\xa6\x67\x58\x44\x6e\xb6\xe4\x70\xc2\x95\x48\x50\xe8\x3d\xe0\x04\xa4\x14\xd2\x05\xc2\x78\xab\x2d\xce\x84\xa4\x18\x23\x69\x0c\x92\x50\xf3\xd7\xbe\x0a\x5d\x94\x75\x29\x53\x8c\xed\x32\xd8\x04\x93\x09\x24\x28\x29\x85\x00\xb6\x64\xf7\xa0\xae\xaa\xe7\x43\xe7\xb5\xf0\xa5\x50\x73\x76\x6f\xde\x12\x3e\xb5\x54\x50\x9d\x0b\x3e\x5c\x7f\xf9\x70\x44\xc8\x39\xaf\xe2\x1e\x07\x66\x17\xc3\x3b\x7d\xc8\x8f\x36\x9f\x18\xd6\xd1\xc5\x0f\x08\xed\x4e\x46\xbc\x93\x65\x0f\x18\xdf\xc5\x18\x4c\x42\x83\x70\xaf\xe4\x00\x0d\xc3\x6e\x52\xb3\xf5\x9e\x89\x77\x31\x14\x9b\x5b\x3e\x95\xb1\xf8\x65\x70\x7a\xd2\x95\xce\xb9\x74\xf5\x58\xfb\x75\xbb\x11\x6b\xbf\x6e\x1e\xb1\xf6\x6b\xac\xfd\x1a\x6b\xbf\x3e\x3c\x62\xed\x57\x37\x9e\x3e\x3d\x93\xc4\xda\xaf\x2d\xc7\xeb\xaa\x3f\x12\x6b\xbf\xee\x34\x62\xed\xd7\xd5\x11\x6b\xbf\x6e\x18\xb1\xf6\xeb\x86\x11\x6b\xbf\xc6\xda\xaf\xb1\xf6\x6b\xac\x62\xf5\xe8\x5c\xcf\xb3\x8a\x15\x89\xb5\x5f\xdd\x88\xb5\x5f\x5f\x45\xad\x1e\x12\x6b\xbf\x6e\x35\x62\xed\xd7\x58\xfb\xb5\xcd\x88\xb5\x5f\x71\x44\xdb\x4b\xac\xfd\xea\x47\xac\xfd\x6a\xc7\x6f\x47\x6a\x8e\xb5\x5f\x63\xed\xd7\x58\xfb\x35\xd6\x7e\x7d\x70\x15\xb1\xf6\xeb\x6b\xd0\x27\x95\x4e\x59\xab\x72\x58\xdb\x54\x2f\x70\x91\x21\x41\xbe\xe3\xb8\x9c\x4c\x40\x22\xe5\xc2\x37\xaf\x44\x21\x54\x55\x8e\x2a\x5a\xe6\xe2\x0c\xb0\xaa\x99\x04\x9a\xba\x28\xe8\x0d\x8f\xbb\x04\x4b\x2c\x5b\x55\x87\xef\x9d\x7d\xfc\xa6\x9f\x52\x09\xdd\x02\xd7\x70\xcd\x1f\x79\xd2\x3d\x80\xa9\x06\xf8\xba\xa8\x7c\x07\xf7\x24\x13\xca\x85\x1d\x22\xb0\x92\x19\xe5\x1c\xbc\xf2\xc8\x34\x1a\x65\xc6\x00\x9c\x88\x02\xb8\xa5\xdf\x94\x28\xc6\xa7\x19\x10\xaa\x35\x4d\x66\x23\xf3\x26\xee\x81\x5d\x87\x08\xba\x5f\x94\x96\x40\x73\x1f\x2c\x99\x53\x66\xa7\x22\x34\x91\x42\x29\x92\x97\x99\x66\x45\x35\x19\x51\x80\x51\xce\x96\x51\x55\xc0\xc0\xf0\x92\x3a\xae\x70\x50\xbf\xcd\x2d\x4b\x84\x95\x62\x50\x75\x1d\x60\x69\xcb\xbc\xd0\x0b\x62\x3e\x39\x73\xe5\xee\xa4\xd2\x24\xc9\x18\x72\x6b\x7c\xa3\x4d\x28\xc3\xf9\x06\x9e\x57\x73\xb7\x52\xe5\x96\xca\x53\x14\x5b\x0b\xad\x08\x86\xe1\xd5\x13\xba\xa9\x52\xa6\x9c\x98\xaf\x06\x84\xfa\x3a\x28\x16\xd0\x7e\xa5\x08\x6a\xcf\x59\xec\xec\xee\xa7\x60\xba\xa0\x78\x9a\xc1\x4d\x6b\x0d\xab\x11\x1d\xe3\x4e\x3d\x72\x0e\x1a\x21\xb6\xb5\x40\x81\xe1\x2e\x2b\xc7\x00\x37\x80\xc3\xdc\xe0\x00\x24\x60\xf8\x2b\xdd\x80\xf5\x9f\x1d\xe9\x35\x95\x53\xd0\x55\x50\x6e\xdb\x58\xcd\x66\x81\x88\xa0\xca\x61\xa8\x87\xd4\x10\x43\xe0\x5c\x8a\x14\x23\xee\x5d\x15\x09\x83\x33\x6b\xca\x28\xda\x05\xba\x02\x38\xeb\x6e\xf0\x72\x91\x0d\x75\xaa\x5e\xaa\x0a\x9a\x80\x22\x07\xe7\x97\x27\x03\x72\x79\x7e\xea\xe2\x99\xc4\x64\x5d\x1a\x9f\x23\x61\x16\x01\x37\x15\x74\x64\xca\xbf\xe3\x6e\x46\x35\x6e\x67\xf0\x22\x94\x44\x67\x54\xba\x40\x45\x5f\xf9\x9a\x5c\x08\x0d\xeb\x0a\x65\x78\x6a\x80\xe2\x97\xb3\x41\x38\x4c\xb3\xe2\x4c\x7b\x02\xd8\x52\x6d\x09\xe4\xa3\x0f\xa0\x14\x9d\xc2\x65\x4b\x07\xd6\x26\xe5\x1c\x7d\x58\xf5\x19\x45\xaa\x90\xd9\xf4\xb5\xea\x97\x3a\xe2\xad\x29\x11\x93\xdc\xae\xa9\xda\xef\x3b\xc9\xb4\x06\x3c\xdf\x58\x3c\x09\x7d\xe0\xcb\x09\xaa\xfb\x4b\x71\x73\x1f\xfc\x24\xf5\xc3\x86\xbf\xf3\xd4\x46\xb1\x8d\x81\x8c\x25\x83\x09\x99\x30\x0c\x8d\xc3\x60\xb5\x81\x2d\x07\x42\xad\x71\x49\x29\x90\xb8\x1e\xa7\xd6\xf8\x75\x8d\xc8\x8f\x6e\x61\x5a\x96\xdc\x56\x40\x77\x12\x37\xa6\x70\xb1\x09\x99\x62\xb0\x9b\x53\x1c\xfe\xf8\xe6\x3f\xfe\x44\xc6\x0b\x23\xdd\x20\x6a\x6b\xa1\x69\x56\x7d\x64\x06\x7c\x6a\x60\x65\x29\x75\x33\x09\xa9\x82\x00\xd6\x28\xb7\x0b\x7f\xfb\xfb\xdb\x71\x53\xdc\x3a\x4a\x61\x7e\x14\xc0\x6f\x98\x89\xe9\x88\x9c\x50\x6e\x70\xdd\xa8\x11\x45\x8a\x96\xfc\xf6\x75\x43\xfb\x43\x33\x91\xb1\x64\xd1\x9d\xec\x38\xdd\x84\xcc\xc4\x9d\x55\xfb\xd6\x60\x4f\x1d\x0e\x5b\x88\xa2\xcc\xac\x33\xe3\x9b\x2a\x7d\xaf\x54\xb0\x9a\xa3\xb3\xf6\x5c\xa0\xf9\xdd\x4d\xb1\x74\xb4\x5d\x8c\xa3\x7f\xa5\x70\xb1\xdf\xce\x40\x5c\x95\xa7\x41\x9d\xf8\x1b\x9a\x65\x63\x9a\xdc\xde\x88\xf7\x62\xaa\x3e\xf2\x33\x29\x85\x6c\xae\x25\xa3\x86\x71\xce\x4a\x7e\x6b\xeb\x52\x57\x29\xc4\x62\x6a\xa4\xec\xa2\xd4\xbe\xd2\xe8\xba\x0f\xb6\x09\xa9\x9e\x1f\x7b\x8d\xb8\x9e\x05\xee\x59\xad\xf6\xba\x54\x0a\x8b\x91\xe1\xfc\x2a\x44\xb6\xdf\xbf\xf9\xe3\xbf\x5b\xd4\x25\x42\x92\x7f\x7f\x83\x71\xb0\x6a\x60\x0f\x31\xd2\x45\x23\x33\xe4\x34\xcb\x0c\x79\x0d\x91\xd2\x00\x7a\x1d\x12\x7e\x76\x1c\xd4\xdd\xd1\x6d\x6b\xa9\xfa\xe6\xe6\xaf\xc8\x12\x98\x56\x90\x4d\x06\x36\x6b\xa0\xd2\x70\xf7\x51\x46\xd8\x77\xd4\x07\x53\x37\x9e\x81\x2c\x3c\x17\x59\x99\xc3\x29\xcc\x59\x1f\x8d\x27\x1a\xb3\x79\xab\x4f\xc6\x14\x26\x68\x8c\x33\x91\xdc\x92\xd4\x5d\x0c\x22\x9a\x96\x4b\xac\xb6\x87\x42\xdb\xd8\xae\x0e\x31\x5d\x1b\xbf\xbf\x11\xcd\x95\xd3\xa2\x60\x7c\x6a\x93\x93\x24\xbd\x6b\x00\x03\xcf\x24\xe6\x03\x77\xac\xb7\xd0\xd9\xe3\xd0\xd5\xdf\x30\x74\x5f\x64\xe8\x66\xeb\x29\x5a\x47\x33\x75\x77\x57\xd4\xab\x6f\x6f\xa3\x6e\x20\x44\x3d\xa1\x3f\x0d\x05\xfe\xdb\x46\xea\xaf\x88\xcb\x95\xf8\x58\x21\x86\x15\x00\x0c\xfa\x20\x49\x6e\x6f\x7b\xef\xc1\xd0\xdd\x2d\x94\xad\x01\x17\x5e\x39\x18\x72\xaa\x9d\x40\xe8\x35\x08\x4a\x0a\x90\x8a\x29\xc3\x97\x7f\xc0\x03\x75\x92\x51\x96\x07\xd6\xe0\xa7\x01\x82\x3d\xdc\x58\x19\xb3\x3b\xa5\xbc\x14\xa9\x9b\x10\x49\xa1\xad\x0a\xba\x46\xac\x6d\x4a\xb5\x3d\x32\xd4\xa7\x26\x95\x3f\xd4\xd0\x6c\x52\x4a\xf3\x4b\x45\x2a\xed\x5d\xaf\x89\x40\xe2\xf7\xbd\x54\xfa\x58\x2d\xbe\x27\x32\x80\x84\xd1\x6d\x6e\x93\x12\x36\x94\x47\x7b\x50\x02\x91\xde\xe9\x81\x23\x62\xa3\x2b\xcc\x99\x70\x8f\x92\xfd\x77\xfb\x4f\x4a\x24\x2d\x88\xa4\x28\xe8\xb4\x53\x8f\x83\x25\x48\x2d\x4f\x1b\x26\x82\x1b\x35\x08\xaf\x57\x65\x89\xf0\x2e\x48\xeb\x42\x15\x58\x86\xc4\x3a\xca\x3d\x80\x9d\x82\x80\x3d\x68\xc8\x1d\x5d\x10\x2a\x45\xc9\x53\x67\x6a\xac\x6c\xbd\x1f\x96\x5e\x7c\x21\x38\x78\x1f\xca\x72\x1e\x39\x3a\x77\x18\x27\x6f\x47\x6f\xdf\xbc\x16\x4e\x85\x5f\xb8\xc4\xa9\x2e\x2a\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x86\xdc\xd3\xf7\x7e\x70\x26\x96\xba\xd8\x31\xf3\xc5\x5c\xf1\xa7\x3b\xc9\x34\x04\x9d\x8b\x0e\x50\x71\x31\xfa\x61\x90\x35\x7d\xd8\x63\x8d\xef\x7e\xd2\xd4\x55\x39\xfe\x84\x74\xcb\x11\x28\x3c\x6e\xeb\x2c\x5c\xea\x01\x12\x16\x02\x6a\x6f\x8f\x1c\xd8\x3b\xf7\x6d\x92\xe8\xe1\x93\xa2\x96\x03\xda\xd9\x7d\xd1\xa1\x06\x5d\x03\x70\x67\xf7\x05\x45\x1b\x5c\xd1\x23\x04\xff\x0b\x66\x74\x0e\x98\x1c\xcb\x32\x2a\x33\x74\x3f\x5f\xdb\xb5\x93\x71\xa9\x09\xf0\x39\x93\x82\x63\xac\xd7\x9c\x4a\x86\x55\x2b\x24\x4c\x40\x02\x37\xba\xe8\x97\x07\x3f\x1c\x5f\x61\x6c\xcb\xa1\xad\x65\xef\x57\x59\x2a\x5f\x5e\x22\x5c\x49\x30\xdd\xa3\xdb\xe7\xd7\x61\x60\x88\x34\xd7\xaf\xcb\xbc\x27\x2f\x75\x69\x0b\xe6\xdf\x27\x59\xa9\xd8\xfc\xa9\x28\x89\xcb\x5a\x3e\x65\xad\xf6\x79\x29\x83\xba\x06\xd4\x4a\x32\x74\x6d\x83\x7f\xa4\x42\xeb\xbe\xaa\x6a\x5a\x85\xe1\x10\xce\xf4\x44\x72\x36\x9d\x69\x17\x96\xe9\x4b\x9a\xad\x88\x10\x58\xd7\xe1\x69\x8d\x50\x86\xed\x1e\x67\x8c\xaa\x5d\x45\xae\x95\x8c\x43\x37\x0b\x06\x51\x70\x57\x88\x8a\x66\x95\x6d\xc5\xbc\xc8\x1a\x1c\xcf\x2f\x9d\x77\xca\xc3\x8d\xf1\xff\xb1\x41\x2b\x95\x76\x61\x83\x50\xec\x23\xd6\x6a\x38\x09\x6b\x06\xf8\x60\x0d\x24\xfe\x58\x65\x05\xad\x5a\x5c\xf0\xe1\x2c\x28\x48\x52\x88\x74\xc7\x6c\xbc\xb6\x8a\x47\x2b\x95\x63\x3d\x04\xc9\x4c\x64\xa9\xef\xcb\x69\x4d\x32\x63\xd0\x77\x00\x9c\x9c\x5f\x22\xfc\xcc\x27\xa2\xb7\x67\x03\x14\xad\x77\x00\x4b\x8f\x04\x1a\x69\x03\x9e\xbb\x22\x58\x07\xad\xa4\x8b\x48\x5f\x7d\x69\xe7\x33\xff\x97\x0a\x66\xde\x23\x46\xc7\x62\x0e\x08\xd2\x34\x95\xa0\x3a\x94\xee\x78\x02\x3d\xb5\x13\x29\x65\xad\xfa\x2e\x34\xfd\x1b\x15\xd8\xbc\x85\x08\xc5\x77\x3c\xaa\x88\x78\x9f\x99\x82\x9d\x5f\x9e\x74\xa0\x5e\xfb\xdf\x3b\xf7\x86\x99\x6a\x7f\x5f\x11\x56\x24\xb5\x3f\x75\x44\x6a\xaf\x61\x90\xd1\x60\x25\xc6\xdd\x5c\x56\x6d\xc5\xc4\x80\xa8\x75\x24\xd2\x84\xdb\x69\x0c\x59\x71\xd9\xcc\x95\x97\x98\x29\xeb\x26\x6e\x40\x43\xf9\x27\x42\x80\xf8\x40\x04\x4b\xe4\x5d\x58\xc6\xa0\x0a\xf0\x5d\x22\x4c\x68\x41\xf7\xa1\x7d\x01\x15\x5f\x01\xe6\x67\x83\xe5\xe5\xf9\x69\x9f\xe8\x52\xb0\xf4\xd9\xa1\xcb\xee\xfa\x65\x33\x77\xad\x59\xf2\xc1\x4d\xe8\x0f\xfb\xa5\x48\x37\x88\x49\x35\xa3\xc1\xfb\xc3\xee\x82\x5a\x10\x4a\xac\x99\x70\xa9\x6f\x6c\x0b\xa0\xec\x4c\x25\x50\xd4\xba\x2c\xb3\xec\x1a\x12\x09\xbb\x9a\x47\x9b\xfb\x7f\xbe\x34\xd7\x26\x91\x27\x90\xdf\xb1\x8e\x80\xbb\x99\xd7\x05\xde\x2a\xac\x09\xb3\x04\x8b\x32\xc3\x38\x53\xca\x17\x1e\xe0\xb8\x7a\x15\xf8\xa2\x98\xf2\x31\x2b\x36\x44\xaa\xb1\x0b\x0a\xaa\x97\x55\xdd\x42\xa8\x52\xd6\x63\xca\x78\xca\xe6\x2c\x2d\x69\x86\x2f\x42\x29\x34\xec\xe9\x5b\x71\xc8\xdc\x17\x2c\x24\xdf\x08\x49\xe0\x9e\x9a\xdb\x06\x95\x10\x4b\x15\xa2\x43\x2a\x92\x5b\x90\x03\x2b\x8a\x9d\xe2\x1f\x27\x28\xf1\xda\x92\xbc\x7e\x1d\x46\x97\x70\x65\xfa\xda\xb4\x09\xf6\x7d\x80\x2d\x1c\xbe\xb0\x9f\xbb\x60\x7c\x3a\xc4\x5f\xcc\x87\xb8\x37\x0d\x05\x1f\xd2\xa1\x41\xc3\x17\x22\xf8\x61\x0d\xde\x8f\x28\x59\x5d\x79\x7c\xf1\x2a\x82\x51\xe4\x44\x39\x9d\x21\xb0\x64\x4e\x7d\x59\xac\x0c\x34\x56\x3c\x72\x7e\x5d\x5b\x9a\xc2\x3d\x9b\x3a\x31\x2d\xac\x00\xd5\xc4\xb5\x17\x22\xfc\xb5\xb5\x90\x2d\x45\x0a\x07\x64\xcb\xc1\x48\xef\x8c\x81\x62\x0e\x72\xce\xe0\xee\xc8\xb1\xce\xe1\x1d\xd3\xb3\xa1\x85\x88\x3a\x42\xc0\x1e\x7d\x61\xc5\x4b\x9b\xb8\x75\x9c\xa6\xce\x6c\x59\x2a\x98\x94\x99\xeb\x97\x3b\x22\xb4\x60\x3f\x80\x54\x58\x57\xf1\x96\xf1\x74\x40\x4a\x96\x7e\xfd\x19\x03\x5f\x18\x67\x75\x88\x5d\x27\x2a\xf8\xde\x51\x39\x97\x2f\xcc\xfe\x59\xb7\xb4\x75\xc1\x41\x63\xc8\x04\x9f\x06\xd9\xce\x28\x5e\x9c\x73\xa6\x57\x5a\xf3\xd9\xaa\x65\xa8\x22\x0b\x99\x62\x20\x23\x13\xb2\x61\x0f\x36\xf3\x61\x2d\xa7\x20\x1c\xd2\x90\x48\xd6\x98\x0f\xc3\x59\x54\xc5\x8c\x88\x0d\x88\xf0\x89\x91\xbe\x42\xa6\xaf\x11\x65\x4b\x96\xcd\x28\x4f\xf1\xcf\x24\x11\x32\x75\xeb\x65\xba\x8a\xbd\xb4\x41\x41\x36\x12\x05\xd9\x1a\x76\x57\xe7\xcb\x6f\x46\x0d\x54\xe6\x8d\x40\x3d\x2f\xf6\x94\x9c\xfd\xa3\x04\x42\x73\x61\x08\xfb\x72\x21\xe7\x25\x88\xe4\x74\x81\xbc\x15\x97\xfa\xbe\xca\xf4\xb3\xc9\x84\x6a\x40\xae\x80\xa6\x2c\x48\x88\x1e\x90\xf7\xcd\x0c\xe9\x81\x59\xcb\xb5\x4d\xdd\x74\x3f\xd9\xd5\xfb\xe6\xea\x57\xd6\x49\x94\xfb\xb8\xa2\xd5\x8f\x31\xbb\xa2\xe9\x2d\x70\xab\x94\x1b\xd0\xa0\x1f\xac\x94\xb8\x07\xc9\x0c\xd2\x12\xb9\xd4\x78\x41\x26\xcc\x56\x77\x47\x51\x81\x4d\x67\xa0\xb4\x17\x2e\x8f\x30\x56\xa7\x6e\x53\xe3\x17\x80\xe8\x1b\x44\xda\xd6\x66\xac\x9c\x62\xe9\x52\xe1\x3a\xd3\xbb\x64\x12\xab\xb3\xa9\x32\xf7\x67\x79\x19\xd2\x6a\xe4\x7b\xda\x9b\x95\x07\x55\xb3\xd9\x12\x70\xd1\x49\xe7\xec\x70\x64\x42\xd5\x0c\x6b\xca\x2f\x6f\x41\x62\x4d\x32\x49\x29\x0d\xc1\xb0\x65\x66\x29\x36\x91\xc5\x8e\x85\xd8\x6f\x74\x9d\xe1\xa6\x63\xf2\x80\x59\x6c\xfb\xbe\xf7\x4f\xc7\xc4\x8e\xab\x60\x70\x03\xf8\x64\x89\x12\xd8\x9d\x34\x0c\xcb\xd7\x96\xf2\x6d\xc8\x71\x33\x0c\x55\xf8\x7c\x2c\xa9\xbd\x7f\xb4\x95\x5f\xb3\x0b\x07\xa4\x72\xda\xdd\xf2\xb1\x7f\x2c\xa7\xa5\x3d\xe8\x8e\x0a\xd7\x45\x69\x5d\x2b\x4f\x94\xda\xac\x8c\x69\xd4\x99\x93\x0f\xa7\x61\x0a\x52\x98\x5b\xe1\x13\xb8\x46\xe4\x87\xae\x46\xea\x65\x2b\xb5\xa1\xe6\xb5\xe9\x3b\xa9\x4e\x96\xa1\x18\xd9\xdc\xeb\x17\xd5\xdb\xbc\x1c\xca\x78\x51\x6a\xc7\x06\x6b\x8d\x93\x27\x33\xca\xa7\xa8\x64\x8a\xd2\xcc\xf7\xe5\x97\xb8\x22\x09\x69\x99\xb8\x6a\xfa\x1e\x65\xbf\xf4\x26\x5b\x57\xcf\x0b\x69\x95\x4a\x68\xe1\xd7\x1c\x7e\x96\x5a\x70\x4d\xef\xdf\x11\x36\x82\x11\xd9\xfb\x32\xb8\xb4\x67\xdf\x5e\x48\x61\x5e\xe1\x52\x1f\x70\x55\x19\xd3\x18\xbe\xbd\x17\xde\x3d\x22\x67\xe6\x1d\xe8\xc6\xaa\x00\x18\x44\xe7\x8f\x6b\xf0\x0d\x88\x84\x29\x95\x69\xe6\xcc\x2d\x77\x41\x4a\x47\x05\x30\xb8\x67\x4a\x2b\xcb\x83\x74\x07\xca\xa4\xa9\xba\x35\x74\xc8\x9c\xac\x61\x4a\x35\x1d\x06\x47\xfa\xc8\xea\x6d\x43\x57\xee\x73\x48\x1d\x6a\xd5\x24\xeb\xe8\x0b\x97\x19\x39\xa4\xd5\x5d\xcc\x48\xe4\x58\x78\xb3\xbd\x9c\xf3\xd2\x6c\x6c\x1d\xaa\xbe\x36\x4f\xef\x59\x5d\x41\x1a\x61\x80\x51\xfc\xb5\xbc\x54\x11\x51\x57\xd8\x74\xdd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\xbd\xde\xb4\xce\xe5\xbb\x5c\x70\x32\x48\x0d\x7a\x45\x81\x75\x67\x7c\xfe\x03\x95\x75\x1b\x7b\xe7\xaf\x5a\xe3\x01\xf7\x7d\xee\x91\xc4\x9d\xbc\xf8\xc8\xba\x27\x8c\x8b\xeb\x31\xde\x28\x34\xa9\xac\xdb\xb5\xb0\xf7\xd7\xc9\x2f\xe7\xa7\x67\x17\x37\xe7\xdf\x9c\x9f\x5d\x3d\x69\xa0\x48\xc7\x82\x8f\x4d\xa6\xdc\x92\x4b\x16\x12\xe6\x4c\x94\x2a\x5b\x54\x3d\xb6\xd6\x13\x81\xd5\x58\x43\x9e\xa2\xad\x43\x81\xc4\xa8\xeb\xb5\x8f\x45\x66\xdb\x2f\xb3\x6d\xc6\xcd\x74\x28\xcf\xd3\x17\xfa\x7e\x23\x45\xde\x13\x0a\x5f\x5b\x2b\x8c\x77\x86\xaf\xc3\xa7\x7d\x57\xc9\xa3\xc1\x7a\x9c\xf0\x58\x97\x0d\x31\xc2\x68\x5e\xe8\x0e\xc5\xf0\x7b\x29\xf1\xdb\x4f\x35\x5c\x1b\xab\xf3\x81\x16\xdf\xc1\xe2\x0a\x3a\x56\x01\x6a\xc2\x1b\x32\x48\x0c\xa3\x23\xb7\xb0\xb0\x81\x99\x27\xfe\x65\x5d\xaa\x15\xfd\x7f\xec\xfd\x0f\x77\xe3\x36\x92\x37\x0a\x7f\x15\x1c\xcf\x9e\xd7\x76\x22\xc9\xdd\x49\x66\x26\xdb\x4f\xde\xe4\x38\xb6\x3b\xe3\x27\xdd\x6e\xaf\xed\x4e\xee\xdc\x74\x76\x06\x22\x21\x09\x63\x12\x60\x00\x50\x6e\xcd\x66\xbf\xfb\x3d\xa8\x02\x40\x50\x92\x6d\x99\xa4\x5b\xb2\x23\xce\x39\xd3\xb1\x44\x81\x60\xa1\x50\xa8\xbf\xbf\xda\x48\x84\xe4\x6b\xd6\x06\xbd\xba\x4b\x68\xe3\x6b\xd6\x22\xe9\xd4\x5f\x0b\x20\xbf\x76\x09\x41\x4f\xb3\x6b\xda\x6e\xf5\x48\xb7\xb0\xc6\x8f\x00\xe5\xfc\x7c\x23\x28\xf5\xab\xc3\x55\xf0\x81\xe0\x8e\x57\x02\x63\xf2\xb3\xda\xd9\x15\x84\x08\xc1\xaa\x4e\xe0\x4d\x1f\x74\x70\x4a\x46\x47\xa4\x69\xdb\x84\x8b\xe0\x12\x76\x2b\x57\x77\x2b\xc1\x8a\x39\xfe\x01\x67\x2e\x7d\xe5\xa1\x0c\x74\xe8\x9c\x35\xb0\x1c\xd6\xab\xff\x09\x21\xd1\x1e\xf9\x67\xf8\x10\x7a\x4d\xeb\x5f\x76\x77\xbf\xf9\xf1\xe4\xef\xdf\xee\xee\xfe\xfa\xcf\xf8\x5b\x38\x0a\x31\x50\x5e\xbf\x05\x70\x9d\x84\x4c\xd9\x19\x3c\x03\xfe\x74\xea\xda\x21\x06\x4f\xdc\x17\x50\x91\x3d\xc0\xac\xa5\xf0\x67\x21\xd3\xf9\xbf\x74\x2b\x40\xc0\x8d\x3c\x18\x60\x89\x5a\x54\x16\xe1\xd5\xdd\xf1\x50\xc9\x92\x8e\xb7\xaa\x1b\xd5\x73\x23\x00\x4b\x23\x24\xd9\x6b\x4f\x02\xe8\xee\xe9\xa1\x1f\x04\xd4\xcb\x5b\xcd\xb4\x8e\x0e\xb9\x33\x7d\xd9\xaa\x8f\x31\x5e\x1d\x8a\xb6\xb0\x82\x1d\x13\x0c\x28\xe2\x1b\x86\xc1\x46\x0e\x07\x6c\x48\x98\x09\xdd\xe7\x0e\xcf\x4f\xc9\x14\x29\xbc\x31\xc4\xf1\x81\xcd\xd7\x8f\x2a\xe3\x42\xf8\x74\xbe\x2e\xf7\x15\x26\xe0\xf8\xef\x1d\x46\x82\x0e\x08\x76\xcc\x1a\x36\x7b\xf8\xe1\x20\x29\xca\x9e\xbb\x61\x90\xb3\x5c\xaa\x59\xf8\x33\x80\xcd\xf4\xb5\x91\x8a\x8e\xa1\xa6\x06\x7f\x8e\x3f\x0b\x7f\xe1\x0f\x6b\x0f\x58\xfc\x35\x9a\xc2\x55\x14\x35\x00\xdc\x3e\x3f\xd9\xe6\x49\xbf\x21\xa2\x2d\x69\x0b\xa3\x54\xbf\xea\x0c\x19\x3c\x71\xa8\x70\x06\x2a\x82\x3d\xe9\x6a\x86\x7b\x55\x3e\x1c\x78\x03\xc4\xd4\x5a\x96\x8d\x01\xf0\xaa\xab\x43\x69\x96\xf2\x29\xd7\xb2\x45\xe5\x50\x18\xe8\xf6\xdc\x49\x07\x5b\x82\xf9\x5b\xc1\x6d\xf6\xb1\x00\xcc\xaf\xb0\x5f\xe7\xc4\xfe\xcb\x36\x4d\xce\xf1\x2a\xa8\x31\x4c\x89\x57\xe4\xbf\xf7\x3e\x7c\xfe\x7b\x7f\xff\xbb\xbd\xbd\x5f\x5e\xf4\xff\xf3\xd7\xcf\xf7\x3e\x0c\xe0\x3f\x3e\xdb\xff\x6e\xff\x77\xff\xc7\xe7\xfb\xfb\x7b\x7b\xbf\xfc\xf8\xf6\x87\xab\xf3\x93\x5f\xf9\xfe\xef\xbf\x88\x32\xbf\xc6\xbf\x7e\xdf\xfb\x85\x9d\xfc\xba\xe2\x20\xfb\xfb\xdf\xfd\x47\xeb\xa9\x77\x00\xc1\x8b\x57\x97\x40\xbc\xf5\x11\x3b\x61\xbf\x47\x6c\x65\x81\x97\x67\xaf\xae\xf7\xff\x85\x97\x9a\x51\x3e\x8f\x3f\xae\x37\x66\x83\x63\x42\xe8\xa7\xf0\xe4\xe0\x93\xea\xb5\x36\xc1\xb4\x78\x6e\xe7\xdc\x1f\xc1\xb9\xe3\xd5\x76\x5c\xd7\x4a\x13\x1d\x29\x99\xfb\x8a\x7e\x08\x6f\x60\xed\x99\xbb\xef\x9a\xb5\x6a\x09\x8a\xd7\xd6\x19\xb4\x75\x06\xdd\x72\xdd\xeb\x0c\xc2\x72\x84\xcd\xf5\x04\x31\x31\x6d\x1a\xc2\x58\x1a\x41\xf7\xb6\x4e\x0c\x7f\xb7\x5a\x40\x6d\xe0\xb7\xba\x0e\x91\xb8\x2a\x93\x06\x0f\xb4\x7c\x79\x0c\x13\x1a\xf8\x73\x81\x1b\x1f\x06\x08\xa0\x9f\xcc\xf5\xee\x70\xf5\x97\x53\x3b\x85\x80\xf4\x5e\xc3\xee\x84\xac\x62\x2e\xc6\x0e\xc9\x02\x8f\x12\x17\x7d\xe2\xa2\x42\xc3\x0d\xca\x61\x05\xa1\x4e\xb5\x96\x09\x34\x3e\x42\x9c\xbc\x80\xca\xe7\xa6\x0d\xb3\x31\xf4\x9a\xc5\xad\xd8\x11\x5e\xbd\x7a\xd7\xe1\x0c\x50\x5f\xc5\xd4\x43\xcc\xa7\x25\x26\x83\xa0\xf8\x5b\x3e\xc6\xf3\x4a\x40\xb0\x8c\xe8\x82\x60\x51\x1e\x02\x48\xfd\x60\x61\x53\x48\xc5\x90\xa3\xca\xcb\xda\xac\x99\x65\xeb\x53\xbc\xfd\x99\x19\x22\x5b\xad\x94\xa1\x85\xc3\xb2\x72\x3f\xd7\x0f\xc9\xe7\x10\x0c\x6c\x7f\x7c\xfe\xe1\x8e\xce\x8e\x8e\xcd\x6e\x8e\xcc\x07\xc4\x4e\xba\x3c\x26\xbb\x08\x96\x14\x8a\x8d\xf8\xc7\x8e\xf6\xe9\x61\x54\x99\xc8\x53\x26\x0c\x1f\x71\xec\xd7\x5b\x28\x56\x30\x81\x3d\xf3\x69\x32\x01\xd9\xef\x4e\xca\x2a\x38\xbd\x89\xc9\x3c\xa8\x70\x77\x2b\xca\x2e\x97\x29\xfb\x5b\x39\x46\xb6\x72\xac\xf1\xf5\x89\xe4\x98\xe3\xdc\xcd\x11\x62\x90\x79\xde\x3e\xf5\xfd\x38\xca\x63\x07\x2e\x6e\x5f\x39\x3c\x87\x06\x17\xe4\xa2\x91\x98\xb9\x86\xe5\x6b\x8a\x64\x6c\xca\x32\xa7\x34\x91\x9c\x0a\x3a\xc6\x36\x7c\x46\x06\xd0\x1f\xa9\x42\x8b\xa3\x79\x44\x1f\x50\xe2\x7d\x65\x17\x7c\xa9\x64\x96\x31\xa5\x49\xc6\xaf\x19\x39\x66\x45\x26\x67\xb9\x4b\x7c\x4d\xc9\xa5\xa1\xc6\xb2\xf4\x25\x33\xcd\x62\xbe\xed\xd0\x40\x7c\x31\x7b\x47\xd0\xe7\x58\x1d\x0f\xb5\xe5\xa4\x70\x85\x93\xef\x04\x48\x8c\x43\xe8\xb6\xd2\x23\x67\x6c\xca\x54\x8f\x9c\x8e\xce\xa4\x39\x47\xd5\xbb\x9e\x6d\x87\x37\x12\x3e\x22\xaf\xac\x51\xa7\x0d\x31\xd8\xf1\x22\xaa\x73\x97\xaa\x36\x40\x85\xf7\xd6\x45\x59\xde\x62\xc9\x39\x8c\x14\x0a\xce\x1b\x85\x31\x5a\x2d\x53\x68\x29\xd4\x7a\x81\x0e\xb1\x8c\xb4\x42\xf2\x8d\xf8\x1b\xe1\x19\x3c\x82\x19\x98\x80\x5c\x10\xc5\x74\x21\x85\x66\x75\x78\xc6\xaa\x05\x25\x98\xba\xba\x53\x0b\xb1\xf1\xc9\xd9\xf6\xcc\x2c\xa4\x36\x50\x39\xdb\x4d\xa3\xaa\x73\x3f\x1c\x14\x22\xd3\x2c\x63\x69\xad\x53\x19\x76\xd8\xa1\x75\xf7\x40\x02\xcd\x19\x7c\xc3\x17\xe6\xea\x93\x6b\xa5\xcd\xb5\xfb\x43\xd7\x3b\xdf\x57\xc6\xf7\x4f\xbe\xad\xa0\xb9\xda\x98\x70\x88\x44\x0c\xb0\x80\xf7\x0c\x28\xe0\x3a\x6a\x4e\x33\x91\xf2\x9a\x24\x32\x2f\x32\xd8\x3a\x2d\x76\x56\xd5\x1b\x2b\xb0\x52\x1f\xfa\xa1\x1e\x44\x6d\xb3\xe0\x83\x35\xf6\x37\xed\x42\x07\x63\x1f\x59\xd2\x59\x5f\x4d\x2b\x4b\xed\x2a\x43\xbc\x5f\x8a\xa0\x8a\x8d\xa4\x3d\xc0\xa0\x38\x3b\xe0\x0f\x46\x60\x3b\x27\x1f\x59\x12\xf5\xa6\x05\x04\xac\xc4\xe3\x49\xd8\x8d\xde\xbe\xe7\x78\xeb\x30\x45\x57\xa1\x81\x16\xc5\x77\xf1\x35\x07\x1a\x08\x63\x7a\x8c\x74\xf7\x08\x68\x37\x01\xf6\x13\x16\xe4\xc5\xa0\x1b\x81\x87\x71\xc7\x2e\x20\x0d\x86\xe4\x6b\x3f\x16\x74\xf5\x91\xd2\x90\xbd\xdd\x83\xdd\xfd\x05\x9f\xe5\x1c\xd0\xf6\x55\xf4\x4b\x0e\xc8\x92\x05\xc0\x34\xb2\x64\x37\xed\x11\x6e\x7c\x76\x36\xf6\x09\x82\x59\xb9\x2a\xc1\x1e\xd1\x92\x18\x45\x53\xee\xb4\x1f\xf8\xd4\xde\x64\x54\xe9\x0e\x87\xbd\xdd\xdf\x77\x5d\x9b\xa2\x1b\x29\x76\x0d\x4c\x7f\x40\xae\x10\xa5\x26\x0c\x34\x93\x25\x34\xdf\x44\x12\x14\x19\x4f\xb8\xc9\x66\x20\xe8\x88\x2c\xb1\x53\x97\x3d\x66\x5c\x75\xe2\xc9\x47\x6e\x7c\x4b\x12\x39\x22\x2f\xb0\x51\x18\xa3\xce\x6b\x9a\xf1\x29\x3b\x98\x30\x9a\x99\x09\x26\x96\x08\x29\xfa\xd8\xeb\xd1\x4a\x20\xf7\x4d\xdb\x18\x4b\x3b\x17\x64\x7c\xb5\x70\x47\x2e\x4e\xa8\xa5\xb5\x61\x65\xef\x0f\xcd\xbb\x59\x93\x05\xb0\xb0\xab\xab\xf3\x1f\x6a\xed\xac\x41\xf8\x1b\x53\xf8\x74\x9f\xa8\xe9\xfb\x06\xc8\x8e\x6e\x02\x9c\xad\x7a\x51\x93\x0e\x45\x58\xdb\x9e\xd4\x64\x39\xf8\xdb\xea\xcd\xa8\xc9\xdf\x65\x09\xd0\x21\x74\x98\xcd\x02\x6e\x83\x66\x86\xec\xd8\xa1\x76\xac\x78\xb2\xdc\xf0\x37\x46\x53\x84\xd5\xd0\x86\xd1\x46\x1a\x5f\x7c\x75\x16\x78\x8b\xe6\xd6\xed\x39\x50\x6a\x23\x73\x32\x71\xaf\x5d\x2f\xd7\x74\x3b\x63\x00\xbb\xc7\xd7\x42\x29\x56\xa0\x84\x73\xbf\x79\x76\xf2\x6b\x41\x6e\x20\xdd\x6b\x3d\x13\x92\x98\x6c\x71\x67\x1d\x2e\x90\x58\x88\x52\xd3\x91\x2c\xed\x20\x61\x82\x74\x98\x34\x41\xda\x15\x7f\xce\x0f\x04\x81\xc0\xf6\xf9\x61\x9d\xe5\x61\x90\xce\x72\x0d\xc8\x32\xc7\xac\xe3\x19\x74\xda\x74\x44\xc4\x4e\x23\xfc\xa4\x7d\x79\x69\x7c\xdd\x4d\x80\x6e\x16\x9f\x74\x49\x81\xa2\x83\x74\xf0\xc5\x64\x70\x04\x9d\x82\x72\x4d\x14\xae\x20\x26\x34\x53\xd3\xa6\x05\xe0\xd5\xd5\xdd\xab\xcb\xe6\x8e\x02\x7f\x2d\xa9\xad\x56\x44\x84\x06\xd7\x1e\x54\x75\x91\x20\x51\x36\x83\xeb\x87\xed\x5d\xc0\xfe\x38\xa2\x62\xcc\xc8\x4b\xfb\xcb\xbf\xfc\xf9\xcf\x5f\xfe\x79\x80\xc3\x87\xcc\x06\x41\x4e\x0f\xcf\x0e\xff\x71\xf9\xd3\x11\x14\xd4\xb6\xa5\x6a\x47\x69\x9b\x5d\x27\x6d\x76\x9a\xb2\xf9\xa8\x09\x9b\x50\x26\xd2\x5a\x8a\xd4\xe3\x05\x30\x64\x8c\x2e\xea\x74\xbf\x08\x95\xcf\xea\x9a\x75\xff\xab\xdd\x6a\x1b\xb1\xc7\x4c\x52\x5c\xca\xe4\xba\x43\xbb\x66\xf7\xea\xe8\x1c\x87\x8c\x4c\x1b\x2a\xbc\x33\x84\x8b\xa9\xcc\xa6\x80\xbe\x4a\xae\x8e\xce\x61\xe7\x0d\xe0\xbf\xc0\x11\x05\x16\xf5\x8c\x99\xaa\x90\xc1\x85\xa7\x02\x86\x2a\x14\x69\xd0\x8c\x6b\xc3\x13\xf8\x5d\xe5\x26\xb5\x23\xb4\x89\x4b\x6d\x2d\xa5\x65\x57\xe7\x96\x52\xd4\x24\xf8\xa1\x46\x53\xdb\xc4\xc3\x0d\x3e\x97\xdc\x79\xa4\x6a\x5d\xb4\xb7\xe7\x52\x07\xe3\x6d\xee\xb9\x54\x28\x76\x69\x64\xa3\x6e\x01\x64\x31\x12\x82\x83\xdd\x12\x07\x19\xb2\x91\x54\x6c\x3e\x10\x12\x05\x36\xd2\x12\x36\x21\x15\x50\xfd\xe7\x5d\x50\xb2\x16\xbc\xc0\x94\x4b\xdf\x21\x3b\x73\x98\xa8\x07\x3a\x06\x42\xf5\xed\x8e\x7b\xf6\xed\x58\x0e\xb3\xeb\x55\x65\x0c\xae\xd9\x32\x7c\xc8\x4c\x82\x6e\x56\x1f\x7f\x71\x1e\x55\x3f\xfd\xf9\x50\x49\xa2\xa8\x9e\x60\x23\x62\xf6\x91\x9b\x00\xb9\x4a\xb5\x14\xe8\xec\x8d\x7a\x22\x73\x1d\x61\x72\x47\x41\x1e\xfc\xd1\xb9\x4c\xe7\x7b\x8e\x8f\x15\x4d\x18\x29\x98\xe2\x32\x25\x50\x4f\x9c\xca\x1b\x41\x86\x6c\xcc\x85\xf6\xf4\x03\x70\x76\x47\x68\x7b\xdc\x30\xf0\x0d\x7b\xb4\xb8\x01\xb9\xa8\x81\xa0\xb8\xf2\xa4\x44\x56\x3b\xda\xcd\x62\x3e\xc8\x04\x19\xa1\x40\x5e\xec\x06\x14\x16\x26\x6e\x90\x74\xcf\xa4\x3b\x88\x36\x61\x0f\x2f\xff\xdd\xad\xd4\xe1\xda\x52\x3d\x99\xb4\x0b\xfc\x6e\xc3\x53\x2b\x5e\xdb\xf0\xd4\xc3\xae\x6d\x78\x6a\x1b\x9e\xba\xfd\xda\x38\xf7\xee\x36\x3c\xb5\x35\xba\xe6\xaf\x6d\x78\x6a\x1b\x9e\xba\xe5\xda\x38\xf9\xb5\x0d\x4f\xad\x70\x6d\xc3\x53\x2b\x5e\xdb\xf0\xd4\x36\x3c\xb5\x0d\x4f\x6d\xc3\x53\x7f\x20\x37\xa0\xbf\xb6\xe1\xa9\x85\x41\xb6\xe1\xa9\x88\x18\x5b\x4b\x69\xc9\xb5\x0d\x4f\x2d\xb9\xb6\xe1\xa9\xe8\xda\x9e\x4b\x0d\xce\x25\x1f\xdc\x39\xb7\x76\x59\xfb\x9a\xb5\x73\x08\x1c\xf0\xc4\xc5\x88\xe4\xa8\x56\xe7\x84\x8f\x1a\x54\x0d\x28\x22\xcc\x0f\x5f\x6a\xe3\xa2\x41\x55\x8c\x69\x69\x3d\x54\xcb\xf6\x70\x85\x4c\xab\x60\x44\x14\x85\x40\xeb\xb4\x79\x4d\xda\xda\xaa\xad\xda\x84\x1e\x36\x3a\xec\xb0\x21\xa1\x9d\x0e\x42\x0d\xdb\x30\xc3\xb3\x0b\x33\x74\xe3\xa2\xeb\xc0\x3d\xd7\xfa\x84\x71\xc1\xfc\xab\x89\x62\x7a\x22\xb3\xc6\x8c\x5e\x63\xf2\xb7\x5c\xf0\xbc\xcc\xa1\x6f\xac\xe5\x67\x3e\x0d\x59\x03\xa1\x39\xb6\x13\xf4\xe8\x29\x8c\x1a\xcc\xfa\xc6\xb2\x50\xd6\x39\xa1\xa0\xaa\xeb\x32\x49\x18\x4b\xa3\x96\xf7\xa0\x98\x7d\x39\x08\x4f\x0a\xed\x34\x5e\xb6\x93\x37\xed\xce\x7e\x84\x28\x85\x51\xbe\xfc\xa2\xd1\x18\x2d\xa3\x3c\x9f\x3e\xc2\xd3\x81\x98\x6e\x6f\xaf\xb4\xb2\x55\xba\x38\x25\xda\xda\x28\x4f\x2d\x92\xd3\x59\x44\xb3\x83\x08\xce\x06\x45\x6f\x36\xe6\x58\xd8\x94\x88\xcd\x06\xa2\xaf\x76\x10\x60\xe8\x22\x42\xd3\x5d\x74\xe6\x11\x40\x4a\x1f\x27\x2a\xd3\xa1\x35\xdc\x51\x34\xe6\x53\x44\x62\x3a\x79\xeb\xb6\x11\x98\x4f\x17\x7d\xe9\xe6\x75\x5b\x7a\xb7\x9e\x45\xc4\xa5\x03\xaf\x56\x97\x1e\xad\xce\xbc\x59\x8f\x16\x61\x69\x1f\x5d\xd9\x80\xc8\x4a\x6b\x22\x73\xc1\x0d\xa7\xd9\x31\xcb\xe8\xec\x92\x25\x52\xa4\x8d\x4f\x98\x39\xd4\xba\xb0\x7f\x34\x0e\xeb\x6c\xb4\x7a\xfe\xf1\x84\x3a\x70\x5e\x96\xfa\x94\x6a\xef\xfe\x73\x0a\x05\x34\x34\xc1\x59\x6e\xa4\x43\x8f\x6c\x8c\x31\x88\xc9\xd8\x5d\x2e\xe2\xdf\xe4\x0d\x91\x23\xc3\x04\xd9\xe3\xc2\xaf\xe3\x7e\x64\x06\x56\x96\x79\x60\x6b\xfb\xed\xcb\x17\xfe\xe6\xe7\x67\x72\x83\x73\x41\xeb\xc7\xf7\x80\xb8\x07\xdd\xef\x02\x71\x37\x8e\xca\xac\xee\x06\x41\xd7\x48\x5d\xde\xbc\xac\xe0\x45\x5f\xc2\xb8\x61\xb7\x51\x91\x12\x57\xb8\xf1\xfc\x16\xad\x75\xdc\xf8\x39\xc4\x8c\xb7\xbe\x17\xd2\xb5\xef\x65\x4d\xb1\xe1\x0d\xd4\x9a\x9f\x68\x3c\x78\xab\x35\x3f\xe0\x8a\xea\xbf\x7e\x50\x34\x61\xe7\x9d\x2b\x1c\x7e\x3b\x91\xb4\x54\xae\x6c\x2f\xe8\x1d\x61\xf3\x08\xc6\x52\xdc\x4d\xa1\x28\x0e\xaa\xd1\x46\x65\x96\xcd\x48\x59\x48\x51\xaf\x3c\xc4\xa0\xd5\x7c\xc1\x9a\x1d\x6d\xd9\x53\x2a\x2d\xb5\x50\xd2\x1d\xc0\xaa\x14\xc2\xca\xf3\xaa\xe1\x10\x68\xa5\x1a\x65\x75\x5c\x16\xa7\xf9\xd8\x4e\xdf\x1e\xa6\x50\x31\xc7\x73\x56\xb5\xa4\xa8\x06\xb4\xbf\x1e\x49\x95\xf0\x61\x36\x23\x13\x9a\x85\xee\x12\x94\x5c\xf3\x2c\x73\xc3\x0c\xc8\x25\x33\xc4\x4c\xb8\x6b\x0c\x4e\x32\x29\xc6\x30\x39\x2a\x7c\x57\x33\x96\xd8\xdf\x26\x19\xa3\xa2\x2c\xf0\x79\xf6\x58\x9f\xc9\x52\xf9\xe7\x39\x58\xcb\x30\x0a\xd7\x44\xf0\xac\x17\xf5\x4e\xba\x73\x61\xab\x06\xf5\x9a\xf9\x9a\xc2\x1b\xae\x59\x2f\x1e\xd3\x23\xf3\xea\xa8\x73\x46\xa1\xe4\x94\xa7\xd8\xfd\xc2\x93\x0d\xba\xb4\x62\x77\x8c\xb0\x9f\x85\x14\x7d\xc1\xc6\x14\xb4\x1e\xb7\x8b\x70\xcd\x70\x1c\x0c\xc5\x89\x14\xfa\x65\x58\x73\x41\x16\xb5\x52\xd6\x29\xc7\x4e\x9f\x11\xe5\xc8\x9e\x90\x44\xc2\xf1\x5a\x0a\x6e\xb0\x7b\xf4\xa4\x34\x24\x95\x37\x62\x7f\x80\xa8\xc4\x5c\x13\x4a\x86\xcc\xf8\x4e\xb6\xbe\xb3\x22\x57\x4c\x13\x26\xe8\x30\xb3\x6b\x0e\x09\x0f\x57\x4b\x09\x44\x46\x8c\x9a\x52\x31\x32\xa6\x86\x2d\x55\x9a\xf0\x7d\xef\x26\x2f\xd7\xa1\xcb\x7b\x29\x34\x6b\xdc\xdf\xba\x63\x4d\xeb\x2f\x5f\x35\x93\x11\x3c\x67\xb2\x34\x9f\xc4\x94\xbc\x99\xf0\x64\x12\x6b\xc6\x3c\x67\x9a\xc8\x72\xce\xc6\x7e\xe9\x7e\xb6\x7c\x85\xb6\xf6\xe4\xb2\xab\xa9\x97\x78\x89\x2b\x6d\xbe\xe4\xb8\x6a\x2b\x4b\xed\x06\x3c\x3e\xbb\xfc\xc7\x9b\xc3\xef\x4f\xde\x0c\xc8\x09\x4d\x26\x71\x3d\xba\x20\x14\x84\x06\x08\x8a\x09\x9d\x32\x42\x49\x29\xf8\x6f\x25\xa2\x93\x93\xbd\xf0\xdb\xfd\x4e\xb1\x90\x1b\x9e\xbe\xd0\xfa\xba\xb3\x5e\x4b\xd8\x48\x1b\x13\x1c\xa4\x66\xd0\x1d\x61\x5e\x7d\x3a\xb1\x5f\xa1\xa1\x01\xaa\xd6\x84\x59\x61\xc4\xa7\x4e\x0c\x3b\x70\x69\x9a\x86\x94\x0b\xcb\xe7\x96\x2d\xec\x51\x45\x87\x90\x2a\x31\x61\x44\x30\x63\xd9\x3a\x38\xac\xa4\xd0\x35\x60\x80\x52\x33\xdd\x23\xc3\x12\x92\x3b\x0a\xc5\x73\xaa\x78\x36\x8b\x07\xb3\x67\xd5\x99\xf4\xe6\xd0\x6c\x7e\x4a\xc7\xef\x4e\x2e\xc9\xd9\xbb\x2b\x52\x28\x84\x0c\x80\xec\x0c\xf8\x1e\x5e\x6b\xc8\xec\x2f\x5c\x8f\xce\x01\x39\x14\x33\xfc\x12\x37\x38\xd7\xc4\xda\x42\x0c\x8e\x60\xa7\x43\x7a\x50\xf8\x9d\x17\x03\xf8\xdf\x8e\x7d\x4b\x65\x95\xcc\x90\x74\x92\x2c\x24\x8f\xa1\x1a\xca\x87\x59\x44\x4d\xf7\xee\xcf\xaa\xdb\x52\x48\x9b\x3b\xb7\x44\x8c\xba\x2d\xd1\xb0\xd4\x40\x5e\xec\xbe\xc5\xc5\x38\x8b\xb9\xaa\x99\xd8\x6f\x6b\x5b\xb6\xb5\x2c\xfb\xd5\x1b\x9c\x37\x35\x30\x3b\xe9\xfa\x54\xcd\xa1\xa3\x5e\x29\xd5\xe9\xe7\xcd\x29\x27\x11\x64\xdc\xfe\xf2\xf4\xdc\xef\x00\xa7\xdd\xe4\x73\x3d\x13\xe1\xc7\x18\xd4\xe8\x91\x17\xe4\x1b\xf2\x91\x7c\x03\xe6\xd5\x5f\xda\x76\x96\x69\x6b\xf8\xb4\x77\xef\xa0\x55\x7f\x7a\xde\x11\xc5\x7f\xb6\xd2\xc9\x8e\x68\xa9\x6a\x24\x19\x72\xa7\xce\xb3\x8f\x86\x29\x2b\x47\xdd\x4a\xac\xb5\x27\x8f\x9d\xe0\x27\x64\x33\x8c\x5d\x9c\x8e\xe2\x96\x10\xe6\x81\x8c\x66\x7f\xfe\x37\xa9\xcd\x99\x93\x42\xf5\x06\x13\xd5\x68\x39\x35\xc9\xa4\x2e\xc6\xac\xa2\xa6\x4d\xb5\xc1\x34\x49\x25\x78\xd2\x30\x0f\x70\xc2\x5b\x64\x62\x6c\x0e\x1b\xb7\x0b\xce\xd7\xd6\xf3\xae\x95\x9a\x73\xa0\x80\xe5\xe3\x14\xab\x08\x5e\xa6\x90\xa9\xd3\xc9\xec\xb4\xd2\xe8\xcc\xb8\x43\x29\x73\xbe\x9a\xe0\xb2\x06\x5e\xb2\xfb\x29\xa1\x02\x13\xb8\x47\x4c\x29\x4c\xdd\x1c\xce\x20\x82\xcc\x13\xd6\x7a\xf1\x5a\xed\xa4\x42\x49\x23\x13\xd9\xa2\x6d\x50\x3d\x60\xee\x86\x03\x22\xa0\xf3\xd7\xfb\xdc\xdf\x1f\x9f\xf7\xc8\xd5\xd1\x39\x74\x53\xb9\x3c\xba\x3a\xaf\x5b\x2a\x3b\x57\x47\xe7\x3b\x6b\x25\x05\xf1\x9a\xd5\x2b\x3b\xcd\x06\x83\xd4\x1c\x4f\x56\x6d\xeb\xe7\xb4\xe8\x5f\xb3\x59\xc3\x33\xb5\x8b\x73\xbd\x1f\x56\xb8\x93\x17\x42\x32\xe7\xb4\x78\xf0\x68\x8a\xd1\x94\x7f\xa2\x2a\x0a\xb7\xb3\xaa\x67\x2e\x2f\xa7\xc8\xe5\x94\xa5\xa8\x0e\xfb\x5f\x30\x91\x16\x92\x5b\x7d\x71\x5b\x63\xf1\xf0\x5f\x6f\x6b\x2c\xee\xba\xb6\x35\x16\xdb\x1a\x8b\x6d\x8d\xc5\xdd\xd7\xb6\xc6\xc2\x5d\xeb\x77\x83\x92\x6d\x8d\x45\xc3\xeb\x79\xc5\xf9\xb7\x35\x16\x0f\xba\xb6\x35\x16\x8b\xd7\xb6\xc6\xe2\x96\x6b\x5b\x63\x71\xcb\xb5\xad\xb1\xd8\xd6\x58\x6c\x6b\x2c\xb6\xd9\x62\xf7\x8e\xb5\x99\xd9\x62\x64\x5b\x63\xe1\xae\x6d\x8d\xc5\xb3\xc8\x89\x21\xdb\x1a\x8b\x95\xae\x6d\x8d\xc5\xb6\xc6\xa2\xc9\xb5\xad\xb1\x80\x6b\xeb\x7b\xd9\xd6\x58\xf8\x6b\x5b\x63\x81\xd7\x1f\x47\x6b\xde\xd6\x58\x6c\x6b\x2c\xb6\x35\x16\xdb\x1a\x8b\x3b\x67\xb1\xad\xb1\x78\x0e\xf6\xa4\xef\x81\xd7\xbe\x66\x60\xf7\x48\xe6\x45\x69\x18\xb9\xf0\x43\x06\x2d\x12\x05\x03\xd7\xb1\x46\xd0\x3e\x85\x27\x91\x62\xc4\xc7\x4e\xb2\x1f\x60\x83\xb9\x7e\x78\x9f\x7e\xd4\xd4\xed\x09\xe6\xef\x64\x3c\xe7\xcd\x0a\x39\xc8\xc2\xc2\xbc\x81\xb1\xa2\x20\x8f\xdd\x49\x39\xfd\x08\x5b\x84\xe6\xb2\xc4\xa6\x7c\x89\x5b\xbf\x40\x42\x0c\x85\x6d\xdc\xca\x90\x6e\x4c\x9c\xaa\x22\xe5\xbc\x03\x6b\xa3\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\x8d\xa7\xdc\x5a\x25\xee\x4e\x21\xee\x48\x1d\x7e\x14\x65\xd8\x45\x87\x3b\xda\x8b\x17\x6e\xb4\xf9\xdd\xe8\x0e\xac\xbb\x76\xa3\x97\xa6\xa0\xe6\x85\x71\xb8\x26\x32\xe7\xc6\x2a\x87\x56\x1f\xa4\x71\x5e\x18\x37\x35\xa3\xd4\xc9\x01\x48\xa8\xa4\x06\x7b\x84\x86\x9c\xaa\x28\x4f\x5b\x7a\xcd\xcf\xf5\x5e\x0d\xfe\x0a\xd8\xcf\xfd\x94\x8d\xb8\x60\x2e\x0e\xb6\x95\x0d\xf7\x5f\x5b\xd9\xf0\x1c\x65\x83\x66\x49\xa9\xb8\x99\x1d\x49\x61\xd8\xc7\x46\x1e\x96\xba\x68\xb8\xac\x0f\x48\x70\x9f\xb9\x2a\x4a\xf7\x1d\x91\x05\x26\x50\xce\x95\xb3\x86\x14\x5c\x55\x0a\x30\x30\xb1\x4a\x86\x19\xb4\xfe\xc0\xee\x81\x9c\xc8\xf9\x87\x78\x7b\x0e\xcd\xcc\xdf\x4a\x3e\xa5\x99\xb5\x76\xab\x5f\x9c\x83\x05\x13\xff\x68\xd5\x3d\x6f\xa8\xbe\xae\x36\x3c\xeb\x5b\x1d\x3a\xcc\xf9\xc0\xbf\x12\x7c\xc4\x3e\x9a\xa7\xa8\xa5\x81\x82\x74\xae\xf8\x94\x67\x6c\xcc\x4e\x74\x42\x33\x90\x6b\xdd\x9c\x15\x87\xb7\x8c\x0e\x0b\xaf\x64\xa6\xc9\xcd\x84\x41\x77\x65\xea\x5d\x00\x50\xe1\x32\xa6\x5c\x90\xdc\x2e\x51\xe1\x7f\xac\xd1\x97\x60\xc5\x7f\x41\x95\x5d\xe0\xe0\x33\x00\x13\x79\x28\x65\xe6\x52\x87\xb3\x59\x35\xbe\xcb\xbd\x17\xf2\x1f\x82\xdd\xfc\xc3\x8e\xa6\xc9\x28\xa3\xe3\xe0\x2a\xd0\xcc\x2c\x78\xfb\xaa\xa1\x6f\x7d\x01\xc8\xcb\x2d\x19\xa1\xd9\x0d\x9d\xe9\xca\x71\x12\xf7\x01\x7f\x45\x5e\xee\x03\x3b\x53\x4d\xc2\x18\x29\xf9\x62\x1f\x62\x89\x47\x87\xe7\xff\xb8\xfc\xfb\xe5\x3f\x0e\x8f\xdf\x9e\x9e\xb5\x3b\x29\xec\xbb\x33\x2a\x1a\x8d\x91\xd0\x82\x0e\x79\xc6\xdb\x1c\x10\x0b\xd9\x26\xf1\xa0\x70\x04\xa7\xe9\x41\xaa\x64\x81\x74\xf2\x3e\xaa\xea\xa4\xac\x5b\xc1\x71\x65\x32\x2c\xcf\xa8\x3e\xe0\x58\x51\x61\x2a\x67\x4d\x45\x72\x55\x0a\x6b\x58\x3f\xf1\xc4\x7c\x9a\x76\x97\x94\x7f\x98\xa6\x2c\xad\x51\xef\xd9\x25\x01\x1e\xf9\x97\x9b\x55\x35\xda\xe4\xfc\xdd\xe5\xe9\xff\x33\xc7\x86\xb3\xa2\x5d\xce\x53\x37\x75\x61\x4a\x16\x9d\xad\xee\x85\xab\x3b\xda\xae\xef\x46\xac\x6f\x38\xab\xba\x89\xb4\x5f\x94\xa2\x0e\xe3\x51\x8d\x4f\x72\x99\xb2\x01\x39\x0f\x5e\xfa\xfa\xb7\x51\x79\x2f\x55\x8c\xd8\x5b\x84\xe1\x34\xcb\x66\xb1\x82\x64\x24\x16\xd3\xd4\x2a\x93\x63\x39\x3c\xa2\x99\x6e\x29\x4c\xdb\x9c\x4c\xf6\x10\x7e\x6b\x8d\xc9\x4e\xa8\x19\x46\x23\x29\x13\xd2\x38\xad\xd4\xce\x12\x8a\xb5\x95\x4c\x08\x5a\xae\x51\x5a\x54\xed\x74\xd1\xe8\xe8\xf7\x07\x13\xd7\x9e\x56\xe7\x61\x64\xf4\xf2\x96\x9a\xcd\x6b\xb7\xee\x60\xaa\x6c\x59\x3b\xba\x62\x34\x85\x9a\xb4\x82\x9a\x09\x66\x35\xe4\x54\x5f\xb3\x14\x3f\x70\x7a\x4d\x70\xf3\xdb\x11\xc3\xa3\xae\xec\xbc\xbd\x4f\x1f\xf4\x19\xcc\xb5\x80\x58\x40\x33\xd0\x0d\xd2\xc5\x16\xb0\xef\xf4\x4e\x64\xb3\x0b\x29\xcd\xeb\x50\x8b\xd5\xc9\x02\xfe\xec\x34\xc5\xba\x1b\x16\x54\x29\x48\x42\x48\xfb\x40\x4c\x60\xe9\xb8\x0c\xec\xb8\x5a\xb0\x35\x33\xb4\x2a\xc5\xa1\xfe\x41\xc9\xb2\xf1\x09\xb0\xa0\x68\xfd\x70\x7a\x0c\xfb\xb8\x74\x51\x36\x61\xd4\x0c\xaa\x4e\x17\x01\x83\x82\x4e\xfb\xde\xc5\x09\x63\x8e\xac\x42\x3a\xe4\x2d\x9d\x11\x9a\x69\xe9\x95\x63\x2e\x96\x1a\x50\xce\x3a\xb3\x5f\x0f\xa5\x99\x2c\x98\x65\x96\x9d\x17\x7f\xd7\x8b\x82\x6e\x15\x82\x11\x17\x0b\x3f\x37\xf4\x9a\x69\x52\x28\x96\xb0\x94\x89\xa4\xe5\xaa\xad\x3b\xd4\x04\x2b\x7f\x26\x85\xdd\x16\x9d\xac\xfd\x69\x88\x31\x82\x23\xac\xbe\xd2\x10\xad\x74\x76\x07\x85\x98\x25\x6c\x8a\x52\x33\x85\x01\x56\x55\x32\x5c\x88\x1f\xcb\x21\xcb\x98\x41\x63\x08\x70\x27\xa8\x41\x43\x9a\xe7\x74\xcc\x08\x35\x81\x51\x8c\x24\x4c\x68\x2b\x6e\xd0\xf5\x66\x48\x2a\x59\x55\x40\x49\x35\x79\x7f\x7a\x4c\x5e\x90\x3d\xfb\xac\x7d\x58\xfe\x11\xe5\x19\x84\x33\x0d\x55\xf3\x73\xe4\x23\x3f\x04\x4c\x09\x78\x8f\x48\x85\x5b\xb4\x47\x84\x24\xba\x4c\x26\x7e\x4e\xd6\xe2\xf2\x06\x9b\xcb\xe7\x03\xa7\xfe\x33\x64\xd5\xd6\x02\xe6\xbd\x66\xaa\x33\xf9\xf2\xbe\x81\x7c\x89\x55\x08\xcb\x73\x75\xea\x21\x63\xe5\xcc\xd0\x94\x1a\xea\xe4\x4e\x55\x75\xfd\x1c\x97\x74\xdd\xd2\x47\xb3\x37\x5c\x94\x1f\x31\x63\xa5\x3b\x23\xff\xf2\x04\x86\x25\x89\x27\x1a\x2c\x1a\x2d\x8a\x8c\x63\xbd\xf3\x5c\x06\xd5\x69\x6d\xa9\x7b\xb7\xa8\x48\xb0\xcd\x69\x96\x49\x2b\xde\xec\xc9\x4e\x45\x2a\xf3\x85\x87\x59\x05\x8a\xd5\x80\xee\x06\xe4\x59\x32\xcf\xda\xdd\x11\x19\x9b\xb2\x16\x98\x2e\xf3\xb8\x7c\x76\x34\xab\x8b\xf9\x05\x85\xe1\x49\x46\x87\x2c\xc3\x93\x05\x19\x48\x2f\x32\xd0\xba\xb3\x10\x95\xcc\xba\xab\xc1\xb8\x90\x19\xc3\xb4\x1e\x4f\x08\x3b\xfc\x93\xa0\x03\x0c\xd2\x15\x1d\xc0\x90\xa9\xd1\x01\x4c\xb2\xa7\x40\x87\xb2\xc5\x41\x4b\xe6\xe9\x60\x4f\xed\x3a\x1d\xe0\xe8\xdc\x74\x3a\x68\x96\x24\x32\x2f\xce\x95\xb4\x26\x57\x67\x47\x8b\x1b\xb6\x8a\x15\xa1\x4d\xbe\x24\x09\x07\x44\x79\xfd\x66\xaa\xa2\x84\x3e\x6a\x50\xc6\xfb\xac\xbe\xff\x5f\xdc\x21\xd9\x8a\x9e\xf9\x73\xc8\x8f\x52\x0b\x2b\xd9\x5f\xba\x2f\x9e\x38\x9c\x40\x0b\x2f\x59\x27\x87\x89\x4c\x68\x06\x90\x7b\xed\x38\x86\xcc\x73\xcd\xfc\xc0\x51\x16\x26\x84\x96\xe0\x33\x1f\xf7\x07\xf4\x35\xf8\xc4\xf9\xbe\x84\x4c\x59\x14\x82\xc4\xf4\xd1\x2b\xcc\xd6\x83\xfb\x7c\x02\xa8\x3d\xd5\x7d\x34\x30\xad\xfd\xda\x48\x87\x00\xf3\x36\x00\xf9\xd9\x09\x32\x91\x72\x31\x06\x8f\x4e\x8f\x28\x96\x61\xea\xa8\xdb\xc3\xd7\x68\x7e\xed\x02\x47\xfb\x41\x3d\x3b\xfb\x47\x83\x26\xc4\xa5\x70\x23\x83\x93\xc3\xeb\x37\x23\x94\x96\x5c\x93\x9d\x37\x9e\x00\x2d\x90\xcf\x36\xf1\x80\xd8\xc1\x37\x0c\xab\x89\x3e\xb6\x6b\x2e\x52\x97\x65\x59\x23\x56\xc0\xa8\x45\x2d\x14\xf2\x77\x79\x1a\x8b\x86\x57\xe4\x83\x20\x81\x58\xa4\xdf\x98\x3d\x2e\x50\x61\xf5\xee\xa5\xfe\xdd\x2e\xbf\xf0\x90\xf9\x61\xde\x0b\x58\x7b\xfb\xdc\xbe\x35\x7b\x17\xef\xf3\xef\xb2\xb3\xce\x75\xbd\xe1\x22\x95\x37\xba\x6b\x1b\xe2\x67\x1c\xd6\x2b\xd4\x89\x65\x6b\xc3\xc5\x58\xc7\x76\x04\xcd\xb2\x9a\x1b\x76\x99\x21\xe1\x57\x38\x20\x12\x2f\x2a\xf0\x73\xd9\xe1\x5b\x23\xe0\x01\xd7\x38\xd7\xf4\x48\xd9\x57\x31\x9c\x66\x97\x45\x73\x68\x36\x32\xcf\x06\x3f\xbc\xbd\x3c\xac\x0f\x6d\xe5\xd9\x0d\x20\x5e\x5b\x62\xdb\xef\x09\x4d\x73\xae\x35\xb8\x81\xd8\x70\x22\xe5\x35\xd9\xf3\x69\x1b\x63\x6e\x26\xe5\x70\x90\xc8\x3c\xca\xe0\xe8\x6b\x3e\xd6\x07\x8e\x69\xfb\x76\xf6\xfb\x84\x8b\x2c\x64\xa3\x80\x19\x29\x8c\xf6\x6e\x0c\x78\x48\x12\x66\x01\x6b\xeb\xf0\x3a\x5d\x94\x79\x71\x9a\x88\xd0\xc9\x59\xb6\x7e\xc0\x99\xc5\xe5\x39\x6b\x89\x9d\x71\xcf\x12\xc1\xbb\xbb\xd2\x94\xb8\x8c\x6a\x29\x1d\x51\x7b\x5b\x3b\x91\x9c\x76\x90\x30\xdd\x1d\x2a\xcf\xdf\xaa\x31\x49\xca\xb0\x7a\x82\x41\xd6\x09\xbd\x35\xb9\x09\xbc\xb2\xbb\x50\x84\xe7\x7e\xba\x1b\x6b\xb4\x10\xf5\xc1\x32\x0f\x6b\x0f\x64\xc5\x84\xf6\xd1\x48\xb6\x22\x09\x64\x98\xd7\x01\x26\x52\x48\x97\x9c\x6e\x4f\x41\x29\x80\xa5\xc1\x5a\xc0\x40\x10\xac\x89\x93\xb1\xd1\x54\x8f\xaa\xf8\x60\x1c\x43\x82\x22\x1e\x04\x01\xa8\xe6\x70\xc3\xcd\xc4\x23\xdc\xd7\x02\x4e\x30\x13\xc5\x34\x44\x0f\x04\x61\x4a\x49\xe5\x12\x61\xbc\xd7\x16\x46\x02\x51\x0c\x99\x34\x96\x49\xa8\xfd\x6b\x57\xc7\x21\xca\x0a\x02\x17\xf2\xc4\x2c\x37\xb1\xd1\x88\x25\xa0\x29\xc5\x04\x46\xb1\xbb\x57\x21\xf7\xb9\xec\x6e\xcb\x60\x0e\x42\x37\xe7\x1f\xed\x53\xe2\x5f\xc5\xc1\x50\x87\x98\xb7\xfc\xeb\xfd\x01\x21\xa7\x22\x64\x4e\xf6\xec\x2a\xc6\x77\xfa\x94\x1f\x63\x5f\x31\xc6\x5f\x86\x17\x88\xfd\x4e\x56\xbd\x53\x65\x07\x1c\xdf\xc6\x19\x4c\x62\x87\x70\xa7\xe2\x00\x1c\xc3\x6e\x50\xbb\xf4\xfe\x10\x6f\xe3\x28\xb6\xb7\x3c\x96\xb3\xf8\x69\x9c\xf4\xa4\xad\x9c\x73\x25\xf1\x1d\x81\xe2\x5e\x46\xa3\x45\xea\x77\x08\x37\x9d\xcb\x14\x21\x31\x42\x49\x3f\xf4\xb2\x00\x88\x0e\xfe\x6f\xaf\x60\x55\x4a\x9a\x90\x98\x95\x1d\x63\x65\x38\x4c\xd0\x94\x58\x5d\x39\xf3\xb6\x7d\x5e\x64\x0c\xaa\xe7\xa2\x91\xab\xc2\xc0\x08\x45\xb7\x17\x26\x52\x01\xf1\x3a\x84\x8e\x1e\xf9\x17\x6c\xca\x90\x00\xe8\xc1\x03\xce\xc3\xcf\xd1\xc4\xe3\xda\x43\x6a\x43\x65\x9b\x91\xde\x75\x40\x52\x3e\x1a\x31\x9f\x68\x68\x4d\x3f\xaa\x68\x6e\x45\xbc\x26\x8e\x04\x43\x36\xe6\x98\xc9\x16\x04\xdb\xae\xae\x2a\xe0\x7b\x28\x0c\xb9\x21\x39\x1f\x4f\x90\x51\x08\x85\xca\x48\xe2\x43\x6a\x99\xa4\x29\x01\xde\x96\x8a\xdc\x50\x95\xdb\x73\x83\x26\x13\x88\xcf\x51\x41\xd2\x52\x01\x4c\xa4\x61\x34\x9d\xf5\xb5\xa1\xc6\xaa\xba\x4c\x39\x8b\xd0\xcf\x7f\x0b\x25\x7c\xe7\xb5\x85\x12\xbe\xfd\xda\x42\x09\x6f\xa1\x84\xb7\x50\xc2\x77\x5f\x5b\x28\x61\x77\xad\xbf\xda\x97\x6c\xa1\x84\x1b\x5e\xcf\x0b\xce\x66\x0b\x25\xfc\xa0\x6b\x0b\x25\xbc\x78\x6d\xa1\x84\x6f\xb9\xb6\x50\xc2\xb7\x5c\x5b\x28\xe1\x2d\x94\xf0\x16\x4a\x78\x0b\x8a\x76\xef\x58\x9b\x09\x8a\x46\xb6\x50\xc2\xee\xda\x42\x09\x3f\x0b\xe8\x27\xb2\x85\x12\x5e\xe9\xda\x42\x09\x6f\xa1\x84\x9b\x5c\x5b\x28\x61\xb8\xb6\xbe\x97\x2d\x94\xb0\xbf\xb6\x50\xc2\x78\xfd\x71\xb4\xe6\x2d\x94\xf0\x16\x4a\x78\x0b\x25\xbc\x85\x12\xbe\x73\x16\x5b\x28\xe1\xe7\x60\x4f\x6a\x93\xf2\x46\xc8\x67\xab\x00\x55\xb8\xcc\x90\xa8\xb4\x75\x58\x8e\x46\x4c\x81\xe4\x82\x27\x2f\x64\x21\x04\x40\xab\x20\xcb\x5c\x9e\x01\xc0\xe2\x29\x46\x53\x97\xf0\x7e\xcb\xcf\x5d\x2d\x2d\x20\x94\x55\x99\x9a\x27\xef\x5e\x77\x83\x8a\xd1\x2e\x47\x11\xe6\xfc\x4e\x24\xed\x73\xd5\x2a\x82\x2f\x2b\xc0\x70\x74\x4f\x32\xa9\x5d\x86\x29\x10\x2b\x99\x50\x21\x98\x37\x1e\xb9\x01\xa7\xcc\x90\x31\x41\x64\xc1\x04\xca\x6f\x4a\x34\x17\xe3\x8c\x11\x6a\x0c\x4d\x26\x03\xfb\x24\xe1\x89\x5d\x65\x83\xba\x4f\xb4\x51\x8c\xe6\x3e\x2f\x36\xa7\x1c\x87\x22\x34\x51\x52\x6b\x92\x97\x99\xe1\x45\x18\x8c\x68\x06\x09\xed\x78\x50\x05\x62\x40\x7a\x49\x95\x42\xda\xab\x9e\xe6\xa6\x25\x63\x50\x20\x30\x5d\x7b\x80\x83\x9a\x17\x66\x16\xf2\xe8\x18\x19\x71\xa5\x0d\x49\x32\x0e\xa7\x35\x3c\x11\x6b\x07\x61\xbc\x9e\x3f\xab\x85\x9b\xa9\x76\x53\x15\x29\xa8\xad\x85\xd1\x98\x95\x56\x0d\xe8\x86\x4a\xb9\x76\x6a\xbe\xee\x11\xea\x21\x6f\x90\xd0\x7e\xa6\x40\x6a\x7f\xb2\xe0\xe8\xee\xa3\x68\xb8\x08\x27\xaf\x4a\xdb\xab\x18\x1d\x52\x8c\x3d\x73\xf6\x6a\xd9\xd4\x95\x42\x01\xe9\x2e\x0b\xdb\x00\x16\x40\xb0\xa9\xe5\x01\x96\x30\x7b\xbe\xd2\x5b\xb8\xfe\x93\x33\x7d\x74\x28\xbe\x65\x5a\xd3\x31\x3b\x6f\x18\xb5\xb8\xcd\x22\x83\xc0\x45\xb5\x30\xc0\x0a\x19\x96\xa7\x85\x4f\xaa\x34\xa7\xba\x1a\x44\x72\x9c\x53\x50\x7e\x6e\x14\x37\x86\xc1\xa2\x02\x38\x12\x04\x3e\xe7\x0b\x50\x77\xe7\x92\xa5\xde\xfa\x41\xaa\x1f\x5b\xa1\x2e\x52\x4c\x5d\x1a\x32\x32\x54\x9c\x8d\xc8\x88\x43\x3e\x14\x64\x28\xf5\x10\xee\x83\xa2\x47\x41\x6b\x6b\xef\x4a\xe1\x75\x59\x3f\xaf\x01\xf9\xd9\x4d\xcc\xa8\x52\x24\x34\x02\x01\x84\x12\x2d\x3e\x22\x63\xc8\x70\x72\xda\xe2\x57\x2f\xfe\xf3\x2f\x64\x38\xb3\x47\x1a\x68\x56\x46\x1a\x9a\x85\x97\xcc\x98\x18\x5b\x5a\xe1\xf6\xac\x17\x19\x05\x0a\x00\x8a\x39\x4e\xfc\xe5\x17\xd7\xc3\xfa\x19\x7b\x90\xb2\xe9\x41\x44\xbf\x7e\x26\xc7\xcb\x70\xe1\x9b\xa7\x4c\x36\x34\x89\x96\xb0\x99\xcc\x78\x32\x6b\xcd\x68\x1e\x77\x86\x4c\xe4\x0d\xea\xfa\x4b\xb8\xa7\xca\x81\x2c\x64\x51\x66\xe8\xc1\x7e\x1d\xca\xf3\x4a\xcd\x16\x6b\x70\x96\xee\x0b\xf0\xb9\xba\x21\xe6\xf1\x62\x31\xb1\xcd\x3f\x52\xba\xdc\x6e\xe7\x15\x0c\xf0\x33\x60\x08\xbd\xa6\x59\x36\xa4\xc9\xf5\x95\x7c\x23\xc7\xfa\x9d\x38\x51\x4a\xaa\xfa\x5c\x32\x6a\xa5\xe5\xa4\x14\xd7\x88\x5c\x1d\x4a\x84\xe5\xd8\xaa\x56\x45\x69\x7c\x22\xf1\xb2\x17\xc6\x82\x53\x2f\x84\xbd\x19\x54\x8d\xc2\x3e\xf2\xca\xd6\x71\xa5\x12\xc8\x91\xf1\xf8\x3a\x66\xb6\x2f\x5e\x7c\xf5\x35\xb2\x2e\x91\x8a\x7c\xfd\x02\x92\x1f\x75\x0f\x37\x31\xc8\x36\x7b\x50\xe4\x34\xcb\xac\xd9\x10\x33\xa5\x25\xf4\x32\x26\xfc\xe4\x3c\x68\xda\xb3\xdb\xca\xaa\xd4\xd5\xd5\xdf\x41\x8f\xe2\x46\xb3\x6c\xd4\xc3\xaa\x80\x60\xd6\xec\xc2\xc1\xb0\xeb\xa4\x0f\x94\x66\x6c\x80\x02\x34\x95\x59\x99\xb3\x63\x36\xe5\x5d\x34\xaf\xa8\x8d\xe6\x4d\xfd\x8c\x6b\x28\xc0\x18\x66\x32\xb9\x26\xa9\xfb\x32\x4a\x63\x99\x87\x50\x6d\x4e\x85\xa6\x09\x3d\x2d\x12\x79\x6e\x7d\xff\x5a\x0a\x4f\x4e\x8b\x22\xe4\xe8\x2b\x7a\x53\x23\x06\xec\x49\xa8\xf7\x6d\x89\xa7\xd0\xda\xcd\xdc\xd6\xc9\xdc\x77\x6f\x64\xe5\x66\xe3\x21\x1a\xa7\xb0\xb4\xf7\x51\x57\xb3\x6f\xee\x98\xac\x31\x44\x35\xa0\xdf\x0d\x05\xfc\x37\xa6\x67\x2f\x54\x25\x85\xc2\x96\xc0\x18\xa8\x00\x58\xf6\x01\x91\xdc\xdc\xe1\xda\x81\x77\xb3\x5d\xfe\x52\x8d\x2e\x22\x78\x95\x73\x6a\x9c\x42\xe8\xdd\xd7\x94\x14\x4c\x69\xae\xed\xb9\xfc\x13\x6c\xa8\xa3\x8c\xf2\x3c\x72\x01\xae\x87\x08\xb8\xb9\x01\xf9\xb2\xbd\xa4\x3c\x97\xa9\x1b\x10\x44\x21\xa2\x7e\x2e\x51\x6b\xeb\x5a\x6d\x87\x07\xea\xba\x45\xe5\x4f\x15\x35\xeb\x92\xd2\x7e\x12\x44\x25\xde\xf5\x9c\x04\x24\xbc\xdf\x53\x95\x8f\x61\xf2\x1d\x89\x01\x10\x8c\x6e\x71\xeb\x92\xb0\x66\x3c\xe2\x46\x89\x54\x7a\x67\x07\x0e\x08\x86\xd4\xed\x9e\x70\x3f\x25\xbb\xaf\x76\xd7\x2a\x24\x91\x44\x4a\x16\x74\xdc\xaa\x87\xc1\x1c\xa5\xe6\x87\x8d\x0b\xbd\xad\x19\x04\xdf\x07\xd8\x21\xb8\x8b\xa5\x15\x10\x05\xc0\x8c\x60\x74\xd4\x13\xd8\x19\x08\x58\x0f\x79\x43\x67\x84\x2a\x59\x8a\xd4\xf9\x97\x82\x83\xef\xed\xdc\x83\xcf\xa4\x60\xde\x71\x3e\x5f\x27\x0e\x1e\x7d\x2e\xc8\xcb\xc1\xcb\x17\xcf\xe5\xa4\x82\x37\x9c\x3b\xa9\xce\xc2\x49\x85\xf2\x69\xad\xef\xea\xd1\x8e\x3b\x7a\xdf\xb7\xce\xc5\x52\x81\x19\x73\x0f\xd6\x0a\x1f\xdd\x28\x6e\x58\xd4\xdb\x68\x0f\x0c\x17\x6b\x1f\x46\x55\xd1\xfb\x1d\x62\x78\x77\x53\x86\xae\xcb\xe1\x23\xca\x2d\x27\xa0\x60\xbb\x2d\xf3\x70\xe9\x3b\x44\x58\x4c\xa8\x9d\x1d\xb2\x87\x77\xee\x62\x65\xe0\xfe\x5a\x59\xcb\x11\xed\xe4\x63\xd1\x02\x63\xae\x46\xb8\x93\x8f\x05\x05\x1f\x5c\xd1\x21\x05\xbf\x67\x13\x3a\x65\x50\x11\xc9\x33\xaa\x32\x88\x39\x5e\xe2\xdc\xc9\xb0\x34\x84\x89\x29\x57\x52\x40\x82\xcf\x94\x2a\x0e\xa8\x14\x8a\x41\x65\xb5\xb5\x45\xff\x63\xef\xa7\xc3\x0b\x48\x68\xd8\x77\x25\xe1\x6e\x96\xa5\xf6\xf0\x11\xf1\x4c\xa2\xe1\xee\x5d\x3e\x3f\x0f\x4b\x43\x90\xb9\x7e\x5e\xf6\x39\x79\x69\x4a\x04\xc4\xff\x98\x64\xa5\xe6\xd3\x75\x49\x12\x57\xaa\x7a\xcc\x1b\xad\xf3\x5c\xd9\x6c\x45\xa8\x85\x0a\x58\x70\xad\xc3\xd1\x72\x0f\x02\xeb\xae\x0e\x98\x55\x71\x0c\xdc\xb9\x9e\x5c\x2d\x3b\xe6\xe2\x79\xc8\xb2\x05\x15\x02\x70\x1b\xd6\xeb\x84\x12\x32\x65\x0f\x47\xbd\xa8\xa7\xf7\xb8\x21\x30\x66\x1e\x95\x03\xea\x64\xc2\xd2\x12\xe0\x55\xb8\x46\x70\x40\x6b\x3e\xd0\x0a\xc6\x4a\x40\x7f\x86\xd3\x51\xa8\x0d\x16\x7d\x70\x0e\x22\xcd\xfd\xef\x95\xaf\x24\xf6\x1f\xe8\xb9\x11\xc1\x28\xb5\x63\xf5\x08\xd5\xba\xcc\x71\x4b\x20\xfc\xf6\x88\x1b\x1d\x7a\xeb\x79\xed\xd8\x6e\x8c\x07\x56\x67\xb5\xa0\xef\x25\xcb\x80\xb9\x5a\xd0\x78\xf7\x2c\x1a\x07\x09\xad\xfd\x5f\x8e\xe1\x5c\xc2\x04\x44\xdb\x42\x52\xa8\x04\x2f\xe9\x88\x43\xfb\x0a\xea\xe8\x7d\xb9\xe4\x97\xa8\x3a\xe0\x1d\x00\xcf\x40\x87\x2c\xd3\xf3\x03\x0d\xab\x45\x71\xb0\x7e\x8e\xf0\x2d\xbb\x03\x52\xad\xf9\x58\x40\xdf\x30\x3b\xda\x03\x3b\x84\x35\xb6\x99\xba\xe8\xfe\xd7\x58\xaa\xd5\xb2\xb0\x72\x5a\xf4\x9d\xd5\x6b\x64\xce\x93\x07\x8c\x24\xa7\x4c\x4d\x18\x7d\xa0\xc1\x37\x17\x17\x73\x63\x54\xad\x63\xb4\xab\x72\x74\xfb\xc6\x3f\xc4\xee\x2f\x99\x40\xb6\x3d\xfa\xe9\x7d\xf6\x13\x05\x16\xc1\xc6\x94\x63\x3e\x65\xc2\x03\xff\x1d\x65\x34\x34\x1f\xf3\x50\x49\x0e\x7c\xb0\x34\x32\x44\x3e\xac\x39\x55\xa1\x97\x41\xa0\xd4\x39\x5d\xe3\x71\xa2\x5b\x5c\xeb\xb2\xcc\x83\xf5\xaf\x72\x27\x04\x1f\xb0\xf5\x47\xaf\x7a\xa5\xdc\x1b\x68\x35\x78\x1c\x92\x40\x88\x2c\x74\x05\xc5\x40\xc4\xfd\x8f\x70\x71\x6d\xcb\x8b\xcb\x86\x71\x7b\x2e\xe0\x38\x55\x84\xcd\xac\xf2\x3a\x23\xd0\x5c\xe2\x74\x54\x7f\x12\xaf\x41\x5f\x42\x36\x36\xec\xe1\xea\x50\x39\x97\xe9\x65\xc1\x92\x1e\x09\x4b\x19\x77\x6e\x73\x4e\x1b\x4c\x6d\x89\xf0\x1b\xf1\x38\x52\x8a\xe9\x42\x22\x02\x67\xfc\xd8\xb8\x41\x28\x37\xb5\x88\x3d\x36\x22\x00\x0b\xad\xc2\x4a\xf8\x37\x53\x72\xa9\x20\x18\x73\x33\xb8\xfe\x1a\xa4\x00\x13\x13\x2a\x12\x14\xc0\x07\xd7\xac\xd0\x07\x9a\x8f\x71\xd3\xff\xe5\xeb\xaf\x41\x02\x78\x92\x1c\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x12\x23\xce\x63\x7d\x41\x58\xec\xc7\xb0\x91\xc8\xf4\xe5\xe0\xe5\xd7\x18\xb7\xe7\x1a\x01\x48\x22\xf8\x2f\xac\x49\x5b\xc4\xfe\x3a\x97\x69\xa0\x9b\xcb\xdb\x7a\x60\x34\x72\xad\x32\xe8\xc9\xf4\x1d\x6d\x98\x51\xdb\x36\x8b\xb6\x55\xe6\x6c\x87\xd9\xb2\x85\x62\x56\xbd\xe1\x52\x34\x89\x33\xd7\xed\xbb\xb9\xa1\xbc\xf3\xde\xfd\x65\x05\xb1\x7f\x9a\x18\x5b\xd9\xac\x51\x5e\x67\xf2\x06\x72\x43\xb8\x54\xdc\xcc\x06\x00\xd5\x23\x47\xe4\x8c\x4d\x99\xea\xf9\x51\xdf\xd8\x9b\xce\xc3\x3d\xb1\x01\xb1\xec\x8e\xa8\x2b\xce\x6d\x1b\xb5\x47\xc6\x71\x1a\xc2\x99\x14\xe7\x61\x76\x61\x18\xb7\xf3\xfa\x90\x31\xf9\x29\x94\x33\x4f\x86\x16\xeb\x80\xe8\xc7\xee\x05\x5c\xa3\xe4\x9f\xa8\xe2\xb2\xd4\x04\x7d\xe2\x31\xe6\x20\xc6\xd1\x03\x89\x40\x35\x73\x5e\xae\x30\x48\x48\x8f\xf7\x8e\xae\x40\x9f\xc3\x70\xde\x1c\x2d\x3f\xd2\xb8\xb1\x8b\x3e\xf5\x8f\x52\x3e\xdf\x67\x01\xae\x10\x0f\xb3\xa5\xe7\x97\x3f\x91\x75\x3c\x51\x18\xc6\xcf\x03\xce\x06\xab\xf0\xe3\x28\x13\x3e\xf6\x59\x65\xf0\xfe\xa8\xbb\x47\x9f\x06\x66\x6b\xb0\xa4\x4d\x76\x7c\xd3\xe4\xc6\x62\xfe\xfd\x5a\xb0\x45\x1d\xd4\x2d\xc6\x85\xf3\x69\xd5\xd5\x16\xdc\x41\x3e\x81\x43\xb0\x9f\x28\x6e\x78\x42\xb3\x1d\x38\xc2\xfc\x57\xd6\xf6\x36\x4c\xc5\xdf\x2a\x46\xcc\x8d\xc4\xa7\xd0\x8c\x5c\xb3\xd9\x8d\x54\xa9\xd7\x2f\xfc\x13\xab\xb5\xd0\xc6\x3f\x92\x33\x27\x0b\x10\x92\x4b\xe5\x4c\x91\x21\xf3\x6e\x84\xb9\x9b\x67\x03\x72\x28\x66\xce\x07\x2b\xe2\x4a\x0b\xaf\x46\x0c\x67\xa8\xe3\xa0\x16\x58\x63\x12\x77\x1e\xfa\xa7\x51\xac\x81\xb9\xcd\xc4\xb6\x0a\x64\xd8\x05\x5e\x7b\xf1\x36\xb6\x54\x2e\xd5\x1b\x76\x87\xc2\x44\x75\xe9\xbf\xfe\x24\xd2\xc2\xea\x67\x5c\x30\xad\x7f\xb0\x4b\xd9\x46\xdd\xae\x73\x07\x05\xb5\xca\x8d\x0d\x72\xb2\xca\xab\x62\x76\x4b\x51\xdf\xf3\xdd\x52\x28\xdc\x39\x20\x87\xf0\x01\x24\x06\x5a\xcd\x11\x4a\x09\xec\x60\xd6\xe2\x9d\xeb\x6d\x88\x77\x1c\x9e\x1d\xfb\x04\x2e\x54\x3a\x74\x1d\xb3\x11\x55\xfe\xfa\x4c\x40\x53\x75\x69\x44\xec\xb7\x92\x42\xab\xaa\x9d\x2b\x55\xb2\x9d\x66\xaa\x1e\xa2\x81\x1e\xfc\xf9\xeb\x17\xa0\xed\x85\xe7\x81\xd8\x7f\x60\x56\x74\xd3\x40\x61\xa3\x10\xe1\x7c\x74\xf4\x22\xe6\x07\x4f\x70\x6f\x37\x39\xcf\x1d\x14\x38\xc1\x32\x05\x9a\x37\xb2\x2f\x1b\x05\x04\x9b\x87\x02\xfb\xd5\x74\xaf\x1e\xde\x09\xa1\x4d\x14\xaf\xf6\xdc\x2e\x5c\x7d\xd5\x68\xb8\x2a\xd8\x68\xb9\x7a\x4e\x14\xb4\x47\xbc\x5d\xf7\x31\xe4\x04\x81\xe0\x02\xd7\x08\x88\xc7\x59\xd1\x22\xff\xa9\x81\xbc\x81\x74\xdf\xd6\xaa\xe2\xee\x05\x0e\x44\x8a\x4a\x37\x5c\x48\xe3\x0c\x6e\x6e\xd0\x3b\x9c\x56\x78\x08\x39\xf1\x3d\xf2\x4e\xbc\xc6\x24\xc1\x1e\x2a\x8a\xb5\x7a\x6e\xbc\xa9\xd3\x5a\x89\x83\x3f\xb9\x77\xef\xe3\x94\x9b\x08\x85\x87\x93\x3b\xb2\x7c\x5b\x9e\xfe\xbb\x17\x73\x63\xd5\x58\xaf\x66\xd9\xbb\x13\x92\x57\x1d\x14\x9c\xf8\x24\x63\x25\xcb\xc2\xbb\x93\xeb\xed\x10\x2a\x08\x61\xf4\x82\x62\xaf\x2e\x21\xeb\x43\x07\xe7\x0d\x30\x30\xab\x50\xc8\x53\x92\xa0\x79\xef\x4f\x5d\x4c\x05\x47\x0f\x88\x2a\x45\xbd\xd5\x60\xe4\x90\xdd\xc9\xd8\x98\x26\xb3\x9d\xfa\x73\x96\xb9\xbf\x39\x64\x28\xf3\x1c\xe1\x17\xf1\x79\x55\x62\x27\xe4\x7f\x82\xfe\x80\x7b\x0d\x54\x83\xd0\x0f\xd6\x1f\xf9\xbe\x32\x61\x42\x45\x0a\x6e\x9e\xc6\x9e\x85\x3f\x7f\xfd\xe7\xbe\x1b\xad\x8f\x53\x99\xaf\xf1\x72\xb5\x5a\x4b\xdd\x09\x5f\x35\x72\x05\x3c\x98\xff\x82\xb7\xbb\x53\xd5\xb3\xb6\xc4\x56\x9f\xe2\xba\x00\x76\x40\x7f\x48\x38\xfd\xc3\xd3\xef\xd2\xce\x96\x0f\x12\x7a\xd0\x87\x21\x3e\x09\xb9\xea\xf8\xd2\x6d\x76\xeb\x3c\x54\xf5\x44\x66\x29\xec\x2b\xe7\x64\xf2\x8f\x22\xd4\x18\xc5\x87\x25\x74\xcb\x11\x29\x40\x9d\xd6\xeb\x4c\x5c\x57\x8e\x01\xa9\x0a\x0d\x62\xe3\x19\x18\x7f\x40\xc8\x25\x73\x2d\x95\xa3\x79\x80\x58\xf6\xa4\x04\x43\x0a\x78\x11\x9a\xf7\xa1\xcd\xf6\x89\x1c\x52\xcd\x4f\xef\x51\xd3\xae\xbd\xf5\x4e\x36\x87\xc1\xa8\xd1\x65\xe1\x50\x0f\x68\x86\xf2\x70\xa1\xc7\xd7\xdc\x41\x06\x29\x58\x20\x11\x2f\x65\x1e\x62\xb6\x96\x16\x1a\x41\xfa\x80\x97\x7d\x3f\x57\x23\xa1\xbe\x69\xec\x5c\xb1\x37\x76\x88\x09\x2f\xd0\x04\xa7\x26\xfc\x1c\x02\x1f\xf6\xeb\xb8\x5c\x15\x3a\xe4\xbc\x44\x1b\x58\xde\x80\x13\xfc\x87\xd3\xe3\xb0\x47\xec\x5d\xaf\x2f\x81\x20\xe4\x8b\x81\x6b\xd7\x65\xc6\x3c\x25\x43\x0c\x76\x59\xf1\xba\x27\xd8\x0d\xa6\xcf\x39\x3f\x71\x50\xc3\xa7\x3e\xad\x0c\x47\x0b\x0f\x77\x43\xee\x93\x2f\x5d\xe7\x25\xa6\xbc\x11\x3f\xe4\x2e\xbd\xe6\xdd\xc5\xae\xf7\xce\xdf\xf4\xd5\x4d\xbf\xdf\xef\xdb\xb9\x7a\xa1\xbe\xa4\xa7\xad\xdd\xef\xb9\x4c\xf9\x68\x36\x47\x09\xcb\xe6\xd5\x23\x80\x23\xa9\x98\xb9\xd9\x35\x68\xb5\xd3\xce\x8f\xd7\xa6\x02\xd5\x31\xe7\x11\xac\x77\xd3\x32\x8f\xba\xdc\x58\x32\xa4\xb3\x8a\x35\x19\xb2\x09\x9d\x72\x09\x85\xa9\xc0\x63\x90\x30\x78\x0b\x5d\xbd\xcf\xc7\x2d\xba\xc3\x3a\x42\x9b\x9c\x7d\x2c\x24\x22\x29\x42\x42\x2e\x34\x89\x98\x0f\xa6\x80\x9b\xdb\x6e\x0a\xc8\x2b\xa8\x31\xbd\x53\x1f\x10\x4d\xc4\x13\x81\x0c\xa9\x1d\x32\x4c\x67\x6f\x6e\x99\xf7\x07\xe4\xd4\x71\x06\x98\x7f\x42\xba\x56\x13\x44\x0a\xc2\x8a\x09\xcb\x99\xa2\x59\xfd\x41\xae\x30\xe9\x95\x95\x96\xca\x32\x19\x06\x2c\x72\x5a\xa0\xb0\x04\xd9\x97\x72\xe5\x7b\x4d\x39\x11\x67\xf9\x75\xe7\x1d\x74\x7c\x7e\xcb\x35\x68\x2a\xce\xf5\x81\x7a\xe5\xce\xb2\xf3\xc8\x7f\x17\xb2\xbc\x1e\x5e\x39\xd4\xc2\x21\xdc\xa6\x3f\xf9\x9a\x3a\x93\xaf\xbb\xb7\xab\x8b\x23\x53\xd3\x26\x3d\x76\x7d\xb2\xa3\x5d\x5f\xf2\x6d\x47\xf2\x55\x3a\x92\xaf\x9b\x45\x9b\xf2\x63\xb3\xa4\xbf\x16\x2d\xc8\x37\xb2\xf9\xf8\xba\x57\xef\x89\x0b\x98\xb6\xad\xc7\x1f\xde\x74\x7c\x95\x66\x81\x8f\xde\x75\xfc\x19\x71\x4d\xc3\x8a\x8d\x76\x05\x0f\x2d\x7a\x8e\xaf\xb5\xdb\x78\xcb\xc4\xdf\xe6\x1d\xc6\xd7\xda\x5b\xbc\xe5\x5b\x37\x6f\x17\xbb\xd6\x4e\xe2\x2d\xdf\xba\x79\xf7\xf0\xb5\xf6\x0d\x6f\xf1\xd6\x6d\x7b\x85\x3f\xa8\x4b\x38\x9b\x73\x9e\x04\x8f\xf2\xa7\x15\x83\x6d\x8a\xd6\x1a\x36\xeb\x6e\x29\x79\x3b\x69\xd0\xbd\x6d\xcd\xdd\x65\x6b\xee\xcd\x90\xaf\xdb\x46\xdc\xed\x1a\x71\xb7\x91\x9c\x91\xbb\x18\xfc\x33\x6d\x35\xe9\xc3\x80\x0c\x01\xce\xe7\x5a\xb7\xed\x0a\x3d\xca\x19\x55\xae\xab\xd9\x9c\xe2\xdb\x83\xd5\x71\x39\x9e\x0b\x87\x0b\xe6\x01\xe5\x54\xcd\xc8\x0f\xa7\xc7\xa8\xff\xd6\xd4\x70\x21\xfd\xa3\x03\xa7\xa4\x0e\x20\x88\x8a\x59\x7b\xb5\xb5\x59\x8d\x75\xe3\x0a\xeb\xb6\xd8\x75\xad\x6c\xac\x99\x4e\x4c\xd6\x96\x25\x2e\x71\x14\x88\x11\x11\x1a\xf8\x43\xd0\x9c\xe9\x82\x26\x56\xfa\xb9\x3b\x20\x50\x1b\xd5\x4f\x0c\xac\xe5\xe2\x82\xa0\xa5\xa8\xf0\x9d\xfd\xfd\x7b\xf3\x07\xb2\xdf\x92\xfb\xae\x98\xc8\x7b\x65\x32\x5a\x8a\x64\xf2\x44\x56\x7c\x09\xf1\x82\x8f\x9c\x92\x6b\xa6\x04\xcb\xaa\x9e\xa1\xbe\xc6\x84\x35\xa9\x7d\x6f\x59\x3a\xdf\xae\x70\xbe\x45\xd1\x7b\xf3\x16\x40\x6d\xcb\xe5\xdb\x14\x21\x2f\xe9\x8b\x32\xc2\xb3\xc9\x4e\x69\xe6\xda\x65\x35\x1c\xbc\x75\x65\x68\xab\xa6\x3e\x75\x14\x08\x84\xb0\xdd\x88\x77\x73\x8d\xfa\xbb\x73\x13\xf9\x96\xd4\xa1\x20\xcf\x47\xb0\x1f\xea\x2a\xf2\x0a\xcb\x22\x0c\xc6\xae\x5e\x70\xc3\xd4\x31\x83\x9f\x86\x9b\x77\x2d\xfe\x9d\x71\xae\xe9\x91\xb2\x13\x37\x9c\x66\x97\x45\xd3\xf6\xbc\xb5\x75\xff\xe1\xed\xe5\x61\x7d\x50\xab\x7d\xdf\x40\x52\xad\x25\xaa\xfd\x3e\x4a\x0d\xbf\x61\xc3\x89\x94\xd7\x64\x2f\x4a\xb9\x99\x94\xc3\x41\x22\xf3\x28\xbf\xab\xaf\xf9\x58\x1f\x38\xfe\xec\xdb\x79\xef\x13\x2e\x00\x8c\x6d\x11\xc4\xce\x3f\x24\x09\xb3\x80\x35\x74\xb9\x49\xee\x18\x5c\x9c\x26\x08\x19\x4c\x85\x58\x87\x7d\xb0\xb8\x18\xcd\xbb\xc5\xdf\xb3\x20\xbe\x9a\x36\xc6\x1c\xba\x95\x6a\x68\xce\xaf\x85\x24\x93\xaa\xed\x7f\x07\x74\xf8\x5b\x35\x5a\x8c\x1d\xc2\x47\x35\x58\xd3\xca\xce\x08\x81\xb2\x5d\x68\xaf\xe0\x7e\xba\x1b\x3b\x9d\xeb\xe5\x28\x34\x2b\x26\xa1\x70\x4c\xc4\xb1\xf3\x21\x8b\xab\xc4\xa2\x82\x8d\xf9\x42\x31\x27\x30\xa3\xa9\x1e\x55\xfe\x13\x9f\x45\x36\xca\xe8\x18\xe0\xd9\xe7\xaa\x2e\x40\x3a\x42\x0b\x62\x6b\x3b\x44\x37\xfb\xd2\x3a\x0f\x3d\x0c\xc8\x87\x1a\x13\xba\x7d\x20\xcd\xa5\xe7\x43\xfc\xff\xd0\xce\xdb\xf7\x52\xaf\xe5\x7a\x83\x95\x1f\x8a\x0b\xb5\xe5\x1d\x8c\xdc\x5b\x9b\x3d\x26\x30\x8a\xce\xbd\xaa\x27\x33\x64\xc7\xa0\xc0\x87\xdf\x53\x92\xf3\x8f\xf6\x29\xf1\xaf\xe2\xac\x72\xd7\x0b\x79\xf9\xd7\xfb\xd6\x96\xa9\x0c\x9f\x9e\x5d\xc5\xf8\xce\x08\x16\x58\xc0\x17\x67\x98\x16\x8e\x2f\x10\x87\x09\x1c\xc2\x6f\x1b\xfe\x6e\x8e\xcb\x11\xc2\x74\x1d\x6d\x75\x08\xd7\xb9\xe1\xec\x42\xfb\xf3\xb7\x4d\xf8\xce\xde\xd2\x45\x08\x6f\xf1\x90\xdd\xfc\xb3\x99\xb4\xc9\x1f\x54\x53\x9e\xb0\xc3\x24\x91\xa5\x68\x95\x3e\x78\xcc\xec\x2b\x50\xc3\xd2\xcb\xda\x98\xe8\x6f\x4e\xe1\x5b\xac\x98\xa6\x19\xa7\x58\x53\x5f\xbf\x13\x8b\xa9\xaa\x71\xc0\x5f\x3d\x37\x43\xc7\x32\xd8\x6e\xf7\xd3\x24\xa4\x2e\x3c\xbf\x5d\x92\xe5\xe2\xdb\x2c\x9e\x70\x73\x14\x74\xae\xea\x85\x74\xe7\xd5\x72\xcd\x0d\xd5\xd7\x15\xd2\x00\x83\x72\x93\xb0\x99\xa2\xcf\xdd\x8b\xf6\x29\x3e\xb5\x11\xfa\x40\x03\xea\x1a\x2b\xf7\xec\xcb\x1f\xea\xd7\xff\x75\x7c\xd6\x2e\xe5\x37\x80\xac\x63\x1d\xc3\xc4\x0d\x1d\x74\xed\xb8\x7c\x3c\x2e\x43\xb3\x4f\xee\x11\x45\x1d\x7e\xac\xeb\x1d\x92\x31\x8a\x3e\x0d\xb2\x17\x65\x64\xef\x0f\xac\x4c\xaf\x42\xbd\x28\xea\x5d\xab\x8f\x9c\x51\xa1\xa3\x52\x43\x06\x43\xfb\x74\xc6\x30\x1f\x3c\x08\xdd\x6a\x3b\xf3\x7f\xcf\xfb\x2c\xeb\x77\x60\xeb\x7f\x52\x1a\x6d\x3f\xc7\x87\x7b\x81\xb9\xc2\xe3\x15\x1b\x73\x6d\xd4\xcc\x37\x21\x19\x45\x93\x70\x5e\x99\x70\xcb\x35\x9b\x91\xbf\xfd\x78\xf2\xf7\x7f\xbc\x79\x77\x74\xf8\xe6\x1f\x6f\x0f\x8f\xfe\x76\x7a\x76\xf2\xe1\xc3\xe5\xdf\x2f\xaf\x4e\xde\x7e\xf8\x70\x54\x2a\xc5\x84\x71\x65\x97\x97\xcc\x7c\xf8\xe0\x38\x55\x7f\xf8\x70\x95\x14\xbc\xf8\xf0\xe1\xdc\x3b\x31\x10\x5e\xf8\xbf\x8e\xcf\x40\x7e\x62\xf5\x4f\x48\xb9\x81\xb3\x15\x89\x0e\xf3\x9e\x50\x5d\xa5\xd7\xd5\xea\x2a\x1a\x40\x52\x35\x3d\xee\xf4\x84\x2a\xe6\x8e\xe6\x33\xef\xc9\x6a\xb5\xd9\xed\x80\x55\x5f\x00\xef\x21\x0d\x5e\x32\x32\x64\xe6\x86\xb9\x72\xb5\xf9\x63\x2e\xce\xe2\xfd\x19\xdb\xe3\x60\xb2\xbe\x3d\x8a\x96\x60\x8f\xa3\x72\x26\xc9\x94\xb3\x1b\xc4\x46\xc0\x36\x2f\x15\x00\x3e\x94\xaf\x62\x09\xe3\x7c\xb8\xcb\x29\x49\x85\x4c\x03\xd8\xff\x9c\x5b\x77\xc1\xa5\x5b\x2b\x97\x40\xe4\x12\x96\x92\xf3\xd3\x63\xf2\x72\x80\x4a\xce\xe9\x31\x02\x29\x2d\x23\x2b\x49\x1c\xda\x8f\x3d\x50\xf1\xf4\x5d\x92\x2e\x5e\x31\x40\x13\x61\xd4\x80\x03\xca\x61\x2a\x73\xfa\xd0\xb6\x1e\xf7\x14\x1e\x60\xd3\xa5\xdf\x4a\x9a\xa1\x0e\x70\x2e\xd3\x45\xc9\xb4\xf3\x8d\xff\xe8\xdb\xc1\x37\x61\x1e\xdf\x0e\xbe\x81\x76\x4e\x9e\x6c\xdf\x0e\xf4\x34\x19\x7c\xe3\x0a\x61\x89\xbb\x69\x69\x76\xe8\x42\x55\x8b\xd3\x67\xf1\x37\xf0\x6c\x0a\xfa\xee\x27\xa9\x53\xe8\xb0\x2f\x56\xc7\xdd\xb0\x50\x0b\x84\x1a\xdb\x44\x31\xea\xda\xb5\xa7\x2c\x63\x26\xea\x6f\xbf\xf6\x76\x4c\xb7\xf7\xa7\xf2\xa1\xaa\x5a\xf7\xae\xd8\xb9\x14\xf4\xa5\x3f\x7c\x93\xaf\xd8\x60\xf8\xb2\x6a\xc0\xda\x60\x03\xb4\xac\xc8\x7f\x50\xd8\xc6\xc8\x8c\xe1\xfa\xb4\xd9\x29\x4b\x0b\xa2\x76\x75\x3c\x7a\x13\x42\xac\xa3\xea\xf8\xca\x43\x71\x59\x8e\xb8\x0a\xf3\x07\x4b\x03\x9b\xd7\x60\x6c\x12\xbf\x81\x32\xa5\x19\xb1\xa7\x96\x41\x4f\x46\x5c\x09\x68\x14\xb4\xd9\xf9\xe6\x9a\xcd\x7a\x08\xdc\x80\x4a\xc8\xb7\x11\xa6\x60\x28\x7d\x95\x85\x1d\x50\x2a\xf2\x8d\xff\xaf\x6f\x1f\x6a\xad\xb5\xf0\xa3\xb6\xf1\xa2\xe2\x4b\xb5\x0e\x5d\x9d\x60\xfd\x43\x1d\xc9\x01\x29\xeb\x4a\x23\x8c\x44\x72\x0d\xc8\x09\xd4\x37\xa2\x46\xea\x70\xd5\xb2\xac\x76\xb3\xf6\x3d\x92\x6a\x28\x00\xe0\x7f\x89\xea\x22\xce\xe4\xa5\x2b\xa9\x03\x64\x96\x11\x53\xd5\x27\x20\x60\xce\xe4\xc9\x47\x96\x94\x0f\x45\x4b\xc1\xab\x95\xef\xef\x9a\xb5\xef\x5a\xf1\x23\x0b\xa8\x35\x48\x1b\xab\x85\x87\xac\xf8\x6a\x77\x46\xa9\x59\x77\xd3\xf6\x9a\xcd\x74\x00\x03\xbb\xc6\xd1\x5d\xf5\x6a\xe0\x5f\x7f\x90\x9d\x7c\xe4\xda\xe8\xff\xe3\x5b\x66\xe4\xc3\xaa\x59\x09\xc5\x1c\xa9\x6a\x74\xbf\x24\x02\x7a\x69\xe0\x63\x3e\x35\xc1\xfd\x0b\xb4\xa6\xfa\x3b\x4f\x89\x08\xea\x8d\xda\x77\xda\xd5\x2e\xbb\x47\x0a\x28\x51\x8a\x31\xc3\xaa\xbc\x14\xfc\x31\xf2\x27\xd2\x10\xe8\x72\x62\x95\xbc\xfa\x31\xe3\x3e\x72\x37\x71\x40\x8f\xe0\x53\x9a\x31\xb4\xeb\x6f\x78\x96\x26\x54\x61\x88\xdc\x01\xc7\x68\x07\xe5\xe8\x10\x13\xec\x19\xe7\x24\x59\xb5\xca\xda\xc5\xe2\xa8\x32\x3c\x29\x33\xaa\x88\xdd\x8f\x63\xa9\x1e\x88\x2f\x83\x57\xbb\xd6\x2d\x81\x45\x5b\x74\x34\xac\xcb\xf7\xf9\x11\xe7\x01\xf9\x9c\xf6\x62\x4d\x26\xa8\xed\xa8\x6f\x94\xbd\x3a\x14\xa4\x1c\x79\xd9\x14\x04\x45\x0c\xe9\x66\x6a\xce\x71\x3e\x06\xff\xf7\x7e\x74\x78\x84\x9d\x39\x20\xdf\x87\x32\xdf\x1e\xa9\x7c\xc6\x50\x4c\xe8\x9e\xe9\xb6\x8d\x5b\xae\x6a\x53\x8f\xa4\x82\x3e\x3c\x7b\xa9\x84\xdf\xb0\x29\x4f\xcc\xfe\x80\xfc\xbf\x56\x53\x04\x27\xb2\x57\x27\xdd\x36\x0b\x05\x94\x15\xb0\xdc\x0b\xb2\x07\x3f\x8b\x55\xc9\x7d\x1f\x28\x72\x9d\x07\x9e\x58\x36\x4a\x8b\x10\xf5\x92\xf0\x74\x4d\x8c\xa2\xa6\x38\xc7\x1a\xe1\xe4\x97\x41\x42\x06\x99\xc8\xb5\xdb\xa5\x35\xcf\x6d\x88\xb3\x78\x11\x1a\x18\xe7\x5f\xe0\xa3\x27\x8a\x8d\x61\xff\xe1\xee\xf9\x84\xbb\xcf\xc8\x42\x66\x72\x3c\xbb\x2c\x14\xa3\xe9\x91\x14\xda\x28\x10\x0d\x6d\x70\xbc\x6e\x1b\x33\x6a\xfd\x30\x91\x37\x84\xba\x3a\x64\x39\x42\x50\x35\x59\x8e\x27\x08\x76\x0b\x3f\xf4\x6d\xd2\xfc\x14\x9d\xd1\xa9\x07\xe4\x32\x80\xd9\x02\x83\x07\x6c\x5c\x18\x05\x1c\x1e\x37\x74\xe6\x36\x13\x1d\x42\xb7\xdc\x2a\x21\xc8\x4f\x06\x43\x3f\xb7\xbe\x3f\x48\xe5\xc3\xb3\xe3\x87\x22\x08\xaf\x51\xa1\xbd\xe5\x55\xa2\xde\xf9\xd0\x42\x2d\xd0\x37\x68\xa4\x40\x37\x9a\x4b\xa7\xa9\x22\xe6\xa8\xa7\xcc\x27\xd4\x4d\xdb\x80\xec\xe4\xf4\xe3\xe5\x35\xbb\x69\xf0\x4b\xff\xa2\x3f\xb2\x87\xe7\x72\xf5\xc1\x1e\x7d\x2f\x34\x35\x5c\x8f\x00\x6a\xfc\x13\xea\xe3\x90\x72\xdf\x0c\x11\x19\xaf\x7a\xe5\x4a\x3c\x5a\xe8\x96\xec\x71\xf5\x6a\xcc\xe2\xf2\xef\x2a\x3b\x08\x0f\x40\x2c\x01\x08\x60\xca\x76\x07\x25\xae\xc1\x80\x91\x55\x1c\x1a\x23\x15\xa1\xd7\xb0\xdf\xb5\x66\xc2\xb8\x9a\x83\x50\x9d\xdb\xfb\xcd\x05\x63\xe3\x54\xb6\xb6\x79\x61\x40\x9e\x93\x8f\x56\xf3\xd0\xcd\x32\x8d\xf0\xaa\xf7\x07\x99\x1b\x14\xc3\x63\x3e\x81\x72\x6e\x19\x6a\x38\xdd\x60\xf6\xc6\x9f\x34\x95\x73\xd5\xd5\xae\xc3\x10\x69\xd7\x65\x88\x2c\xc9\x33\xbe\xf5\xf5\xe7\xc0\xbe\xe3\x6a\x35\xe7\x14\xd2\x3d\x54\xe0\xd1\x81\x4d\x45\x75\xb0\xbb\xc6\xaf\x59\xd0\xe6\xac\x51\x64\x6f\xc2\xdf\xb5\x85\xf2\x6f\xd1\xa5\x88\x74\xd0\xa9\x88\x80\x2c\xbb\x6e\x20\x01\xe3\xdf\x7b\x62\x35\x1e\xa4\x7d\xcf\x22\xd2\xdc\xa0\xae\xae\x1a\x43\x5d\x57\xa6\x35\x72\x56\xcd\xb4\xae\x84\x5d\x65\x58\xb7\x7a\x76\x07\x8d\x3c\x48\x4b\x1b\xb7\xba\x6a\x84\x90\x0f\xb0\x76\x29\x04\x98\xe4\xc8\xef\x8e\xa5\x36\xef\xa9\xe8\x91\x33\x69\xec\x3f\x91\xf9\x7b\x2c\x99\x3e\x93\x06\x3e\xd9\x08\x52\xe2\x2b\x74\x48\x48\x67\x9c\x21\xae\x17\xc8\x4d\x17\xa2\xb5\x27\x9e\x27\xd8\x12\xc3\xe2\x54\x10\xa9\x3c\xc5\x82\x75\xa1\xdd\x10\x71\x58\xc1\x81\x23\xdd\x6a\x9c\xd8\x71\x62\x3a\xdf\x31\x9c\x1b\x0a\xb2\xbf\xf0\x1b\x00\xc9\x2c\x32\x48\xd0\x4f\x4b\x85\x58\xa5\x56\xd7\x34\x6c\xcc\x13\x92\x33\x35\x86\xc6\x87\x4d\xf2\xea\xe3\xab\xfd\xb9\x82\x57\xcb\xd3\x25\x9e\x4c\x0b\x5e\x82\x23\x1b\x54\xac\x0e\x55\x00\x1c\x0f\x8f\xb5\x9c\x82\x25\xf5\x3f\xc1\x07\xfd\xbf\xa4\xa0\x5c\x01\xb6\xa9\x8b\x1d\xc7\xdf\xb9\xe8\x4b\x3c\x8c\x1d\x61\xc1\xb7\x44\x05\x61\x58\x08\x64\x47\x9f\x57\x3c\x7a\xe4\x66\x22\x35\x1e\x86\xc1\xfd\xb1\x73\xcd\x66\x3b\xbd\x05\xd6\xdb\x39\x15\x3b\x55\x60\xb8\xc6\x6c\xe1\x10\x86\x0c\xc2\x1d\xf8\x6e\xe7\xf1\x74\x95\x56\x87\x6d\x17\x20\xf3\xf3\x13\x6a\xc8\x57\xce\xe6\x69\xdf\xcb\xfd\x2d\x0e\x14\xd9\xe7\x18\x13\x1c\x2b\x16\xf5\x71\x07\x45\x3d\xc7\x38\x67\x29\xd8\x94\xd9\xc5\x4a\xb9\x76\x40\x6e\x3e\xc5\xe0\x9f\x0b\x26\xd1\xff\xff\x58\x9e\x49\xe3\xad\xf6\x7f\x7a\xb7\x17\xf2\xdf\x47\x9e\x97\x39\x22\x26\x19\x6b\x29\xa4\x7c\xe4\x01\x5f\x7d\x66\x43\xdd\x5e\xa8\x9b\xad\x8e\x8f\x0d\x55\x63\xc8\x70\x74\xf6\x82\x67\xb3\x71\x26\x87\x34\x23\x39\x17\xf6\x31\x03\xf2\x5a\x2a\xc2\x3e\xd2\xbc\xc8\x18\x96\x93\x91\x2f\xfb\xff\x96\x82\x11\x17\x0d\xef\x11\x4f\x0b\x97\x24\x61\x24\x79\x89\x5c\x5b\x01\xbf\x87\x54\x87\x9a\x01\x16\xdc\x16\x9a\xbc\x3c\x78\x79\xf0\xe2\x15\xf9\x9d\xd8\xa1\x5f\xba\x7f\xbf\x70\xff\x7e\x49\x7e\x27\xbf\x13\x42\xce\x09\xa9\xfd\x4b\xe0\xdf\x3e\xe1\xa3\x78\x0e\x2f\xed\x34\x13\x99\xbb\x17\x06\x4f\x6e\xa8\xfa\x0c\xfd\x63\x8c\x74\x43\x43\xd1\x4f\x22\x73\x06\x73\x78\xf9\x7f\xfc\x3d\x10\x70\x35\xd8\xe2\x07\x26\xb5\x07\x53\xda\x27\x37\xe0\x9a\xca\xe9\x35\x9a\x65\x87\x89\x29\x69\x66\x1f\xbe\xf7\x45\xff\xc5\x3e\x91\xa2\x7e\xfb\x94\x4b\x68\x8d\xee\x66\xb8\xf7\x72\x7f\xb0\x30\xe5\x2f\x96\x4c\x79\xae\xdb\x8d\xab\xb9\xb3\x83\xde\xce\x35\x9e\x61\x0e\xc5\xec\x86\xce\x02\xdb\x78\xb3\x74\xcc\xa7\x01\x1b\x3d\xc2\xa1\x80\x98\x1d\x70\x01\xf7\xc8\x40\x38\xe8\x8c\x70\x33\x20\xa7\x66\x77\xd7\xf7\x56\xb2\x1a\xb3\x07\x71\x3f\x8e\xe1\x02\x81\xf0\xb0\xe8\x2f\xe6\x72\x7a\x5b\x34\xd6\xef\xc4\x39\xfa\x20\x14\x76\xf7\xf4\xca\xbf\xd1\x81\x53\x3d\x8c\xe5\x77\xb0\x15\xfd\x72\x84\x75\xb2\xd8\xe9\x68\x00\x6d\xac\x1c\xed\x5d\xc2\x08\xaa\xce\x6e\xf7\x70\x1d\xac\x27\x0e\xf9\xf7\x09\xcd\xe2\x60\x5d\x22\x01\xa0\x4d\x31\xdf\x28\x29\x4e\x2f\x0a\x7e\x29\xf2\x73\x75\x27\xa6\x15\x41\xfc\x15\x07\xfa\x16\xd3\xd9\x77\x86\x65\x72\xcd\x8c\x3f\x77\x14\x64\x44\x14\xa5\x21\x43\x9a\x51\x61\x35\x98\x05\x3f\x84\x91\x38\x18\xfe\x12\x18\x66\x09\xbf\x7c\xea\xf8\xc8\xc2\xee\x68\x2f\xf4\x7f\x9e\x1f\x32\x8a\xc8\x3a\x47\x61\xca\x68\xe6\x53\x29\x00\x1f\x3d\x00\x56\x89\xdd\xdd\x6a\x5f\xc1\xda\xa0\xf0\xab\x1c\xac\x56\x2e\xd4\xe4\x3e\xd9\xf3\xb9\x8f\xc4\xb0\x2c\x43\xee\xa9\xfa\x92\xd9\x4d\x16\x37\x3a\xe3\x30\x42\x5d\x06\x2c\xfd\x61\xbd\x3b\x1a\x06\xf5\xad\x64\x17\xb3\x50\x2d\xdf\x23\x04\x5a\x03\x8e\xf9\xd4\x0a\xa5\x95\x84\x06\x0a\xc6\x09\xcb\x0a\xa2\x58\x5a\x26\x38\x38\x21\xfa\x9a\xdd\x58\x9d\xaa\x7a\x53\xd7\x52\xc8\xb3\xec\x4e\x8d\xa8\x3b\x88\x11\x2d\xea\x22\x91\x8f\x80\x21\x7d\xc7\x4d\x36\x65\x6a\x46\x0a\xa9\x35\xb7\xeb\x00\x7b\x09\xb2\xe1\x40\xef\x0a\xc8\x3a\x90\x89\x05\xd3\xf2\x62\x78\xc7\x89\xdd\x1d\x2b\xa8\xb5\xac\x6d\x8f\x4f\x73\xd4\x7d\x69\x8f\x99\xbb\x8f\xba\x73\xf8\xdf\xe2\x91\x77\x3a\x22\x4b\x78\x30\xcc\xa5\xc6\x3c\x0f\x39\x05\xbf\x80\xc3\xea\xcb\xfd\xe8\x30\xfc\xf2\xe0\x8b\x83\x97\x7b\x76\xae\x5f\xec\xdb\x59\xd7\x8e\xb9\x97\xe1\x98\x0b\xbf\x74\x33\x62\xba\x76\xd0\x59\x03\x0c\x1b\xe8\x4a\x95\xba\x08\x8f\xcf\xa2\xb3\x33\xd2\xc6\xc5\xdb\x78\xee\xe5\x4b\x0f\xf8\xae\x62\xd6\x1b\x09\x3b\x07\xce\x5b\x6e\xc8\x67\xb9\x54\xec\xb3\xe8\xfe\x5b\x0f\xa8\xe6\xe7\x4e\xdb\x7e\x6a\x19\xd7\x06\x9a\xaa\x5d\xb3\xd9\x83\x35\xdd\x36\xee\xf5\xb6\xce\xf5\xc5\xb7\x40\x82\xe4\xb4\x78\xc0\x38\xae\x6f\x7b\x9b\x14\xde\x37\xce\x31\x1b\x5a\xc0\x83\xe3\x11\xb5\x22\xd7\xd7\x14\x6b\xa5\x42\x3e\xed\x90\x65\x12\x71\x4e\x5d\xea\xc0\x03\x52\xf5\x03\x2c\xbc\x36\x52\xd1\x31\x3b\x70\x8f\x7d\x2a\xed\x20\x5c\x17\xf8\x9a\x97\x09\xcb\x19\x1d\x48\xaa\x4f\x69\xf6\xf1\x07\x90\x02\x34\x81\x6c\x40\x20\x64\x0d\xce\x21\xca\x33\x7c\x22\xa1\xac\x06\xd5\xef\x6d\x1c\xa7\xf4\x46\x9f\x64\x54\x1b\x9e\x7c\x9f\xc9\xe4\xfa\xd2\x48\xd5\x81\x76\x71\xf8\xf3\xe5\xc2\xa8\xb5\x35\x15\xe4\xf0\xe7\x4b\x72\xcc\xf5\x75\x85\xae\x8f\xa8\x9a\xf5\x04\x3c\x1a\x80\x71\x5c\x2d\x06\xc9\xa9\xb5\xff\x98\xb7\xf1\x44\xc0\xf5\xed\x6e\xaf\xfc\x89\xde\x68\x86\xd3\x1f\xda\xe9\xdb\xaf\x59\x73\x11\xbc\x36\x20\x05\x7c\x9d\xd3\xe3\x35\x04\xbe\x46\xba\x69\xdb\x11\xb2\xc0\x4c\xaf\x79\xc6\x5c\x07\x30\x80\x04\xaa\x63\x3c\x03\xd7\xcc\x64\x49\x6e\x28\xfa\xac\x40\xa6\x0e\xc8\x15\x2f\x5e\x91\x93\x08\xaf\x15\x0b\x12\xea\x43\x59\x7d\x23\xe0\x87\xb8\x2c\x01\xe0\x32\x74\x5d\x59\x11\xec\xb2\x62\xc8\x09\x2a\x53\xfa\x15\xd9\x61\x1f\xcd\x57\x3b\x3d\xb2\xf3\x71\xa4\xed\x3f\xc2\x8c\x00\x5d\xd9\xf5\x68\xb0\x4a\x9d\x18\x31\x55\x19\x30\xf8\x83\xc5\xd2\xc1\xee\x99\x94\x5c\xbd\x3b\x7e\xf7\x0a\x14\xf8\x54\x92\x1b\xe6\xbb\x98\xf9\x42\x58\x27\x0d\x23\x32\x40\x45\x47\x22\xf3\x42\xc9\x9c\x47\xe9\xaa\xb0\xc9\x9a\xf0\x3c\xe9\xc2\x5f\x0a\x49\x69\xb0\xfc\x9d\x70\x10\x64\xfb\xfa\x21\xe7\x80\xe1\x6f\xe3\x9f\xd3\x11\x91\xe8\x94\xaa\xe7\xc8\x73\x1d\x6e\xb2\x1c\xe3\x46\xc1\x76\x5c\x15\x8f\x58\xf5\xdb\x7d\x75\x90\xb2\xe9\x81\x4e\xe9\xcb\x1e\x3c\x06\x19\xc0\x81\xdf\x87\x39\x51\x4d\x76\x5e\xee\x0c\xc8\xa5\xef\x6b\xde\x8b\xe7\x58\xdd\x67\xad\x01\x3f\x20\xb8\x55\x5f\xec\x90\x3d\x4c\x52\x07\x9d\x22\x63\xbe\x64\x39\x60\x6c\x80\x0f\x7f\xbf\x91\x0a\x49\x3a\x70\x5f\x90\xd6\x2e\x0c\xe2\x5a\x86\xbd\x13\x59\xe3\xd0\xde\x5c\x55\x95\x5b\x83\x1d\x03\xdd\xb7\x8c\x84\x0a\x02\xe6\xfa\xc1\xa2\xa8\xb8\x70\x4f\xac\x08\xc9\x85\xd3\x4e\xde\xda\xc5\xc7\x2e\xf0\x30\xc0\x9d\xcc\xb2\x03\xd5\x47\x3b\x1b\x73\x26\x91\x0e\xaa\xb9\x49\x38\x5a\xba\x59\x8f\xf7\x82\xff\x56\x32\x72\x7a\x1c\x7a\x36\x32\xa5\xb9\x36\x56\x72\xa5\x35\x1d\x81\xa3\xe2\xb0\x77\x98\xd3\x7f\x4b\x41\x4e\xbe\xbf\x74\x53\xd9\xdf\x40\x02\x37\x14\x80\xf4\xdf\xa5\x62\x56\x35\x6a\xad\x87\x1d\xfa\x91\xe6\x75\x2f\xfb\x39\x39\xa6\x86\xa2\x0a\x86\xd2\x4c\x56\x15\xa6\xb0\x13\x86\x90\xf9\xe3\xcb\x87\x1b\x6a\xd1\x64\xfd\x6a\x90\xe5\xa0\xb3\xe6\x98\x52\xf6\xe7\xef\x2f\x4e\xd7\xa0\x44\x25\x70\x0a\x8f\xdf\xca\xb4\x23\x4d\x0a\xe0\x3d\x8e\x70\x54\x92\xdb\x61\xc9\x99\x14\xac\x07\xc2\x8e\x58\x69\xe7\xfe\xf3\x67\xc5\xcd\x43\x2b\x26\xab\xab\xf5\xf1\xef\x57\xac\x93\xb7\xb6\x87\xff\x59\x54\x19\x0f\x30\x0e\x20\x55\x9c\x22\x30\xcc\xe4\x90\x38\x69\xb0\xce\x37\x7e\x7f\x71\xda\xd9\x0b\xbf\xbf\x38\xdd\xdc\x97\xed\xd0\x38\x98\xb7\x0d\x2a\xfd\xad\xc2\x5e\x9d\x57\xfa\x57\xd7\xf8\x07\x5d\xe9\xfa\xeb\xa2\xf4\x35\x17\x8d\xb3\xc2\xea\xa2\xe3\xc4\xd7\x47\xba\x48\x0d\x94\x64\xa7\xaf\x48\x5e\x66\x06\xca\xdf\x80\xb1\x2c\xa7\x69\x7b\x7a\x7b\x16\x23\x0e\x0a\x82\x90\x63\x86\xe1\x85\xf4\x95\x4f\x48\x08\xbf\x58\xfe\x83\xb7\x54\xd0\xb1\xbd\x1d\xce\x43\x92\xe3\x9f\x11\x47\xef\xa1\x03\x5d\x84\xaf\xe8\x94\xf2\x8c\x0e\x79\xc6\x0d\xb4\xff\xdf\x1f\x78\x45\x4c\x63\x2d\xac\x9d\xf2\xda\x84\x5a\xa7\x2a\x6c\x5c\x1f\x04\x0a\x26\xd9\xb3\xe3\x1f\xdc\x58\xc1\xbd\x3f\xa8\xb4\x57\x40\x23\x83\x44\x79\x54\x71\x6b\xaa\xad\x47\x79\x98\xd3\x6c\xdb\xb1\x6b\x53\xb5\x12\x96\xf9\x75\x43\x08\xe8\x45\xb5\xc7\x8e\xb4\x54\xed\x81\x2f\x1c\xe8\xc4\x33\xd7\x7c\xb0\x83\x54\x0b\xdd\x07\xb6\x4c\xc3\xdf\xb7\xd5\x7e\xb6\xfb\xe5\xfe\xab\x5a\xe0\x4e\xa8\x14\x83\x08\xe1\xd0\x73\x69\xd2\xb8\x83\x2e\x9d\xa8\xf6\xe0\x42\xa0\x5d\xd9\x7d\xd3\xa4\x88\x02\xaf\xd6\xd2\x35\x70\x6a\x27\x84\x40\xd8\x95\xc6\x1b\xa7\xe5\xfb\x24\xac\x98\x8c\xda\xd7\x40\x1e\xb1\x62\xf2\xfa\xb2\x1e\x4a\xb1\x9f\x91\xd7\x97\x4b\xe4\x1e\xe6\xca\xd8\xf7\xd6\x18\x60\xd9\xd5\x24\xe3\x23\x66\x78\x23\x22\xac\x59\xf2\xe5\x52\x70\x23\x95\x5e\x47\xcd\x87\x7b\x74\x37\x7a\xd7\x85\x27\x04\x79\xeb\xc6\xc5\x84\xcf\x44\x66\x19\x4b\x8c\xeb\x79\x08\xcb\xea\x1f\xbc\xcc\x11\xe2\x52\x01\xb4\xef\xf1\xeb\x9c\x1e\x07\xc8\x6a\x07\x17\x27\x87\xc7\x6f\x4f\x06\x79\xfa\xa7\x89\xbc\xe9\x1b\xd9\x2f\x35\xeb\x73\xd3\x4e\x57\x5a\x63\x51\x48\x07\x0e\x68\x33\xe9\x66\x01\x2b\x44\xa2\xf7\xba\xc2\x0c\xf3\x81\x5f\x25\xa5\x59\x44\x0d\x1b\x95\x59\x86\x6b\x6a\x14\x63\xbd\xd8\x9d\xf8\x40\x4c\xb5\xea\xda\x2c\xfd\x75\x77\x79\x5f\xdf\xee\x8f\xe6\x4d\xd9\x0c\xed\x4f\xf9\xa6\xaa\x31\xb9\x83\xf6\x97\x61\x64\x9f\xd0\x67\x19\xdf\xae\xc4\x35\x9b\x11\xc8\xee\x1f\x49\x05\x48\x9b\x75\x2e\x64\x26\x01\x72\x1d\x40\x4b\x45\xa7\x2b\x6c\x08\xa9\xdb\x68\x11\xf0\x22\x17\x6c\xf4\x38\x84\xbe\x60\x23\x2c\xa0\xf0\x39\xce\xce\xba\xa0\xa5\x99\x60\x26\x24\x22\x1f\x21\x39\x97\x52\xde\x55\x64\x6c\x08\xa9\x5b\xe5\xd2\x77\x51\xef\xd5\x06\x78\x9f\x2c\xac\x57\xec\x26\x74\x8b\x64\x1e\x1c\x57\x90\x53\x6b\x5b\xb2\x9b\x83\x1b\xa9\xae\xb9\x18\xf7\x6f\xb8\x99\xf4\x91\x52\xfa\x00\x70\xd8\x0e\xfe\x04\xff\xb8\x68\xed\x61\x9a\xba\xcc\xb2\x52\xb3\x51\x99\x61\xce\x97\x1e\x10\x5a\xf0\x9f\x98\xd2\x90\xc2\x78\xcd\x45\xda\x23\x25\x4f\xbf\x6b\xba\x62\xa4\x8b\x0d\xd2\xbc\x8b\xd8\x9d\xe7\xa2\xf2\xe2\x47\xd1\x54\x6a\x44\xe1\xb5\x24\xaa\xb1\x3e\x4d\x73\x2e\x36\x85\xf3\x9b\xaa\xf6\x5c\xa4\xcd\x28\x58\xa7\xde\x11\x8c\x53\xd7\xed\x71\x6c\x1f\x33\x0e\x59\x34\xd4\xfb\x32\xb0\x4b\x95\xcb\xa7\xa9\x67\xd3\xac\x24\x50\xf2\x99\xfe\x2d\xeb\xe3\x53\xfa\x45\x5a\xd1\x75\x9b\x1a\xf3\x90\xeb\x31\x53\x63\xba\x75\x7f\x7f\x82\x84\x97\x47\xe5\x31\xb2\x55\x7b\xd7\x40\xeb\xf6\x9a\xee\x23\xe8\x5f\x80\x03\xaf\x7d\x71\x32\xa8\x57\x28\x7b\xbc\x6f\x0b\x3b\xf3\x05\xe0\x61\x5f\x66\x94\x48\x21\x1c\x26\xdd\xbb\x82\x89\x4b\x43\x93\xeb\x96\x71\xd1\xad\xce\xf4\x07\xd3\x99\xba\xcd\x95\xf1\x69\xd0\x69\xe0\x51\xac\xa2\x72\x29\x65\x55\x96\x34\x6e\xec\x27\x28\x75\x11\x61\xfd\x2d\x2d\xda\x7b\x40\xfd\x48\x73\x8a\x52\xf8\xd8\x39\x3d\xa1\xaa\xa6\x90\x45\x99\x21\xe4\x1a\xd7\x8e\x8e\x9f\x5e\xb1\x69\xbb\xc1\x9d\xbe\xdc\x5d\xce\x48\x25\x43\x73\x99\x32\x32\xe4\xa6\x92\x8e\x9a\x19\xac\xdd\x75\x40\x34\x52\x90\xc4\x81\xcd\x81\xd6\x61\x35\x0c\x37\xa1\x48\x23\x11\x44\x26\xc6\xd7\xfc\x85\x32\xdf\x17\x2f\x5e\xbc\xc0\xa2\xcb\xbf\xfe\xf5\xaf\x44\x2a\xe8\xf8\x90\xf0\x7c\xf1\x46\xb8\xeb\xcf\x2f\x5f\x0e\xc8\xdf\x0f\xdf\xbe\x81\xdc\xff\xc2\x68\xc4\x01\xc7\x91\xed\x0d\xb5\x1f\xeb\x1e\xf9\xbf\x97\xef\xce\xbc\xda\xa8\xe7\xbe\x05\x53\x3b\xbc\x5e\x1d\x7d\xf1\xc5\x5f\xbe\xfa\x6a\x40\x8e\xb9\x82\xda\x27\xce\x42\x6b\xae\xe0\x2d\xa1\x8a\x61\x91\x28\x40\x04\x7a\xbd\x8a\x07\x10\x7d\x87\x9f\x80\xbd\x07\xb1\x9e\xd1\x72\x60\xc6\x13\x83\x65\x56\x28\xc8\x42\x57\x61\x00\x6e\x74\x50\xa8\x2e\x59\x17\x26\xd7\x23\x19\xbf\x66\x64\xa4\xa1\x25\x67\x55\x4c\xef\xda\xdd\xb8\x92\x12\x1c\xac\x5a\x2b\xcd\xcc\x13\xcf\xfd\x6c\xe5\x0b\x9e\x07\x30\xae\x35\x5c\x83\x52\xcf\x6b\x36\xeb\x23\x87\x15\x94\x87\x82\x11\x48\x8e\xab\xf5\x58\x08\x5e\x9b\x34\x92\x2b\x1e\x63\xb1\x50\xf2\x5f\xb8\xf8\x50\x43\x1a\x49\x62\xa8\x44\xc5\x16\xb5\x00\x96\x20\xa2\x86\x1d\xbe\x0e\xd6\x35\xf5\xf2\x1f\x3b\xa4\xd0\x45\xb8\xe5\x8c\x6b\xfb\x88\x6b\x36\xd3\x77\x3d\xb9\xea\x15\x63\xf9\x53\x23\xa7\x94\x62\xe1\xd7\x0e\x79\xdf\x49\x46\xd7\x64\xc1\x21\xde\x54\x63\x60\xf9\xbf\x2b\x84\x76\xf7\x7a\x2a\x05\x42\xd4\xd2\x95\x35\x33\xa5\x23\x0d\xe4\x9d\xdb\x67\x43\x03\x00\x78\xc3\x9c\xaa\x6b\xe6\x3b\xf3\xd2\x6c\x40\xce\xed\x24\x03\xe4\x48\x68\x8c\x0c\x76\x2b\x9d\xc1\x63\x9d\x92\x06\x0f\xd9\x1d\x0c\x76\x71\xe3\x49\x45\xb4\xa1\xca\xed\x22\xfb\xf9\xf3\x40\xb1\x7a\x4b\x0b\x8d\xa8\x2a\x56\x2b\x05\xc4\x21\x09\x48\xad\x66\x52\xf5\x05\x44\x5a\x6f\x91\xa7\x48\x1f\x08\xd3\x78\x80\x4d\x44\x9d\xba\x72\xb2\xc1\x48\xbf\xbd\x37\x02\x0b\x29\x6f\xa1\x54\xe0\xd5\x4a\xb5\x70\x30\xbb\x19\x7b\x52\xba\xc4\xf2\xb6\x1a\x4e\x52\x46\xda\xda\x5c\x33\xcf\xa7\xaa\x32\xe0\xd5\x85\xe2\x80\x57\x7b\xf5\x01\xaf\x36\x01\x5d\xbc\x16\x76\x68\x38\xa9\xf0\x30\x1a\x55\xa4\x07\xd0\xf3\x22\x1c\xf1\x46\x62\x87\x10\xdf\xe9\x46\x10\x3a\xd4\x32\x2b\x0d\xfe\xb4\xfa\x32\x3e\xe6\x60\x50\x0f\xbe\x04\x67\x5b\xb8\x2d\x3a\xf4\xe0\xb8\xc7\x73\xa2\xcd\xf9\x87\x57\x6b\x31\xd1\x59\x1b\xe4\xe7\xed\x55\x68\x4d\x67\xaf\x3b\x75\x93\xeb\xe4\x8a\xa1\x6e\x26\xcc\x65\x21\x44\x7a\x9d\x15\x9e\x56\x24\x80\xd2\xe8\x55\x34\x6c\x3b\x9e\xae\xc5\x4b\x98\x68\xde\xde\x2d\x70\x79\x4a\xf6\x42\xbb\xd1\x90\xce\x76\x2a\x0c\x53\x23\x9a\xb0\xfd\xd8\x5d\xc0\x8a\x09\xcb\x99\xa2\x59\xc8\x50\xf6\x75\xca\x13\x2a\xd2\xcc\x15\xef\x33\x05\x1b\x97\x7d\x34\x4c\x09\x9a\xc1\x23\x52\xc5\xa7\x4c\x69\xb2\xf7\x3d\xb3\xb6\x04\xb6\x29\xdd\x7f\x82\x69\xa4\xf8\x22\xeb\x70\x66\xc0\x83\xbb\x49\x00\x85\xa1\x96\x75\x4a\xac\x96\xca\x63\x16\xd9\x65\xd5\xb1\x1b\x68\x60\x37\x04\x9c\x98\x20\x74\xa1\x23\x10\x46\x23\x7d\x03\x3c\x00\x2e\x4e\x0c\x0e\x4c\xb5\x6b\x88\x07\x88\x30\x4e\x9e\x3b\xa8\x90\xb5\x95\x02\x7c\x92\xa2\x8b\xbb\x4a\x26\x46\xce\x80\x94\x53\x9e\x7a\x35\x08\xb2\x19\x2a\xd4\xad\x82\xea\xa8\x92\x9f\x6a\x2d\x5d\xbf\xcf\x68\x8d\xd0\x1c\x05\x65\xa9\x8e\x29\xed\x23\xc5\x71\xbc\x4b\x02\x32\x6b\xa3\x86\x16\xa4\x93\x03\x51\xa6\xec\xbc\x1c\x66\x5c\x4f\x2e\x3b\x0d\x6d\x9c\x2d\x19\x18\x13\x03\x17\x92\x4b\x6e\x0d\x77\x68\x26\x34\x77\xfd\xc7\x50\xcd\xe2\x56\xcb\x96\xb0\x0c\xfe\xd7\xf1\xee\x90\x50\x28\x0e\x5d\xcd\xfc\x57\xd1\x3c\x1c\x72\x07\xb6\xd3\x49\xd9\x7b\x51\xd4\x3e\x4f\x68\x96\xe9\xf9\x46\xd2\xfe\x20\x43\xcd\xd4\xa3\x79\x20\x57\x70\xcb\x30\x7e\xf6\x90\x35\x83\x52\x2c\x20\x9b\x2e\x7d\x31\x4d\x72\x89\x15\xff\x82\x48\xe1\x6f\x82\xae\x40\xfe\x07\x81\x42\x88\x37\x86\x4c\xb7\x46\x4c\xc9\x6d\x4c\xe7\xe9\xc5\x74\x3a\x8d\x0a\x5f\x86\x16\x0d\x14\x06\xee\x43\x61\x93\x6f\x34\x4b\x43\xe1\x7f\x65\x38\x0e\xee\x0b\x1f\xaf\x2d\x82\x8b\xf3\x3b\x34\x0e\x16\xb4\x1b\xbf\xed\x4f\x73\x83\x82\x2a\x66\x2d\x6f\x10\x4c\x7d\x67\x5b\x27\xd1\x4e\x72\x26\x71\xd8\xde\x8b\xe2\xac\x3a\xd3\xe1\x38\xc7\x0f\x77\x35\x49\x65\x52\x5a\x9b\xab\x22\x7b\x95\x30\xd1\x0e\xed\xfd\x79\xc1\xcf\xa6\xf2\x46\xdc\x50\x95\x1e\x9e\x37\xaa\x5a\xad\x2b\x67\xd5\x58\xb1\xea\xed\x1f\x41\xec\xe7\x74\xe8\x1b\xfe\x07\xf0\xa7\x6d\xe0\x6e\x7e\x88\xfb\xbc\x6b\xae\x0d\xf8\x6a\x71\x3a\xb2\x0d\xfd\x6d\x43\x7f\xcf\x26\xf4\x67\x47\xaa\x77\x4a\xa9\x89\x17\xe7\x90\xb5\x14\x7f\x16\x31\xa4\x48\xa4\xe2\xe9\x39\x5f\x0f\x3b\xa7\xf3\xe3\xe6\xad\xb8\x2e\xb2\x13\xbc\xcc\x05\x75\xec\x39\xc4\x9b\x36\x20\x5e\x04\xb4\x6c\x61\x0c\xe2\x75\x5b\xa9\x18\x22\xb5\x62\xe0\x39\x8a\x60\x17\x32\x7d\x85\xc0\xa9\xd0\x39\x1d\x7b\x76\xf4\x1c\x6e\x73\xcf\xf9\x2e\x44\xd4\x2b\x1c\x5b\x33\x7b\xf5\xa7\x93\x98\x40\x4b\x06\x20\x1d\x31\x01\x01\x46\x00\xea\x9c\xb7\xe1\x06\xd2\x19\x47\xd8\xab\x32\x74\xda\x8e\x34\xaf\x40\xe3\xa8\x9e\x11\x74\x32\x61\x39\xf6\x0f\x7f\xed\x49\x60\x65\xa3\x35\x1e\x0c\x43\x84\x34\xa6\x72\x4d\xe4\xa8\x57\x83\x50\xd8\x99\xbe\xdc\x69\x17\x63\x20\xdd\x85\x23\x89\xdf\x47\xe7\xad\x63\x3b\x64\x9e\x60\xe7\xb5\x90\x8e\xdd\x43\xa0\xf3\x64\xd8\xba\x78\x2e\xcb\x02\xce\x0f\xa4\xf0\xc6\x10\x67\x53\x62\xb5\xbd\x10\x35\x78\x02\xca\xdf\x36\x56\xfb\x1c\x63\xb5\xd1\xc1\xe8\x05\x9d\x23\x6c\x1c\xbf\x8d\x43\x02\x3e\x88\x3b\x64\xde\xa8\x71\x36\x8c\x8f\xe0\xfa\xf0\xad\x54\xf5\xd4\xa4\xdd\xc1\x60\x77\xd7\x07\x75\x1d\xdf\x97\x66\xd4\xff\x9a\x30\x91\xc8\x14\x99\xc5\x8e\xaf\xb4\x01\x75\xaf\xf2\xb2\xc5\x73\xc9\xfd\xb3\xe2\xf4\x26\x18\xbb\x8b\xa5\x6e\x2d\x5b\x3c\x1a\xdf\xeb\x47\x50\x62\x2a\xd5\x25\x60\xfe\x39\x12\x05\x4c\x67\xa7\xc3\xf8\xef\x35\xc9\x78\xce\x5d\xff\x30\xbb\xd1\x99\x36\x9a\xec\xe1\x87\x83\xa4\x28\x7b\xee\x86\x41\xce\x72\xa9\x66\xbd\x70\x93\xfd\xb2\xf6\x2b\x77\xc7\x3e\xf6\xa1\x28\x95\x62\xc2\x64\xb3\xe7\xac\x01\x79\x22\x6e\x88\x02\x14\xd6\xb8\x0d\x92\x47\x75\xcd\xd5\xcc\x85\x88\x2f\x78\xcb\x23\x8c\xfd\x00\xd6\xaa\x7b\x21\x24\x01\x9f\x32\x31\x25\x53\xaa\x1e\x88\x9e\xbe\xec\xea\x50\xe7\x49\xf9\x94\xeb\xb6\xcd\xfd\xc8\xed\x4e\x68\x68\xdd\x55\x9a\xa2\x34\x4e\xa2\xfb\x1d\xe8\x91\xb6\xc3\xce\x9b\x53\x0e\x5f\xee\xb4\x9e\x52\x41\x8d\x61\x4a\xbc\x22\xff\xbd\xf7\xe1\xf3\xdf\xfb\xfb\xdf\xed\xed\xfd\xf2\xa2\xff\x9f\xbf\x7e\xbe\xf7\x61\x00\xff\xf1\xd9\xfe\x77\xfb\xbf\xfb\x3f\x3e\xdf\xdf\xdf\xdb\xfb\xe5\xc7\xb7\x3f\x5c\x9d\x9f\xfc\xca\xf7\x7f\xff\x45\x94\xf9\x35\xfe\xf5\xfb\xde\x2f\xec\xe4\xd7\x15\x07\xd9\xdf\xff\xee\x3f\x5a\x4f\x9d\x8a\xd9\xbb\x96\xa2\x10\xaf\x7e\x87\x47\x72\x7d\xc4\x4e\xd8\x6f\xae\xb5\x02\x17\xa6\x2f\x55\x1f\x87\x7e\x45\x8c\x2a\xdb\x09\x93\xea\x78\xe9\x7a\xff\x57\x6a\x40\x05\x39\xef\x95\xfa\x35\x6f\x70\x88\x78\x1e\xf3\x0e\x0a\x83\x4f\xdc\x48\xf5\x8a\x17\xc3\xf2\x42\x2a\xaa\x66\x24\x75\xde\xcc\xd9\x12\xc0\x9f\x08\xf1\xa7\x35\x9a\x2e\xbc\x51\xca\xd5\x1a\x6a\x83\x5b\x03\xf8\xb0\x94\x97\x79\x37\x4e\xf8\x9f\x01\x79\xde\xa1\xd6\xfb\x04\x22\x7c\x80\x0f\x5f\x0c\x69\x72\x8d\xf6\x52\x58\x1b\xd4\x12\x63\x10\xe9\x1d\x97\xf7\x90\x33\x2a\x82\x1b\x1f\x32\x59\x64\xca\xec\xc2\xf9\x9b\x71\xec\x9a\xcb\x1d\xc3\xe9\x2e\x4b\xb0\x6a\xc3\x24\x15\x79\x0b\xea\xce\x5a\xd7\x9a\x74\x02\xdb\xc1\xff\xcd\xde\x58\x1d\xaf\x23\xb8\x78\x09\xc6\xa4\xc3\xc8\x1a\x41\x23\xa9\x2a\xfd\xab\xa6\x36\xc0\xba\x85\x3d\xe7\x83\xb3\x76\xf5\xec\x9c\x50\xf1\x04\xaf\x73\xa6\x31\x17\x85\x27\xd0\xe8\x08\x0c\x4f\xa0\x7e\x58\xb1\xab\xa8\x21\x62\xa9\xed\x93\xa4\xa8\xdf\x53\x3d\x08\xfb\x40\x0d\x91\x05\x5c\x7b\xc3\x39\x73\xd9\x7e\x73\xe9\xe9\x12\x39\x2b\xa0\x9c\xd8\xdb\x96\xba\x04\x0b\xc4\x3d\xc5\xe9\xd1\x72\x04\xd9\x12\x51\x43\x1a\xdf\x73\x65\x81\x2f\x05\xcf\xea\x8c\xe9\x1b\x2d\x84\x17\x2f\x85\xcb\x16\x5c\xe0\xb2\xe5\x4c\x56\x6a\xa6\xfa\xe3\x92\xa7\xdd\xb1\xd7\x93\xd3\x29\x5a\x6a\x12\x5d\xe9\x0f\x9d\x68\x0d\x9d\xeb\x0a\x21\x1f\xb3\xf5\x59\xb9\x73\x12\x52\x3b\x6b\x87\x65\xdc\x18\xa2\x9e\xe6\x49\x43\xc3\x2f\x2f\x0c\x7c\x2e\xc1\x55\xf0\x13\xb9\x43\x34\x99\x25\x0e\x54\x89\xd7\x7a\xd3\xe0\xb0\xb8\x27\xa0\x22\xaa\x6f\xff\xcf\xfb\x93\x7c\x08\x75\xc8\x46\x98\xc5\x84\xbf\x01\x37\x80\xab\xe3\x4a\x59\xc6\x0c\x94\x65\x31\x51\x75\xbc\xd3\x44\xb1\x5c\x4e\xed\x36\xfb\x20\xc8\x7b\xed\x82\xe1\x7c\xf4\x8a\xd0\xfd\x5a\x61\xb0\x6b\xb3\x2b\x18\x4b\xb1\xb8\x2b\x6a\x9c\xa7\x4a\xa1\x7b\x64\xb8\xef\x93\x55\x35\xf6\x76\x54\xe0\x31\x73\xed\xab\xc0\x49\xa5\x98\x25\x00\xc0\x43\x29\x99\x13\x2d\x68\xa1\x27\xd2\x80\x3f\x84\x16\x34\xe1\x66\x66\xc9\x6d\x14\x4d\xae\xa1\x45\xb4\x62\xee\x89\x3d\x92\xec\xbb\xac\xf5\x98\x82\xf5\x92\x33\x33\x51\xb2\x1c\x4f\xa0\x06\x0a\xef\x4a\x32\xaa\x3d\x01\x96\xfe\xde\xd9\xe8\x9a\xa4\x33\x41\x73\x9e\x84\xd6\x19\x4a\x4e\xb9\xe6\xd2\x45\xb2\x70\x5c\xbb\xc7\xc8\x79\xe8\x31\x80\x01\xb2\xa3\x8c\xf2\x9c\xec\x69\xc6\x48\x60\x0c\xfc\xe6\x12\x95\x45\x74\x16\x2a\x66\x7f\x1e\x47\xcf\x1c\x8a\xa2\x83\x0a\xb0\x9f\x54\x32\x38\x24\x24\xa0\x12\x00\x9b\x3b\x5d\xfe\xe8\xfd\xb0\x74\xcb\x67\x26\x15\x24\xb4\xf9\xee\x37\x4c\xa4\x32\x4a\x7d\x39\x3c\x3f\xd5\xb1\x21\xeb\x7a\x06\xe2\x48\xf0\x45\x26\xc5\x38\x06\x99\xab\xb8\xd4\x0a\x7c\x01\xfd\x1f\xa7\x3c\x2d\x69\x86\xa2\xde\x4d\xe6\xe8\xf2\x14\x7f\xce\xc7\x13\xd3\xbf\x61\xe0\xe6\xc4\x13\xb1\x4a\x8d\xf6\x0f\xe5\x0b\x29\xb5\x5c\xc3\xd1\x60\x9c\x3b\x0d\x5d\xc6\xd0\x61\x91\xce\x00\xa1\xd6\x25\x6f\xd6\xb2\x6e\x3c\x52\x3b\x0e\x11\xe8\x1e\x11\x1d\xa6\x77\x18\xba\x01\x5a\x6d\x08\xfc\xc0\x96\xca\xc0\xb5\x8b\x73\x83\xd6\x86\x55\x5f\x89\xf0\xb1\x89\xba\x8b\x82\xe6\xfb\x41\xa0\x47\x17\x82\xc5\xc3\x28\x77\xbb\xea\xda\xe8\x90\xa6\xa1\xa8\xd3\x6d\xc3\x1f\x98\x60\x8a\x27\x73\xac\x13\x7e\x3a\xa6\x06\x36\x1f\x13\xf6\x67\xe9\xa0\x89\xa9\xbc\x66\xbd\x78\x5a\x31\xe3\x15\xcb\x8b\x8c\x9a\x6e\x32\x55\x76\x7e\x8e\xbc\xe9\x51\x2c\xda\xee\x7e\x2a\xd2\x3e\xcd\x2c\xdf\x9f\xff\x74\xe4\xea\xe1\x70\x3f\xd7\xb2\xe1\xae\xaa\xce\x9f\xa8\x8e\xa0\x5e\xb6\x74\x1b\x03\x88\xda\x90\xa5\x20\xfe\xdc\x93\xc1\xe5\x71\x23\xb0\x15\xac\xfd\xe3\xfc\xa7\xa3\x1e\xe1\x03\x36\xf0\x7f\x85\x5b\xbd\xfc\x35\x72\x8c\xf5\x12\xa1\x0e\x07\x76\x0d\x4c\x25\xf6\x25\xc7\xbf\xfd\xe7\x37\x76\x92\xf6\xdb\x6f\xfb\xdf\x44\x9d\x83\xbe\xfd\xa7\xe5\x23\x65\x6f\xa8\x7f\x1a\xa7\xab\x83\xa4\xb5\x7f\xfd\xf3\x5c\xa6\x97\x05\x4b\x06\xf8\x5a\xfa\x9f\xae\x8f\x3a\x13\xc6\x2a\xf3\xe7\x12\x12\xd5\x78\x8a\x7b\x09\x9e\xad\xd8\xbf\x7c\xbc\xc1\x35\x20\x75\x12\x2b\xa1\x86\x09\x38\x72\x7c\x5d\xb2\x90\x06\x7f\x8e\xad\x4b\x61\xfe\x7b\xa3\xb8\x9b\xa8\x91\x12\x84\x09\x0a\xac\x43\x41\xd8\x47\xae\x01\x85\x06\xdf\x15\xc8\x41\x5d\x2e\xbc\x3f\x45\xed\xb0\x96\xc2\x01\x75\x08\xda\x99\xda\xb9\x7d\x26\xa4\xf9\x2c\x2c\xbf\xcf\x73\x84\xa3\x52\x12\x3a\x95\x80\x74\x01\x87\x88\x20\xa5\x00\x47\x79\xd5\x0d\x70\x38\x23\x39\xd7\x86\x5e\xb3\x01\xb9\xb4\xa7\x64\x9c\xb0\x80\xd4\x13\x04\xfa\xb9\xb0\x94\x94\xc2\xf0\x0c\xbe\xad\xc6\xb1\x53\x8e\x4f\xcf\xd3\x11\xd1\x65\x02\x2d\x6f\x15\xeb\xfb\xf3\xd8\xdd\xb5\x20\xc9\xaa\x77\xe9\x85\xc5\x9e\x50\x34\xd0\x8a\x14\x7e\x8a\x0d\x74\x85\x63\xaf\x85\xec\x6c\x3b\x4f\x29\x92\xea\x0c\x06\x62\x42\x17\x65\x7b\xec\x66\x3e\x9f\x08\x6d\x45\x17\x7f\x10\x2c\x61\x5a\x53\x35\xc3\x06\xa3\x3c\xf4\x41\x74\x89\xb3\x20\x94\x72\x2a\x4a\x18\x40\x31\xec\x56\x5b\x26\x40\x1d\x4a\x86\x4a\x5e\x33\x11\x2a\x12\x82\xc0\x0b\x69\xd9\x55\x12\x2a\xa4\x03\x48\x92\x4c\xa8\x18\xb3\xaa\xe8\x3c\xa7\x29\xd0\xfe\xc7\xa0\xdb\xf9\xf7\xb1\x14\xa0\x23\xab\x22\x71\x03\xa4\x18\xda\x83\x30\x44\x51\x3e\x08\xe2\xdd\x30\xbd\x2a\xcc\x61\x5f\x89\x67\x8d\x64\x22\xe9\xc6\xaf\xde\xde\xa3\xde\x07\xfd\x65\x8d\x29\xe0\x39\x33\x34\xa5\x86\x76\x96\x06\xfe\x96\x86\x46\x9a\x2e\x47\x04\xd8\x21\xca\x1d\x71\x27\xb9\x57\x5e\x65\xc1\x63\x18\x02\x90\x06\x13\xbf\xfa\xd8\x83\xde\xf2\xb5\x8b\x61\x62\x76\x37\xa8\x86\xae\xbd\x3a\x0c\xef\x47\x43\x91\xc5\x52\x92\x96\xa0\x68\x56\x22\xad\x4d\x8c\xbd\x93\x10\x8c\x5d\xe8\xce\xa8\x7c\x55\xa5\x12\x24\xf5\x54\xef\xa5\x6a\x20\x9e\x75\x4c\x18\x8e\xad\xd2\x3d\x6e\x84\x23\x7e\x29\x70\xab\xce\x2d\x03\xac\xd3\x98\x19\x5d\x25\x69\xe2\x69\x62\x45\xa4\x3b\xcb\x9d\xdb\x02\x8e\x1a\xb7\x34\xce\xf2\x5f\xae\x8f\xe2\xc2\x69\xe9\x4e\x0b\x7b\x7e\xad\x7d\x65\xba\x8b\x45\x61\x47\xd9\xb7\x32\x6d\x1f\xd4\x9a\x6b\x8d\x5a\x0d\x5c\xd5\xac\x60\xfd\x92\x06\xb7\x12\x3e\x19\x42\xfc\xba\x86\xaa\x81\x47\xc0\x84\x4e\x9b\x7b\x67\x2b\xfd\xb7\x1f\xda\x9e\xc1\xe3\xfa\xf0\xb8\xfe\xcb\xb6\x7e\xf0\xf6\x49\x90\xfe\x6a\x99\x0c\x59\x9f\x50\x07\x81\x0f\x2b\x5a\x2f\x3b\x89\x4b\xcc\xf7\xa6\x0c\x27\xaf\x4b\xf1\x08\x69\x35\xae\x30\x97\x71\x2b\x2f\x5f\x91\xcf\x6a\xba\x96\xd3\x69\x83\xe5\x8d\x55\x50\x7b\xde\x14\x1f\xb8\x25\xf7\x10\x5f\xf5\xdb\xf7\xe7\x06\x03\x25\x6f\xb9\x55\xea\xab\xad\x82\xe2\x6d\x95\x64\xe8\x69\x1f\x8a\x5d\x2d\x1b\x2b\x99\x65\xbe\x11\x3a\x9a\xe2\x73\x49\x52\xd0\xb7\x07\xc3\x2e\xbd\xe0\xf2\x08\x9a\xbe\x60\x37\x41\xa5\xa3\x1a\x91\x4a\x7d\xd0\x1f\xdc\x32\x3e\x73\x6d\xd9\x78\xa1\x22\xec\x50\xcc\x70\xea\xc7\x61\xb1\x6e\x33\xc0\x7a\x3e\x45\xc9\x12\x1e\xe6\x42\xb3\x1b\x3a\xd3\xb0\xbf\x2a\x8b\x30\x3c\xdf\xe1\xb6\x57\x03\x5f\xb0\x51\x8b\xe6\xec\xf1\xd5\x59\x5a\x40\x77\x89\x01\x80\xca\xc2\x45\xf3\x6c\xdf\x6a\x98\x06\xfd\xac\xe7\xaf\xee\xf2\x0b\x20\xc5\x12\xf2\xab\xba\x08\xd4\xd6\x9b\x0e\x9d\x9f\xc2\xc0\xde\x66\x1b\xc3\x1f\xfe\x2c\x0f\x11\xc7\x21\xb3\xfb\xad\xc2\x92\x02\xde\x8d\x7f\xbb\x24\x01\xad\x62\xfa\x1f\xa1\x31\x91\x0b\xed\xf8\xc2\x62\x7b\x14\x1c\x9e\x9f\xe2\x13\x07\xd0\x7a\x96\x8a\x99\xd3\xb2\xcc\x84\xab\xb4\x5f\x50\x65\x66\xe8\x1c\xe9\xd5\x9e\x16\x8a\x2a\x3b\x20\x47\xa7\x31\xe6\x36\x9d\xcb\xe2\xab\xb6\x46\x40\x3e\xb7\x3e\x3e\x28\x77\xeb\xca\x6c\x1a\x45\xda\x96\x78\xfa\xab\x5e\x47\x1c\xa1\x91\x79\xaf\xc5\x93\xa0\x48\x1a\x0b\xe2\x6e\x4f\xe4\xb9\x4c\x18\x3c\x58\x41\x5f\x76\xbe\x25\x19\x97\x9c\x05\xfd\x0c\x0c\x7d\x3b\xad\x1e\xe1\x23\x7b\xa4\x49\xd1\x77\xf5\xed\xc1\xf5\xee\x74\x3c\x9f\x32\x8a\x46\xbb\xdd\xac\xe8\x50\x8d\x9f\x15\x0f\x10\x76\x37\xd9\x13\x52\xe0\x8e\xc7\x7b\xf7\x31\x63\xf6\x16\x8f\x31\xdc\x32\x20\x3f\x4f\x98\x88\x8f\xbb\xd8\xd7\xde\x0b\xc7\x2e\x17\xa9\x5d\x6e\x38\x0b\xc1\xf6\xd7\x65\x92\x30\x16\xbc\x45\x71\xef\xf5\x4a\x22\xb9\x29\xe7\xd4\x24\x13\xa6\x89\x96\x00\x3e\xaa\x0d\xcd\xb2\xca\x4b\xe3\xc8\x25\x41\x73\xf0\x0e\xfa\x48\xa1\xa8\x95\x85\x3b\x87\x55\x91\x51\xe7\x15\x19\x95\x22\xc1\x9c\x2c\x6e\x66\x7e\x06\xf1\x09\x0f\x3f\x03\xd3\x54\xa3\xf3\x86\x8f\xd0\x1b\x1c\x99\x98\x81\x98\x20\x52\x67\x28\x44\xeb\x67\xbd\x83\xdd\xb3\xf2\x73\x48\x93\xeb\x1b\xaa\x52\x0d\x15\xef\xd4\x70\x6c\x2a\xd8\xab\x0d\xbb\x17\xcd\xc1\x3e\xbd\xa6\x1b\xec\x07\x43\x16\x1a\x4a\xcb\xb9\xc7\x10\x5a\x1a\x99\x53\xc3\x13\x70\xd1\xf0\x51\xe4\xdb\xcf\x43\x9f\x87\x10\xa7\x45\x59\x0e\xa7\x83\x7b\x0d\xb0\xd6\x14\x56\x68\x98\x1b\x49\x78\x6e\x75\x2e\x0a\x0d\x93\x47\xa1\xbe\xdd\x07\x22\xee\x9a\xa9\x55\x2c\x7f\x86\x30\x50\x74\x17\x3a\x7f\xac\x59\xae\x61\xf8\x10\x67\x08\x0e\x76\x57\xc8\xdd\x9b\x53\x89\x88\xff\x95\xe5\x6a\x3b\xdb\x88\x59\x7b\x76\x81\x6e\x98\xd5\xb5\xf4\x9d\x2c\xab\x07\xcb\xe6\xc4\xc7\x02\xab\x7e\xb9\xf6\x0e\x03\x97\xc6\xbd\x97\x2a\x59\x14\xce\xf5\x97\xef\x2f\xce\x09\xa2\x7b\x6a\xca\x34\x44\xb6\x7d\x6a\xb8\x25\xc5\x98\x09\xa6\xa8\x81\xf8\x80\x43\x2b\x84\xdd\x3b\xff\x10\xc8\x1a\x26\x11\x98\xf9\xde\x61\x56\x4c\xe8\x3e\x79\xef\x9a\xe6\x07\xfe\x0d\xb9\xe6\x2b\x69\xa4\xe8\x4c\xf4\x51\x81\xad\x2a\x79\xd7\x30\x5b\x55\x72\xab\x4a\x36\xb8\xb6\xaa\xe4\xfc\xb5\x55\x25\xe3\x2b\xa4\x33\x77\xab\x46\x5e\x84\xfa\x84\x28\xbb\x24\xce\xd7\xaa\x0a\x18\x1e\xdf\xcb\x17\x9e\xb5\x41\x27\x4c\x97\xb2\x18\x53\xd7\x3a\xe7\xe9\xdd\x37\x98\x12\x87\x1f\x0e\xdd\x52\xf9\x2c\xbd\x2a\x43\xd0\x6a\x89\xa5\x61\xd1\x92\x3a\xe5\xe1\xc1\x6b\x58\x43\x7d\x39\xc0\xce\xd6\xfd\x30\x6c\xbf\x4a\xca\x6b\xdc\x08\x30\xbe\x3a\x5c\x4d\xd2\x39\x3c\x49\x7c\x3d\xb9\x1c\xbe\xfa\xd5\x59\x6d\x00\x79\x94\xfa\x00\xd2\x7d\x8d\x00\x79\xfc\x3a\x01\x12\xea\xb6\xba\xdf\xf7\x17\xbe\x8e\x6c\x6e\xe7\x3b\xd1\x7d\xd7\xce\xaf\xe1\x94\x85\x71\xb8\x26\x32\xe7\xc6\x30\x9f\x57\x11\x76\x32\x78\xc3\xe3\x3a\x1a\x27\x73\xc0\xec\xc6\xe4\x09\xf6\x31\x74\x5a\x8a\xf4\x39\xd0\xca\x6e\xb8\x06\x23\x82\x0a\x6b\x02\x22\x5c\x2c\xc8\x8e\xbe\xcb\xbb\xf5\x66\xed\x56\x0e\xb5\x1f\x77\x2b\x87\xe2\x6b\x2b\x87\x08\xb4\xac\xca\xa0\x68\xa3\x53\xe5\xf1\x10\x13\x2e\xc8\x6f\x25\x53\x33\x22\xa7\x2c\xca\xeb\x84\xa6\x54\x9a\xa7\x2e\x33\xd2\xf9\xed\xda\x5a\x5d\x1b\xaa\xd7\x81\x5f\xf1\xe4\xa3\xd5\x9f\x01\x5b\xa0\x73\x49\x3f\xff\x80\x3a\x44\x10\xae\x82\x5f\x62\x2f\xda\xad\x8c\xd5\x03\x87\x01\x5e\x7d\x02\xbe\xb8\xc3\xb3\xe3\x2e\x4d\xe0\x2e\x22\xe9\xa4\xbb\x68\x3a\xb9\x8d\x51\x97\x91\x08\x49\x19\xbe\x81\xc3\x2c\x64\x3c\x04\x1f\x1c\xb9\x66\xb3\x9e\x4b\x2c\x72\x5d\x08\xfd\xcd\x98\xa3\x57\x6f\x95\xd2\x0e\x82\xaf\x7e\x75\x7c\xea\x74\xe9\x33\xc3\xab\x6d\x6b\x8c\xfa\x58\x9e\xb8\xdd\x1c\x84\x1d\x1f\xac\x1d\xb4\xd0\x88\xaf\x1a\x93\xba\x96\x36\x90\xf4\x0e\xdc\x0a\xa0\xfc\xbe\x54\x29\x30\x28\x94\x67\x81\x84\xed\x86\xbd\x48\xd7\x6e\x1b\xbc\xfc\x32\x3e\x12\xb1\xc2\x16\xac\xd5\xc4\x5c\xb3\xd9\xae\x76\x28\x15\x52\xe8\x09\x2f\x7c\x2f\x45\x90\x93\x6e\x57\x92\x9f\x20\x15\xcc\x0f\x81\x12\xf1\x54\xf4\xc8\x99\x34\xf6\x9f\x13\xc8\x6d\xc5\x10\x84\x64\xfa\x4c\x1a\xf8\x64\xa3\xc9\x8d\xaf\xf6\x48\xc4\x76\xf1\x0b\x0e\xd1\x07\xcc\xe2\x86\x3a\x51\x9f\xf1\x08\x44\x75\xc9\x2d\x61\x61\xb8\x26\xa7\x82\x48\xe5\xa9\x6a\x7c\xcb\x28\xed\x86\xf0\x5e\xdd\x28\x58\xb4\x64\x0c\xb7\x18\x52\xd5\xd6\xe2\x8e\xe1\x42\xdc\x89\xfb\x6f\xc0\xeb\x0b\x81\xba\x90\xa6\x09\x6d\x8b\xa8\x61\x63\x9e\x90\x9c\xa9\x31\x20\x9a\x24\x93\xae\x97\xb8\xab\x73\x11\xaf\x0e\x4f\x47\xbc\x3a\xe5\x43\x50\x51\xde\x40\x02\xee\xe3\xa8\x3f\x38\x36\x1e\xd7\x39\x2d\x2c\x0b\xfe\x8f\x3d\x95\x81\x0b\xfe\x17\xda\xa2\xe9\x01\x39\x24\x9a\x8b\x71\xc6\x6a\xdf\xb9\xc0\x41\x3c\x8c\x1d\xc1\xda\xac\xbf\x95\x7c\x4a\x33\x86\x09\xf3\x54\x84\x5e\x26\x72\xb4\xa0\x74\xf5\x5c\x6f\x34\x2b\x97\x43\x88\x7a\xe7\x9a\xcd\x76\x7a\x0b\x6c\xbb\x73\x2a\x76\x2a\x70\xa4\x1a\xa3\x06\xe5\x02\xa2\x97\x3b\xf0\xdd\xce\xa7\xd1\xd3\x9e\x80\xe9\xda\x19\x4f\x3a\x37\xf3\x51\x46\xb5\xee\x02\xa7\xe5\x76\xec\xf1\xcb\xe8\x49\x55\xdd\xb5\x2b\xba\x48\x30\x1d\xba\x3b\x1f\x39\xd4\x18\x76\x95\x02\xdb\x01\x9d\xa7\xae\xa1\x73\x5b\x20\xb7\xf9\x33\x27\x0c\x1b\xca\x50\x6f\x62\x94\x82\x2a\x5b\xe5\x16\x8a\xff\x04\xf1\x70\x39\x8a\xfb\x40\x70\x0d\xee\x27\xee\x0b\x53\x85\x34\x84\x8b\x24\x2b\x53\xec\x80\x01\x3f\x05\xe7\x55\x37\x86\x6a\x67\xe4\xed\x9c\x81\x7f\x0a\xc3\x7a\x9d\xd3\x67\xd6\x2c\xd4\xfe\xcc\xa7\x40\x40\xda\x49\xc8\x26\x40\x6a\xaf\x93\x5a\xa3\x46\x55\x0e\xf5\x56\x21\x47\x75\x3d\xf2\x35\x1f\x2a\x46\x8e\x26\x54\x08\x96\x45\x38\x2c\xce\xd1\x49\x8d\xa1\xc9\x04\xd3\x9f\x29\xb1\xfb\x38\x63\x66\x57\x63\x8b\xfa\x9c\x26\x13\x2e\x02\x78\x81\x08\x78\x44\x55\x29\xd5\x1a\x9a\xeb\xb4\x35\x84\x3a\xec\xcb\xb2\x7b\x7b\x63\x96\x0a\xd4\x7b\x34\x77\x4f\x85\x6e\xef\x76\x39\xd0\x1a\x4f\x5c\xe8\x12\x02\xf7\xde\xdd\xda\x25\x0f\xee\x69\x2e\x46\x4c\x29\x5c\x93\x21\x73\x3f\x20\xbc\xd6\x77\x75\xe0\xfa\x3d\x4c\xe4\x0d\x49\x25\xb9\x81\x0e\xa4\x53\xab\x1a\x40\xfe\x8d\xf6\x4a\x45\x34\x53\xc8\x88\x4b\x64\x5e\x28\x99\x73\xed\x6b\xfc\x1c\x43\xac\x0d\x76\x24\x2b\x1b\xe3\xb4\xde\x06\xae\xf9\xfa\x88\x18\xaa\xc6\xcc\xd8\xc1\x89\x28\xf3\x21\x6b\x09\xab\xb2\x6e\x08\xef\x4e\x3b\x65\x44\x94\xba\xa7\x01\x06\xb9\x70\xcf\x45\xc0\x13\x48\xc6\x1b\x49\xe5\x52\x0a\xc3\x97\x0e\xa7\xdd\xb2\xdc\x4f\xee\x5c\x2c\x85\xd1\x2d\x61\xd3\xdb\x34\xd0\xc0\xe5\xff\xf9\xe7\xb3\x6e\x70\xcf\x97\xf2\xd6\x8d\x54\x59\x7a\xc3\x53\x4c\xd4\xd0\x64\xcf\x3e\x6e\xbf\xdd\x3b\xaf\x11\xf8\xbc\xf5\x46\xbe\xb9\xe1\xe9\x63\x90\xdb\x67\x06\x5b\x72\x13\xa0\xb7\xeb\xd5\xcf\xa1\x2f\x1c\x3c\x76\x9f\x9c\x70\xac\x23\xb7\x7f\x21\xa2\x68\x3e\xe4\xa2\x42\x42\x08\x0c\x01\x27\x9f\x95\x0b\xde\x22\xd7\xcc\x60\x05\x30\x14\xd1\x4a\x33\x21\x9a\xe7\x65\x66\xa8\x60\xb2\xd4\xd9\xac\x25\x1b\x3f\xd5\x25\x1d\x65\xec\x23\xee\xe6\xf6\xfa\x4b\x18\xaa\xae\xc7\x8c\x11\xed\xc1\xaf\xf0\x82\x22\x53\x25\x37\xa7\x07\x41\xa9\x09\x65\xec\xec\x23\x4b\x5c\x9d\x53\x91\x95\x63\xde\xa8\xa4\x75\xdb\x14\xb0\xd1\xaf\x57\x6b\x0a\x58\xb5\x3c\x2b\x35\xab\x90\xbe\xda\x35\xdd\x7e\x1a\x3d\xfc\x1e\x55\x55\xbc\x5a\xde\xa8\x2f\x65\x05\x13\x29\x20\x87\x47\x3b\x0e\xa7\xbb\x36\x6a\x3b\xc4\xee\xae\xcf\x85\x93\x8f\x46\x51\x2b\xe4\x73\x80\x93\x71\xb0\xe0\x7c\x44\xa8\x68\x2b\xb0\x9f\x4b\x6f\x29\xb2\xd5\x1b\x1f\x7c\xe9\x4e\xfb\x4b\x46\x04\xab\xf5\x97\xec\xb8\xbb\x24\x9e\x7e\x6e\xa3\xeb\x7a\x59\xd4\x92\x2e\x90\xee\x29\x71\xfd\x52\xdb\x6e\x90\x7a\x49\x93\xb8\xb9\x59\xad\x71\x4f\x6e\x5b\x43\x3e\xad\xd6\x90\x23\x40\x1a\x6a\x0f\xe3\xfb\x1a\xc7\x99\xf3\x9d\xb9\x0f\x9d\xce\xb9\x8a\xaf\xcc\xed\xa8\xe8\x78\x85\x9e\x2f\x6e\x20\x57\xb7\x4f\xb4\x5d\x8d\x2a\x49\xbf\x14\xa2\x99\xd0\x5e\x77\x07\x3d\x6a\xa8\x66\xa6\x8d\x47\x77\xb1\xa0\xc1\xeb\x83\x38\x36\x36\x9e\x84\x42\x43\x0f\xb7\x43\xfa\xdf\x3a\xcd\x51\xd4\xee\xb4\x3a\xa3\x27\xb4\x47\xfa\x65\x21\x75\x0b\xc7\x48\xed\xf2\x26\xd4\xb4\xec\xa5\xde\xe2\x94\x75\xb3\x7d\xff\xfe\xf4\xb8\x13\x9a\xd9\x81\xe6\x68\x36\x08\x68\x7a\xa5\xe0\xbf\x95\xb1\x0d\x0c\xc8\x83\x81\x4a\xee\xfe\x75\x90\x62\x9c\xb0\xca\x19\x7f\xcc\xf5\x75\x7b\x20\xee\x1f\x8e\x4e\xea\x43\xd6\x37\xf3\x0f\x47\x27\xc4\x7d\xba\x92\x0f\xfc\x21\x4e\xf0\xb6\x78\xce\xe3\x84\x55\xe1\xb1\x94\xeb\xeb\x35\x80\x78\xb7\x35\x4f\x8b\xf4\xac\x59\xb5\xe0\x26\xfb\xf3\x3d\xf6\x67\x04\x50\x3b\x93\x25\xb9\x71\xa8\x74\xce\x80\xbb\xe2\xc5\x2b\x72\x22\x74\xa9\x58\x95\xe5\x34\x6f\xcb\x59\x1d\x6a\x65\x73\x0e\x80\xff\xf4\xab\xce\xfc\xff\x5d\xf3\xe7\x73\x09\x28\x14\x54\x19\xb0\xc1\x3a\xc2\x31\x87\x36\xa5\x6e\x48\x4f\x84\x7b\x98\xe7\x74\xe4\xeb\x14\x7a\x0e\x95\x2a\x80\x7d\xfb\x9b\x2c\xbb\x44\x30\x95\x31\x83\xbc\x0e\x00\xb4\xe4\x20\x65\xd3\x03\x9d\xd2\x97\x3d\x78\x8c\x07\x33\x32\xb5\x39\x51\x4d\x76\x5e\xee\x0c\xc8\x25\xcf\x79\x46\x55\x36\xab\x75\xdc\xaa\xee\xb3\x87\xa9\x1f\x10\x92\x40\x5e\xec\x90\x3d\xa9\x60\xe4\x84\x0a\x92\x31\x5f\xc9\xef\xb6\xef\x0c\xcd\x87\xfd\xcd\x90\x85\x64\x63\xa2\x31\x28\x16\xbb\x61\xaf\xf7\x78\x9c\xd7\xc0\x4e\x8f\xab\xf3\x8c\x0b\x7b\xc8\x0d\xc8\x7b\x77\x3a\xb9\x63\x1f\x59\x00\x76\xad\xbf\x63\xb3\x96\x68\x63\x7c\x16\xed\x3c\x11\x8b\x8e\x8e\x4d\x23\x74\x53\x6f\xc7\x98\x9b\x0b\x56\xc8\x0e\x54\x34\x1c\x68\xce\xb3\xcf\x8d\xfd\x40\x6a\x0e\x5d\x52\xa8\x21\x14\x05\x51\x52\x66\xd4\x5a\x64\xe8\xd7\x1f\x90\xe3\x93\xf3\x8b\x93\xa3\xc3\xab\x93\xe3\x57\xc4\x8f\xc4\x63\x9d\x7e\x40\xae\x62\xbc\xe2\xa8\xe4\xcb\x81\xc2\x86\x67\xf5\x9c\x60\xa5\xa2\x6a\xf1\x00\xf8\x8d\x54\x90\x53\xc1\x4d\xd5\xb9\x0a\x93\xe8\x33\x29\x5c\x5a\xbc\xfd\xb5\x8b\x2b\x8c\x39\x26\x6f\x0a\x37\x98\xfd\xba\x3e\x1a\xec\x50\xec\xf3\x12\xa6\xd2\xc8\xbb\xb1\x66\xdd\xae\x5a\x9e\x75\x58\x99\xbe\x49\x4b\x27\x9b\xfc\x0a\x03\xb2\x55\x57\x1e\x3c\x51\x43\xb3\x41\x8f\xbf\x2a\x55\xad\x17\xe0\x60\xb0\x3b\x20\xf6\xac\xde\x1d\xec\x7a\x55\x2e\x5b\x68\x58\x19\x06\x8d\x61\xae\xeb\xfc\x3d\x20\xe4\x9d\x2f\x23\x04\xdc\xa2\xe5\xbd\x2f\x11\xac\x2f\xea\x74\x38\xb7\x4b\x7c\x4b\xd4\x72\x18\x3f\xd4\xe1\x62\x8f\xf9\x94\x09\x7c\xb1\xf5\x09\x66\x3f\xd5\x4e\x56\xed\xa2\x7a\xf3\xf7\x17\x6f\xd6\xf7\x52\x28\x59\x3a\x79\xa5\x23\x99\xe7\x88\xd8\x3c\x09\x48\x23\x15\x58\x48\x90\x7a\x6b\x31\xce\x11\xa7\x7a\xd4\x68\xc3\xce\x49\x7c\x3f\xd4\x9c\x31\x1e\x3e\x76\x75\xbd\xa2\xb2\x87\x1e\xde\x26\xcb\x01\xa5\x6b\x0f\xbd\xe9\x8e\xcf\x83\xf0\x1e\x07\x17\x27\x87\xc7\x6f\x4f\x06\x79\xfa\x04\x85\x2f\x13\x69\x21\xb9\x30\xba\xa9\x61\xde\xac\xdd\x76\x5b\xb1\x1d\xa6\xdd\x8d\x6e\x76\xe2\x87\x8b\x13\x3d\xfd\x33\x22\xe4\xfb\x94\x19\xca\x33\x1d\x71\x98\x91\x85\xcc\xe4\x78\x79\xd7\xad\x07\xb0\xce\x9f\x10\x3b\xb5\x4f\xfb\x96\x27\xd7\x67\xb1\x36\x6f\xd5\x5b\xa7\xa8\x6f\xcd\x0b\xbd\x34\x02\xb5\x82\x25\x08\x1d\x75\x9f\x01\xc1\x3e\xa1\x89\xb0\x40\x45\xf4\xc9\x80\x88\xf3\x8d\x09\x2a\xa4\xff\xa8\x81\xf7\xaa\xb6\xc3\x7a\x88\xdf\xd4\x6c\xb0\xd2\xbc\x69\xa7\xf8\x3a\xd5\xff\xe6\x46\xaa\x1f\x22\x85\x62\xfd\x00\xa8\x0c\x1d\xa4\xa5\x8a\x74\xb0\xf8\x4c\xf1\x4e\x5c\xef\xf2\xc5\xbb\xb2\xd9\xbc\x33\xb7\xd2\xd2\x83\x0f\x1d\xf1\xea\xb2\x6c\x56\xb5\xcb\x70\x2e\x2d\x3a\x46\xa0\x64\xe5\x22\x65\x85\xe2\x53\x9e\xb1\x31\x34\xdc\xe1\x62\xec\x5b\x8f\x47\x78\xfb\xd0\xfe\x92\x2d\xcc\xcb\x2e\xb6\x36\x71\x03\x38\xe0\xac\xb3\x77\x57\xd0\xc4\x09\x52\x61\x5a\x1b\x93\xf6\x81\xd0\xec\xba\xdf\xef\x83\xff\x6e\xef\x5f\xd6\xaa\x49\xb3\x7d\xf2\x33\x73\xcf\x91\xd0\x68\x4a\x41\x27\xf5\x89\x0c\x9d\x7e\x60\xae\x15\x65\x81\xa1\x31\x39\xce\xdd\x75\x60\xef\xb4\xea\x33\x1e\xe7\xb5\xfb\x39\x03\x30\xe7\x2a\xe6\xff\x14\x2d\xa0\x35\x1d\xa2\x1d\x4b\x7b\x1f\x27\x5a\xb6\x47\x42\x5c\xbf\x70\xe7\x02\x25\x7a\x96\x67\x5c\x5c\x57\xe8\xe1\x23\x69\xf9\x18\xeb\x7a\xb9\xb8\xf6\xbb\x46\x31\x9a\xdd\x7e\x62\x34\xe1\xd1\xb5\x9d\x16\xa6\xb3\x50\xc2\xd5\xac\xc0\x3c\xb6\x20\xbc\x5c\x92\x55\x2c\xea\x77\x76\x9e\x34\xc5\xb8\x4e\x34\x6f\x2f\xde\x4f\x2f\x8f\x2e\x4f\x6b\xb2\x5d\x10\xfc\xec\x53\x06\xec\x6e\x3b\x5c\xe1\x25\x9f\xb4\x05\xc1\x7f\x6b\x96\xe1\xd4\x27\x59\xd9\xf4\x97\x98\x44\x7d\x2e\x95\xa1\xd9\x1a\x04\x67\x32\xa1\xc5\x61\x69\x26\xc7\x5c\x27\x72\xca\x3a\x72\x43\xdc\x4c\xb0\x03\x99\x6f\xb8\xc0\x3d\x93\xe2\x33\xc8\xd1\xdf\x0e\xcf\x09\x2d\x2d\xd7\x19\xd7\x5c\x66\x6d\xe9\x69\x9e\x02\x97\x58\xf2\xfb\x88\xef\xef\x9e\xb0\x51\x6f\xbf\x0d\x0a\x3f\x7a\x50\x18\xe4\xe2\x73\x09\x04\x73\xc1\x0d\xa7\x46\xaa\xce\xa2\x75\x47\xa5\x36\x32\x77\x5b\xe4\xd4\x0f\x0f\x39\x4e\xa0\x6a\xd5\x9e\x58\xef\xc6\x0a\x86\x22\x90\xf7\x54\x58\xb3\x8e\x26\x6c\xae\xce\xa4\x07\xfd\x5b\x70\x6c\x1e\xee\xf9\xc6\x55\x1b\x01\x30\x79\xf6\xed\xab\x5a\x6f\xc3\x85\x96\xb7\xde\xe9\x58\xb5\x51\x5d\x9b\xb7\x98\xff\xd6\x8d\x7c\x72\xce\x7d\xa4\xcb\x7f\x95\x34\x43\x7a\x9e\xad\xd3\x13\x5e\x5f\xc7\x4e\x5e\xd3\xf3\x94\x5f\xf7\xb3\xe0\xfd\x2a\x35\xe2\xaa\xe3\x1d\x46\x51\xa1\x2d\x33\xd4\xfd\x0b\xbb\x2e\xc5\x60\x97\xec\x99\xa4\xd8\x5f\x1b\x65\xba\xaa\xe6\xc4\x97\x75\x6b\xff\x26\x54\x71\xb6\x7b\xaf\xb5\xe7\x0d\xc0\x1e\xee\xc6\x79\x5a\x23\x10\xaa\x64\xe4\x0d\xd7\xc6\xb7\x71\x85\x0f\xb8\x76\x7d\xaf\x40\xfb\x3e\x27\x52\x11\x5e\xfc\x83\xa6\xa9\x7a\x85\x67\xbd\xb3\x0e\xe1\xbf\x75\x40\x28\xa7\x22\x64\xac\xec\x99\x59\xe1\xda\x2b\x5c\x1d\x9d\x13\xec\x0e\xfd\xf5\x5f\x5e\x80\x26\xfe\xe5\x17\x7f\x79\xd1\x92\xd5\x9e\x6a\x75\x1c\xe9\xda\x0b\xd9\x79\x9e\xc2\x33\xa9\xa1\x00\x05\x14\xab\x27\xe0\x74\x73\x52\x10\xf9\xde\x32\x61\x38\x73\xbb\x54\x53\xb7\xf5\x06\x7f\xa0\x7a\x03\x12\x0a\xc6\x51\x8e\x3e\x96\x7c\x46\xd1\x7c\xfe\x54\x44\x73\x43\x6a\x36\xe5\xdc\x3a\xc7\xa2\x74\xdb\xdd\xd5\x71\x2e\x07\xd4\x53\x1e\x9f\x5d\xfe\xe3\xcd\xe1\xf7\x27\x6f\xe0\x3d\x5d\x36\xbc\x65\x45\x67\x96\x34\xc9\xdd\x5e\x9d\xb5\x9b\x7b\x8a\x9a\x92\xb3\x8b\x88\xfd\xd9\xeb\xcb\x39\x57\x9c\xfd\xe4\x81\x61\xfa\xb6\xb6\xa5\x18\xb5\xa0\xde\x53\x0b\x12\x40\x2b\x6b\xa6\xd6\x53\xdc\xdd\x71\x84\x21\x02\x50\xaf\x39\x35\x2c\x0f\xe1\x3b\xb6\xf6\x3b\x34\xe4\x0d\xb2\x71\x6a\xdc\xdd\xc1\x64\x4b\x31\xa4\x62\xe7\x61\xe4\x4f\x4a\xed\x76\xea\xa1\xea\x0a\x79\x60\xf7\x12\xc6\xf2\x09\x0f\x56\x84\x61\x1e\xb5\xb2\x27\xaa\x3d\x4b\x99\x0e\x4d\x6f\x9f\x01\xb7\x16\xcb\xba\xbd\xb5\x3f\x1d\x96\x36\x91\x73\xad\x8e\x31\x48\x53\x0b\xd1\xd7\xaa\x97\x6f\xeb\x9a\xe8\x73\x19\xa9\x73\x55\xe9\x82\x26\x9d\xf6\xe2\xa9\x3e\xc2\x4f\x00\xe8\xed\x29\x1e\x30\x30\xf1\x35\x95\x59\x85\x67\x77\xb3\x1d\x8f\xfc\x70\xf3\x60\x20\x0f\xe2\x12\xdf\x25\xba\x90\x1e\xec\x25\x46\x0d\xd9\x48\x16\x22\x1b\x77\x0e\xfd\xdc\xd0\x81\xb0\x4e\xe7\x41\x31\x91\x46\x8a\x8e\x4b\x48\xcf\x97\x0c\x5a\x97\x67\x78\xc7\x51\xd5\x7e\xbd\xe2\x0b\xac\xb0\x09\xa1\x69\x6b\x70\xf8\x13\x5b\x0a\x1f\xa4\xae\x87\xa8\x9f\x9e\x00\x2a\xd2\xd3\xe3\x35\xc8\x9e\xa7\x0f\xc3\xf3\xd0\xe0\xdc\xda\xd2\x4b\xd3\x8e\xea\xd2\x4f\x8f\x9d\x2d\xe0\x6b\xcf\xb5\xdb\x3c\xe4\xf6\xdd\xb3\x16\x3d\x49\x2a\x73\x23\x55\x57\xf0\x65\xe7\xb5\xe1\xe6\xf2\x15\xdd\x77\x0b\x78\x12\xcf\x53\x56\xe0\x5b\x3e\x79\x79\x71\x09\x89\x5c\x73\x1d\x25\xe7\x25\x44\xa8\xd4\x7d\x04\x21\xf2\x74\x84\x47\xa7\x5a\xc9\xe3\xc2\x46\xad\xcd\xa4\xf5\xbb\xa2\x13\x1a\xfd\xe4\x06\x73\xae\x4d\xcb\x1f\x95\xb8\xa5\x41\x18\xb9\x87\xae\x45\xbc\x2a\x69\xc5\x4f\x33\x29\x52\x3f\x50\x0c\xcb\x35\xb6\xf2\xcb\x32\xbb\x9e\x52\xc4\x4d\x00\x1d\xb8\x54\x8f\x60\x1f\xbd\x9c\x16\xae\xdf\x78\x2a\x6f\xc4\x0d\x55\x29\x39\x3c\x3f\xfd\xf4\x42\xb4\x75\xf1\x23\xee\x82\x36\x98\xf4\x35\x2a\x02\x0a\xfd\x90\x1b\x8d\xd9\xec\x90\x8f\x6e\x62\x1f\x92\x3d\x80\x42\x86\x88\x15\x61\x56\x5c\xb9\x59\x44\x3a\x92\x20\x32\x31\xd4\x75\x76\x0f\x5d\xef\x5f\xbc\x78\x81\x21\x85\x17\x7f\xfd\xeb\x5f\x09\x74\x5d\x4c\x59\xc2\xf3\xc5\x1b\xe1\xae\x3f\xbf\x7c\x39\x20\x7f\x3f\x7c\xfb\x86\xd0\x04\x2c\x30\x84\x54\xc5\x91\x61\xed\xe2\x1f\xeb\x1e\xf9\xbf\x97\xef\xce\xaa\x76\xef\xf5\x6f\x81\x35\x72\xff\x7a\x03\x72\x1c\xa5\x9f\xc7\x2e\x7f\x6a\x26\x90\x92\x2f\xa4\x21\x74\x34\x02\xe6\x44\x91\xcc\xb5\x17\x17\x1e\x17\x8d\x8f\x27\xbe\x5b\xb7\x65\xab\x0c\xf2\xe2\xb9\x9d\x22\x84\x58\x3c\x94\x20\xa6\xf9\xc3\x58\xe1\x74\x80\xa9\xf4\x48\xc6\xaf\x19\x19\x69\xe8\xd9\x5d\x35\xd1\x50\x4c\x5b\xfb\x29\xa1\xc2\x8e\x8e\x83\x85\xa9\xdb\x49\x3c\xed\xdc\x85\x96\xdd\x9d\x6b\x0c\xeb\x1b\xc3\xf9\xba\x24\x94\x27\x96\xec\x4f\x35\x97\xa0\xae\x2f\x86\xf7\x41\x2e\x72\x50\x7c\x41\x6c\x12\x9a\x49\x31\x8e\x99\xae\xd2\x23\x7c\x02\xe2\xac\x60\x4d\x89\xd1\x51\x37\x95\x6e\x7a\x93\xa1\xe4\x7e\x4b\x5b\xf6\xf7\xaf\x87\x56\x23\x28\x44\x3a\x94\xa5\xf1\x29\x6f\xf8\x24\x80\xc0\x02\x8c\x44\x24\x78\xab\x07\x77\xd6\x98\xa6\xbb\x56\x6f\x1d\xf5\x59\xaa\x1f\xc4\x35\x65\xb3\x47\x18\x4d\x26\xe4\x9a\xcd\xfa\x28\xe2\x0b\x0a\xe8\x07\x40\xe7\x63\x4b\x5d\xec\x2f\x54\xcf\x28\x48\x58\x6a\xed\x40\xb7\x08\x3e\x33\xb1\xe2\xfa\x80\x9e\xe0\x4d\x25\xed\x34\x6a\xd7\xb7\x48\x44\x8e\x43\xdf\xa8\x30\x91\xc2\xb8\x26\x88\xa1\x51\x11\x64\x5a\xce\x55\xd8\x5b\x89\xc2\x52\xfb\x33\x7d\xd7\x93\xab\x74\x4c\x7b\x64\x38\x65\xa2\x14\x0b\xbf\x06\x24\x70\xc8\x7b\xd5\xcc\xe1\xf9\x50\xdf\x00\x2f\x4a\xe9\x9c\xf0\x04\xaa\x6a\xec\xed\xee\x5e\x4f\xa5\x40\x88\x1a\x02\x80\x66\xa6\x74\xa4\x81\x5c\x5a\xfb\x6c\xa6\x35\xe1\xf0\x86\x39\x55\xd7\xcc\x83\xd9\xd2\x6c\x40\xce\xed\x24\x03\x4e\x39\xf6\x8d\x9b\x62\x11\x84\x95\x29\x31\xb4\x81\x7d\xc8\xee\x60\xb0\x8b\x67\xe1\x12\xa0\x83\xd6\xfc\xd2\x65\xcb\xb0\xce\x5a\x85\xd5\xf5\x20\x5a\x68\x6c\x9d\x66\xad\x03\x68\x4f\x28\x01\x77\xc4\x4c\xbc\xb6\x40\x5b\x82\x4f\xc7\x57\xc7\x3d\xab\xba\x6d\x7b\xd9\x5d\xd3\xcb\x16\x21\xf0\xfa\xd5\x75\xb3\xcb\x0e\x5b\x5d\xd6\x13\x8e\x9d\xfc\xa9\x4e\x90\xae\xfa\xee\x75\xde\x58\x31\xef\xa0\xad\x95\xbf\x6e\x43\x2e\xce\x57\xb1\x2e\x40\xd1\xb6\xb2\xfc\x49\x99\x13\xa7\x23\x90\xa1\xcb\xd1\x5a\x22\x2b\x2d\x1c\x29\x96\x02\xeb\xb7\x23\xba\xe8\x15\x4f\x3a\x32\x2c\xe6\xaf\xf6\x86\xc6\xfc\xd5\x26\x99\x65\xfe\x5a\xd8\xe7\xe1\x4c\x2d\xa2\x52\x5a\x58\x22\x23\xa1\x07\xa3\x09\xc2\x60\x40\xde\xba\x33\x17\x99\x9b\x0e\xb5\xcc\x4a\x13\x60\x15\x96\x1c\xc8\x30\xa8\xef\xd8\x88\x70\x43\xfe\xb6\xe8\x78\x06\xc5\x04\xcf\xac\x6e\x4e\x6a\xbc\x3a\x14\x36\x6d\x93\x51\xf1\xfa\x83\xa5\xa4\xe2\xd5\xe1\x2a\x78\xbd\xb0\xe3\x95\xb8\x74\x98\x92\xbe\x0e\xb0\xa6\xbd\x42\x5a\xaa\xd1\xa8\x1a\x7b\x45\x14\x1b\x1e\x36\x45\x5b\xae\xae\xf6\x8e\x57\xf7\x3a\xce\x1b\x78\x78\x7e\xfa\xe8\x56\x66\xf4\xac\xad\x9d\xb9\xd2\xb5\xc4\xe1\x0b\x40\x04\xde\x09\x74\x5c\x51\xd4\x05\xd8\xac\xfc\xfd\x03\x98\x2b\x0b\x2f\xfe\xda\x9e\x3b\x51\x50\x6a\xae\xe5\x03\x7a\x70\xab\x13\x2a\x6a\x13\xe1\xd3\x65\x40\x9a\x3d\x7f\xd3\x66\x43\x0d\x12\xa0\x7e\x8b\xba\x97\xf9\x6b\x3e\xb1\xd4\x11\x91\x5c\x42\xaf\x7d\xf4\x9e\x44\x6e\x98\x42\xa6\xaf\xb0\x69\x33\x15\x42\x1a\xec\x31\xdf\xc3\x66\xfd\xba\x87\xee\x15\xab\x64\x46\x89\x56\x2a\x0a\x61\x76\xac\x56\x76\xc6\x3c\xa4\x73\x06\x22\xc0\x44\x40\xbb\xf3\x6e\x38\x89\x3c\x02\x37\xd9\xab\xd2\x4a\xba\xec\xab\x5e\x0f\x37\xe2\xf8\x9e\x89\x74\x32\x61\x39\xc5\x06\x17\x9e\x40\x56\x5e\xdf\x28\x6e\x0c\x43\xfc\x6b\xa6\x72\x4d\xe4\xa8\xe7\x4d\x24\x44\x3d\x99\xbe\xdc\xe9\xae\x3f\xfd\x23\xd8\xca\xc4\xef\xd0\xa6\xf0\x55\xb7\x5d\x75\xdf\x7f\xcd\x8e\xb0\xbb\x13\x0c\xe6\x0c\x3a\xee\x88\x39\x27\xa4\x55\x22\xa6\x48\xff\x8d\x26\xdd\xe6\xb9\x19\x7a\x41\x19\xdd\xba\x19\xb6\x6e\x86\x2e\x46\x7c\x34\x37\x43\x74\x70\x7b\x61\xea\x16\x20\x76\x3d\xc4\xf8\xef\xde\xff\x50\xe1\x3a\x44\x58\xc6\x96\xe5\xbd\xe7\x41\xaa\xba\xff\x7f\x77\x30\xd8\xdd\xf5\xfe\x08\xb7\x3f\x4a\x33\xea\x7f\x4d\x98\x48\x64\x8a\x4c\x65\xc7\x57\xda\x80\x52\x5b\x19\xe0\xf1\x5c\x72\xff\xac\x38\x86\x00\x63\x77\xcb\x12\x1d\x4a\x28\x9f\x33\xf2\xfa\x51\x55\xb0\x4a\xf1\x0a\xf0\x55\x8e\x80\x01\xe5\xcf\x69\x60\x55\x0e\x4b\xc6\x73\xee\x70\xf5\xac\xb8\x60\xda\x68\xb2\x87\x1f\x0e\x92\xa2\xec\xb9\x1b\x06\x39\xcb\xa5\x9a\xf5\xc2\x4d\xf6\xcb\xda\xaf\xdc\x1d\xfb\xa0\xb5\x25\xa5\x52\x4c\x98\x6c\xf6\xc7\xd5\xdf\x3c\x89\x37\x58\x7d\x0b\x5c\xd1\xa6\xc4\x62\xd9\x35\x57\x76\x11\x80\xed\xc1\x51\x17\xa8\x0d\xe7\x90\x2b\x76\xe8\x05\xf7\x11\x7c\xca\xc4\x94\x4c\xa9\x6a\x5c\xec\xb0\xec\x7a\x14\x8d\x2d\xe5\x53\xae\x65\xe3\x72\xb1\xa5\x43\x2e\x7a\xbf\xb8\x6b\x04\x20\x4b\x53\x94\xc6\x9d\x2e\x7e\x6f\x7b\xa8\xb9\xb0\xa7\xe7\x14\xdf\x97\x3b\x1d\x4e\xae\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\x1d\xbe\x04\x15\xb3\x77\x9d\x89\x60\xbc\xfa\x8f\xa2\x46\xd4\xc7\xee\x98\x75\x09\xf9\xd8\xaf\x9c\xd7\x7d\x2e\x4c\x5f\xaa\x3e\x3e\xe4\x15\x31\xaa\xec\x4a\x74\x55\xc7\xdf\xe3\xc9\x98\x4a\x89\xa9\x90\x1b\xbd\x61\xb3\x81\x42\x04\x33\x47\x1f\xdd\x1b\xec\xda\xa5\x6e\x1d\xc1\xab\x5c\x8f\x92\x70\xe4\x90\x61\xfe\xe0\xd9\x46\x97\xae\x23\xef\x36\xd5\x68\xe1\xda\xa6\x1a\x2d\x5e\xdb\x54\xa3\x07\x5e\xdb\x54\xa3\x0d\xf4\x01\x6e\x53\x8d\xb6\x3e\xc0\x27\xe2\x03\xdc\xa6\x1a\xad\x7a\x6d\x53\x8d\x1a\x5f\x4f\x33\xd5\xc8\x29\xf0\x55\x9e\xd1\xc6\xa6\x19\xb9\x06\xff\x87\x49\x22\x4b\x61\xae\xe4\x35\x6b\x19\x95\x5d\xc9\xc0\x5c\x78\xe6\x66\x5a\x9b\x5d\xa9\x94\x1d\xa8\x80\xdd\x29\x7f\xb4\x4c\xb9\x35\x33\x3b\xde\x06\x87\x6e\x58\x6f\x67\xda\x63\x51\xa4\x2c\x0d\xcf\xf3\xc2\xca\xd8\xf5\x1e\x90\x43\xa2\x58\xc2\x0b\x6e\x45\x3b\x80\xe9\xc0\xe7\xb8\x4f\x42\x3f\x60\x6e\x34\xcb\x46\xae\x27\xaa\xa8\x6a\x86\x55\x64\x42\xba\xb3\x62\xe9\x63\x50\x2b\x90\xbe\x8d\x25\xd1\x13\x59\x66\x29\x51\xec\x5f\x5e\x9d\x70\xb3\xb9\x8a\x47\x88\x1d\xa1\xf0\x2a\xd5\x63\xdd\xe0\xb4\xe0\x0e\x75\x6b\x93\x04\x1c\xfb\x58\x70\x05\x9b\xed\x92\x25\x52\xa4\x5d\xbb\x37\x4e\xe6\xc7\xf7\x6b\xed\xa2\x39\x2c\x25\x69\x89\x37\x40\x21\x24\xcd\x78\xca\xcd\x2c\x64\x61\xe0\xb6\xb7\x8a\x28\x76\xa1\x75\x8c\xa0\xab\x85\x20\xb4\x28\x94\xa4\xc9\x84\xe9\xe8\x6d\x50\xad\x74\x60\x13\xa1\xbe\x32\x2b\xc7\x5c\xa0\x66\x09\xbf\xb1\x6a\x48\x36\x23\x4a\x1a\x9f\x50\x76\xcb\x03\xaf\xa2\xc1\xe0\xe7\xa8\x4b\x18\x35\x83\xac\x33\x19\x0f\x81\xb3\xe2\xa3\xf8\x0f\x4d\x64\x96\x7a\xdc\xd2\xaf\x5f\x58\x55\x3e\x71\x5c\x6c\xa5\x3d\xa0\x4a\x1a\x49\x32\xab\x16\xd9\x13\xe0\xf6\x1f\x7f\xf1\x15\x99\xc8\x52\xe9\x41\x0c\x21\xf0\x12\x3e\x43\x27\x85\x37\x05\x0c\xc9\x18\xd5\x86\xbc\x7c\x41\x72\x2e\x4a\x7b\x96\x77\xc4\x78\x5d\x69\xaf\x91\xde\xfa\x97\xaf\x5a\x8e\xd6\x8d\xc6\xba\x98\xc1\xe2\xb8\xb5\xc0\xfe\x6c\x4e\x71\x75\x7b\x1c\x41\x31\xb0\x47\xe3\x9c\x1a\xeb\x8e\xa4\x78\x15\x85\x91\x6b\xde\xf9\xbf\x95\x72\x38\x33\xed\x61\x60\xfe\x0b\xc7\xa9\xe3\xbf\xf8\x0f\x57\xc1\x52\xad\xa0\x54\x1b\x4c\x65\xed\xdd\xa2\xc7\x5c\x9b\x46\xbd\xa2\x2b\xdc\x98\x06\x3f\x6e\x7b\x98\x8f\xad\xc5\xdb\x49\xd1\x3a\xd8\xce\xde\x56\xf3\x4e\xe5\x24\x61\x1a\x44\x91\x87\x4f\x03\xff\x2c\x3e\xb5\xe1\x43\x37\x0b\xb1\xe5\x4e\x44\x16\xcf\xfc\x1d\x74\xc6\x6c\x45\xac\x36\xba\xbd\x67\xec\x8e\xa8\x85\x83\xd5\x65\x84\xe6\x62\x8c\x8d\x2c\xf3\x32\x33\xbc\xc8\x2a\xca\x85\x1f\xb8\x03\x38\x76\xf8\xd3\xc8\xc3\x4c\x11\x38\x0a\xa1\xc1\x21\x38\xb2\x17\xc6\x62\xc2\x60\x3f\x46\x65\xcf\xf1\x82\x2a\x1a\xc8\x9f\xc8\x3c\xa7\x7a\xdf\xc5\x0e\x28\xe4\xae\xa0\x64\xb7\xc7\xb0\xa2\x59\x78\xfd\x38\x57\x60\x5d\x8c\x6b\x98\xa0\xa2\x71\xd0\xae\xee\x70\x81\xa1\x88\xbc\x09\xe9\xf1\xd8\x3f\x7d\x8e\x63\x9d\x42\xfc\x3d\x4d\xae\x99\x48\xc9\x7b\xed\x09\x97\xce\x04\xcd\x1d\xb8\x7a\xa1\x24\xf6\xed\x66\xe9\xdc\xef\x75\xcf\x39\x12\x11\x65\xc4\x83\x40\xa1\xbe\xb5\x2e\x2a\x96\xba\x23\x74\xdd\xf7\xda\x2a\x5f\x77\xcb\x3b\x8d\x4e\x5a\xc5\xa7\x09\xf3\xba\xa3\x9d\xc0\xba\x5e\x7e\xda\x18\xf1\x8d\x2c\xc7\x61\x72\x4d\x33\x71\x17\xc2\x91\x1e\x82\x8f\x80\xa3\x4e\x33\x2b\xe2\x66\x01\x5e\x67\x8e\xc1\x86\xb3\xf5\xb5\xec\x57\xc3\xf6\x00\x4d\xbb\x17\xdf\x1f\xd7\x85\xd9\x05\x4d\xa5\x26\xdf\x67\x32\xb9\x26\xc7\x0c\x8c\x86\xc7\x6c\xf7\xae\x86\xe9\xd3\x6e\xd3\x98\xd3\x71\xb3\x3c\x8f\x3e\xc9\xa5\xe0\x46\xaa\x26\xf2\x78\x83\xc0\xf6\xb6\xad\xf6\x96\x83\x88\xab\x61\xfa\x6c\x1a\xed\x59\x26\xef\xa8\xc3\xee\x84\x11\x05\x22\x06\x06\xf5\xdd\x3f\x1a\x0a\x8c\x3f\x4d\xe4\x4d\xdf\xc8\x7e\xa9\x59\x9f\x37\xce\x53\x6a\x4d\x9f\x6b\x36\x83\xa4\xaf\x4e\x28\xf4\x23\x0e\x56\x33\xd1\x8d\x04\xcf\x39\x7c\x6e\x15\xb9\x8b\xef\x8f\xed\xe9\x3d\x88\xcd\x92\x03\x66\x92\x83\x84\x15\x93\x03\x37\x9d\x27\x4f\x56\x2f\x1f\xbb\xa1\xeb\x21\x49\x64\x96\x39\xdc\x2e\x39\x22\x47\xac\x98\x84\x47\x6c\x06\xad\x9e\x72\xb3\xb4\x42\xca\x6e\x1a\x2b\x45\x22\xc2\x8e\xe9\x24\x44\xc4\xe8\x6a\xf8\xb0\x5e\xd0\x9b\xc8\xda\x9f\xb0\x27\x49\x93\xde\x72\x1b\x41\xde\xcd\xe9\x51\xb7\x7b\xe9\x87\x03\xff\x4f\x14\x6e\xae\xb7\xa4\xf3\xf9\xa2\x35\x11\x7d\x3a\x42\x0b\x33\x65\x29\x91\x53\xa6\x14\x4f\x99\x26\x41\x46\xc7\x8e\x25\x9e\x6d\x06\xe5\xb7\xdd\xf1\x9e\x56\x7e\xc0\xe6\xf8\x14\x22\xe1\x6d\xc7\x5c\x14\xde\x34\xcd\xb9\xd8\x0c\x2e\x6f\x48\x2f\x9d\xd0\x8c\x9d\xbe\x6b\x6d\x7a\x5f\xe2\x38\x75\xeb\xdb\x7f\x18\x81\xec\xdf\x03\x3c\xff\x63\xe0\x59\x22\x64\xda\x2c\x1a\xb6\x66\x1b\x7a\x4c\x0d\xbb\x69\xa8\xf8\xf4\x2b\x51\xdf\xf4\xf7\x60\x79\x3d\x6d\x1b\x7c\x4d\x0d\x32\xa2\x7d\x8d\xa8\xf7\xeb\x52\xa7\x1c\x07\x75\xe3\x5a\xf6\xa4\x98\xeb\x2f\xe6\xb7\xe6\xe1\xf9\x29\xf9\x01\x9f\xb7\xbe\x8e\x1f\x4a\x1a\xb4\x64\x8e\x65\x4e\x79\x47\x8d\xd8\xa3\x86\x4e\xf1\x0b\x9f\x87\x87\x11\x7c\x5a\xdc\x85\x7e\xc4\xc7\xa5\x62\x29\x71\xde\x8f\x6d\x1b\x83\x0d\x6e\x63\xd0\xad\x52\x5c\xe9\xc4\x91\xc7\xdc\x57\xc6\x54\x7a\xb0\xe7\x22\x50\x07\x42\x0a\x12\xd1\x4c\x68\x0e\x59\x07\x51\x62\x1c\x28\xcb\x90\xff\x1d\xca\x60\x50\x71\xee\x91\x37\x72\xcc\x85\x97\x4e\xd2\x25\xbb\x8c\x28\xcf\xda\x91\x73\xab\xe9\xfe\xc1\x34\x5d\xad\xb3\x13\x41\x87\x59\xf3\x4c\xc6\xfa\xc1\x9b\x51\xc8\x93\x62\x30\xe6\x41\xca\xb5\xfd\x97\x5c\x5e\xbe\x81\xd8\x6c\x29\xbc\x65\x08\x51\x47\x77\x6c\x84\xfa\x62\x14\x2e\xeb\x93\x07\x28\xb3\x3b\xeb\x53\x71\x2a\x52\xfb\xba\x4c\xd7\x12\x80\xdd\x53\xb0\x0b\x48\xa8\x5e\xc3\xec\xc3\x21\x23\x57\x13\x9e\x5c\x9f\x47\x21\x58\xa9\xec\x67\x22\xfa\xa8\xa6\x68\xcc\x7f\xb7\xae\x03\xc7\xbd\xd6\x79\x57\x6e\xaf\xab\xe8\xc4\xbd\x74\x24\xb3\x83\x13\xaa\xb5\x4c\x78\x15\xf3\x07\xa7\x70\x75\x24\xa7\x70\x24\xaf\x8f\x0c\xa0\x25\x3e\x8a\xfe\xe1\x19\xc7\x29\xad\x54\xc7\xfa\x06\x17\x9e\x5a\x6b\x7b\x75\x64\xe5\xce\xba\x6b\x5e\xd5\xfa\x69\x7a\xab\x6f\x2e\xfc\xec\xeb\x41\x1d\xa3\x78\x7d\xde\x35\x70\x5e\x64\x95\xd0\x57\xd3\xf5\xf7\x58\x0b\xb1\x9a\x17\x6b\x2f\xf3\xc2\xcd\xe5\xde\xe0\x67\x2e\x20\x0d\x42\xa5\x90\x45\x99\x61\xd6\x6a\xfb\xb6\xa2\x3e\x9a\x87\xcf\x59\x43\x80\x7a\xd3\x9a\x11\x3d\xb4\x9c\xef\x79\xf4\x25\x8a\x0c\x82\x17\x7f\xf9\xea\xab\xa7\xde\xa9\xa8\x9d\xe3\x6c\xdd\xad\x8a\x5a\x85\xba\xb6\x28\x05\x5b\x94\x82\xbb\xae\xb5\x47\x62\x3f\x3d\x0e\x41\x27\x45\x62\x5d\x14\x88\xb5\x45\x1a\x68\x59\x5c\xd6\x4d\x61\x59\x6b\x2c\x81\x47\x45\x10\xe8\xa8\xc6\xaa\x3d\x5a\xc0\x16\x23\xe0\x8f\x81\x11\xd0\x5d\x6d\x55\x57\x78\x00\xed\x6b\xaa\x9e\x7f\xed\x7f\x6b\x31\xd1\xb6\xc2\xfc\xe1\x75\xe5\x5d\xf5\xaf\xe8\xca\xcf\xde\x99\x63\xa0\xe6\xd5\x75\xf6\xae\xe7\x0c\xcc\xbc\xae\x10\xdf\x8d\xb4\x42\x63\x8d\xd6\x2e\x69\xed\x2c\xc0\xa9\xc8\x46\x67\x70\x9d\x6b\x70\xa4\x77\x97\x73\x21\xf6\xf0\xf1\xe6\x47\xd6\xb7\x21\xe6\x6d\x1b\xf5\x6d\xfc\x31\x5c\xb7\xc4\x1f\x75\x0d\xe3\xd5\x7b\x04\x41\x12\x82\x0a\x26\x87\x71\x1f\x95\x6a\xff\x1f\x9e\x9f\x92\x44\x31\x80\x34\xa0\x99\x1e\x90\x25\x1a\x9a\x8f\xd4\x38\x8d\xce\x6b\x66\xd4\x18\x96\x17\xa6\x2d\xc3\x6d\xc3\x8f\x7f\xb0\xf0\x63\xc7\x31\x83\x9f\xc2\x70\xde\x5b\x34\x29\x73\x2a\xfa\x56\x5a\x40\x20\xb2\x96\xcf\x31\x77\xf0\x0d\x88\xaf\x81\x43\x6a\x52\xc5\x10\xdc\xbc\x14\xfc\xb7\x92\x55\xfe\x85\xa0\x5e\x6c\x40\xa8\x05\xe6\xd1\x31\xed\x50\x75\x9a\x93\x22\x89\x5c\x28\x65\x72\x04\x09\x74\xf4\x02\x23\xd2\xbf\x6a\xbe\x32\x33\x61\xa8\xa6\x9d\x03\x38\x40\x75\x57\xdd\xbe\x43\x03\x8f\x66\x99\xbc\xc1\x67\xc7\x8a\x87\x5d\x3f\x3b\x17\x87\xc7\x31\x64\x24\xe7\x4a\x49\xe5\x42\x3c\xf1\x74\x30\x2d\xc7\xda\x89\x4c\xa1\xc1\xa5\x5c\x56\xc5\x25\x33\x31\xab\x18\x49\xa8\xc0\xc2\x45\xfb\xdf\x3e\x29\x19\xfb\x9f\x39\x79\x37\x64\x13\x3a\xe5\xb2\x54\xf8\x6b\x23\xc9\x8e\xfb\x0a\x8e\xdc\x99\x2c\x83\x9b\xbb\x84\x3a\xa5\xf0\x76\x7a\x09\x9d\xce\xaa\x2f\xc1\x40\x4d\xa5\xf7\x1f\xf6\xd9\x47\xae\xcd\xe2\xbb\x78\x12\xf9\x06\x09\xeb\xe0\xbc\xa9\x2e\xec\x01\xfb\x53\xe3\x9a\xd3\x3a\xbf\xc5\xa3\xd5\x55\xd2\xe9\x25\x7c\x75\x9f\x42\xea\x90\x5a\xb0\x54\xdc\x17\x85\x3d\xbd\x74\x4f\x7c\xcb\x86\x9d\x99\xb6\x1a\xf1\x53\xd1\x88\x43\x82\x44\xc6\x93\xd9\xe9\x71\x37\x3a\x5f\x48\x8c\xb0\x83\x92\xef\xa9\x66\x29\x79\x4b\x05\x1d\xa3\x73\x64\xef\xf2\xfc\xfb\xb7\xfb\x96\x49\xc0\xf9\x72\x7a\xbc\x34\x7b\xe2\x32\x9e\xd9\xd9\xba\xca\xb7\xc9\x3c\x8d\x3a\xd3\x0a\x1e\x48\xa5\xb5\x15\xb0\x93\x70\xb2\xb7\x69\xd9\xb5\x08\x6e\x84\xe9\x10\x1e\xa9\x4c\xcf\x8b\xd7\x69\x9e\x5e\x3f\xe6\xeb\x46\xbe\xea\xbb\xde\x69\xb5\x40\xd3\x0a\xc1\xa4\xb9\xb5\x57\xd4\xb0\xf1\xec\x98\x15\x99\x9c\xd9\xe5\x3e\x8f\x5c\xe7\x78\xeb\x10\x8f\x7a\x35\xa4\x09\x51\x65\xc6\xb0\x7b\xcd\x3c\x44\x98\x60\x2c\xad\xe4\x14\x17\xda\x50\x00\x08\xc3\xf1\xef\x9c\xd1\xca\x07\xcc\xaa\x47\x49\x1f\xe7\x79\xef\x5d\x75\x38\x45\xbb\xa1\xee\xfc\xc9\xea\x87\x09\x3c\xfe\x7e\x0e\x7d\x48\xf0\x70\xe5\x30\x61\x9d\xc1\x61\x4f\x5f\x94\x99\x3d\x3a\xb2\x74\xae\x89\x28\xe8\x56\x6e\x8d\x11\x99\x01\x24\x80\x9d\x7d\x8f\x0c\x4b\xab\x78\x31\x5d\xf3\x2f\x2f\xc2\x52\xde\x4c\x30\x6e\x6c\x7f\x44\x68\x51\x64\x1c\xf3\x7a\xa5\x72\xc1\xdf\xc8\xdb\xb8\x78\xdb\x2a\x82\xe4\x81\xfa\xc7\xc3\xf4\x8d\x3e\x99\x32\x35\x5c\x05\x53\xe1\xa1\xaa\x04\x2d\x38\xc4\x4e\x56\xd6\x3c\xea\xa0\x90\xe7\xa7\xf8\x6b\x6f\xa9\xc5\xa6\x99\xff\x12\x57\xd0\xad\x8d\x07\x14\x74\x5d\x69\xd0\xda\x08\xa8\x40\x87\xe7\xa7\x08\x43\xe5\x80\x81\x2a\x97\x85\xd5\xed\x29\x26\x07\x56\x68\x84\x74\x6c\x47\x34\x44\x8a\xf0\x50\x26\xca\x9c\x21\x98\x50\xd5\xce\xca\x1a\x7c\x62\x56\x8d\x5e\x79\x3c\xac\x7d\xb2\xba\x3a\xf1\xf0\x30\xfa\x03\xc3\xe6\x0f\x3e\x79\x84\x14\x17\xee\x35\xdf\x5f\xbc\x69\xb6\x88\x67\xf5\x31\x1c\x78\x0c\x03\x9c\xbc\x82\x2a\xc3\x69\x46\x4a\x95\xf9\x30\x1c\x26\xbd\xbb\xb4\xb4\x09\x9d\x46\x00\x3b\x03\x42\x3e\xc3\x95\x73\x84\xc5\xfd\x89\xed\x5d\x71\xe5\x47\x65\x96\xf5\xc8\x88\x0b\x6a\xc5\x2e\x2b\x48\x1c\x0e\xba\xe4\x22\xb1\xe6\x97\xb5\xf5\x5d\xbf\x16\x98\x91\x37\xca\xc2\x26\x85\x28\x23\x44\x4b\x59\x96\x02\xe8\x22\x3c\xc2\x6e\xd8\x04\x5c\x04\xd6\x6a\x3c\xca\x4a\x6d\x98\xba\x90\xf6\x30\x88\xf2\x5a\x00\x8e\x82\xc6\x5f\x7f\xcf\x45\x0a\x29\x4c\x17\x70\x70\x24\x54\x10\xc6\xc1\xf9\x62\x87\x84\x38\xb5\xe5\x9d\x8a\xa1\xf6\x74\x99\x4c\xec\x2b\xed\x14\x32\xd5\x3b\x56\x8c\xec\xa0\x8b\x4e\xef\xec\xdb\xbf\xe6\xdf\x01\xd3\x54\xa2\xdf\x1d\xd0\x82\xef\xec\xf7\x08\x10\x08\x02\x67\xd2\x4c\x9e\x2e\x1f\xfa\x77\x05\x9b\xb8\x11\x17\x5e\xc4\x23\x00\x0f\x8a\xaa\xfb\xd7\xcd\x84\x1b\x16\x9a\x6f\xa3\x67\x27\xe0\xab\xcc\x0b\x6b\x42\x0e\x05\x61\x79\x61\xc0\x5b\x4c\x72\x46\x7d\x08\x99\x4d\x99\x9a\x59\x9b\x1c\x80\x28\x9e\xfc\xe6\x0f\xfc\xd8\x8a\xe0\x73\x9d\xcd\x2b\x26\x87\x1d\xb6\x40\xdc\xdd\xcf\x76\x6b\x76\x7e\x96\x45\xd2\xfc\xc9\x92\x12\x8e\xd7\x46\x64\xfc\xc9\xfe\xb2\x4e\x42\xfc\x08\xa5\x65\x90\x1f\x6f\xde\xb8\x40\x06\xd2\xea\x47\x2e\x52\x54\x51\x0f\x8d\x51\x7c\x58\x1a\x76\xc1\xec\x84\x13\x4c\x79\xf0\x5d\xf8\x5c\x76\xb4\x5b\x89\xa5\xe4\x87\xb9\x3f\x45\xd2\x2f\x2a\xb6\xab\x2a\xa3\x77\x0c\xef\x75\xf9\xdb\x86\xba\x73\x00\x67\x10\xbc\x95\xe9\xf2\x4d\x35\x57\x19\x52\xdd\xec\x54\x95\xa8\xb3\xa5\x1f\xcb\x29\xb1\xb3\x62\xa9\xa6\x7f\xf7\x72\xdc\x41\xfa\xdb\x66\x52\xf9\x06\x40\x82\x46\xdf\x5c\xcd\x0a\xe6\x90\xb6\xc9\x28\xa3\xe3\x8a\x8d\x40\x1e\xa2\xfa\x74\x74\xf9\x93\x7f\x05\x4d\xf8\x72\x45\xf6\x5e\x4d\xf7\x3e\xdd\xb6\x5f\x51\xe9\xd6\x3b\xec\x43\x96\x7e\x79\xbf\x82\x1b\x06\xbf\x9d\x9b\x56\x09\xfb\x99\x3b\x5d\x6a\xb7\xd1\xff\xca\x21\x7c\xd1\x88\x13\x3c\x80\x98\x37\x37\x21\x13\x09\x34\x94\xcb\x9f\x6a\x6c\x72\xcf\x7c\x6f\x61\xda\x6b\x36\xbb\x91\x6a\x39\x1a\x78\x63\xfe\xba\xf3\x89\xd8\x9d\xff\xde\x0d\xf2\x96\x16\xf6\xb5\xab\x3c\x4f\x14\x78\x2e\xea\x88\x56\x01\x66\x68\xf9\xac\x38\xa9\xc6\x54\xf0\x7f\x63\x72\x6c\x62\xf7\xb1\x54\xf6\xcf\x3d\x8c\x5c\xa0\x45\x9f\xb1\xc4\xec\x3b\xfe\x5b\x2a\xf7\xee\x61\x50\x9a\xa6\x1c\xf5\x8a\xf3\x7b\x78\xe9\x6e\x22\x70\x71\xfd\x18\x34\xbf\x63\x63\xdd\xcf\xfb\x77\x87\x3e\x57\x90\xcd\xa5\xba\x23\xbb\xe9\xce\xdf\xe7\x94\xbb\x8e\xae\x1b\x47\x15\x96\x53\xde\xf4\xb5\xf0\x6a\x41\xd7\x9c\x9a\x52\x71\xb3\xf4\x40\xba\xfb\x87\x5c\xfc\x58\x0e\x99\x8b\xf6\x3e\xf8\xe7\x02\x92\xf7\x0e\xcf\x4f\xbb\x5d\x8e\x45\x78\x69\x37\x41\xab\xd1\x90\x52\xd0\x7c\xc8\xc7\xa5\x2c\x75\x36\x8b\xdd\x95\x14\x82\xd5\xd6\xdc\x47\x7f\x8d\xd8\x35\x84\x0a\x29\x66\xb9\xbb\x55\x24\x59\x99\xb2\xda\x88\x10\xd3\x9b\x4a\x9e\x12\x5a\x1a\x99\x53\xc3\x13\x92\x48\xfc\xae\x3e\x52\xa9\x19\xa1\xb7\xfc\x36\x29\xb5\x91\x39\xc9\xa9\xd2\x13\x9a\x65\xb7\xad\x71\x07\xa7\xda\x5d\x00\xda\x7d\x78\xff\x5b\xbf\x9c\xe2\xac\x1b\xf2\xf7\x3d\x78\xe1\x2b\xf0\xb7\x9d\x5c\xab\x01\xa6\xb7\x73\xe9\x0a\x63\xb8\x92\xf8\xa5\x70\x3d\xf7\x2c\xcc\x7d\xd4\xb9\x6b\xe7\xde\xfb\x5e\x77\x48\xc3\x3b\x7f\x0b\xa9\xb3\x2c\x3d\xcd\xe9\x78\x05\x45\xf2\x8d\xb5\x1b\xa8\x98\xf9\x9f\x21\x8a\xa4\xee\x11\xa9\x5c\x0e\x48\xe8\xc9\xed\xbe\x0a\x00\xa4\x8a\xbc\x83\x30\x9b\x54\x2e\x99\xda\x71\x29\xa4\xd6\x33\x35\x92\x2a\xb7\x7a\x1d\x57\x64\x54\x0a\x34\x2d\x5c\xee\x35\x18\x2b\xce\x8b\x43\x33\x2d\xc3\x0e\x84\xb8\x9d\xf0\x93\x20\x54\x93\x1b\x96\x65\x03\x72\x98\x65\x0e\xde\x32\x82\x46\xa8\x4a\x9e\xab\x0c\x81\xe1\x8c\xa4\x7c\xcc\xb4\x21\x7b\x97\x7f\x3b\xdc\x87\x53\x1b\x3c\x1c\x33\x62\xa8\xaf\x13\xab\x7b\x6e\xe0\xfc\x4f\x4b\xd0\x13\x12\x6a\x68\x26\xc7\x18\x24\x07\x0f\xae\x48\x49\x91\xd1\x19\x80\xd4\x17\x54\x41\xa2\x68\x82\xde\x1b\xa2\x4a\x01\xf0\xbc\x9f\xf4\xc4\xb9\x5f\x14\xdc\x85\xa0\xdb\x07\x9e\x6c\xb8\xd5\xef\x41\x2d\x7d\xdc\xa3\x4c\xb1\x22\xa3\xb7\xf8\x1b\xee\x28\xfb\xb5\x6a\x2e\x98\xb0\x52\xb0\x30\xc6\x80\x5c\x22\xef\xe4\xd4\x24\x18\xc2\xfc\x67\xce\x0c\x4d\xa9\xa1\x03\x6b\x0b\xfe\xb3\x5e\x98\x26\xb3\xd4\x0e\x74\xfb\x42\xdf\x32\x67\xd4\x17\x97\x37\x63\xaf\xef\x42\xab\xd4\x86\xdb\x41\x3f\xf7\xfb\xf1\x4e\x07\x47\x4b\xf9\x04\xaf\x7f\xf2\xd1\x9a\x62\x77\x46\xd7\x6a\x73\x9d\xff\x51\xdd\xff\x90\xd5\xdf\xc4\x71\x6b\xce\x00\x17\xf1\xca\xf5\xf3\xf1\x9f\x80\x73\xf5\xf0\xec\xf8\x76\x47\xd8\xfd\x2e\x83\x7b\x5c\x04\xf5\x90\xc1\x1d\xd3\xf3\xae\x67\xf7\x4d\x3d\x6e\xe0\x8b\x53\xa0\x7e\x0f\x4b\x3d\xa8\x07\x4f\xf1\x37\xe3\x82\xd5\x2b\x0f\xf1\x77\xb7\xfb\x47\x56\x0a\xdc\xac\x12\xae\xb9\xaf\xd0\xab\x1f\x26\x7b\xeb\x4d\xab\x45\x6f\xee\x2d\xc6\xaa\x11\xdc\x55\x3b\x42\x71\x25\x50\x1e\x4a\x36\xbc\xf3\x34\x10\x7b\xd5\x68\xd7\x8a\xfe\x1d\xff\xaa\x0f\x98\x68\x58\xca\x5a\x1a\xd1\x35\x9b\xed\x6a\x57\x8b\x22\x85\x9e\xf0\x02\xab\x05\x5d\x80\xc2\xad\x2e\xf9\x89\x66\x3c\x0d\x43\x20\x57\x9f\x8a\x1e\x39\x93\xc6\xfe\x73\xf2\x91\x6b\x83\xe6\xe7\xb1\x64\xfa\x4c\x1a\xf8\xa4\x93\x57\xc5\x29\x3c\xe0\x45\x9d\x01\x8c\x3e\x6e\xd8\x57\x91\x99\xec\x5f\xe8\xd4\x89\x3d\x4f\x14\xae\xc9\xa9\xb0\x1a\x81\x7b\xa3\x50\x45\xab\xdd\x10\xbe\x50\x44\x48\xd1\x07\xef\xf7\xd2\x31\x1c\x21\xa4\xaa\xd1\xe1\x8e\xe1\xdc\x50\x98\xce\x07\xdf\x70\xed\x85\x78\x38\xb3\xa9\x77\xbb\xf1\x84\xe4\x4c\x8d\x21\x9e\x93\xdc\x13\xcf\x58\xd5\x15\xb9\x92\x03\xf2\xde\xb5\x02\x91\xf9\xe6\x56\xc7\xc5\xc2\x22\x45\xf7\xa3\x58\xca\xd1\x9b\xf1\x3f\x56\xfa\x00\xa5\xfe\x17\x4a\xa9\xf5\x80\x1c\xfa\x66\x29\xf1\x77\x2e\xae\x15\x0f\x63\x47\xe0\x9a\x58\x51\x32\xa5\x19\x43\xe4\x78\x2a\x42\x15\x94\x1c\x2d\x08\xf6\x9e\x2b\xa9\xb6\x7b\x36\xa8\x4c\x3b\xd7\x6c\xb6\xd3\x5b\x58\xda\x9d\x53\xb1\x53\x95\xc0\xd5\x16\x33\x08\x51\xd0\xb6\x76\xe0\xbb\x9d\xe6\x67\xc1\x9d\xc2\x72\x75\xf7\xca\xbd\xeb\xa6\xaf\xf9\xf2\xc0\xf4\x52\x65\x63\x4f\xef\x5b\x12\x42\x30\x58\x91\x5c\x2a\x70\x67\xda\x4f\x63\x20\x0d\xab\xaa\x5e\xf3\xa2\xa8\x70\x47\xca\x62\xac\x68\xca\xc8\x58\xd1\x62\xf2\x50\xb5\x04\x75\x9b\x65\xc3\x3f\x19\x45\xf7\x16\xe2\xdf\x61\xd1\xd5\xc8\xef\x0d\x10\x6f\x78\xc3\x66\xb9\x51\xb4\x28\x98\x22\x54\xc9\x12\x9c\x76\xf9\x94\xa9\x81\xbf\x05\x53\x2e\x82\x9f\x39\x91\x4a\xb1\xc4\x78\x13\xdd\x65\x05\x63\xc1\xaa\x48\xa1\x1a\xf5\xc1\x6a\xdf\x0d\x1b\x4e\xa4\xbc\x86\xaa\x39\x60\xc7\x47\xf4\x82\xfc\x8c\xcf\x3a\xae\x3e\xf3\x06\xad\x26\x29\x33\x94\x67\x90\x6b\xf2\xee\xcd\x5b\x97\x8d\xe2\xb5\x09\x3f\xcb\xe5\x89\x1d\x1d\x98\x21\x34\x75\x59\x52\x17\x6c\xca\xd9\x8d\xa3\xff\x6d\x79\x24\x7d\x32\x66\x02\x92\x27\xee\x48\x32\xea\x13\xcd\x53\x76\x02\xc5\xb8\xb7\x0f\xd4\xc2\x7d\x7f\xcb\x9c\xef\x13\x21\x77\x9f\x23\xf7\x9e\x21\x2b\x9c\xf5\xc1\x08\x3f\x97\xea\x0e\xe0\x9f\xd5\x6a\x83\x57\xab\xfb\x75\xd9\xe9\xaf\xc8\x57\x5f\x7d\x79\xeb\x4d\x39\xfd\xc8\xf3\x32\x7f\x45\xfe\xf2\xe7\x3f\x7f\xf9\xe7\xdb\x6f\xe3\x02\x6f\x7b\x79\xfb\xfb\xb9\x3d\x7f\x74\x71\xbc\x01\xf4\x4e\x43\xb6\xdf\xdd\xa1\xc1\x15\x86\x1a\x51\x9e\x95\xca\xa5\xa4\xae\x68\xa8\xbc\x8e\x7f\x03\x61\x9d\xaa\x98\x82\xfa\x11\x7d\x32\x9a\x4b\x52\x1b\x71\xc1\x34\xb4\x46\x29\x85\x62\x89\x1c\x0b\xfe\x6f\x96\xfa\xce\x28\x90\x78\x02\x00\xeb\x9e\xc5\x09\x13\x29\xf6\xa4\xb4\x27\xef\x84\x8a\x34\xbb\x2b\x21\x61\x85\x37\x8d\x77\x70\x2b\x92\xc1\xf9\xf7\x20\x82\xbd\xad\x7e\x31\x47\x2e\xe8\xac\xe9\x82\x60\x78\xae\x22\xd9\x5a\xbd\x29\x0a\xc6\xcb\x3b\xcc\xfb\x25\x73\x5c\xb0\x3e\xd1\x70\x86\xcf\x7e\x2b\x99\x9a\x41\xe1\x48\x65\x5e\x44\x89\x6a\x57\x15\xae\x80\x7f\x0d\xa7\xd7\x21\x92\xcb\x9c\x45\x5e\xa9\x52\x55\x3a\xca\xdc\xb3\xe1\x37\x0c\x83\xf8\x3e\x9c\x45\x0e\x89\x28\xb3\xec\xb6\x5b\x85\xbc\x2b\xf0\x15\xd3\xee\x1e\x83\x76\x35\x4b\x73\x55\xe7\xc4\x12\x4a\x7f\x52\x17\x45\xfc\xe2\x1d\x19\x14\x9b\xed\xb4\x88\x5f\x78\xa5\x9c\xd3\xd5\xf3\x4d\x57\xc3\xab\x59\xc1\x99\x81\xd7\x43\x12\x52\x57\x44\x99\x79\x4c\xf7\x06\x5e\x0f\xca\x1f\x5a\xcd\xd5\xb1\x64\xea\x1b\xe7\xf0\x68\xf0\xf2\xab\x38\x3f\x96\xbc\xfa\xd6\x05\xb2\x40\xf0\x55\x73\xb2\x1e\x90\x8f\xb5\xe2\x4a\xae\xe0\x1a\xc1\x6b\xeb\x20\x79\xd0\x49\xb4\x82\x60\x7e\x98\xb3\x64\xe5\x55\x55\x8c\x8b\xa9\x44\x94\xe6\x07\xe9\x70\x17\x0b\x3f\x9c\x53\xe5\x6e\x40\xb2\x3a\x5d\x2e\x28\xbf\xb1\x4a\x6b\x0d\x5a\x52\xea\xfb\x5d\xee\x77\xbf\xc1\xdd\xb5\x29\x9d\xd8\x20\xf5\x37\x2f\x33\xf6\x33\x37\x93\x77\x1e\x8d\xdd\x71\xb5\x29\x8b\x0c\x5e\x36\xfa\xc2\xb2\xd0\x45\xa5\x19\x9e\x62\x07\x2f\x96\xc8\x3c\x67\x22\xc5\x54\xa6\x9c\x5e\x33\x52\x35\x82\xb4\x3a\x1e\xa8\xc1\x30\x1c\xfb\x58\x50\x51\xe9\x89\x53\x2b\xcb\xef\xe2\xa8\x15\xf9\x69\xd5\xb3\x76\xe5\xa2\x8f\xbb\x8b\x3d\xa2\x6a\x8d\x5a\x51\x07\x19\xb2\x4c\x82\x13\x07\xf3\x55\x31\xd7\xda\xdd\x0a\x22\xd9\x7d\xea\x4e\x3d\x87\xfc\xc8\xc4\xb8\xc2\x99\xd2\x19\x34\x69\x75\x12\x58\x0a\x36\x20\x17\x4e\x85\x59\x4d\x2b\x5a\x45\x9c\xae\x28\x4a\x57\x3e\x10\x2b\x6c\x86\x07\x53\xd6\xff\x2e\xa6\xed\xd4\x7f\xb6\x0a\x75\xfd\xcd\xcf\x99\xbe\xa1\x53\xc2\xc3\xc8\x5b\xdf\xd2\xd5\xa9\x10\x68\x3b\x27\xbc\x12\x6c\x01\x0c\xae\xba\x3e\x39\xba\x38\x39\xbc\x3a\xe9\x91\xf7\xe7\xc7\xf0\xef\xf1\xc9\x9b\x13\xfb\xef\xd1\xbb\xb3\xb3\x93\xa3\x2b\xab\x47\x7c\x86\x38\xf0\xd6\x8c\xb3\xd4\xb5\xe7\x91\xac\x4b\x0b\x2a\x66\x64\x54\x1a\x2b\x0e\xaa\x87\xd5\x66\x41\xd1\x07\x40\xd3\xd4\x9a\x8c\x4f\x6e\x0d\x97\x13\x7c\xde\x6d\x12\x37\xbb\x40\xe8\x7c\x57\xcc\x75\xbf\x9a\xb4\x32\x93\xac\x5c\x15\x51\x9b\xf2\x4e\xc3\x72\x88\x0f\x82\xbc\x96\x8a\xb8\x3e\x5f\xaf\xc8\x6e\x21\x53\xbd\xeb\x8a\x4e\xec\x7f\x0f\xf0\xa3\x83\x4c\x8e\x77\x43\x2d\x0a\x23\x99\x1c\x13\x5d\x0e\x43\x8d\x10\x9c\xa6\x70\xf7\x67\xfe\xb6\x5a\x69\x45\x2f\x14\x0a\x45\xbf\x0a\x83\xd7\x7e\x13\xdf\x10\x8f\x7b\x00\x4d\xbe\x6a\x77\xda\x0f\xe6\x07\xfc\xec\x60\xf9\x0c\xbc\xe2\xc4\xd5\xdc\x2f\x3e\x08\xcb\xae\x37\x3c\x4b\x13\xaa\xd2\x05\x9e\x85\xc3\x0d\x97\x1c\xa8\x87\xb8\xb9\xd8\x23\xb9\x1a\xdc\x81\x67\xc8\x29\x53\x19\x2d\x30\x4f\x1d\x80\x8b\x21\x01\x0a\x1e\x72\xcc\x0a\x06\x75\x5a\xbe\x6b\x37\x13\x49\x26\x01\xa7\x03\x4f\xc6\x5e\xfd\xd5\x31\x21\xca\x83\x12\xba\x62\x9f\x6a\x87\xec\x6c\xac\x98\x83\x64\xe7\x07\x71\x2f\xa6\x47\xdf\x0a\xf6\x12\xaa\x47\xd0\x68\x0c\x9a\x2f\x23\x3b\xae\x0a\x6e\xa7\x47\x76\x02\x9e\x49\xea\xb4\xe4\x9d\xcf\x76\xaa\x1b\xe2\x3a\x2a\x50\x92\x5d\x60\xaa\x0f\xcf\x89\xab\x2d\x61\x81\x7d\xf8\x2c\x3c\xba\xc2\xa4\xb1\x47\x9b\x73\x62\xc1\x1c\xea\x03\x0d\x6a\x13\x59\x78\x6a\x55\x02\x78\xef\x13\xed\xf4\xa3\x9f\x1b\x28\x97\xc7\x52\x42\x47\x1c\x15\x55\xdc\x0c\xc8\x65\x8d\x79\x42\xf8\x2f\x06\xcd\xe1\x8a\x14\x54\x59\x53\xc4\xdf\x59\xef\x17\xf6\xd9\xbd\xdd\xc2\x56\x60\x82\x28\xbe\xb2\xa2\xd6\x7e\x19\x7e\x71\x94\x51\xad\x97\x78\x5e\x41\x10\xd8\x81\x09\xc3\x91\x09\xf5\xc1\x27\x00\xa1\x9e\xd0\xe9\x1d\x70\x09\x2b\x4c\xda\x50\x35\x66\xe6\xee\xc8\x08\x15\xb3\x77\x77\xc2\xa4\xf5\x57\x06\x56\xed\xaf\xb6\x9b\x3e\xf6\x2b\x50\xae\x3e\x17\xa6\x2f\x55\x1f\x7f\xf2\x8a\x18\x55\xde\x16\xe3\x32\x3c\x67\xb2\x34\x97\x2c\x91\x62\x79\x5d\x85\xbb\xaf\xb3\x50\xcf\x03\x8a\x4d\x5c\xb4\xf1\xd0\xab\x11\xbe\xe2\x24\x76\xb2\x57\x3a\x86\x8f\x30\xd6\x41\x5a\xde\xbd\x79\xdb\x66\xb1\x09\x94\x59\xdf\xbd\x92\x3f\x39\xb1\x2f\xc6\x61\xa6\x6e\xe6\x77\xfe\xec\x6d\x69\x1e\xfe\xa3\xff\x8f\xb9\x2b\xcb\x6d\x9b\x07\xc2\xef\x39\x05\xdf\xfe\xbf\x40\xe3\x9e\xa1\x70\xde\xba\xa0\xb0\xd3\x03\x30\x12\x1d\x0b\xb5\x25\x83\x94\xe2\x2e\xe8\xdd\x0b\xce\x0c\x29\x53\xe6\xa6\x48\x76\xac\x47\x9b\x1c\x2e\xe2\x50\xb3\x7e\xb3\xb4\x9e\xab\x78\x6b\xda\x8c\x38\x30\x47\x70\xfd\xaa\xe5\x6d\x77\x76\x1a\x9c\x77\x43\x97\xe5\x1a\x13\xdb\x48\xa6\x5f\x43\xbf\x53\x23\xdf\x39\x3e\x01\xe2\xdc\x42\x3b\x13\x32\xb9\x60\xd4\x51\xf3\x67\x2b\x79\x85\x0a\x24\x2f\xda\x0e\x72\xa7\x79\x4b\xe1\x95\x04\xaf\x73\xe7\x5b\x86\x57\x65\x8c\xa9\x89\x85\x90\xad\xfa\xcc\x55\xfb\xfd\x50\xf2\x40\x0e\xd5\x20\x6c\x52\xb5\xc0\x30\x28\x58\x1f\x6b\x51\xea\x1b\x9e\xb6\x00\xe9\xb1\xa3\xbe\x7a\x3b\xa4\x38\xd6\x93\xdf\x33\x90\xee\x7e\xaf\x87\xf2\xcf\x7a\xd5\xe8\x3d\xf9\xe8\xbd\x80\xdc\x80\x91\xd4\x6c\xf5\xe7\x44\x02\x35\x56\x8b\x9f\x3e\x8d\x7b\xfa\x8c\x77\x82\xd7\xfe\xa0\xfd\xc1\x89\x82\x76\xe3\xcf\x10\x0d\xc0\x8e\xdb\x4a\x8b\xac\x98\x6b\xa6\x98\x11\xa1\x4a\xb1\x13\x81\x94\xb3\x89\x01\xad\x34\xc2\x03\x0d\x90\x15\x6c\xf5\xcd\xed\x63\x0d\xfa\x24\x84\x53\x0a\x47\x2f\x2c\x93\xf4\x60\xb5\xa6\xe1\xaa\x40\x7c\x79\xda\x35\xc5\x0f\x04\x19\x03\xbc\x81\xea\xb7\x90\x26\xfa\xbd\xb2\x55\xbd\xa8\xf2\xd4\xb3\xa9\x8a\x69\xf6\xcd\x94\x1f\x02\x2a\x9a\xb6\xde\x40\x4b\xbf\x91\xbd\x65\xb1\xab\x29\x87\xef\x3a\x01\xb4\x46\x51\x81\xac\x01\xc7\x73\x70\xae\xb3\x60\xa0\x0d\x60\x20\x92\xca\xc8\xf7\x94\x63\xf3\xe1\x53\x38\x1f\x65\xd6\xa0\xd8\x58\x56\x0c\xb6\x80\xed\xab\x8b\x28\x14\x4e\x34\x7f\x26\xd7\xf2\x95\xc8\x93\x61\xf9\x42\xba\x9d\x72\x0e\xb5\x59\x43\x1c\x67\xf7\xf6\x05\x93\x11\xfa\x67\x8c\x0f\x2f\x17\x7c\x75\x94\x97\xa9\x1e\x03\x92\xe9\x82\x9b\x58\xb5\x83\x52\x4d\xd1\x13\xbf\x69\x64\x50\x81\x99\x6f\xf2\xf1\xac\xaa\x24\x21\x2d\x7d\x86\x63\xd7\xce\x53\x88\xf4\xed\x65\xbb\xbc\x67\x9c\x6d\x2b\xd5\x36\x92\x5c\x6b\x50\x3c\x4c\x72\xa8\x50\xea\x8f\x01\x9b\x27\x1a\x6e\x69\xa7\xc0\xf8\xe1\x20\xb8\x2d\x36\x44\xdf\x26\xa8\x16\x24\x45\xd1\xc8\xd2\x3b\x31\xa3\xdd\x7b\x65\x29\xef\xf0\x33\x64\x88\xee\xb8\x6a\x1f\xed\x1c\xb4\x80\x90\x79\x1b\xbb\xe2\x0f\x2d\xb1\x5f\x8d\x81\x9b\x69\xea\xfe\xcf\x86\xf1\x1a\xad\x1a\xd3\x64\xf0\xb4\x90\xd1\xaf\x0d\xa5\xb9\x57\xad\xeb\x68\x25\xb7\x93\x25\x5e\x67\xe6\x7b\xa1\x54\x34\xdd\x69\x10\xa4\x01\x38\xc1\xcc\xe2\x04\x53\x77\xf3\xb1\x47\x01\x01\xc3\x31\x0d\x2a\xd8\xaf\xf0\x51\x63\x20\x26\xa0\x41\xc1\xb2\xd5\xa4\x57\x76\xd8\x72\x95\xbb\x18\xcb\x45\x36\xd0\x38\x9b\x1d\x32\x67\x23\x05\x57\xb1\x84\xcd\xc1\xde\x3e\xc9\x4a\x6c\xd8\x92\xef\xc5\x6e\xc9\xd5\x9c\x9b\x0b\x37\xc0\x82\x89\xc5\xf3\x82\xfd\xb7\x3a\xf1\xb6\x7e\x6d\xda\x2f\xb1\x82\x0d\x09\x8c\x82\x1c\x8e\xbe\x28\x2f\x4f\x56\x12\xd2\x9c\x3b\x91\x67\x27\xcf\x30\xc2\xa1\x37\xc1\x9b\xf1\xac\xe3\x10\x3f\xba\x9c\xd8\x49\xb0\xf8\x15\xaf\xe5\xc8\x44\x4a\x65\x88\x0b\x6f\x99\xff\x12\x4b\xb2\x24\xd6\x5e\x93\xc9\xd9\xea\x1e\x1d\xcd\x15\xcc\xfe\xa7\x01\x76\x58\x99\xbf\x52\x5a\x05\x9b\x53\x6c\x79\xdb\x94\x7f\x7a\x81\xc1\xff\x23\x72\xf9\x7d\xfc\x2b\x3c\x15\x4e\xa0\x04\x47\x8b\x3e\x01\xd7\x0c\xc0\x78\x30\xa3\x92\xad\x83\x6c\x00\x74\x2e\x36\x54\xe5\x8c\xda\x38\xe7\xe3\x7f\xa8\x23\x27\x5e\xb0\x6a\x23\x24\x7c\x08\x56\x0b\xa5\x99\xe2\x5d\x64\xf8\x4c\x85\x2a\x4f\x99\x4a\x2b\xba\x49\x25\x96\xa5\x5f\xad\x69\x14\x7b\xc1\xf8\xe4\xea\x6c\x19\x3a\xf1\x08\x65\x2d\xad\xf1\x8c\x20\x96\x14\xff\x46\xd2\xf3\x1b\x70\x87\xcf\x00\x79\x58\x77\x59\xc1\x25\x8d\x8e\xe1\x42\xdf\xc0\x05\xa0\x4f\xe3\xdd\x4d\xd7\x93\x6b\xbf\x5d\x0d\xef\x40\x08\x37\x74\x4f\xf8\x5c\xcb\xea\xba\x6a\xbe\x3d\x4f\xe2\x78\x64\xd3\xbb\x01\x50\x92\xe4\x01\xba\x2c\x5c\x02\x3e\xa9\x53\xf7\xf6\xe7\x2d\x07\x16\x2a\x7a\xc6\x2e\x84\x0f\xa3\x84\x7c\x11\xa5\xe3\xa9\x23\x6c\x79\xf7\xb7\x13\xbf\x6d\x4f\x9f\xb6\x9d\xfd\xf9\x7b\xf7\x2f\x00\x00\xff\xff\x66\xd5\x65\xa6\x7e\x88\x07\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\xe4\xb6\x95\x30\x8c\xff\x9f\x4f\x81\x92\xbd\x8f\xa4\x75\x77\x6b\x26\xc9\xe6\xb7\x3b\xbf\xbc\xeb\xd2\x4a\xb2\xa3\xd7\x33\x1a\x95\x24\xdb\x4f\xca\xf1\x3a\x68\xf2\x74\x37\x56\x24\xc0\x00\x60\x4b\x9d\xc7\xcf\x77\x7f\x0b\x07\x00\x09\xf6\x45\xea\x26\x39\xa3\x8b\x81\x54\xc5\xa3\x26\x09\x82\x07\x07\xe7\x7e\xa1\x05\xfb\x01\xa4\x62\x82\xbf\x23\xb4\x60\x70\xaf\x81\x9b\xbf\xd4\xe8\xf6\xdf\xd5\x88\x89\xa3\xf9\xdb\xdf\xdd\x32\x9e\xbe\x23\x27\xa5\xd2\x22\xbf\x02\x25\x4a\x99\xc0\x29\x4c\x18\x67\x9a\x09\xfe\xbb\x1c\x34\x4d\xa9\xa6\xef\x7e\x47\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x38\x05\x3e\xba\x2d\xc7\x30\x2e\x59\x96\x82\xc4\xc9\xfd\xab\xe7\x6f\x46\x7f\x1a\xfd\xfe\x77\x84\x24\x12\xf0\xf1\x1b\x96\x83\xd2\x34\x2f\xde\x11\x5e\x66\xd9\xef\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x5e\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x3b\x55\x40\x62\x56\x31\x95\xa2\x2c\xde\x91\xb5\xf7\xd8\x79\xfd\x62\xa9\x86\xa9\x90\xcc\xff\x4d\xc8\x90\x88\x2c\xc7\x7f\x3b\x20\xd8\xd7\x5f\xdb\xd7\x3b\xc8\xe1\xf5\x8c\x29\xfd\xdd\xe6\x7b\xde\x33\xa5\xf1\xbe\x22\x2b\x25\xcd\x36\x7d\x08\xde\xa2\x66\x42\xea\x8b\x7a\x59\x66\x19\x89\x9a\x87\xff\x76\x37\x32\x3e\x2d\x33\x2a\x37\xcc\xf6\x3b\x42\x54\x22\x0a\x78\x47\x70\xb2\x82\x26\x90\xfe\x8e\x10\xff\x2e\x3b\xf9\x90\xd0\x34\xc5\x8d\xa4\xd9\xa5\x64\x5c\x83\x3c\x11\x59\x99\xf3\xea\xe5\xe6\x9e\x14\x54\x22\x59\xa1\x71\xb3\x6e\x66\x80\x50\x23\x62\x42\xf4\x0c\xc8\xc9\xf5\x0f\xd5\xad\x84\xfc\x8f\x12\xfc\x92\xea\xd9\x3b\x32\x32\x1b\x30\x4a\x99\x2a\x32\xba\x30\x4b\x08\xee\xb2\xbb\x79\x6a\xaf\x05\xbf\xeb\x85\x59\xaf\xd2\x92\xf1\xe9\x43\xef\x77\x1f\xb1\xdd\x12\xe6\xc1\x3e\x85\xaf\xff\x61\xe5\xf7\x6d\x5f\xef\x3f\x9f\x9a\x37\x13\x3d\xa3\x9a\xe8\x19\x53\x44\x70\x20\x12\x8a\x8c\x26\xa0\x1e\x58\xd0\x9a\x5b\xec\x8a\xae\x56\x2f\x6c\x58\x52\x38\xa5\xa6\xba\x54\xa3\x62\x46\xd5\x2a\x88\x2f\x97\x7e\x5d\x33\x9d\xbd\x71\xfe\x96\x66\xc5\x8c\xbe\x75\x3f\xaa\x64\x06\x39\xad\x71\x40\x14\xc0\x8f\x2f\xcf\x7f\xf8\xc3\xf5\xd2\x05\xd2\x84\xce\x5a\xec\x27\x4c\x19\x50\x21\x05\x21\x9e\x84\xe0\xde\x2d\x0a\x20\x7f\x5f\xfb\xcc\x75\x01\xc9\xdf\x47\x2b\x2b\x17\xe3\xff\x81\x44\x07\x3f\x4b\xf8\x47\xc9\x24\xa4\xe1\x8a\x0c\x80\x3c\x59\x5a\xfa\xd9\xc0\x3f\xf8\xa9\x90\x86\x2c\xe8\xe0\xc8\xdb\x11\xd0\xc5\xc6\xef\x4b\x5f\xbb\x6f\x40\xe2\xbe\x31\x35\x24\x11\x14\xe2\xa3\xc3\x38\x48\x1d\x1c\x2d\x9e\x32\x65\x90\x43\x82\x02\x6e\x89\x24\xa2\x10\x77\xdf\x34\x22\x06\x00\x20\x95\x21\x00\x65\x96\x1a\xda\x39\x07\xa9\x89\x84\x44\x4c\x39\xfb\x67\x35\x9b\x22\x5a\xe0\x6b\x32\xaa\x41\x69\x82\xa7\x96\xd3\x8c\xcc\x69\x56\xc2\x80\x50\x9e\x92\x9c\x2e\x88\x04\x33\x2f\x29\x79\x30\x03\xde\xa2\x46\xe4\x83\x90\x40\x18\x9f\x88\x77\x64\xa6\x75\xa1\xde\x1d\x1d\x4d\x99\xf6\x54\x3f\x11\x79\x5e\x72\xa6\x17\x47\x48\xc0\xd9\xb8\x34\x84\xf3\x28\x85\x39\x64\x47\x8a\x4d\x87\x54\x26\x33\xa6\x21\xd1\xa5\x84\x23\x5a\xb0\x21\x2e\x96\x23\xe5\x1f\xe5\xe9\x17\xd2\x6d\xb2\xda\x5f\x02\xdf\x5a\x74\x26\x9e\xc0\x3e\x08\x6b\x43\x5e\x2d\x26\xd9\xc7\xed\xb7\xd4\x20\x35\x3f\x19\xa8\x5c\x9d\x5d\xdf\x10\xbf\x00\x77\x2e\x11\xc2\xf5\xad\xaa\x06\xb6\x01\x14\xe3\x13\x90\xf6\xce\x89\x14\x39\xce\x02\x3c\x2d\x04\xe3\x1a\xff\x48\x32\x06\x5c\x13\x55\x8e\x73\xa6\x15\xe2\x1c\x28\x6d\xf6\x61\x44\x4e\x90\xe9\x91\x31\x90\xb2\x48\xa9\x86\x74\x44\xce\x39\x39\xa1\x39\x64\x27\x54\xc1\x27\x07\xb5\x81\xa8\x1a\x1a\xf0\x6d\x0f\xec\x90\x67\xaf\x3e\xb0\x72\xc6\x08\xf1\xbc\x74\xe3\xee\x6c\x3c\xc3\x24\x85\x24\xa3\xd2\x0a\x05\x44\x43\x96\x91\x8f\xef\x3f\x90\x99\xb8\x33\x58\xcc\xb8\xd2\x34\xcb\xf0\x14\x38\xfe\x6c\xc9\x69\x42\x39\xc9\x29\xa7\x53\x20\xb4\x28\x14\x99\x08\x49\x28\x99\xb2\x39\x70\x7f\xba\x46\xdb\x2e\x7e\x13\x91\x20\x96\xb8\xaf\x65\x50\xfe\xaa\x5b\xe0\xd2\x95\x4d\x64\xc3\x8c\x15\x19\xe8\x01\xa8\x1d\xd7\xf7\x22\x66\x73\x52\x72\xa5\x65\x89\x9b\x9d\x92\x5b\x58\x38\x24\xcf\x69\x41\x94\x16\xe6\xc7\x3b\xa6\x67\x84\x86\x08\x4e\x35\x62\xf1\x18\x88\x02\x4d\xc6\x0b\x62\xc4\x38\x24\x08\x5a\x88\x0c\xa9\x05\x3e\x8b\x84\x41\x82\x96\x0c\xe6\x40\xa8\x1c\x33\x2d\xa9\x5c\x54\xd8\xb0\x0c\xd0\x47\x80\x8a\x1f\x1b\x08\x0f\x9b\x41\x42\x1e\xc2\x45\x62\xc9\xad\x93\x5d\xd2\x4a\xb0\xdc\x02\x7a\x97\xe7\x0e\xdf\x6a\x71\x54\x39\x7c\x03\x45\x0c\x5e\x39\xf9\xa0\x92\x6b\xf1\x4d\x0e\xb1\x52\x22\x64\x85\x19\x06\x6c\x21\x12\x8e\xc1\x90\x13\x49\xb9\xb9\xb0\x16\xb9\x5b\x40\xeb\x21\xb4\x31\x43\xdc\xf1\x75\x38\x1a\xce\x4d\xa5\x6c\x08\x4c\xe1\x60\x1a\xf2\x0d\x33\x3f\x08\xbb\xea\x67\xb3\xc0\x39\x4b\xc1\x00\x51\x53\x66\x51\xc7\x9c\x56\x3a\x16\xa5\xb6\xb0\x73\xb7\xa4\x64\xce\x28\xa1\xd3\xa9\x84\x29\x22\xf0\xc6\xd7\x3e\x02\x13\x3b\x36\x1f\xd0\x7a\x0c\xad\x24\xff\xe0\x1d\x86\x0c\x3e\x78\x03\x5f\x77\xcc\xc3\x1b\x56\x85\xc5\xe6\x78\x6c\x0f\xed\xa0\x89\x81\x89\x07\xad\x90\x0f\xde\xbc\xcd\xde\xda\xf1\xc8\x0e\xdb\xd1\xdc\xe7\xa5\x85\xb8\xab\x63\x73\x3e\x6a\xd2\x6c\xc8\x01\xde\x58\x13\xdf\x31\x90\x02\xe4\x44\xc8\xdc\x1c\x14\x4e\x28\x49\xac\xfc\x56\x11\x1e\x24\x8d\x3c\x79\x08\x9c\x64\xdb\xfd\xb7\x63\x1b\x2c\xb0\x63\x48\x0a\xaa\x67\x8f\xdc\xb6\xdd\x56\xd9\x11\x02\xed\xd1\x9b\x1f\xa1\x66\x2b\x73\xd7\x1c\xa6\xf7\xb9\x0d\x18\x7a\x9f\x14\x79\xce\x36\xb3\x36\x50\xed\x8a\xde\x7d\x00\xa5\x0c\xcb\x46\x29\x4d\xd2\x3b\x02\x3c\x11\x86\x58\xfc\xbf\xd7\x1f\x2f\xec\xb4\x23\x72\xae\x09\xcb\x8b\x0c\x72\x23\x88\x91\x0f\x54\xaa\x19\xcd\x40\x22\x77\xfa\x9e\xe7\x8d\xbf\x1d\x26\x96\x0a\x52\x43\x8b\x52\xc8\xe8\xc2\x4e\x96\x42\x22\x52\x43\xa3\x85\x24\x85\x11\x70\xf3\xa2\xd4\x40\xa8\xbd\x8a\xef\x65\x7c\xba\x8e\x48\x77\x02\x0d\x31\x92\x48\x4e\xf5\x3b\x32\x5e\xe8\xc7\x50\x9f\x90\xfb\x61\xba\x2d\x0d\x08\x17\xf3\x38\x25\xb0\x63\x2b\x7a\x10\x4e\xfc\xe8\x57\x1a\x21\x94\x32\x0e\xf2\x52\x48\xbd\x0d\xd1\x32\xca\xc7\x14\xe4\x83\x77\x7a\x90\x31\xae\xff\xf0\xfb\x07\xee\x4c\xa1\xc8\xc4\xc2\xe0\xc5\xe3\x67\x65\xcb\xef\xd9\xfa\x5c\x6f\x3b\xdf\xb6\x67\x79\xcb\xf9\xac\x71\xaa\x8f\x99\xd6\x29\x50\xad\x26\xe2\x7d\x7d\x5b\xa5\x04\x3e\x19\xf3\xbb\x3c\xf7\xd6\x86\x2b\x98\x80\x04\x9e\x38\xda\xf4\x5d\x39\x06\xc9\x41\x83\x0a\x04\xe9\x45\xe1\x28\x8d\x91\x05\x97\xd9\xdd\xd3\x70\xb9\x47\xe4\x19\x7f\xdb\x23\x52\x8d\xbf\xed\x31\xd9\xc6\x8e\x5d\xd8\xe6\xe3\x48\x67\xc7\x4e\x34\xf6\x71\x04\x6c\x31\xe9\x7c\xbd\x39\xa7\xc3\xbc\x46\x27\x7e\x06\x12\xde\x75\x63\x19\x0d\xf9\x6e\xc2\x20\x4b\x09\x33\xc2\x9b\x59\x2c\x19\x67\x22\xb9\x75\x76\xcb\xab\x53\xa2\x84\x15\xf7\x8c\x84\x6f\x18\x6d\x22\xb8\x2a\x73\x20\xec\x31\x0c\x8e\x22\x5d\x14\xe9\xa2\x48\xf7\x52\x44\x3a\xeb\x1f\x78\x0e\x94\x6a\x69\x21\x1b\x69\x15\xde\x17\xa9\xd5\x43\x23\x52\x2b\x1c\x91\x5a\x3d\x32\x5e\x1c\xb5\xda\x4a\x4e\x7b\x74\xae\xc7\x0e\x72\x34\xa6\x46\x63\x6a\x34\xa6\xba\x11\x79\x99\x1b\x91\x97\x45\x5e\x16\x8d\xa9\x0f\x4d\x19\x8d\xa9\x3b\x4e\x14\x8d\xa9\xd1\x98\x1a\x8d\xa9\xd1\x98\xfa\xd8\xc7\x44\x91\x2e\x8a\x74\x51\xa4\xdb\x76\x31\xd1\x98\x1a\x8d\xa9\x0f\x8d\x48\xad\x82\x11\xa9\xd5\x03\xe3\x75\x53\xab\xee\xc6\xd4\x24\x03\xca\xd7\x2b\x55\x4b\xf1\xdf\x78\x1f\x8a\x46\x6c\xc2\x5c\x1e\x84\x7b\x9a\x8c\x61\x46\xe7\x4c\x94\x92\xdc\xcd\x80\xfb\x94\x1d\x32\x05\xad\x0c\x16\x80\x86\x75\x82\xf9\x23\xb4\xe6\x61\xfa\x32\x24\xc0\xe9\x38\x5b\x3b\xf1\x63\xa4\xc4\x3d\xf9\xb0\xf1\x78\x2c\x84\xf9\xba\x55\x88\xa1\xaa\xe3\x35\x9d\x5d\xe2\x99\xf7\x36\xe5\xd8\xad\x0f\x6a\x3e\xb9\x3a\xed\x2b\x94\x99\xfc\x8d\x93\xf3\x6a\x56\x82\x96\x69\x4c\x94\x30\x3c\xc4\xfc\xfa\xf1\x8e\x43\x8a\x49\x6e\x03\xc2\xb4\xb9\xc1\x1c\x7a\x96\x30\x9d\x2d\xaa\x17\x8f\xf6\x76\xdf\xc4\x67\x14\x12\x7d\x72\x75\xba\xbd\xf9\xde\x6f\xc0\xe7\xb0\xd4\x47\x3b\x7c\xb4\xc3\x57\x23\x8a\x41\x2d\x27\x8d\x62\xd0\x03\xe3\x75\x8b\x41\xcf\xdd\x6e\x1d\xad\xcd\x24\x5a\x9b\x1f\xbe\x2d\x5a\x9b\xa3\xb5\x39\xda\x6f\x36\x8c\x28\xb8\xe0\x88\x82\xcb\x23\xe3\xc5\x09\x2e\xd1\xda\x1c\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xf5\x12\x43\x77\xa3\xd1\x2f\x1a\xfd\xa2\xd1\x2f\x72\xa3\xc8\x8d\x1e\x19\x2f\x8e\x1b\x45\xa3\xdf\xae\x13\x45\xa3\xdf\xda\x11\x8d\x7e\x8f\x8c\x68\xf4\x8b\x46\xbf\x0d\x23\x0a\x2e\x2d\x27\x8d\x82\xcb\x03\xe3\x75\x0b\x2e\xd1\xe8\x17\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xd5\xdd\xe8\xf7\xc8\x49\x7a\xf8\xd9\x87\x4f\xca\x83\xcf\xb2\xe4\xa1\x17\x6e\x82\xe8\x03\x10\x7c\x94\x70\x3d\x46\xae\x86\x64\x4c\x15\xfc\xe9\x8f\x2b\x75\xcb\xc3\x5b\x72\x48\x19\x35\xaf\x5a\x7b\xc7\xe3\x24\xac\x7e\xc5\xe6\x3d\xdb\x62\xef\xab\x65\xb4\x9c\xc5\x15\x56\x7e\x34\x28\xd6\x6c\x6d\x7a\x6e\x6f\xbe\xd6\x92\x6a\x98\x2e\x82\x42\xde\x68\x93\xad\x39\x0f\xdf\x50\x80\xbe\x52\x1a\xef\x66\x20\x01\x1f\xf2\xa5\xa7\x95\x9f\x94\xa9\x2a\x7a\x39\x6d\x51\xdc\xf7\xb1\x70\x64\xff\x9e\x35\x97\x1f\xdb\xb4\x75\xd5\xb7\xd7\x02\xcb\x03\xe8\xd4\x5a\xaf\x4f\xab\x14\xe0\x65\x88\x15\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x83\xbb\x97\xe0\xbd\x89\x28\x6e\xc1\xa9\x1f\xe7\xd0\xc3\x20\x53\x79\x93\x65\x7d\x1b\xc6\xec\x7a\x60\x5c\x82\xcc\x99\x52\x9b\x02\xae\x9b\x4b\x7f\x8c\x6c\x6e\x41\x2e\x37\xc0\xdf\x7f\x51\xb0\x9c\x4a\x7c\xc2\x1d\x90\x63\x9a\x10\x59\x66\x46\x98\xe2\x29\x71\xe5\xaf\x09\x4d\x12\x51\x72\x4d\x38\x40\x6a\x2d\x1b\xeb\x70\x75\x0b\x62\xbb\x85\xfc\xb4\xad\xf4\x34\xb4\xeb\x7c\xf4\x2e\xf7\x0d\xc7\xf6\x13\xd6\x16\x54\x0f\xc7\xf6\xd2\x16\xbe\xfe\x71\xae\xb5\x0b\x2b\xdc\x9a\x11\x36\xf6\xf7\x52\x64\x2c\x59\x5c\x95\x19\x90\x99\xc8\x52\x85\x65\xfd\x0d\x77\xaf\x1c\x0e\xa1\x88\x5c\xe0\xdd\xb8\xfa\x01\x19\x97\x9a\xa4\x02\x14\xe1\x42\xfb\xc2\x00\x8d\xc7\xad\x8b\xe9\x6e\x66\x5b\x3b\x98\x87\x08\x2d\x8a\x0c\x53\x29\x84\x11\x5a\xee\x66\x2c\x99\xd9\x7e\x35\x05\x4d\x60\xdd\x6d\xdb\x4b\x2f\x5b\x89\xd7\x64\x27\x11\x9b\x78\x9b\xd5\xf8\x31\x54\x21\x3b\xca\xda\xc4\x96\x88\xff\x56\x8a\xb2\xd8\xf2\xf6\x55\xcb\xa2\x7d\xda\x50\x79\xbd\xd4\xc0\xc6\x5f\x74\x2e\x23\xbb\x37\xf6\xb6\xca\x24\x3a\x22\xe4\x7c\x42\xf2\x32\xd3\xac\xc8\xf0\x11\x5b\x6d\x40\x11\x2a\xa1\xe6\x1b\x03\x42\xf9\xc2\x7b\xa0\x5c\x9b\x08\x48\x09\x9d\x9a\x19\x35\xf6\x87\xf1\x25\xe9\x79\x99\x83\x39\xcd\x69\xfd\x12\x54\xa7\xf8\xa2\x9e\x9d\xdc\xb1\x2c\x33\xf2\x2c\xcd\x32\x71\xb7\x9e\x2d\xad\x1b\xbb\x09\x85\x64\x37\xc1\x90\xec\x2e\x02\x13\xc2\x05\xf7\xa6\xdd\xef\xaf\xde\xb7\xdb\xc4\x8b\xe6\x1c\xae\x17\x08\x68\x03\xd2\x82\x4a\xcd\x68\x46\x4a\x99\x29\xbb\x8f\xd4\x28\x01\xd2\x37\x53\x99\x51\xf4\x0c\x26\xa0\x6c\xd7\x0e\xf2\xaf\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x5b\x10\x6a\x77\x7e\x52\x66\xd9\x80\x4c\x18\xa7\x86\xec\x42\xe1\x33\x61\x8c\xfe\x44\xae\x19\x4f\xc0\x7c\xd3\xb0\x12\x2c\x70\x45\x66\x46\x73\xbe\xab\x43\x9a\x0e\x5c\x5b\x11\xab\x2d\x2b\xf7\x0a\x73\x60\x13\x3a\xce\x00\xfb\x5a\x38\x91\xe5\x4a\x64\x68\xde\x76\x86\xef\xd4\xf6\x22\xa1\xe1\xe5\xff\x62\x1c\x95\x14\x72\x85\x8c\xc3\x28\x3b\xc0\xf4\xcc\xe8\x3e\x45\x91\x2d\x0c\xa1\x30\xb8\x53\x23\xd4\x81\x2a\x93\x99\xf9\xa4\xbd\x42\xa4\x6a\xcf\x90\x91\x3d\x05\x89\x04\xad\xf6\x0e\xcd\x5f\xcb\xdf\x80\xdf\x17\x3e\x77\x44\x0b\xb6\x77\x38\x20\x08\x20\x6c\x74\x22\xf4\xec\xe5\xe2\xa1\xff\xd6\x46\x7f\xad\xc7\x46\x53\x6b\x0d\x67\x70\x5d\x3b\x44\x61\x9b\x60\x18\x1a\xad\x01\xf3\xa4\x0c\x52\x22\x1a\xf8\xf6\x50\xab\xc4\x9a\x90\x63\x4e\x20\x2f\xf4\x02\xb1\x38\x07\xca\xdd\xdd\x30\x07\xb9\xd0\x33\xa3\xad\x32\xf5\xf2\x0f\xff\x96\x8e\xa5\x7a\xac\x05\xb8\x3b\xf0\x1e\xb8\x35\x92\xdb\xce\x4a\xcb\xc0\xdd\xff\xd7\xfd\x50\xea\x35\xe2\x53\x4d\xcd\x5f\x2c\x28\x91\xbd\xb6\x02\xe3\x0f\xe6\xc9\x26\x08\xed\x4f\x96\x5a\x56\xf4\xe3\xfd\x7b\xdb\x45\xc9\xc1\xea\x3b\xc6\x53\x2b\xa2\x1e\x6b\xdb\x9e\x08\xae\xc0\x2c\x38\xb1\x99\x89\xbe\xc6\x51\x6a\x09\xa4\xdb\x89\xb5\xe0\xc7\xb5\xbf\x44\xd0\xaf\x0a\xb6\xdb\x0a\xa3\x8f\x4c\x1f\x68\x3e\xcf\x41\x59\xc1\x7e\x4d\x0d\xf9\xc7\x50\xb0\x81\x75\x46\x19\x14\xc8\xe8\x18\x32\xdb\x8c\xc9\x5c\xad\x97\x4f\x8e\xdf\x7f\xa8\xfa\x96\x49\xa0\x8f\x58\xba\x3e\x81\x8a\xb2\x85\x4b\x75\xa5\xfb\xdb\xea\xd8\x5e\x2a\x45\x50\xec\x66\x26\x26\xd7\xa0\xed\x01\xcc\x69\x61\xce\x9f\x9d\x63\xad\x95\xf3\x3d\x42\xfa\xf1\xc3\xb2\x93\x34\xbf\x7d\xb7\xa6\x75\x2f\xd9\xea\xa8\x6c\xe7\x0b\xde\xe5\xec\x3d\x60\xfb\xa8\x47\x03\xcc\x4b\x08\xed\x24\x7e\x27\xa3\x27\x55\xe7\x3d\x8b\xc1\xca\xa6\x4c\xdb\x04\x75\xe9\x7f\xaf\xa7\xe8\x79\x0b\x76\x51\xa7\x8c\x46\x9d\x41\xa2\xc5\xc3\x05\xe1\xfc\xcd\x1a\xf2\x22\x7b\xec\xe4\x91\x9d\x55\xaf\x9c\xf1\x2b\xa0\xe9\xe2\x1a\x12\xc1\xd3\x2d\x09\x6c\x63\x3f\x3e\x30\xce\xf2\x32\x27\xbc\xcc\xc7\x80\x20\x56\x76\x2e\x24\x24\x56\xad\xa5\x84\xc3\x5d\xb6\x70\xc4\x23\x25\x85\x48\x3d\x3d\x19\x1b\x35\x8c\xa6\x0b\xec\x7c\x86\xa5\x53\xf9\xc2\x4c\xc2\x74\xcd\x7d\x24\x49\x24\x55\x46\x60\x1a\xe0\xa4\x4c\x1b\x5e\x36\x06\xf4\x3a\xb1\x14\xcc\x1e\xd3\x39\x65\x99\x11\xba\x47\xe4\x14\x26\xb4\xcc\xb0\x81\x1f\x79\x43\x0e\xcc\xcb\xbc\xa6\xb5\xee\x01\x23\x08\x2b\x61\x74\x74\xe5\xb2\xdf\x71\x41\x87\x3b\xd8\xd1\xb7\xa9\xec\xe7\xc7\xb6\x15\xfe\xfc\x28\x68\xa9\xb6\x55\xd0\x1b\x1b\x73\xce\x53\x73\x1e\x42\x19\x35\x20\xe9\x4c\xb9\x99\xb7\x63\xd9\x0f\x57\x45\x58\xb3\x6a\x29\xa6\x12\x94\x3a\x05\x9a\x66\x8c\x43\x7b\xfc\xba\x99\x01\xc9\xe9\x3d\xe2\x98\x66\x39\x18\x49\x24\xc4\x30\x1a\x7e\x95\x16\x24\xa7\xb7\x50\xbd\x9e\x8c\x61\x82\x0d\x1a\xf1\x83\x83\xdd\xb7\xf8\x33\xa1\x2c\x83\x74\x84\xef\x08\x66\xa9\xfb\x1a\x5b\xc4\x31\x7f\x33\x5e\x82\x79\xaa\x90\x02\xd5\x4c\xfb\x68\xc8\xe3\x91\x87\x52\x73\xb3\xa5\xc3\xbe\x97\xdf\xe5\x12\x28\xce\xee\x13\x6b\xfe\x93\x40\x15\xde\x66\x71\x53\x95\x72\x62\x94\x4a\xaf\x8b\x06\x0b\x72\x4d\x60\xc9\x85\xd0\xae\x25\x60\xf5\x81\xf8\xb4\x6b\x51\x09\x4a\xb3\x1c\x0f\x58\x5a\x4a\xdf\x30\x13\x61\x46\xd7\x6f\x7d\xe3\xa8\xfc\xe9\xcd\x9b\x2d\xe5\xb7\x4f\x8f\xf4\x12\x50\x87\x6e\x83\x2f\x17\x15\x1d\xf2\xe4\xdf\x28\xc7\x66\x8f\x99\x13\x90\xb1\xf3\x27\x48\xf4\x20\x32\xa5\x19\x9f\x96\x4c\xcd\xc8\x18\xf4\x1d\x00\x27\x70\x6f\x6b\x5f\x90\x7f\x82\x14\xb8\xa9\x06\xbc\xb5\xf3\xa0\x01\xb4\xb7\xcf\x07\x62\x73\xa6\x98\xe0\x7f\x61\x4a\x0b\xb9\x78\xcf\x72\xf6\x48\x51\x52\x3f\x56\xfb\x1f\x57\x10\x14\x59\x8a\x5d\x8b\x59\x42\xaf\xc1\x7e\xb0\x04\xb4\x6d\x6a\x61\x15\x57\x62\xce\xc9\x98\x26\xb7\x9f\x0c\xc0\x6f\x9e\x0b\x84\x3d\xbb\x6e\x01\x55\x94\xf7\xaa\x09\x90\x6c\x59\xa4\x3c\xbb\xb7\xf0\x69\x40\xf9\x6e\x26\x14\xe0\x0d\xd6\xfc\x88\x8f\x79\x77\x01\x53\x15\xc1\x30\xa7\x5b\x70\x50\x84\x4e\x26\xcd\x3b\xea\xc3\x8e\x92\x67\x5e\x2a\x4d\x72\xaa\x93\x99\x35\x72\x89\xb4\x12\x27\xf6\x95\x13\xfb\x77\x81\xf2\xd6\xe6\xe5\xdd\x0d\xc1\xc4\xae\xf3\xec\xde\xe8\x96\x8f\xfa\x79\x9a\xa3\x01\xf2\xe5\x69\x9a\xba\x71\xd6\xdc\x10\x27\xb7\xe5\xb6\x79\xf0\x0d\x9a\x86\xeb\x5f\x70\x17\x8e\x2f\x4e\xb7\x37\xd2\xb4\x51\x70\x77\x56\x71\x97\x8d\xe0\x0f\x7c\x94\x37\xa6\xba\x2b\x4d\x4b\xb8\x6d\x1a\x3d\x20\x94\xdc\xc2\xc2\xf6\x97\x5e\x69\xd8\x2b\x21\x73\x92\x04\x60\xdf\x5a\x73\x93\x6b\x36\xbd\xc3\x7a\x77\xc6\x1e\x3b\x76\x73\x52\xf8\x31\x34\x0b\xdd\xf1\x09\xff\xd1\x3b\x3c\xb6\x3b\x82\xdb\x71\x0b\x8b\xdd\x1e\x58\xda\x6e\xb3\x0b\x4e\xf7\xb1\xfb\x6e\x7e\xa8\x04\xbd\x6a\xab\x77\xf3\x1e\x85\x63\x67\xe3\x95\x1f\x1e\x88\x9d\x3e\xaf\x42\xbf\xd0\xca\x64\xbe\x71\x5f\x59\x64\x34\x67\x7a\xc6\x0a\x64\x44\xde\x4d\xe0\xdb\x9f\xff\x40\x33\x96\x56\x53\xd8\xf3\x7b\xce\x07\x46\x7c\x32\xff\x41\xa2\x6b\xc5\xb5\x53\x01\xea\x42\x68\xfc\xe5\xb3\x01\xc8\x2e\xb3\x13\x78\xec\x14\xce\x3e\x8d\x54\x06\x15\xaf\xa0\x73\xba\x1a\xf9\x9a\x5f\x15\x28\x99\x22\xe7\x9c\x08\xe9\xe1\x80\xbd\xec\xed\x44\x76\x0a\xe4\x13\x63\xeb\xfa\x40\xcb\xf5\xda\x39\x1c\xf8\x84\x6c\x40\xef\x81\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\x57\x7e\x86\xd2\xae\x13\x55\xa9\x77\x7f\xb3\x84\xe4\x20\xa7\xe8\x8b\x49\xb6\xf6\x45\x34\x37\x65\x37\xba\x6b\xc7\xce\xd4\x37\x7c\xe1\x4e\x58\x80\xac\xc9\x9a\x80\xba\x30\x37\x3b\x43\xc3\xe4\xf4\x7f\x0c\x05\xc7\x3d\xf8\xbf\xa4\xa0\x4c\xaa\x11\x39\x26\x8a\xf1\x69\x06\x8d\x6b\x4e\xc3\x08\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd3\xcc\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x32\x4b\x1d\x38\x49\xc5\x50\x9e\xca\x05\xb6\x77\x0b\x8b\xbd\xc1\x0a\xd2\xec\x9d\xf3\x3d\xcb\x5b\x56\xd0\xa4\x62\x44\xe8\x3d\xdb\xc3\x6b\x7b\x7d\x72\xe1\x1d\x19\x4e\x5b\x3b\x5a\xf3\xa5\x5b\x63\x84\x8f\xfa\x68\x29\xac\x37\xb4\x44\x17\xeb\xa4\x05\x29\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x3b\x94\x1e\x9f\x8d\xe0\x67\x34\x09\xc6\xa7\xdf\x17\x29\xd5\x5b\x85\x9b\xda\xd1\x80\xc8\xfe\x95\x9d\x84\x94\x38\x8b\xc1\xad\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x74\x75\x0f\x11\xd3\xd8\x24\xb4\x25\x3a\xd8\xdd\x2c\x0a\x20\xff\x0f\xb9\x0a\xd7\x32\x22\xc3\xe1\x90\xdc\x7c\x3c\xfd\xf8\x8e\xd8\x5f\xac\x94\xad\x05\x99\x08\x54\x82\x44\x29\xcd\xab\xe6\xc0\x51\xf1\x37\xf2\xbd\xe0\xf0\x71\x62\x4e\x08\xd5\x30\x07\x49\xee\xcc\x56\x25\x2c\x85\xca\x7a\x35\xda\xff\xb4\x78\xdc\x4e\x32\xc9\xe9\xfd\x75\x29\xa7\x3b\x6c\x00\x59\xd9\x84\xd0\x64\x53\x2b\x93\x88\x7a\x61\xde\xae\x4a\x66\x90\x96\x19\xa4\x84\x8e\xc5\x1c\x1a\x26\xdb\xe6\x63\xc8\xd2\x4b\xf0\x0f\x1a\x9e\x37\x56\x22\x2b\x75\xa5\xac\x1e\xc0\xfd\x3b\xf2\x6f\xe8\xf4\xa6\xa4\x00\x99\x00\xd7\x74\x0a\xcb\x66\x00\x7b\xdf\xdb\x37\xff\x72\xe8\xf8\x91\x99\xd1\x59\x4f\xde\x18\x8c\xf8\x40\xef\xbf\xe7\xb5\x69\x90\x29\xf2\x66\x44\x8e\x97\x5e\x86\xcf\x65\x49\x99\xa1\xad\x05\x1d\xf9\xc1\x2b\xc7\x0b\x22\x45\x89\xae\x7c\x52\x16\x4d\x6d\xf6\xf7\xff\xf6\x2f\x46\xe9\xa3\x79\x91\xc1\x3b\x5f\x2e\xd5\xaa\xcd\x46\x86\xd1\x82\xfc\xe1\xcd\xbf\x58\xea\x69\xce\x67\xad\x15\xd6\x30\xa3\x06\x60\x65\x41\x58\x6e\x83\x34\x21\x5b\xd4\x75\x57\x65\x13\xfd\x95\xa6\x52\xab\x01\x41\x7f\x7f\x25\x1c\x6a\xa1\x69\xb6\xa4\xe5\xa3\x16\x0e\x77\x16\x48\xa9\x40\x98\x00\x1a\xaa\xc8\xdb\x3f\xbc\xf9\x97\x55\x73\xca\x47\x9e\x00\x3e\x89\x4f\x60\x00\xc6\xd8\x28\xf7\xb7\x2c\xcb\x20\x1d\x3c\xba\xfc\x49\x29\xf5\x0c\xe4\x80\x00\x57\xde\x58\x65\xd6\xb7\xb4\x36\x9c\x5d\x96\x9c\xa3\x8c\x60\xad\xc3\x68\xd1\x0a\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x17\x4a\xaf\x5f\xf2\xf6\xc7\xcd\x0c\xca\x17\x1f\x27\xbb\x8a\x03\xc3\x16\x66\x88\xd5\xa7\x5b\x88\x94\xf7\xc3\xdb\x2a\x87\x72\xc8\xb8\x1e\x0a\x39\xb4\xd3\xbc\x23\x5a\x96\x8f\x7b\x0d\xea\x91\x37\x4e\xc0\x67\x20\x03\x65\x70\xde\x56\x76\xf5\x93\x9c\xfc\xf6\xe7\x39\x15\x77\x7c\x33\xe5\x40\xc2\xe9\x68\x46\xcb\x53\xdf\xb4\xb8\x2d\x1d\x1b\xf3\x76\x73\xf7\xff\x6f\x15\xbb\x77\x20\x07\xee\xec\x56\xa7\xdd\xc8\x55\xe8\xf1\x18\x6c\xf1\xf6\xea\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x35\x94\x6b\xe5\x84\xaf\xa1\x40\x76\x1d\xb5\x43\x46\x63\x44\x81\x39\xe7\x6a\xe3\x41\xcf\x80\x2a\xbd\x0e\x14\xf1\xa0\x3f\x3e\x1e\x0e\xed\x5f\x1e\x4d\xa1\xd3\x48\x48\x08\xf2\xda\xc6\x78\x62\x11\x65\xef\x0a\xac\x87\xcf\x86\xa2\x35\x84\xa8\xbd\xea\x48\x98\xfd\x6b\xca\x57\x9f\x2a\xa0\xc6\x1b\x39\xdb\x88\xd6\xee\xd1\x20\xe4\xd7\x99\x4e\x1d\xf1\xaa\x3c\x8a\xd6\xa5\xf9\x6c\xa4\xe8\x1c\x34\x7d\x38\xfd\x63\x79\x34\x89\xf6\xb5\xa6\x3c\xa5\x32\x75\xab\xdc\xdf\x57\xd5\x94\x23\xf2\x01\x7d\x69\x7c\x22\xde\x91\x99\xd6\x85\x7a\x77\x74\x34\x65\x7a\x74\xfb\xef\x6a\xc4\xc4\x51\x22\xf2\xbc\xe4\x4c\x2f\x8e\xd0\x81\xc6\xc6\xa5\x16\x52\x1d\xa5\x30\x87\xec\x48\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x44\x0b\x36\xac\x65\x66\x35\xca\xd3\x2f\xfc\x8b\x3e\xb1\x60\xdc\x38\x43\x68\x5d\x92\x73\x18\x96\xfc\x96\x8b\x3b\x3e\x44\x4d\x56\xed\x74\x9a\xb6\x8b\x62\xf0\x63\x09\xde\xbb\x04\x2e\x14\x22\xfd\xe4\x9b\x60\x3e\x66\x48\x79\x3a\xb4\x4e\xc7\x4f\xbc\x17\x6d\x6c\xbb\xc3\x3a\x30\x60\x9b\x58\x74\x3b\xda\x69\x43\x34\xd1\x6c\x0e\xad\x9c\xd8\x7e\x34\xb6\xfb\xa3\x0f\x25\x4d\x4b\x69\x77\x3c\xf0\x66\x7b\xdf\x4c\x4e\x17\x28\xeb\xe0\xbb\x89\xb0\xac\x9c\x8b\x14\x9c\xe5\x73\x8e\xaa\xfd\xb5\x61\xe6\x37\x46\x14\x76\x3e\x6e\xb4\xfb\x2e\x94\x86\xdc\x12\x27\xfb\x7c\xb6\x20\x5a\x2e\xac\x63\x5c\xde\x1a\xe5\xd3\x79\xae\x8d\xc4\x7f\x8b\xf7\x29\x25\x12\x86\xa2\x4f\x0d\x57\x2f\x77\x79\x1b\x1e\x25\x85\x50\x0c\xdf\xed\x78\xde\x6e\x96\xb9\xf6\xec\x32\x70\xd3\xfd\xe9\x8f\xbb\x6c\xdd\x04\x1b\x2c\xec\x68\x65\x6f\x46\x50\x4c\xc2\xd8\x7f\xb7\x3d\xfb\xca\x2b\xae\x46\x2c\x49\x04\x57\x5a\x52\xb6\x39\xbb\x69\xfd\x68\xe9\x0a\x69\xef\x6f\x20\x88\x41\xc7\xad\x80\x42\x56\x63\xb0\x3c\x53\x44\xb4\xf4\xa0\x0e\x01\x63\x93\x9f\x7c\x2c\xa1\x21\x5c\x2d\x4d\xab\x2d\x60\x44\x3a\xc1\xc9\x3e\x0d\x13\x90\x12\xd2\x53\x94\x3e\xaf\xab\xef\x3a\x9f\x72\x51\xfd\x7c\x76\x0f\x49\xb9\x6d\x8e\xf8\xea\x58\xb1\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xc4\x66\x92\x55\x1b\x01\x81\xe3\xb3\x42\xe1\xca\x3d\x8c\x2c\xce\x26\x45\x30\x8d\xe4\x26\x99\x09\xa1\xcc\x29\xc7\xfd\xc4\x79\xe7\x4c\x58\x9f\x1f\xa6\xb5\x48\x92\x1b\x1a\xe3\xd3\x5b\xea\xe9\xad\xa1\xb6\x7e\x8c\x29\xab\x82\x57\x10\xf4\x5e\x2a\x33\x0d\x1a\x1e\xcd\x1f\x53\x94\x9a\x94\x26\xaa\xcc\xcd\xa4\x77\xc0\xa6\x33\xad\x06\x84\x8d\x60\x84\x58\x03\x34\x99\x05\xd3\xe6\x00\xba\xd1\x1f\x25\x44\xb5\xd0\x4a\x7c\x50\xe5\x3b\xb8\x04\x9d\x41\xc5\x63\x96\xf7\x72\x2d\xb8\x06\x04\x74\x32\x3a\x1c\x90\x3a\x85\xdc\xac\x71\xbc\x20\x4c\x83\xa1\xd9\xa8\x8b\x48\x51\x4e\xed\x97\x80\x8f\xe9\xc4\x75\x55\xc9\x20\xe8\x45\x4d\x51\x67\xdc\xb3\x1f\xb7\x67\xf6\x0d\x57\x5e\xe6\x46\x5f\xac\x88\x3a\x9a\xd5\x7d\x4b\x1d\x21\x25\xa8\x42\x58\x6d\x73\xd9\xe0\xfe\xff\xaf\x1e\x3a\x50\x87\x35\x30\x67\x6c\x3a\xf3\xb0\xa4\x8e\x11\x34\xf7\x60\xf7\xb3\x47\x3a\xf9\x52\xec\x68\xe9\x51\xb1\xa3\xe9\xdb\xf6\x99\x14\x35\x56\x05\xfb\xaf\x41\xe6\x15\x14\x11\x45\x90\x64\x38\x3b\xb7\x6f\x65\xe3\x70\x8c\xbc\x21\x07\x88\x64\x4c\xef\x2b\x44\xf8\xa1\x28\x0e\x47\xe4\x98\xf0\xb2\x3a\x73\x0f\xbd\x80\x8b\x6a\x7e\x37\x91\x79\xa9\x12\xf5\x5c\x2d\xbf\xb8\x13\xb9\xb3\xa3\x9d\xa7\x3c\x1c\x43\x07\x01\x78\xbc\x60\xe2\x43\x93\x58\x58\xb7\x9c\xa0\x1b\xe9\xf6\x73\xf8\xaf\x68\x3f\xc7\x4a\x80\x05\x1e\xd7\x3a\x8a\x02\x64\x3e\x08\xa5\xa7\xea\x40\x36\x4f\xb1\x85\x45\x5b\xac\x20\xfd\x60\x06\xe9\x09\xae\xa4\x53\x84\xce\xfa\xb1\x1c\xc6\xe2\xf3\xab\x1a\xd0\x6e\x10\xf9\xf1\x02\xaf\xee\x18\xbc\xb4\x79\x74\xa5\x74\xf5\xe8\x44\xf3\xea\xf1\x20\xe2\x3d\xbf\xc0\x9e\xf5\xa3\x27\xb4\xb5\xa3\x3b\x69\xab\xc7\xee\xa1\x41\x9b\xe6\x69\x11\x30\xb4\x7e\xf4\x75\x36\xed\x68\x11\x5c\xb4\x7e\xac\x88\xa8\x9f\x26\xd6\x68\xfd\x68\x6d\x24\x5d\x3f\xda\xc6\x25\xad\x1f\x4b\x49\x8c\x9f\x28\x48\x69\xd0\x8c\x50\x22\xdf\x6a\x7b\x8e\xdf\x77\xe2\x27\xf5\xe8\x19\xc4\xed\x22\x9b\xd6\x8f\x65\x01\xf0\x85\x44\x39\xad\x99\xea\x5b\x6d\xa6\x79\xbf\xf1\x61\x9b\xbd\xee\xe3\x74\x9c\x42\x31\x70\xa9\x33\xde\xce\x8c\x11\xd5\x85\x04\x2c\x38\x80\x61\x5f\xde\x0e\xf3\x79\x02\xab\xd6\x8f\xfe\x18\xa7\x1d\x3d\xb1\x4f\x3b\x7a\x43\x6e\x14\x78\xbe\xb1\x76\xe1\x27\x94\x75\xac\x65\x3a\xca\x3a\x51\xd6\xd9\x61\x44\x59\x67\xdb\x11\x65\x9d\x4d\x23\xca\x3a\x6b\x46\x94\x75\xa2\xac\xd3\x69\x3c\x3f\x59\xc7\x5a\xaa\x7a\x33\x98\xfd\x68\x0d\xae\xcb\x16\x32\x94\xa6\x7c\x48\x4f\xd3\x54\x66\x78\xff\xb5\x23\xb1\x37\x68\x5e\x73\x91\xea\x92\xf2\x29\x90\xb7\xc3\xb7\x6f\xb6\x4c\x07\x5c\x3f\xba\x04\xed\x84\x63\xd7\xd4\xc1\xe5\xb1\xc9\x23\xf1\xc9\xbc\x4b\xee\xa4\x56\x0e\x8f\x86\x84\xb9\xc1\x41\x54\xd5\xbb\xca\x41\x13\xaa\x1b\x06\x71\x96\x43\xe5\x10\x6d\xa4\x20\xd7\x31\xbd\x82\x3b\x7f\x87\xd9\xd4\x51\xbb\x15\x24\x40\x6d\x1c\xfb\x18\xaa\x55\x88\x1c\x6c\x82\xa9\x3f\xf4\x66\x09\xe0\x61\x45\x0e\x60\x34\x1d\x91\xd4\x26\x6b\x53\xee\x62\xc6\x0e\x07\xa1\x7b\x3c\x37\xc4\x55\xe2\x7f\xcc\xb2\x9d\x7f\x1c\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x12\x5d\x7d\x1f\x06\x04\x32\x6d\x9d\x9d\x5d\x5c\x29\x1d\xc4\xc3\xae\x22\xe1\x70\xe5\x6c\xed\xe6\xaf\xf6\xa3\xbb\xec\xb6\xb2\x8e\xf6\xf4\x66\x49\x2e\xb1\x10\x1a\x6d\x54\xab\xb4\x79\x9b\xf5\x57\xe2\x3f\x11\xc1\x3f\x5e\xb5\x75\x8f\x91\x9e\x78\x42\x67\x3e\xb0\xac\x40\x95\x59\x66\xd0\xdb\x7a\xcc\x56\x41\xb0\xc6\x93\xb5\x26\xdb\xc6\xba\x59\xf3\x20\xeb\x06\xef\xb9\x11\x85\xc8\xc4\x74\x11\xee\xa0\xed\xd5\x12\x94\xb7\xa1\x44\x95\x63\x27\x02\x9a\x43\x74\xb1\xb4\xe5\xd1\x17\xb2\x71\x44\x5f\xc8\xca\x88\xf6\x81\xe5\x11\xed\x03\x3b\x8c\x68\x1f\x58\x33\xa2\x7d\x60\x75\x44\xfb\x40\xb4\x0f\x74\x19\xaf\xdf\x3e\x40\xa2\x2f\x64\xd3\x88\xb2\x4e\x3d\xa2\xac\xb3\xfd\x88\xb2\xce\xea\x88\xb2\x4e\x94\x75\xa2\xac\x13\x65\x9d\xb6\xa3\x03\x72\x17\x22\xed\x3d\x45\xa6\x10\xe9\x03\x19\x32\xd6\x5e\x9d\x88\x61\x26\x92\xaa\xb2\x88\x79\xc4\x79\x3e\x14\xcd\xad\x09\x7d\x40\xfe\x29\x38\xd8\xf4\x04\x5b\xb2\x36\x07\x22\xb0\x3d\x44\x21\xd2\x03\x75\xd8\x22\xf0\x3c\x66\xd8\xc4\x0c\x9b\xdf\x40\x86\xcd\x8c\x2a\x57\xf8\x08\x49\xeb\xe6\x84\x9b\xe0\xf8\xdf\x80\xcc\x7f\xb3\xf9\x36\x06\xe1\x1c\xc2\x60\xf7\xb8\x1a\x29\x2c\xec\x52\xe7\xdb\x85\xf4\xb2\x09\x31\xa7\x97\xd9\xe6\x3b\x69\x0a\x29\x29\x40\x0e\x2d\x92\x09\x32\x61\xae\xfe\xd7\x12\xfe\x3a\x08\xbf\xf0\xbc\x99\x26\x24\x5e\x74\xf2\x4c\xf3\x53\x7a\xf3\x4d\x85\x2e\xba\x06\x57\x7c\x71\xa9\x34\xfd\x68\xa5\x43\xa2\x9d\x3b\xed\xbb\x4e\x7a\x69\x5f\x4a\x24\x2a\x79\xd7\x3b\x95\x39\xde\x3c\xd6\x16\xa7\xfd\x47\x09\x72\x41\xc4\x1c\x64\xad\x18\x55\x7d\x7b\x06\x55\x93\x99\x84\xba\x02\xc8\xfd\x18\x78\x7a\x31\x45\xf4\xa9\xa9\xf7\xed\x35\x24\xcf\xac\xfa\xf1\xe6\xd1\xaf\xe2\xd0\xa3\xda\xf0\xd2\x6a\x29\x6f\x1e\xbd\x9a\xdf\x48\xcf\x26\x38\xd2\xa3\x19\x8e\xf4\x6b\x8a\x23\xbd\x9b\xe3\x48\x9f\x26\x39\xf2\xd9\x2b\x40\x6f\x1e\x3d\x9b\x8f\x48\xef\x56\x3a\xf2\x02\xeb\x49\x6f\x1e\x9f\x00\xdc\x7d\x5a\xec\x48\xac\x4e\xdd\x79\xf4\x6d\x50\x23\x7d\x1b\xd5\x48\xdf\x78\xd8\xaa\x0a\xf6\xe6\x11\xeb\x63\x7f\x02\x39\xad\x37\x21\xa2\x6b\x4d\xed\xc7\x16\xda\x03\x4e\x56\x5d\x7d\x3f\x97\x02\x64\xb9\x74\xdd\x4a\xd6\xbc\x3b\xe8\xd5\x85\xa1\x9a\x61\xcb\x53\x1f\xb7\x8a\x18\x8d\xbf\xa7\xde\xe0\x55\xf2\xa0\x78\x5c\x30\xd9\x4a\xeb\x98\xda\x74\x56\x35\x8f\x31\x4a\x41\xdd\x74\x2a\x78\x18\xef\x1d\xd9\x70\xd2\x5a\x9a\xe0\xe9\x72\x80\x69\xfd\x04\xea\x17\xb6\xd1\xed\x9e\xb7\x63\xef\xab\xfa\x8e\xbd\x51\xd8\x13\xd7\xcd\x78\xf0\x7f\xfe\xef\x61\xa3\x7a\x4b\x3d\xa1\xa3\xca\xd5\xd9\x19\x83\xa6\xc3\x0c\xe6\x90\xe1\x3a\x7c\xc3\xe5\x99\x40\x8b\xb1\x2d\x7b\x1a\x18\xa4\x2e\x96\x77\x94\x4c\x80\xea\x52\x62\x05\x51\xe0\x74\x9c\x75\x3f\x2b\x51\xc1\x8c\x0a\xe6\x76\x23\x2a\x98\x1b\x47\x54\x30\x3b\x8c\xa8\x60\x6e\x37\xa2\x82\xb9\x79\x44\x05\x33\x2a\x98\x2d\x46\x54\x30\xa3\x82\xd9\x76\xfc\x86\x15\xcc\x7e\x03\xa7\x43\x75\xcf\xc5\xa1\xa0\xfc\xa8\xa9\x66\x49\x1d\x54\xed\xef\xb2\xff\xea\x57\xcd\x0c\x55\xc8\xf5\x4a\x66\xa8\x88\xae\x28\xda\xa3\x47\x34\xca\x4a\xe7\x5c\x79\xf2\x41\x65\xf3\xb5\xc5\x86\xf7\x86\x88\x81\xd3\xb9\x57\x4c\xbc\xf1\xa1\x6b\x75\x6b\xf7\x2a\xae\x2d\x25\x07\xde\xdb\x8f\xad\x5a\xb8\xd0\xcd\x8b\x5c\xb3\x61\x7d\x47\xe5\xff\xc7\xb0\x9d\x46\xc5\x80\x86\x93\xba\x8a\x92\xab\x22\xb0\x6a\xe4\x31\xd4\x11\x64\x63\x0d\xd8\x1a\x77\xc2\xb8\x8d\xa5\xf4\x6d\x85\x04\xf7\x61\x59\x96\x9c\x22\x01\xf4\x68\x6e\x25\x5f\x5c\x0f\x8a\xbf\x35\xec\x82\x38\x22\x8a\x67\x8c\x72\x97\x6e\x2b\xb8\xef\x7b\x6f\x7b\xd9\xd7\xe2\x72\xd5\xad\xa5\x7a\xfb\x88\x9c\x21\xd2\x87\x13\x33\x85\xf0\xa1\xb6\xc3\x4a\x3f\x26\x8a\xe7\x55\x1a\xe2\x6e\xe7\xd2\x10\x4b\x31\x29\xb1\x32\x44\xac\x0c\xd1\xa9\x32\x04\x5e\xb4\x87\xbb\xf7\x12\x11\xe4\x47\xd7\x80\x49\x02\x82\x2a\x2f\x33\xcd\x8a\x3a\xc6\x5b\xd9\x57\x65\x56\x91\x98\xb8\x58\xd3\x26\xbe\x9b\xb7\xd1\x64\xb6\x8c\xf7\x38\x1f\xc6\x84\x2b\x24\x27\x2e\x9e\x13\xdb\x25\x61\x4d\x03\xaf\x75\xd8\xa0\x55\xf6\xf2\x63\x11\x4f\x91\x60\xab\x5a\x69\xb6\xdd\xbc\x0c\x9d\xcf\x0c\x4a\x18\x8a\xfd\x00\x83\x08\x5b\x66\x60\x5c\x2c\x9b\x03\xaf\xb9\xc4\x81\x3a\x3c\xf4\xc2\x50\xaf\xdc\xeb\x93\x70\x9f\x3f\x07\x5c\xe2\x3f\xb7\xe1\x3f\xf8\x41\x15\x07\xaa\xc1\x57\xf3\x9f\x97\x1d\x74\xd9\x3d\x7e\xae\x0f\x83\x5c\x6f\x71\x73\x4f\x1e\x33\xf7\x5b\xaa\xae\xf1\x2c\x5d\x18\xcf\x4e\xeb\x78\x1d\x6e\x8b\x98\x92\xba\xfd\x78\x09\x29\xa9\x4f\xe4\x9a\x78\x39\x99\xa9\x2f\xd6\x1d\xf1\x52\x32\x53\xa3\x0b\x62\xa7\xf1\x5a\x13\x46\x9b\xa3\x47\x97\x43\x74\x37\xf4\x2c\x53\xf5\xc2\xfc\x3f\x8d\x9b\xa1\x17\xfc\xeb\x35\x7e\x2d\xc6\xae\xbd\xf2\xd8\xb5\xa8\xe8\x45\x45\xaf\x39\xa2\xa2\xb7\x32\xa2\xa2\xb7\xc3\x88\x8a\xde\xe6\x11\x15\xbd\xd5\x11\x15\xbd\xa8\xe8\x6d\x31\xa2\xa2\x17\x15\xbd\x6d\xc7\x6f\x4c\xd1\xeb\xaf\x68\x7c\x8c\x21\xeb\x3f\x86\xac\x1f\x42\xd8\x03\xf9\xeb\x05\xe9\x7a\x8a\x19\x8b\xf1\x62\xcf\x3b\x5e\xac\x63\xe9\x3c\xae\xd9\xa7\x29\x9f\x17\xee\xf6\xa6\x1a\x7a\x74\x2e\x58\x4a\x8a\x52\xbb\x0a\x62\xb1\x8e\xde\x73\xae\xa3\xd7\xd8\xd1\x58\x4c\x6f\xab\x62\x7a\x9b\x60\x16\x2b\xea\x6d\x18\xcf\x27\x8a\x2d\x56\xd4\xdb\x75\xc4\x8a\x7a\xeb\x47\xac\xa8\xf7\xc0\x88\x15\xf5\x62\x45\xbd\x58\xf0\xa0\xc3\x88\x05\x0f\xd6\x8c\x58\xf0\xa0\xfd\x88\x05\x0f\xb6\x1a\xb1\xe0\x41\x2c\x78\xd0\x1c\xd1\x09\xd5\x6d\xc4\x82\x07\x1d\x47\x74\x4c\xc5\x82\x07\x9d\x26\x8c\x15\xf5\x62\x54\xe2\xee\x23\x2a\x98\x51\xc1\xdc\x6e\x44\x05\x73\xe3\x88\x0a\x66\x87\x11\x15\xcc\xed\x46\x54\x30\x37\x8f\xa8\x60\x46\x05\xb3\xc5\x88\x0a\x66\x54\x30\xdb\x8e\xdf\xb0\x82\x19\x2b\xea\x3d\xf7\x68\x48\xf2\x1c\x53\x9e\x62\x45\xbd\x18\x21\xd9\x6a\xbb\x63\x45\xbd\xc7\xc7\x6f\xbe\xa2\x5e\x23\x5a\xef\xe9\xca\xea\xed\xbe\x8c\x58\x5b\x2f\xd6\xd6\x8b\xb5\xf5\x62\x6d\xbd\x58\x5b\x2f\xd6\xd6\xdb\x7e\x3c\x7f\x67\xc6\xb3\xd3\x3f\x5e\x87\x03\x23\x96\x5c\xd8\x7e\xc4\x92\x0b\x1b\x47\x2c\xb9\x10\x4b\x2e\x44\x67\x44\x9b\x11\x4b\x2e\xec\x38\xa2\xe3\x21\x96\x5c\xd8\x69\xc4\xda\x7a\x31\x8a\x6d\xfb\x11\x15\xbd\xa8\xe8\x35\x47\x54\xf4\x56\x46\x54\xf4\x76\x18\x51\xd1\xdb\x3c\xa2\xa2\xb7\x3a\xa2\xa2\x17\x15\xbd\x2d\x46\x54\xf4\xa2\xa2\xb7\xed\xf8\x8d\x29\x7a\xb1\xb6\xde\x73\x8e\x26\x8b\xb5\xf5\xd6\x8c\x18\x39\xf6\xbc\x23\xc7\x5a\xe2\x0a\x2d\xb5\xc8\x45\xc9\xf5\x35\xc8\x39\x4b\xe0\x38\x49\xcc\x5f\x37\xe2\x16\x76\x8c\x56\x6a\x6a\xa1\x0f\x4c\x4b\x18\x4f\x59\x82\x7a\xe4\xdd\x0c\xb0\x34\x9e\x11\x6f\xf1\x3e\x42\xed\x8d\x44\xe3\x9d\x35\x7a\xe1\x3a\x0d\x4d\xc3\x10\x1e\x9c\x7a\x57\x78\x59\x08\x8d\x85\xc8\x80\xf2\x1d\x9e\x74\xcc\x10\xe4\x8e\xa7\xb9\x01\x90\xf7\x8e\x12\xd7\x93\x91\x31\x64\x82\x4f\x5d\xc4\x90\x3b\x01\x23\x72\x52\xdf\x90\x50\x8e\x87\xa7\x94\x12\xb8\xce\x16\x08\x07\x2c\xd2\x85\x4a\x43\x2e\xe6\x90\x22\xc5\xc6\x40\x25\x2b\x46\x52\x4d\x32\xa0\xe6\x5d\x1c\xea\x97\x99\xc3\x43\xc9\x25\xce\x6f\x27\x1d\x83\x0b\x9e\x6a\x05\xc4\xdd\x69\x63\x2b\x6a\xb8\x64\xd8\x70\x52\x13\xb2\xa5\x04\xd5\xa3\xe0\x0b\xf1\x68\x2e\x44\x49\xee\xa8\x15\x94\x64\xc9\xf1\x30\xe3\xa7\x1b\xd0\xee\xf8\xf2\x0e\x22\x49\x7b\xeb\xc3\x10\xa9\xda\x8e\x8f\x75\xb1\x06\x50\x39\x6d\xc5\xa4\x1a\x5b\xb3\x7f\x2c\xa7\xa5\x95\x08\x1d\x2a\x03\xd7\x72\x81\x11\x7d\x56\xa4\x48\x45\x72\x6b\xd0\x30\xa7\x53\xd8\xdf\x57\xe4\xe4\xc3\xa9\xa1\x7d\xa5\x32\xa4\xda\x95\x09\x74\xb4\xb0\x90\x62\xce\x52\x83\xd9\x3f\x50\xc9\xe8\x38\x33\x32\xe7\x04\x24\x70\x23\x12\x7c\x79\xf0\xc3\xf1\xd5\x2f\x17\xc7\x1f\xce\x0e\x51\xfa\x84\xfb\x82\x72\x73\x24\x4a\x55\xc7\xa1\x3a\x9c\x30\x2f\x02\x3e\x67\x52\x70\xb3\x38\xd4\xd3\x28\x99\xfb\x59\x93\xea\x24\x48\x50\x22\x9b\x43\x6a\x65\xe4\xea\x6d\x9e\xe5\x30\x5e\x94\xda\xeb\x8d\x18\x1d\x69\x4e\x0f\x4f\x66\x94\x4f\xcd\x3a\x4f\x45\x69\xe6\xfb\xf2\x4b\x5c\x91\x84\xb4\x4c\xac\xd4\x44\x3d\xca\x7e\x39\xf0\x6c\xc2\x10\x7a\x65\x6b\x3a\xaa\x84\x16\x7e\xcd\xe1\x67\xa9\x05\xd7\xf4\xfe\x9d\x0d\x0f\xdc\xfb\x32\xb8\xb4\xe7\xeb\x61\x0a\xf3\x0a\xcb\x6c\xec\xaa\x32\x2c\xc5\x98\x91\xbd\xf0\xee\x11\x39\x33\xef\x80\x34\x04\xa0\x8d\xee\x84\x39\x48\xd4\x3a\x1d\xf8\x06\x44\xc2\x94\xca\x34\x03\x85\x71\x8d\x9e\x30\x5b\xcd\xc0\x01\x0c\x2a\x9d\x96\x0b\xbd\x8e\x92\x90\x0f\x02\x63\x1c\x27\xe2\x1d\x99\x69\x5d\xa8\x77\x47\x47\xb7\xe5\x18\x24\x07\x0d\x6a\xc4\xc4\x51\x2a\x12\x75\xa4\xa9\xba\x55\x47\x8c\x9b\x93\x35\x4c\xa9\xa6\xc3\xe0\x48\x1f\x59\xb6\x3d\x4c\x44\x9e\x53\x9e\x0e\xa9\x43\xad\x61\xb5\xad\x47\x5f\x38\x86\x3a\xa4\xd5\x5d\x8c\x0f\xe9\x50\xcd\x20\xcb\xf6\x5b\x20\x73\x37\x81\xaf\x83\xa0\xd7\x49\xc0\x73\xdf\xde\xfd\xf4\x9e\x55\x87\xd5\xc2\x60\x44\x2e\x84\x76\xe1\xb7\x2e\xd2\x1b\x89\x28\xc2\x77\xfd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\xbd\xb4\x19\x1c\x93\x6a\xbf\x91\x47\x2b\xd0\xfe\x18\x54\x1b\xd0\x59\x36\xb4\xe3\xc9\xa0\xde\x80\xc0\x19\x9f\xff\x40\x9b\xa6\x75\xbe\x16\x1c\xc4\xdd\x60\x45\xe4\x4a\xfa\xee\x12\x7b\xdf\xc1\x8c\xd5\xd5\x6f\xd5\x4a\x7e\xb4\xa3\xbb\x4f\xc9\xbc\xba\xbd\x89\xa1\xb1\x7d\x17\x34\xaf\xeb\x6b\xaf\xd9\xb5\x11\xf9\xe0\x15\x1e\x72\xf2\xcb\xf9\xe9\xd9\xc5\xcd\xf9\x37\xe7\x67\x57\xed\x35\xe8\x1e\x6c\x2d\x68\x4d\xe8\x09\x00\xfb\x2d\xb9\x64\x21\x61\xce\x44\xa9\xb2\x45\x65\xff\x58\x4f\x04\x96\x4f\xbf\x73\xf8\x2e\x2a\x4d\x7c\xed\x63\x91\xd9\xf6\xcb\x6c\x4f\x61\x42\xcb\xcc\xea\x4d\x7b\x7b\xa3\x36\x5c\xce\x8e\xbe\xd0\xf7\x1b\x29\x3a\xd4\x8f\x6e\xa0\xf0\xb5\xad\x3c\x3f\x11\x72\xe3\x31\xde\x77\x61\x07\x0d\xd6\xe3\x84\x47\x6b\x9b\x73\xd2\xa3\xf5\x8e\x75\x84\x4e\x47\xf7\x42\x3f\x4e\xf7\x44\xf0\x09\x9b\x7e\xa0\xc5\x77\xb0\xb8\x82\x49\x37\x03\x71\x13\xde\x68\x77\x74\x3e\x64\xb4\x52\x1a\x76\x66\x5f\xd6\xcd\x3f\xd3\x9b\x77\xa6\xaf\xb0\x8c\xee\x21\x19\xfd\x45\x50\xf4\x12\x3d\xb1\x52\xcd\xdf\x5a\xa0\x9d\x2d\xb9\xaf\xe0\x9a\x5e\x5c\xf6\xdd\xb8\xbc\x1f\x4d\x66\x17\xb2\x7b\x47\x67\xf5\xb6\x6a\x47\x22\x78\x02\x85\x56\x47\x62\x6e\x38\x17\xdc\x1d\xdd\x09\x79\x6b\xf4\x08\xa3\xb8\x0e\x2d\xd6\xaa\x23\xf4\x16\x1c\x7d\x61\xfd\x5f\x37\x1f\x4f\x3f\xbe\x23\xc7\x69\xea\x5a\xb3\x94\x0a\x26\x65\xe6\x9a\x21\x8c\x08\x2d\xd8\x0f\x20\x15\x13\x7c\x40\x6e\x19\x4f\x07\xa4\x64\xe9\xd7\xed\x89\xb3\x1f\x3d\xee\x82\x28\xac\x8f\xb3\xe7\x9d\xb8\x46\xef\xca\xa2\xc1\xbb\x2a\x22\x62\xb8\x16\xd3\x0a\x71\xd3\xdb\x9b\x9d\x90\xd1\x13\x68\x76\x37\xce\x2f\x0f\xdc\xc2\x7e\xe9\xea\x7e\x4d\x58\xad\x6f\xd3\x21\x6a\x21\xd2\x77\x44\x95\x45\x21\xa4\x56\x24\x07\x4d\x8d\xd2\x3b\x32\x18\x36\x68\xfe\x89\x5e\xaa\x01\xf9\x7b\xf5\x23\xba\x9a\xd4\x4f\xfb\xfb\x7f\xfe\xee\xec\xaf\xff\xb9\xbf\xff\xf3\xdf\xc3\xab\xc8\x0a\x6d\xf8\x4f\xf3\x16\x55\x40\x32\xe2\x22\x85\x0b\x7c\x07\xfe\xa9\x1a\x0e\x16\x77\x41\x53\x5d\xaa\xd1\x4c\x28\x7d\x7e\x59\xfd\x59\x88\x74\xf9\x2f\xd5\x41\xe2\x20\xcf\x93\x31\xe0\x16\x5d\x52\x3d\x7b\x26\xec\xa1\xa6\x25\x3d\x1f\x55\x37\x6b\xd8\x02\x28\xa7\xf8\xcf\x6f\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x74\x73\x69\xe6\x62\x32\x30\xa7\xb6\x16\x3b\xe7\x6f\xf7\x9e\x15\x83\xa9\x76\xb0\x67\x80\x21\x44\x1c\xb4\xec\x41\xae\x18\xec\xaa\x73\xf9\xf8\xf2\x9c\xcc\x2d\x84\x9f\x0d\x70\x7c\xea\xf0\x37\x9f\x94\xc6\x55\x2d\xa3\x1c\xa8\x2a\x0d\xf1\x9d\x8d\x06\xaa\x12\x98\x49\xc6\x72\xe6\x82\x0c\x5d\x7b\x29\x45\x0e\xec\x8f\xa3\xa4\x28\x07\xee\x86\x51\x0e\xb9\x90\x8b\xea\x4f\x28\x66\x90\x1b\x4d\x6b\xa8\xb4\x90\x74\x0a\x83\xea\x71\xfb\x58\xf5\x97\x7d\xb0\xf1\x82\xd5\xa7\xad\x2a\x5c\x3b\x49\x1d\x45\x86\xf4\xf5\xd1\x36\x0f\xfa\x67\x42\xda\x2a\xcc\xb8\xf8\x04\x22\x61\x65\x89\xb3\x02\x67\x05\x45\xd4\x27\xe7\x22\x2b\x73\x50\x83\x4a\x0c\xb2\xd6\x00\x3e\x37\x9a\xa5\x7a\x56\x82\x5a\xca\xe6\x4c\xf5\x11\x3f\xbc\x46\x4e\x63\x2e\x14\x5f\x94\xba\x28\xb5\xab\x65\x13\xb4\xa5\x13\x0a\xed\x16\x55\xc1\x81\x06\xd9\x7f\xdb\xb5\xe0\x16\x21\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf3\xd2\x29\x5f\x7c\xec\x48\x40\xed\x18\xf6\x56\x8a\x68\x79\xc6\x9e\x02\xac\xef\x87\xb5\xd2\x34\x64\x5c\x0f\x85\x1c\xda\xa9\xdf\x11\x2d\xcb\x6e\xc4\xa4\x66\x4a\x7d\x9f\x7f\xdf\x7b\xec\x5d\xcd\x90\x2a\x76\xfd\x6c\x0e\xb8\x82\x44\x82\xfe\x1c\x96\x1c\xfb\x26\x2f\xa7\x2c\x05\x3b\xbe\x36\x3e\xf7\x5b\x30\xee\x54\xc1\x82\xb8\xaf\xb5\x24\x3a\x91\x22\x1f\x91\xc0\xbd\x31\xc7\x4c\x0f\x77\xdf\x2d\x74\xb0\x82\xfa\x11\x8d\x41\xd1\x18\xb4\x61\x3c\x6a\x0c\xba\xb6\x78\xf8\x6c\x2d\x41\xc0\xe7\x6d\x5d\x18\x6b\x3d\xe8\x5e\xd7\xd1\x82\x14\xa2\x28\x33\xaa\x37\x78\xc6\xd6\xb8\xd3\xdd\x51\xaf\x23\x91\xeb\x48\x1a\xcb\xd0\xf2\xf5\x3e\x4c\x72\x9c\x65\x84\x71\x7b\xf0\x71\x02\xef\x30\x93\x60\x55\x1b\x42\xad\x3f\x7b\x6e\x96\x70\xe7\x4a\xd6\x85\xe1\x9e\x8a\x28\x4d\xa5\xc6\xa8\x63\x2c\x69\x67\x59\x89\xf3\x3e\x31\x5e\x17\xb6\xab\x84\xc3\x2a\x09\x64\x6d\x5f\xcf\x8c\x2a\xed\x97\x8d\xab\xd1\xf4\x16\xbd\x8d\x09\xa4\xc0\x13\xc0\x8c\xb4\x12\xea\x6f\x1d\x1b\xbd\x8d\x9c\xf1\xb9\x9d\x83\x92\xb4\xb4\xc1\x20\x96\xfc\xad\x9f\xe3\x75\x05\x20\x18\x44\xbc\xf6\xed\x97\xab\x38\x04\xa4\xfa\x95\x86\x5d\x25\xf6\x55\x56\x56\xf5\x34\x91\x07\xdd\x79\x66\xe5\xd9\xea\x24\x0c\xad\x30\xcb\xda\xfc\xdc\x64\x92\xaf\xc1\x19\xd8\x9d\x7d\xfe\xe6\x58\x67\x4f\x6c\xb3\x1f\x96\xb9\x83\xef\xa4\x4f\x36\xd9\x87\xb3\xa4\x90\x30\x61\xf7\x3d\x9d\xd3\x63\x5e\x5b\x62\x58\x0a\x5c\xb3\x09\xb3\x1d\xfb\x0b\x09\x05\xf0\xb4\x2a\x8a\x8a\x59\xe1\xbc\x09\x9b\x67\x19\xcc\x63\x05\xee\x7e\x49\xd9\xf5\x3a\x61\x3f\xd2\x31\x12\xe9\x58\xeb\xf1\x99\xe8\x98\xc3\xdc\xe7\x43\xc4\x30\xf2\xbc\x7b\xe8\xfb\x69\x10\xc7\x8e\x58\xbc\x33\x96\xd5\x09\x5d\x47\x38\x8b\x5a\xaa\x1e\x54\xd1\x45\x2d\x6c\xe4\x1a\x99\xb1\xa9\x01\xab\xad\x28\x64\x85\x26\x92\x53\x4e\xa7\x36\xab\x5b\x0b\x6f\xa7\x35\x5a\x96\x41\x62\xc9\xd2\x86\x70\x6f\x5f\xc3\x38\x31\x88\x9d\x09\x9a\xe2\x45\x29\xb2\x0c\xa4\x22\x19\xbb\x05\x72\x0a\x45\x26\x16\x2e\x49\x9b\xa7\xe4\x5a\x53\x6d\x50\xfa\x1a\x74\x3b\x9f\x6f\x27\x74\xc5\x15\x5f\x96\x59\x76\x29\x32\x96\xb4\xb2\xa8\x34\xb7\xed\x1c\xf7\xab\x28\xb3\x8c\x14\x38\xe5\x88\x7c\xe4\x48\x31\x8e\xb3\x3b\xba\x50\x03\x72\x01\x73\x90\x03\x72\x3e\xb9\x10\xfa\xd2\x8a\xde\xcd\x68\x3b\x7b\x23\x61\x13\xf2\x0e\x6b\xda\x68\xa2\xe9\x14\x15\x27\xef\x03\x1c\x18\xf8\x87\x13\x58\xe2\x70\xc7\xd4\x5a\x4d\xa5\x33\xe2\x7c\x81\x33\x19\x42\x65\xff\xfe\xec\xdb\x94\xb1\x09\x24\x8b\x24\xeb\x7e\xae\x8e\x13\x8c\x5e\xa8\xf3\xcc\x03\xfc\x76\x65\xda\x5d\x6a\x27\xaa\x80\x8c\x13\x5b\x3f\xdd\x16\x86\xaf\x51\xbd\x5a\x91\x55\x75\x55\xaf\x1a\x62\x6b\xce\xd9\x95\x67\x16\x42\xe9\x6b\xa3\x9e\xf7\x52\x65\x7d\xff\xd2\x4f\x47\xb0\x96\x74\x96\x41\x4a\x58\x9e\x43\x6a\x54\xf8\x6c\x41\xe8\x44\x63\x8a\x6d\xc3\x3c\x90\x48\xb0\x58\xeb\x6a\x97\xcc\x28\x4f\x33\x90\x64\x42\x59\xe6\x8c\x01\x8d\xfb\x35\xc8\x9c\x71\xb4\x09\x58\x77\x2c\xda\x17\xcc\x5f\x49\x22\xa4\xaf\x7b\xcf\xb4\xf2\x97\xea\x83\x89\x4c\x24\x40\x80\x65\xbf\x32\x19\x67\x22\xb9\x55\xa4\xe4\x9a\x65\x76\x31\x42\xdc\x92\x44\xe4\x45\x86\x47\xa7\xc3\xc9\xaa\xfe\x39\xac\x50\x69\x68\x66\x57\x47\x5f\xd4\x97\xf0\x87\xb6\xdc\xbc\x07\x29\xac\x0f\x19\x0c\xee\x21\xe9\x2d\xbd\xdf\xd0\x52\xb3\xcb\xe8\xef\x17\xbc\x12\xc5\x26\xc2\x30\x30\xb3\xd7\x75\x62\x76\x45\x2e\x47\xe4\xec\x1e\x92\xa0\x0a\x05\xf6\x87\x40\x42\x80\x59\xa1\xf4\x16\x5e\x51\xd9\xbb\x0e\xc9\x77\xe1\x68\x80\xfd\xc4\xce\xe9\xab\x66\xb9\x57\x90\x8c\x71\x24\x8b\x2e\x21\x8f\x30\xae\x8c\x40\xd0\x38\x43\xf6\xc4\x3a\x41\x97\xa4\x4c\x62\xcd\x84\x45\x15\x7c\xed\xe7\xc2\x72\x04\x42\x68\x72\xb0\x7f\xb4\x7f\xb8\x62\xb3\xdc\x37\x82\x4b\x06\x96\x44\x5b\x03\x66\x52\x2f\x4a\xb1\xbc\xc8\x16\xb8\x8e\xfd\x74\x40\x98\xf6\xd1\xd9\xb2\xe4\x7e\x55\x2e\x4b\x70\x40\x94\x20\x5a\x52\x5f\x8a\xc5\xfe\x6a\x6e\xd2\xb2\x74\xcc\xe1\x60\xff\xd7\xfd\x01\x01\x9d\x1c\x92\x3b\xc1\xf7\x35\x2e\x7f\x44\x6e\x84\x11\xbf\xeb\x89\x16\xa2\x24\x1c\x6c\x32\x00\xdc\x17\x19\x4b\x98\xce\x16\x48\xe8\x88\x28\xb5\xcd\x38\xa6\xda\x67\x27\x9e\xdd\x33\xed\x62\xdc\x0c\xda\xbe\x41\x68\x5a\x62\x47\xa8\x91\x8e\xe6\x70\x34\x03\x9a\xe9\x99\x0d\x2c\xe1\x82\x0f\xff\x09\x52\x60\xde\x22\x77\x57\x5e\x5d\x89\xc0\x5e\xb4\x0d\x43\x7b\xbf\x85\xfe\x9a\x0a\xfd\xe5\xe6\xe6\xf2\x5b\xd0\x4b\x24\xc3\xbc\xc5\x87\xfb\xa0\x05\x01\xe4\x44\xc8\xfc\x19\xd0\x8e\x7e\x1c\x9c\x43\x52\x08\xf9\x1c\x48\xd8\x4c\xa8\x4e\x7b\x49\x56\xf6\x53\x28\x8d\x4a\x94\x13\xe2\x38\x24\x66\x07\x9b\x71\x27\xbe\xef\xce\xf9\xe5\x88\xfc\x55\x94\xe6\x6b\xc6\x74\x9c\x2d\xaa\xba\x0d\x0a\x34\xd9\x33\x53\xed\x19\xf2\x64\xb0\xe1\x2f\x40\x53\xa3\xd9\x18\xea\x01\xf4\x79\xf4\xd7\x22\xee\x3c\xb8\xb5\xf5\xcb\x07\x4a\xa5\x45\x4e\x66\xee\xb3\x9b\xe9\x9a\xee\x64\x8c\xf0\xf4\xf8\x5c\x28\x09\x85\xa5\x70\xee\x99\x57\x47\xbf\x56\xe8\x86\x85\xbb\xfb\x7d\x8c\x35\xaf\x92\x10\x6c\xae\xc1\x94\x4d\x26\xe2\x16\x58\x06\xd5\xa0\x9d\x7b\x25\x1c\xcf\xb8\x50\x69\xeb\xe4\xcf\xe5\x89\xd0\x11\xd8\x3d\x3e\xac\xd7\x32\xa5\xfd\xc4\x1a\x90\x75\x86\x59\x87\x33\xd6\x68\xd3\x13\x10\x3f\x4d\x9d\xcc\xcf\x01\x80\x7e\x36\x9f\xf4\x09\x81\xa2\x87\x70\xf0\xd5\x60\x70\x2d\x8c\xfa\x8a\xe9\x9a\x96\xb8\x22\x99\x50\x20\xe7\x6d\x13\xc0\xeb\xd1\xdf\xa7\x8b\xf6\x86\x02\x3f\xd6\xe4\x56\x4b\xc2\xcb\x7c\x0c\xb2\xce\x66\x91\x7a\x15\x20\x41\x34\xc3\x85\xbd\xdd\x9b\x80\x9b\xed\x1c\xcd\x93\x7f\xfa\xb7\x7f\xfb\xc3\xbf\x8d\xec\xf4\x55\x64\x03\x27\xe7\xc7\x17\xc7\xbf\x5c\xff\x70\x82\x09\xb5\x5d\xa1\xda\x53\xd8\x66\xdf\x41\x9b\xbd\x86\x6c\x7e\xd2\x80\x4d\x4c\x13\xe9\x4c\x45\x9a\xfe\x02\x9c\xd2\x60\x80\xd1\xdb\x8c\xc6\xe9\x64\xbf\xa0\xb4\x99\x91\x35\x9b\xf6\x57\x73\xd4\x9e\xc5\x19\xd3\x49\x71\x2d\x92\xdb\x1e\xf5\x9a\xfd\x9b\x93\x4b\x3b\x65\x58\x93\x93\x7b\x63\x08\xe3\x73\x91\xcd\x6d\x39\xdf\x9b\x93\x4b\x3c\x79\x23\xfc\x17\x1a\xa2\x50\xa3\x5e\x98\x67\x7d\x22\x83\x73\x4f\x19\xed\xdb\x5a\xd0\x28\x91\x40\x33\xa6\x34\x4b\xf0\xb9\xda\x4c\x6a\x66\xe8\xe2\x97\x8a\x9a\xd2\xba\xd1\xbb\xa6\xb4\xff\xd1\xbb\xed\x76\x56\x9a\xba\x06\x1e\x3e\x63\xbe\xe4\xf8\x91\xcd\xf8\x88\x7c\xe9\x37\xc1\x97\x0a\x09\xd7\x5a\x14\x3d\x79\x42\xec\x64\x1b\xfc\x20\x63\x98\x08\x09\xcb\x8e\x90\xc0\xb1\xe1\x1b\x0c\x73\xcc\xfe\xf3\x26\x28\xd1\x70\x5e\xd8\x90\x4b\x55\x26\x33\x6f\x4d\xe4\xa0\xd4\x11\xba\x3c\xca\xc2\xaa\x98\xe8\x44\x29\x25\x0c\xcc\xd7\x41\x8e\xab\x1b\xd4\x69\x0c\xe6\xf5\xc0\xed\x8f\xa0\x13\x6b\x66\xf5\xfe\x17\x67\x51\xf5\xcb\x5f\x76\x95\x24\x92\xaa\x19\x60\xfd\x10\xb8\x67\x75\x9f\x13\xaa\x04\xb7\xc6\x5e\xf7\x39\xc8\x68\x14\x29\xa8\x52\x75\x05\x67\xf7\x12\xfb\xd0\xa5\x48\xf7\xf7\x55\xe3\x81\xa9\xa4\x09\x90\x02\x24\x13\x29\xc1\x7c\xe2\x54\xdc\x71\x32\x86\x29\xe3\xca\xc3\xcf\x4c\xe4\x01\x6d\xd8\x8d\x2d\xb6\xeb\xab\xc5\x8d\xc8\x55\xa3\x08\x8a\x4b\x4f\x4a\x44\x7d\xa2\xdd\x2a\x96\x9d\x4c\x18\x11\x1a\xb4\x69\xae\x36\xc6\x87\xcd\xea\xc7\x17\xdd\x83\xb7\xc9\x80\xb6\xbe\xb6\x11\x3a\x58\x9c\x9f\x26\xb3\x6e\x8e\xdf\xe8\x9e\xda\x72\x44\xf7\xd4\x6e\x23\xba\xa7\xa2\x7b\x6a\xf3\x78\x76\xe6\xdd\xe8\x9e\x8a\x4a\xd7\xf2\x88\xee\xa9\xe8\x9e\xda\x30\x9e\x1d\xfd\x8a\xee\xa9\x2d\x46\x74\x4f\x6d\x39\xa2\x7b\x2a\xba\xa7\xa2\x7b\x2a\xba\xa7\x7e\x43\x66\x40\x3f\xa2\x7b\x6a\x65\x92\xe8\x9e\x0a\x80\x11\x35\xa5\x35\x23\xba\xa7\xd6\x8c\xe8\x9e\x0a\x46\xe4\x4b\x2d\xf8\x92\x77\xee\x5c\x1a\xbd\xac\x7b\xce\xda\x25\x3a\x0e\x58\xe2\x7c\x44\x61\x2f\xb8\xea\x55\x41\xfb\xb7\xa0\xe6\x87\x4f\xb5\x71\xde\xa0\xda\xc7\xb4\x36\x1f\x6a\x57\x77\x84\x4f\x22\x54\x47\x85\xb0\xff\x57\x3b\x23\x02\x2f\x84\xd5\x4e\xdb\xe7\xa4\x3d\x59\xb6\x55\x17\xd7\xc3\xb3\x76\x3b\x3c\x13\xd7\x4e\x0f\xae\x86\xe8\x66\x78\x75\x6e\x86\xd7\xd3\x43\xd7\x39\xf3\x6f\x66\x12\xd4\x4c\x64\xad\x11\xbd\x81\xe4\x1f\x18\x67\x79\x99\x1b\x9c\x53\x06\x9f\xd9\xbc\x8a\x1a\x50\x15\xba\x5a\x42\x6f\x2d\x85\xe6\x46\x96\x02\x16\x40\xa5\x2c\x33\xdb\x88\x69\x9d\x33\x8a\xa2\xba\x2a\x93\x04\x00\xdb\xab\x85\x5a\xcc\x1f\x46\xd5\x9b\xaa\x76\x1a\x6f\xbb\xd1\x9b\x6e\xbc\xdf\x96\x28\xc5\x59\xfe\xf0\xfb\x56\x73\x74\xf4\xf2\x7c\x7e\x0f\x4f\x0f\x64\xba\xbb\xbe\xd2\x49\x57\xe9\x83\x4b\x74\xd5\x51\x5e\x9a\x27\xa7\x37\x8f\x66\x0f\x1e\x9c\x67\xe4\xbd\x79\x36\x6c\xe1\xb9\x78\x6c\x9e\x61\xf5\xd5\x1e\x1c\x0c\x7d\x78\x68\xfa\xf3\xce\x7c\x82\x22\xa5\x9f\xc6\x2b\xd3\xa3\x36\xdc\x93\x37\xe6\x73\x78\x62\x7a\xf9\xea\xae\x1e\x98\xcf\xe7\x7d\xe9\xe7\x73\x3b\x5a\xb7\x5e\x85\xc7\xa5\x07\xab\x56\x9f\x16\xad\xde\xac\x59\x9f\xcc\xc3\xd2\xdd\xbb\xf2\x0c\x3c\x2b\x9d\x81\xcc\x38\xd3\x8c\x66\xa7\x90\xd1\xc5\x35\x24\x82\xa7\xad\x39\xcc\x52\xd5\xba\xea\xfc\x28\x3b\xad\xd3\xd1\x9a\xf1\xc7\x33\xea\x8a\xf3\x42\xea\x43\xaa\xbd\xf9\xcf\x09\x14\xd8\xd0\xc4\xae\xf2\x59\x1a\xf4\xc8\xb3\x51\x06\x6d\x30\x76\x9f\x9b\xf8\x17\x71\x47\xc4\x44\x03\x27\x07\x8c\xfb\x7d\x3c\x0c\xd4\xc0\x5a\x33\xaf\xd0\xda\x5c\x7d\xfb\xc6\xdf\xfc\xfa\x54\x6e\x34\x2e\x28\xf5\xe9\x2d\x20\xee\x45\x8f\x9b\x40\xdc\x8d\x93\x32\x6b\x9a\x41\xac\x69\xa4\x49\x6f\xde\xd6\xe5\x45\xdf\xe2\xbc\xd5\x69\xa3\x3c\x25\x2e\x71\xe3\xf5\x6d\x5a\x67\xbf\xf1\x6b\xf0\x19\x47\xdb\x0b\xe9\xdb\xf6\xf2\x44\xbe\xe1\x67\x28\x35\xbf\x50\x7f\x70\x94\x9a\x77\x18\x41\xfe\xd7\xb7\x92\x26\x70\xd9\xbb\xc0\xe1\x8f\x13\x49\x4b\xe9\xd2\xf6\x2a\xb9\xa3\x3a\x3c\x1c\x20\xb5\xa7\xa9\x4a\x8a\xc3\x6c\xb4\x49\x99\x65\x0b\x52\x16\x82\x37\x33\x0f\xad\xd3\x6a\x39\x61\xcd\xcc\xb6\xee\x2d\xb5\x94\x5a\x48\xe1\x18\xb0\x2c\x39\x37\xf4\xbc\x6e\x38\x84\x52\xa9\xb2\xb4\x3a\x4c\x8b\x53\x6c\x6a\x96\x6f\x98\x29\x66\xcc\xb1\x1c\xea\x96\x14\xf5\x84\xe6\xe9\x89\x90\x09\x1b\x67\x0b\x32\xa3\x59\xd5\x5d\x82\x92\x5b\x96\x65\x6e\x9a\x11\xb9\x06\x4d\xf4\x8c\xb9\xc6\xe0\x24\x13\x7c\x8a\x8b\xa3\xdc\x77\x35\x83\xc4\x3c\x9b\x64\x40\x79\x59\xd8\xf7\x19\xb6\xbe\x10\xa5\xf4\xef\x73\x65\x2d\xab\x59\x98\x22\x9c\x65\x83\xa0\x77\xd2\x83\x1b\x5b\x37\xa8\x57\xe0\x73\x0a\xef\x98\x82\x41\x38\xa7\xaf\xcc\xab\x82\xce\x19\x85\x14\x73\x96\xda\xee\x17\x1e\x6c\xd8\xa5\xd5\x76\xc7\xa8\xce\x33\x17\x7c\xc8\x61\x4a\x51\xea\x71\xa7\xc8\xee\x99\x9d\xc7\xba\xe2\x78\x8a\xfd\x32\x8c\xba\x20\x8a\x46\x2a\xeb\x9c\xd9\x4e\x9f\x01\xe4\xc8\x01\x17\x44\x20\x7b\x2d\x39\xd3\xb6\x7b\xf4\xac\xd4\x24\x15\x77\xfc\x70\x64\xab\x12\x33\x45\x28\x19\x83\xf6\x9d\x6c\x7d\x67\x45\x26\x41\x11\xe0\x74\x9c\x99\x3d\xc7\x80\x87\x9b\xb5\x00\x22\x13\xa0\xba\x94\x40\xa6\x54\xc3\x5a\xa1\xc9\x7e\xef\xc3\xe0\x65\xaa\xea\xf2\x5e\x72\x05\xad\xfb\x5b\xf7\x2c\x69\xfd\xe9\x8f\xed\x68\x04\xcb\x41\x94\xfa\xb3\xa8\x92\x77\x33\x96\xcc\x42\xc9\x98\xe5\xa0\x88\x28\x97\x74\xec\xb7\xee\xb1\xf5\x3b\x14\xf5\xc9\x75\xa3\xad\x95\x78\x8d\x29\x6d\x39\xe5\xb8\x6e\x2b\x4b\xcd\x01\x3c\xbd\xb8\xfe\xe5\xfd\xf1\x7f\x9d\xbd\x1f\x91\x33\x9a\xcc\xc2\x7c\x74\x4e\x28\x12\x0d\x24\x14\x33\x3a\x07\x42\x49\xc9\xd9\x3f\x4a\x5b\x9d\x9c\x1c\x54\xcf\x1e\xf6\x5a\x0b\xb9\x25\xf7\xc5\xd6\xd7\xbd\xf5\x5a\xb2\x8d\xb4\x6d\x80\x83\x50\x80\xdd\x11\x96\xc5\xa7\x33\x73\xc9\x2a\x1a\x28\x6a\xcd\xc0\x10\x23\x36\x77\x64\xd8\x15\x97\xa6\x69\x15\x72\x61\xf0\xdc\xa0\x85\x61\x55\x74\x8c\xa1\x12\x33\x20\x1c\xb4\x41\xeb\xca\x60\x25\xb8\x6a\x14\x06\x28\x15\xa8\x01\x19\x97\x18\xdc\x51\x48\x96\x53\xc9\xb2\x45\x38\x99\xe1\x55\x17\xc2\xab\x43\x8b\xe5\x25\x9d\x7e\x3c\xbb\x26\x17\x1f\x6f\x48\x21\x6d\xc9\x00\x8c\xce\xc0\xeb\xf8\x59\x63\x30\x4f\xb8\x1e\x9d\x23\x72\xcc\x17\xf6\xa2\x3d\xe0\x4c\x11\xa3\x0b\x01\xb2\x60\x27\x43\xfa\xa2\xf0\x7b\x6f\x46\xf8\xbf\x3d\xf3\x95\xd2\x08\x99\x55\xd0\x49\xb2\x12\x3c\x66\xc5\x50\x36\xce\x02\x68\xba\x6f\x7f\x55\xdd\x96\xaa\xb0\xb9\x4b\x03\xc4\xa0\xdb\x12\xad\xb6\x1a\xc1\x6b\xbb\x6f\x31\x3e\xcd\x42\xac\x6a\x47\xf6\xbb\xea\x96\x5d\x35\xcb\x61\xfd\x05\x97\x6d\x15\xcc\x5e\xba\x3e\xd5\x6b\xe8\xa9\x57\x4a\xcd\xfd\xbc\x3a\xe5\x28\x82\x08\xdb\x5f\x9e\x5f\xfa\x13\xe0\xa4\x9b\x7c\xa9\x67\x22\x3e\x6c\x9d\x1a\x03\xf2\x86\xfc\x99\xdc\x93\x3f\xa3\x7a\xf5\xa7\xae\x9d\x65\xba\x2a\x3e\xdd\xcd\x3b\x56\xab\x3f\xbf\xec\x09\xe2\x3f\x1a\xea\x64\x66\x34\x50\xd5\x82\x8c\x99\x13\xe7\xe1\x5e\x83\x34\x74\xd4\xed\xc4\x93\xf6\xe4\x31\x0b\xfc\x8c\x68\x66\x7d\x17\xe7\x93\xb0\x25\x84\xde\x11\xd1\xcc\xe3\x7f\x11\x4a\x5f\x38\x2a\xd4\x6c\x30\x51\xcf\x96\x53\x9d\xcc\x9a\x64\xcc\x08\x6a\x4a\xd7\x07\x4c\x91\x54\xa0\x25\xcd\xc6\x01\xce\x58\x87\x48\x8c\xe7\x83\xc6\xdd\x9c\xf3\x8d\xfd\x7c\x68\xa7\x96\x0c\x28\xa8\xf9\x38\xc1\x2a\x28\x2f\x53\x88\xd4\xc9\x64\x66\x59\x69\xc0\x33\x1e\x10\xca\x9c\xad\xa6\x32\x59\x23\x2e\x99\xf3\x94\x50\x6e\x03\xb8\x27\x20\xa5\x0d\xdd\x1c\x2f\xd0\x83\xcc\x12\xe8\xbc\x79\x9d\x4e\x52\x21\x85\x16\x89\xe8\xd0\x36\xa8\xe9\x30\x77\xd3\x21\x10\xac\xf1\xd7\xdb\xdc\xbf\x3f\xbd\x1c\x90\x9b\x93\x4b\xec\xa6\x72\x7d\x72\x73\xd9\xd4\x54\xf6\x6e\x4e\x2e\xf7\x9e\x14\x14\xc4\x4b\x56\xef\xcc\x32\x5b\x4c\xd2\x30\x3c\x19\xb1\x6d\x98\xd3\x62\x78\x0b\x8b\x96\x3c\xb5\x0f\xbe\x3e\xac\x76\xb8\x97\x0f\xb2\x60\xce\x69\xb1\xf3\x6c\x12\x68\xca\x3e\x53\x16\x85\x3b\x59\xf5\x3b\xd7\xa7\x53\xe4\x62\x0e\xa9\x15\x87\xfd\x13\xc0\xd3\x42\x30\x23\x2f\xc6\x1c\x8b\xdd\x9f\x8e\x39\x16\x0f\x8d\x98\x63\x11\x73\x2c\x62\x8e\xc5\xc3\x23\xe6\x58\xb8\xf1\xf4\x66\x50\x12\x73\x2c\x5a\x8e\xd7\xe5\xe7\x8f\x39\x16\x3b\x8d\x98\x63\xb1\x3a\x62\x8e\xc5\x86\x11\x73\x2c\x36\x8c\x98\x63\x11\x73\x2c\x62\x8e\x45\x8c\x16\x7b\x74\xae\xe7\x19\x2d\x46\x62\x8e\x85\x1b\x31\xc7\xe2\x55\xc4\xc4\x90\x98\x63\xb1\xd5\x88\x39\x16\x31\xc7\xa2\xcd\x88\x39\x16\x38\xa2\xed\x25\xe6\x58\xf8\x11\x73\x2c\xec\xf8\xed\x48\xcd\x31\xc7\x22\xe6\x58\xc4\x1c\x8b\x98\x63\xf1\xe0\x2a\x62\x8e\xc5\x6b\xd0\x27\x7d\x0f\xbc\xee\x39\x03\xfb\x27\x22\x2f\x4a\x0d\xe4\xca\x4f\x59\x49\x91\x96\x30\x30\x15\x4a\x04\xdd\x43\x78\x12\xc1\x27\x6c\xea\x28\xfb\x91\x6d\x30\x37\xac\xbe\x67\x18\x34\x75\x7b\x81\xf1\x3b\x19\xcb\x59\xbb\x44\x0e\xb2\xb2\x31\xef\x71\xae\xc0\xc9\x63\x4e\x52\x4e\xef\xf1\x88\xd0\x5c\x94\xb6\x29\x5f\xe2\xf6\xaf\x02\xa1\x75\x85\x3d\xbb\x9d\x21\xfd\xa8\x38\x75\x46\xca\x65\x0f\xda\x46\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\x6c\xbd\xe4\xce\x22\x71\x7f\x02\x71\x4f\xe2\xf0\x27\x11\x86\x9d\x77\xb8\xa7\xb3\x78\xe5\x66\x5b\x3e\x8d\x8e\x61\x3d\x74\x1a\x3d\x35\x45\x31\xaf\x9a\x87\x29\x22\x72\xa6\x8d\x70\x68\xe4\x41\x1a\xc6\x85\x31\xdd\x50\x4a\x1d\x1d\xc0\x80\x4a\xaa\x6d\x8f\xd0\x2a\xa6\x2a\x88\xd3\x16\x5e\xf2\x73\xbd\x57\x2b\x7b\x05\x9e\xe7\x61\x0a\x13\xc6\xc1\xf9\xc1\x22\x6d\x78\x7c\x44\xda\xf0\x1a\x69\x83\x82\xa4\x94\x4c\x2f\x4e\x04\xd7\x70\xdf\xca\xc2\xd2\x24\x0d\xd7\xcd\x09\x89\x3d\x67\x2e\x8b\xd2\x5d\x23\xa2\xb0\x01\x94\x4b\xe9\xac\x55\x08\xae\x2c\x39\x2a\x98\x36\x4b\x06\xb4\xd5\xfe\x50\xef\xc1\x98\xc8\xe5\x97\x78\x7d\xce\xaa\x99\xff\x28\xd9\x9c\x66\x46\xdb\xad\x9f\xb8\x44\x0d\x26\x7c\x68\xdb\x33\xaf\xa9\xba\xad\x0f\x3c\x0c\x8d\x0c\x5d\xad\xf9\xc8\x7f\x12\xfe\x04\xf7\xfa\x25\x4a\x69\x28\x20\x5d\x4a\x36\x67\x19\x4c\xe1\x4c\x25\x34\x43\xba\xd6\x0f\xaf\x38\xde\x30\x3b\x6e\xbc\x14\x99\x22\x77\x33\xc0\xee\xca\xd4\x9b\x00\x30\xc3\x65\x4a\x19\x27\xb9\xd9\xa2\xc2\x3f\xac\xac\x2d\xc1\x90\xff\x82\x4a\xb3\xc1\x95\xcd\x00\x55\xe4\xb1\x10\x99\x0b\x1d\xce\x16\xf5\xfc\x2e\xf6\x9e\x8b\x5f\x38\xdc\xfd\x62\x66\x53\x64\x92\xd1\x69\x65\x2a\x50\xa0\x57\xac\x7d\xf5\xd4\x1b\x3f\x00\xe3\x72\x4b\x20\x34\xbb\xa3\x0b\x55\x1b\x4e\xc2\x3e\xe0\xef\xc8\xdb\x43\x44\x67\xaa\x48\x35\x47\x4a\x7e\x7f\x88\xbe\xc4\x93\xe3\xcb\x5f\xae\xff\x7a\xfd\xcb\xf1\xe9\x87\xf3\x8b\x6e\x9c\xc2\x7c\x3b\x50\xde\x6a\x8e\x84\x16\x74\xcc\x32\xd6\x85\x41\xac\x44\x9b\x84\x93\x22\x0b\x4e\xd3\xa3\x54\x8a\xc2\xc2\xc9\xdb\xa8\x6a\x4e\xd9\xd4\x82\xc3\xcc\x64\xdc\x9e\x49\x73\xc2\xa9\xa4\x5c\xd7\xc6\x9a\x1a\xe4\xb2\xe4\x46\xb1\x7e\xe1\x81\xf9\x34\xed\x2f\x28\xff\x38\x4d\x21\x6d\x40\xef\xd5\x05\x01\x9e\xf8\x8f\x5b\xd4\x39\xda\xe4\xf2\xe3\xf5\xf9\xff\x5e\x42\xc3\x45\xd1\x2d\xe6\xa9\x9f\xbc\x30\x29\x8a\xde\x76\xf7\xca\xe5\x1d\xc5\xfd\x7d\x16\xfb\x5b\xf1\xaa\x7e\x3c\xed\x57\x25\x6f\x96\xf1\xa8\xe7\x27\xb9\x48\x61\x44\x2e\x2b\x2b\x7d\xf3\x6a\x90\xde\x4b\x25\x10\x73\x0b\xd7\x8c\x66\xd9\x22\x14\x90\xb4\xb0\xc9\x34\x8d\xcc\xe4\x90\x0e\x4f\x68\xa6\x3a\x12\xd3\x2e\x9c\xc9\x30\xe1\x0f\x46\x99\xec\x05\x9a\xd5\x6c\x24\x05\x2e\xb4\x93\x4a\xcd\x2a\x31\x59\x5b\x8a\x84\x58\xcd\x35\x08\x8b\x6a\x70\x17\x65\x0d\xfd\x9e\x31\x31\xe5\x61\x75\x59\xcd\x6c\xad\xbc\xa5\x82\x65\xe9\xd6\x31\xa6\x5a\x97\x35\xb3\x4b\xa0\x29\xe6\xa4\x15\x54\xcf\x6c\x54\x43\x4e\xd5\x2d\xa4\xf6\x07\x27\xd7\x54\x66\x7e\x33\x63\xf5\xaa\x1b\xb3\x6e\x6f\xd3\x47\x79\xc6\xc6\x5a\xa0\x2f\xa0\x5d\xd1\x0d\xd2\xc7\x11\x30\xdf\xf4\x91\x67\x8b\x2b\x21\xf4\x37\x55\x2e\x56\x2f\x1b\xf8\xa3\x93\x14\x9b\x66\x58\x14\xa5\x30\x08\x21\x1d\x22\x30\x11\xa5\xc3\x34\xb0\xd3\x7a\xc3\x9e\x18\xa1\x65\xc9\x8f\xd5\xb7\x52\x94\xad\x39\xc0\x8a\xa0\xf5\xed\xf9\x29\x9e\xe3\xd2\x79\xd9\xb8\x96\x0b\xcc\x3a\x5d\x2d\x18\x54\xc9\xb4\xdf\x3b\x3f\x61\x88\x91\xb5\x4b\x87\x7c\xa0\x0b\x42\x33\x25\xbc\x70\xcc\xf8\x5a\x05\xca\x69\x67\xe6\xf2\x58\xe8\xd9\x8a\x5a\x66\xd0\x79\xf5\xb9\x41\xe0\x74\xab\x2b\x18\x31\xbe\xf2\xb8\xa6\xb7\xa0\x48\x21\x21\x81\x14\x78\xd2\x71\xd7\x9e\xda\xd5\x84\x3b\x7f\x21\xb8\x39\x16\xbd\xec\xfd\x79\xe5\x63\x44\x43\x58\x73\xa7\xd1\x5b\xe9\xf4\x0e\x8a\x3e\x4b\x3c\x14\xa5\x02\x69\x1d\xac\xb2\x04\xbb\x11\xdf\x95\x63\xc8\x40\x5b\x65\x08\xeb\x4e\x50\x6d\x15\x69\x96\xd3\x29\x10\xaa\x2b\x44\xd1\x82\x00\x57\x86\xdc\x58\xd3\x9b\x26\xa9\x80\x3a\x81\x92\x2a\xf2\xfd\xf9\x29\x79\x43\x0e\xcc\xbb\x0e\x71\xfb\x27\x94\x65\xe8\xce\xd4\x54\x2e\xaf\x91\x4d\xfc\x14\xb8\x24\xc4\x3d\x22\xa4\x3d\xa2\x03\xc2\x05\x51\x65\x32\xf3\x6b\x32\x1a\x97\x57\xd8\x5c\x3c\x1f\x1a\xf5\x5f\x21\xaa\x76\x26\x30\xdf\x2b\x90\xbd\xd1\x97\xef\x5b\xd0\x97\x50\x84\x30\x38\xd7\x84\x9e\x45\xac\x1c\x34\x4d\xa9\xa6\x8e\xee\xd4\x59\xd7\xaf\x71\x4b\x9f\x9a\xfa\x28\x78\xcf\x78\x79\x6f\x23\x56\xfa\x53\xf2\xaf\xcf\x70\x5a\x92\x78\xa0\xe1\xa6\xd1\xa2\xc8\x98\xcd\x77\x5e\x8a\xa0\x3a\x6f\x6c\xf5\x60\x83\x88\x84\xc7\x9c\x66\x99\x30\xe4\xcd\x70\x76\xca\x53\x91\xaf\xbc\xcc\x08\x50\xd0\x28\x74\x37\x22\xaf\x12\x79\x9e\xdc\x1c\x91\xc1\x1c\x3a\xd4\x74\x59\xae\xcb\x67\x66\x33\xb2\x98\xdf\x50\x9c\x9e\x64\x74\x0c\x99\xe5\x2c\x16\x81\xd4\x2a\x02\x3d\x75\x14\xa2\x14\x59\x7f\x39\x18\x57\x22\x03\x1b\xd6\xe3\x01\x61\xa6\x7f\x11\x70\xc0\x49\xfa\x82\x03\x2a\x32\x0d\x38\xa0\x4a\xf6\x12\xe0\x50\x76\x60\xb4\x64\x19\x0e\x86\x6b\x37\xe1\x80\xac\xf3\xb9\xc3\x41\x41\x92\x88\xbc\xb8\x94\xc2\xa8\x5c\xbd\xb1\x16\x37\x6d\xed\x2b\xb2\x3a\xf9\x9a\x20\x1c\x24\xe5\xcd\x9b\xa9\x0c\x02\xfa\xa8\xb6\x34\xde\x47\xf5\xfd\xaf\xb0\x43\xb2\x21\x3d\xcb\x7c\xc8\xcf\xd2\x70\x2b\x99\x27\xdd\x85\x17\x5e\x4e\xa0\x83\x95\xac\x17\x66\x22\x12\x9a\x61\xc9\xbd\x6e\x18\x43\x96\xb1\x66\x79\xe2\x20\x0a\x13\x5d\x4b\xf8\x9b\xf7\xfb\x63\xf5\x35\xfc\xc5\xd9\xbe\xb8\x48\x21\x70\x41\xda\xf0\xd1\x1b\x1b\xad\x87\xf7\xf9\x00\x50\xc3\xd5\xbd\x37\x30\x6d\x3c\xad\x85\xab\x00\xf3\xa1\x2a\xe4\x67\x16\x08\x3c\x65\x7c\x8a\x16\x9d\x01\x91\x90\xd9\xd0\x51\x77\x86\x6f\xad\xfa\xb5\x8f\x18\xed\x27\xf5\xe8\xec\x5f\x8d\x92\x10\x13\xdc\xcd\x8c\x46\x0e\x2f\xdf\x4c\x2c\xb5\x64\x8a\xec\xbd\xf7\x00\xe8\x50\xf9\xec\x39\x32\x88\x3d\xfb\x85\xd5\x6e\x5a\x1b\xdb\x2d\xe3\xa9\x8b\xb2\x6c\x00\xab\xaa\x51\x6b\xa5\x50\x8c\xdf\x65\x69\x48\x1a\xde\x91\xbf\x71\x52\x01\x8b\x0c\x5b\xa3\xc7\x95\x15\x58\xbd\x79\x69\xf8\xb0\xc9\xaf\x7a\xc9\xf2\x34\xdf\x73\xdc\x7b\xf3\xde\xa1\x51\x7b\x57\xef\xf3\xdf\xb2\xf7\x94\xfb\x7a\xc7\x78\x2a\xee\x54\xdf\x3a\xc4\x8f\x76\x5a\x2f\x50\x27\x06\xad\x35\xe3\x53\x15\xea\x11\x34\xcb\x1a\x66\xd8\x75\x8a\x84\xdf\xe1\xaa\x22\xf1\xaa\x00\xbf\x14\x1d\x1e\x95\x80\x1d\xc6\x34\x57\xf4\x44\x9a\x4f\xd1\x8c\x66\xd7\x45\xfb\xd2\x6c\x64\x19\x0d\xbe\xfd\x70\x7d\xdc\x9c\xda\xd0\xb3\x3b\xac\x78\x6d\x80\x6d\xae\x13\x9a\xe6\x4c\x29\x34\x03\xc1\x78\x26\xc4\x2d\x39\xf0\x61\x1b\x53\xa6\x67\xe5\x78\x94\x88\x3c\x88\xe0\x18\x2a\x36\x55\x47\x0e\x69\x87\x66\xf5\x87\x84\xf1\xac\x8a\x46\x41\x35\x92\x6b\xe5\xcd\x18\xf8\x92\xa4\x5a\x05\xee\xad\xab\xd7\xe9\xbc\xcc\xab\xcb\xb4\x15\x3a\x19\x64\x4f\x5f\x70\x66\x75\x7b\x2e\x3a\xd6\xce\x78\x64\x8b\xf0\xdb\x5d\x6a\x4a\x98\x46\xb5\x16\x8e\x56\x7a\x7b\x72\x20\x39\xe9\x20\x01\xd5\x5f\x55\x9e\xbf\xd4\x73\x92\x14\x6c\xf6\x04\x60\xd4\x09\xdd\x18\xdc\x84\x56\xd9\x7d\x4c\xc2\x73\x8f\xee\x87\x12\x2d\x7a\x7d\x6c\x9a\x87\xd1\x07\xb2\x62\x46\x87\x56\x49\x36\x24\x09\x69\x98\x97\x01\x66\x82\x0b\x17\x9c\x6e\xb8\xa0\xe0\x88\xd2\xa8\x2d\x58\x47\x10\xee\x89\xa3\xb1\xc1\x52\x4f\x6a\xff\x60\xe8\x43\xc2\x24\x1e\x5b\x04\xa0\x5e\xc3\x1d\xd3\x33\x5f\xe1\xbe\xe1\x70\xc2\x95\x48\x50\xe8\x3d\xe0\x04\xa4\x14\xd2\x05\xc2\x78\xab\x2d\xce\x84\xa4\x18\x23\x69\x0c\x92\x50\xf3\xd7\xbe\x0a\x5d\x94\x75\x09\x5c\x8c\x13\x33\xd8\x04\x93\x09\x24\x28\x29\x85\x00\xb6\x64\xf7\xa0\xae\xdc\xe7\xa2\xbb\x0d\x82\xb9\x12\xba\x39\xbb\x37\x6f\x09\x9f\x0a\x9d\xa1\xae\x62\xde\xfa\xcb\x87\x23\x42\xce\x79\x15\x39\x39\x30\xbb\x18\xde\xe9\x43\x7e\xb4\xf9\xc4\xb0\xfe\x32\x7e\x40\x68\x77\x32\xe2\x9d\x2c\x7b\xc0\xf8\x2e\xc6\x60\x12\x1a\x84\x7b\x25\x07\x68\x18\x76\x93\x9a\xad\xf7\x4c\xbc\x8b\xa1\xd8\xdc\xf2\xa9\x8c\xc5\x2f\x83\xd3\x93\xae\x74\xce\xa5\xc4\xf7\x54\x14\xf7\x3a\x98\x2d\x10\xbf\x2b\x77\xd3\xa5\x48\x6d\x49\x8c\x2a\xa5\x1f\x7b\x59\x60\x89\x0e\xf6\x4f\x2f\x60\xd5\x42\x1a\x17\x36\x2a\x3b\xac\x95\xe1\x6a\x82\xa6\xc4\xc8\xca\x99\xd7\xed\xf3\x22\x03\xcc\x9e\x0b\x66\xae\x13\x03\x83\x2a\xba\x83\x6a\x21\x75\x21\x5e\x57\xa1\x63\x40\xfe\x07\x0f\x65\x15\x00\xe8\x8b\x07\x5c\x56\x8f\x5b\x15\x8f\x29\x5f\x52\x1b\x33\xdb\xb4\xf0\xa6\x03\x92\xb2\xc9\x04\x7c\xa0\xa1\x51\xfd\xa8\xa4\xb9\x21\xf1\x8a\x38\x10\x8c\x61\xca\x6c\x24\x5b\x45\xd8\xf6\x55\x9d\x01\x3f\xb0\xc4\x90\x69\x92\xb3\xe9\xcc\x22\x0a\xa1\x98\x19\x49\xbc\x4b\x2d\x13\x34\x25\x88\xdb\x42\x92\x3b\x2a\x73\xc3\x37\x68\x32\x43\xff\x1c\xe5\x24\x2d\x25\x96\x89\xd4\x40\xd3\xc5\x50\x69\xaa\x8d\xa8\x0b\xd2\x69\x84\x7e\xfd\xb1\x94\xf0\x83\x23\x96\x12\xde\x3c\x62\x29\xe1\x58\x4a\x38\x96\x12\x7e\x78\xc4\x52\xc2\x6e\x3c\x7d\xb6\x2f\x89\xa5\x84\x5b\x8e\xd7\x55\xce\x26\x96\x12\xde\x69\xc4\x52\xc2\xab\x23\x96\x12\xde\x30\x62\x29\xe1\x0d\x23\x96\x12\x8e\xa5\x84\x63\x29\xe1\x58\x14\xed\xd1\xb9\x9e\x67\x51\x34\x12\x4b\x09\xbb\x11\x4b\x09\xbf\x8a\xd2\x4f\x24\x96\x12\xde\x6a\xc4\x52\xc2\xb1\x94\x70\x9b\x11\x4b\x09\xe3\x88\xb6\x97\x58\x4a\xd8\x8f\x58\x4a\xd8\x8e\xdf\x8e\xd4\x1c\x4b\x09\xc7\x52\xc2\xb1\x94\x70\x2c\x25\xfc\xe0\x2a\x62\x29\xe1\xd7\xa0\x4f\x2a\x9d\xb2\x56\x95\xcf\xb6\x29\x54\xe1\x22\x43\x82\xd4\xd6\x71\x39\x99\x80\x44\xca\x85\x6f\x5e\x89\x42\xa8\x0a\x5a\x55\xb4\xcc\xc5\x19\x60\x59\x3c\x09\x34\x75\x01\xef\x1b\x1e\x77\xb9\xb4\x58\xa1\xac\x8e\xd4\x3c\xfb\xf8\x4d\x3f\x55\x31\xba\xc5\x28\xe2\x9a\x3f\xf2\xa4\x7b\xac\x5a\x0d\xf0\x75\x09\x18\x0e\xee\x49\x26\x94\x8b\x30\x45\x60\x25\x33\xca\x39\x78\xe5\x91\x69\x34\xca\x8c\x01\x38\x11\x05\x70\x4b\xbf\x29\x51\x8c\x4f\x33\x20\x54\x6b\x9a\xcc\x46\xe6\x4d\xdc\x03\xbb\x8e\x06\x75\xbf\x28\x2d\x81\xe6\x3e\x2e\x36\xa7\xcc\x4e\x45\x68\x22\x85\x52\x24\x2f\x33\xcd\x8a\x6a\x32\xa2\x00\x03\xda\x2d\xa3\xaa\x80\x81\xe1\x25\x75\x08\xe9\xa0\x7e\x9b\x5b\x96\x08\x8b\x02\xa1\xea\x3a\xc0\x3a\xa8\x79\xa1\x17\x55\x1c\x1d\x90\x09\x93\x4a\x93\x24\x63\xc8\xad\xf1\x8d\x36\x77\x10\xe7\x1b\x78\x5e\xcd\xdd\x4a\x95\x5b\x2a\x4f\x51\x6c\x2d\xb4\xb2\x51\x69\xf5\x84\x6e\xaa\x94\x29\x27\xe6\xab\x01\xa1\xbe\xe4\x8d\x05\xb4\x5f\x29\x82\xda\x73\x16\x3b\xbb\xfb\x29\x98\x2e\xa8\x93\x57\x87\xed\xd5\x88\x8e\x21\xc6\x1e\x39\x07\x8d\x68\xea\x5a\xa0\xc0\x70\x97\x95\x63\x80\x1b\xc0\x61\x6e\x70\x00\x12\x30\xfc\x95\x6e\xc0\xfa\xcf\x8e\xf4\x01\x53\xfc\x00\x4a\xd1\x29\x5c\xb6\xf4\x5a\x6c\xd2\xc8\xd0\x71\x51\x6f\x0c\xa2\x42\x66\xd3\xd3\xaa\x5f\xea\x30\xa7\xa6\x18\x44\x72\xbb\xa6\x4a\xf8\xb9\x93\x4c\x6b\xc0\x4d\xc5\xe2\x48\xe8\xf8\x5c\x4e\x40\xdd\x5f\x0a\x96\xfa\xe0\x27\xa9\x1f\x36\x44\x9d\xa7\x36\x74\x69\x0c\x64\x2c\x19\x4c\xc8\x84\x61\x3c\x14\x46\x28\x0d\x6c\xb9\x0f\x6a\x2d\x0a\x4a\x19\x7d\x57\x70\x2f\xcb\xfa\x75\x8d\xc8\x8f\x6e\x61\x5a\x96\x3c\xa1\x41\x11\x40\x4c\xd1\x62\x13\x32\xc5\x08\x27\x27\x2d\xfe\xf1\xcd\x7f\xfc\x89\x8c\x17\x86\xa5\xa1\x64\xa5\x85\xa6\x59\xf5\x91\x19\xf0\xa9\x81\x95\x3d\x9e\xcd\x24\xa3\x0a\x02\x58\xc5\xdc\x2e\xfc\xed\xef\x6f\xc7\x4d\x1e\x7b\x94\xc2\xfc\x28\x80\xdf\x30\x13\xd3\x75\x75\xe1\xdb\x87\x4c\xb6\x54\x89\xd6\xa0\x99\xc8\x58\xb2\xe8\x8c\x68\xbe\xee\x0c\x99\x89\x3b\x2b\xeb\xaf\xc1\x9e\x3a\x06\xb2\x10\x45\x99\x59\x0b\xf6\x37\x55\x7a\x5e\xa9\x60\x35\x07\x67\xed\xb9\x40\x9b\xab\x9b\x62\xb9\x5e\xac\x0d\x6c\xf3\xaf\x14\x2e\xb6\xdb\x59\x05\xab\xf2\x33\xa8\x08\x7d\x43\xb3\x6c\x4c\x93\xdb\x1b\xf1\x5e\x4c\xd5\x47\x7e\x26\xa5\x90\xcd\xb5\x64\xd4\x50\xcb\x59\xc9\x6f\x6d\xe5\xea\x2a\x45\x58\x4c\x8d\x68\x55\x94\xda\x07\x12\xaf\xfb\x60\x9b\x70\xea\x89\xb0\x57\x83\xea\x59\xe0\x9e\xd5\xba\x8e\x4b\x95\xb0\x18\x19\xce\xaf\x42\x64\xfb\xfd\x9b\x3f\xfe\xbb\x45\x5d\x22\x24\xf9\xf7\x37\x18\xfc\xa8\x06\xf6\x10\x23\x6d\x33\x8c\x22\xa7\x59\x66\xd4\x86\x10\x29\x0d\xa0\xd7\x21\xe1\x67\xc7\x41\xdd\x1d\xdd\xb6\x16\xa5\x6e\x6e\xfe\x8a\x72\x14\xd3\x0a\xb2\xc9\xc0\x66\x05\x54\x6a\xcd\x3e\x32\x86\x7d\x47\x7d\x30\x35\xe3\x19\x08\x40\x73\x91\x95\x39\x9c\xc2\x9c\xf5\xd1\xbc\xa2\x31\x9b\x57\xf5\x33\xa6\x30\x01\x63\x9c\x89\xe4\x96\xa4\xee\x62\x10\xc6\xb2\x5c\x42\xb5\x3d\x14\xda\x06\xf4\x74\x08\xe4\xd9\xf8\xfd\x8d\x10\x9e\x9c\x16\x45\x15\xa3\x2f\xe9\x5d\x03\x18\x78\x26\x31\xdf\xb7\x63\x3d\x85\xce\x66\xe6\xae\x46\xe6\xa1\xfb\x22\x43\x37\x5b\x4f\xd1\x3a\x84\xa5\xbb\x8d\xba\x5e\x7d\x7b\xc3\x64\x03\x21\xea\x09\xfd\x69\x28\xf0\xdf\x36\x3c\x7b\x25\x2b\xa9\x4a\x6c\xa9\x10\xc3\x0a\x00\x06\x7d\x90\x24\xb7\x37\xb8\xf6\x60\xdd\xec\x16\xbf\xd4\x80\x0b\xaf\xac\xca\x39\xd5\x4e\x20\xf4\xe6\x6b\x4a\x0a\x90\x8a\x29\xc3\x97\x7f\xc0\x03\x75\x92\x51\x96\x07\x26\xc0\xa7\x01\x82\x3d\xdc\x58\xf9\xb2\x3b\xa5\xbc\x14\xa9\x9b\x10\x49\xa1\xad\xfa\xb9\x46\xac\x6d\x4a\xb5\x3d\x32\xd4\xa7\x26\x95\x3f\xd4\xd0\x6c\x52\x4a\xf3\x4b\x45\x2a\xed\x5d\xaf\x89\x40\xe2\xf7\xbd\x54\xfa\x58\x2d\xbe\x27\x32\x80\x84\xd1\x6d\x6e\x93\x12\x36\x94\x47\x7b\x50\x02\x91\xde\xe9\x81\x23\x62\x5d\xea\xe6\x4c\xb8\x47\xc9\xfe\xbb\xfd\x27\x25\x92\x16\x44\x52\x14\x74\xda\xa9\x87\xc1\x12\xa4\x96\xa7\x0d\x13\xbd\x8d\x1a\x84\xd7\xab\xb2\x43\x78\x17\xa4\x75\x21\x0a\x2c\x33\x62\xbd\xa3\x1e\xc0\x4e\x41\xb0\xf9\x90\x77\x74\x41\xa8\x14\x25\x4f\x9d\x7d\xa9\x32\xf0\x7d\x58\x7a\xf1\x85\xe0\xe0\x0d\xe7\xcb\x79\xe2\x68\xd1\x67\x9c\xbc\x1d\xbd\x7d\xf3\x5a\x38\x15\x7e\xe1\x12\xa7\xba\xa8\x38\x95\xa5\x4f\x4f\xfa\xad\xbe\xda\x71\x4f\xdf\xfb\xc1\x99\x58\xea\x62\xc6\xcc\x17\x6b\xc5\x9f\xee\x24\xd3\x10\xf4\x36\x3a\x40\xc5\xc5\xe8\x87\x41\x56\xf4\x61\x8f\x35\xbc\xfb\x49\x43\x57\xe5\xf8\x13\xd2\x2d\x47\xa0\xf0\xb8\xad\xb3\x70\xa9\x07\x48\x58\x08\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x99\x81\x87\x4f\x8a\x5a\x0e\x68\x67\xf7\x45\x87\x1a\x73\x0d\xc0\x9d\xdd\x17\x14\x6d\x70\x45\x8f\x10\xfc\x2f\x98\xd1\x39\x60\x46\x24\xcb\xa8\xcc\xd0\xe7\x78\x6d\xd7\x4e\xc6\xa5\x26\xc0\xe7\x4c\x0a\x8e\x01\x3e\x73\x2a\x19\x56\xa5\x90\x80\x99\xd5\x46\x17\xfd\xf2\xe0\x87\xe3\x2b\x0c\x68\x38\x74\x29\xe1\x6e\x95\xa5\xf2\xe5\x23\xc2\x95\x04\xd3\x3d\xba\x7d\x7e\x1d\x06\x86\x48\x73\xfd\xba\xcc\x7b\xf2\x52\x97\xb6\x20\xfe\x7d\x92\x95\x8a\xcd\x9f\x8a\x92\xb8\x54\xd5\x53\xd6\x6a\x9f\x97\xd2\x66\x6b\x40\xad\x64\xc0\xa2\x69\x1d\x59\xcb\x23\x15\x58\xf7\x55\x55\xb3\x2a\xf4\x81\x3b\xd3\x93\xcb\x65\xb7\xb1\x78\xbe\x64\xd9\x8a\x08\x81\x75\x1b\x9e\xd6\x08\x95\x72\x75\x82\x2b\xdc\x0d\xac\xcd\xe8\xe6\x46\x52\xe0\xe9\xc5\x75\x58\x04\xc0\xaa\x4b\x22\x1d\x91\xcb\xfa\xc7\xba\x52\x04\xd6\x2f\xaa\x94\x48\x90\xd3\xba\x26\xee\x14\x38\x48\x14\x12\xcc\x94\x8d\x76\x72\x64\x4c\x95\x75\xf2\x9c\x5e\x5c\x5b\x9b\xed\x6e\x30\x6b\x2d\x66\xb7\x97\x50\x0d\xc7\xb7\x39\x11\x2d\x84\xdb\x66\xb7\x9a\xca\x60\x65\x00\x83\x4a\xa9\x9d\x98\x9c\x5f\x12\x9a\xa6\x12\xdd\x3e\x4e\xf4\x09\x4a\xbd\x55\xbe\x05\xac\xca\x40\x15\x84\x6b\x0a\xc0\x8d\x24\xae\x06\x2c\x39\x2d\x8b\x8c\x59\x37\x42\xf8\x40\x5d\x4d\x02\xdb\xab\xec\x8e\xb4\x5d\xd4\xbc\xd6\x4a\x5e\x07\x2a\x24\xda\x56\x75\x7b\x60\xf7\x24\x28\x91\xcd\xeb\x82\x9a\x4b\xbb\xe6\x4e\x04\x9a\xc4\xab\x5d\xf3\x45\xdc\xb6\xda\x31\xe0\x5a\x9a\xa3\xb9\xbc\x5b\xd8\xbd\x37\x2b\xf1\x34\x55\x13\xb2\x39\xa0\x7f\xdc\xd5\xaf\x73\x65\x94\xea\x12\x9f\xd6\x37\x6c\xab\xac\x02\x95\x9e\xa2\xe1\xaa\x5a\x9e\x44\xf2\x54\x88\xb0\x6c\xec\x38\xbd\xb8\xb6\x94\xd0\x7e\x7c\xd5\x95\x6f\xdd\x2e\xd5\x54\xad\x35\x06\x3e\x59\x95\x8f\x2e\x9a\xc7\x52\x5b\x25\xd7\xa6\xb4\x53\x20\x4b\x07\xf1\xaf\x53\xe6\x5e\x87\xb7\x2b\xa0\x32\x99\xb5\x81\xff\x03\x84\xc0\x4e\x4a\x52\x61\x23\x01\x26\x42\xa2\x4a\x3c\x44\xf2\x9e\x09\x71\x5b\x16\xdb\x50\x74\x37\x8d\xed\x95\xb3\x15\x81\x68\x3c\xf1\x9b\xa2\xe9\x29\x57\x6d\xfc\xbd\x4d\xd9\x07\xb4\x95\x78\x70\xa2\x3a\x1b\x43\x2c\xeb\x4d\x27\x59\xa9\x34\xc8\x6f\x98\x54\x7a\xcf\x17\x5c\x45\x0c\xb6\x36\x91\xfd\xf0\x86\x1f\x99\x9e\xb9\xd2\x69\xfb\x83\xe6\x25\xf3\xb7\x9b\x78\xdf\xe8\xb4\xfb\x17\x82\xc3\xfe\x68\x59\xec\xaa\x48\x79\x45\xd6\x36\xf2\x14\xb7\x74\x05\x99\x8d\x17\xc5\x0b\x01\xae\xdc\xb8\xb2\x71\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x26\xbc\x7b\x56\x97\x79\xb3\x05\x58\x6c\x9d\x3a\xe1\x04\xbd\x45\x08\xa2\xa0\x26\x8b\x16\x9b\x3f\xbb\x8d\x3c\xb7\x33\x06\xd8\xf2\x7f\xd7\x20\xe7\x2c\x81\xf7\x8c\xdf\xee\x88\x7e\xcd\xe8\x92\xb3\x95\xd9\x1a\x05\x79\xad\x8f\x96\x71\x1b\x7c\x67\x58\x0c\x1d\x8b\x52\xa3\xec\x86\x0e\xc7\x5a\x71\x64\xfc\x7f\xec\x5e\xa0\xbd\xbd\xb0\x15\xb3\xd6\xe9\x88\x6a\x60\x8d\x3e\x5e\x09\x54\x0b\xae\x29\xd6\xf6\x3b\x15\xc9\x2d\x48\x92\x99\x65\x8c\x48\x1d\xf8\xd2\xa8\x26\x27\x4b\xd8\x31\xea\xa2\xad\xa5\x03\x8a\x19\xe4\x20\x69\x56\x17\x55\xec\x00\xea\xf7\x8e\x70\x56\xb3\x86\x31\x29\xb6\xba\x90\x2b\x83\x66\xce\xe1\xd9\xba\xbb\x72\xba\xf0\x95\x26\x19\xc7\x70\x83\x7b\xa6\xd0\xac\x5f\x88\x34\xcc\x62\x2b\x15\xc8\x61\x95\x63\xe8\xf2\x78\x54\x15\x88\x93\xc2\xb8\x9c\x4e\x19\x9f\x3a\xea\x8c\x34\xbd\xae\x35\x56\x6b\x3a\x18\xe9\x9d\x48\xb0\x05\x1f\x51\x7a\xb0\xf1\x65\x2c\xbc\x3f\x17\xa9\xbd\x7d\xbc\xb0\xda\xa0\xdf\xd9\x3a\x40\xfa\x9c\x13\x21\x5d\x9d\x05\x9a\xa6\xb8\xf6\xd5\x2f\x74\x2d\xbd\xc3\xaf\x1a\x54\x71\x1c\x36\xb2\xbb\x7a\x2a\x00\x8b\x2a\xc7\xbe\x47\xf7\x63\x35\x36\x99\xb2\x05\xbe\x82\xf2\x9a\x5e\x35\x58\xae\xad\x79\xb6\xba\xfb\x3e\x3e\xba\xcd\x39\xdf\x9d\xbd\xb4\x62\x2d\x4d\x6e\xcd\xd7\x7c\x85\x0d\x13\x5f\xf2\x8e\x3a\xcc\xa2\xd8\x53\x54\x43\x5e\x08\x49\x25\xb3\xe4\x6e\x19\xcf\x0c\xbf\x58\x83\x60\x73\xdb\xab\x71\x0d\x8e\xad\xc5\x65\xa4\xb6\x5c\x54\x2d\xe4\x0d\x5f\x50\xc9\x0c\xd2\x12\xa3\xd4\xa7\x25\xc5\x56\xb0\x86\x5a\x38\xa3\xfa\xc2\x85\xff\x59\xa4\xab\x02\x0b\xab\x74\x84\x05\x06\xe3\x60\xb5\x3d\xf3\x0b\x62\xab\x0d\x41\xb4\xad\x34\xb1\x2f\x5f\x18\x8d\xb8\x01\x09\x13\x8a\x6d\xfe\xa8\x3f\x54\x70\x9f\x80\x21\x6b\x5a\xd5\x8b\x75\xf1\x29\x58\x4b\xd4\x63\xba\x83\x21\xcc\x59\x82\x6f\xd8\x78\x84\xdd\x17\x58\x60\x8f\x17\x75\x6b\xe3\x0d\x87\xe7\xc6\x7c\x5b\x95\x2c\x84\x4f\xf9\x14\x81\xad\x0e\xc5\x32\x04\x9b\x8a\x90\x7f\x0f\x11\x3c\x71\xd3\x07\xf9\x04\xdc\x1e\xa1\x2a\x33\xc0\x75\x21\xf4\xd1\x25\x0f\x1c\x12\x5b\x77\x76\x47\xf4\xed\xa0\x67\xb4\x77\x22\xb6\x72\xfe\x75\x51\x69\xa8\x9c\x76\x57\xff\xf6\x8f\xe5\xb4\xcc\x6d\x59\x60\xb1\x54\x99\xd5\xf5\xb3\xb4\xec\x14\x2d\x76\x86\x19\x9f\x7c\x38\x0d\x93\x33\xc2\xa8\x73\x9f\xda\x62\x84\xbc\x8e\x96\xdc\x65\x53\xae\x39\x68\xb5\x7d\xb8\xe6\x1a\x4e\x3f\x75\xb6\xca\xea\x6d\x1e\x2d\x19\x2f\x8c\x9c\x81\xd2\x51\x6d\xad\xe4\xc9\x8c\xf2\x29\x1a\xf8\x45\x69\xe6\xfb\xf2\x4b\x5c\x91\x84\xb4\x4c\x5c\x49\x79\x1f\xd9\xfd\xa5\xb7\x6b\xba\x4a\x47\xd8\x57\x4a\x25\xb4\xf0\x6b\x0e\x3f\xcb\x0a\x21\xef\x08\x1b\xc1\x88\xec\x7d\x19\x5c\xda\xb3\x6f\x2f\xa4\x30\xaf\x70\x41\xe1\xb8\xaa\x8c\x69\x3c\xde\x7b\xe1\xdd\x23\x72\x66\xde\x81\xbe\x9e\x0a\x80\x41\xdc\xf2\xb8\x06\xdf\x80\x48\x98\x52\x99\x66\x98\x4b\x38\xa9\xc4\x2d\x9b\x71\xe4\x00\x86\xa4\x17\x23\x05\xb9\xd0\xeb\xec\xae\x3b\xf5\xbb\xb7\x42\xda\x30\xa5\x9a\x0e\xb1\x0c\xbf\x25\x62\x47\xd6\x70\x30\x74\x85\x10\x87\xd4\xa1\x56\xd0\x11\xff\x0b\x97\x33\x36\xa4\xd5\x5d\x8c\x0f\xe9\x10\x4b\x12\xb6\x8f\x82\x7d\x82\x80\x89\x4e\x3a\x7c\x87\x7a\x98\xcb\x82\x77\x55\x46\x19\x61\x30\x22\x17\x42\xd7\x65\x73\xab\xd8\x0c\x57\xf2\x71\xdd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\x2b\x05\x6f\x9d\xce\xbb\x54\x8a\x2f\x48\x19\x7f\x45\xd1\x67\x67\x7c\xfe\x03\x95\x75\x2f\x77\x94\x1f\xd7\xba\x89\x7d\xb3\x77\x24\x71\x27\x2f\x3e\xfc\xec\x09\x83\xc7\x7a\x0c\xca\xb9\x08\x2a\x1d\xac\xdb\xb5\xb0\x01\xd6\xc9\x2f\xe7\xa7\x67\x17\x37\xe7\xdf\x9c\x9f\x5d\x3d\x69\x34\x45\xc7\x52\x78\x4d\xa6\xdc\x92\x4b\x16\x12\xe6\x4c\x94\x2a\x5b\x54\x8d\xa6\xd6\x13\x81\xd5\x80\x3c\x9e\x12\xca\x17\xde\x9e\xb6\xfe\xb1\xc8\x6c\xfb\x65\xb6\xcd\xe0\x92\x0e\x85\x4b\xfa\x42\xdf\x6f\xa4\x68\xdd\x48\x7f\xd9\xb6\x6f\xed\x13\xde\xa6\xbf\x0e\x9f\xf6\x5d\x8d\x83\x06\xeb\x71\xc2\x63\x5d\x50\xc1\x08\xa3\x79\xa1\x3b\x94\x09\xef\xa5\xf8\x69\x3f\x75\x42\x6d\x20\xc6\x07\x5a\x7c\x07\x8b\x2b\xe8\x58\x1f\x65\xc9\x97\x92\x41\x62\x18\x1d\xb9\x85\x85\x75\xb1\x9e\xf8\x97\x75\xa9\xe3\xf2\x2c\x6b\xc7\xde\x42\x97\xba\xbe\x7d\x16\x7d\xbd\x85\x0e\x91\x99\x7e\xac\x94\x3f\x35\x5b\x88\x72\x9a\xd9\xd3\x6e\xbb\x47\xfa\x2d\xf8\xfa\x09\x8a\xdc\xee\x87\xec\xde\xd1\x59\xbd\x73\xf9\x08\x31\x37\x9c\x0b\xee\x8e\x5c\x54\xda\xd0\x28\xae\x43\x8b\xb5\xea\x08\x43\x6f\x8e\xbe\xc0\xff\xb8\xa2\x60\xc7\x69\xea\xa2\xa3\x4b\x05\x93\x32\xb3\xb6\x7a\x35\x22\xb4\x60\x3f\x80\x54\x68\x52\xbd\x65\x3c\x1d\x90\x92\xa5\x5f\x77\xa9\x2a\x65\x47\x8f\xbb\x20\xbc\x47\xaa\xdf\x9d\xb8\x76\x0e\xc7\x90\x77\x55\x44\x84\xd8\xd4\x47\xc4\x4d\x6f\x03\x76\x42\x46\x4f\xa0\xe9\xda\x89\x8a\xd8\x2d\xec\x97\xae\xee\xd7\x84\xd5\x3a\x73\xaa\x0a\x5c\xe9\x3b\x5f\x68\x4e\x55\xed\xa3\x46\x06\xc3\x06\xcd\x3f\x55\x41\x13\x18\x90\xbf\x57\x3f\x62\xc3\x65\xf5\xd3\xfe\xfe\x9f\xbf\x3b\xfb\xeb\x7f\xee\xef\xff\xfc\xf7\xf0\x2a\xb2\x42\xd4\x9a\x97\x6e\x41\x1b\x3c\x17\x29\x5c\xe0\x3b\xf0\x4f\x27\xae\x1d\x27\x89\x28\xb9\x76\x17\x30\x6d\x79\x34\x13\x4a\x9f\x5f\x56\x7f\x16\x22\x5d\xfe\x4b\x75\x2a\x95\xf6\x2c\x19\x03\x6e\x51\x87\xf4\x1b\x3b\xfa\x63\x0f\x35\x2d\xe9\xf9\xa8\xba\x59\x3d\x36\x62\xc9\x5d\xeb\x89\xf9\xc6\x83\x00\x5b\x5c\xfa\xfa\x08\x1c\x93\xca\x8d\x64\xda\xac\x9b\xb7\x37\x7f\xdb\xa9\x99\xaf\x1d\x3d\x92\xb6\x6a\x07\x7b\x06\x18\x42\xc4\xb7\x52\xc2\x83\x5c\x31\x58\xaf\xa5\xd4\xee\xe6\xe3\xcb\x73\x32\xb7\x10\x7e\x36\xc0\xf1\x4e\xb4\x6f\x3e\x29\x8d\xab\xbd\xa0\x4b\xc9\xab\xef\xac\xbf\xda\x5f\x77\x85\x04\x54\x55\xdb\x0b\x8c\x62\x73\x60\x7f\x1c\x25\x45\x39\x70\x37\x8c\x72\xc8\x85\x5c\x54\x7f\x56\x2e\xc2\xa1\xd2\x42\xd2\x29\x26\x9e\xd8\xc7\xed\x63\xd5\x5f\xf6\xc1\xc6\x0b\x56\x9f\xb6\xaa\x70\x52\x4a\x23\x34\x64\x8b\xba\xf4\xe7\xeb\xa3\x6d\x1e\xf4\xcf\x84\xb4\x55\x98\xd1\xb5\xef\xa3\x1d\x4d\x84\xac\x83\x04\x50\xe0\xac\xa0\x88\xfa\xa4\x4b\xac\x1d\x54\x62\x90\xb5\x06\xf0\xb9\xd1\x2c\x5b\x97\x06\xab\x47\x8f\xd4\x2c\x65\x73\xa6\x44\x87\xf4\x9a\x6a\xa2\xcd\x39\x03\xae\xb6\x87\x8d\x8c\xaa\xcc\x66\xf7\x05\x56\x43\xaa\xce\xeb\x12\xd9\x7f\xdb\xa5\xd3\xb7\x1d\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf3\xd2\x7b\x28\x4e\x6a\x47\x9f\x25\x4a\x9b\x33\xf6\x82\x7e\x9f\xb0\xc8\xbf\x1d\x1e\xbd\xfa\x3e\xff\x3e\x3c\xfa\x5d\xcd\x90\x2a\x76\xfd\x6c\x0e\xb8\x82\x44\x82\xfe\x1c\x96\x1c\xfb\xa6\x20\x50\x66\x5f\x91\x4a\xb5\x78\x6d\x7c\xee\xb7\x60\xdc\xf1\x62\xbb\xdd\xd7\x5a\x12\x9d\x48\x91\xfb\xb4\x77\x74\x6f\x60\x9b\x6b\x7f\xdf\x2d\x74\x6a\x96\x68\x47\x34\x06\x45\x63\xd0\x86\xf1\xa8\x31\xe8\xda\xe2\xe1\xb3\xb5\x04\x01\x9f\xb7\x75\x61\xac\xf5\xa0\x7b\x5d\x27\xac\x11\xb7\x9d\x43\x6d\xe4\x8f\xba\xaa\x3c\x71\x75\x24\x8d\x65\x68\xf9\x7a\x1f\x26\x76\xb1\x67\xdc\x1e\x7c\x9c\xa0\xce\x2b\x71\x5d\x0d\x6c\x09\x43\x98\x9b\x25\x54\x35\xb0\x1b\xd5\x2e\x31\xba\x14\x63\x5e\x7f\xb4\x21\xa8\xb7\x36\x2a\xd5\x28\x69\x8c\xd7\x75\x42\x2b\xe1\xb0\x2e\x2e\x4d\x95\x12\x89\x8d\xa6\xad\xb2\x1c\xb0\x74\x9d\x5b\x36\xae\x06\xfb\x4c\x07\xfd\xc8\x6d\xe1\xe9\xfa\x5b\xc7\x0b\xac\x87\xc9\xe7\xbe\xf8\x76\xea\x73\x66\x70\x25\xeb\xe7\x78\x5d\x01\x08\x06\x11\x9d\x13\x2c\x88\x43\x40\xaa\x5f\x69\xd8\x14\x43\x31\xc4\xa4\xb6\xb2\xb6\x6b\xf3\xd7\x99\x8b\x77\xe7\x99\x95\x67\xab\x93\x30\xb4\xc2\x2c\x6b\xf3\x73\x93\x49\xbe\x06\x67\x60\x77\xf6\xf9\x9b\x63\x9d\x3d\xb1\xcd\x7e\x58\xe6\x0e\xbe\x93\x3e\xd9\x64\x1f\xce\x92\x42\xc2\x84\xdd\xf7\x74\x4e\x8f\x79\x6d\x89\x61\x29\x70\xcd\x26\xcc\xe6\xd0\x14\x12\x0a\xe0\x36\x79\x81\x26\x33\xa4\xfd\x8e\x53\xd6\xce\xe9\xe7\x18\xcc\x63\x05\xee\x7e\x49\xd9\xf5\x3a\x61\x3f\xd2\x31\x12\xe9\x58\xeb\xf1\x99\xe8\x98\xc3\xdc\xe7\x43\xc4\x30\xf2\xbc\x7b\xe8\xfb\x69\x10\xc7\x8e\x58\xbc\x33\x96\xd5\x79\x4e\x47\x38\x4b\x2b\xeb\x73\x27\x64\xc0\xd7\x5e\x96\x59\xd6\x53\xf5\xed\xfd\x73\x84\x46\x51\x66\x99\x4b\x3a\x1e\x91\x8f\x1c\xcf\xe3\x31\x76\x79\x18\x90\x0b\x98\x83\x1c\x90\xf3\xc9\x85\xd0\x97\x56\xb0\x6d\xc6\xb2\xd9\x1b\x09\x9b\x90\x77\x46\x65\x52\x9a\x68\x5b\x69\x3f\xa8\x0b\x24\x64\x63\x82\xba\xe4\x58\x87\x18\xf4\xcd\xdb\xf2\x85\xcf\x68\x1b\x3e\xd1\x36\x55\xad\x4c\x7a\xd0\x4d\x7d\xcb\x3a\x17\x1d\x87\x11\x91\xce\x35\xb2\x2e\xa7\xf7\x05\x96\xd9\x28\x84\xd2\xd7\x46\x85\xed\xa7\xcd\xcd\xa5\x9f\x0e\x3b\x47\xd0\x2c\x83\xb4\xd1\xe7\xc8\xf6\xe7\xa0\x4d\x15\x1a\xb3\x8d\xab\x76\x11\x40\x66\x94\xa7\x19\x48\x2c\xf9\xae\x96\xeb\x5a\xb1\xba\xc7\x41\xd5\x95\xc2\xa7\x85\xd2\x24\x11\x32\x75\xcd\x6a\x5d\xf2\x26\x2e\xa6\x3a\x5e\x48\x68\x73\xca\xe9\xd4\x76\x29\x5c\x29\x1c\x8c\xe5\xa4\x55\xd0\xda\x62\x26\xc4\x2d\x49\x44\x5e\x64\x78\x00\x3a\x9c\x8f\xba\xb3\x4e\x85\xa2\x43\xec\xa6\x78\x14\x34\xdd\xc1\x1f\x9e\xb0\x3b\x62\x1f\x72\x0a\xdc\x43\xd2\x5b\x57\x3e\x43\x11\xcd\x2e\xa3\x4f\x5c\xf0\x4a\x5c\x99\x08\x73\x18\xcd\x5e\xd7\xf5\x08\x2a\xa2\x37\x22\x67\xf7\x90\x04\x9d\x2d\xcd\x13\xae\xb5\xa5\x16\x68\x0f\xe9\xde\xb1\xb8\xb3\x29\xbf\x2f\xf3\x79\x87\x04\xb5\x70\x2c\x55\x9f\xc3\x39\x7d\xb1\x6d\xf7\x0a\xec\x5b\x60\x13\xa4\x31\x69\xcd\xd7\xdf\x6e\x9c\x21\x7b\x62\x57\x4a\xd6\x55\x01\xca\x7e\x2e\x4c\xd4\x16\x42\x93\x83\xfd\xa3\xfd\xc3\x15\xbb\xde\x52\xc5\xe6\x9b\xe0\x49\x86\x25\x0a\x0b\xac\xf7\x07\xc9\x7e\x3a\x20\x4c\x7b\x1a\x6d\x2b\x25\xe0\xaa\x5c\x26\xdd\x80\x28\x41\xb4\xa4\x29\x73\x9a\x13\xfe\x6a\x6e\xd2\xb2\x74\x65\x12\x0e\xf6\x7f\xdd\x1f\x10\xd0\xc9\x21\xb9\x13\x7c\x5f\xe3\xf2\xb1\xa6\x48\xa9\x82\x89\x16\xa2\xc4\xd6\x7d\x16\x04\x55\x81\x10\x43\xe8\x88\x28\x6d\x9f\x9f\x19\xd5\x3e\x83\xef\xec\x9e\x69\xdf\xdb\x42\x4c\xc8\x1b\xdb\x66\x08\xa8\xb3\x2c\x66\x6c\x0e\x47\x33\xa0\x99\x9e\xd9\xe0\x0b\x2e\xf8\xd0\x76\x8a\x33\x14\xc8\x5d\xe9\xea\x87\xe8\x66\xa6\x0b\x47\x07\x93\xdd\xea\x82\x3a\x4a\xe4\x86\xf6\x7e\xdb\xbe\x17\x2e\x59\x69\x13\x7d\x73\x73\xf9\x6d\xa3\x19\x2e\x12\x7f\xad\x0b\x1f\x12\x13\x14\xdb\x78\x06\xb4\xa3\x1f\x27\x60\xa7\x4e\xb6\xa4\x47\x12\xd6\xb5\xa3\x2d\x59\x6d\xfb\xbd\x5b\x2b\x5b\xf2\x57\x51\x62\x0b\x3e\x3a\xce\x16\xe4\x8e\x72\xed\xd3\xf7\xf6\xcc\x54\x7b\x86\x3c\x19\x6c\xf8\x0b\xd0\x14\xa4\x42\xea\x01\xb4\x75\x51\x31\x3f\x7a\x73\x4e\x05\x6b\xeb\x97\x0f\x94\x4a\x8b\x9c\xcc\xdc\x67\x37\x53\x1a\xdd\xc9\x18\xe1\xe9\xf1\xf9\x42\x12\x0a\x4b\xe1\xdc\x33\xaf\x8e\x7e\xad\xd0\x0d\x0b\xf7\x46\xf1\xfd\x24\x04\x5b\xd8\xa2\x85\x71\x0b\x2c\xdb\x5c\xb1\x27\x5a\xda\x43\x50\x01\xe9\x31\xb0\x80\x74\x4b\x90\x5c\x9e\x08\x9d\x65\xdd\x63\xa8\x7a\x8b\x55\x20\xbd\xf9\xe3\xc9\x3a\xe3\xa5\xc3\x19\x1b\x39\xdb\x13\x10\x7b\xf5\x82\x93\xee\x29\x98\xe1\x78\x18\x00\xfd\x6c\x3e\xe9\x13\x02\x45\x0f\x21\xd3\xab\x01\xd3\x2b\x2d\xc6\x91\x4c\xd8\x4a\x55\xcf\x86\xcb\x74\xed\xb7\x4e\xd6\xe7\x1f\x4b\xc2\xab\xf6\xb8\xfa\x45\xf4\x5c\x27\xfd\x85\x36\xf6\x1d\xd8\xd8\x6b\x58\xe3\x27\x0d\x6a\xc4\x54\x8a\xce\x54\xa4\x69\x53\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\x46\x21\xdf\xc2\xa3\x69\x45\x35\x47\xed\x59\x9c\x31\x9d\x14\xd7\x22\xb9\xed\x51\xaf\xd9\xbf\x39\xb9\xb4\x53\x06\xaa\x0d\xe5\xde\x18\xc2\xf8\x5c\x64\x73\x5b\xe9\xef\xe6\xe4\x12\x4f\xde\x08\xff\x85\x86\x28\xd4\xa8\x17\xe6\x59\x1f\xec\xef\x5c\x38\x46\xfb\xb6\x16\x34\x4a\x24\xd0\x8c\x29\xcd\x12\x7c\xae\xb2\x6d\xe1\x0c\x5d\x7c\x37\x51\x53\x5a\x37\x7a\xd7\x94\x82\x6e\xb3\xbb\x2a\x4d\x5d\x83\xf3\x9e\x31\x5f\x72\xfc\x48\x56\xcd\xd4\x22\x5f\xea\x69\xbe\xe7\xcb\x97\x0a\x09\xd7\x5a\x14\x3d\x79\x42\xec\x64\x1b\xfc\x20\x63\x98\x08\x09\xcb\x8e\x90\xc0\xb1\x91\x96\xe0\x0a\x71\x1e\x5f\x9e\x57\x26\x28\xd1\x70\x5e\xd8\xb0\x44\x5f\x7d\x33\x63\x73\xe0\xa0\xd4\x11\xba\x3c\xca\xc2\xaa\x98\xbe\x6f\xee\xc0\x7c\x1d\xe4\x85\xad\x5f\x59\x85\xfa\xbb\xae\xbd\xf8\x23\x68\x5b\x78\xb2\xf2\xbf\x38\x8b\xaa\x5f\xfe\xb2\xab\x24\x91\x54\xcd\x6c\x47\x5b\xb8\x67\xda\x75\x65\x96\x40\x95\xe0\xd6\xd8\x1b\x34\xd7\x65\x8a\x14\x54\xa9\xba\x0c\xb8\x7b\x89\x7d\xe8\xd2\x96\x0e\x0e\x1f\x98\x4a\x9a\x00\x29\x40\x32\x91\x12\xcc\xb9\x4d\xc5\x1d\x27\x63\x98\x32\xae\x3c\xfc\xcc\x44\x1e\xd0\x86\xdd\x00\xda\x86\x7d\x45\xb5\x11\xb9\x6a\x14\x0a\x71\x29\x3c\x89\xa8\x4f\xb4\x5b\xc5\xb2\x93\x09\xa3\x26\x11\xbc\xb6\xad\x4c\xb5\x31\x61\xa7\x9d\x47\x16\xdd\x83\xb7\xc9\x36\x83\xf2\xd7\x36\x42\x07\x0b\x9e\xd2\x64\xd6\xcd\x7d\x1b\xdd\x53\x5b\x8e\xe8\x9e\xda\x6d\x44\xf7\x54\x74\x4f\x6d\x1e\xcf\xce\xbc\x1b\xdd\x53\x51\xe9\x5a\x1e\xd1\x3d\x15\xdd\x53\x1b\xc6\xb3\xa3\x5f\xd1\x3d\xb5\xc5\x88\xee\xa9\x2d\x47\x74\x4f\x45\xf7\x54\x74\x4f\x45\xf7\xd4\x6f\xc8\x0c\xe8\x47\x74\x4f\xad\x4c\x12\xdd\x53\x01\x30\xa2\xa6\xb4\x66\x44\xf7\xd4\x9a\x11\xdd\x53\xc1\x88\x7c\xa9\x05\x5f\xf2\xce\x9d\x4b\xa3\x97\x75\x6f\x23\x8c\xda\x1d\xd6\xf3\x7b\xa5\x69\x4d\x5d\x6c\xfc\xcf\xda\xbe\xff\x4c\x7c\x28\x3d\xd8\xf4\xa3\x3d\xff\xd5\xd9\xf3\xfb\xb1\x85\xf5\x60\x07\xeb\x4c\xca\x9d\xd7\xfc\x66\x26\x41\xcd\x44\xd6\x1a\xd1\x1b\x48\xfe\x81\x71\x96\x97\xb9\xc1\x39\x65\xf0\x99\xcd\x2b\xf7\xbc\xaa\x5b\x32\xa3\xd7\xde\x9a\xe4\xcc\x8d\x2c\x05\xac\xc6\x49\x59\x66\xb6\x11\xf3\x27\x67\x14\x65\x62\x55\x26\x09\x00\xf6\xfa\x0a\xd5\x85\x3f\x8c\xaa\x37\x55\xbd\x1d\xde\x76\xa3\x37\xdd\x98\xac\xad\x97\x89\xb3\xfc\xe1\xf7\xad\xe6\xe8\xe8\x4e\xf9\xfc\xae\x94\x1e\xc8\x74\x77\xc5\xa0\x93\x52\xd0\x07\x97\xe8\xaa\x0c\xbc\x34\x97\x49\x6f\xae\xc3\x1e\x5c\x25\xcf\xc8\x4d\xf2\x6c\xd8\xc2\x73\x71\x8d\x3c\xc3\x52\xa0\x3d\x58\xf2\xfb\x70\x85\xf4\xe7\x06\xf9\x04\x15\x33\x3f\x8d\xfb\xa3\x47\xb5\xb3\x27\xb7\xc7\xe7\x70\x79\xf4\xf2\xd5\x5d\x5d\x1d\x9f\xcf\xcd\xd1\xcf\xe7\x76\x34\x23\xbd\x0a\xd7\x46\x0f\xe6\xa3\x3e\x4d\x47\xbd\x99\x8d\x3e\x99\x2b\xa3\xbb\x1b\xe3\x19\xb8\x30\x3a\x03\x99\x71\xa6\x19\xcd\x4e\x21\xa3\x8b\x6b\x48\x04\x4f\x5b\x73\x98\xa5\x12\x6a\xd5\xf9\x51\x76\x5a\xa7\xa3\x35\x03\x7d\x67\xd4\x55\x8a\x85\xd4\xc7\x2e\x7b\x93\x9e\x13\x28\xd0\x1a\x67\x57\xd9\xa6\x0e\xd3\x9d\x90\xb7\x99\xa0\xa9\x3a\x2a\x84\xfd\xbf\x3a\x8c\x37\x88\xdf\xb5\xef\xea\x16\xc0\xfb\xd4\xca\xa0\x8d\x7a\xee\x73\x13\xff\x22\xee\x88\x98\x68\xe0\xe4\x80\x71\xbf\x8f\x87\x81\x1a\x58\x6b\xe6\x15\x5a\x9b\xab\x6f\xdf\xf8\x9b\x5f\x9f\xca\x8d\xc6\x05\xa5\x3e\xbd\x05\xc4\xbd\xe8\x71\x13\x88\xbb\x71\x52\x66\x4d\x33\x88\x35\x8d\x34\xe9\xcd\xdb\xba\xd6\xe5\x5b\x9c\xb7\x3a\x6d\x94\xa7\xc4\x65\x48\xbc\xbe\x4d\xeb\xec\xa0\x7d\x0d\xce\xd9\x68\x7b\x21\x7d\xdb\x5e\x9e\xc8\x09\xfb\x0c\xa5\xe6\x17\xea\x78\x8d\x52\xf3\x0e\x23\x48\xb4\xfa\x56\xd2\x04\x2e\x7b\x17\x38\xfc\x71\x22\x69\x29\x5d\x7e\x5c\x25\x77\x54\x87\x87\x03\xa4\xf6\x34\x55\xd9\x67\x98\xf6\x35\x29\xb3\x6c\x41\xca\x42\xf0\x66\x8a\x9f\x75\x5a\x2d\x67\x86\x99\xd9\xd6\xbd\xa5\x96\x52\x0b\x29\x1c\x03\x96\x25\xe7\x86\x9e\xd7\xdd\x6f\x50\x2a\x55\x96\x56\x87\xf9\x67\x8a\x4d\xcd\xf2\x0d\x33\xc5\xd4\x34\x96\x43\xdd\x1f\xa1\x9e\xd0\x3c\x3d\x11\x32\x61\xe3\x6c\x41\x66\x34\xab\x5a\x1d\x50\x72\xcb\xb2\xcc\x4d\x33\x22\xd7\xa0\x89\x9e\x31\xd7\xa5\x9a\x64\x82\x4f\x71\x71\x94\xfb\x16\x5b\x90\x98\x67\x93\x0c\x28\x2f\x0b\xfb\x3e\xc3\xd6\x17\xa2\x94\xfe\x7d\xae\x7e\x64\x35\x0b\x53\x84\xb3\x6c\x10\x34\xf2\x79\x70\x63\xeb\x6e\xe9\x0a\x7c\xf2\xde\x1d\x53\x30\x08\xe7\x14\x73\x90\x92\xa5\xce\x69\x60\x7f\x2b\xa4\x98\xb3\xd4\xb6\x62\xf0\x60\xc3\x96\xa1\xb6\x55\x43\x75\x9e\xb9\xe0\x43\x0e\x53\x8a\x52\x8f\x3b\x45\x76\xcf\xec\x3c\xd6\x15\xc7\x53\x6c\xde\x60\xd4\x05\x51\x34\x72\x46\xe7\xcc\xb6\x9d\x0c\x20\x47\x0e\xb8\x20\x02\xd9\x6b\xc9\x99\xb6\xad\x8c\x67\xa5\x26\xa9\xb8\xe3\x87\x66\x72\xa6\x0c\x1c\x28\x19\x83\xf6\x6d\x55\x7d\x9b\x3f\x26\x41\x11\xe0\x74\x9c\x99\x3d\xc7\x98\x80\x9b\xb5\x00\x22\x13\xa0\xba\x94\x40\xa6\x54\xc3\x5a\xa1\xc9\x7e\xef\xc3\xe0\x65\xaa\x6a\x39\x5e\x72\x05\xad\x9b\x2d\xf7\x2c\x69\xfd\xe9\x8f\xed\x68\x04\xcb\x41\x94\xfa\xb3\xa8\x92\xb6\x1d\x7f\x20\x19\xb3\x1c\x14\x11\xe5\x92\x8e\xfd\xd6\x3d\xb6\x7e\x87\xa2\x3e\xb9\x6e\xb4\xb5\x12\xaf\x31\xa5\xb9\x6e\x80\xab\xf1\x33\x41\xb7\x53\x6a\x8e\xe2\xe9\xc5\xf5\x2f\xef\x8f\xff\xeb\xec\xbd\x3b\x9f\x3c\x64\xfa\x25\x67\xff\x28\x81\xd0\x5c\x18\xb9\x3a\x0b\xc3\x70\x06\x68\x1e\x08\x7e\xc0\x93\xdc\x6f\xc0\x4e\x4b\x86\x8c\xad\x99\xbb\x87\x25\x61\x83\xe7\x4f\x1f\x95\xf4\xd4\x2d\x6b\xaa\x96\x9b\xe6\x83\xc3\x96\x35\x94\x70\xd0\xe6\xe4\x59\x89\xd2\xb6\x30\x62\x7c\x9a\x85\xc2\x64\x3b\x72\xd5\x55\x27\xea\xaa\x11\x0d\xeb\x2f\xb8\x6c\xab\x18\xf5\xd2\x3a\xa7\x5e\x43\x4f\x0d\x27\x6a\xaa\xed\xd5\x00\xdb\x11\xd4\xab\x01\x56\xf4\x38\xbf\x24\x34\x4d\x25\x8a\x29\x78\xea\xf3\xa5\xc6\x73\xf8\xb0\x35\xc6\x0f\xc8\x1b\xf2\x67\x72\x4f\xfe\x8c\x6a\xc1\x9f\xba\xb6\xe7\xe8\x2a\xb0\x77\x37\x4b\x58\x6d\xf4\xfc\xb2\x27\x88\xff\x38\xa3\x1a\x67\x34\x50\xd5\x82\x8c\x99\x13\x43\xe1\x5e\x83\x34\x62\x91\xdb\x89\x27\x6d\x6c\x62\x16\xf8\x19\xd1\xcc\xda\xdc\xcf\x27\x61\xe5\x7f\xbd\x23\xa2\x99\xc7\x8d\x7e\x7f\xe1\xa8\x50\xb3\x8f\x40\x3d\x5b\x4e\x75\x32\x6b\x92\x31\x23\x60\xa8\x06\x73\x4a\x05\x92\x71\x1b\xbf\x36\x63\x1d\x22\x08\x9e\x0f\x1a\x77\x73\x2a\x37\xf6\xf3\xa1\x9d\x5a\x52\xfc\x91\xcf\x3b\xc1\x20\xa8\x3f\x52\x88\x74\x44\xce\x68\x32\xc3\x65\xa5\x01\xcf\x30\x1a\x08\x4e\x36\xa3\x73\xb3\xf1\xee\x59\xdb\x77\x03\xa5\x95\xca\xd4\x8a\xb8\x64\xce\x53\x42\xb9\xed\x7c\x37\x01\x29\x6d\xc8\xe1\x78\x81\x9e\x4f\x96\x40\xe7\xcd\xeb\x74\x92\x0a\x29\xb4\x48\x44\x87\xde\x2b\xcb\xd1\xcf\x38\x1d\x02\xc1\x1a\x2d\xbd\xad\xf8\xfb\xd3\xcb\x01\xb9\x39\xb9\xc4\xa6\x19\xd7\x27\x37\x97\x4d\x09\x7b\xef\xe6\xe4\xb2\x43\x0f\xff\x5e\x6c\x1e\xce\xcc\xf6\xce\x2c\x73\xe7\x49\x24\xd0\x94\xc5\x38\xf2\xed\x47\x8c\x23\xdf\x3c\x62\x1c\x79\x8c\x23\x8f\x71\xe4\x0f\x8f\x18\x47\xee\xc6\xd3\x9b\x7a\x48\x8c\x23\x6f\x39\x5e\x97\x2f\x33\xc6\x91\xef\x34\x62\x1c\xf9\xea\x88\x71\xe4\x1b\x46\x8c\x23\xdf\x30\x62\x1c\x79\x8c\x23\x8f\x71\xe4\x31\x22\xe6\xd1\xb9\x9e\x67\x44\x0c\x89\x71\xe4\x6e\xc4\x38\xf2\x57\xe1\xf7\x27\x31\x8e\x7c\xab\x11\xe3\xc8\x63\x1c\x79\x9b\x11\xe3\xc8\x71\x44\xdb\x4b\x8c\x23\xf7\x23\xc6\x91\xdb\xf1\xdb\x91\x9a\x63\x1c\x79\x8c\x23\x8f\x71\xe4\x31\x8e\xfc\xc1\x55\xc4\x38\xf2\xd7\xa0\x4f\xfa\x86\x5a\xdd\x83\xa0\xaf\xfc\x4c\xdb\x87\xd5\x90\xb3\x35\xbf\xa2\x59\x45\x15\x66\x12\x59\x4f\x99\x49\xa0\xe9\x02\xa7\x4c\xd0\x2d\x53\x0b\x59\x2f\x30\x3a\x27\x63\x39\x6b\x17\x77\x4e\x56\x0e\xcd\x7b\x9c\x2b\x70\xe1\x18\xb0\xe4\xf4\x1e\x0f\x00\xcd\x45\x69\xfb\x77\x25\x22\x2f\x4a\xdd\x84\x29\x6e\x4f\x9b\xd6\x5b\x13\x36\x75\x1c\xf5\xc8\x76\x09\x1b\x56\xd3\x0e\x83\xce\x5c\x4f\xa8\xc0\xd0\xd4\x87\x9f\x5c\xf6\xa0\x4b\x14\x54\x6b\x90\xfc\x1d\xf9\xef\x83\xbf\x7d\xf5\xeb\xf0\xf0\xeb\x83\x83\x9f\xde\x0c\xff\xe3\xe7\xaf\x0e\xfe\x36\xc2\x7f\xfc\xeb\xe1\xd7\x87\xbf\xfa\x3f\xbe\x3a\x3c\x3c\x38\xf8\xe9\xbb\x0f\xdf\xde\x5c\x9e\xfd\xcc\x0e\x7f\xfd\x89\x97\xf9\xad\xfd\xeb\xd7\x83\x9f\xe0\xec\xe7\x2d\x27\x39\x3c\xfc\xfa\xcb\xd6\x4b\xee\x2c\xf0\xf6\x27\xee\xf6\x24\xec\x7e\x12\x51\xd7\xf9\x7e\x7b\x3a\x8b\x57\x6e\xb6\xe5\xd3\xe8\xd8\xd1\x43\xa7\xd1\x6b\xdc\x28\xc4\x55\xf3\x30\x45\x44\xce\xb4\x76\x54\x94\x86\x51\x5f\x4c\x37\x54\x4e\x47\x07\xb0\xdb\x21\xd5\xb6\x9d\x60\x15\x31\x15\x44\xec\x0a\x2f\xd7\xb9\x36\x8d\x95\x35\x02\xcf\xf3\x30\x85\x09\xe3\xe0\xbc\x5c\x91\x36\x3c\x3e\x22\x6d\x78\x8d\xb4\x41\x41\x52\x4a\xa6\x17\x27\x82\x6b\xb8\x6f\x65\x3f\xd9\x64\x40\xba\x6e\x4e\x4d\xec\x89\xb3\x94\xc2\xbf\x96\x88\xc2\x06\x4a\x6e\x4c\xcd\xab\x82\x6e\x65\xc9\x51\xa5\xb4\x39\x14\xa0\xad\xbe\x87\x9a\x0e\x46\x41\x2e\xbf\xce\x6b\x70\x76\xea\x7f\x94\x6c\x4e\x33\xa3\xdf\xd6\x4f\x5c\xa2\xce\x12\x3e\xd4\xca\x88\xf5\xc4\x32\x16\x8a\x37\x97\x92\xcd\x59\x06\x53\x38\x53\x09\xcd\x90\x2a\xf5\x43\xe9\x8f\x37\xcc\x8e\x5b\x24\x45\xa6\xc8\xdd\x0c\xb0\x8d\x2a\xf5\xea\x39\x66\x2a\x4c\x29\xe3\x24\x37\x44\xb5\xf0\x0f\x2b\xab\xe7\x1b\xe2\x6d\xa4\x5e\xae\x6b\x7d\x1e\xd5\xd7\xb1\x10\x99\x0b\xeb\xcd\x16\xf5\xfc\xae\xad\x2d\x17\xbf\x70\xb8\xfb\xc5\xcc\xa6\xc8\x24\xa3\xd3\x4a\x8d\x57\xa0\x57\x2c\x71\xf5\xd4\x1b\x3f\x00\x63\x66\x4b\x20\x34\xbb\xa3\x0b\x55\x1b\x35\xc2\x86\xbf\xef\xc8\xdb\x43\x44\x3c\xaa\x48\x35\x47\x4a\x7e\x7f\x88\x7e\xbe\x93\xe3\xcb\x5f\xae\xff\x7a\xfd\xcb\xf1\xe9\x87\xf3\x8b\x6e\x74\xde\x7c\x3b\x50\xde\x6a\x8e\x84\x16\x74\xcc\x32\xd6\x85\xbc\xaf\x44\x82\x84\x93\x22\x03\x4d\xd3\xa3\x54\x8a\xc2\xc2\xc9\xdb\x8f\x42\x1d\xe7\x74\xc9\x2c\xec\x78\xb6\xdd\x9e\x49\x73\xc2\xa9\xa4\x5c\xd7\x86\x94\x1a\xe4\xb2\xe4\x46\xe9\x7d\xe1\x41\xf3\x34\xed\x2f\x60\xfe\x38\x4d\x21\x6d\x40\xef\xd5\x05\xe8\x9d\xf8\x8f\x5b\xd4\xb9\xb6\xe4\xf2\xe3\xf5\xf9\xff\x5e\x42\xc3\x45\xd1\x2d\x1e\xa9\x9f\xfc\x1e\xd9\xbe\x03\x39\x59\x35\x26\xe4\x62\x1e\xf7\xf7\xb9\xec\x6f\xc5\xab\xfa\xf1\x82\x5f\x95\x3c\x64\x27\x3c\x98\x9f\xe4\x22\x85\x11\xb9\xac\x2c\xe8\xcd\xab\x61\x0d\x01\x09\xc4\xdc\xc2\x35\xc3\x56\xe7\x81\x28\xa3\x85\x4d\x74\x69\x64\x98\x86\x74\x78\x42\x33\xd5\x91\x98\x76\xe1\x4c\x86\x09\x7f\x30\xaa\x60\x2f\xd0\xac\x66\x23\x29\x70\xa1\x9d\x24\x69\x56\x89\x49\xb7\x52\x24\xc4\xea\x9d\x41\xc8\x52\x83\xbb\xb8\x06\xf8\x9e\x31\x31\xe5\x61\x75\x59\xcd\x6c\x2d\xb0\xa5\x02\xb5\x9e\x31\xd5\x9a\xa8\x99\x5d\x02\x4d\x31\x5f\xac\xa0\x7a\x66\x23\x0e\x72\xaa\x6e\x21\xb5\x3f\x38\xb9\xa6\x32\xc1\xdb\x66\xf8\xee\x55\x37\x66\xdd\xde\xde\x8e\xf2\x8c\x8d\x83\x40\x3b\x3d\xb4\x8e\x4e\xef\x7c\x04\xcc\x37\x7d\xe4\xd9\xe2\x4a\x08\xfd\x4d\x95\x27\xd5\xcb\x06\xfe\xe8\x24\x45\x74\xb3\x34\x43\xa6\x30\x40\x20\x1d\x22\x30\x11\xa5\xc3\x14\xad\xd3\x7a\xc3\x9e\x18\xa1\x65\xc9\x8f\xd5\xb7\x52\x94\xad\x39\xc0\x8a\xa0\xf5\xed\xf9\x29\x9e\xe3\xd2\x79\xc0\xb8\x96\x8b\x42\x30\x6b\x3e\xd9\x20\xd3\x7e\xef\x7c\x78\x21\x46\xd6\xee\x16\xf2\x81\x2e\x08\xcd\x94\xf0\xc2\x31\xe3\xeb\x54\x1d\xe2\xf4\x28\x73\x79\x2c\xf4\x6c\x45\x81\x32\xe8\xbc\xfa\xdc\x20\x70\x88\xd5\x75\x53\x18\x5f\x79\x5c\xd3\x5b\x50\xa4\x90\x90\x40\x0a\x3c\xe9\xb8\x6b\x4f\xed\x06\xc2\x9d\xbf\x10\xdc\x1c\x8b\x5e\xf6\xfe\xbc\xf2\xff\xa1\x19\xab\xb9\xd3\xe8\x49\x74\x7a\x07\x45\x7f\x22\x1e\x8a\x52\x81\xb4\xce\x4f\x59\x82\xdd\x88\xef\xca\x31\x64\xa0\xad\x32\x84\xf5\x03\xa8\xb6\x2a\x2f\xcb\xe9\x14\x08\xd5\x15\xa2\x68\x41\x80\x2b\x43\x6e\xac\xe1\x4c\x93\x54\x40\x9d\xdc\x48\x15\xf9\xfe\xfc\x94\xbc\x21\x07\xe6\x5d\x87\xb8\xfd\x13\xca\x32\x74\x35\x6a\x2a\x97\xd7\xc8\x26\x7e\x0a\x5c\x12\xe2\x1e\x11\xd2\x1e\xd1\x01\xe1\x82\xa8\x32\x99\xf9\x35\x19\x8d\xcb\x2b\x6c\x2e\xd6\x0e\x4d\xf2\xaf\x10\x55\x3b\x13\x98\xef\x15\xc8\xde\xe8\xcb\xf7\x2d\xe8\x4b\x28\x42\x18\x9c\x6b\x42\xcf\x22\x56\x0e\x9a\xa6\x54\x53\x47\x77\xea\x8c\xe8\xd7\xb8\xa5\x4f\x4d\x7d\x14\xbc\x67\xbc\xbc\xb7\xb6\xb5\xfe\x94\xfc\xeb\x33\x9c\x16\x51\x00\x81\x86\x9b\x46\x8b\x22\x63\xb5\xe7\x31\x88\x6e\x3a\x6f\x6c\xf5\x60\x83\x88\x84\xc7\xdc\x3b\x30\x0d\x67\xa7\x3c\x15\xf9\xca\xcb\xd0\x5b\x4a\x93\x59\xf8\x82\x57\x89\x3c\x4f\x6e\x8e\xc8\x60\x0e\x1d\x6a\x73\x2c\x21\xce\x7b\x33\x9b\x91\xc5\xfc\x86\xe2\xf4\x24\xa3\x63\xc8\x2c\x67\xb1\x08\xa4\x56\x11\xe8\xa9\x23\x04\xa5\xc8\xfa\xcb\x8f\xb8\x12\x19\xd8\x90\x1b\x0f\x08\x33\xfd\x8b\x80\x03\x4e\xd2\x17\x1c\x50\x91\x69\xc0\x01\x55\xb2\x97\x00\x87\xb2\x03\xa3\x25\xcb\x70\x30\x5c\xbb\x09\x07\x64\x9d\xcf\x1d\x0e\x0a\x92\x44\xe4\xc5\xa5\x14\x46\xe5\xea\x8d\xb5\xb8\x69\x6b\xff\x8e\xd5\xc9\xd1\xe0\x1b\x6a\x7f\xce\x9b\xd3\xbc\x99\xca\x20\xd8\x8e\x6a\x4b\xe3\x7d\xc4\xdd\xff\x0a\x58\x0e\x92\x9e\x65\x3e\xe4\x67\x69\x38\x80\xcc\x93\xee\xc2\x0b\x4f\xf5\xef\x60\x25\xeb\x85\x99\x88\x84\x66\x58\x3a\xad\x1b\xc6\x90\x65\xac\x59\x9e\x38\x88\x90\x44\xd7\x12\xfe\xe6\xbd\xf6\x58\x45\x0b\x7f\x71\xb6\x2f\x2e\x52\x08\x9c\x85\x36\xb4\xf3\xc6\x46\xd2\xe1\x7d\x3e\x38\xd3\x70\x75\xe7\xbc\x87\xb4\xf1\xb4\x16\xae\x3a\xcb\x87\xaa\x20\x9b\x59\x20\xf0\x94\xf1\x29\x5a\x74\x06\x44\x42\x66\xc3\x3a\xdd\x19\xbe\xb5\xea\xd7\x3e\x62\xb4\x9f\xd4\xa3\xb3\x7f\x35\x4a\x42\x4c\x70\x37\x33\x1a\x39\xbc\x7c\x33\xb1\xd4\x92\x29\xb2\xf7\xde\x03\xa0\x43\x05\xab\xe7\xc8\x20\xf6\xec\x17\x56\xbb\x69\x6d\x6c\xb7\x8c\xa7\x2e\x02\xb2\x01\x2c\xaf\x24\x3a\x29\x14\x63\x6b\x59\x1a\x92\x86\x77\xe4\x6f\x9c\x54\xc0\x22\xc3\xd6\xe8\x71\x65\x05\x56\x6f\x5e\x1a\x3e\x6c\xf2\xab\x5e\xb2\x3c\xcd\xf7\x1c\xf7\xde\xbc\x77\x68\xd4\xde\xd5\xfb\xfc\xb7\xec\x3d\xe5\xbe\xde\x31\x9e\x8a\x3b\xd5\xb7\x0e\xf1\xa3\x9d\xd6\x0b\xd4\x89\x41\x6b\xcd\xf8\x54\x85\x7a\x44\xb3\x4e\xee\x7a\x45\xc2\xef\xf0\x44\x0a\x9b\x86\xb7\x2a\xc0\x2f\x45\x6e\x47\x25\x60\x87\x31\xcd\x15\x3d\x91\xe6\x53\x34\xa3\xd9\x75\xd1\xbe\x6c\x1a\x59\x46\x83\x6f\x3f\x5c\x1f\x37\xa7\x36\xf4\xec\x6e\x06\xd2\xf2\x5e\x73\x9d\xd0\x34\x67\x4a\xa1\x19\x08\xc6\x33\x21\x6e\xc9\x81\x0f\xb4\x9a\x32\x3d\x2b\xc7\xa3\x44\xe4\x41\xcc\xd5\x50\xb1\xa9\x3a\x72\x48\x3b\x34\xab\x3f\x24\x8c\x67\x55\x04\x09\xaa\x91\x5c\x2b\x6f\xc6\xc0\x97\x24\xd5\x2a\x70\x6f\x5d\xdd\x45\xe7\x65\x5e\x5d\xa6\xad\xb4\xc8\x20\x7b\xfa\x62\x30\xab\xdb\x73\xd1\xb1\xae\xc5\x23\x5b\x84\xdf\xee\xd2\x46\xc2\x14\xa7\xb5\x70\xb4\xd2\xdb\x93\x03\xc9\x49\x07\x09\xa8\xfe\x2a\xe6\xfc\xa5\x9e\x93\xa4\x60\x33\x1b\x00\xa3\x4e\xe8\xc6\x30\x24\xb4\xca\xee\x63\x82\x9c\x7b\x74\x3f\x94\x68\xd1\xeb\x63\x53\x30\x8c\x3e\x90\x15\x33\x3a\xb4\x4a\xb2\x21\x49\x48\xc3\xbc\x0c\x30\x13\x5c\x48\x8b\xa2\x86\x0b\x0a\x8e\x28\x8d\xda\x82\x75\x04\xe1\x9e\x38\x1a\x1b\x2c\xf5\xa4\xf6\x0f\x86\x3e\x24\x4c\xb0\xb1\x09\xfa\xf5\x1a\xee\x98\x9e\x61\x11\xb9\xd9\x92\xc3\x09\x57\x22\x41\xa1\xf7\x80\x13\x90\x52\x48\x17\x08\xe3\xad\xb6\x38\x13\x92\x62\x8c\xa4\x31\x48\x42\xcd\x5f\xfb\x2a\x74\x51\xd6\xa5\x4c\x31\xb6\xcb\x60\x13\x4c\x26\x90\xa0\xa4\x14\x02\xd8\x92\xdd\x83\xba\xaa\x9e\x0f\x9d\xd7\xc2\x97\x42\xcd\xd9\xbd\x79\x4b\xf8\xd4\x52\x41\x75\x2e\xf8\x70\xfd\xe5\xc3\x11\x21\xe7\xbc\x8a\x7b\x1c\x98\x5d\x0c\xef\xf4\x21\x3f\xda\x7c\x62\x58\x47\x17\x3f\x20\xb4\x3b\x19\xf1\x4e\x96\x3d\x60\x7c\x17\x63\x30\x09\x0d\xc2\xbd\x92\x03\x34\x0c\xbb\x49\xcd\xd6\x7b\x26\xde\xc5\x50\x6c\x6e\xf9\x54\xc6\xe2\x97\xc1\xe9\x49\x57\x3a\xe7\xd2\xd5\x63\xed\xd7\xed\x46\xac\xfd\xba\x79\xc4\xda\xaf\xb1\xf6\x6b\xac\xfd\xfa\xf0\x88\xb5\x5f\xdd\x78\xfa\xf4\x4c\x12\x6b\xbf\xb6\x1c\xaf\xab\xfe\x48\xac\xfd\xba\xd3\x88\xb5\x5f\x57\x47\xac\xfd\xba\x61\xc4\xda\xaf\x1b\x46\xac\xfd\x1a\x6b\xbf\xc6\xda\xaf\xb1\x8a\xd5\xa3\x73\x3d\xcf\x2a\x56\x24\xd6\x7e\x75\x23\xd6\x7e\x7d\x15\xb5\x7a\x48\xac\xfd\xba\xd5\x88\xb5\x5f\x63\xed\xd7\x36\x23\xd6\x7e\xc5\x11\x6d\x2f\xb1\xf6\xab\x1f\xb1\xf6\xab\x1d\xbf\x1d\xa9\x39\xd6\x7e\x8d\xb5\x5f\x63\xed\xd7\x58\xfb\xf5\xc1\x55\xc4\xda\xaf\xaf\x41\x9f\x54\x3a\x65\xad\xca\x61\x6d\x53\xbd\xc0\x45\x86\x04\xf9\x8e\xe3\x72\x32\x01\x89\x94\x0b\xdf\xbc\x12\x85\x50\x55\x39\xaa\x68\x99\x8b\x33\xc0\xaa\x66\x12\x68\xea\xa2\xa0\x37\x3c\xee\x12\x2c\xb1\x6c\x55\x1d\xbe\x77\xf6\xf1\x9b\x7e\x4a\x25\x74\x0b\x5c\xc3\x35\x7f\xe4\x49\xf7\x00\xa6\x1a\xe0\xeb\xa2\xf2\x1d\xdc\x93\x4c\x28\x17\x76\x88\xc0\x4a\x66\x94\x73\xf0\xca\x23\xd3\x68\x94\x19\x03\x70\x22\x0a\xe0\x96\x7e\x53\xa2\x18\x9f\x66\x40\xa8\xd6\x34\x99\x8d\xcc\x9b\xb8\x07\x76\x1d\x22\xe8\x7e\x51\x5a\x02\xcd\x7d\xb0\x64\x4e\x99\x9d\x8a\xd0\x44\x0a\xa5\x48\x5e\x66\x9a\x15\xd5\x64\x44\x01\x46\x39\x5b\x46\x55\x01\x03\xc3\x4b\xea\xb8\xc2\x41\xfd\x36\xb7\x2c\x11\x56\x8a\x41\xd5\x75\x80\xa5\x2d\xf3\x42\x2f\x88\xf9\xe4\xcc\x95\xbb\x93\x4a\x93\x24\x63\xc8\xad\xf1\x8d\x36\xa1\x0c\xe7\x1b\x78\x5e\xcd\xdd\x4a\x95\x5b\x2a\x4f\x51\x6c\x2d\xb4\x22\x18\x86\x57\x4f\xe8\xa6\x4a\x99\x72\x62\xbe\x1a\x10\xea\xeb\xa0\x58\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x82\xe9\x82\xe2\x69\x06\x37\xad\x35\xac\x46\x74\x8c\x3b\xf5\xc8\x39\x68\x84\xd8\xd6\x02\x05\x86\xbb\xac\x1c\x03\xdc\x00\x0e\x73\x83\x03\x90\x80\xe1\xaf\x74\x03\xd6\x7f\x76\xa4\xd7\x54\x4e\x41\x57\x41\xb9\x6d\x63\x35\x9b\x05\x22\x82\x2a\x87\xa1\x1e\x52\x43\x0c\x81\x73\x29\x52\x8c\xb8\x77\x55\x24\x0c\xce\xac\x29\xa3\x68\x17\xe8\x0a\xe0\xac\xbb\xc1\xcb\x45\x36\xd4\xa9\x7a\xa9\x2a\x68\x02\x8a\x1c\x9c\x5f\x9e\x0c\xc8\xe5\xf9\xa9\x8b\x67\x12\x93\x75\x69\x7c\x8e\x84\x59\x04\xdc\x54\xd0\x91\x29\xff\x8e\xbb\x19\xd5\xb8\x9d\xc1\x8b\x50\x12\x9d\x51\xe9\x02\x15\x7d\xe5\x6b\x72\x21\x34\xac\x2b\x94\xe1\xa9\x01\x8a\x5f\xce\x06\xe1\x30\xcd\x8a\x33\xed\x09\x60\x4b\xb5\x25\x90\x8f\x3e\x80\x52\x74\x0a\x97\x2d\x1d\x58\x9b\x94\x73\xf4\x61\xd5\x67\x14\xa9\x42\x66\xd3\xd7\xaa\x5f\xea\x88\xb7\xa6\x44\x4c\x72\xbb\xa6\x6a\xbf\xef\x24\xd3\x1a\xf0\x7c\x63\xf1\x24\xf4\x81\x2f\x27\xa8\xee\x2f\xc5\xcd\x7d\xf0\x93\xd4\x0f\x1b\xfe\xce\x53\x1b\xc5\x36\x06\x32\x96\x0c\x26\x64\xc2\x30\x34\x0e\x83\xd5\x06\xb6\x1c\x08\xb5\xc6\x25\xa5\x40\xe2\x7a\x9c\x5a\xe3\xd7\x35\x22\x3f\xba\x85\x69\x59\x72\x5b\x01\xdd\x49\xdc\x98\xc2\xc5\x26\x64\x8a\xc1\x6e\x4e\x71\xf8\xe3\x9b\xff\xf8\x13\x19\x2f\x8c\x74\x83\xa8\xad\x85\xa6\x59\xf5\x91\x19\xf0\xa9\x81\x95\xa5\xd4\xcd\x24\xa4\x0a\x02\x58\xa3\xdc\x2e\xfc\xed\xef\x6f\xc7\x4d\x71\xeb\x28\x85\xf9\x51\x00\xbf\x61\x26\xa6\x23\x72\x42\xb9\xc1\x75\xa3\x46\x14\x29\x5a\xf2\xdb\xd7\x0d\xed\x0f\xcd\x44\xc6\x92\x45\x77\xb2\xe3\x74\x13\x32\x13\x77\x56\xed\x5b\x83\x3d\x75\x38\x6c\x21\x8a\x32\xb3\xce\x8c\x6f\xaa\xf4\xbd\x52\xc1\x6a\x8e\xce\xda\x73\x81\xe6\x77\x37\xc5\xd2\xd1\x76\x31\x8e\xfe\x95\xc2\xc5\x7e\x3b\x03\x71\x55\x9e\x06\x75\xe2\x6f\x68\x96\x8d\x69\x72\x7b\x23\xde\x8b\xa9\xfa\xc8\xcf\xa4\x14\xb2\xb9\x96\x8c\x1a\xc6\x39\x2b\xf9\xad\xad\x4b\x5d\xa5\x10\x8b\xa9\x91\xb2\x8b\x52\xfb\x4a\xa3\xeb\x3e\xd8\x26\xa4\x7a\x7e\xec\x35\xe2\x7a\x16\xb8\x67\xb5\xda\xeb\x52\x29\x2c\x46\x86\xf3\xab\x10\xd9\x7e\xff\xe6\x8f\xff\x6e\x51\x97\x08\x49\xfe\xfd\x0d\xc6\xc1\xaa\x81\x3d\xc4\x48\x17\x8d\xcc\x90\xd3\x2c\x33\xe4\x35\x44\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x77\x47\xb7\xad\xa5\xea\x9b\x9b\xbf\x22\x4b\x60\x5a\x41\x36\x19\xd8\xac\x81\x4a\xc3\xdd\x47\x19\x61\xdf\x51\x1f\x4c\xdd\x78\x06\xb2\xf0\x5c\x64\x65\x0e\xa7\x30\x67\x7d\x34\x9e\x68\xcc\xe6\xad\x3e\x19\x53\x98\xa0\x31\xce\x44\x72\x4b\x52\x77\x31\x88\x68\x5a\x2e\xb1\xda\x1e\x0a\x6d\x63\xbb\x3a\xc4\x74\x6d\xfc\xfe\x46\x34\x57\x4e\x8b\x82\xf1\xa9\x4d\x4e\x92\xf4\xae\x01\x0c\x3c\x93\x98\x0f\xdc\xb1\xde\x42\x67\x8f\x43\x57\x7f\xc3\xd0\x7d\x91\xa1\x9b\xad\xa7\x68\x1d\xcd\xd4\xdd\x5d\x51\xaf\xbe\xbd\x8d\xba\x81\x10\xf5\x84\xfe\x34\x14\xf8\x6f\x1b\xa9\xbf\x22\x2e\x57\xe2\x63\x85\x18\x56\x00\x30\xe8\x83\x24\xb9\xbd\xed\xbd\x07\x43\x77\xb7\x50\xb6\x06\x5c\x78\xe5\x60\xc8\xa9\x76\x02\xa1\xd7\x20\x28\x29\x40\x2a\xa6\x0c\x5f\xfe\x01\x0f\xd4\x49\x46\x59\x1e\x58\x83\x9f\x06\x08\xf6\x70\x63\x65\xcc\xee\x94\xf2\x52\xa4\x6e\x42\x24\x85\xb6\x2a\xe8\x1a\xb1\xb6\x29\xd5\xf6\xc8\x50\x9f\x9a\x54\xfe\x50\x43\xb3\x49\x29\xcd\x2f\x15\xa9\xb4\x77\xbd\x26\x02\x89\xdf\xf7\x52\xe9\x63\xb5\xf8\x9e\xc8\x00\x12\x46\xb7\xb9\x4d\x4a\xd8\x50\x1e\xed\x41\x09\x44\x7a\xa7\x07\x8e\x88\x8d\xae\x30\x67\xc2\x3d\x4a\xf6\xdf\xed\x3f\x29\x91\xb4\x20\x92\xa2\xa0\xd3\x4e\x3d\x0e\x96\x20\xb5\x3c\x6d\x98\x08\x6e\xd4\x20\xbc\x5e\x95\x25\xc2\xbb\x20\xad\x0b\x55\x60\x19\x12\xeb\x28\xf7\x00\x76\x0a\x02\xf6\xa0\x21\x77\x74\x41\xa8\x14\x25\x4f\x9d\xa9\xb1\xb2\xf5\x7e\x58\x7a\xf1\x85\xe0\xe0\x7d\x28\xcb\x79\xe4\xe8\xdc\x61\x9c\xbc\x1d\xbd\x7d\xf3\x5a\x38\x15\x7e\xe1\x12\xa7\xba\xa8\x38\x95\xa5\x4f\x4f\xfa\xad\xbe\x1a\x72\x4f\xdf\xfb\xc1\x99\x58\xea\x62\xc7\xcc\x17\x73\xc5\x9f\xee\x24\xd3\x10\x74\x2e\x3a\x40\xc5\xc5\xe8\x87\x41\xd6\xf4\x61\x8f\x35\xbe\xfb\x49\x53\x57\xe5\xf8\x13\xd2\x2d\x47\xa0\xf0\xb8\xad\xb3\x70\xa9\x07\x48\x58\x08\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x49\xa2\x87\x4f\x8a\x5a\x0e\x68\x67\xf7\x45\x87\x1a\x74\x0d\xc0\x9d\xdd\x17\x14\x6d\x70\x45\x8f\x10\xfc\x2f\x98\xd1\x39\x60\x72\x2c\xcb\xa8\xcc\xd0\xfd\x7c\x6d\xd7\x4e\xc6\xa5\x26\xc0\xe7\x4c\x0a\x8e\xb1\x5e\x73\x2a\x19\x56\xad\x90\x30\x01\x09\xdc\xe8\xa2\x5f\x1e\xfc\x70\x7c\x85\xb1\x2d\x87\xb6\x96\xbd\x5f\x65\xa9\x7c\x79\x89\x70\x25\xc1\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9e\xbc\xd4\xa5\x2d\x98\x7f\x9f\x64\xa5\x62\xf3\xa7\xa2\x24\x2e\x6b\xf9\x94\xb5\xda\xe7\xa5\x0c\xea\x1a\x50\x2b\xc9\xd0\xb5\x0d\xfe\x91\x0a\xad\xfb\xaa\xaa\x69\x15\x86\x43\x38\xd3\x13\xc9\xd9\x74\xa6\x5d\x58\xa6\x2f\x69\xb6\x22\x42\x60\x5d\x87\xa7\x35\x42\x19\xb6\x7b\x9c\x31\xaa\x76\x15\xb9\x56\x32\x0e\xdd\x2c\x18\x44\xc1\x5d\x21\x2a\x9a\x55\xb6\x15\xf3\x22\x6b\x70\x3c\xbf\x74\xde\x29\x0f\x37\xc6\xff\xc7\x06\xad\x54\xda\x85\x0d\x42\xb1\x8f\x58\xab\xe1\x24\xac\x19\xe0\x83\x35\x90\xf8\x63\x95\x15\xb4\x6a\x71\xc1\x87\xb3\xa0\x20\x49\x21\xd2\x1d\xb3\xf1\xda\x2a\x1e\xad\x54\x8e\xf5\x10\x24\x33\x91\xa5\xbe\x2f\xa7\x35\xc9\x8c\x41\xdf\x01\x70\x72\x7e\x89\xf0\x33\x9f\x88\xde\x9e\x0d\x50\xb4\xde\x01\x2c\x3d\x12\x68\xa4\x0d\x78\xee\x8a\x60\x1d\xb4\x92\x2e\x22\x7d\xf5\xa5\x9d\xcf\xfc\x5f\x2a\x98\x79\x8f\x18\x1d\x8b\x39\x20\x48\xd3\x54\x82\xea\x50\xba\xe3\x09\xf4\xd4\x4e\xa4\x94\xb5\xea\xbb\xd0\xf4\x6f\x54\x60\xf3\x16\x22\x14\xdf\xf1\xa8\x22\xe2\x7d\x66\x0a\x76\x7e\x79\xd2\x81\x7a\xed\x7f\xef\xdc\x1b\x66\xaa\xfd\x7d\x45\x58\x91\xd4\xfe\xd4\x11\xa9\xbd\x86\x41\x46\x83\x95\x18\x77\x73\x59\xb5\x15\x13\x03\xa2\xd6\x91\x48\x13\x6e\xa7\x31\x64\xc5\x65\x33\x57\x5e\x62\xa6\xac\x9b\xb8\x01\x0d\xe5\x9f\x08\x01\xe2\x03\x11\x2c\x91\x77\x61\x19\x83\x2a\xc0\x77\x89\x30\xa1\x05\xdd\x87\xf6\x05\x54\x7c\x05\x98\x9f\x0d\x96\x97\xe7\xa7\x7d\xa2\x4b\xc1\xd2\x67\x87\x2e\xbb\xeb\x97\xcd\xdc\xb5\x66\xc9\x07\x37\xa1\x3f\xec\x97\x22\xdd\x20\x26\xd5\x8c\x06\xef\x0f\xbb\x0b\x6a\x41\x28\xb1\x66\xc2\xa5\xbe\xb1\x2d\x80\xb2\x33\x95\x40\x51\xeb\xb2\xcc\xb2\x6b\x48\x24\xec\x6a\x1e\x6d\xee\xff\xf9\xd2\x5c\x9b\x44\x9e\x40\x7e\xc7\x3a\x02\xee\x66\x5e\x17\x78\xab\xb0\x26\xcc\x12\x2c\xca\x0c\xe3\x4c\x29\x5f\x78\x80\xe3\xea\x55\xe0\x8b\x62\xca\xc7\xac\xd8\x10\xa9\xc6\x2e\x28\xa8\x5e\x56\x75\x0b\xa1\x4a\x59\x8f\x29\xe3\x29\x9b\xb3\xb4\xa4\x19\xbe\x08\xa5\xd0\xb0\xa7\x6f\xc5\x21\x73\x5f\xb0\x90\x7c\x23\x24\x81\x7b\x6a\x6e\x1b\x54\x42\x2c\x55\x88\x0e\xa9\x48\x6e\x41\x0e\xac\x28\x76\x8a\x7f\x9c\xa0\xc4\x6b\x4b\xf2\xfa\x75\x18\x5d\xc2\x95\xe9\x6b\xd3\x26\xd8\xf7\x01\xb6\x70\xf8\xc2\x7e\xee\x82\xf1\xe9\x10\x7f\x31\x1f\xe2\xde\x34\x14\x7c\x48\x87\x06\x0d\x5f\x88\xe0\x87\x35\x78\x3f\xa2\x64\x75\xe5\xf1\xc5\xab\x08\x46\x91\x13\xe5\x74\x86\xc0\x92\x39\xf5\x65\xb1\x32\xd0\x58\xf1\xc8\xf9\x75\x6d\x69\x0a\xf7\x6c\xea\xc4\xb4\xb0\x02\x54\x13\xd7\x5e\x88\xf0\xd7\xd6\x42\xb6\x14\x29\x1c\x90\x2d\x07\x23\xbd\x33\x06\x8a\x39\xc8\x39\x83\xbb\x23\xc7\x3a\x87\x77\x4c\xcf\x86\x16\x22\xea\x08\x01\x7b\xf4\x85\x15\x2f\x6d\xe2\xd6\x71\x9a\x3a\xb3\x65\xa9\x60\x52\x66\xae\x5f\xee\x88\xd0\x82\xfd\x00\x52\x61\x5d\xc5\x5b\xc6\xd3\x01\x29\x59\xfa\xf5\x67\x0c\x7c\x61\x9c\xd5\x21\x76\x9d\xa8\xe0\x7b\x47\xe5\x5c\xbe\x30\xfb\x67\xdd\xd2\xd6\x05\x07\x8d\x21\x13\x7c\x1a\x64\x3b\xa3\x78\x71\xce\x99\x5e\x69\xcd\x67\xab\x96\xa1\x8a\x2c\x64\x8a\x81\x8c\x4c\xc8\x86\x3d\xd8\xcc\x87\xb5\x9c\x82\x70\x48\x43\x22\x59\x63\x3e\x0c\x67\x51\x15\x33\x22\x36\x20\xc2\x27\x46\xfa\x0a\x99\xbe\x46\x94\x2d\x59\x36\xa3\x3c\xc5\x3f\x93\x44\xc8\xd4\xad\x97\xe9\x2a\xf6\xd2\x06\x05\xd9\x48\x14\x64\x6b\xd8\x5d\x9d\x2f\xbf\x19\x35\x50\x99\x37\x02\xf5\xbc\xd8\x53\x72\xf6\x8f\x12\x08\xcd\x85\x21\xec\xcb\x85\x9c\x97\x20\x92\xd3\x05\xf2\x56\x5c\xea\xfb\x2a\xd3\xcf\x26\x13\xaa\x01\xb9\x02\x9a\xb2\x20\x21\x7a\x40\xde\x37\x33\xa4\x07\x66\x2d\xd7\x36\x75\xd3\xfd\x64\x57\xef\x9b\xab\x5f\x59\x27\x51\xee\xe3\x8a\x56\x3f\xc6\xec\x8a\xa6\xb7\xc0\xad\x52\x6e\x40\x83\x7e\xb0\x52\xe2\x1e\x24\x33\x48\x4b\xe4\x52\xe3\x05\x99\x30\x5b\xdd\x1d\x45\x05\x36\x9d\x81\xd2\x5e\xb8\x3c\xc2\x58\x9d\xba\x4d\x8d\x5f\x00\xa2\x6f\x10\x69\x5b\x9b\xb1\x72\x8a\xa5\x4b\x85\xeb\x4c\xef\x92\x49\xac\xce\xa6\xca\xdc\x9f\xe5\x65\x48\xab\x91\xef\x69\x6f\x56\x1e\x54\xcd\x66\x4b\xc0\x45\x27\x9d\xb3\xc3\x91\x09\x55\x33\xac\x29\xbf\xbc\x05\x89\x35\xc9\x24\xa5\x34\x04\xc3\x96\x99\xa5\xd8\x44\x16\x3b\x16\x62\xbf\xd1\x75\x86\x9b\x8e\xc9\x03\x66\xb1\xed\xfb\xde\x3f\x1d\x13\x3b\xae\x82\xc1\x0d\xe0\x93\x25\x4a\x60\x77\xd2\x30\x2c\x5f\x5b\xca\xb7\x21\xc7\xcd\x30\x54\xe1\xf3\xb1\xa4\xf6\xfe\xd1\x56\x7e\xcd\x2e\x1c\x90\xca\x69\x77\xcb\xc7\xfe\xb1\x9c\x96\xf6\xa0\x3b\x2a\x5c\x17\xa5\x75\xad\x3c\x51\x6a\xb3\x32\xa6\x51\x67\x4e\x3e\x9c\x86\x29\x48\x61\x6e\x85\x4f\xe0\x1a\x91\x1f\xba\x1a\xa9\x97\xad\xd4\x86\x9a\xd7\xa6\xef\xa4\x3a\x59\x86\x62\x64\x73\xaf\x5f\x54\x6f\xf3\x72\x28\xe3\x45\xa9\x1d\x1b\xac\x35\x4e\x9e\xcc\x28\x9f\xa2\x92\x29\x4a\x33\xdf\x97\x5f\xe2\x8a\x24\xa4\x65\xe2\xaa\xe9\x7b\x94\xfd\xd2\x9b\x6c\x5d\x3d\x2f\xa4\x55\x2a\xa1\x85\x5f\x73\xf8\x59\x6a\xc1\x35\xbd\x7f\x47\xd8\x08\x46\x64\xef\xcb\xe0\xd2\x9e\x7d\x7b\x21\x85\x79\x85\x4b\x7d\xc0\x55\x65\x4c\x63\xf8\xf6\x5e\x78\xf7\x88\x9c\x99\x77\xa0\x1b\xab\x02\x60\x10\x9d\x3f\xae\xc1\x37\x20\x12\xa6\x54\xa6\x99\x33\xb7\xdc\x05\x29\x1d\x15\xc0\xe0\x9e\x29\xad\x2c\x0f\xd2\x1d\x28\x93\xa6\xea\xd6\xd0\x21\x73\xb2\x86\x29\xd5\x74\x18\x1c\xe9\x23\xab\xb7\x0d\x5d\xb9\xcf\x21\x75\xa8\x55\x93\xac\xa3\x2f\x5c\x66\xe4\x90\x56\x77\x31\x23\x91\x63\xe1\xcd\xf6\x72\xce\x4b\xb3\xb1\x75\xa8\xfa\xda\x3c\xbd\x67\x75\x05\x69\x84\x01\x46\xf1\xd7\xf2\x52\x45\x44\x5d\x61\xd3\x75\xe7\xf9\xec\xe2\xe6\xea\xaf\x97\x1f\xcf\x2f\x6e\xe2\xb1\x8e\xc7\x3a\x1e\xeb\x0e\xc7\x1a\xf8\xbc\xf3\x91\xf6\x7a\xd3\x3a\x97\xef\x72\xc1\xc9\x20\x35\xe8\x15\x05\xd6\x9d\xf1\xf9\x0f\x54\xd6\x6d\xec\x9d\xbf\x6a\x8d\x07\xdc\xf7\xb9\x47\x12\x77\xf2\xe2\x23\xeb\x9e\x30\x2e\xae\xc7\x78\xa3\xd0\xa4\xb2\x6e\xd7\xc2\xde\x5f\x27\xbf\x9c\x9f\x9e\x5d\xdc\x9c\x7f\x73\x7e\x76\xf5\xa4\x81\x22\x1d\x0b\x3e\x36\x99\x72\x4b\x2e\x59\x48\x98\x33\x51\xaa\x6c\x51\xf5\xd8\x5a\x4f\x04\x56\x63\x0d\x79\x8a\xb6\x0e\x05\x12\xa3\xae\xd7\x3e\x16\x99\x6d\xbf\xcc\xb6\x19\x37\xd3\xa1\x3c\x4f\x5f\xe8\xfb\x8d\x14\x79\x4f\x28\x7c\x6d\xad\x30\xde\x19\xbe\x0e\x9f\xf6\x5d\x25\x8f\x06\xeb\x71\xc2\x63\x5d\x36\xc4\x08\xa3\x79\xa1\x3b\x14\xc3\xef\xa5\xc4\x6f\x3f\xd5\x70\x6d\xac\xce\x07\x5a\x7c\x07\x8b\x2b\xe8\x58\x05\xa8\x09\x6f\xc8\x20\x31\x8c\x8e\xdc\xc2\xc2\x06\x66\x9e\xf8\x97\x75\xa9\x56\xf4\xff\xb1\xf7\x3f\xdc\x8d\xdb\x48\xde\x28\xfc\x55\x70\x3c\x7b\x5e\xdb\x89\x24\x77\x27\x99\x99\x6c\x3f\x79\x93\xe3\xd8\xee\x8c\x9f\x74\xbb\xbd\xb6\x3b\xb9\x73\xd3\xd9\x19\x88\x84\x24\x8c\x49\x80\x01\x40\xb9\x35\x9b\xfd\xee\xf7\xa0\x0a\x00\x41\x49\xb6\x65\x92\x6e\xc9\x8e\x38\xe7\x4c\xc7\x12\x05\x82\x85\x42\xa1\xfe\xfe\x6a\x23\x11\x92\xaf\x59\x1b\xf4\xea\x2e\xa1\x8d\xaf\x59\x8b\xa4\x53\x7f\x2d\x80\xfc\xda\x25\x04\x3d\xcd\xae\x69\xbb\xd5\x23\xdd\xc2\x1a\x3f\x02\x94\xf3\xf3\x8d\xa0\xd4\xaf\x0e\x57\xc1\x07\x82\x3b\x5e\x09\x8c\xc9\xcf\x6a\x67\x57\x10\x22\x04\xab\x3a\x81\x37\x7d\xd0\xc1\x29\x19\x1d\x91\xa6\x6d\x13\x2e\x82\x4b\xd8\xad\x5c\xdd\xad\x04\x2b\xe6\xf8\x07\x9c\xb9\xf4\x95\x87\x32\xd0\xa1\x73\xd6\xc0\x72\x58\xaf\xfe\x27\x84\x44\x7b\xe4\x9f\xe1\x43\xe8\x35\xad\x7f\xd9\xdd\xfd\xe6\xc7\x93\xbf\x7f\xbb\xbb\xfb\xeb\x3f\xe3\x6f\xe1\x28\xc4\x40\x79\xfd\x16\xc0\x75\x12\x32\x65\x67\xf0\x0c\xf8\xd3\xa9\x6b\x87\x18\x3c\x71\x5f\x40\x45\xf6\x00\xb3\x96\xc2\x9f\x85\x4c\xe7\xff\xd2\xad\x00\x01\x37\xf2\x60\x80\x25\x6a\x51\x59\x84\x57\x77\xc7\x43\x25\x4b\x3a\xde\xaa\x6e\x54\xcf\x8d\x00\x2c\x8d\x90\x64\xaf\x3d\x09\xa0\xbb\xa7\x87\x7e\x10\x50\x2f\x6f\x35\xd3\x3a\x3a\xe4\xce\xf4\x65\xab\x3e\xc6\x78\x75\x28\xda\xc2\x0a\x76\x4c\x30\xa0\x88\x6f\x18\x06\x1b\x39\x1c\xb0\x21\x61\x26\x74\x9f\x3b\x3c\x3f\x25\x53\xa4\xf0\xc6\x10\xc7\x07\x36\x5f\x3f\xaa\x8c\x0b\xe1\xd3\xf9\xba\xdc\x57\x98\x80\xe3\xbf\x77\x18\x09\x3a\x20\xd8\x31\x6b\xd8\xec\xe1\x87\x83\xa4\x28\x7b\xee\x86\x41\xce\x72\xa9\x66\xe1\xcf\x00\x36\xd3\xd7\x46\x2a\x3a\x86\x9a\x1a\xfc\x39\xfe\x2c\xfc\x85\x3f\xac\x3d\x60\xf1\xd7\x68\x0a\x57\x51\xd4\x00\x70\xfb\xfc\x64\x9b\x27\xfd\x86\x88\xb6\xa4\x2d\x8c\x52\xfd\xaa\x33\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\xa4\xab\x19\xee\x55\xf9\x70\xe0\x0d\x10\x53\x6b\x59\x36\x06\xc0\xab\xae\x0e\xa5\x59\xca\xa7\x5c\xcb\x16\x95\x43\x61\xa0\xdb\x73\x27\x1d\x6c\x09\xe6\x6f\x05\xb7\xd9\xc7\x02\x30\xbf\xc2\x7e\x9d\x13\xfb\x2f\xdb\x34\x39\xc7\xab\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\xad\xa7\xde\x01\x04\x2f\x5e\x5d\x02\xf1\xd6\x47\xec\x84\xfd\x1e\xb1\x95\x05\x5e\x9e\xbd\xba\xde\xff\x17\x5e\x6a\x46\xf9\x3c\xfe\xb8\xde\x98\x0d\x8e\x09\xa1\x9f\xc2\x93\x83\x4f\xaa\xd7\xda\x04\xd3\xe2\xb9\x9d\x73\x7f\x04\xe7\x8e\x57\xdb\x71\x5d\x2b\x4d\x74\xa4\x64\xee\x2b\xfa\x21\xbc\x81\xb5\x67\xee\xbe\x6b\xd6\xaa\x25\x28\x5e\x5b\x67\xd0\xd6\x19\x74\xcb\x75\xaf\x33\x08\xcb\x11\x36\xd7\x13\xc4\xc4\xb4\x69\x08\x63\x69\x04\xdd\xdb\x3a\x31\xfc\xdd\x6a\x01\xb5\x81\xdf\xea\x3a\x44\xe2\xaa\x4c\x1a\x3c\xd0\xf2\xe5\x31\x4c\x68\xe0\xcf\x05\x6e\x7c\x18\x20\x80\x7e\x32\xd7\xbb\xc3\xd5\x5f\x4e\xed\x14\x02\xd2\x7b\x0d\xbb\x13\xb2\x8a\xb9\x18\x3b\x24\x0b\x3c\x4a\x5c\xf4\x89\x8b\x0a\x0d\x37\x28\x87\x15\x84\x3a\xd5\x5a\x26\xd0\xf8\x08\x71\xf2\x02\x2a\x9f\x9b\x36\xcc\xc6\xd0\x6b\x16\xb7\x62\x47\x78\xf5\xea\x5d\x87\x33\x40\x7d\x15\x53\x0f\x31\x9f\x96\x98\x0c\x82\xe2\x6f\xf9\x18\xcf\x2b\x01\xc1\x32\xa2\x0b\x82\x45\x79\x08\x20\xf5\x83\x85\x4d\x21\x15\x43\x8e\x2a\x2f\x6b\xb3\x66\x96\xad\x4f\xf1\xf6\x67\x66\x88\x6c\xb5\x52\x86\x16\x0e\xcb\xca\xfd\x5c\x3f\x24\x9f\x43\x30\xb0\xfd\xf1\xf9\x87\x3b\x3a\x3b\x3a\x36\xbb\x39\x32\x1f\x10\x3b\xe9\xf2\x98\xec\x22\x58\x52\x28\x36\xe2\x1f\x3b\xda\xa7\x87\x51\x65\x22\x4f\x99\x30\x7c\xc4\xb1\x5f\x6f\xa1\x58\xc1\x04\xf6\xcc\xa7\xc9\x04\x64\xbf\x3b\x29\xab\xe0\xf4\x26\x26\xf3\xa0\xc2\xdd\xad\x28\xbb\x5c\xa6\xec\x6f\xe5\x18\xd9\xca\xb1\xc6\xd7\x27\x92\x63\x8e\x73\x37\x47\x88\x41\xe6\x79\xfb\xd4\xf7\xe3\x28\x8f\x1d\xb8\xb8\x7d\xe5\xf0\x1c\x1a\x5c\x90\x8b\x46\x62\xe6\x1a\x96\xaf\x29\x92\xb1\x29\xcb\x9c\xd2\x44\x72\x2a\xe8\x18\xdb\xf0\x19\x19\x40\x7f\xa4\x0a\x2d\x8e\xe6\x11\x7d\x40\x89\xf7\x95\x5d\xf0\xa5\x92\x59\xc6\x94\x26\x19\xbf\x66\xe4\x98\x15\x99\x9c\xe5\x2e\xf1\x35\x25\x97\x86\x1a\xcb\xd2\x97\xcc\x34\x8b\xf9\xb6\x43\x03\xf1\xc5\xec\x1d\x41\x9f\x63\x75\x3c\xd4\x96\x93\xc2\x15\x4e\xbe\x13\x20\x31\x0e\xa1\xdb\x4a\x8f\x9c\xb1\x29\x53\x3d\x72\x3a\x3a\x93\xe6\x1c\x55\xef\x7a\xb6\x1d\xde\x48\xf8\x88\xbc\xb2\x46\x9d\x36\xc4\x60\xc7\x8b\xa8\xce\x5d\xaa\xda\x00\x15\xde\x5b\x17\x65\x79\x8b\x25\xe7\x30\x52\x28\x38\x6f\x14\xc6\x68\xb5\x4c\xa1\xa5\x50\xeb\x05\x3a\xc4\x32\xd2\x0a\xc9\x37\xe2\x6f\x84\x67\xf0\x08\x66\x60\x02\x72\x41\x14\xd3\x85\x14\x9a\xd5\xe1\x19\xab\x16\x94\x60\xea\xea\x4e\x2d\xc4\xc6\x27\x67\xdb\x33\xb3\x90\xda\x40\xe5\x6c\x37\x8d\xaa\xce\xfd\x70\x50\x88\x4c\xb3\x8c\xa5\xb5\x4e\x65\xd8\x61\x87\xd6\xdd\x03\x09\x34\x67\xf0\x0d\x5f\x98\xab\x4f\xae\x95\x36\xd7\xee\x0f\x5d\xef\x7c\x5f\x19\xdf\x3f\xf9\xb6\x82\xe6\x6a\x63\xc2\x21\x12\x31\xc0\x02\xde\x33\xa0\x80\xeb\xa8\x39\xcd\x44\xca\x6b\x92\xc8\xbc\xc8\x60\xeb\xb4\xd8\x59\x55\x6f\xac\xc0\x4a\x7d\xe8\x87\x7a\x10\xb5\xcd\x82\x0f\xd6\xd8\xdf\xb4\x0b\x1d\x8c\x7d\x64\x49\x67\x7d\x35\xad\x2c\xb5\xab\x0c\xf1\x7e\x29\x82\x2a\x36\x92\xf6\x00\x83\xe2\xec\x80\x3f\x18\x81\xed\x9c\x7c\x64\x49\xd4\x9b\x16\x10\xb0\x12\x8f\x27\x61\x37\x7a\xfb\x9e\xe3\xad\xc3\x14\x5d\x85\x06\x5a\x14\xdf\xc5\xd7\x1c\x68\x20\x8c\xe9\x31\xd2\xdd\x23\xa0\xdd\x04\xd8\x4f\x58\x90\x17\x83\x6e\x04\x1e\xc6\x1d\xbb\x80\x34\x18\x92\xaf\xfd\x58\xd0\xd5\x47\x4a\x43\xf6\x76\x0f\x76\xf7\x17\x7c\x96\x73\x40\xdb\x57\xd1\x2f\x39\x20\x4b\x16\x00\xd3\xc8\x92\xdd\xb4\x47\xb8\xf1\xd9\xd9\xd8\x27\x08\x66\xe5\xaa\x04\x7b\x44\x4b\x62\x14\x4d\xb9\xd3\x7e\xe0\x53\x7b\x93\x51\xa5\x3b\x1c\xf6\x76\x7f\xdf\x75\x6d\x8a\x6e\xa4\xd8\x35\x30\xfd\x01\xb9\x42\x94\x9a\x30\xd0\x4c\x96\xd0\x7c\x13\x49\x50\x64\x3c\xe1\x26\x9b\x81\xa0\x23\xb2\xc4\x4e\x5d\xf6\x98\x71\xd5\x89\x27\x1f\xb9\xf1\x2d\x49\xe4\x88\xbc\xc0\x46\x61\x8c\x3a\xaf\x69\xc6\xa7\xec\x60\xc2\x68\x66\x26\x98\x58\x22\xa4\xe8\x63\xaf\x47\x2b\x81\xdc\x37\x6d\x63\x2c\xed\x5c\x90\xf1\xd5\xc2\x1d\xb9\x38\xa1\x96\xd6\x86\x95\xbd\x3f\x34\xef\x66\x4d\x16\xc0\xc2\xae\xae\xce\x7f\xa8\xb5\xb3\x06\xe1\x6f\x4c\xe1\xd3\x7d\xa2\xa6\xef\x1b\x20\x3b\xba\x09\x70\xb6\xea\x45\x4d\x3a\x14\x61\x6d\x7b\x52\x93\xe5\xe0\x6f\xab\x37\xa3\x26\x7f\x97\x25\x40\x87\xd0\x61\x36\x0b\xb8\x0d\x9a\x19\xb2\x63\x87\xda\xb1\xe2\xc9\x72\xc3\xdf\x18\x4d\x11\x56\x43\x1b\x46\x1b\x69\x7c\xf1\xd5\x59\xe0\x2d\x9a\x5b\xb7\xe7\x40\xa9\x8d\xcc\xc9\xc4\xbd\x76\xbd\x5c\xd3\xed\x8c\x01\xec\x1e\x5f\x0b\xa5\x58\x81\x12\xce\xfd\xe6\xd9\xc9\xaf\x05\xb9\x81\x74\xaf\xf5\x4c\x48\x62\xb2\xc5\x9d\x75\xb8\x40\x62\x21\x4a\x4d\x47\xb2\xb4\x83\x84\x09\xd2\x61\xd2\x04\x69\x57\xfc\x39\x3f\x10\x04\x02\xdb\xe7\x87\x75\x96\x87\x41\x3a\xcb\x35\x20\xcb\x1c\xb3\x8e\x67\xd0\x69\xd3\x11\x11\x3b\x8d\xf0\x93\xf6\xe5\xa5\xf1\x75\x37\x01\xba\x59\x7c\xd2\x25\x05\x8a\x0e\xd2\xc1\x17\x93\xc1\x11\x74\x0a\xca\x35\x51\xb8\x82\x98\xd0\x4c\x4d\x9b\x16\x80\x57\x57\x77\xaf\x2e\x9b\x3b\x0a\xfc\xb5\xa4\xb6\x5a\x11\x11\x1a\x5c\x7b\x50\xd5\x45\x82\x44\xd9\x0c\xae\x1f\xb6\x77\x01\xfb\xe3\x88\x8a\x31\x23\x2f\xed\x2f\xff\xf2\xe7\x3f\x7f\xf9\xe7\x01\x0e\x1f\x32\x1b\x04\x39\x3d\x3c\x3b\xfc\xc7\xe5\x4f\x47\x50\x50\xdb\x96\xaa\x1d\xa5\x6d\x76\x9d\xb4\xd9\x69\xca\xe6\xa3\x26\x6c\x42\x99\x48\x6b\x29\x52\x8f\x17\xc0\x90\x31\xba\xa8\xd3\xfd\x22\x54\x3e\xab\x6b\xd6\xfd\xaf\x76\xab\x6d\xc4\x1e\x33\x49\x71\x29\x93\xeb\x0e\xed\x9a\xdd\xab\xa3\x73\x1c\x32\x32\x6d\xa8\xf0\xce\x10\x2e\xa6\x32\x9b\x02\xfa\x2a\xb9\x3a\x3a\x87\x9d\x37\x80\xff\x02\x47\x14\x58\xd4\x33\x66\xaa\x42\x06\x17\x9e\x0a\x18\xaa\x50\xa4\x41\x33\xae\x0d\x4f\xe0\x77\x95\x9b\xd4\x8e\xd0\x26\x2e\xb5\xb5\x94\x96\x5d\x9d\x5b\x4a\x51\x93\xe0\x87\x1a\x4d\x6d\x13\x0f\x37\xf8\x5c\x72\xe7\x91\xaa\x75\xd1\xde\x9e\x4b\x1d\x8c\xb7\xb9\xe7\x52\xa1\xd8\xa5\x91\x8d\xba\x05\x90\xc5\x48\x08\x0e\x76\x4b\x1c\x64\xc8\x46\x52\xb1\xf9\x40\x48\x14\xd8\x48\x4b\xd8\x84\x54\x40\xf5\x9f\x77\x41\xc9\x5a\xf0\x02\x53\x2e\x7d\x87\xec\xcc\x61\xa2\x1e\xe8\x18\x08\xd5\xb7\x3b\xee\xd9\xb7\x63\x39\xcc\xae\x57\x95\x31\xb8\x66\xcb\xf0\x21\x33\x09\xba\x59\x7d\xfc\xc5\x79\x54\xfd\xf4\xe7\x43\x25\x89\xa2\x7a\x82\x8d\x88\xd9\x47\x6e\x02\xe4\x2a\xd5\x52\xa0\xb3\x37\xea\x89\xcc\x75\x84\xc9\x1d\x05\x79\xf0\x47\xe7\x32\x9d\xef\x39\x3e\x56\x34\x61\xa4\x60\x8a\xcb\x94\x40\x3d\x71\x2a\x6f\x04\x19\xb2\x31\x17\xda\xd3\x0f\xc0\xd9\x1d\xa1\xed\x71\xc3\xc0\x37\xec\xd1\xe2\x06\xe4\xa2\x06\x82\xe2\xca\x93\x12\x59\xed\x68\x37\x8b\xf9\x20\x13\x64\x84\x02\x79\xb1\x1b\x50\x58\x98\xb8\x41\xd2\x3d\x93\xee\x20\xda\x84\x3d\xbc\xfc\x77\xb7\x52\x87\x6b\x4b\xf5\x64\xd2\x2e\xf0\xbb\x0d\x4f\xad\x78\x6d\xc3\x53\x0f\xbb\xb6\xe1\xa9\x6d\x78\xea\xf6\x6b\xe3\xdc\xbb\xdb\xf0\xd4\xd6\xe8\x9a\xbf\xb6\xe1\xa9\x6d\x78\xea\x96\x6b\xe3\xe4\xd7\x36\x3c\xb5\xc2\xb5\x0d\x4f\xad\x78\x6d\xc3\x53\xdb\xf0\xd4\x36\x3c\xb5\x0d\x4f\xfd\x81\xdc\x80\xfe\xda\x86\xa7\x16\x06\xd9\x86\xa7\x22\x62\x6c\x2d\xa5\x25\xd7\x36\x3c\xb5\xe4\xda\x86\xa7\xa2\x6b\x7b\x2e\x35\x38\x97\x7c\x70\xe7\xdc\xda\x65\xed\x6b\xd6\xce\x21\x70\xc0\x13\x17\x23\x92\xa3\x5a\x9d\x13\x3e\x6a\x50\x35\xa0\x88\x30\x3f\x7c\xa9\x8d\x8b\x06\x55\x31\xa6\xa5\xf5\x50\x2d\xdb\xc3\x15\x32\xad\x82\x11\x51\x14\x02\xad\xd3\xe6\x35\x69\x6b\xab\xb6\x6a\x13\x7a\xd8\xe8\xb0\xc3\x86\x84\x76\x3a\x08\x35\x6c\xc3\x0c\xcf\x2e\xcc\xd0\x8d\x8b\xae\x03\xf7\x5c\xeb\x13\xc6\x05\xf3\xaf\x26\x8a\xe9\x89\xcc\x1a\x33\x7a\x8d\xc9\xdf\x72\xc1\xf3\x32\x87\xbe\xb1\x96\x9f\xf9\x34\x64\x0d\x84\xe6\xd8\x4e\xd0\xa3\xa7\x30\x6a\x30\xeb\x1b\xcb\x42\x59\xe7\x84\x82\xaa\xae\xcb\x24\x61\x2c\x8d\x5a\xde\x83\x62\xf6\xe5\x20\x3c\x29\xb4\xd3\x78\xd9\x4e\xde\xb4\x3b\xfb\x11\xa2\x14\x46\xf9\xf2\x8b\x46\x63\xb4\x8c\xf2\x7c\xfa\x08\x4f\x07\x62\xba\xbd\xbd\xd2\xca\x56\xe9\xe2\x94\x68\x6b\xa3\x3c\xb5\x48\x4e\x67\x11\xcd\x0e\x22\x38\x1b\x14\xbd\xd9\x98\x63\x61\x53\x22\x36\x1b\x88\xbe\xda\x41\x80\xa1\x8b\x08\x4d\x77\xd1\x99\x47\x00\x29\x7d\x9c\xa8\x4c\x87\xd6\x70\x47\xd1\x98\x4f\x11\x89\xe9\xe4\xad\xdb\x46\x60\x3e\x5d\xf4\xa5\x9b\xd7\x6d\xe9\xdd\x7a\x16\x11\x97\x0e\xbc\x5a\x5d\x7a\xb4\x3a\xf3\x66\x3d\x5a\x84\xa5\x7d\x74\x65\x03\x22\x2b\xad\x89\xcc\x05\x37\x9c\x66\xc7\x2c\xa3\xb3\x4b\x96\x48\x91\x36\x3e\x61\xe6\x50\xeb\xc2\xfe\xd1\x38\xac\xb3\xd1\xea\xf9\xc7\x13\xea\xc0\x79\x59\xea\x53\xaa\xbd\xfb\xcf\x29\x14\xd0\xd0\x04\x67\xb9\x91\x0e\x3d\xb2\x31\xc6\x20\x26\x63\x77\xb9\x88\x7f\x93\x37\x44\x8e\x0c\x13\x64\x8f\x0b\xbf\x8e\xfb\x91\x19\x58\x59\xe6\x81\xad\xed\xb7\x2f\x5f\xf8\x9b\x9f\x9f\xc9\x0d\xce\x05\xad\x1f\xdf\x03\xe2\x1e\x74\xbf\x0b\xc4\xdd\x38\x2a\xb3\xba\x1b\x04\x5d\x23\x75\x79\xf3\xb2\x82\x17\x7d\x09\xe3\x86\xdd\x46\x45\x4a\x5c\xe1\xc6\xf3\x5b\xb4\xd6\x71\xe3\xe7\x10\x33\xde\xfa\x5e\x48\xd7\xbe\x97\x35\xc5\x86\x37\x50\x6b\x7e\xa2\xf1\xe0\xad\xd6\xfc\x80\x2b\xaa\xff\xfa\x41\xd1\x84\x9d\x77\xae\x70\xf8\xed\x44\xd2\x52\xb9\xb2\xbd\xa0\x77\x84\xcd\x23\x18\x4b\x71\x37\x85\xa2\x38\xa8\x46\x1b\x95\x59\x36\x23\x65\x21\x45\xbd\xf2\x10\x83\x56\xf3\x05\x6b\x76\xb4\x65\x4f\xa9\xb4\xd4\x42\x49\x77\x00\xab\x52\x08\x2b\xcf\xab\x86\x43\xa0\x95\x6a\x94\xd5\x71\x59\x9c\xe6\x63\x3b\x7d\x7b\x98\x42\xc5\x1c\xcf\x59\xd5\x92\xa2\x1a\xd0\xfe\x7a\x24\x55\xc2\x87\xd9\x8c\x4c\x68\x16\xba\x4b\x50\x72\xcd\xb3\xcc\x0d\x33\x20\x97\xcc\x10\x33\xe1\xae\x31\x38\xc9\xa4\x18\xc3\xe4\xa8\xf0\x5d\xcd\x58\x62\x7f\x9b\x64\x8c\x8a\xb2\xc0\xe7\xd9\x63\x7d\x26\x4b\xe5\x9f\xe7\x60\x2d\xc3\x28\x5c\x13\xc1\xb3\x5e\xd4\x3b\xe9\xce\x85\xad\x1a\xd4\x6b\xe6\x6b\x0a\x6f\xb8\x66\xbd\x78\x4c\x8f\xcc\xab\xa3\xce\x19\x85\x92\x53\x9e\x62\xf7\x0b\x4f\x36\xe8\xd2\x8a\xdd\x31\xc2\x7e\x16\x52\xf4\x05\x1b\x53\xd0\x7a\xdc\x2e\xc2\x35\xc3\x71\x30\x14\x27\x52\xe8\x97\x61\xcd\x05\x59\xd4\x4a\x59\xa7\x1c\x3b\x7d\x46\x94\x23\x7b\x42\x12\x09\xc7\x6b\x29\xb8\xc1\xee\xd1\x93\xd2\x90\x54\xde\x88\xfd\x01\xa2\x12\x73\x4d\x28\x19\x32\xe3\x3b\xd9\xfa\xce\x8a\x5c\x31\x4d\x98\xa0\xc3\xcc\xae\x39\x24\x3c\x5c\x2d\x25\x10\x19\x31\x6a\x4a\xc5\xc8\x98\x1a\xb6\x54\x69\xc2\xf7\xbd\x9b\xbc\x5c\x87\x2e\xef\xa5\xd0\xac\x71\x7f\xeb\x8e\x35\xad\xbf\x7c\xd5\x4c\x46\xf0\x9c\xc9\xd2\x7c\x12\x53\xf2\x66\xc2\x93\x49\xac\x19\xf3\x9c\x69\x22\xcb\x39\x1b\xfb\xa5\xfb\xd9\xf2\x15\xda\xda\x93\xcb\xae\xa6\x5e\xe2\x25\xae\xb4\xf9\x92\xe3\xaa\xad\x2c\xb5\x1b\xf0\xf8\xec\xf2\x1f\x6f\x0e\xbf\x3f\x79\x33\x20\x27\x34\x99\xc4\xf5\xe8\x82\x50\x10\x1a\x20\x28\x26\x74\xca\x08\x25\xa5\xe0\xbf\x95\x88\x4e\x4e\xf6\xc2\x6f\xf7\x3b\xc5\x42\x6e\x78\xfa\x42\xeb\xeb\xce\x7a\x2d\x61\x23\x6d\x4c\x70\x90\x9a\x41\x77\x84\x79\xf5\xe9\xc4\x7e\x85\x86\x06\xa8\x5a\x13\x66\x85\x11\x9f\x3a\x31\xec\xc0\xa5\x69\x1a\x52\x2e\x2c\x9f\x5b\xb6\xb0\x47\x15\x1d\x42\xaa\xc4\x84\x11\xc1\x8c\x65\xeb\xe0\xb0\x92\x42\xd7\x80\x01\x4a\xcd\x74\x8f\x0c\x4b\x48\xee\x28\x14\xcf\xa9\xe2\xd9\x2c\x1e\xcc\x9e\x55\x67\xd2\x9b\x43\xb3\xf9\x29\x1d\xbf\x3b\xb9\x24\x67\xef\xae\x48\xa1\x10\x32\x00\xb2\x33\xe0\x7b\x78\xad\x21\xb3\xbf\x70\x3d\x3a\x07\xe4\x50\xcc\xf0\x4b\xdc\xe0\x5c\x13\x6b\x0b\x31\x38\x82\x9d\x0e\xe9\x41\xe1\x77\x5e\x0c\xe0\x7f\x3b\xf6\x2d\x95\x55\x32\x43\xd2\x49\xb2\x90\x3c\x86\x6a\x28\x1f\x66\x11\x35\xdd\xbb\x3f\xab\x6e\x4b\x21\x6d\xee\xdc\x12\x31\xea\xb6\x44\xc3\x52\x03\x79\xb1\xfb\x16\x17\xe3\x2c\xe6\xaa\x66\x62\xbf\xad\x6d\xd9\xd6\xb2\xec\x57\x6f\x70\xde\xd4\xc0\xec\xa4\xeb\x53\x35\x87\x8e\x7a\xa5\x54\xa7\x9f\x37\xa7\x9c\x44\x90\x71\xfb\xcb\xd3\x73\xbf\x03\x9c\x76\x93\xcf\xf5\x4c\x84\x1f\x63\x50\xa3\x47\x5e\x90\x6f\xc8\x47\xf2\x0d\x98\x57\x7f\x69\xdb\x59\xa6\xad\xe1\xd3\xde\xbd\x83\x56\xfd\xe9\x79\x47\x14\xff\xd9\x4a\x27\x3b\xa2\xa5\xaa\x91\x64\xc8\x9d\x3a\xcf\x3e\x1a\xa6\xac\x1c\x75\x2b\xb1\xd6\x9e\x3c\x76\x82\x9f\x90\xcd\x30\x76\x71\x3a\x8a\x5b\x42\x98\x07\x32\x9a\xfd\xf9\xdf\xa4\x36\x67\x4e\x0a\xd5\x1b\x4c\x54\xa3\xe5\xd4\x24\x93\xba\x18\xb3\x8a\x9a\x36\xd5\x06\xd3\x24\x95\xe0\x49\xc3\x3c\xc0\x09\x6f\x91\x89\xb1\x39\x6c\xdc\x2e\x38\x5f\x5b\xcf\xbb\x56\x6a\xce\x81\x02\x96\x8f\x53\xac\x22\x78\x99\x42\xa6\x4e\x27\xb3\xd3\x4a\xa3\x33\xe3\x0e\xa5\xcc\xf9\x6a\x82\xcb\x1a\x78\xc9\xee\xa7\x84\x0a\x4c\xe0\x1e\x31\xa5\x30\x75\x73\x38\x83\x08\x32\x4f\x58\xeb\xc5\x6b\xb5\x93\x0a\x25\x8d\x4c\x64\x8b\xb6\x41\xf5\x80\xb9\x1b\x0e\x88\x80\xce\x5f\xef\x73\x7f\x7f\x7c\xde\x23\x57\x47\xe7\xd0\x4d\xe5\xf2\xe8\xea\xbc\x6e\xa9\xec\x5c\x1d\x9d\xef\xac\x95\x14\xc4\x6b\x56\xaf\xec\x34\x1b\x0c\x52\x73\x3c\x59\xb5\xad\x9f\xd3\xa2\x7f\xcd\x66\x0d\xcf\xd4\x2e\xce\xf5\x7e\x58\xe1\x4e\x5e\x08\xc9\x9c\xd3\xe2\xc1\xa3\x29\x46\x53\xfe\x89\xaa\x28\xdc\xce\xaa\x9e\xb9\xbc\x9c\x22\x97\x53\x96\xa2\x3a\xec\x7f\xc1\x44\x5a\x48\x6e\xf5\xc5\x6d\x8d\xc5\xc3\x7f\xbd\xad\xb1\xb8\xeb\xda\xd6\x58\x6c\x6b\x2c\xb6\x35\x16\x77\x5f\xdb\x1a\x0b\x77\xad\xdf\x0d\x4a\xb6\x35\x16\x0d\xaf\xe7\x15\xe7\xdf\xd6\x58\x3c\xe8\xda\xd6\x58\x2c\x5e\xdb\x1a\x8b\x5b\xae\x6d\x8d\xc5\x2d\xd7\xb6\xc6\x62\x5b\x63\xb1\xad\xb1\xd8\x66\x8b\xdd\x3b\xd6\x66\x66\x8b\x91\x6d\x8d\x85\xbb\xb6\x35\x16\xcf\x22\x27\x86\x6c\x6b\x2c\x56\xba\xb6\x35\x16\xdb\x1a\x8b\x26\xd7\xb6\xc6\x02\xae\xad\xef\x65\x5b\x63\xe1\xaf\x6d\x8d\x05\x5e\x7f\x1c\xad\x79\x5b\x63\xb1\xad\xb1\xd8\xd6\x58\x6c\x6b\x2c\xee\x9c\xc5\xb6\xc6\xe2\x39\xd8\x93\xbe\x07\x5e\xfb\x9a\x81\xdd\x23\x99\x17\xa5\x61\xe4\xc2\x0f\x19\xb4\x48\x14\x0c\x5c\xc7\x1a\x41\xfb\x14\x9e\x44\x8a\x11\x1f\x3b\xc9\x7e\x80\x0d\xe6\xfa\xe1\x7d\xfa\x51\x53\xb7\x27\x98\xbf\x93\xf1\x9c\x37\x2b\xe4\x20\x0b\x0b\xf3\x06\xc6\x8a\x82\x3c\x76\x27\xe5\xf4\x23\x6c\x11\x9a\xcb\x12\x9b\xf2\x25\x6e\xfd\x02\x09\x31\x14\xb6\x71\x2b\x43\xba\x31\x71\xaa\x8a\x94\xf3\x0e\xac\x8d\x82\x1a\xc3\x94\x78\x45\xfe\x7b\xef\xc3\xe7\xbf\xf7\xf7\xbf\xdb\xdb\xfb\xe5\x45\xff\x3f\x7f\xfd\x7c\xef\xc3\x00\xfe\xe3\xb3\xfd\xef\xf6\x7f\xf7\x7f\x7c\xbe\xbf\xbf\xb7\xf7\xcb\x8f\x6f\x7f\xb8\x3a\x3f\xf9\x95\xef\xff\xfe\x8b\x28\xf3\x6b\xfc\xeb\xf7\xbd\x5f\xd8\xc9\xaf\x2b\x0e\xb2\xbf\xff\xdd\x7f\x34\x9e\x72\x6b\x95\xb8\x3b\x85\xb8\x23\x75\xf8\x51\x94\x61\x17\x1d\xee\x68\x2f\x5e\xb8\xd1\xe6\x77\xa3\x3b\xb0\xee\xda\x8d\x5e\x9a\x82\x9a\x17\xc6\xe1\x9a\xc8\x9c\x1b\xab\x1c\x5a\x7d\x90\xc6\x79\x61\xdc\xd4\x8c\x52\x27\x07\x20\xa1\x92\x1a\xec\x11\x1a\x72\xaa\xa2\x3c\x6d\xe9\x35\x3f\xd7\x7b\x35\xf8\x2b\x60\x3f\xf7\x53\x36\xe2\x82\xb9\x38\xd8\x56\x36\xdc\x7f\x6d\x65\xc3\x73\x94\x0d\x9a\x25\xa5\xe2\x66\x76\x24\x85\x61\x1f\x1b\x79\x58\xea\xa2\xe1\xb2\x3e\x20\xc1\x7d\xe6\xaa\x28\xdd\x77\x44\x16\x98\x40\x39\x57\xce\x1a\x52\x70\x55\x29\xc0\xc0\xc4\x2a\x19\x66\xd0\xfa\x03\xbb\x07\x72\x22\xe7\x1f\xe2\xed\x39\x34\x33\x7f\x2b\xf9\x94\x66\xd6\xda\xad\x7e\x71\x0e\x16\x4c\xfc\xa3\x55\xf7\xbc\xa1\xfa\xba\xda\xf0\xac\x6f\x75\xe8\x30\xe7\x03\xff\x4a\xf0\x11\xfb\x68\x9e\xa2\x96\x06\x0a\xd2\xb9\xe2\x53\x9e\xb1\x31\x3b\xd1\x09\xcd\x40\xae\x75\x73\x56\x1c\xde\x32\x3a\x2c\xbc\x92\x99\x26\x37\x13\x06\xdd\x95\xa9\x77\x01\x40\x85\xcb\x98\x72\x41\x72\xbb\x44\x85\xff\xb1\x46\x5f\x82\x15\xff\x05\x55\x76\x81\x83\xcf\x00\x4c\xe4\xa1\x94\x99\x4b\x1d\xce\x66\xd5\xf8\x2e\xf7\x5e\xc8\x7f\x08\x76\xf3\x0f\x3b\x9a\x26\xa3\x8c\x8e\x83\xab\x40\x33\xb3\xe0\xed\xab\x86\xbe\xf5\x05\x20\x2f\xb7\x64\x84\x66\x37\x74\xa6\x2b\xc7\x49\xdc\x07\xfc\x15\x79\xb9\x0f\xec\x4c\x35\x09\x63\xa4\xe4\x8b\x7d\x88\x25\x1e\x1d\x9e\xff\xe3\xf2\xef\x97\xff\x38\x3c\x7e\x7b\x7a\xd6\xee\xa4\xb0\xef\xce\xa8\x68\x34\x46\x42\x0b\x3a\xe4\x19\x6f\x73\x40\x2c\x64\x9b\xc4\x83\xc2\x11\x9c\xa6\x07\xa9\x92\x05\xd2\xc9\xfb\xa8\xaa\x93\xb2\x6e\x05\xc7\x95\xc9\xb0\x3c\xa3\xfa\x80\x63\x45\x85\xa9\x9c\x35\x15\xc9\x55\x29\xac\x61\xfd\xc4\x13\xf3\x69\xda\x5d\x52\xfe\x61\x9a\xb2\xb4\x46\xbd\x67\x97\x04\x78\xe4\x5f\x6e\x56\xd5\x68\x93\xf3\x77\x97\xa7\xff\xcf\x1c\x1b\xce\x8a\x76\x39\x4f\xdd\xd4\x85\x29\x59\x74\xb6\xba\x17\xae\xee\x68\xbb\xbe\x1b\xb1\xbe\xe1\xac\xea\x26\xd2\x7e\x51\x8a\x3a\x8c\x47\x35\x3e\xc9\x65\xca\x06\xe4\x3c\x78\xe9\xeb\xdf\x46\xe5\xbd\x54\x31\x62\x6f\x11\x86\xd3\x2c\x9b\xc5\x0a\x92\x91\x58\x4c\x53\xab\x4c\x8e\xe5\xf0\x88\x66\xba\xa5\x30\x6d\x73\x32\xd9\x43\xf8\xad\x35\x26\x3b\xa1\x66\x18\x8d\xa4\x4c\x48\xe3\xb4\x52\x3b\x4b\x28\xd6\x56\x32\x21\x68\xb9\x46\x69\x51\xb5\xd3\x45\xa3\xa3\xdf\x1f\x4c\x5c\x7b\x5a\x9d\x87\x91\xd1\xcb\x5b\x6a\x36\xaf\xdd\xba\x83\xa9\xb2\x65\xed\xe8\x8a\xd1\x14\x6a\xd2\x0a\x6a\x26\x98\xd5\x90\x53\x7d\xcd\x52\xfc\xc0\xe9\x35\xc1\xcd\x6f\x47\x0c\x8f\xba\xb2\xf3\xf6\x3e\x7d\xd0\x67\x30\xd7\x02\x62\x01\xcd\x40\x37\x48\x17\x5b\xc0\xbe\xd3\x3b\x91\xcd\x2e\xa4\x34\xaf\x43\x2d\x56\x27\x0b\xf8\xb3\xd3\x14\xeb\x6e\x58\x50\xa5\x20\x09\x21\xed\x03\x31\x81\xa5\xe3\x32\xb0\xe3\x6a\xc1\xd6\xcc\xd0\xaa\x14\x87\xfa\x07\x25\xcb\xc6\x27\xc0\x82\xa2\xf5\xc3\xe9\x31\xec\xe3\xd2\x45\xd9\x84\x51\x33\xa8\x3a\x5d\x04\x0c\x0a\x3a\xed\x7b\x17\x27\x8c\x39\xb2\x0a\xe9\x90\xb7\x74\x46\x68\xa6\xa5\x57\x8e\xb9\x58\x6a\x40\x39\xeb\xcc\x7e\x3d\x94\x66\xb2\x60\x96\x59\x76\x5e\xfc\x5d\x2f\x0a\xba\x55\x08\x46\x5c\x2c\xfc\xdc\xd0\x6b\xa6\x49\xa1\x58\xc2\x52\x26\x92\x96\xab\xb6\xee\x50\x13\xac\xfc\x99\x14\x76\x5b\x74\xb2\xf6\xa7\x21\xc6\x08\x8e\xb0\xfa\x4a\x43\xb4\xd2\xd9\x1d\x14\x62\x96\xb0\x29\x4a\xcd\x14\x06\x58\x55\xc9\x70\x21\x7e\x2c\x87\x2c\x63\x06\x8d\x21\xc0\x9d\xa0\x06\x0d\x69\x9e\xd3\x31\x23\xd4\x04\x46\x31\x92\x30\xa1\xad\xb8\x41\xd7\x9b\x21\xa9\x64\x55\x01\x25\xd5\xe4\xfd\xe9\x31\x79\x41\xf6\xec\xb3\xf6\x61\xf9\x47\x94\x67\x10\xce\x34\x54\xcd\xcf\x91\x8f\xfc\x10\x30\x25\xe0\x3d\x22\x15\x6e\xd1\x1e\x11\x92\xe8\x32\x99\xf8\x39\x59\x8b\xcb\x1b\x6c\x2e\x9f\x0f\x9c\xfa\xcf\x90\x55\x5b\x0b\x98\xf7\x9a\xa9\xce\xe4\xcb\xfb\x06\xf2\x25\x56\x21\x2c\xcf\xd5\xa9\x87\x8c\x95\x33\x43\x53\x6a\xa8\x93\x3b\x55\xd5\xf5\x73\x5c\xd2\x75\x4b\x1f\xcd\xde\x70\x51\x7e\xc4\x8c\x95\xee\x8c\xfc\xcb\x13\x18\x96\x24\x9e\x68\xb0\x68\xb4\x28\x32\x8e\xf5\xce\x73\x19\x54\xa7\xb5\xa5\xee\xdd\xa2\x22\xc1\x36\xa7\x59\x26\xad\x78\xb3\x27\x3b\x15\xa9\xcc\x17\x1e\x66\x15\x28\x56\x03\xba\x1b\x90\x67\xc9\x3c\x6b\x77\x47\x64\x6c\xca\x5a\x60\xba\xcc\xe3\xf2\xd9\xd1\xac\x2e\xe6\x17\x14\x86\x27\x19\x1d\xb2\x0c\x4f\x16\x64\x20\xbd\xc8\x40\xeb\xce\x42\x54\x32\xeb\xae\x06\xe3\x42\x66\x0c\xd3\x7a\x3c\x21\xec\xf0\x4f\x82\x0e\x30\x48\x57\x74\x00\x43\xa6\x46\x07\x30\xc9\x9e\x02\x1d\xca\x16\x07\x2d\x99\xa7\x83\x3d\xb5\xeb\x74\x80\xa3\x73\xd3\xe9\xa0\x59\x92\xc8\xbc\x38\x57\xd2\x9a\x5c\x9d\x1d\x2d\x6e\xd8\x2a\x56\x84\x36\xf9\x92\x24\x1c\x10\xe5\xf5\x9b\xa9\x8a\x12\xfa\xa8\x41\x19\xef\xb3\xfa\xfe\x7f\x71\x87\x64\x2b\x7a\xe6\xcf\x21\x3f\x4a\x2d\xac\x64\x7f\xe9\xbe\x78\xe2\x70\x02\x2d\xbc\x64\x9d\x1c\x26\x32\xa1\x19\x40\xee\xb5\xe3\x18\x32\xcf\x35\xf3\x03\x47\x59\x98\x10\x5a\x82\xcf\x7c\xdc\x1f\xd0\xd7\xe0\x13\xe7\xfb\x12\x32\x65\x51\x08\x12\xd3\x47\xaf\x30\x5b\x0f\xee\xf3\x09\xa0\xf6\x54\xf7\xd1\xc0\xb4\xf6\x6b\x23\x1d\x02\xcc\xdb\x00\xe4\x67\x27\xc8\x44\xca\xc5\x18\x3c\x3a\x3d\xa2\x58\x86\xa9\xa3\x6e\x0f\x5f\xa3\xf9\xb5\x0b\x1c\xed\x07\xf5\xec\xec\x1f\x0d\x9a\x10\x97\xc2\x8d\x0c\x4e\x0e\xaf\xdf\x8c\x50\x5a\x72\x4d\x76\xde\x78\x02\xb4\x40\x3e\xdb\xc4\x03\x62\x07\xdf\x30\xac\x26\xfa\xd8\xae\xb9\x48\x5d\x96\x65\x8d\x58\x01\xa3\x16\xb5\x50\xc8\xdf\xe5\x69\x2c\x1a\x5e\x91\x0f\x82\x04\x62\x91\x7e\x63\xf6\xb8\x40\x85\xd5\xbb\x97\xfa\x77\xbb\xfc\xc2\x43\xe6\x87\x79\x2f\x60\xed\xed\x73\xfb\xd6\xec\x5d\xbc\xcf\xbf\xcb\xce\x3a\xd7\xf5\x86\x8b\x54\xde\xe8\xae\x6d\x88\x9f\x71\x58\xaf\x50\x27\x96\xad\x0d\x17\x63\x1d\xdb\x11\x34\xcb\x6a\x6e\xd8\x65\x86\x84\x5f\xe1\x80\x48\xbc\xa8\xc0\xcf\x65\x87\x6f\x8d\x80\x07\x5c\xe3\x5c\xd3\x23\x65\x5f\xc5\x70\x9a\x5d\x16\xcd\xa1\xd9\xc8\x3c\x1b\xfc\xf0\xf6\xf2\xb0\x3e\xb4\x95\x67\x37\x80\x78\x6d\x89\x6d\xbf\x27\x34\xcd\xb9\xd6\xe0\x06\x62\xc3\x89\x94\xd7\x64\xcf\xa7\x6d\x8c\xb9\x99\x94\xc3\x41\x22\xf3\x28\x83\xa3\xaf\xf9\x58\x1f\x38\xa6\xed\xdb\xd9\xef\x13\x2e\xb2\x90\x8d\x02\x66\xa4\x30\xda\xbb\x31\xe0\x21\x49\x98\x05\xac\xad\xc3\xeb\x74\x51\xe6\xc5\x69\x22\x42\x27\x67\xd9\xfa\x01\x67\x16\x97\xe7\xac\x25\x76\xc6\x3d\x4b\x04\xef\xee\x4a\x53\xe2\x32\xaa\xa5\x74\x44\xed\x6d\xed\x44\x72\xda\x41\xc2\x74\x77\xa8\x3c\x7f\xab\xc6\x24\x29\xc3\xea\x09\x06\x59\x27\xf4\xd6\xe4\x26\xf0\xca\xee\x42\x11\x9e\xfb\xe9\x6e\xac\xd1\x42\xd4\x07\xcb\x3c\xac\x3d\x90\x15\x13\xda\x47\x23\xd9\x8a\x24\x90\x61\x5e\x07\x98\x48\x21\x5d\x72\xba\x3d\x05\xa5\x00\x96\x06\x6b\x01\x03\x41\xb0\x26\x4e\xc6\x46\x53\x3d\xaa\xe2\x83\x71\x0c\x09\x8a\x78\x10\x04\xa0\x9a\xc3\x0d\x37\x13\x8f\x70\x5f\x0b\x38\xc1\x4c\x14\xd3\x10\x3d\x10\x84\x29\x25\x95\x4b\x84\xf1\x5e\x5b\x18\x09\x44\x31\x64\xd2\x58\x26\xa1\xf6\xaf\x5d\x1d\x87\x28\x2b\x08\x5c\xc8\x13\xb3\xdc\xc4\x46\x23\x96\x80\xa6\x14\x13\x18\xc5\xee\x5e\x85\xdc\xe7\xb2\xbb\x2d\x83\x39\x08\xdd\x9c\x7f\xb4\x4f\x89\x7f\x15\x07\x43\x1d\x62\xde\xf2\xaf\xf7\x07\x84\x9c\x8a\x90\x39\xd9\xb3\xab\x18\xdf\xe9\x53\x7e\x8c\x7d\xc5\x18\x7f\x19\x5e\x20\xf6\x3b\x59\xf5\x4e\x95\x1d\x70\x7c\x1b\x67\x30\x89\x1d\xc2\x9d\x8a\x03\x70\x0c\xbb\x41\xed\xd2\xfb\x43\xbc\x8d\xa3\xd8\xde\xf2\x58\xce\xe2\xa7\x71\xd2\x93\xb6\x72\xce\x95\xc4\x77\x04\x8a\x7b\x19\x8d\x16\xa9\xdf\x21\xdc\x74\x2e\x53\x84\xc4\x08\x25\xfd\xd0\xcb\x02\x20\x3a\xf8\xbf\xbd\x82\x55\x29\x69\x42\x62\x56\x76\x8c\x95\xe1\x30\x41\x53\x62\x75\xe5\xcc\xdb\xf6\x79\x91\x31\xa8\x9e\x8b\x46\xae\x0a\x03\x23\x14\xdd\x5e\x98\x48\x05\xc4\xeb\x10\x3a\x7a\xe4\x5f\xb0\x29\x43\x02\xa0\x07\x0f\x38\x0f\x3f\x47\x13\x8f\x6b\x0f\xa9\x0d\x95\x6d\x46\x7a\xd7\x01\x49\xf9\x68\xc4\x7c\xa2\xa1\x35\xfd\xa8\xa2\xb9\x15\xf1\x9a\x38\x12\x0c\xd9\x98\x63\x26\x5b\x10\x6c\xbb\xba\xaa\x80\xef\xa1\x30\xe4\x86\xe4\x7c\x3c\x41\x46\x21\x14\x2a\x23\x89\x0f\xa9\x65\x92\xa6\x04\x78\x5b\x2a\x72\x43\x55\x6e\xcf\x0d\x9a\x4c\x20\x3e\x47\x05\x49\x4b\x05\x30\x91\x86\xd1\x74\xd6\xd7\x86\x1a\xab\xea\x32\xe5\x2c\x42\x3f\xff\x2d\x94\xf0\x9d\xd7\x16\x4a\xf8\xf6\x6b\x0b\x25\xbc\x85\x12\xde\x42\x09\xdf\x7d\x6d\xa1\x84\xdd\xb5\xfe\x6a\x5f\xb2\x85\x12\x6e\x78\x3d\x2f\x38\x9b\x2d\x94\xf0\x83\xae\x2d\x94\xf0\xe2\xb5\x85\x12\xbe\xe5\xda\x42\x09\xdf\x72\x6d\xa1\x84\xb7\x50\xc2\x5b\x28\xe1\x2d\x28\xda\xbd\x63\x6d\x26\x28\x1a\xd9\x42\x09\xbb\x6b\x0b\x25\xfc\x2c\xa0\x9f\xc8\x16\x4a\x78\xa5\x6b\x0b\x25\xbc\x85\x12\x6e\x72\x6d\xa1\x84\xe1\xda\xfa\x5e\xb6\x50\xc2\xfe\xda\x42\x09\xe3\xf5\xc7\xd1\x9a\xb7\x50\xc2\x5b\x28\xe1\x2d\x94\xf0\x16\x4a\xf8\xce\x59\x6c\xa1\x84\x9f\x83\x3d\xa9\x4d\xca\x1b\x21\x9f\xad\x02\x54\xe1\x32\x43\xa2\xd2\xd6\x61\x39\x1a\x31\x05\x92\x0b\x9e\xbc\x90\x85\x10\x00\xad\x82\x2c\x73\x79\x06\x00\x8b\xa7\x18\x4d\x5d\xc2\xfb\x2d\x3f\x77\xb5\xb4\x80\x50\x56\x65\x6a\x9e\xbc\x7b\xdd\x0d\x2a\x46\xbb\x1c\x45\x98\xf3\x3b\x91\xb4\xcf\x55\xab\x08\xbe\xac\x00\xc3\xd1\x3d\xc9\xa4\x76\x19\xa6\x40\xac\x64\x42\x85\x60\xde\x78\xe4\x06\x9c\x32\x43\xc6\x04\x91\x05\x13\x28\xbf\x29\xd1\x5c\x8c\x33\x46\xa8\x31\x34\x99\x0c\xec\x93\x84\x27\x76\x95\x0d\xea\x3e\xd1\x46\x31\x9a\xfb\xbc\xd8\x9c\x72\x1c\x8a\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\x61\x30\xa2\x19\x24\xb4\xe3\x41\x15\x88\x01\xe9\x25\x55\x0a\x69\xaf\x7a\x9a\x9b\x96\x8c\x41\x81\xc0\x74\xed\x01\x0e\x6a\x5e\x98\x59\xc8\xa3\x63\x64\xc4\x95\x36\x24\xc9\x38\x9c\xd6\xf0\x44\xac\x1d\x84\xf1\x7a\xfe\xac\x16\x6e\xa6\xda\x4d\x55\xa4\xa0\xb6\x16\x46\x63\x56\x5a\x35\xa0\x1b\x2a\xe5\xda\xa9\xf9\xba\x47\xa8\x87\xbc\x41\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xbb\x8f\xa2\xe1\x22\x9c\xbc\x2a\x6d\xaf\x62\x74\x48\x31\xf6\xcc\xd9\xab\x65\x53\x57\x0a\x05\xa4\xbb\x2c\x6c\x03\x58\x00\xc1\xa6\x96\x07\x58\xc2\xec\xf9\x4a\x6f\xe1\xfa\x4f\xce\xf4\xd1\xa1\xf8\x96\x69\x4d\xc7\xec\xbc\x61\xd4\xe2\x36\x8b\x0c\x02\x17\xd5\xc2\x00\x2b\x64\x58\x9e\x16\x3e\xa9\xd2\x9c\xea\x6a\x10\xc9\x71\x4e\x41\xf9\xb9\x51\xdc\x18\x06\x8b\x0a\xe0\x48\x10\xf8\x9c\x2f\x40\xdd\x9d\x4b\x96\x7a\xeb\x07\xa9\x7e\x6c\x85\xba\x48\x31\x75\x69\xc8\xc8\x50\x71\x36\x22\x23\x0e\xf9\x50\x90\xa1\xd4\x43\xb8\x0f\x8a\x1e\x05\xad\xad\xbd\x2b\x85\xd7\x65\xfd\xbc\x06\xe4\x67\x37\x31\xa3\x4a\x91\xd0\x08\x04\x10\x4a\xb4\xf8\x88\x8c\x21\xc3\xc9\x69\x8b\x5f\xbd\xf8\xcf\xbf\x90\xe1\xcc\x1e\x69\xa0\x59\x19\x69\x68\x16\x5e\x32\x63\x62\x6c\x69\x85\xdb\xb3\x5e\x64\x14\x28\x00\x28\xe6\x38\xf1\x97\x5f\x5c\x0f\xeb\x67\xec\x41\xca\xa6\x07\x11\xfd\xfa\x99\x1c\x2f\xc3\x85\x6f\x9e\x32\xd9\xd0\x24\x5a\xc2\x66\x32\xe3\xc9\xac\x35\xa3\x79\xdc\x19\x32\x91\x37\xa8\xeb\x2f\xe1\x9e\x2a\x07\xb2\x90\x45\x99\xa1\x07\xfb\x75\x28\xcf\x2b\x35\x5b\xac\xc1\x59\xba\x2f\xc0\xe7\xea\x86\x98\xc7\x8b\xc5\xc4\x36\xff\x48\xe9\x72\xbb\x9d\x57\x30\xc0\xcf\x80\x21\xf4\x9a\x66\xd9\x90\x26\xd7\x57\xf2\x8d\x1c\xeb\x77\xe2\x44\x29\xa9\xea\x73\xc9\xa8\x95\x96\x93\x52\x5c\x23\x72\x75\x28\x11\x96\x63\xab\x5a\x15\xa5\xf1\x89\xc4\xcb\x5e\x18\x0b\x4e\xbd\x10\xf6\x66\x50\x35\x0a\xfb\xc8\x2b\x5b\xc7\x95\x4a\x20\x47\xc6\xe3\xeb\x98\xd9\xbe\x78\xf1\xd5\xd7\xc8\xba\x44\x2a\xf2\xf5\x0b\x48\x7e\xd4\x3d\xdc\xc4\x20\xdb\xec\x41\x91\xd3\x2c\xb3\x66\x43\xcc\x94\x96\xd0\xcb\x98\xf0\x93\xf3\xa0\x69\xcf\x6e\x2b\xab\x52\x57\x57\x7f\x07\x3d\x8a\x1b\xcd\xb2\x51\x0f\xab\x02\x82\x59\xb3\x0b\x07\xc3\xae\x93\x3e\x50\x9a\xb1\x01\x0a\xd0\x54\x66\x65\xce\x8e\xd9\x94\x77\xd1\xbc\xa2\x36\x9a\x37\xf5\x33\xae\xa1\x00\x63\x98\xc9\xe4\x9a\xa4\xee\xcb\x28\x8d\x65\x1e\x42\xb5\x39\x15\x9a\x26\xf4\xb4\x48\xe4\xb9\xf5\xfd\x6b\x29\x3c\x39\x2d\x8a\x90\xa3\xaf\xe8\x4d\x8d\x18\xb0\x27\xa1\xde\xb7\x25\x9e\x42\x6b\x37\x73\x5b\x27\x73\xdf\xbd\x91\x95\x9b\x8d\x87\x68\x9c\xc2\xd2\xde\x47\x5d\xcd\xbe\xb9\x63\xb2\xc6\x10\xd5\x80\x7e\x37\x14\xf0\xdf\x98\x9e\xbd\x50\x95\x14\x0a\x5b\x02\x63\xa0\x02\x60\xd9\x07\x44\x72\x73\x87\x6b\x07\xde\xcd\x76\xf9\x4b\x35\xba\x88\xe0\x55\xce\xa9\x71\x0a\xa1\x77\x5f\x53\x52\x30\xa5\xb9\xb6\xe7\xf2\x4f\xb0\xa1\x8e\x32\xca\xf3\xc8\x05\xb8\x1e\x22\xe0\xe6\x06\xe4\xcb\xf6\x92\xf2\x5c\xa6\x6e\x40\x10\x85\x88\xfa\xb9\x44\xad\xad\x6b\xb5\x1d\x1e\xa8\xeb\x16\x95\x3f\x55\xd4\xac\x4b\x4a\xfb\x49\x10\x95\x78\xd7\x73\x12\x90\xf0\x7e\x4f\x55\x3e\x86\xc9\x77\x24\x06\x40\x30\xba\xc5\xad\x4b\xc2\x9a\xf1\x88\x1b\x25\x52\xe9\x9d\x1d\x38\x20\x18\x52\xb7\x7b\xc2\xfd\x94\xec\xbe\xda\x5d\xab\x90\x44\x12\x29\x59\xd0\x71\xab\x1e\x06\x73\x94\x9a\x1f\x36\x2e\xf4\xb6\x66\x10\x7c\x1f\x60\x87\xe0\x2e\x96\x56\x40\x14\x00\x33\x82\xd1\x51\x4f\x60\x67\x20\x60\x3d\xe4\x0d\x9d\x11\xaa\x64\x29\x52\xe7\x5f\x0a\x0e\xbe\xb7\x73\x0f\x3e\x93\x82\x79\xc7\xf9\x7c\x9d\x38\x78\xf4\xb9\x20\x2f\x07\x2f\x5f\x3c\x97\x93\x0a\xde\x70\xee\xa4\x3a\x0b\x27\x15\xca\xa7\xb5\xbe\xab\x47\x3b\xee\xe8\x7d\xdf\x3a\x17\x4b\x05\x66\xcc\x3d\x58\x2b\x7c\x74\xa3\xb8\x61\x51\x6f\xa3\x3d\x30\x5c\xac\x7d\x18\x55\x45\xef\x77\x88\xe1\xdd\x4d\x19\xba\x2e\x87\x8f\x28\xb7\x9c\x80\x82\xed\xb6\xcc\xc3\xa5\xef\x10\x61\x31\xa1\x76\x76\xc8\x1e\xde\xb9\x8b\x95\x81\xfb\x6b\x65\x2d\x47\xb4\x93\x8f\x45\x0b\x8c\xb9\x1a\xe1\x4e\x3e\x16\x14\x7c\x70\x45\x87\x14\xfc\x9e\x4d\xe8\x94\x41\x45\x24\xcf\xa8\xca\x20\xe6\x78\x89\x73\x27\xc3\xd2\x10\x26\xa6\x5c\x49\x01\x09\x3e\x53\xaa\x38\xa0\x52\x28\x06\x95\xd5\xd6\x16\xfd\x8f\xbd\x9f\x0e\x2f\x20\xa1\x61\xdf\x95\x84\xbb\x59\x96\xda\xc3\x47\xc4\x33\x89\x86\xbb\x77\xf9\xfc\x3c\x2c\x0d\x41\xe6\xfa\x79\xd9\xe7\xe4\xa5\x29\x11\x10\xff\x63\x92\x95\x9a\x4f\xd7\x25\x49\x5c\xa9\xea\x31\x6f\xb4\xce\x73\x65\xb3\x15\xa1\x16\x2a\x60\xc1\xb5\x0e\x47\xcb\x3d\x08\xac\xbb\x3a\x60\x56\xc5\x31\x70\xe7\x7a\x72\xb5\xec\x98\x8b\xe7\x21\xcb\x16\x54\x08\xc0\x6d\x58\xaf\x13\x4a\xc8\x94\x3d\x1c\xf5\xa2\x9e\xde\xe3\x86\xc0\x98\x79\x54\x0e\xa8\x93\x09\x4b\x4b\x80\x57\xe1\x1a\xc1\x01\xad\xf9\x40\x2b\x18\x2b\x01\xfd\x19\x4e\x47\xa1\x36\x58\xf4\xc1\x39\x88\x34\xf7\xbf\x57\xbe\x92\xd8\x7f\xa0\xe7\x46\x04\xa3\xd4\x8e\xd5\x23\x54\xeb\x32\xc7\x2d\x81\xf0\xdb\x23\x6e\x74\xe8\xad\xe7\xb5\x63\xbb\x31\x1e\x58\x9d\xd5\x82\xbe\x97\x2c\x03\xe6\x6a\x41\xe3\xdd\xb3\x68\x1c\x24\xb4\xf6\x7f\x39\x86\x73\x09\x13\x10\x6d\x0b\x49\xa1\x12\xbc\xa4\x23\x0e\xed\x2b\xa8\xa3\xf7\xe5\x92\x5f\xa2\xea\x80\x77\x00\x3c\x03\x1d\xb2\x4c\xcf\x0f\x34\xac\x16\xc5\xc1\xfa\x39\xc2\xb7\xec\x0e\x48\xb5\xe6\x63\x01\x7d\xc3\xec\x68\x0f\xec\x10\xd6\xd8\x66\xea\xa2\xfb\x5f\x63\xa9\x56\xcb\xc2\xca\x69\xd1\x77\x56\xaf\x91\x39\x4f\x1e\x30\x92\x9c\x32\x35\x61\xf4\x81\x06\xdf\x5c\x5c\xcc\x8d\x51\xb5\x8e\xd1\xae\xca\xd1\xed\x1b\xff\x10\xbb\xbf\x64\x02\xd9\xf6\xe8\xa7\xf7\xd9\x4f\x14\x58\x04\x1b\x53\x8e\xf9\x94\x09\x0f\xfc\x77\x94\xd1\xd0\x7c\xcc\x43\x25\x39\xf0\xc1\xd2\xc8\x10\xf9\xb0\xe6\x54\x85\x5e\x06\x81\x52\xe7\x74\x8d\xc7\x89\x6e\x71\xad\xcb\x32\x0f\xd6\xbf\xca\x9d\x10\x7c\xc0\xd6\x1f\xbd\xea\x95\x72\x6f\xa0\xd5\xe0\x71\x48\x02\x21\xb2\xd0\x15\x14\x03\x11\xf7\x3f\xc2\xc5\xb5\x2d\x2f\x2e\x1b\xc6\xed\xb9\x80\xe3\x54\x11\x36\xb3\xca\xeb\x8c\x40\x73\x89\xd3\x51\xfd\x49\xbc\x06\x7d\x09\xd9\xd8\xb0\x87\xab\x43\xe5\x5c\xa6\x97\x05\x4b\x7a\x24\x2c\x65\xdc\xb9\xcd\x39\x6d\x30\xb5\x25\xc2\x6f\xc4\xe3\x48\x29\xa6\x0b\x89\x08\x9c\xf1\x63\xe3\x06\xa1\xdc\xd4\x22\xf6\xd8\x88\x00\x2c\xb4\x0a\x2b\xe1\xdf\x4c\xc9\xa5\x82\x60\xcc\xcd\xe0\xfa\x6b\x90\x02\x4c\x4c\xa8\x48\x50\x00\x1f\x5c\xb3\x42\x1f\x68\x3e\xc6\x4d\xff\x97\xaf\xbf\x06\x09\xe0\x49\x72\x70\x71\x72\x78\xfc\xf6\x64\x90\xa7\x4b\x8c\x38\x8f\xf5\x05\x61\xb1\x1f\xc3\x46\x22\xd3\x97\x83\x97\x5f\x63\xdc\x9e\x6b\x04\x20\x89\xe0\xbf\xb0\x26\x6d\x11\xfb\xeb\x5c\xa6\x81\x6e\x2e\x6f\xeb\x81\xd1\xc8\xb5\xca\xa0\x27\xd3\x77\xb4\x61\x46\x6d\xdb\x2c\xda\x56\x99\xb3\x1d\x66\xcb\x16\x8a\x59\xf5\x86\x4b\xd1\x24\xce\x5c\xb7\xef\xe6\x86\xf2\xce\x7b\xf7\x97\x15\xc4\xfe\x69\x62\x6c\x65\xb3\x46\x79\x9d\xc9\x1b\xc8\x0d\xe1\x52\x71\x33\x1b\x00\x54\x8f\x1c\x91\x33\x36\x65\xaa\xe7\x47\x7d\x63\x6f\x3a\x0f\xf7\xc4\x06\xc4\xb2\x3b\xa2\xae\x38\xb7\x6d\xd4\x1e\x19\xc7\x69\x08\x67\x52\x9c\x87\xd9\x85\x61\xdc\xce\xeb\x43\xc6\xe4\xa7\x50\xce\x3c\x19\x5a\xac\x03\xa2\x1f\xbb\x17\x70\x8d\x92\x7f\xa2\x8a\xcb\x52\x13\xf4\x89\xc7\x98\x83\x18\x47\x0f\x24\x02\xd5\xcc\x79\xb9\xc2\x20\x21\x3d\xde\x3b\xba\x02\x7d\x0e\xc3\x79\x73\xb4\xfc\x48\xe3\xc6\x2e\xfa\xd4\x3f\x4a\xf9\x7c\x9f\x05\xb8\x42\x3c\xcc\x96\x9e\x5f\xfe\x44\xd6\xf1\x44\x61\x18\x3f\x0f\x38\x1b\xac\xc2\x8f\xa3\x4c\xf8\xd8\x67\x95\xc1\xfb\xa3\xee\x1e\x7d\x1a\x98\xad\xc1\x92\x36\xd9\xf1\x4d\x93\x1b\x8b\xf9\xf7\x6b\xc1\x16\x75\x50\xb7\x18\x17\xce\xa7\x55\x57\x5b\x70\x07\xf9\x04\x0e\xc1\x7e\xa2\xb8\xe1\x09\xcd\x76\xe0\x08\xf3\x5f\x59\xdb\xdb\x30\x15\x7f\xab\x18\x31\x37\x12\x9f\x42\x33\x72\xcd\x66\x37\x52\xa5\x5e\xbf\xf0\x4f\xac\xd6\x42\x1b\xff\x48\xce\x9c\x2c\x40\x48\x2e\x95\x33\x45\x86\xcc\xbb\x11\xe6\x6e\x9e\x0d\xc8\xa1\x98\x39\x1f\xac\x88\x2b\x2d\xbc\x1a\x31\x9c\xa1\x8e\x83\x5a\x60\x8d\x49\xdc\x79\xe8\x9f\x46\xb1\x06\xe6\x36\x13\xdb\x2a\x90\x61\x17\x78\xed\xc5\xdb\xd8\x52\xb9\x54\x6f\xd8\x1d\x0a\x13\xd5\xa5\xff\xfa\x93\x48\x0b\xab\x9f\x71\xc1\xb4\xfe\xc1\x2e\x65\x1b\x75\xbb\xce\x1d\x14\xd4\x2a\x37\x36\xc8\xc9\x2a\xaf\x8a\xd9\x2d\x45\x7d\xcf\x77\x4b\xa1\x70\xe7\x80\x1c\xc2\x07\x90\x18\x68\x35\x47\x28\x25\xb0\x83\x59\x8b\x77\xae\xb7\x21\xde\x71\x78\x76\xec\x13\xb8\x50\xe9\xd0\x75\xcc\x46\x54\xf9\xeb\x33\x01\x4d\xd5\xa5\x11\xb1\xdf\x4a\x0a\xad\xaa\x76\xae\x54\xc9\x76\x9a\xa9\x7a\x88\x06\x7a\xf0\xe7\xaf\x5f\x80\xb6\x17\x9e\x07\x62\xff\x81\x59\xd1\x4d\x03\x85\x8d\x42\x84\xf3\xd1\xd1\x8b\x98\x1f\x3c\xc1\xbd\xdd\xe4\x3c\x77\x50\xe0\x04\xcb\x14\x68\xde\xc8\xbe\x6c\x14\x10\x6c\x1e\x0a\xec\x57\xd3\xbd\x7a\x78\x27\x84\x36\x51\xbc\xda\x73\xbb\x70\xf5\x55\xa3\xe1\xaa\x60\xa3\xe5\xea\x39\x51\xd0\x1e\xf1\x76\xdd\xc7\x90\x13\x04\x82\x0b\x5c\x23\x20\x1e\x67\x45\x8b\xfc\xa7\x06\xf2\x06\xd2\x7d\x5b\xab\x8a\xbb\x17\x38\x10\x29\x2a\xdd\x70\x21\x8d\x33\xb8\xb9\x41\xef\x70\x5a\xe1\x21\xe4\xc4\xf7\xc8\x3b\xf1\x1a\x93\x04\x7b\xa8\x28\xd6\xea\xb9\xf1\xa6\x4e\x6b\x25\x0e\xfe\xe4\xde\xbd\x8f\x53\x6e\x22\x14\x1e\x4e\xee\xc8\xf2\x6d\x79\xfa\xef\x5e\xcc\x8d\x55\x63\xbd\x9a\x65\xef\x4e\x48\x5e\x75\x50\x70\xe2\x93\x8c\x95\x2c\x0b\xef\x4e\xae\xb7\x43\xa8\x20\x84\xd1\x0b\x8a\xbd\xba\x84\xac\x0f\x1d\x9c\x37\xc0\xc0\xac\x42\x21\x4f\x49\x82\xe6\xbd\x3f\x75\x31\x15\x1c\x3d\x20\xaa\x14\xf5\x56\x83\x91\x43\x76\x27\x63\x63\x9a\xcc\x76\xea\xcf\x59\xe6\xfe\xe6\x90\xa1\xcc\x73\x84\x5f\xc4\xe7\x55\x89\x9d\x90\xff\x09\xfa\x03\xee\x35\x50\x0d\x42\x3f\x58\x7f\xe4\xfb\xca\x84\x09\x15\x29\xb8\x79\x1a\x7b\x16\xfe\xfc\xf5\x9f\xfb\x6e\xb4\x3e\x4e\x65\xbe\xc6\xcb\xd5\x6a\x2d\x75\x27\x7c\xd5\xc8\x15\xf0\x60\xfe\x0b\xde\xee\x4e\x55\xcf\xda\x12\x5b\x7d\x8a\xeb\x02\xd8\x01\xfd\x21\xe1\xf4\x0f\x4f\xbf\x4b\x3b\x5b\x3e\x48\xe8\x41\x1f\x86\xf8\x24\xe4\xaa\xe3\x4b\xb7\xd9\xad\xf3\x50\xd5\x13\x99\xa5\xb0\xaf\x9c\x93\xc9\x3f\x8a\x50\x63\x14\x1f\x96\xd0\x2d\x47\xa4\x00\x75\x5a\xaf\x33\x71\x5d\x39\x06\xa4\x2a\x34\x88\x8d\x67\x60\xfc\x01\x21\x97\xcc\xb5\x54\x8e\xe6\x01\x62\xd9\x93\x12\x0c\x29\xe0\x45\x68\xde\x87\x36\xdb\x27\x72\x48\x35\x3f\xbd\x47\x4d\xbb\xf6\xd6\x3b\xd9\x1c\x06\xa3\x46\x97\x85\x43\x3d\xa0\x19\xca\xc3\x85\x1e\x5f\x73\x07\x19\xa4\x60\x81\x44\xbc\x94\x79\x88\xd9\x5a\x5a\x68\x04\xe9\x03\x5e\xf6\xfd\x5c\x8d\x84\xfa\xa6\xb1\x73\xc5\xde\xd8\x21\x26\xbc\x40\x13\x9c\x9a\xf0\x73\x08\x7c\xd8\xaf\xe3\x72\x55\xe8\x90\xf3\x12\x6d\x60\x79\x03\x4e\xf0\x1f\x4e\x8f\xc3\x1e\xb1\x77\xbd\xbe\x04\x82\x90\x2f\x06\xae\x5d\x97\x19\xf3\x94\x0c\x31\xd8\x65\xc5\xeb\x9e\x60\x37\x98\x3e\xe7\xfc\xc4\x41\x0d\x9f\xfa\xb4\x32\x1c\x2d\x3c\xdc\x0d\xb9\x4f\xbe\x74\x9d\x97\x98\xf2\x46\xfc\x90\xbb\xf4\x9a\x77\x17\xbb\xde\x3b\x7f\xd3\x57\x37\xfd\x7e\xbf\x6f\xe7\xea\x85\xfa\x92\x9e\xb6\x76\xbf\xe7\x32\xe5\xa3\xd9\x1c\x25\x2c\x9b\x57\x8f\x00\x8e\xa4\x62\xe6\x66\xd7\xa0\xd5\x4e\x3b\x3f\x5e\x9b\x0a\x54\xc7\x9c\x47\xb0\xde\x4d\xcb\x3c\xea\x72\x63\xc9\x90\xce\x2a\xd6\x64\xc8\x26\x74\xca\x25\x14\xa6\x02\x8f\x41\xc2\xe0\x2d\x74\xf5\x3e\x1f\xb7\xe8\x0e\xeb\x08\x6d\x72\xf6\xb1\x90\x88\xa4\x08\x09\xb9\xd0\x24\x62\x3e\x98\x02\x6e\x6e\xbb\x29\x20\xaf\xa0\xc6\xf4\x4e\x7d\x40\x34\x11\x4f\x04\x32\xa4\x76\xc8\x30\x9d\xbd\xb9\x65\xde\x1f\x90\x53\xc7\x19\x60\xfe\x09\xe9\x5a\x4d\x10\x29\x08\x2b\x26\x2c\x67\x8a\x66\xf5\x07\xb9\xc2\xa4\x57\x56\x5a\x2a\xcb\x64\x18\xb0\xc8\x69\x81\xc2\x12\x64\x5f\xca\x95\xef\x35\xe5\x44\x9c\xe5\xd7\x9d\x77\xd0\xf1\xf9\x2d\xd7\xa0\xa9\x38\xd7\x07\xea\x95\x3b\xcb\xce\x23\xff\x5d\xc8\xf2\x7a\x78\xe5\x50\x0b\x87\x70\x9b\xfe\xe4\x6b\xea\x4c\xbe\xee\xde\xae\x2e\x8e\x4c\x4d\x9b\xf4\xd8\xf5\xc9\x8e\x76\x7d\xc9\xb7\x1d\xc9\x57\xe9\x48\xbe\x6e\x16\x6d\xca\x8f\xcd\x92\xfe\x5a\xb4\x20\xdf\xc8\xe6\xe3\xeb\x5e\xbd\x27\x2e\x60\xda\xb6\x1e\x7f\x78\xd3\xf1\x55\x9a\x05\x3e\x7a\xd7\xf1\x67\xc4\x35\x0d\x2b\x36\xda\x15\x3c\xb4\xe8\x39\xbe\xd6\x6e\xe3\x2d\x13\x7f\x9b\x77\x18\x5f\x6b\x6f\xf1\x96\x6f\xdd\xbc\x5d\xec\x5a\x3b\x89\xb7\x7c\xeb\xe6\xdd\xc3\xd7\xda\x37\xbc\xc5\x5b\xb7\xed\x15\xfe\xa0\x2e\xe1\x6c\xce\x79\x12\x3c\xca\x9f\x56\x0c\xb6\x29\x5a\x6b\xd8\xac\xbb\xa5\xe4\xed\xa4\x41\xf7\xb6\x35\x77\x97\xad\xb9\x37\x43\xbe\x6e\x1b\x71\xb7\x6b\xc4\xdd\x46\x72\x46\xee\x62\xf0\xcf\xb4\xd5\xa4\x0f\x03\x32\x04\x38\x9f\x6b\xdd\xb6\x2b\xf4\x28\x67\x54\xb9\xae\x66\x73\x8a\x6f\x0f\x56\xc7\xe5\x78\x2e\x1c\x2e\x98\x07\x94\x53\x35\x23\x3f\x9c\x1e\xa3\xfe\x5b\x53\xc3\x85\xf4\x8f\x0e\x9c\x92\x3a\x80\x20\x2a\x66\xed\xd5\xd6\x66\x35\xd6\x8d\x2b\xac\xdb\x62\xd7\xb5\xb2\xb1\x66\x3a\x31\x59\x5b\x96\xb8\xc4\x51\x20\x46\x44\x68\xe0\x0f\x41\x73\xa6\x0b\x9a\x58\xe9\xe7\xee\x80\x40\x6d\x54\x3f\x31\xb0\x96\x8b\x0b\x82\x96\xa2\xc2\x77\xf6\xf7\xef\xcd\x1f\xc8\x7e\x4b\xee\xbb\x62\x22\xef\x95\xc9\x68\x29\x92\xc9\x13\x59\xf1\x25\xc4\x0b\x3e\x72\x4a\xae\x99\x12\x2c\xab\x7a\x86\xfa\x1a\x13\xd6\xa4\xf6\xbd\x65\xe9\x7c\xbb\xc2\xf9\x16\x45\xef\xcd\x5b\x00\xb5\x2d\x97\x6f\x53\x84\xbc\xa4\x2f\xca\x08\xcf\x26\x3b\xa5\x99\x6b\x97\xd5\x70\xf0\xd6\x95\xa1\xad\x9a\xfa\xd4\x51\x20\x10\xc2\x76\x23\xde\xcd\x35\xea\xef\xce\x4d\xe4\x5b\x52\x87\x82\x3c\x1f\xc1\x7e\xa8\xab\xc8\x2b\x2c\x8b\x30\x18\xbb\x7a\xc1\x0d\x53\xc7\x0c\x7e\x1a\x6e\xde\xb5\xf8\x77\xc6\xb9\xa6\x47\xca\x4e\xdc\x70\x9a\x5d\x16\x4d\xdb\xf3\xd6\xd6\xfd\x87\xb7\x97\x87\xf5\x41\xad\xf6\x7d\x03\x49\xb5\x96\xa8\xf6\xfb\x28\x35\xfc\x86\x0d\x27\x52\x5e\x93\xbd\x28\xe5\x66\x52\x0e\x07\x89\xcc\xa3\xfc\xae\xbe\xe6\x63\x7d\xe0\xf8\xb3\x6f\xe7\xbd\x4f\xb8\x00\x30\xb6\x45\x10\x3b\xff\x90\x24\xcc\x02\xd6\xd0\xe5\x26\xb9\x63\x70\x71\x9a\x20\x64\x30\x15\x62\x1d\xf6\xc1\xe2\x62\x34\xef\x16\x7f\xcf\x82\xf8\x6a\xda\x18\x73\xe8\x56\xaa\xa1\x39\xbf\x16\x92\x4c\xaa\xb6\xff\x1d\xd0\xe1\x6f\xd5\x68\x31\x76\x08\x1f\xd5\x60\x4d\x2b\x3b\x23\x04\xca\x76\xa1\xbd\x82\xfb\xe9\x6e\xec\x74\xae\x97\xa3\xd0\xac\x98\x84\xc2\x31\x11\xc7\xce\x87\x2c\xae\x12\x8b\x0a\x36\xe6\x0b\xc5\x9c\xc0\x8c\xa6\x7a\x54\xf9\x4f\x7c\x16\xd9\x28\xa3\x63\x80\x67\x9f\xab\xba\x00\xe9\x08\x2d\x88\xad\xed\x10\xdd\xec\x4b\xeb\x3c\xf4\x30\x20\x1f\x6a\x4c\xe8\xf6\x81\x34\x97\x9e\x0f\xf1\xff\x43\x3b\x6f\xdf\x4b\xbd\x96\xeb\x0d\x56\x7e\x28\x2e\xd4\x96\x77\x30\x72\x6f\x6d\xf6\x98\xc0\x28\x3a\xf7\xaa\x9e\xcc\x90\x1d\x83\x02\x1f\x7e\x4f\x49\xce\x3f\xda\xa7\xc4\xbf\x8a\xb3\xca\x5d\x2f\xe4\xe5\x5f\xef\x5b\x5b\xa6\x32\x7c\x7a\x76\x15\xe3\x3b\x23\x58\x60\x01\x5f\x9c\x61\x5a\x38\xbe\x40\x1c\x26\x70\x08\xbf\x6d\xf8\xbb\x39\x2e\x47\x08\xd3\x75\xb4\xd5\x21\x5c\xe7\x86\xb3\x0b\xed\xcf\xdf\x36\xe1\x3b\x7b\x4b\x17\x21\xbc\xc5\x43\x76\xf3\xcf\x66\xd2\x26\x7f\x50\x4d\x79\xc2\x0e\x93\x44\x96\xa2\x55\xfa\xe0\x31\xb3\xaf\x40\x0d\x4b\x2f\x6b\x63\xa2\xbf\x39\x85\x6f\xb1\x62\x9a\x66\x9c\x62\x4d\x7d\xfd\x4e\x2c\xa6\xaa\xc6\x01\x7f\xf5\xdc\x0c\x1d\xcb\x60\xbb\xdd\x4f\x93\x90\xba\xf0\xfc\x76\x49\x96\x8b\x6f\xb3\x78\xc2\xcd\x51\xd0\xb9\xaa\x17\xd2\x9d\x57\xcb\x35\x37\x54\x5f\x57\x48\x03\x0c\xca\x4d\xc2\x66\x8a\x3e\x77\x2f\xda\xa7\xf8\xd4\x46\xe8\x03\x0d\xa8\x6b\xac\xdc\xb3\x2f\x7f\xa8\x5f\xff\xd7\xf1\x59\xbb\x94\xdf\x00\xb2\x8e\x75\x0c\x13\x37\x74\xd0\xb5\xe3\xf2\xf1\xb8\x0c\xcd\x3e\xb9\x47\x14\x75\xf8\xb1\xae\x77\x48\xc6\x28\xfa\x34\xc8\x5e\x94\x91\xbd\x3f\xb0\x32\xbd\x0a\xf5\xa2\xa8\x77\xad\x3e\x72\x46\x85\x8e\x4a\x0d\x19\x0c\xed\xd3\x19\xc3\x7c\xf0\x20\x74\xab\xed\xcc\xff\x3d\xef\xb3\xac\xdf\x81\xad\xff\x49\x69\xb4\xfd\x1c\x1f\xee\x05\xe6\x0a\x8f\x57\x6c\xcc\xb5\x51\x33\xdf\x84\x64\x14\x4d\xc2\x79\x65\xc2\x2d\xd7\x6c\x46\xfe\xf6\xe3\xc9\xdf\xff\xf1\xe6\xdd\xd1\xe1\x9b\x7f\xbc\x3d\x3c\xfa\xdb\xe9\xd9\xc9\x87\x0f\x97\x7f\xbf\xbc\x3a\x79\xfb\xe1\xc3\x51\xa9\x14\x13\xc6\x95\x5d\x5e\x32\xf3\xe1\x83\xe3\x54\xfd\xe1\xc3\x55\x52\xf0\xe2\xc3\x87\x73\xef\xc4\x40\x78\xe1\xff\x3a\x3e\x03\xf9\x89\xd5\x3f\x21\xe5\x06\xce\x56\x24\x3a\xcc\x7b\x42\x75\x95\x5e\x57\xab\xab\x68\x00\x49\xd5\xf4\xb8\xd3\x13\xaa\x98\x3b\x9a\xcf\xbc\x27\xab\xd5\x66\xb7\x03\x56\x7d\x01\xbc\x87\x34\x78\xc9\xc8\x90\x99\x1b\xe6\xca\xd5\xe6\x8f\xb9\x38\x8b\xf7\x67\x6c\x8f\x83\xc9\xfa\xf6\x28\x5a\x82\x3d\x8e\xca\x99\x24\x53\xce\x6e\x10\x1b\x01\xdb\xbc\x54\x00\xf8\x50\xbe\x8a\x25\x8c\xf3\xe1\x2e\xa7\x24\x15\x32\x0d\x60\xff\x73\x6e\xdd\x05\x97\x6e\xad\x5c\x02\x91\x4b\x58\x4a\xce\x4f\x8f\xc9\xcb\x01\x2a\x39\xa7\xc7\x08\xa4\xb4\x8c\xac\x24\x71\x68\x3f\xf6\x40\xc5\xd3\x77\x49\xba\x78\xc5\x00\x4d\x84\x51\x03\x0e\x28\x87\xa9\xcc\xe9\x43\xdb\x7a\xdc\x53\x78\x80\x4d\x97\x7e\x2b\x69\x86\x3a\xc0\xb9\x4c\x17\x25\xd3\xce\x37\xfe\xa3\x6f\x07\xdf\x84\x79\x7c\x3b\xf8\x06\xda\x39\x79\xb2\x7d\x3b\xd0\xd3\x64\xf0\x8d\x2b\x84\x25\xee\xa6\xa5\xd9\xa1\x0b\x55\x2d\x4e\x9f\xc5\xdf\xc0\xb3\x29\xe8\xbb\x9f\xa4\x4e\xa1\xc3\xbe\x58\x1d\x77\xc3\x42\x2d\x10\x6a\x6c\x13\xc5\xa8\x6b\xd7\x9e\xb2\x8c\x99\xa8\xbf\xfd\xda\xdb\x31\xdd\xde\x9f\xca\x87\xaa\x6a\xdd\xbb\x62\xe7\x52\xd0\x97\xfe\xf0\x4d\xbe\x62\x83\xe1\xcb\xaa\x01\x6b\x83\x0d\xd0\xb2\x22\xff\x41\x61\x1b\x23\x33\x86\xeb\xd3\x66\xa7\x2c\x2d\x88\xda\xd5\xf1\xe8\x4d\x08\xb1\x8e\xaa\xe3\x2b\x0f\xc5\x65\x39\xe2\x2a\xcc\x1f\x2c\x0d\x6c\x5e\x83\xb1\x49\xfc\x06\xca\x94\x66\xc4\x9e\x5a\x06\x3d\x19\x71\x25\xa0\x51\xd0\x66\xe7\x9b\x6b\x36\xeb\x21\x70\x03\x2a\x21\xdf\x46\x98\x82\xa1\xf4\x55\x16\x76\x40\xa9\xc8\x37\xfe\xbf\xbe\x7d\xa8\xb5\xd6\xc2\x8f\xda\xc6\x8b\x8a\x2f\xd5\x3a\x74\x75\x82\xf5\x0f\x75\x24\x07\xa4\xac\x2b\x8d\x30\x12\xc9\x35\x20\x27\x50\xdf\x88\x1a\xa9\xc3\x55\xcb\xb2\xda\xcd\xda\xf7\x48\xaa\xa1\x00\x80\xff\x25\xaa\x8b\x38\x93\x97\xae\xa4\x0e\x90\x59\x46\x4c\x55\x9f\x80\x80\x39\x93\x27\x1f\x59\x52\x3e\x14\x2d\x05\xaf\x56\xbe\xbf\x6b\xd6\xbe\x6b\xc5\x8f\x2c\xa0\xd6\x20\x6d\xac\x16\x1e\xb2\xe2\xab\xdd\x19\xa5\x66\xdd\x4d\xdb\x6b\x36\xd3\x01\x0c\xec\x1a\x47\x77\xd5\xab\x81\x7f\xfd\x41\x76\xf2\x91\x6b\xa3\xff\x8f\x6f\x99\x91\x0f\xab\x66\x25\x14\x73\xa4\xaa\xd1\xfd\x92\x08\xe8\xa5\x81\x8f\xf9\xd4\x04\xf7\x2f\xd0\x9a\xea\xef\x3c\x25\x22\xa8\x37\x6a\xdf\x69\x57\xbb\xec\x1e\x29\xa0\x44\x29\xc6\x0c\xab\xf2\x52\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x89\x55\xf2\xea\xc7\x8c\xfb\xc8\xdd\xc4\x01\x3d\x82\x4f\x69\xc6\xd0\xae\xbf\xe1\x59\x9a\x50\x85\x21\x72\x07\x1c\xa3\x1d\x94\xa3\x43\x4c\xb0\x67\x9c\x93\x64\xd5\x2a\x6b\x17\x8b\xa3\xca\xf0\xa4\xcc\xa8\x22\x76\x3f\x8e\xa5\x7a\x20\xbe\x0c\x5e\xed\x5a\xb7\x04\x16\x6d\xd1\xd1\xb0\x2e\xdf\xe7\x47\x9c\x07\xe4\x73\xda\x8b\x35\x99\xa0\xb6\xa3\xbe\x51\xf6\xea\x50\x90\x72\xe4\x65\x53\x10\x14\x31\xa4\x9b\xa9\x39\xc7\xf9\x18\xfc\xdf\xfb\xd1\xe1\x11\x76\xe6\x80\x7c\x1f\xca\x7c\x7b\xa4\xf2\x19\x43\x31\xa1\x7b\xa6\xdb\x36\x6e\xb9\xaa\x4d\x3d\x92\x0a\xfa\xf0\xec\xa5\x12\x7e\xc3\xa6\x3c\x31\xfb\x03\xf2\xff\x5a\x4d\x11\x9c\xc8\x5e\x9d\x74\xdb\x2c\x14\x50\x56\xc0\x72\x2f\xc8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\xc8\x75\x1e\x78\x62\xd9\x28\x2d\x42\xd4\x4b\xc2\xd3\x35\x31\x8a\x9a\xe2\x1c\x6b\x84\x93\x5f\x06\x09\x19\x64\x22\xd7\x6e\x97\xd6\x3c\xb7\x21\xce\xe2\x45\x68\x60\x9c\x7f\x81\x8f\x9e\x28\x36\x86\xfd\x87\xbb\xe7\x13\xee\x3e\x23\x0b\x99\xc9\xf1\xec\xb2\x50\x8c\xa6\x47\x52\x68\xa3\x40\x34\xb4\xc1\xf1\xba\x6d\xcc\xa8\xf5\xc3\x44\xde\x10\xea\xea\x90\xe5\x08\x41\xd5\x64\x39\x9e\x20\xd8\x2d\xfc\xd0\xb7\x49\xf3\x53\x74\x46\xa7\x1e\x90\xcb\x00\x66\x0b\x0c\x1e\xb0\x71\x61\x14\x70\x78\xdc\xd0\x99\xdb\x4c\x74\x08\xdd\x72\xab\x84\x20\x3f\x19\x0c\xfd\xdc\xfa\xfe\x20\x95\x0f\xcf\x8e\x1f\x8a\x20\xbc\x46\x85\xf6\x96\x57\x89\x7a\xe7\x43\x0b\xb5\x40\xdf\xa0\x91\x02\xdd\x68\x2e\x9d\xa6\x8a\x98\xa3\x9e\x32\x9f\x50\x37\x6d\x03\xb2\x93\xd3\x8f\x97\xd7\xec\xa6\xc1\x2f\xfd\x8b\xfe\xc8\x1e\x9e\xcb\xd5\x07\x7b\xf4\xbd\xd0\xd4\x70\x3d\x02\xa8\xf1\x4f\xa8\x8f\x43\xca\x7d\x33\x44\x64\xbc\xea\x95\x2b\xf1\x68\xa1\x5b\xb2\xc7\xd5\xab\x31\x8b\xcb\xbf\xab\xec\x20\x3c\x00\xb1\x04\x20\x80\x29\xdb\x1d\x94\xb8\x06\x03\x46\x56\x71\x68\x8c\x54\x84\x5e\xc3\x7e\xd7\x9a\x09\xe3\x6a\x0e\x42\x75\x6e\xef\x37\x17\x8c\x8d\x53\xd9\xda\xe6\x85\x01\x79\x4e\x3e\x5a\xcd\x43\x37\xcb\x34\xc2\xab\xde\x1f\x64\x6e\x50\x0c\x8f\xf9\x04\xca\xb9\x65\xa8\xe1\x74\x83\xd9\x1b\x7f\xd2\x54\xce\x55\x57\xbb\x0e\x43\xa4\x5d\x97\x21\xb2\x24\xcf\xf8\xd6\xd7\x9f\x03\xfb\x8e\xab\xd5\x9c\x53\x48\xf7\x50\x81\x47\x07\x36\x15\xd5\xc1\xee\x1a\xbf\x66\x41\x9b\xb3\x46\x91\xbd\x09\x7f\xd7\x16\xca\xbf\x45\x97\x22\xd2\x41\xa7\x22\x02\xb2\xec\xba\x81\x04\x8c\x7f\xef\x89\xd5\x78\x90\xf6\x3d\x8b\x48\x73\x83\xba\xba\x6a\x0c\x75\x5d\x99\xd6\xc8\x59\x35\xd3\xba\x12\x76\x95\x61\xdd\xea\xd9\x1d\x34\xf2\x20\x2d\x6d\xdc\xea\xaa\x11\x42\x3e\xc0\xda\xa5\x10\x60\x92\x23\xbf\x3b\x96\xda\xbc\xa7\xa2\x47\xce\xa4\xb1\xff\x44\xe6\xef\xb1\x64\xfa\x4c\x1a\xf8\x64\x23\x48\x89\xaf\xd0\x21\x21\x9d\x71\x86\xb8\x5e\x20\x37\x5d\x88\xd6\x9e\x78\x9e\x60\x4b\x0c\x8b\x53\x41\xa4\xf2\x14\x0b\xd6\x85\x76\x43\xc4\x61\x05\x07\x8e\x74\xab\x71\x62\xc7\x89\xe9\x7c\xc7\x70\x6e\x28\xc8\xfe\xc2\x6f\x00\x24\xb3\xc8\x20\x41\x3f\x2d\x15\x62\x95\x5a\x5d\xd3\xb0\x31\x4f\x48\xce\xd4\x18\x1a\x1f\x36\xc9\xab\x8f\xaf\xf6\xe7\x0a\x5e\x2d\x4f\x97\x78\x32\x2d\x78\x09\x8e\x6c\x50\xb1\x3a\x54\x01\x70\x3c\x3c\xd6\x72\x0a\x96\xd4\xff\x04\x1f\xf4\xff\x92\x82\x72\x05\xd8\xa6\x2e\x76\x1c\x7f\xe7\xa2\x2f\xf1\x30\x76\x84\x05\xdf\x12\x15\x84\x61\x21\x90\x1d\x7d\x5e\xf1\xe8\x91\x9b\x89\xd4\x78\x18\x06\xf7\xc7\xce\x35\x9b\xed\xf4\x16\x58\x6f\xe7\x54\xec\x54\x81\xe1\x1a\xb3\x85\x43\x18\x32\x08\x77\xe0\xbb\x9d\xc7\xd3\x55\x5a\x1d\xb6\x5d\x80\xcc\xcf\x4f\xa8\x21\x5f\x39\x9b\xa7\x7d\x2f\xf7\xb7\x38\x50\x64\x9f\x63\x4c\x70\xac\x58\xd4\xc7\x1d\x14\xf5\x1c\xe3\x9c\xa5\x60\x53\x66\x17\x2b\xe5\xda\x01\xb9\xf9\x14\x83\x7f\x2e\x98\x44\xff\xff\x63\x79\x26\x8d\xb7\xda\xff\xe9\xdd\x5e\xc8\x7f\x1f\x79\x5e\xe6\x88\x98\x64\xac\xa5\x90\xf2\x91\x07\x7c\xf5\x99\x0d\x75\x7b\xa1\x6e\xb6\x3a\x3e\x36\x54\x8d\x21\xc3\xd1\xd9\x0b\x9e\xcd\xc6\x99\x1c\xd2\x8c\xe4\x5c\xd8\xc7\x0c\xc8\x6b\xa9\x08\xfb\x48\xf3\x22\x63\x58\x4e\x46\xbe\xec\xff\x5b\x0a\x46\x5c\x34\xbc\x47\x3c\x2d\x5c\x92\x84\x91\xe4\x25\x72\x6d\x05\xfc\x1e\x52\x1d\x6a\x06\x58\x70\x5b\x68\xf2\xf2\xe0\xe5\xc1\x8b\x57\xe4\x77\x62\x87\x7e\xe9\xfe\xfd\xc2\xfd\xfb\x25\xf9\x9d\xfc\x4e\x08\x39\x27\xa4\xf6\x2f\x81\x7f\xfb\x84\x8f\xe2\x39\xbc\xb4\xd3\x4c\x64\xee\x5e\x18\x3c\xb9\xa1\xea\x33\xf4\x8f\x31\xd2\x0d\x0d\x45\x3f\x89\xcc\x19\xcc\xe1\xe5\xff\xf1\xf7\x40\xc0\xd5\x60\x8b\x1f\x98\xd4\x1e\x4c\x69\x9f\xdc\x80\x6b\x2a\xa7\xd7\x68\x96\x1d\x26\xa6\xa4\x99\x7d\xf8\xde\x17\xfd\x17\xfb\x44\x8a\xfa\xed\x53\x2e\xa1\x35\xba\x9b\xe1\xde\xcb\xfd\xc1\xc2\x94\xbf\x58\x32\xe5\xb9\x6e\x37\xae\xe6\xce\x0e\x7a\x3b\xd7\x78\x86\x39\x14\xb3\x1b\x3a\x0b\x6c\xe3\xcd\xd2\x31\x9f\x06\x6c\xf4\x08\x87\x02\x62\x76\xc0\x05\xdc\x23\x03\xe1\xa0\x33\xc2\xcd\x80\x9c\x9a\xdd\x5d\xdf\x5b\xc9\x6a\xcc\x1e\xc4\xfd\x38\x86\x0b\x04\xc2\xc3\xa2\xbf\x98\xcb\xe9\x6d\xd1\x58\xbf\x13\xe7\xe8\x83\x50\xd8\xdd\xd3\x2b\xff\x46\x07\x4e\xf5\x30\x96\xdf\xc1\x56\xf4\xcb\x11\xd6\xc9\x62\xa7\xa3\x01\xb4\xb1\x72\xb4\x77\x09\x23\xa8\x3a\xbb\xdd\xc3\x75\xb0\x9e\x38\xe4\xdf\x27\x34\x8b\x83\x75\x89\x04\x80\x36\xc5\x7c\xa3\xa4\x38\xbd\x28\xf8\xa5\xc8\xcf\xd5\x9d\x98\x56\x04\xf1\x57\x1c\xe8\x5b\x4c\x67\xdf\x19\x96\xc9\x35\x33\xfe\xdc\x51\x90\x11\x51\x94\x86\x0c\x69\x46\x85\xd5\x60\x16\xfc\x10\x46\xe2\x60\xf8\x4b\x60\x98\x25\xfc\xf2\xa9\xe3\x23\x0b\xbb\xa3\xbd\xd0\xff\x79\x7e\xc8\x28\x22\xeb\x1c\x85\x29\xa3\x99\x4f\xa5\x00\x7c\xf4\x00\x58\x25\x76\x77\xab\x7d\x05\x6b\x83\xc2\xaf\x72\xb0\x5a\xb9\x50\x93\xfb\x64\xcf\xe7\x3e\x12\xc3\xb2\x0c\xb9\xa7\xea\x4b\x66\x37\x59\xdc\xe8\x8c\xc3\x08\x75\x19\xb0\xf4\x87\xf5\xee\x68\x18\xd4\xb7\x92\x5d\xcc\x42\xb5\x7c\x8f\x10\x68\x0d\x38\xe6\x53\x2b\x94\x56\x12\x1a\x28\x18\x27\x2c\x2b\x88\x62\x69\x99\xe0\xe0\x84\xe8\x6b\x76\x63\x75\xaa\xea\x4d\x5d\x4b\x21\xcf\xb2\x3b\x35\xa2\xee\x20\x46\xb4\xa8\x8b\x44\x3e\x02\x86\xf4\x1d\x37\xd9\x94\xa9\x19\x29\xa4\xd6\xdc\xae\x03\xec\x25\xc8\x86\x03\xbd\x2b\x20\xeb\x40\x26\x16\x4c\xcb\x8b\xe1\x1d\x27\x76\x77\xac\xa0\xd6\xb2\xb6\x3d\x3e\xcd\x51\xf7\xa5\x3d\x66\xee\x3e\xea\xce\xe1\x7f\x8b\x47\xde\xe9\x88\x2c\xe1\xc1\x30\x97\x1a\xf3\x3c\xe4\x14\xfc\x02\x0e\xab\x2f\xf7\xa3\xc3\xf0\xcb\x83\x2f\x0e\x5e\xee\xd9\xb9\x7e\xb1\x6f\x67\x5d\x3b\xe6\x5e\x86\x63\x2e\xfc\xd2\xcd\x88\xe9\xda\x41\x67\x0d\x30\x6c\xa0\x2b\x55\xea\x22\x3c\x3e\x8b\xce\xce\x48\x1b\x17\x6f\xe3\xb9\x97\x2f\x3d\xe0\xbb\x8a\x59\x6f\x24\xec\x1c\x38\x6f\xb9\x21\x9f\xe5\x52\xb1\xcf\xa2\xfb\x6f\x3d\xa0\x9a\x9f\x3b\x6d\xfb\xa9\x65\x5c\x1b\x68\xaa\x76\xcd\x66\x0f\xd6\x74\xdb\xb8\xd7\xdb\x3a\xd7\x17\xdf\x02\x09\x92\xd3\xe2\x01\xe3\xb8\xbe\xed\x6d\x52\x78\xdf\x38\xc7\x6c\x68\x01\x0f\x8e\x47\xd4\x8a\x5c\x5f\x53\xac\x95\x0a\xf9\xb4\x43\x96\x49\xc4\x39\x75\xa9\x03\x0f\x48\xd5\x0f\xb0\xf0\xda\x48\x45\xc7\xec\xc0\x3d\xf6\xa9\xb4\x83\x70\x5d\xe0\x6b\x5e\x26\x2c\x67\x74\x20\xa9\x3e\xa5\xd9\xc7\x1f\x40\x0a\xd0\x04\xb2\x01\x81\x90\x35\x38\x87\x28\xcf\xf0\x89\x84\xb2\x1a\x54\xbf\xb7\x71\x9c\xd2\x1b\x7d\x92\x51\x6d\x78\xf2\x7d\x26\x93\xeb\x4b\x23\x55\x07\xda\xc5\xe1\xcf\x97\x0b\xa3\xd6\xd6\x54\x90\xc3\x9f\x2f\xc9\x31\xd7\xd7\x15\xba\x3e\xa2\x6a\xd6\x13\xf0\x68\x00\xc6\x71\xb5\x18\x24\xa7\xd6\xfe\x63\xde\xc6\x13\x01\xd7\xb7\xbb\xbd\xf2\x27\x7a\xa3\x19\x4e\x7f\x68\xa7\x6f\xbf\x66\xcd\x45\xf0\xda\x80\x14\xf0\x75\x4e\x8f\xd7\x10\xf8\x1a\xe9\xa6\x6d\x47\xc8\x02\x33\xbd\xe6\x19\x73\x1d\xc0\x00\x12\xa8\x8e\xf1\x0c\x5c\x33\x93\x25\xb9\xa1\xe8\xb3\x02\x99\x3a\x20\x57\xbc\x78\x45\x4e\x22\xbc\x56\x2c\x48\xa8\x0f\x65\xf5\x8d\x80\x1f\xe2\xb2\x04\x80\xcb\xd0\x75\x65\x45\xb0\xcb\x8a\x21\x27\xa8\x4c\xe9\x57\x64\x87\x7d\x34\x5f\xed\xf4\xc8\xce\xc7\x91\xb6\xff\x08\x33\x02\x74\x65\xd7\xa3\xc1\x2a\x75\x62\xc4\x54\x65\xc0\xe0\x0f\x16\x4b\x07\xbb\x67\x52\x72\xf5\xee\xf8\xdd\x2b\x50\xe0\x53\x49\x6e\x98\xef\x62\xe6\x0b\x61\x9d\x34\x8c\xc8\x00\x15\x1d\x89\xcc\x0b\x25\x73\x1e\xa5\xab\xc2\x26\x6b\xc2\xf3\xa4\x0b\x7f\x29\x24\xa5\xc1\xf2\x77\xc2\x41\x90\xed\xeb\x87\x9c\x03\x86\xbf\x8d\x7f\x4e\x47\x44\xa2\x53\xaa\x9e\x23\xcf\x75\xb8\xc9\x72\x8c\x1b\x05\xdb\x71\x55\x3c\x62\xd5\x6f\xf7\xd5\x41\xca\xa6\x07\x3a\xa5\x2f\x7b\xf0\x18\x64\x00\x07\x7e\x1f\xe6\x44\x35\xd9\x79\xb9\x33\x20\x97\xbe\xaf\x79\x2f\x9e\x63\x75\x9f\xb5\x06\xfc\x80\xe0\x56\x7d\xb1\x43\xf6\x30\x49\x1d\x74\x8a\x8c\xf9\x92\xe5\x80\xb1\x01\x3e\xfc\xfd\x46\x2a\x24\xe9\xc0\x7d\x41\x5a\xbb\x30\x88\x6b\x19\xf6\x4e\x64\x8d\x43\x7b\x73\x55\x55\x6e\x0d\x76\x0c\x74\xdf\x32\x12\x2a\x08\x98\xeb\x07\x8b\xa2\xe2\xc2\x3d\xb1\x22\x24\x17\x4e\x3b\x79\x6b\x17\x1f\xbb\xc0\xc3\x00\x77\x32\xcb\x0e\x54\x1f\xed\x6c\xcc\x99\x44\x3a\xa8\xe6\x26\xe1\x68\xe9\x66\x3d\xde\x0b\xfe\x5b\xc9\xc8\xe9\x71\xe8\xd9\xc8\x94\xe6\xda\x58\xc9\x95\xd6\x74\x04\x8e\x8a\xc3\xde\x61\x4e\xff\x2d\x05\x39\xf9\xfe\xd2\x4d\x65\x7f\x03\x09\xdc\x50\x00\xd2\x7f\x97\x8a\x59\xd5\xa8\xb5\x1e\x76\xe8\x47\x9a\xd7\xbd\xec\xe7\xe4\x98\x1a\x8a\x2a\x18\x4a\x33\x59\x55\x98\xc2\x4e\x18\x42\xe6\x8f\x2f\x1f\x6e\xa8\x45\x93\xf5\xab\x41\x96\x83\xce\x9a\x63\x4a\xd9\x9f\xbf\xbf\x38\x5d\x83\x12\x95\xc0\x29\x3c\x7e\x2b\xd3\x8e\x34\x29\x80\xf7\x38\xc2\x51\x49\x6e\x87\x25\x67\x52\xb0\x1e\x08\x3b\x62\xa5\x9d\xfb\xcf\x9f\x15\x37\x0f\xad\x98\xac\xae\xd6\xc7\xbf\x5f\xb1\x4e\xde\xda\x1e\xfe\x67\x51\x65\x3c\xc0\x38\x80\x54\x71\x8a\xc0\x30\x93\x43\xe2\xa4\xc1\x3a\xdf\xf8\xfd\xc5\x69\x67\x2f\xfc\xfe\xe2\x74\x73\x5f\xb6\x43\xe3\x60\xde\x36\xa8\xf4\xb7\x0a\x7b\x75\x5e\xe9\x5f\x5d\xe3\x1f\x74\xa5\xeb\xaf\x8b\xd2\xd7\x5c\x34\xce\x0a\xab\x8b\x8e\x13\x5f\x1f\xe9\x22\x35\x50\x92\x9d\xbe\x22\x79\x99\x19\x28\x7f\x03\xc6\xb2\x9c\xa6\xed\xe9\xed\x59\x8c\x38\x28\x08\x42\x8e\x19\x86\x17\xd2\x57\x3e\x21\x21\xfc\x62\xf9\x0f\xde\x52\x41\xc7\xf6\x76\x38\x0f\x49\x8e\x7f\x46\x1c\xbd\x87\x0e\x74\x11\xbe\xa2\x53\xca\x33\x3a\xe4\x19\x37\xd0\xfe\x7f\x7f\xe0\x15\x31\x8d\xb5\xb0\x76\xca\x6b\x13\x6a\x9d\xaa\xb0\x71\x7d\x10\x28\x98\x64\xcf\x8e\x7f\x70\x63\x05\xf7\xfe\xa0\xd2\x5e\x01\x8d\x0c\x12\xe5\x51\xc5\xad\xa9\xb6\x1e\xe5\x61\x4e\xb3\x6d\xc7\xae\x4d\xd5\x4a\x58\xe6\xd7\x0d\x21\xa0\x17\xd5\x1e\x3b\xd2\x52\xb5\x07\xbe\x70\xa0\x13\xcf\x5c\xf3\xc1\x0e\x52\x2d\x74\x1f\xd8\x32\x0d\x7f\xdf\x56\xfb\xd9\xee\x97\xfb\xaf\x6a\x81\x3b\xa1\x52\x0c\x22\x84\x43\xcf\xa5\x49\xe3\x0e\xba\x74\xa2\xda\x83\x0b\x81\x76\x65\xf7\x4d\x93\x22\x0a\xbc\x5a\x4b\xd7\xc0\xa9\x9d\x10\x02\x61\x57\x1a\x6f\x9c\x96\xef\x93\xb0\x62\x32\x6a\x5f\x03\x79\xc4\x8a\xc9\xeb\xcb\x7a\x28\xc5\x7e\x46\x5e\x5f\x2e\x91\x7b\x98\x2b\x63\xdf\x5b\x63\x80\x65\x57\x93\x8c\x8f\x98\xe1\x8d\x88\xb0\x66\xc9\x97\x4b\xc1\x8d\x54\x7a\x1d\x35\x1f\xee\xd1\xdd\xe8\x5d\x17\x9e\x10\xe4\xad\x1b\x17\x13\x3e\x13\x99\x65\x2c\x31\xae\xe7\x21\x2c\xab\x7f\xf0\x32\x47\x88\x4b\x05\xd0\xbe\xc7\xaf\x73\x7a\x1c\x20\xab\x1d\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x9f\x26\xf2\xa6\x6f\x64\xbf\xd4\xac\xcf\x4d\x3b\x5d\x69\x8d\x45\x21\x1d\x38\xa0\xcd\xa4\x9b\x05\xac\x10\x89\xde\xeb\x0a\x33\xcc\x07\x7e\x95\x94\x66\x11\x35\x6c\x54\x66\x19\xae\xa9\x51\x8c\xf5\x62\x77\xe2\x03\x31\xd5\xaa\x6b\xb3\xf4\xd7\xdd\xe5\x7d\x7d\xbb\x3f\x9a\x37\x65\x33\xb4\x3f\xe5\x9b\xaa\xc6\xe4\x0e\xda\x5f\x86\x91\x7d\x42\x9f\x65\x7c\xbb\x12\xd7\x6c\x46\x20\xbb\x7f\x24\x15\x20\x6d\xd6\xb9\x90\x99\x04\xc8\x75\x00\x2d\x15\x9d\xae\xb0\x21\xa4\x6e\xa3\x45\xc0\x8b\x5c\xb0\xd1\xe3\x10\xfa\x82\x8d\xb0\x80\xc2\xe7\x38\x3b\xeb\x82\x96\x66\x82\x99\x90\x88\x7c\x84\xe4\x5c\x4a\x79\x57\x91\xb1\x21\xa4\x6e\x95\x4b\xdf\x45\xbd\x57\x1b\xe0\x7d\xb2\xb0\x5e\xb1\x9b\xd0\x2d\x92\x79\x70\x5c\x41\x4e\xad\x6d\xc9\x6e\x0e\x6e\xa4\xba\xe6\x62\xdc\xbf\xe1\x66\xd2\x47\x4a\xe9\x03\xc0\x61\x3b\xf8\x13\xfc\xe3\xa2\xb5\x87\x69\xea\x32\xcb\x4a\xcd\x46\x65\x86\x39\x5f\x7a\x40\x68\xc1\x7f\x62\x4a\x43\x0a\xe3\x35\x17\x69\x8f\x94\x3c\xfd\xae\xe9\x8a\x91\x2e\x36\x48\xf3\x2e\x62\x77\x9e\x8b\xca\x8b\x1f\x45\x53\xa9\x11\x85\xd7\x92\xa8\xc6\xfa\x34\xcd\xb9\xd8\x14\xce\x6f\xaa\xda\x73\x91\x36\xa3\x60\x9d\x7a\x47\x30\x4e\x5d\xb7\xc7\xb1\x7d\xcc\x38\x64\xd1\x50\xef\xcb\xc0\x2e\x55\x2e\x9f\xa6\x9e\x4d\xb3\x92\x40\xc9\x67\xfa\xb7\xac\x8f\x4f\xe9\x17\x69\x45\xd7\x6d\x6a\xcc\x43\xae\xc7\x4c\x8d\xe9\xd6\xfd\xfd\x09\x12\x5e\x1e\x95\xc7\xc8\x56\xed\x5d\x03\xad\xdb\x6b\xba\x8f\xa0\x7f\x01\x0e\xbc\xf6\xc5\xc9\xa0\x5e\xa1\xec\xf1\xbe\x2d\xec\xcc\x17\x80\x87\x7d\x99\x51\x22\x85\x70\x98\x74\xef\x0a\x26\x2e\x0d\x4d\xae\x5b\xc6\x45\xb7\x3a\xd3\x1f\x4c\x67\xea\x36\x57\xc6\xa7\x41\xa7\x81\x47\xb1\x8a\xca\xa5\x94\x55\x59\xd2\xb8\xb1\x9f\xa0\xd4\x45\x84\xf5\xb7\xb4\x68\xef\x01\xf5\x23\xcd\x29\x4a\xe1\x63\xe7\xf4\x84\xaa\x9a\x42\x16\x65\x86\x90\x6b\x5c\x3b\x3a\x7e\x7a\xc5\xa6\xed\x06\x77\xfa\x72\x77\x39\x23\x95\x0c\xcd\x65\xca\xc8\x90\x9b\x4a\x3a\x6a\x66\xb0\x76\xd7\x01\xd1\x48\x41\x12\x07\x36\x07\x5a\x87\xd5\x30\xdc\x84\x22\x8d\x44\x10\x99\x18\x5f\xf3\x17\xca\x7c\x5f\xbc\x78\xf1\x02\x8b\x2e\xff\xfa\xd7\xbf\x12\xa9\xa0\xe3\x43\xc2\xf3\xc5\x1b\xe1\xae\x3f\xbf\x7c\x39\x20\x7f\x3f\x7c\xfb\x06\x72\xff\x0b\xa3\x11\x07\x1c\x47\xb6\x37\xd4\x7e\xac\x7b\xe4\xff\x5e\xbe\x3b\xf3\x6a\xa3\x9e\xfb\x16\x4c\xed\xf0\x7a\x75\xf4\xc5\x17\x7f\xf9\xea\xab\x01\x39\xe6\x0a\x6a\x9f\x38\x0b\xad\xb9\x82\xb7\x84\x2a\x86\x45\xa2\x00\x11\xe8\xf5\x2a\x1e\x40\xf4\x1d\x7e\x02\xf6\x1e\xc4\x7a\x46\xcb\x81\x19\x4f\x0c\x96\x59\xa1\x20\x0b\x5d\x85\x01\xb8\xd1\x41\xa1\xba\x64\x5d\x98\x5c\x8f\x64\xfc\x9a\x91\x91\x86\x96\x9c\x55\x31\xbd\x6b\x77\xe3\x4a\x4a\x70\xb0\x6a\xad\x34\x33\x4f\x3c\xf7\xb3\x95\x2f\x78\x1e\xc0\xb8\xd6\x70\x0d\x4a\x3d\xaf\xd9\xac\x8f\x1c\x56\x50\x1e\x0a\x46\x20\x39\xae\xd6\x63\x21\x78\x6d\xd2\x48\xae\x78\x8c\xc5\x42\xc9\x7f\xe1\xe2\x43\x0d\x69\x24\x89\xa1\x12\x15\x5b\xd4\x02\x58\x82\x88\x1a\x76\xf8\x3a\x58\xd7\xd4\xcb\x7f\xec\x90\x42\x17\xe1\x96\x33\xae\xed\x23\xae\xd9\x4c\xdf\xf5\xe4\xaa\x57\x8c\xe5\x4f\x8d\x9c\x52\x8a\x85\x5f\x3b\xe4\x7d\x27\x19\x5d\x93\x05\x87\x78\x53\x8d\x81\xe5\xff\xae\x10\xda\xdd\xeb\xa9\x14\x08\x51\x4b\x57\xd6\xcc\x94\x8e\x34\x90\x77\x6e\x9f\x0d\x0d\x00\xe0\x0d\x73\xaa\xae\x99\xef\xcc\x4b\xb3\x01\x39\xb7\x93\x0c\x90\x23\xa1\x31\x32\xd8\xad\x74\x06\x8f\x75\x4a\x1a\x3c\x64\x77\x30\xd8\xc5\x8d\x27\x15\xd1\x86\x2a\xb7\x8b\xec\xe7\xcf\x03\xc5\xea\x2d\x2d\x34\xa2\xaa\x58\xad\x14\x10\x87\x24\x20\xb5\x9a\x49\xd5\x17\x10\x69\xbd\x45\x9e\x22\x7d\x20\x4c\xe3\x01\x36\x11\x75\xea\xca\xc9\x06\x23\xfd\xf6\xde\x08\x2c\xa4\xbc\x85\x52\x81\x57\x2b\xd5\xc2\xc1\xec\x66\xec\x49\xe9\x12\xcb\xdb\x6a\x38\x49\x19\x69\x6b\x73\xcd\x3c\x9f\xaa\xca\x80\x57\x17\x8a\x03\x5e\xed\xd5\x07\xbc\xda\x04\x74\xf1\x5a\xd8\xa1\xe1\xa4\xc2\xc3\x68\x54\x91\x1e\x40\xcf\x8b\x70\xc4\x1b\x89\x1d\x42\x7c\xa7\x1b\x41\xe8\x50\xcb\xac\x34\xf8\xd3\xea\xcb\xf8\x98\x83\x41\x3d\xf8\x12\x9c\x6d\xe1\xb6\xe8\xd0\x83\xe3\x1e\xcf\x89\x36\xe7\x1f\x5e\xad\xc5\x44\x67\x6d\x90\x9f\xb7\x57\xa1\x35\x9d\xbd\xee\xd4\x4d\xae\x93\x2b\x86\xba\x99\x30\x97\x85\x10\xe9\x75\x56\x78\x5a\x91\x00\x4a\xa3\x57\xd1\xb0\xed\x78\xba\x16\x2f\x61\xa2\x79\x7b\xb7\xc0\xe5\x29\xd9\x0b\xed\x46\x43\x3a\xdb\xa9\x30\x4c\x8d\x68\xc2\xf6\x63\x77\x01\x2b\x26\x2c\x67\x8a\x66\x21\x43\xd9\xd7\x29\x4f\xa8\x48\x33\x57\xbc\xcf\x14\x6c\x5c\xf6\xd1\x30\x25\x68\x06\x8f\x48\x15\x9f\x32\xa5\xc9\xde\xf7\xcc\xda\x12\xd8\xa6\x74\xff\x09\xa6\x91\xe2\x8b\xac\xc3\x99\x01\x0f\xee\x26\x01\x14\x86\x5a\xd6\x29\xb1\x5a\x2a\x8f\x59\x64\x97\x55\xc7\x6e\xa0\x81\xdd\x10\x70\x62\x82\xd0\x85\x8e\x40\x18\x8d\xf4\x0d\xf0\x00\xb8\x38\x31\x38\x30\xd5\xae\x21\x1e\x20\xc2\x38\x79\xee\xa0\x42\xd6\x56\x0a\xf0\x49\x8a\x2e\xee\x2a\x99\x18\x39\x03\x52\x4e\x79\xea\xd5\x20\xc8\x66\xa8\x50\xb7\x0a\xaa\xa3\x4a\x7e\xaa\xb5\x74\xfd\x3e\xa3\x35\x42\x73\x14\x94\xa5\x3a\xa6\xb4\x8f\x14\xc7\xf1\x2e\x09\xc8\xac\x8d\x1a\x5a\x90\x4e\x0e\x44\x99\xb2\xf3\x72\x98\x71\x3d\xb9\xec\x34\xb4\x71\xb6\x64\x60\x4c\x0c\x5c\x48\x2e\xb9\x35\xdc\xa1\x99\xd0\xdc\xf5\x1f\x43\x35\x8b\x5b\x2d\x5b\xc2\x32\xf8\x5f\xc7\xbb\x43\x42\xa1\x38\x74\x35\xf3\x5f\x45\xf3\x70\xc8\x1d\xd8\x4e\x27\x65\xef\x45\x51\xfb\x3c\xa1\x59\xa6\xe7\x1b\x49\xfb\x83\x0c\x35\x53\x8f\xe6\x81\x5c\xc1\x2d\xc3\xf8\xd9\x43\xd6\x0c\x4a\xb1\x80\x6c\xba\xf4\xc5\x34\xc9\x25\x56\xfc\x0b\x22\x85\xbf\x09\xba\x02\xf9\x1f\x04\x0a\x21\xde\x18\x32\xdd\x1a\x31\x25\xb7\x31\x9d\xa7\x17\xd3\xe9\x34\x2a\x7c\x19\x5a\x34\x50\x18\xb8\x0f\x85\x4d\xbe\xd1\x2c\x0d\x85\xff\x95\xe1\x38\xb8\x2f\x7c\xbc\xb6\x08\x2e\xce\xef\xd0\x38\x58\xd0\x6e\xfc\xb6\x3f\xcd\x0d\x0a\xaa\x98\xb5\xbc\x41\x30\xf5\x9d\x6d\x9d\x44\x3b\xc9\x99\xc4\x61\x7b\x2f\x8a\xb3\xea\x4c\x87\xe3\x1c\x3f\xdc\xd5\x24\x95\x49\x69\x6d\xae\x8a\xec\x55\xc2\x44\x3b\xb4\xf7\xe7\x05\x3f\x9b\xca\x1b\x71\x43\x55\x7a\x78\xde\xa8\x6a\xb5\xae\x9c\x55\x63\xc5\xaa\xb7\x7f\x04\xb1\x9f\xd3\xa1\x6f\xf8\x1f\xc0\x9f\xb6\x81\xbb\xf9\x21\xee\xf3\xae\xb9\x36\xe0\xab\xc5\xe9\xc8\x36\xf4\xb7\x0d\xfd\x3d\x9b\xd0\x9f\x1d\xa9\xde\x29\xa5\x26\x5e\x9c\x43\xd6\x52\xfc\x59\xc4\x90\x22\x91\x8a\xa7\xe7\x7c\x3d\xec\x9c\xce\x8f\x9b\xb7\xe2\xba\xc8\x4e\xf0\x32\x17\xd4\xb1\xe7\x10\x6f\xda\x80\x78\x11\xd0\xb2\x85\x31\x88\xd7\x6d\xa5\x62\x88\xd4\x8a\x81\xe7\x28\x82\x5d\xc8\xf4\x15\x02\xa7\x42\xe7\x74\xec\xd9\xd1\x73\xb8\xcd\x3d\xe7\xbb\x10\x51\xaf\x70\x6c\xcd\xec\xd5\x9f\x4e\x62\x02\x2d\x19\x80\x74\xc4\x04\x04\x18\x01\xa8\x73\xde\x86\x1b\x48\x67\x1c\x61\xaf\xca\xd0\x69\x3b\xd2\xbc\x02\x8d\xa3\x7a\x46\xd0\xc9\x84\xe5\xd8\x3f\xfc\xb5\x27\x81\x95\x8d\xd6\x78\x30\x0c\x11\xd2\x98\xca\x35\x91\xa3\x5e\x0d\x42\x61\x67\xfa\x72\xa7\x5d\x8c\x81\x74\x17\x8e\x24\x7e\x1f\x9d\xb7\x8e\xed\x90\x79\x82\x9d\xd7\x42\x3a\x76\x0f\x81\xce\x93\x61\xeb\xe2\xb9\x2c\x0b\x38\x3f\x90\xc2\x1b\x43\x9c\x4d\x89\xd5\xf6\x42\xd4\xe0\x09\x28\x7f\xdb\x58\xed\x73\x8c\xd5\x46\x07\xa3\x17\x74\x8e\xb0\x71\xfc\x36\x0e\x09\xf8\x20\xee\x90\x79\xa3\xc6\xd9\x30\x3e\x82\xeb\xc3\xb7\x52\xd5\x53\x93\x76\x07\x83\xdd\x5d\x1f\xd4\x75\x7c\x5f\x9a\x51\xff\x6b\xc2\x44\x22\x53\x64\x16\x3b\xbe\xd2\x06\xd4\xbd\xca\xcb\x16\xcf\x25\xf7\xcf\x8a\xd3\x9b\x60\xec\x2e\x96\xba\xb5\x6c\xf1\x68\x7c\xaf\x1f\x41\x89\xa9\x54\x97\x80\xf9\xe7\x48\x14\x30\x9d\x9d\x0e\xe3\xbf\xd7\x24\xe3\x39\x77\xfd\xc3\xec\x46\x67\xda\x68\xb2\x87\x1f\x0e\x92\xa2\xec\xb9\x1b\x06\x39\xcb\xa5\x9a\xf5\xc2\x4d\xf6\xcb\xda\xaf\xdc\x1d\xfb\xd8\x87\xa2\x54\x8a\x09\x93\xcd\x9e\xb3\x06\xe4\x89\xb8\x21\x0a\x50\x58\xe3\x36\x48\x1e\xd5\x35\x57\x33\x17\x22\xbe\xe0\x2d\x8f\x30\xf6\x03\x58\xab\xee\x85\x90\x04\x7c\xca\xc4\x94\x4c\xa9\x7a\x20\x7a\xfa\xb2\xab\x43\x9d\x27\xe5\x53\xae\xdb\x36\xf7\x23\xb7\x3b\xa1\xa1\x75\x57\x69\x8a\xd2\x38\x89\xee\x77\xa0\x47\xda\x0e\x3b\x6f\x4e\x39\x7c\xb9\xd3\x7a\x4a\x05\x35\x86\x29\xf1\x8a\xfc\xf7\xde\x87\xcf\x7f\xef\xef\x7f\xb7\xb7\xf7\xcb\x8b\xfe\x7f\xfe\xfa\xf9\xde\x87\x01\xfc\xc7\x67\xfb\xdf\xed\xff\xee\xff\xf8\x7c\x7f\x7f\x6f\xef\x97\x1f\xdf\xfe\x70\x75\x7e\xf2\x2b\xdf\xff\xfd\x17\x51\xe6\xd7\xf8\xd7\xef\x7b\xbf\xb0\x93\x5f\x57\x1c\x64\x7f\xff\xbb\xff\x68\x3d\x75\x2a\x66\xef\x5a\x8a\x42\xbc\xfa\x1d\x1e\xc9\xf5\x11\x3b\x61\xbf\xb9\xd6\x0a\x5c\x98\xbe\x54\x7d\x1c\xfa\x15\x31\xaa\x6c\x27\x4c\xaa\xe3\xa5\xeb\xfd\x5f\xa9\x01\x15\xe4\xbc\x57\xea\xd7\xbc\xc1\x21\xe2\x79\xcc\x3b\x28\x0c\x3e\x71\x23\xd5\x2b\x5e\x0c\xcb\x0b\xa9\xa8\x9a\x91\xd4\x79\x33\x67\x4b\x00\x7f\x22\xc4\x9f\xd6\x68\xba\xf0\x46\x29\x57\x6b\xa8\x0d\x6e\x0d\xe0\xc3\x52\x5e\xe6\xdd\x38\xe1\x7f\x06\xe4\x79\x87\x5a\xef\x13\x88\xf0\x01\x3e\x7c\x31\xa4\xc9\x35\xda\x4b\x61\x6d\x50\x4b\x8c\x41\xa4\x77\x5c\xde\x43\xce\xa8\x08\x6e\x7c\xc8\x64\x91\x29\xb3\x0b\xe7\x6f\xc6\xb1\x6b\x2e\x77\x0c\xa7\xbb\x2c\xc1\xaa\x0d\x93\x54\xe4\x2d\xa8\x3b\x6b\x5d\x6b\xd2\x09\x6c\x07\xff\x37\x7b\x63\x75\xbc\x8e\xe0\xe2\x25\x18\x93\x0e\x23\x6b\x04\x8d\xa4\xaa\xf4\xaf\x9a\xda\x00\xeb\x16\xf6\x9c\x0f\xce\xda\xd5\xb3\x73\x42\xc5\x13\xbc\xce\x99\xc6\x5c\x14\x9e\x40\xa3\x23\x30\x3c\x81\xfa\x61\xc5\xae\xa2\x86\x88\xa5\xb6\x4f\x92\xa2\x7e\x4f\xf5\x20\xec\x03\x35\x44\x16\x70\xed\x0d\xe7\xcc\x65\xfb\xcd\xa5\xa7\x4b\xe4\xac\x80\x72\x62\x6f\x5b\xea\x12\x2c\x10\xf7\x14\xa7\x47\xcb\x11\x64\x4b\x44\x0d\x69\x7c\xcf\x95\x05\xbe\x14\x3c\xab\x33\xa6\x6f\xb4\x10\x5e\xbc\x14\x2e\x5b\x70\x81\xcb\x96\x33\x59\xa9\x99\xea\x8f\x4b\x9e\x76\xc7\x5e\x4f\x4e\xa7\x68\xa9\x49\x74\xa5\x3f\x74\xa2\x35\x74\xae\x2b\x84\x7c\xcc\xd6\x67\xe5\xce\x49\x48\xed\xac\x1d\x96\x71\x63\x88\x7a\x9a\x27\x0d\x0d\xbf\xbc\x30\xf0\xb9\x04\x57\xc1\x4f\xe4\x0e\xd1\x64\x96\x38\x50\x25\x5e\xeb\x4d\x83\xc3\xe2\x9e\x80\x8a\xa8\xbe\xfd\x3f\xef\x4f\xf2\x21\xd4\x21\x1b\x61\x16\x13\xfe\x06\xdc\x00\xae\x8e\x2b\x65\x19\x33\x50\x96\xc5\x44\xd5\xf1\x4e\x13\xc5\x72\x39\xb5\xdb\xec\x83\x20\xef\xb5\x0b\x86\xf3\xd1\x2b\x42\xf7\x6b\x85\xc1\xae\xcd\xae\x60\x2c\xc5\xe2\xae\xa8\x71\x9e\x2a\x85\xee\x91\xe1\xbe\x4f\x56\xd5\xd8\xdb\x51\x81\xc7\xcc\xb5\xaf\x02\x27\x95\x62\x96\x00\x00\x0f\xa5\x64\x4e\xb4\xa0\x85\x9e\x48\x03\xfe\x10\x5a\xd0\x84\x9b\x99\x25\xb7\x51\x34\xb9\x86\x16\xd1\x8a\xb9\x27\xf6\x48\xb2\xef\xb2\xd6\x63\x0a\xd6\x4b\xce\xcc\x44\xc9\x72\x3c\x81\x1a\x28\xbc\x2b\xc9\xa8\xf6\x04\x58\xfa\x7b\x67\xa3\x6b\x92\xce\x04\xcd\x79\x12\x5a\x67\x28\x39\xe5\x9a\x4b\x17\xc9\xc2\x71\xed\x1e\x23\xe7\xa1\xc7\x00\x06\xc8\x8e\x32\xca\x73\xb2\xa7\x19\x23\x81\x31\xf0\x9b\x4b\x54\x16\xd1\x59\xa8\x98\xfd\x79\x1c\x3d\x73\x28\x8a\x0e\x2a\xc0\x7e\x52\xc9\xe0\x90\x90\x80\x4a\x00\x6c\xee\x74\xf9\xa3\xf7\xc3\xd2\x2d\x9f\x99\x54\x90\xd0\xe6\xbb\xdf\x30\x91\xca\x28\xf5\xe5\xf0\xfc\x54\xc7\x86\xac\xeb\x19\x88\x23\xc1\x17\x99\x14\xe3\x18\x64\xae\xe2\x52\x2b\xf0\x05\xf4\x7f\x9c\xf2\xb4\xa4\x19\x8a\x7a\x37\x99\xa3\xcb\x53\xfc\x39\x1f\x4f\x4c\xff\x86\x81\x9b\x13\x4f\xc4\x2a\x35\xda\x3f\x94\x2f\xa4\xd4\x72\x0d\x47\x83\x71\xee\x34\x74\x19\x43\x87\x45\x3a\x03\x84\x5a\x97\xbc\x59\xcb\xba\xf1\x48\xed\x38\x44\xa0\x7b\x44\x74\x98\xde\x61\xe8\x06\x68\xb5\x21\xf0\x03\x5b\x2a\x03\xd7\x2e\xce\x0d\x5a\x1b\x56\x7d\x25\xc2\xc7\x26\xea\x2e\x0a\x9a\xef\x07\x81\x1e\x5d\x08\x16\x0f\xa3\xdc\xed\xaa\x6b\xa3\x43\x9a\x86\xa2\x4e\xb7\x0d\x7f\x60\x82\x29\x9e\xcc\xb1\x4e\xf8\xe9\x98\x1a\xd8\x7c\x4c\xd8\x9f\xa5\x83\x26\xa6\xf2\x9a\xf5\xe2\x69\xc5\x8c\x57\x2c\x2f\x32\x6a\xba\xc9\x54\xd9\xf9\x39\xf2\xa6\x47\xb1\x68\xbb\xfb\xa9\x48\xfb\x34\xb3\x7c\x7f\xfe\xd3\x91\xab\x87\xc3\xfd\x5c\xcb\x86\xbb\xaa\x3a\x7f\xa2\x3a\x82\x7a\xd9\xd2\x6d\x0c\x20\x6a\x43\x96\x82\xf8\x73\x4f\x06\x97\xc7\x8d\xc0\x56\xb0\xf6\x8f\xf3\x9f\x8e\x7a\x84\x0f\xd8\xc0\xff\x15\x6e\xf5\xf2\xd7\xc8\x31\xd6\x4b\x84\x3a\x1c\xd8\x35\x30\x95\xd8\x97\x1c\xff\xf6\x9f\xdf\xd8\x49\xda\x6f\xbf\xed\x7f\x13\x75\x0e\xfa\xf6\x9f\x96\x8f\x94\xbd\xa1\xfe\x69\x9c\xae\x0e\x92\xd6\xfe\xf5\xcf\x73\x99\x5e\x16\x2c\x19\xe0\x6b\xe9\x7f\xba\x3e\xea\x4c\x18\xab\xcc\x9f\x4b\x48\x54\xe3\x29\xee\x25\x78\xb6\x62\xff\xf2\xf1\x06\xd7\x80\xd4\x49\xac\x84\x1a\x26\xe0\xc8\xf1\x75\xc9\x42\x1a\xfc\x39\xb6\x2e\x85\xf9\xef\x8d\xe2\x6e\xa2\x46\x4a\x10\x26\x28\xb0\x0e\x05\x61\x1f\xb9\x06\x14\x1a\x7c\x57\x20\x07\x75\xb9\xf0\xfe\x14\xb5\xc3\x5a\x0a\x07\xd4\x21\x68\x67\x6a\xe7\xf6\x99\x90\xe6\xb3\xb0\xfc\x3e\xcf\x11\x8e\x4a\x49\xe8\x54\x02\xd2\x05\x1c\x22\x82\x94\x02\x1c\xe5\x55\x37\xc0\xe1\x8c\xe4\x5c\x1b\x7a\xcd\x06\xe4\xd2\x9e\x92\x71\xc2\x02\x52\x4f\x10\xe8\xe7\xc2\x52\x52\x0a\xc3\x33\xf8\xb6\x1a\xc7\x4e\x39\x3e\x3d\x4f\x47\x44\x97\x09\xb4\xbc\x55\xac\xef\xcf\x63\x77\xd7\x82\x24\xab\xde\xa5\x17\x16\x7b\x42\xd1\x40\x2b\x52\xf8\x29\x36\xd0\x15\x8e\xbd\x16\xb2\xb3\xed\x3c\xa5\x48\xaa\x33\x18\x88\x09\x5d\x94\xed\xb1\x9b\xf9\x7c\x22\xb4\x15\x5d\xfc\x41\xb0\x84\x69\x4d\xd5\x0c\x1b\x8c\xf2\xd0\x07\xd1\x25\xce\x82\x50\xca\xa9\x28\x61\x00\xc5\xb0\x5b\x6d\x99\x00\x75\x28\x19\x2a\x79\xcd\x44\xa8\x48\x08\x02\x2f\xa4\x65\x57\x49\xa8\x90\x0e\x20\x49\x32\xa1\x62\xcc\xaa\xa2\xf3\x9c\xa6\x40\xfb\x1f\x83\x6e\xe7\xdf\xc7\x52\x80\x8e\xac\x8a\xc4\x0d\x90\x62\x68\x0f\xc2\x10\x45\xf9\x20\x88\x77\xc3\xf4\xaa\x30\x87\x7d\x25\x9e\x35\x92\x89\xa4\x1b\xbf\x7a\x7b\x8f\x7a\x1f\xf4\x97\x35\xa6\x80\xe7\xcc\xd0\x94\x1a\xda\x59\x1a\xf8\x5b\x1a\x1a\x69\xba\x1c\x11\x60\x87\x28\x77\xc4\x9d\xe4\x5e\x79\x95\x05\x8f\x61\x08\x40\x1a\x4c\xfc\xea\x63\x0f\x7a\xcb\xd7\x2e\x86\x89\xd9\xdd\xa0\x1a\xba\xf6\xea\x30\xbc\x1f\x0d\x45\x16\x4b\x49\x5a\x82\xa2\x59\x89\xb4\x36\x31\xf6\x4e\x42\x30\x76\xa1\x3b\xa3\xf2\x55\x95\x4a\x90\xd4\x53\xbd\x97\xaa\x81\x78\xd6\x31\x61\x38\xb6\x4a\xf7\xb8\x11\x8e\xf8\xa5\xc0\xad\x3a\xb7\x0c\xb0\x4e\x63\x66\x74\x95\xa4\x89\xa7\x89\x15\x91\xee\x2c\x77\x6e\x0b\x38\x6a\xdc\xd2\x38\xcb\x7f\xb9\x3e\x8a\x0b\xa7\xa5\x3b\x2d\xec\xf9\xb5\xf6\x95\xe9\x2e\x16\x85\x1d\x65\xdf\xca\xb4\x7d\x50\x6b\xae\x35\x6a\x35\x70\x55\xb3\x82\xf5\x4b\x1a\xdc\x4a\xf8\x64\x08\xf1\xeb\x1a\xaa\x06\x1e\x01\x13\x3a\x6d\xee\x9d\xad\xf4\xdf\x7e\x68\x7b\x06\x8f\xeb\xc3\xe3\xfa\x2f\xdb\xfa\xc1\xdb\x27\x41\xfa\xab\x65\x32\x64\x7d\x42\x1d\x04\x3e\xac\x68\xbd\xec\x24\x2e\x31\xdf\x9b\x32\x9c\xbc\x2e\xc5\x23\xa4\xd5\xb8\xc2\x5c\xc6\xad\xbc\x7c\x45\x3e\xab\xe9\x5a\x4e\xa7\x0d\x96\x37\x56\x41\xed\x79\x53\x7c\xe0\x96\xdc\x43\x7c\xd5\x6f\xdf\x9f\x1b\x0c\x94\xbc\xe5\x56\xa9\xaf\xb6\x0a\x8a\xb7\x55\x92\xa1\xa7\x7d\x28\x76\xb5\x6c\xac\x64\x96\xf9\x46\xe8\x68\x8a\xcf\x25\x49\x41\xdf\x1e\x0c\xbb\xf4\x82\xcb\x23\x68\xfa\x82\xdd\x04\x95\x8e\x6a\x44\x2a\xf5\x41\x7f\x70\xcb\xf8\xcc\xb5\x65\xe3\x85\x8a\xb0\x43\x31\xc3\xa9\x1f\x87\xc5\xba\xcd\x00\xeb\xf9\x14\x25\x4b\x78\x98\x0b\xcd\x6e\xe8\x4c\xc3\xfe\xaa\x2c\xc2\xf0\x7c\x87\xdb\x5e\x0d\x7c\xc1\x46\x2d\x9a\xb3\xc7\x57\x67\x69\x01\xdd\x25\x06\x00\x2a\x0b\x17\xcd\xb3\x7d\xab\x61\x1a\xf4\xb3\x9e\xbf\xba\xcb\x2f\x80\x14\x4b\xc8\xaf\xea\x22\x50\x5b\x6f\x3a\x74\x7e\x0a\x03\x7b\x9b\x6d\x0c\x7f\xf8\xb3\x3c\x44\x1c\x87\xcc\xee\xb7\x0a\x4b\x0a\x78\x37\xfe\xed\x92\x04\xb4\x8a\xe9\x7f\x84\xc6\x44\x2e\xb4\xe3\x0b\x8b\xed\x51\x70\x78\x7e\x8a\x4f\x1c\x40\xeb\x59\x2a\x66\x4e\xcb\x32\x13\xae\xd2\x7e\x41\x95\x99\xa1\x73\xa4\x57\x7b\x5a\x28\xaa\xec\x80\x1c\x9d\xc6\x98\xdb\x74\x2e\x8b\xaf\xda\x1a\x01\xf9\xdc\xfa\xf8\xa0\xdc\xad\x2b\xb3\x69\x14\x69\x5b\xe2\xe9\xaf\x7a\x1d\x71\x84\x46\xe6\xbd\x16\x4f\x82\x22\x69\x2c\x88\xbb\x3d\x91\xe7\x32\x61\xf0\x60\x05\x7d\xd9\xf9\x96\x64\x5c\x72\x16\xf4\x33\x30\xf4\xed\xb4\x7a\x84\x8f\xec\x91\x26\x45\xdf\xd5\xb7\x07\xd7\xbb\xd3\xf1\x7c\xca\x28\x1a\xed\x76\xb3\xa2\x43\x35\x7e\x56\x3c\x40\xd8\xdd\x64\x4f\x48\x81\x3b\x1e\xef\xdd\xc7\x8c\xd9\x5b\x3c\xc6\x70\xcb\x80\xfc\x3c\x61\x22\x3e\xee\x62\x5f\x7b\x2f\x1c\xbb\x5c\xa4\x76\xb9\xe1\x2c\x04\xdb\x5f\x97\x49\xc2\x58\xf0\x16\xc5\xbd\xd7\x2b\x89\xe4\xa6\x9c\x53\x93\x4c\x98\x26\x5a\x02\xf8\xa8\x36\x34\xcb\x2a\x2f\x8d\x23\x97\x04\xcd\xc1\x3b\xe8\x23\x85\xa2\x56\x16\xee\x1c\x56\x45\x46\x9d\x57\x64\x54\x8a\x04\x73\xb2\xb8\x99\xf9\x19\xc4\x27\x3c\xfc\x0c\x4c\x53\x8d\xce\x1b\x3e\x42\x6f\x70\x64\x62\x06\x62\x82\x48\x9d\xa1\x10\xad\x9f\xf5\x0e\x76\xcf\xca\xcf\x21\x4d\xae\x6f\xa8\x4a\x35\x54\xbc\x53\xc3\xb1\xa9\x60\xaf\x36\xec\x5e\x34\x07\xfb\xf4\x9a\x6e\xb0\x1f\x0c\x59\x68\x28\x2d\xe7\x1e\x43\x68\x69\x64\x4e\x0d\x4f\xc0\x45\xc3\x47\x91\x6f\x3f\x0f\x7d\x1e\x42\x9c\x16\x65\x39\x9c\x0e\xee\x35\xc0\x5a\x53\x58\xa1\x61\x6e\x24\xe1\xb9\xd5\xb9\x28\x34\x4c\x1e\x85\xfa\x76\x1f\x88\xb8\x6b\xa6\x56\xb1\xfc\x19\xc2\x40\xd1\x5d\xe8\xfc\xb1\x66\xb9\x86\xe1\x43\x9c\x21\x38\xd8\x5d\x21\x77\x6f\x4e\x25\x22\xfe\x57\x96\xab\xed\x6c\x23\x66\xed\xd9\x05\xba\x61\x56\xd7\xd2\x77\xb2\xac\x1e\x2c\x9b\x13\x1f\x0b\xac\xfa\xe5\xda\x3b\x0c\x5c\x1a\xf7\x5e\xaa\x64\x51\x38\xd7\x5f\xbe\xbf\x38\x27\x88\xee\xa9\x29\xd3\x10\xd9\xf6\xa9\xe1\x96\x14\x63\x26\x98\xa2\x06\xe2\x03\x0e\xad\x10\x76\xef\xfc\x43\x20\x6b\x98\x44\x60\xe6\x7b\x87\x59\x31\xa1\xfb\xe4\xbd\x6b\x9a\x1f\xf8\x37\xe4\x9a\xaf\xa4\x91\xa2\x33\xd1\x47\x05\xb6\xaa\xe4\x5d\xc3\x6c\x55\xc9\xad\x2a\xd9\xe0\xda\xaa\x92\xf3\xd7\x56\x95\x8c\xaf\x90\xce\xdc\xad\x1a\x79\x11\xea\x13\xa2\xec\x92\x38\x5f\xab\x2a\x60\x78\x7c\x2f\x5f\x78\xd6\x06\x9d\x30\x5d\xca\x62\x4c\x5d\xeb\x9c\xa7\x77\xdf\x60\x4a\x1c\x7e\x38\x74\x4b\xe5\xb3\xf4\xaa\x0c\x41\xab\x25\x96\x86\x45\x4b\xea\x94\x87\x07\xaf\x61\x0d\xf5\xe5\x00\x3b\x5b\xf7\xc3\xb0\xfd\x2a\x29\xaf\x71\x23\xc0\xf8\xea\x70\x35\x49\xe7\xf0\x24\xf1\xf5\xe4\x72\xf8\xea\x57\x67\xb5\x01\xe4\x51\xea\x03\x48\xf7\x35\x02\xe4\xf1\xeb\x04\x48\xa8\xdb\xea\x7e\xdf\x5f\xf8\x3a\xb2\xb9\x9d\xef\x44\xf7\x5d\x3b\xbf\x86\x53\x16\xc6\xe1\x9a\xc8\x9c\x1b\xc3\x7c\x5e\x45\xd8\xc9\xe0\x0d\x8f\xeb\x68\x9c\xcc\x01\xb3\x1b\x93\x27\xd8\xc7\xd0\x69\x29\xd2\xe7\x40\x2b\xbb\xe1\x1a\x8c\x08\x2a\xac\x09\x88\x70\xb1\x20\x3b\xfa\x2e\xef\xd6\x9b\xb5\x5b\x39\xd4\x7e\xdc\xad\x1c\x8a\xaf\xad\x1c\x22\xd0\xb2\x2a\x83\xa2\x8d\x4e\x95\xc7\x43\x4c\xb8\x20\xbf\x95\x4c\xcd\x88\x9c\xb2\x28\xaf\x13\x9a\x52\x69\x9e\xba\xcc\x48\xe7\xb7\x6b\x6b\x75\x6d\xa8\x5e\x07\x7e\xc5\x93\x8f\x56\x7f\x06\x6c\x81\xce\x25\xfd\xfc\x03\xea\x10\x41\xb8\x0a\x7e\x89\xbd\x68\xb7\x32\x56\x0f\x1c\x06\x78\xf5\x09\xf8\xe2\x0e\xcf\x8e\xbb\x34\x81\xbb\x88\xa4\x93\xee\xa2\xe9\xe4\x36\x46\x5d\x46\x22\x24\x65\xf8\x06\x0e\xb3\x90\xf1\x10\x7c\x70\xe4\x9a\xcd\x7a\x2e\xb1\xc8\x75\x21\xf4\x37\x63\x8e\x5e\xbd\x55\x4a\x3b\x08\xbe\xfa\xd5\xf1\xa9\xd3\xa5\xcf\x0c\xaf\xb6\xad\x31\xea\x63\x79\xe2\x76\x73\x10\x76\x7c\xb0\x76\xd0\x42\x23\xbe\x6a\x4c\xea\x5a\xda\x40\xd2\x3b\x70\x2b\x80\xf2\xfb\x52\xa5\xc0\xa0\x50\x9e\x05\x12\xb6\x1b\xf6\x22\x5d\xbb\x6d\xf0\xf2\xcb\xf8\x48\xc4\x0a\x5b\xb0\x56\x13\x73\xcd\x66\xbb\xda\xa1\x54\x48\xa1\x27\xbc\xf0\xbd\x14\x41\x4e\xba\x5d\x49\x7e\x82\x54\x30\x3f\x04\x4a\xc4\x53\xd1\x23\x67\xd2\xd8\x7f\x4e\x20\xb7\x15\x43\x10\x92\xe9\x33\x69\xe0\x93\x8d\x26\x37\xbe\xda\x23\x11\xdb\xc5\x2f\x38\x44\x1f\x30\x8b\x1b\xea\x44\x7d\xc6\x23\x10\xd5\x25\xb7\x84\x85\xe1\x9a\x9c\x0a\x22\x95\xa7\xaa\xf1\x2d\xa3\xb4\x1b\xc2\x7b\x75\xa3\x60\xd1\x92\x31\xdc\x62\x48\x55\x5b\x8b\x3b\x86\x0b\x71\x27\xee\xbf\x01\xaf\x2f\x04\xea\x42\x9a\x26\xb4\x2d\xa2\x86\x8d\x79\x42\x72\xa6\xc6\x80\x68\x92\x4c\xba\x5e\xe2\xae\xce\x45\xbc\x3a\x3c\x1d\xf1\xea\x94\x0f\x41\x45\x79\x03\x09\xb8\x8f\xa3\xfe\xe0\xd8\x78\x5c\xe7\xb4\xb0\x2c\xf8\x3f\xf6\x54\x06\x2e\xf8\x5f\x68\x8b\xa6\x07\xe4\x90\x68\x2e\xc6\x19\xab\x7d\xe7\x02\x07\xf1\x30\x76\x04\x6b\xb3\xfe\x56\xf2\x29\xcd\x18\x26\xcc\x53\x11\x7a\x99\xc8\xd1\x82\xd2\xd5\x73\xbd\xd1\xac\x5c\x0e\x21\xea\x9d\x6b\x36\xdb\xe9\x2d\xb0\xed\xce\xa9\xd8\xa9\xc0\x91\x6a\x8c\x1a\x94\x0b\x88\x5e\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x02\xa6\x6b\x67\x3c\xe9\xdc\xcc\x47\x19\xd5\xba\x0b\x9c\x96\xdb\xb1\xc7\x2f\xa3\x27\x55\x75\xd7\xae\xe8\x22\xc1\x74\xe8\xee\x7c\xe4\x50\x63\xd8\x55\x0a\x6c\x07\x74\x9e\xba\x86\xce\x6d\x81\xdc\xe6\xcf\x9c\x30\x6c\x28\x43\xbd\x89\x51\x0a\xaa\x6c\x95\x5b\x28\xfe\x13\xc4\xc3\xe5\x28\xee\x03\xc1\x35\xb8\x9f\xb8\x2f\x4c\x15\xd2\x10\x2e\x92\xac\x4c\xb1\x03\x06\xfc\x14\x9c\x57\xdd\x18\xaa\x9d\x91\xb7\x73\x06\xfe\x29\x0c\xeb\x75\x4e\x9f\x59\xb3\x50\xfb\x33\x9f\x02\x01\x69\x27\x21\x9b\x00\xa9\xbd\x4e\x6a\x8d\x1a\x55\x39\xd4\x5b\x85\x1c\xd5\xf5\xc8\xd7\x7c\xa8\x18\x39\x9a\x50\x21\x58\x16\xe1\xb0\x38\x47\x27\x35\x86\x26\x13\x4c\x7f\xa6\xc4\xee\xe3\x8c\x99\x5d\x8d\x2d\xea\x73\x9a\x4c\xb8\x08\xe0\x05\x22\xe0\x11\x55\xa5\x54\x6b\x68\xae\xd3\xd6\x10\xea\xb0\x2f\xcb\xee\xed\x8d\x59\x2a\x50\xef\xd1\xdc\x3d\x15\xba\xbd\xdb\xe5\x40\x6b\x3c\x71\xa1\x4b\x08\xdc\x7b\x77\x6b\x97\x3c\xb8\xa7\xb9\x18\x31\xa5\x70\x4d\x86\xcc\xfd\x80\xf0\x5a\xdf\xd5\x81\xeb\xf7\x30\x91\x37\x24\x95\xe4\x06\x3a\x90\x4e\xad\x6a\x00\xf9\x37\xda\x2b\x15\xd1\x4c\x21\x23\x2e\x91\x79\xa1\x64\xce\xb5\xaf\xf1\x73\x0c\xb1\x36\xd8\x91\xac\x6c\x8c\xd3\x7a\x1b\xb8\xe6\xeb\x23\x62\xa8\x1a\x33\x63\x07\x27\xa2\xcc\x87\xac\x25\xac\xca\xba\x21\xbc\x3b\xed\x94\x11\x51\xea\x9e\x06\x18\xe4\xc2\x3d\x17\x01\x4f\x20\x19\x6f\x24\x95\x4b\x29\x0c\x5f\x3a\x9c\x76\xcb\x72\x3f\xb9\x73\xb1\x14\x46\xb7\x84\x4d\x6f\xd3\x40\x03\x97\xff\xe7\x9f\xcf\xba\xc1\x3d\x5f\xca\x5b\x37\x52\x65\xe9\x0d\x4f\x31\x51\x43\x93\x3d\xfb\xb8\xfd\x76\xef\xbc\x46\xe0\xf3\xd6\x1b\xf9\xe6\x86\xa7\x8f\x41\x6e\x9f\x19\x6c\xc9\x4d\x80\xde\xae\x57\x3f\x87\xbe\x70\xf0\xd8\x7d\x72\xc2\xb1\x8e\xdc\xfe\x85\x88\xa2\xf9\x90\x8b\x0a\x09\x21\x30\x04\x9c\x7c\x56\x2e\x78\x8b\x5c\x33\x83\x15\xc0\x50\x44\x2b\xcd\x84\x68\x9e\x97\x99\xa1\x82\xc9\x52\x67\xb3\x96\x6c\xfc\x54\x97\x74\x94\xb1\x8f\xb8\x9b\xdb\xeb\x2f\x61\xa8\xba\x1e\x33\x46\xb4\x07\xbf\xc2\x0b\x8a\x4c\x95\xdc\x9c\x1e\x04\xa5\x26\x94\xb1\xb3\x8f\x2c\x71\x75\x4e\x45\x56\x8e\x79\xa3\x92\xd6\x6d\x53\xc0\x46\xbf\x5e\xad\x29\x60\xd5\xf2\xac\xd4\xac\x42\xfa\x6a\xd7\x74\xfb\x69\xf4\xf0\x7b\x54\x55\xf1\x6a\x79\xa3\xbe\x94\x15\x4c\xa4\x80\x1c\x1e\xed\x38\x9c\xee\xda\xa8\xed\x10\xbb\xbb\x3e\x17\x4e\x3e\x1a\x45\xad\x90\xcf\x01\x4e\xc6\xc1\x82\xf3\x11\xa1\xa2\xad\xc0\x7e\x2e\xbd\xa5\xc8\x56\x6f\x7c\xf0\xa5\x3b\xed\x2f\x19\x11\xac\xd6\x5f\xb2\xe3\xee\x92\x78\xfa\xb9\x8d\xae\xeb\x65\x51\x4b\xba\x40\xba\xa7\xc4\xf5\x4b\x6d\xbb\x41\xea\x25\x4d\xe2\xe6\x66\xb5\xc6\x3d\xb9\x6d\x0d\xf9\xb4\x5a\x43\x8e\x00\x69\xa8\x3d\x8c\xef\x6b\x1c\x67\xce\x77\xe6\x3e\x74\x3a\xe7\x2a\xbe\x32\xb7\xa3\xa2\xe3\x15\x7a\xbe\xb8\x81\x5c\xdd\x3e\xd1\x76\x35\xaa\x24\xfd\x52\x88\x66\x42\x7b\xdd\x1d\xf4\xa8\xa1\x9a\x99\x36\x1e\xdd\xc5\x82\x06\xaf\x0f\xe2\xd8\xd8\x78\x12\x0a\x0d\x3d\xdc\x0e\xe9\x7f\xeb\x34\x47\x51\xbb\xd3\xea\x8c\x9e\xd0\x1e\xe9\x97\x85\xd4\x2d\x1c\x23\xb5\xcb\x9b\x50\xd3\xb2\x97\x7a\x8b\x53\xd6\xcd\xf6\xfd\xfb\xd3\xe3\x4e\x68\x66\x07\x9a\xa3\xd9\x20\xa0\xe9\x95\x82\xff\x56\xc6\x36\x30\x20\x0f\x06\x2a\xb9\xfb\xd7\x41\x8a\x71\xc2\x2a\x67\xfc\x31\xd7\xd7\xed\x81\xb8\x7f\x38\x3a\xa9\x0f\x59\xdf\xcc\x3f\x1c\x9d\x10\xf7\xe9\x4a\x3e\xf0\x87\x38\xc1\xdb\xe2\x39\x8f\x13\x56\x85\xc7\x52\xae\xaf\xd7\x00\xe2\xdd\xd6\x3c\x2d\xd2\xb3\x66\xd5\x82\x9b\xec\xcf\xf7\xd8\x9f\x11\x40\xed\x4c\x96\xe4\xc6\xa1\xd2\x39\x03\xee\x8a\x17\xaf\xc8\x89\xd0\xa5\x62\x55\x96\xd3\xbc\x2d\x67\x75\xa8\x95\xcd\x39\x00\xfe\xd3\xaf\x3a\xf3\xff\x77\xcd\x9f\xcf\x25\xa0\x50\x50\x65\xc0\x06\xeb\x08\xc7\x1c\xda\x94\xba\x21\x3d\x11\xee\x61\x9e\xd3\x91\xaf\x53\xe8\x39\x54\xaa\x00\xf6\xed\x6f\xb2\xec\x12\xc1\x54\xc6\x0c\xf2\x3a\x00\xd0\x92\x83\x94\x4d\x0f\x74\x4a\x5f\xf6\xe0\x31\x1e\xcc\xc8\xd4\xe6\x44\x35\xd9\x79\xb9\x33\x20\x97\x3c\xe7\x19\x55\xd9\xac\xd6\x71\xab\xba\xcf\x1e\xa6\x7e\x40\x48\x02\x79\xb1\x43\xf6\xa4\x82\x91\x13\x2a\x48\xc6\x7c\x25\xbf\xdb\xbe\x33\x34\x1f\xf6\x37\x43\x16\x92\x8d\x89\xc6\xa0\x58\xec\x86\xbd\xde\xe3\x71\x5e\x03\x3b\x3d\xae\xce\x33\x2e\xec\x21\x37\x20\xef\xdd\xe9\xe4\x8e\x7d\x64\x01\xd8\xb5\xfe\x8e\xcd\x5a\xa2\x8d\xf1\x59\xb4\xf3\x44\x2c\x3a\x3a\x36\x8d\xd0\x4d\xbd\x1d\x63\x6e\x2e\x58\x21\x3b\x50\xd1\x70\xa0\x39\xcf\x3e\x37\xf6\x03\xa9\x39\x74\x49\xa1\x86\x50\x14\x44\x49\x99\x51\x6b\x91\xa1\x5f\x7f\x40\x8e\x4f\xce\x2f\x4e\x8e\x0e\xaf\x4e\x8e\x5f\x11\x3f\x12\x8f\x75\xfa\x01\xb9\x8a\xf1\x8a\xa3\x92\x2f\x07\x0a\x1b\x9e\xd5\x73\x82\x95\x8a\xaa\xc5\x03\xe0\x37\x52\x41\x4e\x05\x37\x55\xe7\x2a\x4c\xa2\xcf\xa4\x70\x69\xf1\xf6\xd7\x2e\xae\x30\xe6\x98\xbc\x29\xdc\x60\xf6\xeb\xfa\x68\xb0\x43\xb1\xcf\x4b\x98\x4a\x23\xef\xc6\x9a\x75\xbb\x6a\x79\xd6\x61\x65\xfa\x26\x2d\x9d\x6c\xf2\x2b\x0c\xc8\x56\x5d\x79\xf0\x44\x0d\xcd\x06\x3d\xfe\xaa\x54\xb5\x5e\x80\x83\xc1\xee\x80\xd8\xb3\x7a\x77\xb0\xeb\x55\xb9\x6c\xa1\x61\x65\x18\x34\x86\xb9\xae\xf3\xf7\x80\x90\x77\xbe\x8c\x10\x70\x8b\x96\xf7\xbe\x44\xb0\xbe\xa8\xd3\xe1\xdc\x2e\xf1\x2d\x51\xcb\x61\xfc\x50\x87\x8b\x3d\xe6\x53\x26\xf0\xc5\xd6\x27\x98\xfd\x54\x3b\x59\xb5\x8b\xea\xcd\xdf\x5f\xbc\x59\xdf\x4b\xa1\x64\xe9\xe4\x95\x8e\x64\x9e\x23\x62\xf3\x24\x20\x8d\x54\x60\x21\x41\xea\xad\xc5\x38\x47\x9c\xea\x51\xa3\x0d\x3b\x27\xf1\xfd\x50\x73\xc6\x78\xf8\xd8\xd5\xf5\x8a\xca\x1e\x7a\x78\x9b\x2c\x07\x94\xae\x3d\xf4\xa6\x3b\x3e\x0f\xc2\x7b\x1c\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x13\x14\xbe\x4c\xa4\x85\xe4\xc2\xe8\xa6\x86\x79\xb3\x76\xdb\x6d\xc5\x76\x98\x76\x37\xba\xd9\x89\x1f\x2e\x4e\xf4\xf4\xcf\x88\x90\xef\x53\x66\x28\xcf\x74\xc4\x61\x46\x16\x32\x93\xe3\xe5\x5d\xb7\x1e\xc0\x3a\x7f\x42\xec\xd4\x3e\xed\x5b\x9e\x5c\x9f\xc5\xda\xbc\x55\x6f\x9d\xa2\xbe\x35\x2f\xf4\xd2\x08\xd4\x0a\x96\x20\x74\xd4\x7d\x06\x04\xfb\x84\x26\xc2\x02\x15\xd1\x27\x03\x22\xce\x37\x26\xa8\x90\xfe\xa3\x06\xde\xab\xda\x0e\xeb\x21\x7e\x53\xb3\xc1\x4a\xf3\xa6\x9d\xe2\xeb\x54\xff\x9b\x1b\xa9\x7e\x88\x14\x8a\xf5\x03\xa0\x32\x74\x90\x96\x2a\xd2\xc1\xe2\x33\xc5\x3b\x71\xbd\xcb\x17\xef\xca\x66\xf3\xce\xdc\x4a\x4b\x0f\x3e\x74\xc4\xab\xcb\xb2\x59\xd5\x2e\xc3\xb9\xb4\xe8\x18\x81\x92\x95\x8b\x94\x15\x8a\x4f\x79\xc6\xc6\xd0\x70\x87\x8b\xb1\x6f\x3d\x1e\xe1\xed\x43\xfb\x4b\xb6\x30\x2f\xbb\xd8\xda\xc4\x0d\xe0\x80\xb3\xce\xde\x5d\x41\x13\x27\x48\x85\x69\x6d\x4c\xda\x07\x42\xb3\xeb\x7e\xbf\x0f\xfe\xbb\xbd\x7f\x59\xab\x26\xcd\xf6\xc9\xcf\xcc\x3d\x47\x42\xa3\x29\x05\x9d\xd4\x27\x32\x74\xfa\x81\xb9\x56\x94\x05\x86\xc6\xe4\x38\x77\xd7\x81\xbd\xd3\xaa\xcf\x78\x9c\xd7\xee\xe7\x0c\xc0\x9c\xab\x98\xff\x53\xb4\x80\xd6\x74\x88\x76\x2c\xed\x7d\x9c\x68\xd9\x1e\x09\x71\xfd\xc2\x9d\x0b\x94\xe8\x59\x9e\x71\x71\x5d\xa1\x87\x8f\xa4\xe5\x63\xac\xeb\xe5\xe2\xda\xef\x1a\xc5\x68\x76\xfb\x89\xd1\x84\x47\xd7\x76\x5a\x98\xce\x42\x09\x57\xb3\x02\xf3\xd8\x82\xf0\x72\x49\x56\xb1\xa8\xdf\xd9\x79\xd2\x14\xe3\x3a\xd1\xbc\xbd\x78\x3f\xbd\x3c\xba\x3c\xad\xc9\x76\x41\xf0\xb3\x4f\x19\xb0\xbb\xed\x70\x85\x97\x7c\xd2\x16\x04\xff\xad\x59\x86\x53\x9f\x64\x65\xd3\x5f\x62\x12\xf5\xb9\x54\x86\x66\x6b\x10\x9c\xc9\x84\x16\x87\xa5\x99\x1c\x73\x9d\xc8\x29\xeb\xc8\x0d\x71\x33\xc1\x0e\x64\xbe\xe1\x02\xf7\x4c\x8a\xcf\x20\x47\x7f\x3b\x3c\x27\xb4\xb4\x5c\x67\x5c\x73\x99\xb5\xa5\xa7\x79\x0a\x5c\x62\xc9\xef\x23\xbe\xbf\x7b\xc2\x46\xbd\xfd\x36\x28\xfc\xe8\x41\x61\x90\x8b\xcf\x25\x10\xcc\x05\x37\x9c\x1a\xa9\x3a\x8b\xd6\x1d\x95\xda\xc8\xdc\x6d\x91\x53\x3f\x3c\xe4\x38\x81\xaa\x55\x7b\x62\xbd\x1b\x2b\x18\x8a\x40\xde\x53\x61\xcd\x3a\x9a\xb0\xb9\x3a\x93\x1e\xf4\x6f\xc1\xb1\x79\xb8\xe7\x1b\x57\x6d\x04\xc0\xe4\xd9\xb7\xaf\x6a\xbd\x0d\x17\x5a\xde\x7a\xa7\x63\xd5\x46\x75\x6d\xde\x62\xfe\x5b\x37\xf2\xc9\x39\xf7\x91\x2e\xff\x55\xd2\x0c\xe9\x79\xb6\x4e\x4f\x78\x7d\x1d\x3b\x79\x4d\xcf\x53\x7e\xdd\xcf\x82\xf7\xab\xd4\x88\xab\x8e\x77\x18\x45\x85\xb6\xcc\x50\xf7\x2f\xec\xba\x14\x83\x5d\xb2\x67\x92\x62\x7f\x6d\x94\xe9\xaa\x9a\x13\x5f\xd6\xad\xfd\x9b\x50\xc5\xd9\xee\xbd\xd6\x9e\x37\x00\x7b\xb8\x1b\xe7\x69\x8d\x40\xa8\x92\x91\x37\x5c\x1b\xdf\xc6\x15\x3e\xe0\xda\xf5\xbd\x02\xed\xfb\x9c\x48\x45\x78\xf1\x0f\x9a\xa6\xea\x15\x9e\xf5\xce\x3a\x84\xff\xd6\x01\xa1\x9c\x8a\x90\xb1\xb2\x67\x66\x85\x6b\xaf\x70\x75\x74\x4e\xb0\x3b\xf4\xd7\x7f\x79\x01\x9a\xf8\x97\x5f\xfc\xe5\x45\x4b\x56\x7b\xaa\xd5\x71\xa4\x6b\x2f\x64\xe7\x79\x0a\xcf\xa4\x86\x02\x14\x50\xac\x9e\x80\xd3\xcd\x49\x41\xe4\x7b\xcb\x84\xe1\xcc\xed\x52\x4d\xdd\xd6\x1b\xfc\x81\xea\x0d\x48\x28\x18\x47\x39\xfa\x58\xf2\x19\x45\xf3\xf9\x53\x11\xcd\x0d\xa9\xd9\x94\x73\xeb\x1c\x8b\xd2\x6d\x77\x57\xc7\xb9\x1c\x50\x4f\x79\x7c\x76\xf9\x8f\x37\x87\xdf\x9f\xbc\x81\xf7\x74\xd9\xf0\x96\x15\x9d\x59\xd2\x24\x77\x7b\x75\xd6\x6e\xee\x29\x6a\x4a\xce\x2e\x22\xf6\x67\xaf\x2f\xe7\x5c\x71\xf6\x93\x07\x86\xe9\xdb\xda\x96\x62\xd4\x82\x7a\x4f\x2d\x48\x00\xad\xac\x99\x5a\x4f\x71\x77\xc7\x11\x86\x08\x40\xbd\xe6\xd4\xb0\x3c\x84\xef\xd8\xda\xef\xd0\x90\x37\xc8\xc6\xa9\x71\x77\x07\x93\x2d\xc5\x90\x8a\x9d\x87\x91\x3f\x29\xb5\xdb\xa9\x87\xaa\x2b\xe4\x81\xdd\x4b\x18\xcb\x27\x3c\x58\x11\x86\x79\xd4\xca\x9e\xa8\xf6\x2c\x65\x3a\x34\xbd\x7d\x06\xdc\x5a\x2c\xeb\xf6\xd6\xfe\x74\x58\xda\x44\xce\xb5\x3a\xc6\x20\x4d\x2d\x44\x5f\xab\x5e\xbe\xad\x6b\xa2\xcf\x65\xa4\xce\x55\xa5\x0b\x9a\x74\xda\x8b\xa7\xfa\x08\x3f\x01\xa0\xb7\xa7\x78\xc0\xc0\xc4\xd7\x54\x66\x15\x9e\xdd\xcd\x76\x3c\xf2\xc3\xcd\x83\x81\x3c\x88\x4b\x7c\x97\xe8\x42\x7a\xb0\x97\x18\x35\x64\x23\x59\x88\x6c\xdc\x39\xf4\x73\x43\x07\xc2\x3a\x9d\x07\xc5\x44\x1a\x29\x3a\x2e\x21\x3d\x5f\x32\x68\x5d\x9e\xe1\x1d\x47\x55\xfb\xf5\x8a\x2f\xb0\xc2\x26\x84\xa6\xad\xc1\xe1\x4f\x6c\x29\x7c\x90\xba\x1e\xa2\x7e\x7a\x02\xa8\x48\x4f\x8f\xd7\x20\x7b\x9e\x3e\x0c\xcf\x43\x83\x73\x6b\x4b\x2f\x4d\x3b\xaa\x4b\x3f\x3d\x76\xb6\x80\xaf\x3d\xd7\x6e\xf3\x90\xdb\x77\xcf\x5a\xf4\x24\xa9\xcc\x8d\x54\x5d\xc1\x97\x9d\xd7\x86\x9b\xcb\x57\x74\xdf\x2d\xe0\x49\x3c\x4f\x59\x81\x6f\xf9\xe4\xe5\xc5\x25\x24\x72\xcd\x75\x94\x9c\x97\x10\xa1\x52\xf7\x11\x84\xc8\xd3\x11\x1e\x9d\x6a\x25\x8f\x0b\x1b\xb5\x36\x93\xd6\xef\x8a\x4e\x68\xf4\x93\x1b\xcc\xb9\x36\x2d\x7f\x54\xe2\x96\x06\x61\xe4\x1e\xba\x16\xf1\xaa\xa4\x15\x3f\xcd\xa4\x48\xfd\x40\x31\x2c\xd7\xd8\xca\x2f\xcb\xec\x7a\x4a\x11\x37\x01\x74\xe0\x52\x3d\x82\x7d\xf4\x72\x5a\xb8\x7e\xe3\xa9\xbc\x11\x37\x54\xa5\xe4\xf0\xfc\xf4\xd3\x0b\xd1\xd6\xc5\x8f\xb8\x0b\xda\x60\xd2\xd7\xa8\x08\x28\xf4\x43\x6e\x34\x66\xb3\x43\x3e\xba\x89\x7d\x48\xf6\x00\x0a\x19\x22\x56\x84\x59\x71\xe5\x66\x11\xe9\x48\x82\xc8\xc4\x50\xd7\xd9\x3d\x74\xbd\x7f\xf1\xe2\x05\x86\x14\x5e\xfc\xf5\xaf\x7f\x25\xd0\x75\x31\x65\x09\xcf\x17\x6f\x84\xbb\xfe\xfc\xf2\xe5\x80\xfc\xfd\xf0\xed\x1b\x42\x13\xb0\xc0\x10\x52\x15\x47\x86\xb5\x8b\x7f\xac\x7b\xe4\xff\x5e\xbe\x3b\xab\xda\xbd\xd7\xbf\x05\xd6\xc8\xfd\xeb\x0d\xc8\x71\x94\x7e\x1e\xbb\xfc\xa9\x99\x40\x4a\xbe\x90\x86\xd0\xd1\x08\x98\x13\x45\x32\xd7\x5e\x5c\x78\x5c\x34\x3e\x9e\xf8\x6e\xdd\x96\xad\x32\xc8\x8b\xe7\x76\x8a\x10\x62\xf1\x50\x82\x98\xe6\x0f\x63\x85\xd3\x01\xa6\xd2\x23\x19\xbf\x66\x64\xa4\xa1\x67\x77\xd5\x44\x43\x31\x6d\xed\xa7\x84\x0a\x3b\x3a\x0e\x16\xa6\x6e\x27\xf1\xb4\x73\x17\x5a\x76\x77\xae\x31\xac\x6f\x0c\xe7\xeb\x92\x50\x9e\x58\xb2\x3f\xd5\x5c\x82\xba\xbe\x18\xde\x07\xb9\xc8\x41\xf1\x05\xb1\x49\x68\x26\xc5\x38\x66\xba\x4a\x8f\xf0\x09\x88\xb3\x82\x35\x25\x46\x47\xdd\x54\xba\xe9\x4d\x86\x92\xfb\x2d\x6d\xd9\xdf\xbf\x1e\x5a\x8d\xa0\x10\xe9\x50\x96\xc6\xa7\xbc\xe1\x93\x00\x02\x0b\x30\x12\x91\xe0\xad\x1e\xdc\x59\x63\x9a\xee\x5a\xbd\x75\xd4\x67\xa9\x7e\x10\xd7\x94\xcd\x1e\x61\x34\x99\x90\x6b\x36\xeb\xa3\x88\x2f\x28\xa0\x1f\x00\x9d\x8f\x2d\x75\xb1\xbf\x50\x3d\xa3\x20\x61\xa9\xb5\x03\xdd\x22\xf8\xcc\xc4\x8a\xeb\x03\x7a\x82\x37\x95\xb4\xd3\xa8\x5d\xdf\x22\x11\x39\x0e\x7d\xa3\xc2\x44\x0a\xe3\x9a\x20\x86\x46\x45\x90\x69\x39\x57\x61\x6f\x25\x0a\x4b\xed\xcf\xf4\x5d\x4f\xae\xd2\x31\xed\x91\xe1\x94\x89\x52\x2c\xfc\x1a\x90\xc0\x21\xef\x55\x33\x87\xe7\x43\x7d\x03\xbc\x28\xa5\x73\xc2\x13\xa8\xaa\xb1\xb7\xbb\x7b\x3d\x95\x02\x21\x6a\x08\x00\x9a\x99\xd2\x91\x06\x72\x69\xed\xb3\x99\xd6\x84\xc3\x1b\xe6\x54\x5d\x33\x0f\x66\x4b\xb3\x01\x39\xb7\x93\x0c\x38\xe5\xd8\x37\x6e\x8a\x45\x10\x56\xa6\xc4\xd0\x06\xf6\x21\xbb\x83\xc1\x2e\x9e\x85\x4b\x80\x0e\x5a\xf3\x4b\x97\x2d\xc3\x3a\x6b\x15\x56\xd7\x83\x68\xa1\xb1\x75\x9a\xb5\x0e\xa0\x3d\xa1\x04\xdc\x11\x33\xf1\xda\x02\x6d\x09\x3e\x1d\x5f\x1d\xf7\xac\xea\xb6\xed\x65\x77\x4d\x2f\x5b\x84\xc0\xeb\x57\xd7\xcd\x2e\x3b\x6c\x75\x59\x4f\x38\x76\xf2\xa7\x3a\x41\xba\xea\xbb\xd7\x79\x63\xc5\xbc\x83\xb6\x56\xfe\xba\x0d\xb9\x38\x5f\xc5\xba\x00\x45\xdb\xca\xf2\x27\x65\x4e\x9c\x8e\x40\x86\x2e\x47\x6b\x89\xac\xb4\x70\xa4\x58\x0a\xac\xdf\x8e\xe8\xa2\x57\x3c\xe9\xc8\xb0\x98\xbf\xda\x1b\x1a\xf3\x57\x9b\x64\x96\xf9\x6b\x61\x9f\x87\x33\xb5\x88\x4a\x69\x61\x89\x8c\x84\x1e\x8c\x26\x08\x83\x01\x79\xeb\xce\x5c\x64\x6e\x3a\xd4\x32\x2b\x4d\x80\x55\x58\x72\x20\xc3\xa0\xbe\x63\x23\xc2\x0d\xf9\xdb\xa2\xe3\x19\x14\x13\x3c\xb3\xba\x39\xa9\xf1\xea\x50\xd8\xb4\x4d\x46\xc5\xeb\x0f\x96\x92\x8a\x57\x87\xab\xe0\xf5\xc2\x8e\x57\xe2\xd2\x61\x4a\xfa\x3a\xc0\x9a\xf6\x0a\x69\xa9\x46\xa3\x6a\xec\x15\x51\x6c\x78\xd8\x14\x6d\xb9\xba\xda\x3b\x5e\xdd\xeb\x38\x6f\xe0\xe1\xf9\xe9\xa3\x5b\x99\xd1\xb3\xb6\x76\xe6\x4a\xd7\x12\x87\x2f\x00\x11\x78\x27\xd0\x71\x45\x51\x17\x60\xb3\xf2\xf7\x0f\x60\xae\x2c\xbc\xf8\x6b\x7b\xee\x44\x41\xa9\xb9\x96\x0f\xe8\xc1\xad\x4e\xa8\xa8\x4d\x84\x4f\x97\x01\x69\xf6\xfc\x4d\x9b\x0d\x35\x48\x80\xfa\x2d\xea\x5e\xe6\xaf\xf9\xc4\x52\x47\x44\x72\x09\xbd\xf6\xd1\x7b\x12\xb9\x61\x0a\x99\xbe\xc2\xa6\xcd\x54\x08\x69\xb0\xc7\x7c\x0f\x9b\xf5\xeb\x1e\xba\x57\xac\x92\x19\x25\x5a\xa9\x28\x84\xd9\xb1\x5a\xd9\x19\xf3\x90\xce\x19\x88\x00\x13\x01\xed\xce\xbb\xe1\x24\xf2\x08\xdc\x64\xaf\x4a\x2b\xe9\xb2\xaf\x7a\x3d\xdc\x88\xe3\x7b\x26\xd2\xc9\x84\xe5\x14\x1b\x5c\x78\x02\x59\x79\x7d\xa3\xb8\x31\x0c\xf1\xaf\x99\xca\x35\x91\xa3\x9e\x37\x91\x10\xf5\x64\xfa\x72\xa7\xbb\xfe\xf4\x8f\x60\x2b\x13\xbf\x43\x9b\xc2\x57\xdd\x76\xd5\x7d\xff\x35\x3b\xc2\xee\x4e\x30\x98\x33\xe8\xb8\x23\xe6\x9c\x90\x56\x89\x98\x22\xfd\x37\x9a\x74\x9b\xe7\x66\xe8\x05\x65\x74\xeb\x66\xd8\xba\x19\xba\x18\xf1\xd1\xdc\x0c\xd1\xc1\xed\x85\xa9\x5b\x80\xd8\xf5\x10\xe3\xbf\x7b\xff\x43\x85\xeb\x10\x61\x19\x5b\x96\xf7\x9e\x07\xa9\xea\xfe\xff\xdd\xc1\x60\x77\xd7\xfb\x23\xdc\xfe\x28\xcd\xa8\xff\x35\x61\x22\x91\x29\x32\x95\x1d\x5f\x69\x03\x4a\x6d\x65\x80\xc7\x73\xc9\xfd\xb3\xe2\x18\x02\x8c\xdd\x2d\x4b\x74\x28\xa1\x7c\xce\xc8\xeb\x47\x55\xc1\x2a\xc5\x2b\xc0\x57\x39\x02\x06\x94\x3f\xa7\x81\x55\x39\x2c\x19\xcf\xb9\xc3\xd5\xb3\xe2\x82\x69\xa3\xc9\x1e\x7e\x38\x48\x8a\xb2\xe7\x6e\x18\xe4\x2c\x97\x6a\xd6\x0b\x37\xd9\x2f\x6b\xbf\x72\x77\xec\x83\xd6\x96\x94\x4a\x31\x61\xb2\xd9\x1f\x57\x7f\xf3\x24\xde\x60\xf5\x2d\x70\x45\x9b\x12\x8b\x65\xd7\x5c\xd9\x45\x00\xb6\x07\x47\x5d\xa0\x36\x9c\x43\xae\xd8\xa1\x17\xdc\x47\xf0\x29\x13\x53\x32\xa5\xaa\x71\xb1\xc3\xb2\xeb\x51\x34\xb6\x94\x4f\xb9\x96\x8d\xcb\xc5\x96\x0e\xb9\xe8\xfd\xe2\xae\x11\x80\x2c\x4d\x51\x1a\x77\xba\xf8\xbd\xed\xa1\xe6\xc2\x9e\x9e\x53\x7c\x5f\xee\x74\x38\xb9\x82\x1a\xc3\x94\x78\x45\xfe\x7b\xef\xc3\xe7\xbf\xf7\xf7\xbf\xdb\xdb\xfb\xe5\x45\xff\x3f\x7f\xfd\x7c\xef\xc3\x00\xfe\xe3\xb3\xfd\xef\xf6\x7f\xf7\x7f\x7c\xbe\xbf\xbf\xb7\xf7\xcb\x8f\x6f\x7f\xb8\x3a\x3f\xf9\x95\xef\xff\xfe\x8b\x28\xf3\x6b\xfc\xeb\xf7\xbd\x5f\xd8\xc9\xaf\x2b\x0e\xb2\xbf\xff\xdd\x7f\x74\xf8\x12\x54\xcc\xde\x75\x26\x82\xf1\xea\x3f\x8a\x1a\x51\x1f\xbb\x63\xd6\x25\xe4\x63\xbf\x72\x5e\xf7\xb9\x30\x7d\xa9\xfa\xf8\x90\x57\xc4\xa8\xb2\x2b\xd1\x55\x1d\x7f\x8f\x27\x63\x2a\x25\xa6\x42\x6e\xf4\x86\xcd\x06\x0a\x11\xcc\x1c\x7d\x74\x6f\xb0\x6b\x97\xba\x75\x04\xaf\x72\x3d\x4a\xc2\x91\x43\x86\xf9\x83\x67\x1b\x5d\xba\x8e\xbc\xdb\x54\xa3\x85\x6b\x9b\x6a\xb4\x78\x6d\x53\x8d\x1e\x78\x6d\x53\x8d\x36\xd0\x07\xb8\x4d\x35\xda\xfa\x00\x9f\x88\x0f\x70\x9b\x6a\xb4\xea\xb5\x4d\x35\x6a\x7c\x3d\xcd\x54\x23\xa7\xc0\x57\x79\x46\x1b\x9b\x66\xe4\x1a\xfc\x1f\x26\x89\x2c\x85\xb9\x92\xd7\xac\x65\x54\x76\x25\x03\x73\xe1\x99\x9b\x69\x6d\x76\xa5\x52\x76\xa0\x02\x76\xa7\xfc\xd1\x32\xe5\xd6\xcc\xec\x78\x1b\x1c\xba\x61\xbd\x9d\x69\x8f\x45\x91\xb2\x34\x3c\xcf\x0b\x2b\x63\xd7\x7b\x40\x0e\x89\x62\x09\x2f\xb8\x15\xed\x00\xa6\x03\x9f\xe3\x3e\x09\xfd\x80\xb9\xd1\x2c\x1b\xb9\x9e\xa8\xa2\xaa\x19\x56\x91\x09\xe9\xce\x8a\xa5\x8f\x41\xad\x40\xfa\x36\x96\x44\x4f\x64\x99\xa5\x44\xb1\x7f\x79\x75\xc2\xcd\xe6\x2a\x1e\x21\x76\x84\xc2\xab\x54\x8f\x75\x83\xd3\x82\x3b\xd4\xad\x4d\x12\x70\xec\x63\xc1\x15\x6c\xb6\x4b\x96\x48\x91\x76\xed\xde\x38\x99\x1f\xdf\xaf\xb5\x8b\xe6\xb0\x94\xa4\x25\xde\x00\x85\x90\x34\xe3\x29\x37\xb3\x90\x85\x81\xdb\xde\x2a\xa2\xd8\x85\xd6\x31\x82\xae\x16\x82\xd0\xa2\x50\x92\x26\x13\xa6\xa3\xb7\x41\xb5\xd2\x81\x4d\x84\xfa\xca\xac\x1c\x73\x81\x9a\x25\xfc\xc6\xaa\x21\xd9\x8c\x28\x69\x7c\x42\xd9\x2d\x0f\xbc\x8a\x06\x83\x9f\xa3\x2e\x61\xd4\x0c\xb2\xce\x64\x3c\x04\xce\x8a\x8f\xe2\x3f\x34\x91\x59\xea\x71\x4b\xbf\x7e\x61\x55\xf9\xc4\x71\xb1\x95\xf6\x80\x2a\x69\x24\xc9\xac\x5a\x64\x4f\x80\xdb\x7f\xfc\xc5\x57\x64\x22\x4b\xa5\x07\x31\x84\xc0\x4b\xf8\x0c\x9d\x14\xde\x14\x30\x24\x63\x54\x1b\xf2\xf2\x05\xc9\xb9\x28\xed\x59\xde\x11\xe3\x75\xa5\xbd\x46\x7a\xeb\x5f\xbe\x6a\x39\x5a\x37\x1a\xeb\x62\x06\x8b\xe3\xd6\x02\xfb\xb3\x39\xc5\xd5\xed\x71\x04\xc5\xc0\x1e\x8d\x73\x6a\xac\x3b\x92\xe2\x55\x14\x46\xae\x79\xe7\xff\x56\xca\xe1\xcc\xb4\x87\x81\xf9\x2f\x1c\xa7\x8e\xff\xe2\x3f\x5c\x05\x4b\xb5\x82\x52\x6d\x30\x95\xb5\x77\x8b\x1e\x73\x6d\x1a\xf5\x8a\xae\x70\x63\x1a\xfc\xb8\xed\x61\x3e\xb6\x16\x6f\x27\x45\xeb\x60\x3b\x7b\x5b\xcd\x3b\x95\x93\x84\x69\x10\x45\x1e\x3e\x0d\xfc\xb3\xf8\xd4\x86\x0f\xdd\x2c\xc4\x96\x3b\x11\x59\x3c\xf3\x77\xd0\x19\xb3\x15\xb1\xda\xe8\xf6\x9e\xb1\x3b\xa2\x16\x0e\x56\x97\x11\x9a\x8b\x31\x36\xb2\xcc\xcb\xcc\xf0\x22\xab\x28\x17\x7e\xe0\x0e\xe0\xd8\xe1\x4f\x23\x0f\x33\x45\xe0\x28\x84\x06\x87\xe0\xc8\x5e\x18\x8b\x09\x83\xfd\x18\x95\x3d\xc7\x0b\xaa\x68\x20\x7f\x22\xf3\x9c\xea\x7d\x17\x3b\xa0\x90\xbb\x82\x92\xdd\x1e\xc3\x8a\x66\xe1\xf5\xe3\x5c\x81\x75\x31\xae\x61\x82\x8a\xc6\x41\xbb\xba\xc3\x05\x86\x22\xf2\x26\xa4\xc7\x63\xff\xf4\x39\x8e\x75\x0a\xf1\xf7\x34\xb9\x66\x22\x25\xef\xb5\x27\x5c\x3a\x13\x34\x77\xe0\xea\x85\x92\xd8\xb7\x9b\xa5\x73\xbf\xd7\x3d\xe7\x48\x44\x94\x11\x0f\x02\x85\xfa\xd6\xba\xa8\x58\xea\x8e\xd0\x75\xdf\x6b\xab\x7c\xdd\x2d\xef\x34\x3a\x69\x15\x9f\x26\xcc\xeb\x8e\x76\x02\xeb\x7a\xf9\x69\x63\xc4\x37\xb2\x1c\x87\xc9\x35\xcd\xc4\x5d\x08\x47\x7a\x08\x3e\x02\x8e\x3a\xcd\xac\x88\x9b\x05\x78\x9d\x39\x06\x1b\xce\xd6\xd7\xb2\x5f\x0d\xdb\x03\x34\xed\x5e\x7c\x7f\x5c\x17\x66\x17\x34\x95\x9a\x7c\x9f\xc9\xe4\x9a\x1c\x33\x30\x1a\x1e\xb3\xdd\xbb\x1a\xa6\x4f\xbb\x4d\x63\x4e\xc7\xcd\xf2\x3c\xfa\x24\x97\x82\x1b\xa9\x9a\xc8\xe3\x0d\x02\xdb\xdb\xb6\xda\x5b\x0e\x22\xae\x86\xe9\xb3\x69\xb4\x67\x99\xbc\xa3\x0e\xbb\x13\x46\x14\x88\x18\x18\xd4\x77\xff\x68\x28\x30\xfe\x34\x91\x37\x7d\x23\xfb\xa5\x66\x7d\xde\x38\x4f\xa9\x35\x7d\xae\xd9\x0c\x92\xbe\x3a\xa1\xd0\x8f\x38\x58\xcd\x44\x37\x12\x3c\xe7\xf0\xb9\x55\xe4\x2e\xbe\x3f\xb6\xa7\xf7\x20\x36\x4b\x0e\x98\x49\x0e\x12\x56\x4c\x0e\xdc\x74\x9e\x3c\x59\xbd\x7c\xec\x86\xae\x87\x24\x91\x59\xe6\x70\xbb\xe4\x88\x1c\xb1\x62\x12\x1e\xb1\x19\xb4\x7a\xca\xcd\xd2\x0a\x29\xbb\x69\xac\x14\x89\x08\x3b\xa6\x93\x10\x11\xa3\xab\xe1\xc3\x7a\x41\x6f\x22\x6b\x7f\xc2\x9e\x24\x4d\x7a\xcb\x6d\x04\x79\x37\xa7\x47\xdd\xee\xa5\x1f\x0e\xfc\x3f\x51\xb8\xb9\xde\x92\xce\xe7\x8b\xd6\x44\xf4\xe9\x08\x2d\xcc\x94\xa5\x44\x4e\x99\x52\x3c\x65\x9a\x04\x19\x1d\x3b\x96\x78\xb6\x19\x94\xdf\x76\xc7\x7b\x5a\xf9\x01\x9b\xe3\x53\x88\x84\xb7\x1d\x73\x51\x78\xd3\x34\xe7\x62\x33\xb8\xbc\x21\xbd\x74\x42\x33\x76\xfa\xae\xb5\xe9\x7d\x89\xe3\xd4\xad\x6f\xff\x61\x04\xb2\x7f\x0f\xf0\xfc\x8f\x81\x67\x89\x90\x69\xb3\x68\xd8\x9a\x6d\xe8\x31\x35\xec\xa6\xa1\xe2\xd3\xaf\x44\x7d\xd3\xdf\x83\xe5\xf5\xb4\x6d\xf0\x35\x35\xc8\x88\xf6\x35\xa2\xde\xaf\x4b\x9d\x72\x1c\xd4\x8d\x6b\xd9\x93\x62\xae\xbf\x98\xdf\x9a\x87\xe7\xa7\xe4\x07\x7c\xde\xfa\x3a\x7e\x28\x69\xd0\x92\x39\x96\x39\xe5\x1d\x35\x62\x8f\x1a\x3a\xc5\x2f\x7c\x1e\x1e\x46\xf0\x69\x71\x17\xfa\x11\x1f\x97\x8a\xa5\xc4\x79\x3f\xb6\x6d\x0c\x36\xb8\x8d\x41\xb7\x4a\x71\xa5\x13\x47\x1e\x73\x5f\x19\x53\xe9\xc1\x9e\x8b\x40\x1d\x08\x29\x48\x44\x33\xa1\x39\x64\x1d\x44\x89\x71\xa0\x2c\x43\xfe\x77\x28\x83\x41\xc5\xb9\x47\xde\xc8\x31\x17\x5e\x3a\x49\x97\xec\x32\xa2\x3c\x6b\x47\xce\xad\xa6\xfb\x07\xd3\x74\xb5\xce\x4e\x04\x1d\x66\xcd\x33\x19\xeb\x07\x6f\x46\x21\x4f\x8a\xc1\x98\x07\x29\xd7\xf6\x5f\x72\x79\xf9\x06\x62\xb3\xa5\xf0\x96\x21\x44\x1d\xdd\xb1\x11\xea\x8b\x51\xb8\xac\x4f\x1e\xa0\xcc\xee\xac\x4f\xc5\xa9\x48\xed\xeb\x32\x5d\x4b\x00\x76\x4f\xc1\x2e\x20\xa1\x7a\x0d\xb3\x0f\x87\x8c\x5c\x4d\x78\x72\x7d\x1e\x85\x60\xa5\xb2\x9f\x89\xe8\xa3\x9a\xa2\x31\xff\xdd\xba\x0e\x1c\xf7\x5a\xe7\x5d\xb9\xbd\xae\xa2\x13\xf7\xd2\x91\xcc\x0e\x4e\xa8\xd6\x32\xe1\x55\xcc\x1f\x9c\xc2\xd5\x91\x9c\xc2\x91\xbc\x3e\x32\x80\x96\xf8\x28\xfa\x87\x67\x1c\xa7\xb4\x52\x1d\xeb\x1b\x5c\x78\x6a\xad\xed\xd5\x91\x95\x3b\xeb\xae\x79\x55\xeb\xa7\xe9\xad\xbe\xb9\xf0\xb3\xaf\x07\x75\x8c\xe2\xf5\x79\xd7\xc0\x79\x91\x55\x42\x5f\x4d\xd7\xdf\x63\x2d\xc4\x6a\x5e\xac\xbd\xcc\x0b\x37\x97\x7b\x83\x9f\xb9\x80\x34\x08\x95\x42\x16\x65\x86\x59\xab\xed\xdb\x8a\xfa\x68\x1e\x3e\x67\x0d\x01\xea\x4d\x6b\x46\xf4\xd0\x72\xbe\xe7\xd1\x97\x28\x32\x08\x5e\xfc\xe5\xab\xaf\x9e\x7a\xa7\xa2\x76\x8e\xb3\x75\xb7\x2a\x6a\x15\xea\xda\xa2\x14\x6c\x51\x0a\xee\xba\xd6\x1e\x89\xfd\xf4\x38\x04\x9d\x14\x89\x75\x51\x20\xd6\x16\x69\xa0\x65\x71\x59\x37\x85\x65\xad\xb1\x04\x1e\x15\x41\xa0\xa3\x1a\xab\xf6\x68\x01\x5b\x8c\x80\x3f\x06\x46\x40\x77\xb5\x55\x5d\xe1\x01\xb4\xaf\xa9\x7a\xfe\xb5\xff\xad\xc5\x44\xdb\x0a\xf3\x87\xd7\x95\x77\xd5\xbf\xa2\x2b\x3f\x7b\x67\x8e\x81\x9a\x57\xd7\xd9\xbb\x9e\x33\x30\xf3\xba\x42\x7c\x37\xd2\x0a\x8d\x35\x5a\xbb\xa4\xb5\xb3\x00\xa7\x22\x1b\x9d\xc1\x75\xae\xc1\x91\xde\x5d\xce\x85\xd8\xc3\xc7\x9b\x1f\x59\xdf\x86\x98\xb7\x6d\xd4\xb7\xf1\xc7\x70\xdd\x12\x7f\xd4\x35\x8c\x57\xef\x11\x04\x49\x08\x2a\x98\x1c\xc6\x7d\x54\xaa\xfd\x7f\x78\x7e\x4a\x12\xc5\x00\xd2\x80\x66\x7a\x40\x96\x68\x68\x3e\x52\xe3\x34\x3a\xaf\x99\x51\x63\x58\x5e\x98\xb6\x0c\xb7\x0d\x3f\xfe\xc1\xc2\x8f\x1d\xc7\x0c\x7e\x0a\xc3\x79\x6f\xd1\xa4\xcc\xa9\xe8\x5b\x69\x01\x81\xc8\x5a\x3e\xc7\xdc\xc1\x37\x20\xbe\x06\x0e\xa9\x49\x15\x43\x70\xf3\x52\xf0\xdf\x4a\x56\xf9\x17\x82\x7a\xb1\x01\xa1\x16\x98\x47\xc7\xb4\x43\xd5\x69\x4e\x8a\x24\x72\xa1\x94\xc9\x11\x24\xd0\xd1\x0b\x8c\x48\xff\xaa\xf9\xca\xcc\x84\xa1\x9a\x76\x0e\xe0\x00\xd5\x5d\x75\xfb\x0e\x0d\x3c\x9a\x65\xf2\x06\x9f\x1d\x2b\x1e\x76\xfd\xec\x5c\x1c\x1e\xc7\x90\x91\x9c\x2b\x25\x95\x0b\xf1\xc4\xd3\xc1\xb4\x1c\x6b\x27\x32\x85\x06\x97\x72\x59\x15\x97\xcc\xc4\xac\x62\x24\xa1\x02\x0b\x17\xed\x7f\xfb\xa4\x64\xec\x7f\xe6\xe4\xdd\x90\x4d\xe8\x94\xcb\x52\xe1\xaf\x8d\x24\x3b\xee\x2b\x38\x72\x67\xb2\x0c\x6e\xee\x12\xea\x94\xc2\xdb\xe9\x25\x74\x3a\xab\xbe\x04\x03\x35\x95\xde\x7f\xd8\x67\x1f\xb9\x36\x8b\xef\xe2\x49\xe4\x1b\x24\xac\x83\xf3\xa6\xba\xb0\x07\xec\x4f\x8d\x6b\x4e\xeb\xfc\x16\x8f\x56\x57\x49\xa7\x97\xf0\xd5\x7d\x0a\xa9\x43\x6a\xc1\x52\x71\x5f\x14\xf6\xf4\xd2\x3d\xf1\x2d\x1b\x76\x66\xda\x6a\xc4\x4f\x45\x23\x0e\x09\x12\x19\x4f\x66\xa7\xc7\xdd\xe8\x7c\x21\x31\xc2\x0e\x4a\xbe\xa7\x9a\xa5\xe4\x2d\x15\x74\x8c\xce\x91\xbd\xcb\xf3\xef\xdf\xee\x5b\x26\x01\xe7\xcb\xe9\xf1\xd2\xec\x89\xcb\x78\x66\x67\xeb\x2a\xdf\x26\xf3\x34\xea\x4c\x2b\x78\x20\x95\xd6\x56\xc0\x4e\xc2\xc9\xde\xa6\x65\xd7\x22\xb8\x11\xa6\x43\x78\xa4\x32\x3d\x2f\x5e\xa7\x79\x7a\xfd\x98\xaf\x1b\xf9\xaa\xef\x7a\xa7\xd5\x02\x4d\x2b\x04\x93\xe6\xd6\x5e\x51\xc3\xc6\xb3\x63\x56\x64\x72\x66\x97\xfb\x3c\x72\x9d\xe3\xad\x43\x3c\xea\xd5\x90\x26\x44\x95\x19\xc3\xee\x35\xf3\x10\x61\x82\xb1\xb4\x92\x53\x5c\x68\x43\x01\x20\x0c\xc7\xbf\x73\x46\x2b\x1f\x30\xab\x1e\x25\x7d\x9c\xe7\xbd\x77\xd5\xe1\x14\xed\x86\xba\xf3\x27\xab\x1f\x26\xf0\xf8\xfb\x39\xf4\x21\xc1\xc3\x95\xc3\x84\x75\x06\x87\x3d\x7d\x51\x66\xf6\xe8\xc8\xd2\xb9\x26\xa2\xa0\x5b\xb9\x35\x46\x64\x06\x90\x00\x76\xf6\x3d\x32\x2c\xad\xe2\xc5\x74\xcd\xbf\xbc\x08\x4b\x79\x33\xc1\xb8\xb1\xfd\x11\xa1\x45\x91\x71\xcc\xeb\x95\xca\x05\x7f\x23\x6f\xe3\xe2\x6d\xab\x08\x92\x07\xea\x1f\x0f\xd3\x37\xfa\x64\xca\xd4\x70\x15\x4c\x85\x87\xaa\x12\xb4\xe0\x10\x3b\x59\x59\xf3\xa8\x83\x42\x9e\x9f\xe2\xaf\xbd\xa5\x16\x9b\x66\xfe\x4b\x5c\x41\xb7\x36\x1e\x50\xd0\x75\xa5\x41\x6b\x23\xa0\x02\x1d\x9e\x9f\x22\x0c\x95\x03\x06\xaa\x5c\x16\x56\xb7\xa7\x98\x1c\x58\xa1\x11\xd2\xb1\x1d\xd1\x10\x29\xc2\x43\x99\x28\x73\x86\x60\x42\x55\x3b\x2b\x6b\xf0\x89\x59\x35\x7a\xe5\xf1\xb0\xf6\xc9\xea\xea\xc4\xc3\xc3\xe8\x0f\x0c\x9b\x3f\xf8\xe4\x11\x52\x5c\xb8\xd7\x7c\x7f\xf1\xa6\xd9\x22\x9e\xd5\xc7\x70\xe0\x31\x0c\x70\xf2\x0a\xaa\x0c\xa7\x19\x29\x55\xe6\xc3\x70\x98\xf4\xee\xd2\xd2\x26\x74\x1a\x01\xec\x0c\x08\xf9\x0c\x57\xce\x11\x16\xf7\x27\xb6\x77\xc5\x95\x1f\x95\x59\xd6\x23\x23\x2e\xa8\x15\xbb\xac\x20\x71\x38\xe8\x92\x8b\xc4\x9a\x5f\xd6\xd6\x77\xfd\x5a\x60\x46\xde\x28\x0b\x9b\x14\xa2\x8c\x10\x2d\x65\x59\x0a\xa0\x8b\xf0\x08\xbb\x61\x13\x70\x11\x58\xab\xf1\x28\x2b\xb5\x61\xea\x42\xda\xc3\x20\xca\x6b\x01\x38\x0a\x1a\x7f\xfd\x3d\x17\x29\xa4\x30\x5d\xc0\xc1\x91\x50\x41\x18\x07\xe7\x8b\x1d\x12\xe2\xd4\x96\x77\x2a\x86\xda\xd3\x65\x32\xb1\xaf\xb4\x53\xc8\x54\xef\x58\x31\xb2\x83\x2e\x3a\xbd\xb3\x6f\xff\x9a\x7f\x07\x4c\x53\x89\x7e\x77\x40\x0b\xbe\xb3\xdf\x23\x40\x20\x08\x9c\x49\x33\x79\xba\x7c\xe8\xdf\x15\x6c\xe2\x46\x5c\x78\x11\x8f\x00\x3c\x28\xaa\xee\x5f\x37\x13\x6e\x58\x68\xbe\x8d\x9e\x9d\x80\xaf\x32\x2f\xac\x09\x39\x14\x84\xe5\x85\x01\x6f\x31\xc9\x19\xf5\x21\x64\x36\x65\x6a\x66\x6d\x72\x00\xa2\x78\xf2\x9b\x3f\xf0\x63\x2b\x82\xcf\x75\x36\xaf\x98\x1c\x76\xd8\x02\x71\x77\x3f\xdb\xad\xd9\xf9\x59\x16\x49\xf3\x27\x4b\x4a\x38\x5e\x1b\x91\xf1\x27\xfb\xcb\x3a\x09\xf1\x23\x94\x96\x41\x7e\xbc\x79\xe3\x02\x19\x48\xab\x1f\xb9\x48\x51\x45\x3d\x34\x46\xf1\x61\x69\xd8\x05\xb3\x13\x4e\x30\xe5\xc1\x77\xe1\x73\xd9\xd1\x6e\x25\x96\x92\x1f\xe6\xfe\x14\x49\xbf\xa8\xd8\xae\xaa\x8c\xde\x31\xbc\xd7\xe5\x6f\x1b\xea\xce\x01\x9c\x41\xf0\x56\xa6\xcb\x37\xd5\x5c\x65\x48\x75\xb3\x53\x55\xa2\xce\x96\x7e\x2c\xa7\xc4\xce\x8a\xa5\x9a\xfe\xdd\xcb\x71\x07\xe9\x6f\x9b\x49\xe5\x1b\x00\x09\x1a\x7d\x73\x35\x2b\x98\x43\xda\x26\xa3\x8c\x8e\x2b\x36\x02\x79\x88\xea\xd3\xd1\xe5\x4f\xfe\x15\x34\xe1\xcb\x15\xd9\x7b\x35\xdd\xfb\x74\xdb\x7e\x45\xa5\x5b\xef\xb0\x0f\x59\xfa\xe5\xfd\x0a\x6e\x18\xfc\x76\x6e\x5a\x25\xec\x67\xee\x74\xa9\xdd\x46\xff\x2b\x87\xf0\x45\x23\x4e\xf0\x00\x62\xde\xdc\x84\x4c\x24\xd0\x50\x2e\x7f\xaa\xb1\xc9\x3d\xf3\xbd\x85\x69\xaf\xd9\xec\x46\xaa\xe5\x68\xe0\x8d\xf9\xeb\xce\x27\x62\x77\xfe\x7b\x37\xc8\x5b\x5a\xd8\xd7\xae\xf2\x3c\x51\xe0\xb9\xa8\x23\x5a\x05\x98\xa1\xe5\xb3\xe2\xa4\x1a\x53\xc1\xff\x8d\xc9\xb1\x89\xdd\xc7\x52\xd9\x3f\xf7\x30\x72\x81\x16\x7d\xc6\x12\xb3\xef\xf8\x6f\xa9\xdc\xbb\x87\x41\x69\x9a\x72\xd4\x2b\xce\xef\xe1\xa5\xbb\x89\xc0\xc5\xf5\x63\xd0\xfc\x8e\x8d\x75\x3f\xef\xdf\x1d\xfa\x5c\x41\x36\x97\xea\x8e\xec\xa6\x3b\x7f\x9f\x53\xee\x3a\xba\x6e\x1c\x55\x58\x4e\x79\xd3\xd7\xc2\xab\x05\x5d\x73\x6a\x4a\xc5\xcd\xd2\x03\xe9\xee\x1f\x72\xf1\x63\x39\x64\x2e\xda\xfb\xe0\x9f\x0b\x48\xde\x3b\x3c\x3f\xed\x76\x39\x16\xe1\xa5\xdd\x04\xad\x46\x43\x4a\x41\xf3\x21\x1f\x97\xb2\xd4\xd9\x2c\x76\x57\x52\x08\x56\x5b\x73\x1f\xfd\x35\x62\xd7\x10\x2a\xa4\x98\xe5\xee\x56\x91\x64\x65\xca\x6a\x23\x42\x4c\x6f\x2a\x79\x4a\x68\x69\x64\x4e\x0d\x4f\x48\x22\xf1\xbb\xfa\x48\xa5\x66\x84\xde\xf2\xdb\xa4\xd4\x46\xe6\x24\xa7\x4a\x4f\x68\x96\xdd\xb6\xc6\x1d\x9c\x6a\x77\x01\x68\xf7\xe1\xfd\x6f\xfd\x72\x8a\xb3\x6e\xc8\xdf\xf7\xe0\x85\xaf\xc0\xdf\x76\x72\xad\x06\x98\xde\xce\xa5\x2b\x8c\xe1\x4a\xe2\x97\xc2\xf5\xdc\xb3\x30\xf7\x51\xe7\xae\x9d\x7b\xef\x7b\xdd\x21\x0d\xef\xfc\x2d\xa4\xce\xb2\xf4\x34\xa7\xe3\x15\x14\xc9\x37\xd6\x6e\xa0\x62\xe6\x7f\x86\x28\x92\xba\x47\xa4\x72\x39\x20\xa1\x27\xb7\xfb\x2a\x00\x90\x2a\xf2\x0e\xc2\x6c\x52\xb9\x64\x6a\xc7\xa5\x90\x5a\xcf\xd4\x48\xaa\xdc\xea\x75\x5c\x91\x51\x29\xd0\xb4\x70\xb9\xd7\x60\xac\x38\x2f\x0e\xcd\xb4\x0c\x3b\x10\xe2\x76\xc2\x4f\x82\x50\x4d\x6e\x58\x96\x0d\xc8\x61\x96\x39\x78\xcb\x08\x1a\xa1\x2a\x79\xae\x32\x04\x86\x33\x92\xf2\x31\xd3\x86\xec\x5d\xfe\xed\x70\x1f\x4e\x6d\xf0\x70\xcc\x88\xa1\xbe\x4e\xac\xee\xb9\x81\xf3\x3f\x2d\x41\x4f\x48\xa8\xa1\x99\x1c\x63\x90\x1c\x3c\xb8\x22\x25\x45\x46\x67\x00\x52\x5f\x50\x05\x89\xa2\x09\x7a\x6f\x88\x2a\x05\xc0\xf3\x7e\xd2\x13\xe7\x7e\x51\x70\x17\x82\x6e\x1f\x78\xb2\xe1\x56\xbf\x07\xb5\xf4\x71\x8f\x32\xc5\x8a\x8c\xde\xe2\x6f\xb8\xa3\xec\xd7\xaa\xb9\x60\xc2\x4a\xc1\xc2\x18\x03\x72\x89\xbc\x93\x53\x93\x60\x08\xf3\x9f\x39\x33\x34\xa5\x86\x0e\xac\x2d\xf8\xcf\x7a\x61\x9a\xcc\x52\x3b\xd0\xed\x0b\x7d\xcb\x9c\x51\x5f\x5c\xde\x8c\xbd\xbe\x0b\xad\x52\x1b\x6e\x07\xfd\xdc\xef\xc7\x3b\x1d\x1c\x2d\xe5\x13\xbc\xfe\xc9\x47\x6b\x8a\xdd\x19\x5d\xab\xcd\x75\xfe\x47\x75\xff\x43\x56\x7f\x13\xc7\xad\x39\x03\x5c\xc4\x2b\xd7\xcf\xc7\x7f\x02\xce\xd5\xc3\xb3\xe3\xdb\x1d\x61\xf7\xbb\x0c\xee\x71\x11\xd4\x43\x06\x77\x4c\xcf\xbb\x9e\xdd\x37\xf5\xb8\x81\x2f\x4e\x81\xfa\x3d\x2c\xf5\xa0\x1e\x3c\xc5\xdf\x8c\x0b\x56\xaf\x3c\xc4\xdf\xdd\xee\x1f\x59\x29\x70\xb3\x4a\xb8\xe6\xbe\x42\xaf\x7e\x98\xec\xad\x37\xad\x16\xbd\xb9\xb7\x18\xab\x46\x70\x57\xed\x08\xc5\x95\x40\x79\x28\xd9\xf0\xce\xd3\x40\xec\x55\xa3\x5d\x2b\xfa\x77\xfc\xab\x3e\x60\xa2\x61\x29\x6b\x69\x44\xd7\x6c\xb6\xab\x5d\x2d\x8a\x14\x7a\xc2\x0b\xac\x16\x74\x01\x0a\xb7\xba\xe4\x27\x9a\xf1\x34\x0c\x81\x5c\x7d\x2a\x7a\xe4\x4c\x1a\xfb\xcf\xc9\x47\xae\x0d\x9a\x9f\xc7\x92\xe9\x33\x69\xe0\x93\x4e\x5e\x15\xa7\xf0\x80\x17\x75\x06\x30\xfa\xb8\x61\x5f\x45\x66\xb2\x7f\xa1\x53\x27\xf6\x3c\x51\xb8\x26\xa7\xc2\x6a\x04\xee\x8d\x42\x15\xad\x76\x43\xf8\x42\x11\x21\x45\x1f\xbc\xdf\x4b\xc7\x70\x84\x90\xaa\x46\x87\x3b\x86\x73\x43\x61\x3a\x1f\x7c\xc3\xb5\x17\xe2\xe1\xcc\xa6\xde\xed\xc6\x13\x92\x33\x35\x86\x78\x4e\x72\x4f\x3c\x63\x55\x57\xe4\x4a\x0e\xc8\x7b\xd7\x0a\x44\xe6\x9b\x5b\x1d\x17\x0b\x8b\x14\xdd\x8f\x62\x29\x47\x6f\xc6\xff\x58\xe9\x03\x94\xfa\x5f\x28\xa5\xd6\x03\x72\xe8\x9b\xa5\xc4\xdf\xb9\xb8\x56\x3c\x8c\x1d\x81\x6b\x62\x45\xc9\x94\x66\x0c\x91\xe3\xa9\x08\x55\x50\x72\xb4\x20\xd8\x7b\xae\xa4\xda\xee\xd9\xa0\x32\xed\x5c\xb3\xd9\x4e\x6f\x61\x69\x77\x4e\xc5\x4e\x55\x02\x57\x5b\xcc\x20\x44\x41\xdb\xda\x81\xef\x76\x9a\x9f\x05\x77\x0a\xcb\xd5\xdd\x2b\xf7\xae\x9b\xbe\xe6\xcb\x03\xd3\x4b\x95\x8d\x3d\xbd\x6f\x49\x08\xc1\x60\x45\x72\xa9\xc0\x9d\x69\x3f\x8d\x81\x34\xac\xaa\x7a\xcd\x8b\xa2\xc2\x1d\x29\x8b\xb1\xa2\x29\x23\x63\x45\x8b\xc9\x43\xd5\x12\xd4\x6d\x96\x0d\xff\x64\x14\xdd\x5b\x88\x7f\x87\x45\x57\x23\xbf\x37\x40\xbc\xe1\x0d\x9b\xe5\x46\xd1\xa2\x60\x8a\x50\x25\x4b\x70\xda\xe5\x53\xa6\x06\xfe\x16\x4c\xb9\x08\x7e\xe6\x44\x2a\xc5\x12\xe3\x4d\x74\x97\x15\x8c\x05\xab\x22\x85\x6a\xd4\x07\xab\x7d\x37\x6c\x38\x91\xf2\x1a\xaa\xe6\x80\x1d\x1f\xd1\x0b\xf2\x33\x3e\xeb\xb8\xfa\xcc\x1b\xb4\x9a\xa4\xcc\x50\x9e\x41\xae\xc9\xbb\x37\x6f\x5d\x36\x8a\xd7\x26\xfc\x2c\x97\x27\x76\x74\x60\x86\xd0\xd4\x65\x49\x5d\xb0\x29\x67\x37\x8e\xfe\xb7\xe5\x91\xf4\xc9\x98\x09\x48\x9e\xb8\x23\xc9\xa8\x4f\x34\x4f\xd9\x09\x14\xe3\xde\x3e\x50\x0b\xf7\xfd\x2d\x73\xbe\x4f\x84\xdc\x7d\x8e\xdc\x7b\x86\xac\x70\xd6\x07\x23\xfc\x5c\xaa\x3b\x80\x7f\x56\xab\x0d\x5e\xad\xee\xd7\x65\xa7\xbf\x22\x5f\x7d\xf5\xe5\xad\x37\xe5\xf4\x23\xcf\xcb\xfc\x15\xf9\xcb\x9f\xff\xfc\xe5\x9f\x6f\xbf\x8d\x0b\xbc\xed\xe5\xed\xef\xe7\xf6\xfc\xd1\xc5\xf1\x06\xd0\x3b\x0d\xd9\x7e\x77\x87\x06\x57\x18\x6a\x44\x79\x56\x2a\x97\x92\xba\xa2\xa1\xf2\x3a\xfe\x0d\x84\x75\xaa\x62\x0a\xea\x47\xf4\xc9\x68\x2e\x49\x6d\xc4\x05\xd3\xd0\x1a\xa5\x14\x8a\x25\x72\x2c\xf8\xbf\x59\xea\x3b\xa3\x40\xe2\x09\x00\xac\x7b\x16\x27\x4c\xa4\xd8\x93\xd2\x9e\xbc\x13\x2a\xd2\xec\xae\x84\x84\x15\xde\x34\xde\xc1\xad\x48\x06\xe7\xdf\x83\x08\xf6\xb6\xfa\xc5\x1c\xb9\xa0\xb3\xa6\x0b\x82\xe1\xb9\x8a\x64\x6b\xf5\xa6\x28\x18\x2f\xef\x30\xef\x97\xcc\x71\xc1\xfa\x44\xc3\x19\x3e\xfb\xad\x64\x6a\x06\x85\x23\x95\x79\x11\x25\xaa\x5d\x55\xb8\x02\xfe\x35\x9c\x5e\x87\x48\x2e\x73\x16\x79\xa5\x4a\x55\xe9\x28\x73\xcf\x86\xdf\x30\x0c\xe2\xfb\x70\x16\x39\x24\xa2\xcc\xb2\xdb\x6e\x15\xf2\xae\xc0\x57\x4c\xbb\x7b\x0c\xda\xd5\x2c\xcd\x55\x9d\x13\x4b\x28\xfd\x49\x5d\x14\xf1\x8b\x77\x64\x50\x6c\xb6\xd3\x22\x7e\xe1\x95\x72\x4e\x57\xcf\x37\x5d\x0d\xaf\x66\x05\x67\x06\x5e\x0f\x49\x48\x5d\x11\x65\xe6\x31\xdd\x1b\x78\x3d\x28\x7f\x68\x35\x57\xc7\x92\xa9\x6f\x9c\xc3\xa3\xc1\xcb\xaf\xe2\xfc\x58\xf2\xea\x5b\x17\xc8\x02\xc1\x57\xcd\xc9\x7a\x40\x3e\xd6\x8a\x2b\xb9\x82\x6b\x04\xaf\xad\x83\xe4\x41\x27\xd1\x0a\x82\xf9\x61\xce\x92\x95\x57\x55\x31\x2e\xa6\x12\x51\x9a\x1f\xa4\xc3\x5d\x2c\xfc\x70\x4e\x95\xbb\x01\xc9\xea\x74\xb9\xa0\xfc\xc6\x2a\xad\x35\x68\x49\xa9\xef\x77\xb9\xdf\xfd\x06\x77\xd7\xa6\x74\x62\x83\xd4\xdf\xbc\xcc\xd8\xcf\xdc\x4c\xde\x79\x34\x76\xc7\xd5\xa6\x2c\x32\x78\xd9\xe8\x0b\xcb\x42\x17\x95\x66\x78\x8a\x1d\xbc\x58\x22\xf3\x9c\x89\x14\x53\x99\x72\x7a\xcd\x48\xd5\x08\xd2\xea\x78\xa0\x06\xc3\x70\xec\x63\x41\x45\xa5\x27\x4e\xad\x2c\xbf\x8b\xa3\x56\xe4\xa7\x55\xcf\xda\x95\x8b\x3e\xee\x2e\xf6\x88\xaa\x35\x6a\x45\x1d\x64\xc8\x32\x09\x4e\x1c\xcc\x57\xc5\x5c\x6b\x77\x2b\x88\x64\xf7\xa9\x3b\xf5\x1c\xf2\x23\x13\xe3\x0a\x67\x4a\x67\xd0\xa4\xd5\x49\x60\x29\xd8\x80\x5c\x38\x15\x66\x35\xad\x68\x15\x71\xba\xa2\x28\x5d\xf9\x40\xac\xb0\x19\x1e\x4c\x59\xff\xbb\x98\xb6\x53\xff\xd9\x2a\xd4\xf5\x37\x3f\x67\xfa\x86\x4e\x09\x0f\x23\x6f\x7d\x4b\x57\xa7\x42\xa0\xed\x9c\xf0\x4a\xb0\x05\x30\xb8\xea\xfa\xe4\xe8\xe2\xe4\xf0\xea\xa4\x47\xde\x9f\x1f\xc3\xbf\xc7\x27\x6f\x4e\xec\xbf\x47\xef\xce\xce\x4e\x8e\xae\xac\x1e\xf1\x19\xe2\xc0\x5b\x33\xce\x52\xd7\x9e\x47\xb2\x2e\x2d\xa8\x98\x91\x51\x69\xac\x38\xa8\x1e\x56\x9b\x05\x45\x1f\x00\x4d\x53\x6b\x32\x3e\xb9\x35\x5c\x4e\xf0\x79\xb7\x49\xdc\xec\x02\xa1\xf3\x5d\x31\xd7\xfd\x6a\xd2\xca\x4c\xb2\x72\x55\x44\x6d\xca\x3b\x0d\xcb\x21\x3e\x08\xf2\x5a\x2a\xe2\xfa\x7c\xbd\x22\xbb\x85\x4c\xf5\xae\x2b\x3a\xb1\xff\x3d\xc0\x8f\x0e\x32\x39\xde\x0d\xb5\x28\x8c\x64\x72\x4c\x74\x39\x0c\x35\x42\x70\x9a\xc2\xdd\x9f\xf9\xdb\x6a\xa5\x15\xbd\x50\x28\x14\xfd\x2a\x0c\x5e\xfb\x4d\x7c\x43\x3c\xee\x01\x34\xf9\xaa\xdd\x69\x3f\x98\x1f\xf0\xb3\x83\xe5\x33\xf0\x8a\x13\x57\x73\xbf\xf8\x20\x2c\xbb\xde\xf0\x2c\x4d\xa8\x4a\x17\x78\x16\x0e\x37\x5c\x72\xa0\x1e\xe2\xe6\x62\x8f\xe4\x6a\x70\x07\x9e\x21\xa7\x4c\x65\xb4\xc0\x3c\x75\x00\x2e\x86\x04\x28\x78\xc8\x31\x2b\x18\xd4\x69\xf9\xae\xdd\x4c\x24\x99\x04\x9c\x0e\x3c\x19\x7b\xf5\x57\xc7\x84\x28\x0f\x4a\xe8\x8a\x7d\xaa\x1d\xb2\xb3\xb1\x62\x0e\x92\x9d\x1f\xc4\xbd\x98\x1e\x7d\x2b\xd8\x4b\xa8\x1e\x41\xa3\x31\x68\xbe\x8c\xec\xb8\x2a\xb8\x9d\x1e\xd9\x09\x78\x26\xa9\xd3\x92\x77\x3e\xdb\xa9\x6e\x88\xeb\xa8\x40\x49\x76\x81\xa9\x3e\x3c\x27\xae\xb6\x84\x05\xf6\xe1\xb3\xf0\xe8\x0a\x93\xc6\x1e\x6d\xce\x89\x05\x73\xa8\x0f\x34\xa8\x4d\x64\xe1\xa9\x55\x09\xe0\xbd\x4f\xb4\xd3\x8f\x7e\x6e\xa0\x5c\x1e\x4b\x09\x1d\x71\x54\x54\x71\x33\x20\x97\x35\xe6\x09\xe1\xbf\x18\x34\x87\x2b\x52\x50\x65\x4d\x11\x7f\x67\xbd\x5f\xd8\x67\xf7\x76\x0b\x5b\x81\x09\xa2\xf8\xca\x8a\x5a\xfb\x65\xf8\xc5\x51\x46\xb5\x5e\xe2\x79\x05\x41\x60\x07\x26\x0c\x47\x26\xd4\x07\x9f\x00\x84\x7a\x42\xa7\x77\xc0\x25\xac\x30\x69\x43\xd5\x98\x99\xbb\x23\x23\x54\xcc\xde\xdd\x09\x93\xd6\x5f\x19\x58\xb5\xbf\xda\x6e\xfa\xd8\xaf\x40\xb9\xfa\x5c\x98\xbe\x54\x7d\xfc\xc9\x2b\x62\x54\x79\x5b\x8c\xcb\xf0\x9c\xc9\xd2\x5c\xb2\x44\x8a\xe5\x75\x15\xee\xbe\xce\x42\x3d\x0f\x28\x36\x71\xd1\xc6\x43\xaf\x46\xf8\x8a\x93\xd8\xc9\x5e\xe9\x18\x3e\xc2\x58\x07\x69\x79\xf7\xe6\x6d\x9b\xc5\x26\x50\x66\x7d\xf7\x4a\xfe\xe4\xc4\xbe\x18\x87\x99\xba\x99\xdf\xf9\xb3\xb7\xa5\x79\xf8\x8f\xfe\x3f\xe6\xae\x2c\xb7\x6d\x1e\x08\xbf\xe7\x14\x7c\xfb\xff\x02\x8d\x7b\x86\xc2\x79\xeb\x82\xc2\x4e\x0f\xc0\x48\x74\x2c\xd4\x96\x0c\x52\x8a\xbb\xa0\x77\x2f\x38\x33\xa4\x4c\x99\x9b\x22\xd9\xb1\x1e\x6d\x72\xb8\x88\x43\xcd\xfa\xcd\xd2\x7a\xae\xe2\xad\x69\x33\xe2\xc0\x1c\xc1\xf5\xab\x96\xb7\xdd\xd9\x69\x70\xde\x0d\x5d\x96\x6b\x4c\x6c\x23\x99\x7e\x0d\xfd\x4e\x8d\x7c\xe7\xf8\x04\x88\x73\x0b\xed\x4c\xc8\xe4\x82\x51\x47\xcd\x9f\xad\xe4\x15\x2a\x90\xbc\x68\x3b\xc8\x9d\xe6\x2d\x85\x57\x12\xbc\xce\x9d\x6f\x19\x5e\x95\x31\xa6\x26\x16\x42\xb6\xea\x33\x57\xed\xf7\x43\xc9\x03\x39\x54\x83\xb0\x49\xd5\x02\xc3\xa0\x60\x7d\xac\x45\xa9\x6f\x78\xda\x02\xa4\xc7\x8e\xfa\xea\xed\x90\xe2\x58\x4f\x7e\xcf\x40\xba\xfb\xbd\x1e\xca\x3f\xeb\x55\xa3\xf7\xe4\xa3\xf7\x02\x72\x03\x46\x52\xb3\xd5\x9f\x13\x09\xd4\x58\x2d\x7e\xfa\x34\xee\xe9\x33\xde\x09\x5e\xfb\x83\xf6\x07\x27\x0a\xda\x8d\x3f\x43\x34\x00\x3b\x6e\x2b\x2d\xb2\x62\xae\x99\x62\x46\x84\x2a\xc5\x4e\x04\x52\xce\x26\x06\xb4\xd2\x08\x0f\x34\x40\x56\xb0\xd5\x37\xb7\x8f\x35\xe8\x93\x10\x4e\x29\x1c\xbd\xb0\x4c\xd2\x83\xd5\x9a\x86\xab\x02\xf1\xe5\x69\xd7\x14\x3f\x10\x64\x0c\xf0\x06\xaa\xdf\x42\x9a\xe8\xf7\xca\x56\xf5\xa2\xca\x53\xcf\xa6\x2a\xa6\xd9\x37\x53\x7e\x08\xa8\x68\xda\x7a\x03\x2d\xfd\x46\xf6\x96\xc5\xae\xa6\x1c\xbe\xeb\x04\xd0\x1a\x45\x05\xb2\x06\x1c\xcf\xc1\xb9\xce\x82\x81\x36\x80\x81\x48\x2a\x23\xdf\x53\x8e\xcd\x87\x4f\xe1\x7c\x94\x59\x83\x62\x63\x59\x31\xd8\x02\xb6\xaf\x2e\xa2\x50\x38\xd1\xfc\x99\x5c\xcb\x57\x22\x4f\x86\xe5\x0b\xe9\x76\xca\x39\xd4\x66\x0d\x71\x9c\xdd\xdb\x17\x4c\x46\xe8\x9f\x31\x3e\xbc\x5c\xf0\xd5\x51\x5e\xa6\x7a\x0c\x48\xa6\x0b\x6e\x62\xd5\x0e\x4a\x35\x45\x4f\xfc\xa6\x91\x41\x05\x66\xbe\xc9\xc7\xb3\xaa\x92\x84\xb4\xf4\x19\x8e\x5d\x3b\x4f\x21\xd2\xb7\x97\xed\xf2\x9e\x71\xb6\xad\x54\xdb\x48\x72\xad\x41\xf1\x30\xc9\xa1\x42\xa9\x3f\x06\x6c\x9e\x68\xb8\xa5\x9d\x02\xe3\x87\x83\xe0\xb6\xd8\x10\x7d\x9b\xa0\x5a\x90\x14\x45\x23\x4b\xef\xc4\x8c\x76\xef\x95\xa5\xbc\xc3\xcf\x90\x21\xba\xe3\xaa\x7d\xb4\x73\xd0\x02\x42\xe6\x6d\xec\x8a\x3f\xb4\xc4\x7e\x35\x06\x6e\xa6\xa9\xfb\x3f\x1b\xc6\x6b\xb4\x6a\x4c\x93\xc1\xd3\x42\x46\xbf\x36\x94\xe6\x5e\xb5\xae\xa3\x95\xdc\x4e\x96\x78\x9d\x99\xef\x85\x52\xd1\x74\xa7\x41\x90\x06\xe0\x04\x33\x8b\x13\x4c\xdd\xcd\xc7\x1e\x05\x04\x0c\xc7\x34\xa8\x60\xbf\xc2\x47\x8d\x81\x98\x80\x06\x05\xcb\x56\x93\x5e\xd9\x61\xcb\x55\xee\x62\x2c\x17\xd9\x40\xe3\x6c\x76\xc8\x9c\x8d\x14\x5c\xc5\x12\x36\x07\x7b\xfb\x24\x2b\xb1\x61\x4b\xbe\x17\xbb\x25\x57\x73\x6e\x2e\xdc\x00\x0b\x26\x16\xcf\x0b\xf6\xdf\xea\xc4\xdb\xfa\xb5\x69\xbf\xc4\x0a\x36\x24\x30\x0a\x72\x38\xfa\xa2\xbc\x3c\x59\x49\x48\x73\xee\x44\x9e\x9d\x3c\xc3\x08\x87\xde\x04\x6f\xc6\xb3\x8e\x43\xfc\xe8\x72\x62\x27\xc1\xe2\x57\xbc\x96\x23\x13\x29\x95\x21\x2e\xbc\x65\xfe\x4b\x2c\xc9\x92\x58\x7b\x4d\x26\x67\xab\x7b\x74\x34\x57\x30\xfb\x9f\x06\xd8\x61\x65\xfe\x4a\x69\x15\x6c\x4e\xb1\xe5\x6d\x53\xfe\xe9\x05\x06\xff\x8f\xc8\xe5\xf7\xf1\xaf\xf0\x54\x38\x81\x12\x1c\x2d\xfa\x04\x5c\x33\x00\xe3\xc1\x8c\x4a\xb6\x0e\xb2\x01\xd0\xb9\xd8\x50\x95\x33\x6a\xe3\x9c\x8f\xff\xa1\x8e\x9c\x78\xc1\xaa\x8d\x90\xf0\x21\x58\x2d\x94\x66\x8a\x77\x91\xe1\x33\x15\xaa\x3c\x65\x2a\xad\xe8\x26\x95\x58\x96\x7e\xb5\xa6\x51\xec\x05\xe3\x93\xab\xb3\x65\xe8\xc4\x23\x94\xb5\xb4\xc6\x33\x82\x58\x52\xfc\x1b\x49\xcf\x6f\xc0\x1d\x3e\x03\xe4\x61\xdd\x65\x05\x97\x34\x3a\x86\x0b\x7d\x03\x17\x80\x3e\x8d\x77\x37\x5d\x4f\xae\xfd\x76\x35\xbc\x03\x21\xdc\xd0\x3d\xe1\x73\x2d\xab\xeb\xaa\xf9\xf6\x3c\x89\xe3\x91\x4d\xef\x06\x40\x49\x92\x07\xe8\xb2\x70\x09\xf8\xa4\x4e\xdd\xdb\x9f\xb7\x1c\x58\xa8\xe8\x19\xbb\x10\x3e\x8c\x12\xf2\x45\x94\x8e\xa7\x8e\xb0\xe5\xdd\xdf\x4e\xfc\xb6\x3d\x7d\xda\x76\xf6\xe7\xef\xdd\xbf\x00\x00\x00\xff\xff\x12\xac\x7d\xb1\x7e\x88\x07\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -124,7 +124,7 @@ func operatorsCoreosCom_clusterserviceversionsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x8f\x23\xb7\x11\xbe\xcf\xaf\x28\x8c\x0f\x6b\x03\x2b\x8d\xed\x00\x41\xa0\xdb\x66\x1c\x07\x93\xf8\xb1\xd8\x19\xef\xc5\xf1\xa1\xd4\x5d\x52\xd3\xc3\x26\x69\x3e\xa4\x55\x0c\xff\xf7\xa0\xc8\x7e\x4a\xdd\xad\xd6\xec\x78\xbd\x08\xdc\x97\xdd\xe9\x2e\x92\xf5\xae\xaf\x48\x0a\x8d\x78\x4b\xd6\x09\xad\x56\x80\x46\xd0\x3b\x4f\x8a\xff\x72\xcb\xc7\xbf\xb9\xa5\xd0\x37\xbb\x2f\xae\x1e\x85\xca\x57\x70\x1b\x9c\xd7\xe5\x1b\x72\x3a\xd8\x8c\xbe\xa2\x8d\x50\xc2\x0b\xad\xae\x4a\xf2\x98\xa3\xc7\xd5\x15\x00\x2a\xa5\x3d\xf2\x6b\xc7\x7f\x02\x64\x5a\x79\xab\xa5\x24\xbb\xd8\x92\x5a\x3e\x86\x35\xad\x83\x90\x39\xd9\x38\x79\xbd\xf4\xee\xf3\xe5\x5f\x97\x9f\x5f\x01\x64\x96\xe2\xf0\x07\x51\x92\xf3\x58\x9a\x15\xa8\x20\xe5\x15\x80\xc2\x92\x56\x20\x94\xf3\x28\xa5\x91\xa8\xdc\x52\x1b\xb2\xe8\xb5\x75\xcb\x4c\x5b\xd2\xfc\x4f\x79\xe5\x0c\x65\xbc\xf6\xd6\xea\x60\x56\x30\x48\x93\x66\xab\x59\x44\x4f\x5b\x6d\x45\xfd\x37\xc0\x02\xb4\x2c\xe3\xff\x93\xe8\x77\x69\xd1\xd7\x12\x55\x7c\x2b\x85\xf3\xff\x3e\xfe\xf2\x8d\x70\x3e\x7e\x35\x32\x58\x94\x7d\x56\xe3\x07\x57\x68\xeb\xbf\x6b\x17\xe6\x85\x84\x49\x9f\x84\xda\x06\x89\xb6\x37\xea\x0a\xc0\x65\xda\xd0\x0a\xe2\x20\x83\x19\xe5\x57\x00\x95\xd2\xaa\x49\x16\x80\x79\x1e\x0d\x81\xf2\xb5\x15\xca\x93\xbd\xd5\x32\x94\xaa\x59\x84\x69\x72\x72\x99\x15\xc6\x47\x65\x3f\x14\x04\x1b\x61\x9d\x87\xdb\xfb\xb7\x20\x14\xf8\x82\xa2\x4c\xa0\x37\x90\xc9\xe0\x3c\xd9\x7b\xb2\x3b\x91\x51\xe5\x1b\x71\xfd\x66\x3a\x80\x9f\x9d\x56\xaf\xd1\x17\x2b\x58\xb2\xba\x97\xe3\x83\x7e\xfc\xfc\xa7\xce\xb8\x64\xc3\xdb\xfb\xb7\x9d\x77\xfe\xc0\x12\x3a\x6f\x85\xda\x4e\x71\x8c\xc6\x58\xbd\x43\x09\xa5\xce\x69\x82\x97\x9a\xee\x64\xd9\x57\xa7\x1f\x46\xd6\x1e\x9e\x32\x2a\x7f\x68\xca\xde\x87\x34\xe5\x5a\x6b\x49\x95\xb7\xd4\xc4\xbb\x2f\x50\x9a\x02\xbf\xa8\x5e\xba\xac\xa0\x12\x5b\x23\x69\x43\xea\xd5\xeb\xbb\xb7\x7f\xb9\x3f\xfa\x00\x7d\x5d\x74\x5c\x0e\x72\x8e\x42\x72\xd1\x80\x95\xe3\xc4\xe8\x61\x43\x22\x38\x8a\x16\x6d\x23\xe0\x84\x4d\xbd\xfe\x99\x32\xdf\x79\x6d\xe9\x97\x20\x2c\xe5\xdd\xd5\x59\x23\x75\x8c\x1f\xbd\x66\xed\x74\x5e\x19\xcb\x6b\xf9\x4e\x24\xa5\xa7\x93\x64\x7a\xef\x8f\x24\x7b\xc1\xe2\x27\xba\x9e\x64\x95\xc3\x53\x5e\xe9\x8c\x85\xf2\x85\x70\x60\xc9\x58\x72\xa4\x7c\x2b\xb4\xaa\x64\x5a\x02\x3b\x23\x59\xc7\x51\x17\x64\xce\x89\x68\x47\xd6\x83\xa5\x4c\x6f\x95\xf8\x6f\x33\x9b\x03\xaf\x53\x04\xa0\x27\xe7\x21\x86\x90\x42\x09\x3b\x94\x81\x5e\x02\xaa\x1c\x4a\x3c\x80\x25\x9e\x17\x82\xea\xcc\x10\x49\xdc\x12\xbe\xd5\x96\x0d\xb0\xd1\x2b\x28\xbc\x37\x6e\x75\x73\xb3\x15\xbe\x4e\xa1\x99\x2e\xcb\xa0\x84\x3f\xdc\xc4\x6c\x28\xd6\x81\xad\x71\x93\xd3\x8e\xe4\x8d\x13\xdb\x05\xda\xac\x10\x9e\x32\x1f\x2c\xdd\xa0\x11\x8b\xc8\xac\x8a\x69\x74\x59\xe6\x9f\xd8\x2a\xe9\xba\x17\x47\xea\x1b\xf4\x5f\xa8\xf3\xd6\xa4\xae\x39\x7f\x81\x70\xec\x26\x71\x78\x92\xa5\x55\x29\xbf\x62\xad\xbc\xf9\xc7\xfd\x03\xd4\x0c\x24\xb5\x27\x0d\xb7\xa4\xae\x55\x36\x2b\x4a\xa8\x0d\xd9\x44\xb9\xb1\xba\x8c\xb3\x90\xca\x8d\x16\xca\xc7\x3f\x32\x29\x48\x79\x70\x61\x5d\x0a\xef\xa2\xcf\x91\xf3\x6c\x87\x25\xdc\xc6\x0a\x02\x6b\x82\x60\x72\xf4\x94\x2f\xe1\x4e\xc1\x2d\x96\x24\x6f\xd1\xd1\xef\xae\x6a\xd6\xa8\x5b\xb0\xfa\xe6\x2b\xbb\x5b\x00\x4f\x07\x9c\xc4\x18\x40\x5d\xa2\x46\xad\xd3\x89\xf1\x7b\x43\x59\x13\x0d\x4d\x4c\xbf\x32\x46\x8a\x2c\xb9\x7d\xe3\x1d\xec\xc8\xeb\x26\x11\xf4\xb2\xd2\x24\x3b\x63\x61\x0f\xa9\xbc\x9c\xa6\xcd\xfe\xa7\x93\x85\xf8\xd3\xac\x32\x02\x13\x39\x03\x62\xde\x48\x4b\x9f\x7e\x39\xd2\x57\x9d\xda\xd9\xa1\xd9\xc3\x82\x23\xdb\x16\x0c\xa3\xa5\xc8\x0e\xb0\xd1\x96\xf3\x43\x47\xb7\x4b\xb8\xf3\x50\x06\x17\xfd\x4d\x2b\x62\xcd\x5e\xbf\x0a\x5e\x97\xe8\x45\x76\x0d\xda\xc2\xf5\xb7\xa8\x02\xca\xeb\xe5\x00\x0b\xa3\x0e\xd1\xf2\x3e\xa4\xd2\xe1\x1a\xd1\x3e\xe3\xaa\x1b\x9f\x0b\xad\xc5\xc3\xc0\x57\xe1\xa9\x1c\x1c\x76\x86\xfb\x2d\x29\x2e\x1a\x03\x19\xbb\x1d\xca\x89\x72\x4b\xf6\xe4\x7b\xf2\xc6\xf1\x71\x23\x4b\xa6\x61\x0d\xd2\xb9\x68\xbc\xf3\xe8\xc3\x89\x9c\x3d\x17\xb9\xee\xc6\x54\x24\xef\x24\xb0\xaa\x80\x6e\xb4\x2d\x53\x4c\xe1\x5a\x87\x94\xac\xd2\xd4\xec\x19\xce\x93\x71\x4d\xa8\x70\xb0\x65\xba\x34\x92\x7c\xbf\xf6\x2e\xe1\x3f\x0a\xaa\x15\x38\x1d\x7a\x8b\x42\xc6\xa9\x30\xf3\x01\x65\x9c\x91\xaa\x0a\x7d\x70\x9e\xca\xe5\xf5\xf3\x44\x6a\x86\x1e\xa5\xde\xde\xa7\x6c\x30\x40\x60\x0a\x74\x74\x49\xfc\x79\x4f\x2a\x70\x16\xae\x9c\xf1\x55\x96\xe9\xa0\xfc\x1b\xda\x9c\x0f\xc9\xf1\xb1\x60\x69\x43\x96\x54\x56\xd5\x77\x97\x08\x00\x13\x05\xf8\x02\x3d\x47\x72\x70\x49\xcd\xb9\x4e\x38\x38\x6f\xa0\x4c\xad\xf0\xf1\xa8\x1c\x54\xde\x39\x79\x61\x12\xab\x0c\x8b\xf9\xfa\xae\xc6\x27\x09\x96\x50\x2d\x9d\x1f\x62\x0e\xce\x45\x01\x3f\x1b\x41\x32\x8f\xf8\x73\x0e\x07\x2f\xee\x2a\x85\xc6\x2a\xee\x35\x20\x18\x41\x19\xf5\xe0\x50\x54\x18\x61\x5e\xbd\xe4\x82\x67\xa9\xfa\xf6\x32\xd5\xea\x0a\x06\xb4\x70\xc9\xa3\x50\x80\x8c\x0b\x44\x0e\xff\xba\xff\xfe\xbb\x9b\x7f\xea\xc4\x1b\x5b\x8a\x9c\x4b\x9e\x5c\x92\xf2\x2f\xc1\x85\xac\x00\x74\xcc\x1a\xbb\x27\xfb\x3f\x2d\x4b\x54\x62\x43\xce\x2f\xab\xd9\xc8\xba\x1f\xbf\xfc\x69\x09\x5f\x6b\x0b\xf4\x0e\x39\x78\x5e\x82\x48\x5a\x6b\x40\x45\xe5\x1a\x31\x95\xb3\x30\xcd\x58\xd8\x0b\x5f\x44\x96\x8c\xce\x2b\xa6\xf7\x91\x59\x8f\x8f\x9c\xbf\x13\xb3\x81\x7b\x99\x47\x5a\xc1\x75\x6a\x4d\x9a\xa5\x7f\x65\x18\xfe\xdb\x35\x7c\xba\x2f\xc8\x12\x5c\xf3\x9f\xd7\x69\xc1\x06\x03\xf2\xbb\xda\x8e\xed\xc2\xd1\x21\xbd\x15\xdb\x2d\xc5\xc8\x67\x40\xc3\xa0\xe1\x33\xae\x10\x62\x03\x4a\x77\x88\xe3\x14\xac\x4f\x43\x99\xd8\x08\xca\x4f\x18\xf9\xf1\xcb\x9f\xae\xe1\xd3\xbe\x5c\x20\x54\x4e\xef\xe0\xcb\xd4\x8e\x09\xc7\x32\x7e\xb6\x84\x87\x68\x99\x83\xf2\xf8\x8e\xe7\xcc\x0a\xed\x48\x81\x56\xf2\xc0\x1c\x17\xb8\x23\x70\xba\x24\xd8\x93\x94\x8b\x84\x12\x72\xd8\xe3\x81\x65\xa8\x55\xc9\x56\x45\x30\x68\xfd\x11\x42\x7e\xf8\xfe\xab\xef\x57\x69\x35\x36\xdb\x56\xf1\x12\x8c\xbe\x36\x82\xf1\x2f\x03\xdf\x84\xe2\xa2\xcd\x99\x91\x90\x8c\xc4\xa9\xaf\x40\xb5\xa5\xba\x79\xdc\x04\xc6\x53\xcb\x63\xc4\x34\xdb\xe3\x87\xe0\xea\xb0\xb3\x47\xd8\x7a\x1c\x68\x7f\x20\x28\x9c\x2d\x62\xec\x01\x67\x89\xf8\x5d\xc7\x07\x27\x45\x7c\x0c\x6b\xb2\x8a\x3c\x45\x29\x73\x9d\x39\x16\x30\x23\xe3\xdd\x8d\xde\x71\x52\xa5\xfd\xcd\x5e\xdb\x47\xa1\xb6\x0b\x76\xb2\x45\xb2\xbc\xbb\x89\xbb\x1f\x37\x9f\xc4\x7f\xde\x4b\xa2\xd1\x52\x3d\x2c\x56\x24\xff\x10\xb2\xf1\x3a\xee\xe6\xc9\xa2\xd5\x90\xfa\x92\x4a\xf0\xe2\x3e\x05\x7c\x76\x3c\x9a\xc3\x65\x5f\x88\xac\xa8\x9b\xd6\x4e\x86\x2b\x31\x4f\x29\x10\xd5\xe1\x77\x77\x63\x56\x60\xb0\xbc\xf6\x61\x51\xed\xcb\x2d\x50\xe5\xfc\x7f\x27\x9c\xe7\xf7\x4f\xd6\x58\x10\x33\x03\xf8\x87\xbb\xaf\x3e\x8c\x73\x07\xf1\xc4\x68\x5d\x07\x95\x4b\xfa\x46\xeb\xc7\x60\x06\x41\x42\x4f\xa0\xbf\x77\xa9\xeb\xfe\xa3\xea\xd2\x84\x5a\x18\xab\xb7\x96\x6b\x65\xa7\xcb\x05\x13\x64\x4a\xaf\x41\x19\xcc\x1e\x71\x4b\xd5\xa2\xb1\x8c\x70\x6f\x5c\x95\xa3\xaa\x15\x18\x87\x39\x4f\xc0\xfd\xa3\xdc\xa7\xdd\x80\x8a\xcf\x11\x36\xeb\xba\xc8\x3c\x46\x04\x5b\xf1\x7d\x9e\xdf\xb3\xc0\x6c\x0a\xdb\xa6\xe7\x08\xe1\xbe\xa1\xcd\x28\xa1\xc8\xd9\xef\x37\x62\xa0\x3d\xa9\x49\x0c\xfa\x62\xf4\xa3\x25\x23\x71\x08\x44\xc3\x0c\x08\x09\x27\x7c\x8e\xd1\x1d\x59\xe3\xf6\x68\x58\x6d\x91\x3a\x61\x54\x5a\xee\x91\xc5\x37\x95\x15\x58\x24\xd8\xa3\x8b\x19\x48\xee\x28\x8f\x1b\x30\x63\x38\x74\x86\x45\xe6\x49\x0b\xb3\x60\xf3\x80\xbc\x4f\x00\xcf\x5d\xc6\x27\xd2\x51\x7a\xce\x02\xe9\x01\x9e\xfe\x84\xd3\x7f\xc2\xe9\x8f\x1c\x4e\x5f\x14\x03\x53\xd0\x7a\xc8\xfd\x3f\x56\x80\x7d\x91\xd0\x53\x60\x7b\x48\xe8\x8f\x04\x72\x5f\x2c\xe3\x24\xfc\x1e\x13\xf4\x23\x01\xe1\x17\x09\x3b\x13\x90\x0f\x89\xfc\xff\x0c\xcb\x2f\xd2\xe1\x04\x44\x1f\xd2\xdb\x47\x01\xd4\x67\x0b\x98\x69\x95\x4e\xc1\x27\x50\x4a\x1f\x6b\x35\x03\x8e\xf7\x81\x99\x69\x94\xbd\x7d\xda\x2e\x4c\x3e\x07\xa7\xc6\x20\x79\x7a\x26\x80\x79\x77\x92\x33\x98\xec\x3c\x56\x4e\xcf\xa2\xda\xbe\x3e\x43\xc4\x6b\x4e\x90\xcc\x43\x80\x00\x12\x9d\x7f\xb0\xa8\x9c\xa8\x6f\x70\x4c\xd3\x1f\x59\xe4\x1b\xe4\xb6\x43\x94\x4d\x97\x91\xec\x03\xbe\x99\xb2\x02\xb4\xf1\xa8\xa6\xda\x97\x67\x4c\xa3\xb4\x2f\xc6\x9a\x8e\xf6\x99\x19\x25\xfc\xa4\x73\x80\x15\xe4\xe8\x69\xc1\x1c\x9d\x15\xfb\x87\x78\x58\xf9\x6c\x22\x33\x86\x37\x56\xaf\x29\xff\xc3\xa4\x2a\xc9\x39\xdc\x5e\x26\xce\x2b\x28\x42\x89\x0a\x2c\x61\x8e\x6b\x49\xf5\x24\x8c\xc6\xe2\x69\xa5\xda\x42\x4e\x1e\x85\x74\x9d\x13\x96\xd6\xbe\xcf\x26\xac\x25\x74\xe7\xaa\x04\x9c\x5e\x31\x49\xc3\xe2\x41\x61\xcf\x1e\x2f\x5c\x34\xf2\xef\xc1\xe9\xf0\xc9\xd5\x24\xa7\xf7\xcd\x89\x54\x8f\xc9\x97\xf5\x09\xe6\x83\x0d\xf4\x12\xbe\x46\xe9\xe8\x25\xfc\xa0\x1e\x95\xde\x3f\x1f\xbf\x91\xf0\x22\xbd\x1e\x4c\xe4\xaa\xe1\xf3\x19\x58\x69\xbb\xfb\x99\xc9\xfe\xae\x19\x50\xef\xd0\x54\x1d\xfa\x22\x28\xf1\x4b\xe8\x37\x2a\xcd\x21\xd3\xa7\xc7\x2d\xcc\xed\xfd\xdb\xe8\x1c\xa9\xdd\x76\xa9\x91\xa9\x5b\xbb\xdb\xfb\xb7\xee\xb3\x33\xb5\x61\x52\x2a\x33\xd9\xa8\xf6\xe4\xe1\x9e\xf6\xa8\xd5\x92\x3a\xeb\x5c\xfd\x69\xb7\x65\x4c\x90\x72\x09\x77\xfe\x85\x63\x1e\x44\x86\x52\x1e\xb8\x6b\x11\x25\x07\x66\x83\x7a\xce\x55\xb5\x69\xce\x67\x14\x88\x93\x60\xa3\xcd\x86\x32\x2f\x76\xd4\x19\x5e\x2b\x3a\x6d\x38\x51\x5e\xc9\xf1\x5e\xcc\xd5\x5b\x39\x33\x59\x7b\x53\x91\xd7\x8e\xd2\xb5\x7f\xab\xd5\x6a\xd2\xd4\x6b\x46\xa7\x51\x04\x1b\x1d\x54\x0e\xe8\xa3\x79\x9e\xc8\x73\xff\x0c\xf7\xc3\x1d\xf8\x4f\xe3\xa7\xe7\xd9\x6c\xec\x9c\xc0\x37\xe8\x6b\x0a\x7c\xb5\x49\x8e\xde\x51\x16\x3a\x77\xbc\xba\x77\x38\x9e\xb6\xd7\x78\xde\x65\x2f\x41\x33\xb3\xd2\xe7\xdc\xfa\x3b\x17\x4f\x3c\xeb\xa2\x67\xcb\xfd\xac\x48\x9b\xae\xba\xc3\xf8\xfb\x4d\x2a\xba\x71\xab\x33\xc3\x92\x64\x86\x8e\xf2\xe3\x5a\x9c\xc0\xf8\x9c\x02\x3c\x83\xd1\x73\x45\x77\xc6\x14\xd3\x75\xf0\xac\xdb\xc7\xaa\x98\xa8\xd6\xf5\x2d\x88\xa6\xdd\xe8\xf9\x37\xe7\x13\x84\x8c\x6c\x2c\x32\xe9\x12\x1d\xb2\xae\xf6\x85\x7e\x72\x66\x9c\xb0\x76\x8f\xf5\x6f\x6b\xfc\xc6\x0b\x46\x6c\xb7\x38\xc1\x76\x55\xfd\x6b\xb1\x1d\xe5\xbd\xab\x34\xb1\x48\x96\x78\x88\x57\xd3\x4a\xa3\xad\xc7\x74\xc0\x11\x54\x4e\xd6\x79\x54\x39\x8f\xdd\x17\x87\xa8\x06\xc3\x32\x17\xe8\x40\x78\x07\xa9\x2f\xf6\x95\xc1\x2e\xbe\x83\x15\xef\xbb\x9c\x15\xb2\xa3\xec\xd7\x3c\xa0\x81\x08\xbd\xc5\x53\x5d\xed\x19\x66\xd2\x0a\xd3\x8c\x49\x9c\xb8\x58\xf5\xbe\x79\xf6\xde\x93\x39\xce\xab\x1d\x21\x54\x84\xe3\x3b\x91\xa7\xcb\x48\x64\x40\xa8\xe7\x49\xaa\xe7\x0f\x70\xd2\xc1\xc4\x78\x58\x2d\x9a\x5d\x9a\x51\x82\x89\x8e\xf6\x7c\x52\x6f\xd6\x7f\xcf\x44\x37\x7e\xc7\x2d\x3d\x27\xf6\xa8\x7f\x37\x31\x61\x97\xce\x2d\xdb\x78\x8f\xd3\xdb\x0a\x03\x1d\x66\x59\x07\xe6\x6e\x1e\xcc\xd9\x3a\x58\xa4\x9f\x4f\x4c\x52\x3c\x0a\x75\x7a\xf3\xb3\x4b\xc0\xd0\x69\x92\xa0\xbd\xf2\x37\x93\x2c\x6e\x29\x4e\xd2\x56\xc7\x49\xef\x79\x9a\x95\x7e\x3b\xf2\x61\xb6\xdf\x67\x4e\x54\x1f\xfe\x3c\xcb\x64\xe7\xf7\xc7\x67\x4e\xd4\x9a\xe6\x99\xa7\x9b\xb1\xb3\x3d\x73\xce\xdd\x9c\x2d\xe3\x67\x00\x0d\x27\x21\x5f\xf5\xe9\x13\xd5\xc4\xa0\xf5\x22\x0b\x12\x6d\x1b\xfb\x31\x3d\x9f\xfc\xe2\xe8\x62\x9e\x9d\x47\xeb\xc7\xf0\xe3\xf1\x76\x42\xa2\xac\x39\x8d\xfb\x51\xfb\x82\x54\x73\x6c\x97\x7e\xc0\x05\x6b\xda\x72\xd9\x33\x46\x1e\xea\x5f\x07\xb4\x77\xcf\xa5\x70\x3e\x56\xfe\xb6\x8a\xcf\xbd\xc4\x30\xaa\xf6\x31\xf0\xea\xc8\xee\x28\x5f\x81\xb7\xa1\x79\xe5\xb5\x65\x44\xd3\x7b\x17\xd6\x0d\x7f\xad\x1a\x2a\x3b\xc2\xaf\xbf\x5d\xfd\x2f\x00\x00\xff\xff\xf9\x92\xd3\x00\xfd\x36\x00\x00") +var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xdd\x6f\x1b\x37\x12\x7f\xf7\x5f\x31\x70\x1f\xd2\x02\x96\xdc\xe6\x80\xc3\x41\x6f\x39\xf7\x7a\xf0\x5d\x3f\x82\xd8\xcd\x4b\xaf\x0f\xa3\xdd\x91\x96\x35\x97\x64\xf9\x21\x47\x57\xf4\x7f\x3f\x0c\xb9\x9f\xd2\xee\x6a\xe5\x38\x69\x70\xe8\xbe\x24\xde\x1d\x92\xf3\x3d\xbf\x21\x29\x34\xe2\x2d\x59\x27\xb4\x5a\x01\x1a\x41\xef\x3c\x29\xfe\xcb\x2d\x1f\xfe\xe6\x96\x42\x5f\xef\xbe\xba\x78\x10\x2a\x5f\xc1\x4d\x70\x5e\x97\x6f\xc8\xe9\x60\x33\xfa\x9a\x36\x42\x09\x2f\xb4\xba\x28\xc9\x63\x8e\x1e\x57\x17\x00\xa8\x94\xf6\xc8\xaf\x1d\xff\x09\x90\x69\xe5\xad\x96\x92\xec\x62\x4b\x6a\xf9\x10\xd6\xb4\x0e\x42\xe6\x64\xe3\xe4\xf5\xd2\xbb\x2f\x97\x7f\x5d\xbe\xbc\x00\xc8\x2c\xc5\xe1\xf7\xa2\x24\xe7\xb1\x34\x2b\x50\x41\xca\x0b\x00\x85\x25\xad\x40\x28\xe7\x51\x4a\x23\x51\xb9\xa5\x36\x64\xd1\x6b\xeb\x96\x99\xb6\xa4\xf9\x9f\xf2\xc2\x19\xca\x78\xed\xad\xd5\xc1\xac\x60\x90\x26\xcd\x56\xb3\x88\x9e\xb6\xda\x8a\xfa\x6f\x80\x05\x68\x59\xc6\xff\x27\xd1\x6f\xd3\xa2\xaf\x25\xaa\xf8\x56\x0a\xe7\xff\x7d\xf8\xe5\x5b\xe1\x7c\xfc\x6a\x64\xb0\x28\xfb\xac\xc6\x0f\xae\xd0\xd6\x7f\xdf\x2e\xcc\x0b\x09\x93\x3e\x09\xb5\x0d\x12\x6d\x6f\xd4\x05\x80\xcb\xb4\xa1\x15\xc4\x41\x06\x33\xca\x2f\x00\x2a\xa5\x55\x93\x2c\x00\xf3\x3c\x1a\x02\xe5\x6b\x2b\x94\x27\x7b\xa3\x65\x28\x55\xb3\x08\xd3\xe4\xe4\x32\x2b\x8c\x8f\xca\xbe\x2f\x08\x36\xc2\x3a\x0f\x37\x77\x6f\x41\x28\xf0\x05\x45\x99\x40\x6f\x20\x93\xc1\x79\xb2\x77\x64\x77\x22\xa3\xca\x37\xe2\xfa\xcd\x74\x00\xbf\x38\xad\x5e\xa3\x2f\x56\xb0\x64\x75\x2f\xc7\x07\xfd\xf4\xe5\xcf\x9d\x71\xc9\x86\x37\x77\x6f\x3b\xef\xfc\x9e\x25\x74\xde\x0a\xb5\x9d\xe2\x18\x8d\xb1\x7a\x87\x12\x4a\x9d\xd3\x04\x2f\x35\xdd\xd1\xb2\xaf\x8e\x3f\x8c\xac\x3d\x3c\x65\x54\xfe\xd0\x94\xbd\x0f\x69\xca\xb5\xd6\x92\x2a\x6f\xa9\x89\x77\x5f\xa1\x34\x05\x7e\x55\xbd\x74\x59\x41\x25\xb6\x46\xd2\x86\xd4\xab\xd7\xb7\x6f\xff\x72\x77\xf0\x01\xfa\xba\xe8\xb8\x1c\xe4\x1c\x85\xe4\xa2\x01\x2b\xc7\x89\xd1\xc3\x86\x44\x70\x14\x2d\xda\x46\xc0\x11\x9b\x7a\xfd\x0b\x65\xbe\xf3\xda\xd2\xaf\x41\x58\xca\xbb\xab\xb3\x46\xea\x18\x3f\x78\xcd\xda\xe9\xbc\x32\x96\xd7\xf2\x9d\x48\x4a\x4f\x27\xc9\xf4\xde\x1f\x48\xf6\x82\xc5\x4f\x74\x3d\xc9\x2a\x87\xa7\xbc\xd2\x19\x0b\xe5\x0b\xe1\xc0\x92\xb1\xe4\x48\xf9\x56\x68\x55\xc9\xb4\x04\x76\x46\xb2\x8e\xa3\x2e\xc8\x9c\x13\xd1\x8e\xac\x07\x4b\x99\xde\x2a\xf1\xdf\x66\x36\x07\x5e\xa7\x08\x40\x4f\xce\x43\x0c\x21\x85\x12\x76\x28\x03\x5d\x01\xaa\x1c\x4a\xdc\x83\x25\x9e\x17\x82\xea\xcc\x10\x49\xdc\x12\xbe\xd3\x96\x0d\xb0\xd1\x2b\x28\xbc\x37\x6e\x75\x7d\xbd\x15\xbe\x4e\xa1\x99\x2e\xcb\xa0\x84\xdf\x5f\xc7\x6c\x28\xd6\x81\xad\x71\x9d\xd3\x8e\xe4\xb5\x13\xdb\x05\xda\xac\x10\x9e\x32\x1f\x2c\x5d\xa3\x11\x8b\xc8\xac\x8a\x69\x74\x59\xe6\x9f\xd9\x2a\xe9\xba\x17\x07\xea\x1b\xf4\x5f\xa8\xf3\xd6\xa4\xae\x39\x7f\x81\x70\xec\x26\x71\x78\x92\xa5\x55\x29\xbf\x62\xad\xbc\xf9\xc7\xdd\x3d\xd4\x0c\x24\xb5\x27\x0d\xb7\xa4\xae\x55\x36\x2b\x4a\xa8\x0d\xd9\x44\xb9\xb1\xba\x8c\xb3\x90\xca\x8d\x16\xca\xc7\x3f\x32\x29\x48\x79\x70\x61\x5d\x0a\xef\xa2\xcf\x91\xf3\x6c\x87\x25\xdc\xc4\x0a\x02\x6b\x82\x60\x72\xf4\x94\x2f\xe1\x56\xc1\x0d\x96\x24\x6f\xd0\xd1\x07\x57\x35\x6b\xd4\x2d\x58\x7d\xf3\x95\xdd\x2d\x80\xc7\x03\x8e\x62\x0c\xa0\x2e\x51\xa3\xd6\xe9\xc4\xf8\x9d\xa1\xac\x89\x86\x26\xa6\x5f\x19\x23\x45\x96\xdc\xbe\xf1\x0e\x76\xe4\x75\x93\x08\x7a\x59\x69\x92\x9d\xb1\xb0\x87\x54\x5e\x8e\xd3\x66\xff\xd3\xd1\x42\xfc\x69\x56\x19\x81\x89\x9c\x01\x31\x6f\xa4\xa5\x8f\xbf\x1c\xe8\xab\x4e\xed\xec\xd0\xec\x61\xc1\x91\x6d\x0b\x86\xd1\x52\x64\x7b\xd8\x68\xcb\xf9\xa1\xa3\xdb\x25\xdc\x7a\x28\x83\x8b\xfe\xa6\x15\xb1\x66\x2f\x5f\x05\xaf\x4b\xf4\x22\xbb\x04\x6d\xe1\xf2\x3b\x54\x01\xe5\xe5\x72\x80\x85\x51\x87\x68\x79\x1f\x52\xe9\x70\x8d\x68\x9f\x71\xd5\x8d\xcf\x85\xd6\xe2\x7e\xe0\xab\xf0\x54\x0e\x0e\x3b\xc1\xfd\x96\x14\x17\x8d\x81\x8c\xdd\x0e\xe5\x44\xb9\x25\x7b\xf4\x3d\x79\xe3\xf8\xb8\x91\x25\xd3\xb0\x06\xe9\x9c\x35\xde\x79\xf4\xe1\x48\xce\x9e\x8b\x5c\x76\x63\x2a\x92\x77\x12\x58\x55\x40\x37\xda\x96\x29\xa6\x70\xad\x43\x4a\x56\x69\x6a\xf6\x0c\xe7\xc9\xb8\x26\x54\x38\xd8\x32\x5d\x1a\x49\xbe\x5f\x7b\x97\xf0\x1f\x05\xd5\x0a\x9c\x0e\xbd\x45\x21\xe3\x54\x98\xf9\x80\x32\xce\x48\x55\x85\xde\x3b\x4f\xe5\xf2\xf2\x79\x22\x35\x43\x8f\x52\x6f\xef\x52\x36\x18\x20\x30\x05\x3a\x3a\x27\xfe\xbc\x27\x15\x38\x0b\x57\xce\xf8\x2a\xcb\x74\x50\xfe\x0d\x6d\x4e\x87\xe4\xf8\x58\xb0\xb4\x21\x4b\x2a\xab\xea\xbb\x4b\x04\x80\x89\x02\x7c\x81\x9e\x23\x39\xb8\xa4\xe6\x5c\x27\x1c\x9c\x37\x50\xa6\x56\xf8\x78\x54\x0e\x2a\xef\x94\xbc\x30\x89\x55\x86\xc5\x7c\x7d\x5b\xe3\x93\x04\x4b\xa8\x96\xce\x0f\x31\x07\xa7\xa2\x80\x9f\x8d\x20\x99\x47\xfc\x39\x87\x83\x17\xb7\x95\x42\x63\x15\xf7\x1a\x10\x8c\xa0\x8c\x7a\x70\x28\x2a\x8c\x30\xaf\x5e\x72\xc1\xb3\x54\x7d\xbb\x4a\xb5\xba\x82\x01\x2d\x5c\xf2\x28\x14\x20\xe3\x02\x91\xc3\xbf\xee\x7e\xf8\xfe\xfa\x9f\x3a\xf1\xc6\x96\x22\xe7\x92\x27\x97\xa4\xfc\x15\xb8\x90\x15\x80\x8e\x59\x63\xf7\x64\xff\xa7\x65\x89\x4a\x6c\xc8\xf9\x65\x35\x1b\x59\xf7\xd3\xcb\x9f\x97\xf0\x8d\xb6\x40\xef\x90\x83\xe7\x0a\x44\xd2\x5a\x03\x2a\x2a\xd7\x88\xa9\x9c\x85\x69\xc6\xc2\xa3\xf0\x45\x64\xc9\xe8\xbc\x62\xfa\x31\x32\xeb\xf1\x81\xf3\x77\x62\x36\x70\x2f\xf3\x40\x2b\xb8\x4c\xad\x49\xb3\xf4\x6f\x0c\xc3\x7f\xbf\x84\xcf\x1f\x0b\xb2\x04\x97\xfc\xe7\x65\x5a\xb0\xc1\x80\xfc\xae\xb6\x63\xbb\x70\x74\x48\x6f\xc5\x76\x4b\x31\xf2\x19\xd0\x30\x68\xf8\x82\x2b\x84\xd8\x80\xd2\x1d\xe2\x38\x05\xeb\xd3\x50\x26\x36\x82\xf2\x23\x46\x7e\x7a\xf9\xf3\x25\x7c\xde\x97\x0b\x84\xca\xe9\x1d\xbc\x4c\xed\x98\x70\x2c\xe3\x17\x4b\xb8\x8f\x96\xd9\x2b\x8f\xef\x78\xce\xac\xd0\x8e\x14\x68\x25\xf7\xcc\x71\x81\x3b\x02\xa7\x4b\x82\x47\x92\x72\x91\x50\x42\x0e\x8f\xb8\x67\x19\x6a\x55\xb2\x55\x11\x0c\x5a\x7f\x80\x90\xef\x7f\xf8\xfa\x87\x55\x5a\x8d\xcd\xb6\x55\xbc\x04\xa3\xaf\x8d\x60\xfc\xcb\xc0\x37\xa1\xb8\x68\x73\x66\x24\x24\x23\x71\xea\x2b\x50\x6d\xa9\x6e\x1e\x37\x81\xf1\xd4\xf2\x10\x31\xcd\xf6\xf8\x21\xb8\x3a\xec\xec\x11\xb6\x1e\x06\xda\x1f\x08\x0a\x67\x8b\x18\x7b\xc0\x59\x22\x7e\xdf\xf1\xc1\x49\x11\x1f\xc2\x9a\xac\x22\x4f\x51\xca\x5c\x67\x8e\x05\xcc\xc8\x78\x77\xad\x77\x9c\x54\xe9\xf1\xfa\x51\xdb\x07\xa1\xb6\x0b\x76\xb2\x45\xb2\xbc\xbb\x8e\xbb\x1f\xd7\x9f\xc5\x7f\xde\x4b\xa2\xd1\x52\x3d\x2c\x56\x24\xff\x18\xb2\xf1\x3a\xee\xfa\xc9\xa2\xd5\x90\xfa\x9c\x4a\xf0\xe2\x2e\x05\x7c\x76\x38\x9a\xc3\xe5\xb1\x10\x59\x51\x37\xad\x9d\x0c\x57\x62\x9e\x52\x20\xaa\xfd\x07\x77\x63\x56\x60\xb0\xbc\xf6\x7e\x51\xed\xcb\x2d\x50\xe5\xfc\x7f\x27\x9c\xe7\xf7\x4f\xd6\x58\x10\x33\x03\xf8\xc7\xdb\xaf\x3f\x8e\x73\x07\xf1\xc4\x68\x5d\x07\x95\x4b\xfa\x56\xeb\x87\x60\x06\x41\x42\x4f\xa0\xbf\x77\xa9\xeb\xfe\xa3\xea\xd2\x84\x5a\x18\xab\xb7\x96\x6b\x65\xa7\xcb\x05\x13\x64\x4a\xaf\x41\x19\xcc\x1e\x70\x4b\xd5\xa2\xb1\x8c\x70\x6f\x5c\x95\xa3\xaa\x15\x18\x87\x39\x4f\xc0\xfd\xa3\xdc\xa7\xdd\x80\x8a\xcf\x11\x36\xeb\xba\xc8\x3c\x46\x04\x5b\xf1\x7d\x9a\xdf\x93\xc0\x6c\x0a\xdb\xa6\xe7\x00\xe1\xbe\xa1\xcd\x28\xa1\xc8\xd9\xef\x37\x62\xa0\x3d\xa9\x49\x0c\xfa\x62\xf4\xa3\x25\x23\x71\x08\x44\xc3\x0c\x08\x09\x47\x7c\x8e\xd1\x1d\x58\xe3\xe6\x60\x58\x6d\x91\x3a\x61\x54\x5a\xee\x91\xc5\x37\x95\x15\x58\x24\x78\x44\x17\x33\x90\xdc\x51\x1e\x37\x60\xc6\x70\xe8\x0c\x8b\xcc\x93\x16\x66\xc1\xe6\x01\x79\x9f\x00\x9e\xbb\x8c\x4f\xa4\xa3\xf4\x9c\x04\xd2\x03\x3c\xfd\x09\xa7\xff\x84\xd3\x9f\x38\x9c\x3e\x2b\x06\xa6\xa0\xf5\x90\xfb\x7f\xaa\x00\xfb\x2c\xa1\xa7\xc0\xf6\x90\xd0\x9f\x08\xe4\x3e\x5b\xc6\x49\xf8\x3d\x26\xe8\x27\x02\xc2\xcf\x12\x76\x26\x20\x1f\x12\xf9\xff\x19\x96\x9f\xa5\xc3\x09\x88\x3e\xa4\xb7\x4f\x02\xa8\xcf\x16\x30\xd3\x2a\x9d\x82\x4f\xa0\x94\x3e\xd6\x6a\x06\x1c\xee\x03\x33\xd3\x28\x7b\xfb\xb4\x5d\x98\x7c\x0a\x4e\x8d\x41\xf2\xf4\x4c\x00\xf3\xee\x24\x27\x30\xd9\x69\xac\x9c\x9e\x45\xb5\x7d\x7d\x82\x88\xd7\x9c\x20\x99\x87\x00\x01\x24\x3a\x7f\x6f\x51\x39\x51\xdf\xe0\x98\xa6\x3f\xb0\xc8\xb7\xc8\x6d\x87\x28\x9b\x2e\x23\xd9\x07\x7c\x33\x65\x05\x68\xe3\x51\x4d\xb5\x2f\xcf\x98\x46\x69\x5f\x8c\x35\x1d\xed\x33\x33\x4a\xf8\x49\xe7\x00\x2b\xc8\xd1\xd3\x82\x39\x3a\x29\xf6\x8f\xf1\xb0\xf2\xd9\x44\x66\x0c\x6f\xac\x5e\x53\xfe\x87\x49\x55\x92\x73\xb8\x3d\x4f\x9c\x57\x50\x84\x12\x15\x58\xc2\x1c\xd7\x92\xea\x49\x18\x8d\xc5\xd3\x4a\xb5\x85\x9c\x3c\x0a\xe9\x3a\x27\x2c\xad\x7d\x9f\x4d\x58\x4b\xe8\x4e\x55\x09\x38\xbe\x62\x92\x86\xc5\x83\xc2\x9e\x3d\x5e\xb8\x68\xe4\x0f\xc1\xe9\xf0\xc9\xd5\x24\xa7\x77\xcd\x89\x54\x8f\xc9\xab\xfa\x04\xf3\xde\x06\xba\x82\x6f\x50\x3a\xba\x82\x1f\xd5\x83\xd2\x8f\xcf\xc7\x6f\x24\x3c\x4b\xaf\x7b\x13\xb9\x6a\xf8\x7c\x06\x56\xda\xee\x7e\x66\xb2\xbf\x6d\x06\xd4\x3b\x34\x55\x87\xbe\x08\x4a\xfc\x1a\xfa\x8d\x4a\x73\xc8\xf4\xf9\x61\x0b\x73\x73\xf7\x36\x3a\x47\x6a\xb7\x5d\x6a\x64\xea\xd6\xee\xe6\xee\xad\xfb\xe2\x44\x6d\x98\x94\xca\x4c\x36\xaa\x3d\x79\xb8\xa7\x3d\x68\xb5\xa4\xce\x3a\x57\x7f\xda\x6d\x19\x13\xa4\x5c\xc2\xad\x7f\xe1\x98\x07\x91\xa1\x94\x7b\xee\x5a\x44\xc9\x81\xd9\xa0\x9e\x53\x55\x6d\x9a\xf3\x19\x05\xe2\x28\xd8\x68\xb3\xa1\xcc\x8b\x1d\x75\x86\xd7\x8a\x4e\x1b\x4e\x94\x57\x72\xbc\x17\x73\xf5\x56\xce\x4c\xd6\xde\x54\xe4\xb5\xa3\x74\xed\xdf\x6a\xb5\x9a\x34\xf5\x9a\xd1\x69\x14\xc1\x46\x07\x95\x03\xfa\x68\x9e\x27\xf2\xdc\x3f\xc3\xfd\x78\x07\xfe\xd3\xf8\xe9\x79\x36\x1b\x3b\x27\xf0\x0d\xfa\x9a\x02\x5f\x6d\x92\xa3\x77\x94\x85\xce\x1d\xaf\xee\x1d\x8e\xa7\xed\x35\x9e\x76\xd9\x73\xd0\xcc\xac\xf4\x39\xb7\xfe\xce\xc5\x13\xcf\xba\xe8\xc9\x72\x3f\x2b\xd2\xa6\xab\xee\x30\xfe\x7e\x93\x8a\x6e\xdc\xea\xcc\xb0\x24\x99\xa1\xa3\xfc\xb0\x16\x27\x30\x3e\xa7\x00\xcf\x60\xf4\x54\xd1\x9d\x31\xc5\x74\x1d\x3c\xe9\xf6\xb1\x2a\x26\xaa\x75\x7d\x0b\xa2\x69\x37\x7a\xfe\xcd\xf9\x04\x21\x23\x1b\x8b\x4c\xba\x44\x87\xac\xab\xc7\x42\x3f\x39\x33\x4e\x58\xbb\xc7\xfa\x77\x35\x7e\xe3\x05\x23\xb6\x5b\x1c\x61\xbb\xaa\xfe\xb5\xd8\x8e\xf2\xde\x55\x9a\x58\x24\x4b\xdc\xc7\xab\x69\xa5\xd1\xd6\x63\x3a\xe0\x08\x2a\x27\xeb\x3c\xaa\x9c\xc7\x3e\x16\xfb\xa8\x06\xc3\x32\x17\xe8\x40\x78\x07\xa9\x2f\xf6\x95\xc1\xce\xbe\x83\x15\xef\xbb\x9c\x14\xb2\xa3\xec\xd7\x3c\xa0\x81\x08\xbd\xc5\x53\x5d\xed\x19\x66\xd2\x0a\xd3\x8c\x49\x9c\xb8\x58\xf5\xbe\x79\xf6\xce\x93\x39\xcc\xab\x1d\x21\x54\x84\xe3\x3b\x91\xa7\xcb\x48\x64\x40\xa8\xe7\x49\xaa\xa7\x0f\x70\xd2\xc1\xc4\x78\x58\x2d\x9a\x5d\x9a\x51\x82\x89\x8e\xf6\x74\x52\x6f\xd6\x7f\xcf\x44\x37\x7e\xc7\x2d\x3d\x47\xf6\xa8\x7f\x37\x31\x61\x97\xce\x2d\xdb\x78\x8f\xd3\xdb\x0a\x03\xed\x67\x59\x07\xe6\x6e\x1e\xcc\xd9\x3a\x58\xa4\x9f\x4f\x4c\x52\x3c\x08\x75\x7c\xf3\xb3\x4b\xc0\xd0\x69\x92\xa0\xbd\xf2\x37\x93\x2c\x6e\x29\x4e\xd2\x56\xc7\x49\xef\x79\x9a\x95\x7e\x3b\xf2\x71\xb6\xdf\x67\x4e\x54\x1f\xfe\x3c\xcb\x64\xa7\xf7\xc7\x67\x4e\xd4\x9a\xe6\x99\xa7\x9b\xb1\xb3\x3d\x73\xce\xdd\x9c\x2d\xe3\x67\x00\x0d\x47\x21\x5f\xf5\xe9\x13\xd5\xc4\xa0\xf5\x22\x0b\x12\x6d\x1b\xfb\x31\x3d\x1f\xfd\xe2\xe8\x6c\x9e\x9d\x47\xeb\xc7\xf0\xe3\xe1\x76\x42\xa2\xac\x39\x8d\xfb\x51\x8f\x05\xa9\xe6\xd8\x2e\xfd\x80\x0b\xd6\xb4\xe5\xb2\x67\x8c\xdc\xd7\xbf\x0e\x68\xef\x9e\x4b\xe1\x7c\xac\xfc\x6d\x15\x9f\x7b\x89\x61\x54\xed\x63\xe0\xd5\x91\xdd\x51\xbe\x02\x6f\x43\xf3\xca\x6b\xcb\x88\xa6\xf7\x2e\xac\x1b\xfe\x5a\x35\x54\x76\x84\xdf\x7e\xbf\xf8\x5f\x00\x00\x00\xff\xff\xaa\x07\xfe\xc9\xfd\x36\x00\x00") func operatorsCoreosCom_installplansYamlBytes() ([]byte, error) { return bindataRead( @@ -144,7 +144,7 @@ func operatorsCoreosCom_installplansYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\x1b\xb9\x11\x7f\xf7\xa7\x18\xa8\x05\x62\xa7\xd2\x3a\xce\x15\xe9\x9d\x80\x20\x08\x72\x4d\x11\x24\xbe\x04\xb1\x7b\x0f\xb5\xdc\x66\x76\x39\x92\x78\xd9\x25\xf7\xf8\x47\xb6\xee\x70\xdf\xbd\x18\x72\x57\xbb\xb2\x56\x8a\x8b\xa4\xc1\xb5\x20\x5f\x2c\x91\xb3\xc3\xe1\xfc\xff\xd1\x2b\xac\xe5\x8f\x64\xac\xd4\x6a\x0a\x58\x4b\xba\x75\xa4\xf8\x9b\xcd\x3e\x7e\x6b\x33\xa9\x4f\x57\x67\x47\x1f\xa5\x12\x53\x78\xe1\xad\xd3\xd5\x7b\xb2\xda\x9b\x82\xbe\xa7\xb9\x54\xd2\x49\xad\x8e\x2a\x72\x28\xd0\xe1\xf4\x08\x00\x95\xd2\x0e\x79\xda\xf2\x57\x80\x42\x2b\x67\x74\x59\x92\x99\x2c\x48\x65\x1f\x7d\x4e\xb9\x97\xa5\x20\x13\x98\xb7\x5b\xaf\x1e\x65\x4f\xb2\x47\x47\x00\x85\xa1\xf0\xf8\xa5\xac\xc8\x3a\xac\xea\x29\x28\x5f\x96\x47\x00\x0a\x2b\x9a\x82\xae\xc9\xa0\xd3\xa6\xd0\x4a\x84\xed\x6d\xd6\x4e\xd9\xac\xd0\x86\x34\xff\xa9\x8e\x6c\x4d\x05\x4b\xb0\x30\xda\xd7\xdd\x63\x5b\x34\x91\x67\x2b\x28\x3a\x5a\x68\x23\xdb\xef\x00\x13\xd0\x65\x15\x3e\x47\x05\xbc\x6d\x78\xbc\x68\xb7\x0e\x6b\xa5\xb4\xee\xf5\xf0\xfa\x1b\x69\x5d\xa0\xa9\x4b\x6f\xb0\x1c\x12\x3e\x2c\xdb\xa5\x36\xee\x87\x4e\x14\xde\xba\xd8\xda\xc4\x4a\xb5\xf0\x25\x9a\x01\x16\x47\x00\xb6\xd0\x35\x4d\x21\x70\xa8\xb1\x20\x71\x04\xd0\x68\xb6\xe1\x38\x69\xb4\xb7\x3a\x6b\x36\xb0\xc5\x92\x2a\x6c\xb7\x03\x66\xab\x9e\xbf\x7b\xf5\xe3\x37\x17\x77\x16\x00\x04\xd9\xc2\xc8\xda\x05\x3b\xed\x9c\x11\xa4\x05\x6c\x7c\x03\x5a\xe7\x00\x3d\x07\xb7\xae\x09\x3e\xec\xd0\x7f\x80\x9b\xa5\x2c\x96\xfc\x98\xb7\x24\xc0\x69\x3e\xea\x8a\xd6\x20\xd5\x5c\x9b\x2a\x18\x9f\x67\xdf\xbe\x39\x07\xcc\xb5\x77\xe0\x96\x04\xd6\xa1\x0b\x6c\x51\x6d\x54\x90\xf5\x84\xe4\xdd\xa6\xa0\xf3\x9f\xa8\x70\xbd\x69\x43\x3f\x7b\x69\x48\xf4\xcf\xc3\xda\x68\x5d\xb6\x37\x5d\x1b\xe6\xeb\x7a\xf6\x8f\xa3\x17\x20\x5b\xf3\x77\x14\xf3\x80\xb5\x17\xe9\x40\x70\x6c\x90\x0d\x82\x37\x76\x20\xd1\xa8\x3c\xa8\x66\x29\x2d\x18\xaa\x0d\x59\x52\x31\x5a\xda\xa3\x85\x03\x64\x70\x41\x86\x1f\x64\xcf\xf0\xa5\x88\x1a\x32\x0e\x0c\x15\x7a\xa1\xe4\x2f\x1b\x6e\x96\x35\xc5\xdb\x94\xe8\xc8\x3a\x90\xca\x91\x51\x58\xc2\x0a\x4b\x4f\x63\x40\x25\xa0\xc2\x35\x18\x62\xbe\xe0\x55\x8f\x43\x20\xb1\x19\x9c\x6b\x43\x41\xf9\x53\x58\x3a\x57\xdb\xe9\xe9\xe9\x42\xba\x36\xfc\x0b\x5d\x55\x5e\x49\xb7\x3e\x0d\x91\x2c\x73\xcf\x51\x74\x2a\x68\x45\xe5\xa9\x95\x8b\x09\x9a\x62\x29\x1d\x15\xce\x1b\x3a\xc5\x5a\x4e\x82\xb0\x2a\x86\x66\x25\xfe\x60\x1a\x9f\xb0\x0f\xee\xa8\x2f\x9a\xcc\x3a\x23\xd5\x62\x6b\x29\x44\xdb\x41\x5d\x73\xbc\x45\xc7\x8b\x8f\xc7\xb3\x74\x2a\xe5\x29\xd6\xca\xfb\xbf\x5e\x5c\x42\x2b\x40\x54\x7b\xd4\x70\x47\x6a\x3b\x65\xb3\xa2\xa4\x9a\x93\x89\x94\x73\xa3\xab\xc0\x85\x94\xa8\xb5\x54\xd1\x11\x8b\x52\x92\x72\x60\x7d\x5e\x49\x67\x83\x83\x91\x75\x6c\x87\x0c\x5e\x84\xec\x07\x39\x81\xaf\x05\x3a\x12\x19\xbc\x52\xf0\x02\x2b\x2a\x5f\xa0\xa5\xff\xba\xaa\x59\xa3\x76\xc2\xea\xbb\xbf\xb2\xfb\xc9\x7b\xf7\x81\x9d\x80\x02\x68\x13\xeb\x5e\xeb\xec\x84\xfc\x45\x4d\x05\x60\x59\xea\x1b\xb6\x58\x51\x7a\xeb\xc8\x00\x8a\x4a\xaa\x3d\xe1\x7f\x38\xee\x9b\xec\x30\x86\x5a\x3b\x3e\x3d\x96\xe5\x1a\xf4\x8a\x8c\x91\x82\x2d\x1f\x9f\x31\x54\x6b\xe3\x48\x40\xbe\x0e\x9c\x86\xb2\xc6\xc1\x83\xee\x4f\x09\xf1\xc8\x75\xa9\xd7\x15\x7b\xd0\xee\x62\xcb\x15\x8d\xc1\xf5\xc0\xaa\x74\x54\x0d\x3e\x76\xc0\x50\x3c\x9a\x43\x0e\xc9\xf3\x19\x5b\x6e\x59\x6f\xd4\x65\x76\xf6\x42\x94\xca\x82\x20\x87\xb2\xb4\x30\xd7\x06\xb4\x22\x40\xf6\x01\x17\x33\x19\x41\xe1\x8d\x09\x21\xd1\x9a\x2a\x44\xcf\xf3\x77\xaf\x36\xe5\x20\x83\xc9\x64\x02\x97\x3c\x6d\x9d\xf1\x85\xe3\xd8\xe5\x54\xa5\x04\x89\xc0\x55\x48\x13\xf2\x93\x65\xe6\x6c\xeb\x70\x0c\xc0\xe8\x04\x73\x49\xa5\x80\x1a\xdd\x12\x32\xde\xc5\x73\xf9\xde\x94\x7f\x80\x97\xda\x00\xdd\x62\x55\x97\x34\x8e\x75\xe7\xa5\xd6\x17\x81\xb0\xd9\xf0\xd7\x70\xd0\xd3\x53\x78\xbf\x89\xfb\xe8\x14\xb9\x25\xb3\x8a\xfd\x4a\xf0\x32\x98\x6b\xfd\xc0\x6e\x9f\x29\x6b\x1f\x7e\xad\xf4\x8d\x1a\x12\x21\xec\x89\x86\xa6\x30\x1b\x3d\x5f\xa1\x2c\x31\x2f\x69\x36\x1a\xc3\x6c\xf4\xce\xe8\x85\x21\xcb\x05\x9c\x27\x38\x21\xcf\x46\xdf\xd3\xc2\xa0\x20\x31\x1b\xb5\xac\xff\x54\xa3\x2b\x96\xe7\x64\x16\xf4\x9a\xd6\x4f\x03\xc3\xad\xa5\x0b\x67\xb8\x41\x59\x3f\xad\x98\x66\xb3\xc6\xdd\xc7\xe5\xba\xa6\xa7\x15\xd6\x5b\x93\xe7\x58\x6f\x31\xda\x98\xd5\xc2\xd5\x35\x07\xfd\xea\x2c\xeb\x4c\xfd\xe1\x27\xab\xd5\x74\x36\xea\xce\x34\xd6\x15\xbb\x4c\xed\xd6\xb3\x11\x6c\x49\x30\x9d\x8d\x82\x0c\xed\x7c\x2b\xf4\x74\x36\xe2\xdd\x78\xda\x68\xa7\x73\x3f\x9f\xce\x46\xf9\xda\x91\x1d\x9f\x8d\x0d\xd5\x63\x6e\x41\x9e\x76\x3b\xcc\x46\x1f\x60\xa6\x5a\xa1\xb5\x5b\x92\x89\x96\xb6\xf0\xdb\xe8\x40\x6c\x0c\x86\x6a\x1c\xc3\xe5\xbe\x1b\x5c\xf8\xad\xc5\x05\xed\x5d\x37\x84\xb6\xe9\xb9\x86\x96\xa3\xe9\xf7\x2e\xb3\x80\x83\x8b\x87\x32\x49\x1c\x25\x5a\x77\x69\x50\x59\xd9\x76\xbf\xfb\x28\xef\x04\xec\xee\x83\x1c\x5d\xb1\x27\xb0\x0e\x1c\x4f\x84\x30\xdd\x18\xdb\x6d\xa8\x39\xfa\xb8\xca\x71\x50\xc7\xa3\x71\x6e\x45\x15\x8c\x91\x35\x11\x1b\x5b\x90\x9c\xe0\x66\x49\x2a\xb0\xf2\x4a\x90\x29\xd7\x9c\x6b\x3b\xae\xc5\x12\xd5\x82\x4b\x1e\xbc\xe2\x14\x80\x21\xc8\xb9\x1c\x7e\xe4\xa8\x19\xf3\x83\x0a\xbc\x6d\x4b\x73\x90\x6b\xc3\x91\xb3\x45\x8c\xf2\x86\x4d\xa8\xee\x45\x41\xb5\xe3\x50\xba\x9b\xb3\xbb\x71\x30\x5d\xb6\x23\x16\x96\x29\x70\x4d\x9e\xf0\xc6\x7b\x28\x1b\xe7\xb8\xa7\xe2\x1b\xea\xd8\x87\x2c\x7d\x85\x8a\xbd\x47\xb0\xbc\xdd\x9a\x12\xb2\xc0\xd0\x8f\xb4\x49\xb4\xab\x6d\x9d\x1d\x1a\x55\x73\x03\x92\x13\xa7\xbf\x10\x78\xcd\xb1\x3e\xf3\xf0\x15\xde\xbe\x21\xb5\x70\xcb\x29\x7c\xf3\xf8\x2f\x4f\xbe\xdd\x43\x18\x33\x21\x89\xbf\x91\xe2\x3a\x39\xd0\xee\xee\x51\xc3\xee\x83\xbd\xe6\x2a\x9c\x33\x6b\x7b\x8c\x6c\xd1\xd1\x04\x0f\xd9\xf6\xcb\x1b\xb4\x60\xc9\x41\x8e\x0c\x0c\x7c\xcd\x7a\xe1\xd4\x2e\x95\x75\xa8\x0a\x1a\x83\x9c\x0f\x33\x93\x9b\x8c\x5d\xae\xe1\xec\xf1\x18\xf2\x46\xc5\xbb\xb9\xfa\xea\xf6\x3a\x1b\x10\x59\x5a\xf8\x6e\x7c\x47\x1e\xee\x16\x7d\x28\x73\xec\x38\x70\x23\xdd\x92\x9b\xc9\x50\xfb\x9a\xb6\x7b\xa0\xf6\xd1\x46\xde\x4f\x19\x8e\x2b\xe0\x82\xcc\x27\xdd\x56\x2a\xf7\xe4\xcf\xfb\xed\x2b\x95\xac\x7c\x35\x85\x47\x7b\x48\x62\x4a\xbb\xa7\x35\x23\x71\x57\xfa\x91\x53\xd7\xc2\x60\xc5\x9d\x59\x01\x52\x70\xc3\x35\x97\x64\xfa\xae\xcd\x87\x6e\x1e\xe4\x62\xbe\xa5\xc5\x07\xb6\xc9\x43\x3d\x67\x7f\x67\xb4\xf0\x05\xb7\xdc\x7a\x1e\xfa\x49\x39\x97\x45\x3f\x41\x71\x1f\x1b\xa2\x21\x22\x29\xa0\x5b\x56\xfa\x06\xb3\x44\x58\x43\xa8\xa4\x5a\xd8\x66\x4b\x6e\xd8\x39\x81\xc4\x12\x7b\xb3\xa4\x50\x4f\x02\x02\x6b\x9e\x31\x41\x2a\x2b\x05\x19\x12\x80\xb0\xf0\x68\x50\x39\x22\xc1\xe9\x87\x43\xb0\xa1\xed\xa5\x3c\xec\xba\xf7\x36\x1a\x63\xa8\xc6\x64\xc5\x22\x36\x1d\x7f\x88\xd8\x2f\x17\xaa\x67\x8f\x1e\x1f\x34\xf9\x86\x6e\x2f\x51\x8d\x8e\xb1\xe0\x14\xfe\x79\xf5\x7c\xf2\x0f\x9c\xfc\x72\x7d\xdc\x7c\x78\x34\xf9\xee\x5f\xe3\xe9\xf5\xc3\xde\xd7\xeb\x93\x67\x7f\xdc\xc3\x29\x46\xd0\x3d\xdd\xa7\x29\x22\x6d\x67\xd8\x5a\x74\x1c\x2a\x8c\x9e\xc3\xa5\x61\x54\xfa\x12\x4b\x4b\x63\xf8\xbb\x0a\xa5\xe1\x33\x95\x46\xca\x57\xfb\xa5\xe3\xaa\x3c\xe2\x5d\x87\x3b\x8a\x0d\x49\x10\xe9\x30\x4d\x23\xee\x1e\x9a\x20\xeb\xfd\x94\x14\x7a\x32\x3d\xef\x67\x9a\x1e\x4a\x84\x90\xf1\xb8\x0f\xcd\x9a\x9e\x36\x2b\x74\x75\xda\x43\x91\xdc\x4c\x9f\xa3\x5a\x43\x97\xd6\x62\x07\x7a\xd7\xd3\x2d\xc3\x23\xc0\xc2\x68\x6b\x37\x30\xd8\x42\x29\x3f\x12\x6c\xda\xd4\x98\x2c\x73\x2a\x30\x74\xdf\x26\x97\xce\xa0\x59\x77\xd2\x59\x28\x50\x05\x50\x6b\x69\xee\x4b\x38\xb6\x44\x90\x29\x2d\x68\x37\xbb\x9e\xc4\x1c\x8a\xb9\x2c\xa5\x5b\x73\x96\x14\x54\x68\x35\x2f\x65\xd3\xf4\x57\x0c\xca\x50\xb9\x18\x6e\x86\x16\x74\x0b\xd2\x41\xc5\x8d\x24\x59\x26\x39\x16\xca\x9e\x9d\x3d\xfe\xe6\xc2\xe7\x42\x57\x28\xd5\xcb\xca\x9d\x9e\x3c\x3b\xfe\xd9\x63\xc9\x99\x47\xfc\x80\x15\xbd\xac\xdc\xc9\x97\x2b\x8b\x67\x4f\xee\x11\x45\xc7\x57\x31\x56\xae\x8f\xaf\x26\xcd\xa7\x87\xed\xd4\xc9\xb3\xe3\x59\x76\x70\xfd\xe4\x21\x9f\xa1\x17\x81\xd7\x57\x93\x2e\xfc\xb2\xeb\x87\x27\xcf\x7a\x6b\x27\xbb\xc1\xc8\x15\x4b\x16\xf4\xbc\x28\xb4\xff\x6a\x98\x73\x38\xf6\x3f\x81\xf6\x63\x0a\x68\xf1\xfe\x36\x6c\x1f\xc0\xfa\xd2\xd9\xa6\x7c\x46\x58\x1f\x3d\xa3\x49\x24\x9c\x60\x9d\x41\x59\x46\xb7\x2a\x9c\xc7\xb2\x77\x27\x00\x76\x6d\x1d\x55\x5f\x08\xd2\x77\x6e\x9c\xe0\x75\x82\xd7\x09\x5e\xef\x8c\x4f\xc3\xeb\x5d\x30\x9a\x90\x78\x42\xe2\xdd\x48\x48\x3c\x21\xf1\x84\xc4\xef\x65\xcd\x84\xc4\x13\x12\xdf\x1e\x09\x89\x37\x34\x09\x89\x27\x24\xfe\xb5\x91\x78\xac\x53\x53\x70\xc6\xb7\x4d\x8b\x75\xda\x70\x93\x02\x73\x76\xd9\x76\xd2\xe7\x1b\xfb\x76\x5e\xd8\x84\x2e\xfc\xfa\xdb\xf6\xeb\x38\x8f\xd3\xeb\x38\xe9\x75\x9c\xf4\x3a\x4e\x7a\x1d\xa7\x1d\x5f\xfb\x75\x9c\xed\xeb\xb9\xf8\xce\xcc\xd6\x75\x5c\xf0\xd9\xda\xe8\x95\x14\x64\xef\xbc\xbc\x13\xfa\xf0\x3b\x55\xa6\x42\xe5\xfb\x2f\xe4\xd0\xd7\x79\x1d\x27\xdd\xdd\xa5\xbb\xbb\x74\x77\x97\xee\xee\xd2\xdd\x5d\xba\xbb\x4b\x77\x77\xe9\xee\xae\x1b\xe9\xee\x2e\xdd\xdd\xed\x33\x79\xba\xbb\x6b\x47\xba\xbb\x4b\x77\x77\x03\xa6\xf8\xff\xb8\xbb\xeb\x7b\x50\xfa\xd5\x46\x82\xa6\x09\x9a\xfe\x8f\x41\xd3\x84\x37\x13\xde\x4c\x78\x73\x60\x24\xbc\x99\xf0\x66\xc2\x9b\x09\x6f\xee\x8c\x84\x37\x1b\x9a\x84\x37\x13\xde\x4c\xbf\xda\xf8\x0f\x7f\xb5\xf1\xf6\xcd\x79\xef\x4d\x90\xf8\x86\x48\xcf\xb3\x96\xb8\x22\xc8\x89\xd4\xa6\x8d\x48\xff\xc5\x4d\x50\x39\x41\xe5\xdf\x03\x54\x4e\xff\xc5\x4d\xa8\x3a\xa1\xea\x3d\x23\xa1\xea\x84\xaa\x13\xaa\x4e\xa8\x3a\xa1\xea\x43\x24\x09\x55\x27\x54\x3d\x34\x7e\xc7\xbf\xc0\xe8\xcf\x7d\xea\x07\x18\xff\x0e\x00\x00\xff\xff\xa4\x54\x9b\x0f\xf2\x56\x00\x00") +var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\x1b\xb9\x11\x7f\xf7\xa7\x18\xa8\x05\x62\xa7\xd2\x2a\xf6\x15\xe9\x9d\x80\x20\x08\x72\x4d\x11\x24\xbe\x04\xb1\x7b\x0f\xb5\xdc\x66\x76\x39\x5a\xf1\xb2\x4b\xee\x91\x5c\xd9\xba\xc3\x7d\xf7\x62\xc8\x5d\xed\xca\x5a\xc9\x2e\x92\x06\xd7\x82\x7c\xb1\x44\xce\x0e\x87\xf3\xff\x47\xaf\xb0\x92\x3f\x92\xb1\x52\xab\x19\x60\x25\xe9\xd6\x91\xe2\x6f\x36\xf9\xf4\xad\x4d\xa4\x9e\xae\x4e\x8f\x3e\x49\x25\x66\xf0\xb2\xb6\x4e\x97\x1f\xc8\xea\xda\x64\xf4\x3d\x2d\xa4\x92\x4e\x6a\x75\x54\x92\x43\x81\x0e\x67\x47\x00\xa8\x94\x76\xc8\xd3\x96\xbf\x02\x64\x5a\x39\xa3\x8b\x82\xcc\x24\x27\x95\x7c\xaa\x53\x4a\x6b\x59\x08\x32\x9e\x79\xbb\xf5\xea\x49\xf2\x34\x39\x3b\x02\xc8\x0c\xf9\xc7\x2f\x65\x49\xd6\x61\x59\xcd\x40\xd5\x45\x71\x04\xa0\xb0\xa4\x19\xe8\x8a\x0c\x3a\x6d\x32\xad\x84\xdf\xde\x26\xed\x94\x4d\x32\x6d\x48\xf3\x9f\xf2\xc8\x56\x94\xb1\x04\xb9\xd1\x75\xd5\x3d\xb6\x45\x13\x78\xb6\x82\xa2\xa3\x5c\x1b\xd9\x7e\x07\x98\x80\x2e\x4a\xff\x39\x28\xe0\x5d\xc3\xe3\x65\xbb\xb5\x5f\x2b\xa4\x75\x6f\x86\xd7\xdf\x4a\xeb\x3c\x4d\x55\xd4\x06\x8b\x21\xe1\xfd\xb2\x5d\x6a\xe3\x7e\xe8\x44\xe1\xad\xb3\xad\x4d\xac\x54\x79\x5d\xa0\x19\x60\x71\x04\x60\x33\x5d\xd1\x0c\x3c\x87\x0a\x33\x12\x47\x00\x8d\x66\x1b\x8e\x93\x46\x7b\xab\xd3\x66\x03\x9b\x2d\xa9\xc4\x76\x3b\x60\xb6\xea\xc5\xfb\xd7\x3f\x7e\x73\x71\x67\x01\x40\x90\xcd\x8c\xac\x9c\xb7\xd3\xce\x19\x41\x5a\xc0\xc6\x37\xa0\x75\x0e\xd0\x0b\x70\xeb\x8a\xe0\xe3\x0e\xfd\x47\xb8\x59\xca\x6c\xc9\x8f\xd5\x96\x04\x38\xcd\x47\x5d\xd1\x1a\xa4\x5a\x68\x53\x7a\xe3\xf3\xec\xbb\xb7\xe7\x80\xa9\xae\x1d\xb8\x25\x81\x75\xe8\x3c\x5b\x54\x1b\x15\x24\x3d\x21\x79\xb7\x19\xe8\xf4\x27\xca\x5c\x6f\xda\xd0\xcf\xb5\x34\x24\xfa\xe7\x61\x6d\xb4\x2e\xdb\x9b\xae\x0c\xf3\x75\x3d\xfb\x87\xd1\x0b\x90\xad\xf9\x3b\x8a\x79\xc4\xda\x0b\x74\x20\x38\x36\xc8\x7a\xc1\x1b\x3b\x90\x68\x54\xee\x55\xb3\x94\x16\x0c\x55\x86\x2c\xa9\x10\x2d\xed\xd1\xfc\x01\x12\xb8\x20\xc3\x0f\xb2\x67\xd4\x85\x08\x1a\x32\x0e\x0c\x65\x3a\x57\xf2\x97\x0d\x37\xcb\x9a\xe2\x6d\x0a\x74\x64\x1d\x48\xe5\xc8\x28\x2c\x60\x85\x45\x4d\x63\x40\x25\xa0\xc4\x35\x18\x62\xbe\x50\xab\x1e\x07\x4f\x62\x13\x38\xd7\x86\xbc\xf2\x67\xb0\x74\xae\xb2\xb3\xe9\x34\x97\xae\x0d\xff\x4c\x97\x65\xad\xa4\x5b\x4f\x7d\x24\xcb\xb4\xe6\x28\x9a\x0a\x5a\x51\x31\xb5\x32\x9f\xa0\xc9\x96\xd2\x51\xe6\x6a\x43\x53\xac\xe4\xc4\x0b\xab\x42\x68\x96\xe2\x0f\xa6\xf1\x09\xfb\xe8\x8e\xfa\x82\xc9\xac\x33\x52\xe5\x5b\x4b\x3e\xda\x0e\xea\x9a\xe3\x2d\x38\x5e\x78\x3c\x9c\xa5\x53\x29\x4f\xb1\x56\x3e\xfc\xf5\xe2\x12\x5a\x01\x82\xda\x83\x86\x3b\x52\xdb\x29\x9b\x15\x25\xd5\x82\x4c\xa0\x5c\x18\x5d\x7a\x2e\xa4\x44\xa5\xa5\x0a\x8e\x98\x15\x92\x94\x03\x5b\xa7\xa5\x74\xd6\x3b\x18\x59\xc7\x76\x48\xe0\xa5\xcf\x7e\x90\x12\xd4\x95\x40\x47\x22\x81\xd7\x0a\x5e\x62\x49\xc5\x4b\xb4\xf4\x5f\x57\x35\x6b\xd4\x4e\x58\x7d\x0f\x57\x76\x3f\x79\xef\x3e\xb0\x13\x50\x00\x6d\x62\xdd\x6b\x9d\x9d\x90\xbf\xa8\x28\x03\x2c\x0a\x7d\xc3\x16\xcb\x8a\xda\x3a\x32\x80\xa2\x94\x6a\x4f\xf8\x1f\x8e\xfb\x26\x3b\x8c\xa1\xd2\x8e\x4f\x8f\x45\xb1\x06\xbd\x22\x63\xa4\x60\xcb\x87\x67\x0c\x55\xda\x38\x12\x90\xae\x3d\xa7\xa1\xac\x71\xf0\xa0\xfb\x53\x42\x38\x72\x55\xe8\x75\xc9\x1e\xb4\xbb\xd8\x72\x45\x63\x70\x3d\xb0\x2a\x1d\x95\x83\x8f\x1d\x30\x14\x8f\xe6\x90\x43\xf2\x7c\xc6\x96\x5b\xd6\x1b\x75\x99\x9d\xbd\x10\xa5\xb2\x20\xc8\xa1\x2c\x2c\x2c\xb4\x01\xad\x08\x90\x7d\xc0\x85\x4c\x46\x90\xd5\xc6\xf8\x90\x68\x4d\xe5\xa3\xe7\xc5\xfb\xd7\x9b\x72\x90\xc0\x64\x32\x81\x4b\x9e\xb6\xce\xd4\x99\xe3\xd8\xe5\x54\xa5\x04\x09\xcf\x55\x48\xe3\xf3\x93\x65\xe6\x6c\x6b\x7f\x0c\xc0\xe0\x04\x0b\x49\x85\x80\x0a\xdd\x12\x12\xde\xa5\xe6\xf2\xbd\x29\xff\x00\xaf\xb4\x01\xba\xc5\xb2\x2a\x68\x1c\xea\xce\x2b\xad\x2f\x3c\x61\xb3\xe1\xaf\xfe\xa0\xd3\x29\x7c\xd8\xc4\x7d\x70\x8a\xd4\x92\x59\x85\x7e\xc5\x7b\x19\x2c\xb4\x7e\x64\xb7\xcf\x94\xb4\x0f\xbf\x51\xfa\x46\x0d\x89\xe0\xf7\x44\x43\x33\x98\x8f\x5e\xac\x50\x16\x98\x16\x34\x1f\x8d\x61\x3e\x7a\x6f\x74\x6e\xc8\x72\x01\xe7\x09\x4e\xc8\xf3\xd1\xf7\x94\x1b\x14\x24\xe6\xa3\x96\xf5\x9f\x2a\x74\xd9\xf2\x9c\x4c\x4e\x6f\x68\xfd\xcc\x33\xdc\x5a\xba\x70\x86\x1b\x94\xf5\xb3\x92\x69\x36\x6b\xdc\x7d\x5c\xae\x2b\x7a\x56\x62\xb5\x35\x79\x8e\xd5\x16\xa3\x8d\x59\x2d\x5c\x5d\x73\xd0\xaf\x4e\x93\xce\xd4\x1f\x7f\xb2\x5a\xcd\xe6\xa3\xee\x4c\x63\x5d\xb2\xcb\x54\x6e\x3d\x1f\xc1\x96\x04\xb3\xf9\xc8\xcb\xd0\xce\xb7\x42\xcf\xe6\x23\xde\x8d\xa7\x8d\x76\x3a\xad\x17\xb3\xf9\x28\x5d\x3b\xb2\xe3\xd3\xb1\xa1\x6a\xcc\x2d\xc8\xb3\x6e\x87\xf9\xe8\x23\xcc\x55\x2b\xb4\x76\x4b\x32\xc1\xd2\x16\x7e\x1b\x1d\x88\x8d\xc1\x50\x0d\x63\xb8\xdc\x77\x83\x0b\xbf\xb5\x98\xd3\xde\x75\x43\x68\x9b\x9e\x6b\x68\x39\x98\x7e\xef\x32\x0b\x38\xb8\x78\x28\x93\x84\x51\xa0\x75\x97\x06\x95\x95\x6d\xf7\xbb\x8f\xf2\x4e\xc0\xee\x3e\xc8\xd1\x15\x7a\x02\xeb\xc0\xf1\x84\x0f\xd3\x8d\xb1\xdd\x86\x9a\xa3\x8f\xab\x1c\x07\x75\x38\x1a\xe7\x56\x54\xde\x18\x49\x13\xb1\xa1\x05\x49\x09\x6e\x96\xa4\x3c\xab\x5a\x09\x32\xc5\x9a\x73\x6d\xc7\x35\x5b\xa2\xca\xb9\xe4\xc1\x6b\x4e\x01\xe8\x83\x9c\xcb\xe1\x27\x8e\x9a\x31\x3f\xa8\xa0\xb6\x6d\x69\xf6\x72\x6d\x38\x72\xb6\x08\x51\xde\xb0\xf1\xd5\x3d\xcb\xa8\x72\x1c\x4a\x77\x73\x76\x37\x0e\xa6\xcb\x76\x84\xc2\x32\x03\xae\xc9\x13\xde\x78\x0f\x65\xe3\x1c\x0f\x54\x7c\x43\x1d\xfa\x90\x65\x5d\xa2\x62\xef\x11\x2c\x6f\xb7\xa6\x84\xcc\xd0\xf7\x23\x6d\x12\xed\x6a\x5b\x67\x87\x46\xd5\xdc\x80\xa4\xc4\xe9\xcf\x07\x5e\x73\xac\xcf\x3c\x7c\x89\xb7\x6f\x49\xe5\x6e\x39\x83\x6f\xce\xfe\xf2\xf4\xdb\x3d\x84\x21\x13\x92\xf8\x1b\x29\xae\x93\x03\xed\xee\x1e\x35\xec\x3e\xd8\x6b\xae\xfc\x39\x93\xb6\xc7\x48\xf2\x8e\xc6\x7b\xc8\xb6\x5f\xde\xa0\x05\x4b\x0e\x52\x64\x60\x50\x57\xac\x17\x4e\xed\x52\x59\x87\x2a\xa3\x31\xc8\xc5\x30\x33\xb9\xc9\xd8\xc5\x1a\x4e\xcf\xc6\x90\x36\x2a\xde\xcd\xd5\x57\xb7\xd7\xc9\x80\xc8\xd2\xc2\x77\xe3\x3b\xf2\x70\xb7\x58\xfb\x32\xc7\x8e\x03\x37\xd2\x2d\xb9\x99\xf4\xb5\xaf\x69\xbb\x07\x6a\x1f\x6d\xe4\xbd\xcf\x70\x5c\x01\x73\x32\xf7\xba\xad\x54\xee\xe9\x9f\xf7\xdb\x57\x2a\x59\xd6\xe5\x0c\x9e\xec\x21\x09\x29\xed\x81\xd6\x0c\xc4\x5d\xe9\x47\x4e\x5d\xb9\xc1\x92\x3b\xb3\x0c\xa4\xe0\x86\x6b\x21\xc9\xf4\x5d\x9b\x0f\xdd\x3c\xc8\xc5\x7c\x4b\x8b\x8f\x6c\x93\x87\x7a\xce\xfe\xde\x68\x51\x67\xdc\x72\xeb\x85\xef\x27\xe5\x42\x66\xfd\x04\xc5\x7d\xac\x8f\x86\x80\xa4\x80\x6e\x59\xe9\x1b\xcc\x12\x60\x0d\xa1\x92\x2a\xb7\xcd\x96\xdc\xb0\x73\x02\x09\x25\xf6\x66\x49\xbe\x9e\x78\x04\xd6\x3c\x63\xbc\x54\x56\x0a\x32\x24\x00\x21\xaf\xd1\xa0\x72\x44\x82\xd3\x0f\x87\x60\x43\xdb\x4b\x79\xd8\x75\xef\x6d\x34\x86\x50\x0d\xc9\x8a\x45\x6c\x3a\x7e\x1f\xb1\x5f\x2e\x54\x4f\x9f\x9c\x1d\x34\xf9\x86\x6e\x2f\x51\x85\x8e\xb1\xe0\x0c\xfe\x79\xf5\x62\xf2\x0f\x9c\xfc\x72\x7d\xdc\x7c\x78\x32\xf9\xee\x5f\xe3\xd9\xf5\xe3\xde\xd7\xeb\x93\xe7\x7f\xdc\xc3\x29\x44\xd0\x03\xdd\xa7\x29\x22\x6d\x67\xd8\x5a\x74\xec\x2b\x8c\x5e\xc0\xa5\x61\x54\xfa\x0a\x0b\x4b\x63\xf8\xbb\xf2\xa5\xe1\x33\x95\x46\xaa\x2e\xf7\x4b\xc7\x55\x79\xc4\xbb\x0e\x77\x14\x1b\x12\x2f\xd2\x61\x9a\x46\xdc\x3d\x34\x5e\xd6\x87\x29\xc9\xf7\x64\x7a\xd1\xcf\x34\x3d\x94\x08\x3e\xe3\x71\x1f\x9a\x34\x3d\x6d\x92\xe9\x72\xda\x43\x91\xdc\x4c\x9f\xa3\x5a\x43\x97\xd6\x42\x07\x7a\xd7\xd3\x2d\xc3\x23\xc0\xcc\x68\x6b\x37\x30\xd8\x42\x21\x3f\x11\x6c\xda\xd4\x90\x2c\x53\xca\xd0\x77\xdf\x26\x95\xce\xa0\x59\x77\xd2\x59\xc8\x50\x79\x50\x6b\x69\x51\x17\x70\x6c\x89\x20\x51\x5a\xd0\x6e\x76\x3d\x09\x39\x14\x53\x59\x48\xb7\xe6\x2c\x29\x28\xd3\x6a\x51\xc8\xa6\xe9\x2f\x19\x94\xa1\x72\x21\xdc\x0c\xe5\x74\x0b\xd2\x41\xc9\x8d\x24\x59\x26\x39\x16\xca\x9e\x9e\x9e\x7d\x73\x51\xa7\x42\x97\x28\xd5\xab\xd2\x4d\x4f\x9e\x1f\xff\x5c\x63\xc1\x99\x47\xfc\x80\x25\xbd\x2a\xdd\xc9\x97\x2b\x8b\xa7\x4f\x1f\x10\x45\xc7\x57\x21\x56\xae\x8f\xaf\x26\xcd\xa7\xc7\xed\xd4\xc9\xf3\xe3\x79\x72\x70\xfd\xe4\x31\x9f\xa1\x17\x81\xd7\x57\x93\x2e\xfc\x92\xeb\xc7\x27\xcf\x7b\x6b\x27\xbb\xc1\xc8\x15\x4b\x66\xf4\x22\xcb\x74\xfd\xd5\x30\xe7\x70\xec\xdf\x83\xf6\x43\x0a\x68\xf1\xfe\x36\x6c\x1f\xc0\xfa\xd2\xd9\xa6\x7c\x06\x58\x1f\x3c\xa3\x49\x24\x9c\x60\x9d\x41\x59\x04\xb7\xca\x5c\x8d\x45\xef\x4e\x00\xec\xda\x3a\x2a\xbf\x10\xa4\xef\xdc\x38\xc2\xeb\x08\xaf\x23\xbc\xde\x19\xf7\xc3\xeb\x5d\x30\x1a\x91\x78\x44\xe2\xdd\x88\x48\x3c\x22\xf1\x88\xc4\x1f\x64\xcd\x88\xc4\x23\x12\xdf\x1e\x11\x89\x37\x34\x11\x89\x47\x24\xfe\xb5\x91\x78\xa8\x53\x33\x70\xa6\x6e\x9b\x16\xeb\xb4\xe1\x26\x05\x16\xec\xb2\xed\x64\x9d\x6e\xec\xdb\x79\x61\x13\xba\xf0\xeb\x6f\xdb\xaf\xe3\x9c\xc5\xd7\x71\xe2\xeb\x38\xf1\x75\x9c\xf8\x3a\x4e\x3b\xbe\xf6\xeb\x38\xdb\xd7\x73\xe1\x9d\x99\xad\xeb\x38\xef\xb3\x95\xd1\x2b\x29\xc8\xde\x79\x79\xc7\xf7\xe1\x77\xaa\x4c\x89\xaa\xee\xbf\x90\x43\x5f\xe7\x75\x9c\x78\x77\x17\xef\xee\xe2\xdd\x5d\xbc\xbb\x8b\x77\x77\xf1\xee\x2e\xde\xdd\xc5\xbb\xbb\x6e\xc4\xbb\xbb\x78\x77\xb7\xcf\xe4\xf1\xee\xae\x1d\xf1\xee\x2e\xde\xdd\x0d\x98\xe2\xff\xe3\xee\xae\xef\x41\xf1\x57\x1b\x11\x9a\x46\x68\xfa\x3f\x06\x4d\x23\xde\x8c\x78\x33\xe2\xcd\x81\x11\xf1\x66\xc4\x9b\x11\x6f\x46\xbc\xb9\x33\x22\xde\x6c\x68\x22\xde\x8c\x78\x33\xfe\x6a\xe3\x3f\xfc\xd5\xc6\xbb\xb7\xe7\xbd\x37\x41\xc2\x1b\x22\x3d\xcf\x5a\xe2\x8a\x20\x25\x52\x9b\x36\x22\xfe\x17\x37\x42\xe5\x08\x95\x7f\x0f\x50\x39\xfe\x17\x37\xa2\xea\x88\xaa\xf7\x8c\x88\xaa\x23\xaa\x8e\xa8\x3a\xa2\xea\x88\xaa\x0f\x91\x44\x54\x1d\x51\xf5\xd0\xf8\x1d\xff\x02\xa3\x3f\x77\xdf\x0f\x30\xfe\x1d\x00\x00\xff\xff\xcd\xc3\xfd\xa8\xf2\x56\x00\x00") func operatorsCoreosCom_operatorconditionsYamlBytes() ([]byte, error) { return bindataRead( @@ -164,7 +164,7 @@ func operatorsCoreosCom_operatorconditionsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xe9\x6f\x1b\x37\x16\xff\xee\xbf\xe2\x41\x5d\x20\x76\x56\x1a\xc5\xee\x22\xdb\x0a\x08\x02\x23\x69\x0a\x6f\x73\x18\xb1\xdb\x0f\x6b\x7b\xb7\xd4\xcc\xd3\x88\x35\x87\x9c\x92\x1c\xdb\x6a\x90\xff\x7d\xf1\x1e\x39\x87\x4e\xcb\x49\xda\xed\x2e\xa4\x2f\xf6\x0c\x8f\x79\xe7\xef\x1d\xa4\x28\xe5\x4f\x68\x9d\x34\x7a\x04\xa2\x94\x78\xe7\x51\xd3\x93\x4b\xae\xbf\x71\x89\x34\xc3\x9b\xc3\xbd\x6b\xa9\xb3\x11\xbc\xa8\x9c\x37\xc5\x7b\x74\xa6\xb2\x29\xbe\xc4\x89\xd4\xd2\x4b\xa3\xf7\x0a\xf4\x22\x13\x5e\x8c\xf6\x00\x84\xd6\xc6\x0b\x7a\xed\xe8\x11\x20\x35\xda\x5b\xa3\x14\xda\x41\x8e\x3a\xb9\xae\xc6\x38\xae\xa4\xca\xd0\xf2\xe6\xf5\xa7\x6f\x9e\x24\x4f\x93\x27\x7b\x00\xa9\x45\x5e\x7e\x2e\x0b\x74\x5e\x14\xe5\x08\x74\xa5\xd4\x1e\x80\x16\x05\x8e\xc0\x94\x68\x85\x37\x36\xb7\xa6\x2a\x5d\x52\x3f\xba\x24\x35\x16\x0d\xfd\x29\xf6\x5c\x89\x29\x7d\x9d\xe7\xb4\x4b\xe6\xe6\x84\xfd\x6a\x22\x85\xc7\xdc\x58\x59\x3f\x03\x0c\xc0\xa8\x82\xff\x0f\xcc\xbf\x8b\x7b\x7c\x4f\x5b\xf2\x7b\x25\x9d\xff\x61\x79\xec\xb5\x74\x9e\xc7\x4b\x55\x59\xa1\x16\x09\xe6\x21\x37\x35\xd6\xbf\x6d\x3f\xcf\x9f\xcb\xc3\x90\xd4\x79\xa5\x84\x5d\x58\xb7\x07\xe0\x52\x53\xe2\x08\x78\x59\x29\x52\xcc\xf6\x00\xa2\xf8\xe2\x36\x83\x28\xa2\x9b\xc3\xb8\xab\x4b\xa7\x58\x88\xfa\x1b\x40\x5b\xea\xe3\xd3\x93\x9f\xbe\x3e\x5b\x18\x00\xc8\xd0\xa5\x56\x96\x9e\x95\x31\xc7\x10\x48\x07\x7e\x8a\x50\x69\xe9\xc1\x4c\xa0\xa8\x94\x97\x1e\xb5\xd0\xe9\x0c\x26\xc6\xc2\xbb\xd7\x6f\xa0\x10\x5a\xe4\x98\x75\x44\x0d\x27\x9e\x74\xef\xbc\x15\x52\x87\x1d\xa4\x76\x5e\x28\xc5\xea\xa5\x9d\x9a\xc9\x20\x35\x48\xef\x82\x46\x88\x37\xf0\x06\x04\x90\x1a\xe5\x44\x62\x06\x0e\xf9\xd3\x5e\xd8\x1c\x7d\x3b\xcd\x25\x1d\x0e\xfc\x8c\xc4\x63\xc6\xbf\x60\xea\x3b\xaf\x2d\xfe\x5a\x49\x8b\x59\x97\x59\x12\x55\x6d\xb4\x9d\xd7\xa5\x25\x8a\x7c\xc7\x0a\xc2\xaf\xe3\x22\x73\xef\x17\xa4\xf6\x88\x44\x1b\xe6\x41\x46\xde\x81\x81\xed\xa8\x24\x62\x83\xc5\xce\x9c\x4c\xa5\x03\x8b\xa5\x45\x87\xda\x37\x12\x11\x3a\x32\x90\xc0\x19\x5a\x5a\x48\xb6\x52\xa9\x8c\x44\x79\x83\xd6\x83\xc5\xd4\xe4\x5a\xfe\xd6\xec\xe6\x48\x56\xf4\x19\x25\x3c\x3a\x0f\x52\x7b\xb4\x5a\x28\xb8\x11\xaa\xc2\x3e\x08\x9d\x41\x21\x66\x60\x91\xf6\x85\x4a\x77\x76\xe0\x29\x2e\x81\x37\xc6\x92\x76\x26\x66\x04\x53\xef\x4b\x37\x1a\x0e\x73\xe9\x6b\x00\x48\x4d\x51\x90\xf2\x67\x43\xf6\x65\x39\xae\x48\x67\xc3\x0c\x6f\x50\x0d\x9d\xcc\x07\xc2\xa6\x53\xe9\x31\xf5\x95\xc5\xa1\x28\xe5\x80\x89\xd5\x0c\x02\x49\x91\x7d\x65\x23\x64\xb8\x47\x0b\xe2\x0b\x2a\x73\xde\x4a\x9d\xcf\x0d\xb1\xcf\x6d\x94\x35\x79\x1e\x59\xa6\x88\xcb\x03\x2f\xad\x48\xe9\x15\x49\xe5\xfd\x77\x67\xe7\x50\x13\x10\xc4\x1e\x24\xdc\x4e\x75\xad\xb0\x49\x50\x52\x4f\xd0\x86\x99\x13\x6b\x0a\xde\x05\x75\x56\x1a\xa9\x3d\x3f\xa4\x4a\xa2\xf6\xe0\xaa\x71\x41\x46\x4b\x06\x86\xce\x93\x1e\x12\x78\xc1\xf8\x07\x63\x84\xaa\xcc\x84\xc7\x2c\x81\x13\x0d\x2f\x44\x81\xea\x85\x70\xf8\xbb\x8b\x9a\x24\xea\x06\x24\xbe\xed\x85\xdd\x85\xef\xe5\x05\x4b\x0e\x05\x50\xc3\xeb\x5a\xed\xcc\xe1\xc7\x59\x89\x69\x8d\x21\xb4\x92\x31\x43\xe8\x05\x90\xa9\x55\x94\x6c\x4b\xc4\x7a\x77\x65\x12\x51\x61\xea\x8d\x5d\x1e\x59\x20\xf5\x2c\x4e\x8c\x2b\x02\x99\x73\xa4\x3d\x72\x9b\x71\x67\x0b\x4a\xef\xa3\x96\xb5\x20\x7c\x3a\xfd\xee\x8e\x6c\xb2\x03\xe9\xf7\x50\xbf\xb8\x28\x78\x04\x45\x26\x42\x13\x25\xc6\xa8\x1a\x51\xd4\x48\x58\x04\x93\x3f\x9f\xe2\xdc\x1b\x10\x16\xe1\xf8\xed\x4b\xcc\x56\x31\xd7\x32\x28\xac\x15\xb3\x35\x33\xa4\xc7\x62\x2d\xe1\x0b\xa4\x1f\x6f\x20\x2f\x3a\x76\x3d\xe2\xa7\x82\x63\x89\xe7\x48\x12\x40\xab\x0f\x02\xae\x71\x16\xf0\x8d\x60\x33\xaa\x2c\x4c\xb6\xc8\x68\xc8\xca\xbc\xc6\x19\x4f\x8a\x60\xb7\x96\xba\x7b\xf4\x17\x7e\xab\xa3\xc9\xfc\x6f\x40\x9f\xdc\x38\x5e\x13\xbb\x76\xd2\x7d\xc6\x12\x7e\xd7\x38\xdb\x34\xbc\x20\x70\x92\x43\x74\xc3\x20\x79\x7a\xc1\xd2\x62\xcf\xac\x85\x2d\xca\x52\x49\x64\x34\xdb\xb8\xf7\x5a\x38\x99\xff\xd5\xac\x3e\x80\xd0\x46\x95\x2d\x42\x07\x65\x3f\x72\x41\xb1\x64\xe9\x53\x59\xc6\x24\x21\xa4\x06\x75\x28\xfb\x49\x28\xd9\x49\x43\xd8\xaa\x4f\x74\x1f\xde\x1a\x4f\x7f\xbe\xbb\x93\x04\xd5\x64\x0f\x2f\x0d\xba\xb7\xc6\xf3\x9b\x2f\xc2\x6a\x20\xe1\x01\x8c\x86\x05\x6c\xec\x3a\xf8\x15\x71\xd2\x8d\x67\x94\x46\x4d\x58\x3f\x8d\x50\xa4\xa3\x88\x62\x6c\xcd\x11\x67\x18\x61\xa3\xb0\x45\x51\x39\x0e\x40\xda\xe8\x01\x16\xa5\x9f\xad\xdc\x23\x0a\xc2\xd8\x39\x39\x6c\xd8\x2e\x6e\x75\x4e\x71\x31\x8c\x84\x0c\x46\x51\x2a\x0a\x59\xc5\x44\x73\x34\xa6\x5c\x5a\xa6\x50\xa0\xcd\x11\x4a\x42\xa8\x6d\xc4\xbb\x09\x57\xc2\xef\x1e\x74\xd9\x52\x57\x0c\x99\xaf\xc9\x01\x1e\x00\xb1\x61\x7e\x80\xa5\x42\x94\xa4\xa6\x0f\x84\x3e\x2c\xa9\x8f\x50\x0a\x49\x19\xef\x31\x67\xef\x0a\xe7\xc6\xa4\x66\x99\x76\xb7\xa1\x1d\xa4\x03\x82\x92\x1b\xa1\x08\xef\xc8\x92\x35\xa0\x0a\xe8\x47\x49\xf6\x02\xb0\xf7\xe1\x76\x6a\x5c\x00\xb3\x89\x44\xc5\xb9\x4f\xef\x1a\x67\xbd\xfe\x92\x6a\x7b\x27\xba\x17\x70\x71\x49\x99\x0d\x88\x1a\xad\x66\xd0\xe3\xb1\xde\xa7\xc7\x82\x8d\x60\x29\xb2\x8c\xcb\x43\xa1\x4e\xb7\x40\xb3\x8d\x7a\x73\x68\x6f\x64\x8a\xc7\x69\x6a\x2a\xcd\x85\xd3\x16\x71\x7d\x71\x49\x0d\x7e\x22\x2b\xa4\x9e\xab\x2d\x78\x26\x88\x30\x15\x6e\xa7\x32\x9d\xc2\xad\x54\x8a\xd3\x38\x87\x19\xa9\x27\xc3\x52\x99\x59\x23\xe7\x7d\x77\x10\x34\x4b\xf9\x64\x2d\x7b\xae\xd4\xd6\xa7\x06\xeb\x98\xa3\xf4\x3f\x3d\xb5\xe6\x46\x66\x98\x1d\x9f\x9e\xac\x94\xd2\x3c\x73\xbc\x04\x3c\x2a\xe5\xb8\xfc\xa2\x9c\xd3\x9b\x98\x73\xae\x4c\x61\xca\xce\xfe\x9d\x22\x7d\x2d\xb1\x63\x63\x14\x8a\xe5\xf1\x90\x0a\x35\x45\xe8\xfd\xb4\x9e\x2f\x2c\x88\x70\x87\x77\xa5\x92\xa9\xf4\x35\x7e\xb7\xb9\x15\xd7\x33\xbc\x88\x81\x4b\x72\x36\xe0\xd0\xf7\xdb\x5c\x4d\x3a\x90\xb9\x36\x76\xb5\x7d\x6e\xc6\x93\x0d\x28\x72\x0f\x76\xdc\x0d\xae\xab\x31\x5a\x8d\x1e\xdd\x80\x72\xac\x41\x5c\x80\x0b\xe9\xb1\x17\xbe\x5a\xfa\xc4\x86\x04\x99\xe7\x37\x29\x72\x78\x5a\x95\x24\xbf\x7f\x78\x8e\xbc\x3e\x5f\x19\x80\x12\xce\xff\x18\xaa\x94\x07\x64\xd6\xa9\xd1\xc1\xaf\xef\x57\xfd\x8b\x66\xea\x62\x8c\x5b\x65\xa1\xed\xc6\x5f\x54\xa9\x73\x14\xf5\x1a\x92\x5a\x28\xcc\xd0\x0b\xa9\x82\xc4\x8d\x46\x10\x04\x0d\xbe\xa6\x32\xad\xac\xe5\x6a\xcf\x93\x67\xd5\x95\xfb\xf1\xe9\x09\x34\xda\x80\xc1\x60\x10\xe2\xa2\xf3\xb6\x4a\xd9\x5e\xa9\x0a\xd7\x19\x66\xbc\x6b\x26\x2d\x97\xde\x8e\x36\x6f\xe5\x10\x33\xaf\x00\xe7\xa5\xf0\x53\x48\x82\xf2\x93\x8e\x28\x00\x5e\x19\x0b\x78\x27\x8a\x52\x61\x9f\xc5\x00\xaf\x8c\x89\x36\x13\x3e\xf8\x81\x19\x1d\x0e\xe1\x7d\x9b\x30\x71\x50\x18\x13\xb6\x85\x7c\x89\xbb\x0b\x30\x31\x86\x24\xdd\xe5\x29\xa9\x17\xff\xa0\xcd\xad\x5e\x45\x02\x7f\x53\x58\x1c\xc1\x65\xef\xf8\x46\x48\x25\xc6\x0a\x2f\x7b\x7d\xb8\xec\x9d\x5a\x93\x73\x88\xd2\xf9\x65\x8c\x39\x97\xbd\x97\x98\x5b\x91\x61\x76\xd9\xab\xb7\xfe\x2b\x67\x01\x6f\x28\x21\xf8\x01\x67\xcf\x78\xc3\xb9\xa1\xb3\x90\x35\xcc\x9e\x85\xa4\xa1\x1e\x23\x27\x3b\x9f\x95\xf8\x8c\x22\x66\xf7\xe5\x1b\x51\xce\x6d\xd4\xb1\xb4\x8b\x2b\xaa\x67\x6f\x0e\x93\x56\xd5\x3f\xff\xe2\x8c\x1e\x5d\xf6\x5a\x9e\xfa\xa6\x20\x93\x29\xfd\xec\xb2\x07\x73\x14\x8c\x2e\x7b\x4c\x43\xfd\xbe\x26\x7a\x74\xd9\xa3\xaf\xd1\x6b\x6b\xbc\x19\x57\x93\xd1\x65\x6f\x3c\xf3\xe8\xfa\x87\x7d\x8b\x65\x9f\x00\xec\x59\xfb\x85\xcb\xde\xcf\x70\xa9\x6b\xa2\x8d\x9f\xa2\x0d\x9a\x76\xf0\xb1\xb7\x01\x7d\x36\x84\xd4\xfb\x6a\x8f\xe0\xd1\xe7\x56\x68\x27\xeb\x0e\xea\xda\xa9\x05\x3a\x27\xf2\xf5\xe3\x16\x85\x5b\x19\x1e\xc2\x70\xb0\x92\xb5\xc3\xc4\xcb\xca\xc1\xfb\x0b\x9b\x65\x1e\xb6\x2c\x28\x97\x17\xb6\xe5\x8e\xf3\xe0\xe9\x05\x7b\x74\x63\x17\xbe\x99\x4d\x8e\x6a\x4d\xc1\xfe\x1f\x01\x98\x53\x32\xd6\x5b\x4c\x7a\x63\x23\x6e\x8c\x70\x3b\x45\x1d\x5b\xa2\x19\x5a\x35\xa3\xcc\xb7\xdd\x35\x9d\x0a\x9d\x63\x96\x40\x48\xbb\x05\xe3\x01\x05\xe8\x6b\x72\x30\x4e\xd7\x34\x54\xae\x6e\x50\x31\x5d\xcd\x8e\x04\x2c\x01\x10\xe2\x36\x8c\x9c\x69\x8a\xa5\x27\xaf\xbb\xaf\x7a\xbd\xa7\x46\x99\x18\x5b\x08\x3f\x02\xc2\xfc\x81\x5f\x6f\x1e\xd1\x38\xb6\x14\x7c\x9c\x1d\xb2\xe3\x69\x55\x08\x4d\xd6\x93\x11\xbd\xed\x98\xce\x64\x2a\xb8\x2b\x57\xe3\xad\x18\x9b\x2a\x20\x60\xab\x87\x28\xea\x42\xcc\x48\xce\x94\x26\x90\x8f\x46\xb6\x3e\x93\xf9\x42\xdc\xbd\x46\x9d\xfb\xe9\x08\xbe\x3e\xfa\xfb\xd3\x6f\xd6\x4c\x0c\xa0\x89\xd9\xf7\xa8\x29\x3e\xad\x68\xfa\xae\x11\xc3\xf2\xc2\x6e\x01\x4b\x7c\x26\x75\xa7\x2d\xc9\xdb\x39\x4d\x05\xde\x5a\xd0\xad\xe0\x84\x07\xc6\x82\x92\xcf\xaa\x24\xb9\x50\x14\xe0\xfe\xb9\x4e\xb1\x0f\x72\xb2\x7a\x33\xd9\x80\xbb\x9a\xc1\xe1\x51\x1f\xc6\x51\xc4\xcb\xb0\x7e\x71\x77\x95\xac\x20\x59\x3a\xf8\xb6\xbf\x40\x0f\xe5\xb8\x15\x47\x44\x4e\x2f\x6f\xa5\x9f\x82\xc5\x10\x26\x63\xf3\x79\x45\x98\xc4\x86\xde\xfb\x14\x47\xc1\x32\xc7\xf5\xdd\x90\xda\x6c\xa5\xf6\x4f\xff\xb6\x5e\xbf\x52\xcb\xa2\x2a\x46\xf0\x64\xcd\x94\x00\x69\x5b\x6a\x33\x4c\x6e\xb3\x04\x41\xd0\x95\x5b\x51\x14\x9c\x7a\xcb\x0c\xb5\xa7\xfa\xc1\x76\x4d\xdb\x73\x1d\xc5\x0b\x27\xdc\x8a\xea\x48\xf1\x91\x8b\x38\xd4\x31\xf6\x53\x6b\xb2\x2a\x45\xcb\xd1\x39\x56\x24\x69\x17\xa0\x66\x25\x06\x6f\x08\xe7\x09\x94\x35\x63\xea\x9b\xce\x7d\x68\xee\xa3\xd0\x52\xe7\x2e\x7e\x52\xba\x00\x20\x21\x1a\xdf\x4e\x91\x43\xcf\x5c\x25\xc8\x54\x39\x99\xa1\xc5\x0c\x04\xe4\x95\xb0\x42\x7b\xc4\x8c\xe0\x27\x54\x83\xa1\x9b\xde\x42\x9e\x68\x7b\xd8\xb5\x37\x06\x57\x0d\x60\x45\x24\xc6\xbe\x77\xe8\x13\x7c\x31\x57\x3d\x7c\x72\xb4\x51\xe5\xcd\xbc\xf5\xbd\x34\xe1\x3d\x5a\x3d\x82\x7f\x5d\x1c\x0f\xfe\x29\x06\xbf\x5d\xed\xc7\x7f\x9e\x0c\xbe\xfd\x77\x7f\x74\xf5\xb8\xf3\x78\x75\xf0\xfc\x2f\x6b\x76\x5a\x9d\xd6\xaf\x31\x9f\x18\x44\xea\x24\xb2\xd6\x68\x9f\x23\x8c\x99\xc0\xb9\xad\xb0\x0f\xaf\x84\x72\xd8\x87\x1f\x35\x87\x86\xcf\x14\x1a\xea\xaa\xd8\xdc\x96\xec\xd1\x57\x57\x27\x1f\xcd\x14\x26\x69\xf3\x9c\x48\xee\xa6\xce\xc0\x76\x42\xe2\xf4\xcd\x4c\xba\x48\xd3\x39\x2b\x01\x46\x3c\x4a\x59\x93\x98\xfe\x26\xa9\x29\x86\x9d\xb3\x14\xca\xbb\xdf\x08\x3d\x83\x16\xd6\x42\xb2\xba\x68\xe9\xce\x13\x36\x89\xd4\x1a\xe7\x9a\x93\x06\x07\x4a\x5e\x23\x34\x19\x6d\x00\xcb\x31\xa6\x82\x13\x75\x3b\x96\xde\x0a\x3b\xeb\xd4\x25\x90\x0a\x1d\x7b\x02\x93\x4a\xc1\xbe\x43\x84\x44\x9b\x0c\x97\xd1\xf5\x20\x60\xa8\x18\x4b\x25\xfd\x2c\x34\x10\x52\xa3\x27\x4a\xc6\xfa\xa0\x28\x8d\xf5\x42\xfb\xba\xf9\x92\xe3\x1d\x95\xba\xdc\xf7\x09\x45\xf2\x7e\xa6\xdd\xe1\xe1\xd1\xd7\x67\xd5\x38\x33\x85\x90\xfa\x55\xe1\x87\x07\xcf\xf7\x7f\xad\x84\xe2\xce\x05\xd5\xd4\xaf\x0a\x7f\xf0\xe5\xc2\xe2\xe1\xd3\x2d\xbc\x68\xff\x22\xf8\xca\xd5\xfe\xc5\x20\xfe\xf7\xb8\x7e\x75\xf0\x7c\xff\x32\xd9\x38\x7e\xf0\x98\x78\xe8\x78\xe0\xd5\xc5\xa0\x75\xbf\xe4\xea\xf1\xc1\xf3\xce\xd8\xc1\xb2\x33\x76\xaa\xd6\x7b\x0b\xd0\xd7\xed\xdc\x90\x9d\xf8\xfa\x52\x41\xed\x99\xf3\xa9\xe1\x62\x49\x1a\xbd\x98\xe2\x71\xdc\xe6\xc1\xdd\x9d\x6d\x92\x2e\xbd\x7d\x37\x65\xbe\x8f\x12\x1a\xf7\xab\x8f\xc6\x9b\x08\x34\xc7\xd4\x9f\xb1\x5f\x02\x4b\x1d\xbe\xf7\x38\x79\x60\x83\xef\x3d\x4e\xc0\xe2\x04\x2d\xea\x14\x6b\xc1\xcc\xf7\xf5\xe2\xb1\x6f\xd3\xf8\xfb\x1d\xce\xf0\xd6\x5f\x14\x58\xc9\x02\x25\xfb\xf1\x72\x40\x6d\x8f\x91\x87\xb5\x07\x12\xf7\xba\x34\xc7\xe3\x53\xe1\xa7\x5b\x51\xf0\xe8\x24\x8a\x8d\xbb\xf7\x7c\x9e\x52\x4a\x4c\x71\xee\x2e\x02\xe7\x71\x28\xb2\xf8\x92\x12\x1f\x8b\x71\xac\x1f\x32\x8e\x78\x66\xd1\xde\x55\xa0\xa4\x09\x04\x01\xb1\xcc\xe0\x1f\x67\xef\xde\x0e\xbf\x37\x31\x57\xa0\x6a\xc6\x05\xdf\xe2\x6e\x73\x1f\x5c\x95\x4e\x41\x38\x22\x8d\xea\xdb\x33\x6e\x4b\x14\x42\xcb\x09\x3a\x9f\xc4\xdd\xd0\xba\x8b\xa3\xab\x64\xbe\x1d\x22\xe3\xc1\x46\x7d\xa2\x1f\x0d\x80\x7d\x83\x98\x69\xd6\x72\xd2\xca\x24\x95\x26\x8b\x44\xdf\x32\xb1\x5e\x5c\x23\x98\x48\x6c\x85\x1c\x14\x46\xd0\x23\x33\xe9\x7c\xfa\x03\x39\xd6\xc7\x1e\xec\xdf\x4e\xd1\x22\xf4\xe8\xb1\x17\x3e\xd8\x5c\xc0\xa0\x77\x9d\x88\x1f\x3f\x1c\xf2\x7b\x2b\xf3\x9c\xd3\x2d\xbe\x4d\x70\x83\xda\x1f\x70\x7c\x9b\x80\x36\x9d\xc9\x3a\xf6\xa9\xdb\xee\xf4\x22\x21\x17\x47\x57\x3d\xd8\x9f\xe7\x8b\x52\x50\xbc\x83\xa3\xa6\x23\x5d\x9a\xec\xa0\xae\x5a\x67\xda\x8b\x3b\x2e\x0c\xa6\xc6\xa1\x0e\x9d\x7f\x6f\x60\x2a\x6e\x10\x9c\xa1\xe2\x13\x95\x1a\x84\x04\x33\x83\xdb\xd0\xa0\xab\x45\x19\x0e\x75\x4a\x61\xfd\xc2\xf5\x94\xf3\x77\x2f\xdf\x8d\xc2\xd7\x48\x6d\xb9\xae\xab\xdc\x89\xd4\x42\xc5\xd3\x87\x26\x3f\x24\x42\xaa\xa0\x24\x6f\x62\x69\x5b\x9f\x8c\x4c\x2a\x5f\x59\x4c\x16\xaf\x2b\x6c\x6d\xf1\xab\xee\x8a\xac\x36\x76\xbe\x33\xb2\xe8\x68\xff\xc5\x1b\x19\x5b\xb3\xa8\xd7\x9c\x78\x2c\xb3\xf8\xb6\x63\x83\x1b\x59\x6c\xa1\x99\xb8\xcc\x4c\xea\x88\xc1\x14\x4b\xef\x86\xe6\x86\xa0\x13\x6f\x87\xb7\xc6\x5e\x4b\x9d\x0f\xc8\xc8\x06\x41\xf3\x6e\xc8\x21\x66\xf8\x15\xff\xf9\x2c\x8e\x38\x4e\x6d\xcf\x56\xb8\x18\xf6\x07\xf0\xc6\xe1\x73\xf8\xc9\xac\xd5\xf9\xe5\x43\x22\xc1\xa3\xb3\xba\xf8\x5b\x58\x4d\xee\x12\x0e\xa4\xe2\x8d\xb1\x0e\xc2\x15\x22\x0b\x10\x28\xf4\xec\x77\x37\x63\x12\x20\xd7\xf8\xe9\x6c\x10\xaf\x74\x0e\x84\xce\x06\x4d\x7e\x9d\xce\x3e\x59\x62\x95\xdc\xd2\x81\x7f\x3c\x79\xf9\xc7\x18\x77\x25\x1f\xe4\xad\xa1\x8b\x32\x02\x6f\xab\x3a\xbb\x73\xde\x58\x91\xe3\xfc\xbb\x6a\xdc\x14\x1f\x2d\xc3\xb1\xae\x84\x0f\x1f\xf9\x55\x7b\x89\x53\xa8\x72\x2a\x8e\xea\xb5\xbb\xab\x9c\xbb\xab\x9c\xbb\xab\x9c\xbb\xab\x9c\x1b\x85\xbd\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xf9\x79\xac\xee\xae\x72\xee\xae\x72\xee\xae\x72\x36\xbf\xdd\x55\xce\x2d\x99\xdb\x5d\xe5\xfc\xb3\x5f\xe5\xfc\xff\xbe\x9c\xb9\x3b\x1c\xfb\xdf\x38\x1c\xdb\x1d\x77\xed\x8e\xbb\x76\xc7\x5d\xbb\xe3\xae\x4f\xb0\xf8\xdd\x71\xd7\xee\xb8\x6b\x77\xdc\xb5\x3b\xee\xfa\x93\x1e\x77\x4d\x84\x72\x5b\x9f\x77\xfd\x27\x00\x00\xff\xff\x65\x94\xba\x94\x7c\x46\x00\x00") +var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xe9\x6f\x1b\x37\x16\xff\xee\xbf\xe2\x41\x5d\x20\x76\x56\x1a\xc5\xee\x22\xdb\x0a\x08\x02\x23\x69\x0a\x6f\x73\x18\xb1\xdb\x0f\x6b\x7b\xb7\xd4\xcc\xd3\x88\x35\x87\x9c\x92\x1c\xdb\x6a\x90\xff\x7d\xf1\x1e\x39\x87\x4e\xcb\x49\xda\xed\x2e\xa4\x2f\xf6\x0c\x8f\x79\xe7\xef\x1d\xa4\x28\xe5\x4f\x68\x9d\x34\x7a\x04\xa2\x94\x78\xe7\x51\xd3\x93\x4b\xae\xbf\x71\x89\x34\xc3\x9b\xc3\xbd\x6b\xa9\xb3\x11\xbc\xa8\x9c\x37\xc5\x7b\x74\xa6\xb2\x29\xbe\xc4\x89\xd4\xd2\x4b\xa3\xf7\x0a\xf4\x22\x13\x5e\x8c\xf6\x00\x84\xd6\xc6\x0b\x7a\xed\xe8\x11\x20\x35\xda\x5b\xa3\x14\xda\x41\x8e\x3a\xb9\xae\xc6\x38\xae\xa4\xca\xd0\xf2\xe6\xf5\xa7\x6f\x9e\x24\x4f\x93\xa3\x3d\x80\xd4\x22\x2f\x3f\x97\x05\x3a\x2f\x8a\x72\x04\xba\x52\x6a\x0f\x40\x8b\x02\x47\x60\x4a\xb4\xc2\x1b\x9b\x5b\x53\x95\x2e\xa9\x1f\x5d\x92\x1a\x8b\x86\xfe\x14\x7b\xae\xc4\x94\xbe\xce\x73\xda\x25\x73\x73\xc2\x7e\x35\x91\xc2\x63\x6e\xac\xac\x9f\x01\x06\x60\x54\xc1\xff\x07\xe6\xdf\xc5\x3d\xbe\xa7\x2d\xf9\xbd\x92\xce\xff\xb0\x3c\xf6\x5a\x3a\xcf\xe3\xa5\xaa\xac\x50\x8b\x04\xf3\x90\x9b\x1a\xeb\xdf\xb6\x9f\xe7\xcf\xe5\x61\x48\xea\xbc\x52\xc2\x2e\xac\xdb\x03\x70\xa9\x29\x71\x04\xbc\xac\x14\x29\x66\x7b\x00\x51\x7c\x71\x9b\x41\x14\xd1\xcd\x61\xdc\xd5\xa5\x53\x2c\x44\xfd\x0d\xa0\x2d\xf5\xf1\xe9\xc9\x4f\x5f\x9f\x2d\x0c\x00\x64\xe8\x52\x2b\x4b\xcf\xca\x98\x63\x08\xa4\x03\x3f\x45\xa8\xb4\xf4\x60\x26\x50\x54\xca\x4b\x8f\x5a\xe8\x74\x06\x13\x63\xe1\xdd\xeb\x37\x50\x08\x2d\x72\xcc\x3a\xa2\x86\x13\x4f\xba\x77\xde\x0a\xa9\xc3\x0e\x52\x3b\x2f\x94\x62\xf5\xd2\x4e\xcd\x64\x90\x1a\xa4\x77\x41\x23\xc4\x1b\x78\x03\x02\x48\x8d\x72\x22\x31\x03\x87\xfc\x69\x2f\x6c\x8e\xbe\x9d\xe6\x92\x0e\x07\x7e\x46\xe2\x31\xe3\x5f\x30\xf5\x9d\xd7\x16\x7f\xad\xa4\xc5\xac\xcb\x2c\x89\xaa\x36\xda\xce\xeb\xd2\x12\x45\xbe\x63\x05\xe1\xd7\x71\x91\xb9\xf7\x0b\x52\x7b\x44\xa2\x0d\xf3\x20\x23\xef\xc0\xc0\x76\x54\x12\xb1\xc1\x62\x67\x4e\xa6\xd2\x81\xc5\xd2\xa2\x43\xed\x1b\x89\x08\x1d\x19\x48\xe0\x0c\x2d\x2d\x24\x5b\xa9\x54\x46\xa2\xbc\x41\xeb\xc1\x62\x6a\x72\x2d\x7f\x6b\x76\x73\x24\x2b\xfa\x8c\x12\x1e\x9d\x07\xa9\x3d\x5a\x2d\x14\xdc\x08\x55\x61\x1f\x84\xce\xa0\x10\x33\xb0\x48\xfb\x42\xa5\x3b\x3b\xf0\x14\x97\xc0\x1b\x63\x49\x3b\x13\x33\x82\xa9\xf7\xa5\x1b\x0d\x87\xb9\xf4\x35\x00\xa4\xa6\x28\x48\xf9\xb3\x21\xfb\xb2\x1c\x57\xa4\xb3\x61\x86\x37\xa8\x86\x4e\xe6\x03\x61\xd3\xa9\xf4\x98\xfa\xca\xe2\x50\x94\x72\xc0\xc4\x6a\x06\x81\xa4\xc8\xbe\xb2\x11\x32\xdc\xa3\x05\xf1\x05\x95\x39\x6f\xa5\xce\xe7\x86\xd8\xe7\x36\xca\x9a\x3c\x8f\x2c\x53\xc4\xe5\x81\x97\x56\xa4\xf4\x8a\xa4\xf2\xfe\xbb\xb3\x73\xa8\x09\x08\x62\x0f\x12\x6e\xa7\xba\x56\xd8\x24\x28\xa9\x27\x68\xc3\xcc\x89\x35\x05\xef\x82\x3a\x2b\x8d\xd4\x9e\x1f\x52\x25\x51\x7b\x70\xd5\xb8\x20\xa3\x25\x03\x43\xe7\x49\x0f\x09\xbc\x60\xfc\x83\x31\x42\x55\x66\xc2\x63\x96\xc0\x89\x86\x17\xa2\x40\xf5\x42\x38\xfc\xdd\x45\x4d\x12\x75\x03\x12\xdf\xf6\xc2\xee\xc2\xf7\xf2\x82\x25\x87\x02\xa8\xe1\x75\xad\x76\xe6\xf0\xe3\xac\xc4\xb4\xc6\x10\x5a\xc9\x98\x21\xf4\x02\xc8\xd4\x2a\x4a\xb6\x25\x62\xbd\xbb\x32\x89\xa8\x30\xf5\xc6\x2e\x8f\x2c\x90\x7a\x16\x27\xc6\x15\x81\xcc\x39\xd2\x1e\xb9\xcd\xb8\xb3\x05\xa5\xf7\x51\xcb\x5a\x10\x3e\x9d\x7e\x77\x47\x36\xd9\x81\xf4\x7b\xa8\x5f\x5c\x14\x3c\x82\x22\x13\xa1\x89\x12\x63\x54\x8d\x28\x6a\x24\x2c\x82\xc9\x9f\x4f\x71\xee\x0d\x08\x8b\x70\xfc\xf6\x25\x66\xab\x98\x6b\x19\x14\xd6\x8a\xd9\x9a\x19\xd2\x63\xb1\x96\xf0\x05\xd2\x8f\x37\x90\x17\x1d\xbb\x1e\xf1\x53\xc1\xb1\xc4\x73\x24\x09\xa0\xd5\x07\x01\xd7\x38\x0b\xf8\x46\xb0\x19\x55\x16\x26\x5b\x64\x34\x64\x65\x5e\xe3\x8c\x27\x45\xb0\x5b\x4b\xdd\x3d\xfa\x0b\xbf\xd5\xd1\x64\xfe\x37\xa0\x4f\x6e\x1c\xaf\x89\x5d\x3b\xe9\x3e\x63\x09\xbf\x6b\x9c\x6d\x1a\x5e\x10\x38\xc9\x21\xba\x61\x90\x3c\xbd\x60\x69\xb1\x67\xd6\xc2\x16\x65\xa9\x24\x32\x9a\x6d\xdc\x7b\x2d\x9c\xcc\xff\x6a\x56\x1f\x40\x68\xa3\xca\x16\xa1\x83\xb2\x1f\xb9\xa0\x58\xb2\xf4\xa9\x2c\x63\x92\x10\x52\x83\x3a\x94\xfd\x24\x94\xec\xa4\x21\x6c\xd5\x27\xba\x0f\x6f\x8d\xa7\x3f\xdf\xdd\x49\x82\x6a\xb2\x87\x97\x06\xdd\x5b\xe3\xf9\xcd\x17\x61\x35\x90\xf0\x00\x46\xc3\x02\x36\x76\x1d\xfc\x8a\x38\xe9\xc6\x33\x4a\xa3\x26\xac\x9f\x46\x28\xd2\x51\x44\x31\xb6\xe6\x88\x33\x8c\xb0\x51\xd8\xa2\xa8\x1c\x07\x20\x6d\xf4\x00\x8b\xd2\xcf\x56\xee\x11\x05\x61\xec\x9c\x1c\x36\x6c\x17\xb7\x3a\xa7\xb8\x18\x46\x42\x06\xa3\x28\x15\x85\xac\x62\xa2\x39\x1a\x53\x2e\x2d\x53\x28\xd0\xe6\x08\x25\x21\xd4\x36\xe2\xdd\x84\x2b\xe1\x77\x0f\xba\x6c\xa9\x2b\x86\xcc\xd7\xe4\x00\x0f\x80\xd8\x30\x3f\xc0\x52\x21\x4a\x52\xd3\x07\x42\x1f\x96\xd4\x47\x28\x85\xa4\x8c\xf7\x98\xb3\x77\x85\x73\x63\x52\xb3\x4c\xbb\xdb\xd0\x0e\xd2\x01\x41\xc9\x8d\x50\x84\x77\x64\xc9\x1a\x50\x05\xf4\xa3\x24\x7b\x01\xd8\xfb\x70\x3b\x35\x2e\x80\xd9\x44\xa2\xe2\xdc\xa7\x77\x8d\xb3\x5e\x7f\x49\xb5\xbd\x13\xdd\x0b\xb8\xb8\xa4\xcc\x06\x44\x8d\x56\x33\xe8\xf1\x58\xef\xd3\x63\xc1\x46\xb0\x14\x59\xc6\xe5\xa1\x50\xa7\x5b\xa0\xd9\x46\xbd\x39\xb4\x37\x32\xc5\xe3\x34\x35\x95\xe6\xc2\x69\x8b\xb8\xbe\xb8\xa4\x06\x3f\x91\x15\x52\xcf\xd5\x16\x3c\x13\x44\x98\x0a\xb7\x53\x99\x4e\xe1\x56\x2a\xc5\x69\x9c\xc3\x8c\xd4\x93\x61\xa9\xcc\xac\x91\xf3\xbe\x3b\x08\x9a\xa5\x7c\xb2\x96\x3d\x57\x6a\xeb\x53\x83\x75\xcc\x51\xfa\x9f\x9e\x5a\x73\x23\x33\xcc\x8e\x4f\x4f\x56\x4a\x69\x9e\x39\x5e\x02\x1e\x95\x72\x5c\x7e\x51\xce\xe9\x4d\xcc\x39\x57\xa6\x30\x65\x67\xff\x4e\x91\xbe\x96\xd8\xb1\x31\x0a\xc5\xf2\x78\x48\x85\x9a\x22\xf4\x7e\x5a\xcf\x17\x16\x44\xb8\xc3\xbb\x52\xc9\x54\xfa\x1a\xbf\xdb\xdc\x8a\xeb\x19\x5e\xc4\xc0\x25\x39\x1b\x70\xe8\xfb\x6d\xae\x26\x1d\xc8\x5c\x1b\xbb\xda\x3e\x37\xe3\xc9\x06\x14\xb9\x07\x3b\xee\x06\xd7\xd5\x18\xad\x46\x8f\x6e\x40\x39\xd6\x20\x2e\xc0\x85\xf4\xd8\x0b\x5f\x2d\x7d\x62\x43\x82\xcc\xf3\x9b\x14\x39\x3c\xad\x4a\x92\xdf\x3f\x3c\x47\x5e\x9f\xaf\x0c\x40\x09\xe7\x7f\x0c\x55\xca\x03\x32\xeb\xd4\xe8\xe0\xd7\xf7\xab\xfe\x45\x33\x75\x31\xc6\xad\xb2\xd0\x76\xe3\x2f\xaa\xd4\x39\x8a\x7a\x0d\x49\x2d\x14\x66\xe8\x85\x54\x41\xe2\x46\x23\x08\x82\x06\x5f\x53\x99\x56\xd6\x72\xb5\xe7\xc9\xb3\xea\xca\xfd\xf8\xf4\x04\x1a\x6d\xc0\x60\x30\x08\x71\xd1\x79\x5b\xa5\x6c\xaf\x54\x85\xeb\x0c\x33\xde\x35\x93\x96\x4b\x6f\x47\x9b\xb7\x72\x88\x99\x57\x80\xf3\x52\xf8\x29\x24\x41\xf9\x49\x47\x14\x00\xaf\x8c\x05\xbc\x13\x45\xa9\xb0\xcf\x62\x80\x57\xc6\x44\x9b\x09\x1f\xfc\xc0\x8c\x0e\x87\xf0\xbe\x4d\x98\x38\x28\x8c\x09\xdb\x42\xbe\xc4\xdd\x05\x98\x18\x43\x92\xee\xf2\x94\xd4\x8b\x7f\xd0\xe6\x56\xaf\x22\x81\xbf\x29\x2c\x8e\xe0\xb2\x77\x7c\x23\xa4\x12\x63\x85\x97\xbd\x3e\x5c\xf6\x4e\xad\xc9\x39\x44\xe9\xfc\x32\xc6\x9c\xcb\xde\x4b\xcc\xad\xc8\x30\xbb\xec\xd5\x5b\xff\x95\xb3\x80\x37\x94\x10\xfc\x80\xb3\x67\xbc\xe1\xdc\xd0\x59\xc8\x1a\x66\xcf\x42\xd2\x50\x8f\x91\x93\x9d\xcf\x4a\x7c\x46\x11\xb3\xfb\xf2\x8d\x28\xe7\x36\xea\x58\xda\xc5\x15\xd5\xb3\x37\x87\x49\xab\xea\x9f\x7f\x71\x46\x8f\x2e\x7b\x2d\x4f\x7d\x53\x90\xc9\x94\x7e\x76\xd9\x83\x39\x0a\x46\x97\x3d\xa6\xa1\x7e\x5f\x13\x3d\xba\xec\xd1\xd7\xe8\xb5\x35\xde\x8c\xab\xc9\xe8\xb2\x37\x9e\x79\x74\xfd\xc3\xbe\xc5\xb2\x4f\x00\xf6\xac\xfd\xc2\x65\xef\x67\xb8\xd4\x35\xd1\xc6\x4f\xd1\x06\x4d\x3b\xf8\xd8\xdb\x80\x3e\x1b\x42\xea\x7d\xb5\x47\xf0\xe8\x73\x2b\xb4\x93\x75\x07\x75\xed\xd4\x02\x9d\x13\xf9\xfa\x71\x8b\xc2\xad\x0c\x0f\x61\x38\x58\xc9\xda\x61\xe2\x65\xe5\xe0\xfd\x85\xcd\x32\x0f\x5b\x16\x94\xcb\x0b\xdb\x72\xc7\x79\xf0\xf4\x82\x3d\xba\xb1\x0b\xdf\xcc\x26\x47\xb5\xa6\x60\xff\x8f\x00\xcc\x29\x19\xeb\x2d\x26\xbd\xb1\x11\x37\x46\xb8\x9d\xa2\x8e\x2d\xd1\x0c\xad\x9a\x51\xe6\xdb\xee\x9a\x4e\x85\xce\x31\x4b\x20\xa4\xdd\x82\xf1\x80\x02\xf4\x35\x39\x18\xa7\x6b\x1a\x2a\x57\x37\xa8\x98\xae\x66\x47\x02\x96\x00\x08\x71\x1b\x46\xce\x34\xc5\xd2\x93\xd7\xdd\x57\xbd\xde\x53\xa3\x4c\x8c\x2d\x84\x1f\x01\x61\xfe\xc0\xaf\x37\x8f\x68\x1c\x5b\x0a\x3e\xce\x0e\xd9\xf1\xb4\x2a\x84\x26\xeb\xc9\x88\xde\x76\x4c\x67\x32\x15\xdc\x95\xab\xf1\x56\x8c\x4d\x15\x10\xb0\xd5\x43\x14\x75\x21\x66\x24\x67\x4a\x13\xc8\x47\x23\x5b\x9f\xc9\x7c\x21\xee\x5e\xa3\xce\xfd\x74\x04\x5f\x1f\xfd\xfd\xe9\x37\x6b\x26\x06\xd0\xc4\xec\x7b\xd4\x14\x9f\x56\x34\x7d\xd7\x88\x61\x79\x61\xb7\x80\x25\x3e\x93\xba\xd3\x96\xe4\xed\x9c\xa6\x02\x6f\x2d\xe8\x56\x70\xc2\x03\x63\x41\xc9\x67\x55\x92\x5c\x28\x0a\x70\xff\x5c\xa7\xd8\x07\x39\x59\xbd\x99\x6c\xc0\x5d\xcd\xe0\xf0\xa8\x0f\xe3\x28\xe2\x65\x58\xbf\xb8\xbb\x4a\x56\x90\x2c\x1d\x7c\xdb\x5f\xa0\x87\x72\xdc\x8a\x23\x22\xa7\x97\xb7\xd2\x4f\xc1\x62\x08\x93\xb1\xf9\xbc\x22\x4c\x62\x43\xef\x7d\x8a\xa3\x60\x99\xe3\xfa\x6e\x48\x6d\xb6\x52\xfb\xa7\x7f\x5b\xaf\x5f\xa9\x65\x51\x15\x23\x78\xb2\x66\x4a\x80\xb4\x2d\xb5\x19\x26\xb7\x59\x82\x20\xe8\xca\xad\x28\x0a\x4e\xbd\x65\x86\xda\x53\xfd\x60\xbb\xa6\xed\xb9\x8e\xe2\x85\x13\x6e\x45\x75\xa4\xf8\xc8\x45\x1c\xea\x18\xfb\xa9\x35\x59\x95\xa2\xe5\xe8\x1c\x2b\x92\xb4\x0b\x50\xb3\x12\x83\x37\x84\xf3\x04\xca\x9a\x31\xf5\x4d\xe7\x3e\x34\xf7\x51\x68\xa9\x73\x17\x3f\x29\x5d\x00\x90\x10\x8d\x6f\xa7\xc8\xa1\x67\xae\x12\x64\xaa\x9c\xcc\xd0\x62\x06\x02\xf2\x4a\x58\xa1\x3d\x62\x46\xf0\x13\xaa\xc1\xd0\x4d\x6f\x21\x4f\xb4\x3d\xec\xda\x1b\x83\xab\x06\xb0\x22\x12\x63\xdf\x3b\xf4\x09\xbe\x98\xab\x1e\x3e\x39\xda\xa8\xf2\x66\xde\xfa\x5e\x9a\xf0\x1e\xad\x1e\xc1\xbf\x2e\x8e\x07\xff\x14\x83\xdf\xae\xf6\xe3\x3f\x4f\x06\xdf\xfe\xbb\x3f\xba\x7a\xdc\x79\xbc\x3a\x78\xfe\x97\x35\x3b\xad\x4e\xeb\xd7\x98\x4f\x0c\x22\x75\x12\x59\x6b\xb4\xcf\x11\xc6\x4c\xe0\xdc\x56\xd8\x87\x57\x42\x39\xec\xc3\x8f\x9a\x43\xc3\x67\x0a\x0d\x75\x55\x6c\x6e\x4b\xf6\xe8\xab\xab\x93\x8f\x66\x0a\x93\xb4\x79\x4e\x24\x77\x53\x67\x60\x3b\x21\x71\xfa\x66\x26\x5d\xa4\xe9\x9c\x95\x00\x23\x1e\xa5\xac\x49\x4c\x7f\x93\xd4\x14\xc3\xce\x59\x0a\xe5\xdd\x6f\x84\x9e\x41\x0b\x6b\x21\x59\x5d\xb4\x74\xe7\x09\x9b\x44\x6a\x8d\x73\xcd\x49\x83\x03\x25\xaf\x11\x9a\x8c\x36\x80\xe5\x18\x53\xc1\x89\xba\x1d\x4b\x6f\x85\x9d\x75\xea\x12\x48\x85\x8e\x3d\x81\x49\xa5\x60\xdf\x21\x42\xa2\x4d\x86\xcb\xe8\x7a\x10\x30\x54\x8c\xa5\x92\x7e\x16\x1a\x08\xa9\xd1\x13\x25\x63\x7d\x50\x94\xc6\x7a\xa1\x7d\xdd\x7c\xc9\xf1\x8e\x4a\x5d\xee\xfb\x84\x22\x79\x3f\xd3\xee\xf0\xf0\xe8\xeb\xb3\x6a\x9c\x99\x42\x48\xfd\xaa\xf0\xc3\x83\xe7\xfb\xbf\x56\x42\x71\xe7\x82\x6a\xea\x57\x85\x3f\xf8\x72\x61\xf1\xf0\xe9\x16\x5e\xb4\x7f\x11\x7c\xe5\x6a\xff\x62\x10\xff\x7b\x5c\xbf\x3a\x78\xbe\x7f\x99\x6c\x1c\x3f\x78\x4c\x3c\x74\x3c\xf0\xea\x62\xd0\xba\x5f\x72\xf5\xf8\xe0\x79\x67\xec\x60\xd9\x19\x3b\x55\xeb\xbd\x05\xe8\xeb\x76\x6e\xc8\x4e\x7c\x7d\xa9\xa0\xf6\xcc\xf9\xd4\x70\xb1\x24\x8d\x5e\x4c\xf1\x38\x6e\xf3\xe0\xee\xce\x36\x49\x97\xde\xbe\x9b\x32\xdf\x47\x09\x8d\xfb\xd5\x47\xe3\x4d\x04\x9a\x63\xea\xcf\xd8\x2f\x81\xa5\x0e\xdf\x7b\x9c\x3c\xb0\xc1\xf7\x1e\x27\x60\x71\x82\x16\x75\x8a\xb5\x60\xe6\xfb\x7a\xf1\xd8\xb7\x69\xfc\xfd\x0e\x67\x78\xeb\x2f\x0a\xac\x64\x81\x92\xfd\x78\x39\xa0\xb6\xc7\xc8\xc3\xda\x03\x89\x7b\x5d\x9a\xe3\xf1\xa9\xf0\xd3\xad\x28\x78\x74\x12\xc5\xc6\xdd\x7b\x3e\x4f\x29\x25\xa6\x38\x77\x17\x81\xf3\x38\x14\x59\x7c\x49\x89\x8f\xc5\x38\xd6\x0f\x19\x47\x3c\xb3\x68\xef\x2a\x50\xd2\x04\x82\x80\x58\x66\xf0\x8f\xb3\x77\x6f\x87\xdf\x9b\x98\x2b\x50\x35\xe3\x82\x6f\x71\xb7\xb9\x0f\xae\x4a\xa7\x20\x1c\x91\x46\xf5\xed\x19\xb7\x25\x0a\xa1\xe5\x04\x9d\x4f\xe2\x6e\x68\xdd\xc5\xd1\x55\x32\xdf\x0e\x91\xf1\x60\xa3\x3e\xd1\x8f\x06\xc0\xbe\x41\xcc\x34\x6b\x39\x69\x65\x92\x4a\x93\x45\xa2\x6f\x99\x58\x2f\xae\x11\x4c\x24\xb6\x42\x0e\x0a\x23\xe8\x91\x99\x74\x3e\xfd\x81\x1c\xeb\x63\x0f\xf6\x6f\xa7\x68\x11\x7a\xf4\xd8\x0b\x1f\x6c\x2e\x60\xd0\xbb\x4e\xc4\x8f\x1f\x0e\xf9\xbd\x95\x79\xce\xe9\x16\xdf\x26\xb8\x41\xed\x0f\x38\xbe\x4d\x40\x9b\xce\x64\x1d\xfb\xd4\x6d\x77\x7a\x91\x90\x8b\xa3\xab\x1e\xec\xcf\xf3\x45\x29\x28\xde\xc1\x51\xd3\x91\x2e\x4d\x76\x50\x57\xad\x33\xed\xc5\x1d\x17\x06\x53\xe3\x50\x87\xce\xbf\x37\x30\x15\x37\x08\xce\x50\xf1\x89\x4a\x0d\x42\x82\x99\xc1\x6d\x68\xd0\xd5\xa2\x0c\x87\x3a\xa5\xb0\x7e\xe1\x7a\xca\xf9\xbb\x97\xef\x46\xe1\x6b\xa4\xb6\x5c\xd7\x55\xee\x44\x6a\xa1\xe2\xe9\x43\x93\x1f\x12\x21\x55\x50\x92\x37\xb1\xb4\xad\x4f\x46\x26\x95\xaf\x2c\x26\x8b\xd7\x15\xb6\xb6\xf8\x55\x77\x45\x56\x1b\x3b\xdf\x19\x59\x74\xb4\xff\xe2\x8d\x8c\xad\x59\xd4\x6b\x4e\x3c\x96\x59\x7c\xdb\xb1\xc1\x8d\x2c\xb6\xd0\x4c\x5c\x66\x26\x75\xc4\x60\x8a\xa5\x77\x43\x73\x43\xd0\x89\xb7\xc3\x5b\x63\xaf\xa5\xce\x07\x64\x64\x83\xa0\x79\x37\xe4\x10\x33\xfc\x8a\xff\x7c\x16\x47\x1c\xa7\xb6\x67\x2b\x5c\x0c\xfb\x03\x78\xe3\xf0\x39\xfc\x64\xd6\xea\xfc\xf2\x21\x91\xe0\xd1\x59\x5d\xfc\x2d\xac\x26\x77\x09\x07\x52\xf1\xc6\x58\x07\xe1\x0a\x91\x05\x08\x14\x7a\xf6\xbb\x9b\x31\x09\x90\x6b\xfc\x74\x36\x88\x57\x3a\x07\x42\x67\x83\x26\xbf\x4e\x67\x9f\x2c\xb1\x4a\x6e\xe9\xc0\x3f\x9e\xbc\xfc\x63\x8c\xbb\x92\x0f\xf2\xd6\xd0\x45\x19\x81\xb7\x55\x9d\xdd\x39\x6f\xac\xc8\x71\xfe\x5d\x35\x6e\x8a\x8f\x96\xe1\x58\x57\xc2\x87\x8f\xfc\xaa\xbd\xc4\x29\x54\x39\x15\x47\xf5\xda\xdd\x55\xce\xdd\x55\xce\xdd\x55\xce\xdd\x55\xce\x8d\xc2\xde\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xfc\x3c\x56\x77\x57\x39\x77\x57\x39\x77\x57\x39\x9b\xdf\xee\x2a\xe7\x96\xcc\xed\xae\x72\xfe\xd9\xaf\x72\xfe\x7f\x5f\xce\xdc\x1d\x8e\xfd\x6f\x1c\x8e\xed\x8e\xbb\x76\xc7\x5d\xbb\xe3\xae\xdd\x71\xd7\x27\x58\xfc\xee\xb8\x6b\x77\xdc\xb5\x3b\xee\xda\x1d\x77\xfd\x49\x8f\xbb\x26\x42\xb9\xad\xcf\xbb\xfe\x13\x00\x00\xff\xff\xf2\x1a\x66\xa5\x7c\x46\x00\x00") func operatorsCoreosCom_operatorgroupsYamlBytes() ([]byte, error) { return bindataRead( @@ -184,7 +184,7 @@ func operatorsCoreosCom_operatorgroupsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x8f\xe3\xb6\x11\x7f\xdf\x4f\x31\x70\x1e\x36\x01\xfc\x27\xb9\x02\x45\xe1\xb7\xc5\xee\xa5\xd8\x36\xdd\x3b\xdc\xee\xdd\x4b\x90\x87\xb1\x34\xb6\x58\x53\xa4\xc2\xa1\xec\x75\x0f\xf7\xdd\x8b\x21\x29\x5b\xb2\xbd\xb6\x7c\xdd\x4b\xc3\x17\x5b\x14\x39\x9c\xbf\xbf\x99\xa1\xb0\x52\x9f\xc8\xb1\xb2\x66\x0a\x58\x29\x7a\xf6\x64\xe4\x89\xc7\xcb\xbf\xf1\x58\xd9\xc9\xea\xa7\xab\xa5\x32\xf9\x14\x6e\x6b\xf6\xb6\xfc\x40\x6c\x6b\x97\xd1\x1d\xcd\x95\x51\x5e\x59\x73\x55\x92\xc7\x1c\x3d\x4e\xaf\x00\xd0\x18\xeb\x51\xa6\x59\x1e\x01\x32\x6b\xbc\xb3\x5a\x93\x1b\x2d\xc8\x8c\x97\xf5\x8c\x66\xb5\xd2\x39\xb9\x40\xbc\x39\x7a\xf5\xe3\xf8\xaf\xe3\x1f\xaf\x00\x32\x47\x61\xfb\x93\x2a\x89\x3d\x96\xd5\x14\x4c\xad\xf5\x15\x80\xc1\x92\xa6\x60\x2b\x72\xe8\xad\xe3\xf1\xee\x5f\x66\x1d\x59\xf9\x29\xaf\xb8\xa2\x4c\x0e\x5e\x38\x5b\x57\xed\xd5\xad\x35\x91\x54\xc3\x1f\x7a\x5a\x58\xa7\x9a\x67\x80\x11\x58\x5d\x86\xff\x51\xee\x77\x89\x46\x98\xd2\x8a\xfd\x3f\x3b\xd3\xbf\x28\xf6\xe1\x55\xa5\x6b\x87\xba\x75\x66\x98\x65\x65\x16\xb5\x46\xb7\x9b\xbf\x02\xe0\xcc\x56\x34\x85\x5b\x5d\xb3\x27\x99\x48\x7a\x48\x3c\x8c\x92\xac\xab\x9f\x12\x4b\x9c\x15\x54\x62\xc3\x20\x08\x29\x73\xf3\xfe\xfe\xd3\x5f\x1e\xf7\x5e\x00\xe4\xc4\x99\x53\x95\x0f\x5a\x6d\x78\x04\x47\x95\x23\x26\xe3\x19\x10\xb2\x78\xec\x96\xa1\x71\x6b\xbb\xdf\x08\x63\x76\xf6\x6f\xca\x7c\x6b\xba\x72\xb2\xd8\xb7\xb4\x14\x47\xcb\x7b\x3a\xf3\x7b\x7c\x5c\x0b\xb3\x71\x1d\xe4\xe2\x38\xc4\xe0\x0b\x6a\xc4\xa6\x3c\x49\x08\x76\x0e\xbe\x50\xbc\xe3\x37\xf8\x82\x4c\xa3\x49\x5c\x8d\xe1\x91\x9c\x6c\x04\x2e\x6c\xad\x73\xf1\xb0\x15\x39\x0f\x8e\x32\xbb\x30\xea\x3f\x5b\x6a\x0c\xde\x86\x63\x34\x7a\x62\x0f\xca\x78\x72\x06\x35\xac\x50\xd7\x34\x04\x34\x39\x94\xb8\x01\x47\x42\x17\x6a\xd3\xa2\x10\x96\xf0\x18\xfe\x65\x1d\x81\x32\x73\x3b\x85\xc2\xfb\x8a\xa7\x93\xc9\x42\xf9\x26\x36\x32\x5b\x96\xb5\x51\x7e\x33\x09\x6e\xae\x66\xb5\xd8\x7d\x92\xd3\x8a\xf4\x84\xd5\x62\x84\x2e\x2b\x94\xa7\xcc\xd7\x8e\x26\x58\xa9\x51\x60\xd6\x84\xf8\x18\x97\xf9\x77\x2e\x45\x13\x5f\xef\xa9\x2f\xda\x81\xbd\x53\x66\xd1\x79\x15\x7c\xf2\xa4\xae\xc5\x3d\x41\x89\xa1\xe3\xf6\x28\xcb\x4e\xa5\x32\x25\x5a\xf9\xf0\xf6\xf1\x09\x1a\x06\xa2\xda\xa3\x86\x5b\xde\xb2\x53\xb6\x28\x4a\x99\x39\xb9\xb8\x72\xee\x6c\x19\xa8\x90\xc9\x2b\xab\x8c\x0f\x0f\x99\x56\x64\x3c\x70\x3d\x2b\x95\x17\x2b\xfe\x5e\x13\x7b\xb1\xc3\x18\x6e\x03\x34\xc0\x8c\xa0\xae\x72\xf4\x94\x8f\xe1\xde\xc0\x2d\x96\xa4\x6f\x91\xe9\x9b\xab\x5a\x34\xca\x23\x51\x5f\x7f\x65\xb7\x91\xed\x70\xc3\x41\x94\x00\x34\xf0\xf3\xa2\x75\x9a\x88\x7c\xac\x28\xeb\x84\x42\x4e\xac\x9c\xb8\xae\x47\x4f\xe2\xf0\x1d\xd8\xe9\x73\xb4\x47\x5f\x73\xbf\xc3\xc3\xd2\xce\xf1\x76\xc6\x62\xe8\xd6\xf9\x68\x76\xf0\x21\x91\x22\x06\xcd\x6c\x59\x59\x23\x8e\xd1\x97\xab\x97\xa1\x03\x42\x72\x68\xe8\x1d\xbe\xdb\xe3\xfd\x76\xbb\x34\xcd\xcf\x88\xb7\xde\x2b\x32\xa0\x8f\xe4\x98\xa2\x40\x47\xc0\xad\x07\xb7\x32\xc4\x6d\xc5\x16\xc7\x78\x12\x70\xd6\x38\x23\xfd\x48\x9a\xb2\x43\xf3\x9c\x93\x58\x46\x67\xff\xf1\x25\x7b\xc2\xff\xd2\xde\x11\x63\x3b\x10\x81\xdf\x6b\x72\x1b\xb0\x2b\x72\x12\xee\xe4\xc5\x70\x3b\xa5\xd4\x4c\xb9\x60\x20\x87\x9d\x1d\xb5\x5c\x9f\x30\x66\x4f\x35\xf5\x11\x55\x46\x89\x3e\x2b\xde\x3e\x0b\xa4\xb4\x72\x5c\x0f\xa9\xf7\x37\x26\xc1\x15\x07\x31\xa3\x02\xb8\x51\x4a\x32\x5a\x19\x51\xeb\xa9\xa0\xce\x0c\xa0\x23\xb8\x79\xb8\xa3\xfc\x98\x3f\x74\x05\x46\xe7\x70\x73\x62\x95\xf2\x54\x9e\x14\x62\x4f\x8c\x9b\x13\xac\x26\x9c\x6e\xde\x24\x2f\x36\x1e\x95\xe1\x94\x83\x86\x80\xb0\xa4\x4d\x4c\x57\x92\x05\x9b\xa0\x0c\x8b\x1d\x85\xe4\x16\x6c\xbb\xa4\x4d\x58\x94\x72\xd7\x49\x0e\x7b\xd8\x36\x8e\xd3\xc1\xb0\x1b\x23\x39\xfe\xec\x1a\x7b\x1c\xd4\xba\xa3\x8f\x53\xc5\xb1\xa4\xcd\xb9\x25\x7b\xc6\x10\x1d\x29\x4e\x55\x81\x58\x45\x26\x82\x26\x65\x6a\x6b\x08\xac\x2a\xad\x28\x24\xae\xb3\xf4\x5f\xcc\x1e\x87\xa3\x11\xff\x42\xa6\xed\xd1\x32\x6e\x49\x9b\x6b\x8e\x0e\x20\xd1\x51\xa8\x4a\x62\x7d\x0b\x03\x4d\x05\xf3\x09\xb5\xca\x77\x45\x69\x88\x84\x7b\x33\x84\x07\xeb\xe5\xe7\xed\xb3\x92\x0c\x2d\x7e\x73\x67\x89\x1f\xac\x0f\x33\xaf\x2a\x76\x64\xe5\x42\xa1\xe3\xa6\x10\x20\x26\xc6\xa4\x48\xd5\x2e\x69\x78\x0c\xf7\xf3\x0e\xaa\xc9\xea\x7b\x03\xd6\x35\xd2\x85\x22\x33\x12\x8a\x24\xca\x9a\x43\x0d\x62\xac\x19\x51\x59\xf9\xcd\x51\x1a\x49\x29\xd6\x75\x74\x72\x82\x5c\x22\xf5\x24\xa5\x51\x7c\x13\x8b\x58\x8d\x19\xe5\x90\xd7\x81\xe9\x50\x90\x49\xbb\xa1\x32\x28\xc9\x2d\x08\x2a\x41\xb8\xbe\xaa\x3e\x87\x4b\x71\xf4\x40\xa7\x36\xd1\x33\xf6\x0b\x10\x1c\xb2\xcf\x85\xb0\x1d\xf7\x44\x78\x2b\xb1\x12\xd3\x7d\x16\x14\x0b\xda\xfb\x02\x15\x2a\xc7\x63\xb8\x09\xed\x91\xa6\xce\x3b\x65\x82\x9e\xdb\x64\x84\x82\x62\x10\x28\x5a\xa1\x16\xdc\x14\x4f\x37\x40\x3a\xa2\xa8\x9d\x1f\x24\x8b\x21\xac\x0b\xa9\x05\x24\xbe\xe7\x8a\x74\x28\x89\x07\x4b\xda\x0c\x86\x07\xe6\x1e\xdc\x9b\x41\xc4\xd7\x03\x03\x6f\xc1\xd8\x1a\xbd\x81\x41\x78\x37\xf8\xdf\xf2\xcb\x59\xd0\xc5\x3c\x0f\x8d\x35\xea\xf7\x3d\x91\xf0\xac\x2d\x1d\xcd\x5f\x24\xd1\x31\xde\x07\x9a\x47\x61\x5a\xe5\xc4\x9c\x1c\x99\x50\x64\xd9\x17\x6b\x88\x5d\xd5\x31\x4c\x28\x4a\x39\xac\x95\x2f\xba\xb5\xcb\x4b\xda\x39\xef\xe1\x67\xfc\xba\x2b\x84\xca\x8a\x0f\x0d\xdb\xd1\x07\xb7\x52\x44\x8c\x6c\xb8\x1d\x02\x19\xa7\xb2\xa2\x61\x56\x8a\xdc\x58\x48\x8b\xe5\xa3\x19\x4e\x64\xd2\x5e\x06\xed\x97\xce\x5e\xee\xa4\x4f\x08\x7a\xf3\xfe\xbe\xe9\xa1\x63\xeb\x4c\x8d\xa0\x67\x00\xbc\x27\x78\xef\x74\x70\x01\x53\xb7\xdb\x4d\xed\x7c\xd5\xea\xc3\xb7\x2d\x46\x68\x19\x1b\x0f\xea\xc3\xf0\x79\x08\xec\x05\x7f\xc7\xd9\xdd\x71\xdb\x66\x16\x57\xa8\x34\xce\x74\xd3\x22\xc5\x64\x9b\x1a\xa4\x2d\xf3\xd7\xd1\x6d\xe8\x1c\x96\xf7\x2e\xbb\xfa\x17\x5e\x52\x56\x45\x97\xed\xb1\x50\xce\x3f\xb3\xac\x7f\xf5\x25\x9d\x0c\xfb\x27\x87\x86\x55\x73\x65\xd7\x27\xf3\xec\xb5\x36\xec\xc1\xab\x92\x92\x37\x34\xc6\xf0\x5b\xb2\x94\xc7\xdb\x06\x6b\xa8\x89\xcd\x80\xfe\xd6\x17\xf4\x22\xa0\xb4\xc7\x05\x95\x8a\x8c\xb9\x75\x25\xfa\x29\xe4\xe8\x69\x24\x9c\xf5\x52\xc3\xc7\x70\xa9\xf1\xaa\x2a\x58\x23\x8b\x35\x66\x94\xff\x19\x84\x2c\x89\x19\x17\x97\x4b\x77\x03\x45\x5d\xa2\x44\x17\xe6\x21\x8e\x12\x21\x50\x26\x57\x19\x86\xeb\xa8\x9c\x3c\x2a\xcd\x80\x33\x5b\xc7\xe8\xdb\x99\xff\xd5\x2d\xec\x08\xf9\x1c\xca\x1e\x91\x23\xa6\x7c\xd9\x2a\xca\xeb\x9a\xea\x9a\x83\x0f\x7c\x4b\xae\x8f\x5f\xef\x9c\xe5\x3a\x5d\xf5\x6c\xc1\x36\x31\x3c\x0c\xd1\x64\xe7\xf0\xe4\x6a\x1a\xc2\xcf\xa8\x99\x86\xf0\xd1\x2c\x8d\x5d\xbf\x3e\xef\x61\xf1\xc5\xfa\xde\x54\x81\xc3\x2d\xcf\xaf\xc8\x56\x28\x08\xdf\xa3\x2f\x2e\x48\x6b\xd7\xf7\xa9\x16\x0a\xb5\x7c\xa8\x22\x2a\x45\x19\x75\x2e\xa7\x41\x19\xf6\x84\x79\x9a\x24\xe3\x95\xa3\xf4\x6e\x18\x6f\x4e\x53\x07\xb3\xbb\xbc\x96\xfa\x12\x50\xca\x4e\x95\xc3\x3f\x1e\xdf\x3d\x4c\xfe\x6e\x53\xc9\x8a\x59\x46\x9c\x52\x8b\xd4\x99\x43\xe0\x3a\x2b\x00\xb9\xb9\x2e\x7c\x0c\x49\xa7\x44\xa3\xe6\xc4\x7e\x9c\xa8\x91\xe3\x5f\xdf\xfc\x36\x86\x9f\xad\x03\x7a\xc6\xb2\xd2\x34\x04\x95\xda\x9c\xe6\x8a\xb7\x55\x1e\x05\x61\xb6\x7b\x43\x25\x14\x58\xaa\x6c\x9e\x98\x5e\x07\x66\x3d\x2e\x09\x6c\x62\xb6\x26\xd0\x6a\x49\x53\x18\x70\x45\x59\xeb\xe8\xcf\x06\x4b\xfa\x32\x80\xef\xd7\x05\x39\x82\x81\x3c\x0e\xe2\x81\xdb\x12\x52\xe6\x5a\x4e\x99\x0e\x8e\x7d\xb8\x53\x8b\x05\x39\x8a\xc5\x38\xad\xc8\xf8\x1f\xa4\x13\x53\x73\x30\xb6\xb5\x38\x90\x10\x7d\x56\x94\xa9\xb9\xa2\xfc\x80\x91\x5f\xdf\xfc\x36\x80\xef\xbb\x72\x09\xea\xd0\x33\xbc\x89\x5d\x86\x62\x91\xf1\x87\xd4\xb8\xf1\xc6\x78\x7c\x16\x9a\x99\xb4\x0e\x26\xd6\xfc\xde\x42\x81\x2b\x02\xb6\x25\xc1\x9a\xb4\x1e\xc5\x7b\xd3\x1c\xd6\xb1\x25\x6d\x54\x19\x5b\xbc\x0a\x9d\xdf\xfb\x5e\xf1\xf4\xee\xee\xdd\x34\x9e\x26\x66\x5b\x18\x39\xc2\x58\x0f\x73\x65\x50\xa7\xbe\x43\xf1\xae\x4d\xe1\x3a\x1a\xc9\x5b\xc8\x0a\x34\x01\x2b\x83\x36\xe6\xb5\xaf\x1d\x8d\xf7\xef\xaf\xbf\x2a\x06\x8e\x7d\x48\x38\xe5\xfe\xe1\xb3\xc2\x7e\x91\xf9\x7f\xbc\xb4\xff\x2a\xa1\xc3\x77\xb5\x0b\x84\x7e\x68\xf9\xe9\x49\xa1\x97\xf5\x8c\x9c\x21\x4f\x41\xee\xdc\x66\x2c\x22\x67\x54\x79\x9e\xd8\x15\xb9\x95\xa2\xf5\x64\x6d\xdd\x52\x99\xc5\x48\x1c\x71\x14\xbd\x83\x27\xe1\x5b\xe4\xe4\xbb\xf0\xf3\x6a\x32\x72\x85\xd9\xc5\x82\x86\x4d\x7f\x84\xb4\x72\x0e\x4f\x5e\x45\xd8\xa6\x91\xbb\xbc\x77\xba\x7e\x8c\xc0\x91\xed\xd3\x90\xb0\x5b\x17\x2a\x2b\x9a\x4f\x91\x2d\xa4\x2c\x31\x8f\x50\x8a\x66\xf3\xcd\x9d\x5f\x54\x5a\x3b\x39\x7b\x33\x4a\x9f\xd1\x47\x68\x72\xf9\xcf\x8a\xbd\xcc\xbf\x8a\x0e\x6b\x75\x11\x10\x7c\xbc\xbf\xfb\x63\x42\xa2\x56\x5f\x11\xf5\xf1\x33\xd6\x14\xbc\xab\x9b\x9a\x96\xbd\x75\x52\xb9\x76\xe6\xea\xd9\xf6\xc6\x62\x27\x7c\x2a\xb2\xe0\xf3\x97\xab\xff\x06\x00\x00\xff\xff\x39\x29\x67\x42\x18\x21\x00\x00") +var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x8f\xdb\xb8\x11\x7f\xdf\x4f\x31\xf0\x3d\xec\x1d\xe0\x3f\xbd\x14\x28\x0a\xbf\x2d\x76\x73\xc5\xb6\xd7\x4d\x90\xdd\xe4\xe5\x70\x0f\x63\x69\x6c\xb1\xa6\x48\x1d\x87\xb2\xd7\x0d\xf2\xdd\x8b\x21\x29\x5b\xb2\xbd\xb6\x9c\x6e\xd2\xf2\xc5\x16\x45\x0e\xe7\xef\x6f\x66\x28\xac\xd4\x27\x72\xac\xac\x99\x02\x56\x8a\x9e\x3d\x19\x79\xe2\xf1\xf2\xaf\x3c\x56\x76\xb2\xfa\xf9\x6a\xa9\x4c\x3e\x85\xdb\x9a\xbd\x2d\x3f\x10\xdb\xda\x65\x74\x47\x73\x65\x94\x57\xd6\x5c\x95\xe4\x31\x47\x8f\xd3\x2b\x00\x34\xc6\x7a\x94\x69\x96\x47\x80\xcc\x1a\xef\xac\xd6\xe4\x46\x0b\x32\xe3\x65\x3d\xa3\x59\xad\x74\x4e\x2e\x10\x6f\x8e\x5e\xfd\x69\xfc\x97\xf1\x9b\x2b\x80\xcc\x51\xd8\xfe\xa4\x4a\x62\x8f\x65\x35\x05\x53\x6b\x7d\x05\x60\xb0\xa4\x29\xd8\x8a\x1c\x7a\xeb\x78\xbc\xfb\x97\x59\x47\x56\x7e\xca\x2b\xae\x28\x93\x83\x17\xce\xd6\x55\x7b\x75\x6b\x4d\x24\xd5\xf0\x87\x9e\x16\xd6\xa9\xe6\x19\x60\x04\x56\x97\xe1\x7f\x94\xfb\x5d\xa2\x11\xa6\xb4\x62\xff\x8f\xce\xf4\xaf\x8a\x7d\x78\x55\xe9\xda\xa1\x6e\x9d\x19\x66\x59\x99\x45\xad\xd1\xed\xe6\xaf\x00\x38\xb3\x15\x4d\xe1\x56\xd7\xec\x49\x26\x92\x1e\x12\x0f\xa3\x24\xeb\xea\xe7\xc4\x12\x67\x05\x95\xd8\x30\x08\x42\xca\xdc\xbc\xbf\xff\xf4\xe7\xc7\xbd\x17\x00\x39\x71\xe6\x54\xe5\x83\x56\x1b\x1e\xc1\x51\xe5\x88\xc9\x78\x06\x84\x2c\x1e\xbb\x65\x68\xdc\xda\xee\x37\xc2\x98\x9d\xfd\x8b\x32\xdf\x9a\xae\x9c\x2c\xf6\x2d\x2d\xc5\xd1\xf2\x9e\xce\xfc\x1e\x1f\xd7\xc2\x6c\x5c\x07\xb9\x38\x0e\x31\xf8\x82\x1a\xb1\x29\x4f\x12\x82\x9d\x83\x2f\x14\xef\xf8\x0d\xbe\x20\xd3\x68\x12\x57\x63\x78\x24\x27\x1b\x81\x0b\x5b\xeb\x5c\x3c\x6c\x45\xce\x83\xa3\xcc\x2e\x8c\xfa\xf7\x96\x1a\x83\xb7\xe1\x18\x8d\x9e\xd8\x83\x32\x9e\x9c\x41\x0d\x2b\xd4\x35\x0d\x01\x4d\x0e\x25\x6e\xc0\x91\xd0\x85\xda\xb4\x28\x84\x25\x3c\x86\x7f\x5a\x47\xa0\xcc\xdc\x4e\xa1\xf0\xbe\xe2\xe9\x64\xb2\x50\xbe\x89\x8d\xcc\x96\x65\x6d\x94\xdf\x4c\x82\x9b\xab\x59\x2d\x76\x9f\xe4\xb4\x22\x3d\x61\xb5\x18\xa1\xcb\x0a\xe5\x29\xf3\xb5\xa3\x09\x56\x6a\x14\x98\x35\x21\x3e\xc6\x65\xfe\x83\x4b\xd1\xc4\xd7\x7b\xea\x8b\x76\x60\xef\x94\x59\x74\x5e\x05\x9f\x3c\xa9\x6b\x71\x4f\x50\x62\xe8\xb8\x3d\xca\xb2\x53\xa9\x4c\x89\x56\x3e\xbc\x7d\x7c\x82\x86\x81\xa8\xf6\xa8\xe1\x96\xb7\xec\x94\x2d\x8a\x52\x66\x4e\x2e\xae\x9c\x3b\x5b\x06\x2a\x64\xf2\xca\x2a\xe3\xc3\x43\xa6\x15\x19\x0f\x5c\xcf\x4a\xe5\xc5\x8a\x7f\xd4\xc4\x5e\xec\x30\x86\xdb\x00\x0d\x30\x23\xa8\xab\x1c\x3d\xe5\x63\xb8\x37\x70\x8b\x25\xe9\x5b\x64\xfa\xe6\xaa\x16\x8d\xf2\x48\xd4\xd7\x5f\xd9\x6d\x64\x3b\xdc\x70\x10\x25\x00\x0d\xfc\xbc\x68\x9d\x26\x22\x1f\x2b\xca\x3a\xa1\x90\x13\x2b\x27\xae\xeb\xd1\x93\x38\x7c\x07\x76\xfa\x1c\xed\xd1\xd7\xdc\xef\xf0\xb0\xb4\x73\xbc\x9d\xb1\x18\xba\x75\x3e\x9a\x1d\x7c\x48\xa4\x88\x41\x33\x5b\x56\xd6\x88\x63\xf4\xe5\xea\x65\xe8\x80\x90\x1c\x1a\x7a\x87\xef\xf6\x78\xbf\xdd\x2e\x4d\xf3\x33\xe2\xad\xf7\x8a\x0c\xe8\x23\x39\xa6\x28\xd0\x11\x70\xeb\xc1\xad\x0c\x71\x5b\xb1\xc5\x31\x9e\x04\x9c\x35\xce\x48\x3f\x92\xa6\xec\xd0\x3c\xe7\x24\x96\xd1\xd9\x7f\x7c\xc9\x9e\xf0\xbf\xb6\x77\xc4\xd8\x0e\x44\xe0\x8f\x9a\xdc\x06\xec\x8a\x9c\x84\x3b\x79\x31\xdc\x4e\x29\x35\x53\x2e\x18\xc8\x61\x67\x47\x2d\xd7\x27\x8c\xd9\x53\x4d\x7d\x44\x95\x51\xa2\xcf\x8a\xb7\xcf\x02\x29\xad\x1c\xd7\x43\xea\xfd\x8d\x49\x70\xc5\x41\xcc\xa8\x00\x6e\x94\x92\x8c\x56\x46\xd4\x7a\x2a\xa8\x33\x03\xe8\x08\x6e\x1e\xee\x28\x3f\xe6\x0f\x5d\x81\xd1\x39\xdc\x9c\x58\xa5\x3c\x95\x27\x85\xd8\x13\xe3\xe6\x04\xab\x09\xa7\x9b\x37\xc9\x8b\x8d\x47\x65\x38\xe5\xa0\x21\x20\x2c\x69\x13\xd3\x95\x64\xc1\x26\x28\xc3\x62\x47\x21\xb9\x05\xdb\x2e\x69\x13\x16\xa5\xdc\x75\x92\xc3\x1e\xb6\x8d\xe3\x74\x30\xec\xc6\x48\x8e\x3f\xbb\xc6\x1e\x07\xb5\xee\xe8\xe3\x54\x71\x2c\x69\x73\x6e\xc9\x9e\x31\x44\x47\x8a\x53\x55\x20\x56\x91\x89\xa0\x49\x99\xda\x1a\x02\xab\x4a\x2b\x0a\x89\xeb\x2c\xfd\x17\xb3\xc7\xe1\x68\xc4\xbf\x90\x69\x7b\xb4\x8c\x5b\xd2\xe6\x9a\xa3\x03\x48\x74\x14\xaa\x92\x58\xdf\xc2\x40\x53\xc1\x7c\x42\xad\xf2\x5d\x51\x1a\x22\xe1\xde\x0c\xe1\xc1\x7a\xf9\x79\xfb\xac\x24\x43\x8b\xdf\xdc\x59\xe2\x07\xeb\xc3\xcc\xab\x8a\x1d\x59\xb9\x50\xe8\xb8\x29\x04\x88\x89\x31\x29\x52\xb5\x4b\x1a\x1e\xc3\xfd\xbc\x83\x6a\xb2\xfa\xde\x80\x75\x8d\x74\xa1\xc8\x8c\x84\x22\x89\xb2\xe6\x50\x83\x18\x6b\x46\x54\x56\x7e\x73\x94\x46\x52\x8a\x75\x1d\x9d\x9c\x20\x97\x48\x3d\x49\x69\x14\xdf\xc4\x22\x56\x63\x46\x39\xe4\x75\x60\x3a\x14\x64\xd2\x6e\xa8\x0c\x4a\x72\x0b\x82\x4a\x10\xae\xaf\xaa\xcf\xe1\x52\x1c\x3d\xd0\xa9\x4d\xf4\x8c\xfd\x02\x04\x87\xec\x73\x21\x6c\xc7\x3d\x11\xde\x4a\xac\xc4\x74\x9f\x05\xc5\x82\xf6\xbe\x40\x85\xca\xf1\x18\x6e\x42\x7b\xa4\xa9\xf3\x4e\x99\xa0\xe7\x36\x19\xa1\xa0\x18\x04\x8a\x56\xa8\x05\x37\xc5\xd3\x0d\x90\x8e\x28\x6a\xe7\x07\xc9\x62\x08\xeb\x42\x6a\x01\x89\xef\xb9\x22\x1d\x4a\xe2\xc1\x92\x36\x83\xe1\x81\xb9\x07\xf7\x66\x10\xf1\xf5\xc0\xc0\x5b\x30\xb6\x46\x6f\x60\x10\xde\x0d\xfe\xbb\xfc\x72\x16\x74\x31\xcf\x43\x63\x8d\xfa\x7d\x4f\x24\x3c\x6b\x4b\x47\xf3\x17\x49\x74\x8c\xf7\x81\xe6\x51\x98\x56\x39\x31\x27\x47\x26\x14\x59\xf6\xc5\x1a\x62\x57\x75\x0c\x13\x8a\x52\x0e\x6b\xe5\x8b\x6e\xed\xf2\x92\x76\xce\x7b\xf8\x19\xbf\xee\x0a\xa1\xb2\xe2\x43\xc3\x76\xf4\xc1\xad\x14\x11\x23\x1b\x6e\x87\x40\xc6\xa9\xac\x68\x98\x95\x22\x37\x16\xd2\x62\xf9\x68\x86\x13\x99\xb4\x97\x41\xfb\xa5\xb3\x97\x3b\xe9\x13\x82\xde\xbc\xbf\x6f\x7a\xe8\xd8\x3a\x53\x23\xe8\x19\x00\xef\x09\xde\x3b\x1d\x5c\xc0\xd4\xed\x76\x53\x3b\x5f\xb5\xfa\xf0\x6d\x8b\x11\x5a\xc6\xc6\x83\xfa\x30\x7c\x1e\x02\x7b\xc1\xdf\x71\x76\x77\xdc\xb6\x99\xc5\x15\x2a\x8d\x33\xdd\xb4\x48\x31\xd9\xa6\x06\x69\xcb\xfc\x75\x74\x1b\x3a\x87\xe5\xbd\xcb\xae\xfe\x85\x97\x94\x55\xd1\x65\x7b\x2c\x94\xf3\xcf\x2c\xeb\x5f\x7d\x49\x27\xc3\xfe\xc9\xa1\x61\xd5\x5c\xd9\xf5\xc9\x3c\x7b\xad\x0d\x7b\xf0\xaa\xa4\xe4\x0d\x8d\x31\xfc\x96\x2c\xe5\xf1\xb6\xc1\x1a\x6a\x62\x33\xa0\xbf\xf5\x05\xbd\x08\x28\xed\x71\x41\xa5\x22\x63\x6e\x5d\x89\x7e\x0a\x39\x7a\x1a\x09\x67\xbd\xd4\xf0\x31\x5c\x6a\xbc\xaa\x0a\xd6\xc8\x62\x8d\x19\xe5\xff\x0f\x42\x96\xc4\x8c\x8b\xcb\xa5\xbb\x81\xa2\x2e\x51\xa2\x0b\xf3\x10\x47\x89\x10\x28\x93\xab\x0c\xc3\x75\x54\x4e\x1e\x95\x66\xc0\x99\xad\x63\xf4\xed\xcc\xff\xea\x16\x76\x84\x7c\x0e\x65\x8f\xc8\x11\x53\xbe\x6c\x15\xe5\x75\x4d\x75\xcd\xc1\x07\xbe\x25\xd7\xc7\xaf\x77\xce\x72\x9d\xae\x7a\xb6\x60\x9b\x18\x1e\x86\x68\xb2\x73\x78\x72\x35\x0d\xe1\x17\xd4\x4c\x43\xf8\x68\x96\xc6\xae\x5f\x9f\xf7\xb0\xf8\x62\x7d\x6f\xaa\xc0\xe1\x96\xe7\x57\x64\x2b\x14\x84\xef\xd1\x17\x17\xa4\xb5\xeb\xfb\x54\x0b\x85\x5a\x3e\x54\x11\x95\xa2\x8c\x3a\x97\xd3\xa0\x0c\x7b\xc2\x3c\x4d\x92\xf1\xca\x51\x7a\x37\x8c\x37\xa7\xa9\x83\xd9\x5d\x5e\x4b\x7d\x09\x28\x65\xa7\xca\xe1\xef\x8f\xef\x1e\x26\x7f\xb3\xa9\x64\xc5\x2c\x23\x4e\xa9\x45\xea\xcc\x21\x70\x9d\x15\x80\xdc\x5c\x17\x3e\x86\xa4\x53\xa2\x51\x73\x62\x3f\x4e\xd4\xc8\xf1\x6f\x6f\x7e\x1f\xc3\x2f\xd6\x01\x3d\x63\x59\x69\x1a\x82\x4a\x6d\x4e\x73\xc5\xdb\x2a\x8f\x82\x30\xdb\xbd\xa1\x12\x0a\x2c\x55\x36\x4f\x4c\xaf\x03\xb3\x1e\x97\x04\x36\x31\x5b\x13\x68\xb5\xa4\x29\x0c\xb8\xa2\xac\x75\xf4\x67\x83\x25\x7d\x19\xc0\x8f\xeb\x82\x1c\xc1\x40\x1e\x07\xf1\xc0\x6d\x09\x29\x73\x2d\xa7\x4c\x07\xc7\x3e\xdc\xa9\xc5\x82\x1c\xc5\x62\x9c\x56\x64\xfc\x4f\xd2\x89\xa9\x39\x18\xdb\x5a\x1c\x48\x88\x3e\x2b\xca\xd4\x5c\x51\x7e\xc0\xc8\x6f\x6f\x7e\x1f\xc0\x8f\x5d\xb9\x04\x75\xe8\x19\xde\xc4\x2e\x43\xb1\xc8\xf8\x53\x6a\xdc\x78\x63\x3c\x3e\x0b\xcd\x4c\x5a\x07\x13\x6b\x7e\x6f\xa1\xc0\x15\x01\xdb\x92\x60\x4d\x5a\x8f\xe2\xbd\x69\x0e\xeb\xd8\x92\x36\xaa\x8c\x2d\x5e\x85\xce\xef\x7d\xaf\x78\x7a\x77\xf7\x6e\x1a\x4f\x13\xb3\x2d\x8c\x1c\x61\xac\x87\xb9\x32\xa8\x53\xdf\xa1\x78\xd7\xa6\x70\x1d\x8d\xe4\x2d\x64\x05\x9a\x80\x95\x41\x1b\xf3\xda\xd7\x8e\xc6\xfb\xf7\xd7\x5f\x15\x03\xc7\x3e\x24\x9c\x72\xff\xf0\x59\x61\xbf\xc8\xfc\x1f\x5e\xda\x7f\x95\xd0\xe1\xbb\xda\x05\x42\x3f\xb4\xfc\xf4\xa4\xd0\xcb\x7a\x46\xce\x90\xa7\x20\x77\x6e\x33\x16\x91\x33\xaa\x3c\x4f\xec\x8a\xdc\x4a\xd1\x7a\xb2\xb6\x6e\xa9\xcc\x62\x24\x8e\x38\x8a\xde\xc1\x93\xf0\x2d\x72\xf2\x43\xf8\x79\x35\x19\xb9\xc2\xec\x62\x41\xc3\xa6\xef\x21\xad\x9c\xc3\x93\x57\x11\xb6\x69\xe4\x2e\xef\x9d\xae\x1f\x23\x70\x64\xfb\x34\x24\xec\xd6\x85\xca\x8a\xe6\x53\x64\x0b\x29\x4b\xcc\x23\x94\xa2\xd9\x7c\x73\xe7\x17\x95\xd6\x4e\xce\xde\x8c\xd2\x67\xf4\x11\x9a\x5c\xfe\xb3\x62\x2f\xf3\xaf\xa2\xc3\x5a\x5d\x04\x04\x1f\xef\xef\xbe\x4f\x48\xd4\xea\x2b\xa2\x3e\x7e\xc6\x9a\x82\x77\x75\x53\xd3\xb2\xb7\x4e\x2a\xd7\xce\x5c\x3d\xdb\xde\x58\xec\x84\x4f\x45\x16\x7c\xfe\x72\xf5\x9f\x00\x00\x00\xff\xff\xb3\x0d\x9b\xb8\x18\x21\x00\x00") func operatorsCoreosCom_operatorsYamlBytes() ([]byte, error) { return bindataRead( @@ -204,7 +204,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\x95\xe8\xf7\xf9\x15\x28\x27\x55\xb6\xb3\x92\xdc\x9d\x9d\x4d\x72\xbd\xa9\xa4\xdc\xb6\x7b\xa2\x9d\x6e\xb7\xb7\xe5\xee\xa9\xdc\x24\x37\x81\x48\x48\xc2\x98\x04\x38\x00\x28\xb7\xf2\xf8\xef\xb7\x70\x0e\x00\x82\xd4\x8b\x94\xe5\xc7\x4c\xcc\x0f\x33\x6d\x0a\x00\x81\x83\x83\xf3\xc2\x79\xd0\x82\x7f\x66\x4a\x73\x29\x4e\x09\x2d\x38\xfb\x62\x98\xb0\x7f\xe9\xc1\xed\x6f\xf4\x80\xcb\x93\xf9\xeb\xaf\x6e\xb9\x48\x4f\xc9\x79\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x0b\x36\xe1\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\x9e\x7e\x45\x08\x15\x42\x1a\x6a\x5f\x6b\xfb\x27\x21\x89\x14\x46\xc9\x2c\x63\xaa\x3f\x65\x62\x70\x5b\x8e\xd9\xb8\xe4\x59\xca\x14\x0c\xee\x3f\x3d\x7f\x35\xf8\xd5\xe0\xd5\x57\x84\x24\x8a\x41\xf7\x1b\x9e\x33\x6d\x68\x5e\x9c\x12\x51\x66\xd9\x57\x84\x08\x9a\xb3\x53\xa2\xcb\xb1\x4e\x14\x2f\xe0\x13\x03\x59\x30\x45\x8d\x54\x7a\x90\x48\xc5\xa4\xfd\x5f\xfe\x95\x2e\x58\x62\x3f\x3e\x55\xb2\x2c\x4e\xc9\xca\x36\x38\x9c\x9f\x23\x35\x6c\x2a\x15\xf7\x7f\x13\xd2\x27\x32\xcb\xe1\xdf\xb8\xf6\x51\xf4\x55\x78\x9d\x71\x6d\xbe\x5d\xfa\xe9\x1d\xd7\x06\x7e\x2e\xb2\x52\xd1\xac\x31\x5b\xf8\x45\xcf\xa4\x32\x57\xd5\xb7\xed\xb7\x74\x39\x8e\xff\xed\x1a\x72\x31\x2d\x33\xaa\xea\x83\x7c\x45\x88\x4e\x64\xc1\x4e\x09\x8c\x51\xd0\x84\xa5\x5f\x11\xe2\xe0\xe8\xc6\xec\x13\x9a\xa6\xb0\x37\x34\xbb\x56\x5c\x18\xa6\xce\x65\x56\xe6\x22\x7c\xd3\xb6\x49\x59\x18\xf5\x94\xdc\xcc\x18\x29\x68\x72\x4b\xa7\xcc\x7f\x6f\xcc\x52\x62\x64\xe8\x40\xc8\xf7\x5a\x8a\x6b\x6a\x66\xa7\x64\x60\x41\x3c\xb0\x10\x8c\x7e\xc6\xfd\xb9\xc6\x41\xa2\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x09\x35\x34\x93\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\x4b\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\x69\xd4\x7c\xdd\x7a\x4a\x33\x2a\x04\xcb\x88\x9c\x90\xb2\x48\xa9\x61\x9a\x18\x59\xc1\x67\x33\x78\x5c\xe7\xa5\xd9\x9c\x2f\xbd\x5f\x31\x1d\x6c\x3a\x7f\x4d\xb3\x62\x46\x5f\xbb\x97\x3a\x99\xb1\x9c\x56\x7b\x28\x0b\x26\xce\xae\x87\x9f\xff\x73\xd4\xf8\x81\xd4\x97\x12\xa3\x28\xb9\x65\xac\xd0\xd5\xa1\x20\x65\x61\xd7\x64\x17\x47\xc6\x0b\x62\x14\x4d\x6e\xb9\x98\xc2\xd2\xa7\xb8\xde\x73\xdc\x18\x3d\x58\x9a\xb2\x1c\x7f\xcf\x12\x13\xbd\x56\xec\x87\x92\x2b\x96\xc6\x53\xb1\x90\xf5\x24\xa2\xf1\xda\xc2\x29\x7a\x55\x28\x3b\x2d\x13\x9d\x43\x7c\x22\x1a\x55\x7b\xdf\x58\xe6\xa1\x85\x05\xb6\x23\xa9\x25\x4f\x76\xfa\x33\xe6\x0f\x07\x4b\x1d\x00\xed\x76\x9a\x19\xd7\x44\xb1\x42\x31\xcd\x04\x12\x2c\xfb\x9a\x0a\xb7\xa6\x01\x19\x31\x65\x3b\xda\x03\x5b\x66\xa9\xa5\x63\x73\xa6\x0c\x51\x2c\x91\x53\xc1\xff\x1e\x46\x03\x10\xd9\xcf\x64\x16\x3f\x0c\x81\xe3\x26\x68\x46\xe6\x34\x2b\x59\x8f\x50\x91\x92\x9c\x2e\x88\x62\x76\x5c\x52\x8a\x68\x04\x68\xa2\x07\xe4\xbd\x54\x8c\x70\x31\x91\xa7\x64\x66\x4c\xa1\x4f\x4f\x4e\xa6\xdc\x78\x0a\x9c\xc8\x3c\x2f\x05\x37\x8b\x13\x20\xa6\x7c\x5c\xda\x8d\x3b\x49\xd9\x9c\x65\x27\x9a\x4f\xfb\x54\x25\x33\x6e\x58\x62\x4a\xc5\x4e\x68\xc1\xfb\x30\x59\x81\x24\x32\x4f\x7f\xa6\x1c\xcd\xd6\x87\x0d\xf0\xad\x3c\x07\xc4\x53\xbd\x8d\xb0\xb6\xc4\x8f\x70\x4d\xa8\xeb\x8e\x6b\xa9\x40\x6a\x5f\x59\xa8\x7c\xbc\x1c\xdd\x10\x3f\x01\x04\x3b\x42\xb8\x6a\xaa\x2b\x60\x5b\x40\x71\x31\x61\x0a\x5b\x4e\x94\xcc\x61\x14\x26\xd2\x42\x72\x61\xe0\x8f\x24\xe3\x4c\x18\x7b\x0c\x73\x6e\x34\xe0\x1c\xd3\xc6\xee\xc3\x80\x9c\x03\x03\x22\x63\xe6\x0e\x6c\x3a\x20\x43\x41\xce\x69\xce\xb2\x73\xaa\xd9\x83\x83\xda\x42\x54\xf7\x2d\xf8\xda\x03\x3b\xe6\x9f\xcb\x1d\x96\xce\x18\x21\x9e\xc1\xad\xdd\x9d\xf8\xc0\x8f\x0a\x96\x84\xe3\x40\x05\x39\x2b\x8a\x8c\x27\x88\xf1\x66\x46\x0d\x49\xa8\xb0\xf0\xe2\x42\x1b\x9a\x65\xc0\x4e\x5a\xcd\x62\xdd\x69\x27\x70\xb4\x1b\xcc\xc1\xbf\x5e\xa2\xd0\xf5\x1f\x02\x53\x6b\xb4\x58\x47\x19\xec\xe3\xe8\xec\xf2\x0f\x1b\x40\x4e\x50\x32\x99\xf0\xe9\xaa\x6e\x6b\x61\x79\x0e\x5d\x40\xa6\xa1\x5c\x68\x37\x44\xa9\x10\x9a\x15\xa7\xb2\xbc\x8b\xd6\xf8\xf6\x60\xed\xec\x56\x42\x76\xdb\x9a\xed\xc3\xc4\x7c\xf5\x0f\x8d\x05\x5c\x8a\x39\x1e\x54\x2b\xb3\x58\x22\xc7\xc4\x9c\x2b\x29\x72\x7b\x88\xe6\x54\x71\x3a\xce\x1c\x63\x63\x96\x7c\xe1\x19\xc3\x25\x32\xb5\xea\x48\xad\xf9\x2a\xae\x87\x2a\x45\x17\x6b\x5a\x70\xc3\xf2\x35\xab\x59\x35\xed\xcf\x54\x45\x54\xc2\x22\xef\xaa\xa9\x13\xd7\xc0\x4e\x9d\x92\xf3\x30\xf1\xb5\x9f\xd9\x02\x77\x7c\xd6\xe3\x76\xf5\xac\xc1\x72\xff\x6c\xdb\x40\x7c\x80\xd3\x6f\xf8\xbd\x01\x16\x7b\x42\x90\x81\xb1\x95\xd0\x18\x90\xf7\xa5\x86\xdd\xa2\xe4\xfc\xaf\xc3\x8b\xcb\xab\x9b\xe1\xdb\xe1\xe5\xc7\xf5\xe0\x20\xdb\x0e\x4a\xf5\x00\x8d\xef\x30\xd9\xc3\xcf\x7e\x8f\x14\x9b\x30\xc5\x44\xc2\x34\xf9\xf9\xd1\xe7\xb3\x8f\x7f\xbd\x3a\x7b\x7f\x79\x4c\xa8\x62\x84\x7d\x29\xa8\x48\x59\x4a\x4a\xed\x99\x46\xa1\xd8\x9c\xcb\x52\x67\x0b\x47\xb9\xd2\x35\x48\xdb\xc4\x56\xe0\xb6\x54\x2c\x88\x66\x6a\xce\x93\xd5\x20\xd2\x03\x32\x9c\x10\x5a\x21\x50\x12\x30\xdc\x32\xaa\x6c\xce\xd2\x1e\x0c\x1b\x26\xed\xbf\xc3\x45\x51\x1a\xcf\xf0\xee\x78\x96\xc1\xa9\x10\x28\x2b\xa5\x03\x72\x21\x4b\x3b\xde\xcf\x7f\x0e\x0b\x53\x2c\x2d\x13\x10\xa2\x2d\x31\xe0\x62\x6a\x7f\xea\x91\xbb\x19\x4f\x66\x84\x66\x99\xbc\xd3\x40\x29\x98\x4e\x68\xe1\x97\x1e\x43\x47\x2f\x84\xa1\x5f\x4e\x09\x1f\xb0\x01\x39\xf8\x79\xf4\xd3\x01\x7e\xbd\x50\xd2\x7e\x02\xe5\x64\x9c\x55\xc6\x0d\x53\x34\x23\x07\x71\xeb\x01\xb9\xb4\xdf\x60\x69\xbc\x0f\x30\x82\x60\x73\xa6\xec\x2a\xfc\x2e\xf4\x88\x62\x53\xaa\xd2\x8c\x69\x6d\xf1\xec\x6e\xc6\xcc\x8c\xa1\x28\x1e\x00\xc6\xbe\x70\xcb\x70\xa5\x22\x42\x9a\x01\xb9\x60\x13\x5a\x66\xc0\x81\xc9\xc1\xc1\xa0\xc9\xf8\x76\x47\xb5\xb7\x4a\xe6\x1d\xd0\x6d\x54\xd7\x1c\x56\xed\xfd\xa1\xc6\x91\x6b\x64\x4d\xb3\x94\xf0\x89\x93\x60\xb8\xb6\x8b\x22\x2c\x2f\xcc\xa2\xcd\xa1\xd9\x42\x47\x48\x6b\x42\x40\x02\x4f\x7a\x4f\x8b\x6f\xd9\xe2\x23\x9b\x6c\x6b\xde\x5c\x3f\xcb\x58\x62\x09\x25\xb9\x65\x0b\x10\x67\xc9\xb9\x1f\x70\xf3\x52\x3a\x2d\x87\xb4\x24\x8f\xfe\xe9\xdb\xe9\x6c\x6d\xd7\x1e\x48\xf6\xb9\x65\x8b\x36\xcd\xc8\xb2\x4e\x67\x41\x03\xbc\xce\xc2\x6a\x3b\x54\x48\x7b\x94\xf5\xcf\x76\x8a\xbe\x72\x72\x87\x31\x69\x77\xe7\xd4\xac\x14\x58\x6f\xcb\x31\x53\x82\x19\x06\x32\x6b\x2a\x13\x6d\xc5\xd5\x84\x15\x46\x9f\xc8\xb9\xa5\x7c\xec\xee\xe4\x4e\x2a\xab\xc8\xf5\xef\xb8\x99\xf5\x71\x57\xf5\x09\x18\x3d\x4e\x7e\x06\xff\x23\x37\x1f\x2e\x3e\x9c\x92\xb3\x34\x25\x12\x8e\x78\xa9\xd9\xa4\xcc\xc8\x84\xb3\x2c\xd5\x83\x48\xeb\xea\x81\x3e\xd0\x23\x25\x4f\x7f\xbf\xf9\x70\xef\x08\x31\x59\xa0\xb1\x62\x07\xa8\x8d\x40\xe8\x5a\xd4\xe8\x54\x40\x7a\x4b\xa1\xac\x8a\x60\xf7\x3c\x77\x6c\xd1\x31\x94\x0e\xcb\x18\x4b\x99\x31\x2a\xb6\xf4\x00\xb0\x75\x3f\xb3\x87\xd5\xa1\x85\x11\x3c\x02\x14\x32\x3d\x25\xba\x2c\x0a\xa9\x8c\x0e\x2a\x02\xd8\x5c\x7a\xf5\x3f\x41\x5e\xee\x91\xbf\x85\x97\x19\x1d\xb3\x4c\xff\xe9\xf0\xf0\xb7\xdf\x5e\xfe\xf1\x77\x87\x87\x7f\xf9\x5b\xfc\x6b\x64\xa1\xab\x37\x41\x9b\x8e\x4c\x41\x08\x77\x7f\x3a\x36\x7a\x96\x24\xb2\x14\xc6\xfd\x60\xa8\x29\xf5\x60\x26\xb5\x19\x5e\x87\x3f\x0b\x99\x36\xff\xd2\x5b\x38\x01\x79\x58\xa2\x03\xe0\xbc\xa6\x66\xb6\x67\xd2\xb3\xde\x1a\xb1\xfa\xa9\x6d\xb7\xb7\x4f\xb8\x5d\x76\x06\x09\xfb\xcf\xb7\x7e\xba\x96\x03\xdd\x29\x6e\x0c\x13\x20\x77\x30\x95\x5b\x4e\xdc\xb3\x98\x5b\xb1\xd9\xf9\xeb\x83\x07\x21\x5e\x01\x6a\x3b\x2c\x0e\x66\xef\x56\x86\xc8\x1c\x08\xad\x97\xa0\x2a\x1d\xe9\xec\x7a\xe8\x2d\x33\x7b\x5f\x88\xb7\x37\xbc\xbd\xf7\x99\x0c\x96\x0b\xb7\xac\x20\x69\x9e\x12\x29\xb2\x45\xf8\x5d\x93\x8c\x83\x35\xc2\x0a\xa0\xc1\x22\x71\x84\x2f\x07\x49\x51\xf6\x5c\x83\x41\xce\x72\xa9\x16\xe1\x4f\x56\xcc\x58\x6e\x25\xb6\xbe\x36\x52\xd1\x29\xeb\x85\xee\xd8\x2d\xfc\x85\x1d\x6b\x1f\x58\xee\x8d\x22\x75\x52\x2a\xcb\x3c\xb2\x85\xa7\x20\x2c\x7d\xda\xb3\xe8\xc1\xb4\xe7\xa3\x18\x76\xe3\x6a\x47\x96\x1b\xb4\x45\x67\x70\xf5\xab\x02\x19\x72\x2e\xb3\x32\x67\xba\x17\xd8\x13\x4a\xeb\x62\x6e\xa5\xc9\x25\xf3\xce\xea\xa7\xe3\xe9\x4b\xf9\x9c\x6b\xa9\x76\xe6\x83\xdc\x99\x3c\x65\x69\xac\xa6\x32\x91\x2a\xa7\x26\xa8\x8b\x5f\x0a\xa9\x41\x07\x70\x38\xdb\x20\x29\xaf\x0f\x5a\x7d\xb6\xa0\xc6\x30\x25\x4e\xc9\xff\x3b\xfa\xf3\x7f\xfc\xb3\x7f\xfc\xfb\xa3\xa3\x3f\xbd\xea\xff\x9f\xbf\xfc\xc7\xd1\x9f\x07\xf0\x8f\x5f\x1c\xff\xfe\xf8\x9f\xfe\x8f\xff\x38\x3e\x3e\x3a\xfa\xd3\xb7\xef\xbf\xb9\xb9\xbe\xfc\x0b\x3f\xfe\xe7\x9f\x44\x99\xdf\xe2\x5f\xff\x3c\xfa\x13\xbb\xfc\x4b\xcb\x41\x8e\x8f\x7f\xff\xf3\x56\xd3\xa3\x62\xf1\xa1\xc5\x81\xc7\xa7\xef\x36\x88\x0b\xc3\xa6\x4c\x75\xec\xd5\x7a\x5b\x09\xf9\xd2\xaf\x84\xb6\x3e\x17\xa6\x2f\x55\x1f\xbb\x9f\x12\xa3\xca\xed\x07\xa3\x22\x6a\xbb\xe0\xf9\x47\x7f\x5a\x23\x53\xac\x27\xcd\x7b\x47\x64\xcd\x12\xc5\xcc\xbe\x34\x18\x1c\xcd\xf3\x8f\x42\xa6\x87\x9a\x88\x35\x66\xc2\x75\xd3\xfe\xb7\x50\x6a\xbc\x48\x81\xf0\xaa\x38\xef\x44\xc9\x7c\x40\x22\xb3\xd0\x9c\x66\x3c\xf5\xed\x6e\xd9\x16\x2d\xd7\x3f\x2f\x4a\xd0\x8f\x4b\x09\x1a\xe1\xfe\x3e\xb8\x06\xc4\xc4\x7c\x93\x99\xa6\x69\xd3\xb5\x6d\xeb\xe6\x68\x2f\x40\x19\x49\x0a\x59\x94\x19\x35\x6b\xcc\x76\x2b\x6c\xd3\x0e\xf7\x75\x30\x13\xda\x8d\x06\x3b\xb0\xa3\x72\xf9\x6a\x63\x28\x39\xcb\x32\xc2\x05\x9e\x04\x18\xc0\x5b\xf3\x14\x43\x79\x89\x50\x34\x38\xcf\xed\x14\xee\x66\xac\x69\x68\xe4\xda\xea\x3a\xca\x70\x31\x1d\x90\xef\xec\xef\x48\xb3\x9c\x69\x8c\x0b\x92\x97\x99\xe1\x45\xc6\x48\xe0\xb6\x68\x43\xcb\x4a\x46\xa8\xd6\x32\xe1\xd4\xb8\x19\xbb\xfb\x43\x6d\xfc\xb4\x61\x36\x86\xde\x82\x29\x34\x61\x29\x13\x09\x1b\x90\xcf\x70\x5d\x18\xd6\x3a\xb6\xc2\x20\x98\xf7\x61\x0c\x4a\xd2\x12\xaf\x76\x90\x1e\xac\x1e\x63\x98\xe7\xa5\x01\x43\xf1\x63\x59\xf1\xed\x8e\x3b\xcb\x5c\x64\xcc\x07\x52\x15\x44\x6b\x0a\x77\x0f\x72\x52\xa9\xee\xfa\x7e\xe6\xfb\x76\x84\x37\x98\xdb\xb6\x72\xaa\x25\x8a\x5b\xd9\x18\xea\x94\xf6\xb1\x2d\x86\xed\xe8\xec\x4f\x92\xc6\x76\xa0\xaf\xed\x69\x6b\x07\xe3\x52\x57\x7a\xda\xd6\x9a\x54\x28\x36\xe1\x5f\x3a\xe0\xe3\x99\xa8\x54\x14\x9e\x32\x61\xac\x22\xa0\x80\xa0\x2a\x56\x30\x01\x7a\x38\xa3\xc9\x0c\xe8\x82\xa3\xa2\x95\x65\xf8\x21\x6f\x8c\x50\xca\xe8\x7e\xbc\x46\xab\xa4\x98\x97\xb3\xf5\x13\x3f\x5b\x6e\xd7\xf7\x7f\xb0\x84\x4c\x19\xea\x16\xeb\x95\xeb\xc6\x3e\x46\x3d\x9c\x9f\x8b\xff\x0b\x2f\xf0\xfc\x24\xad\xf6\x16\xae\x9c\x0a\x09\x67\x6d\xc2\x0d\x91\x56\x22\xb0\xdf\x1d\x90\xd1\x8a\x9e\x39\x35\xc9\xcc\xb5\x38\x3c\xd4\x04\x8d\xb6\xcd\x81\xc6\x68\x22\x4c\xcb\x8c\xa5\xc4\x3b\x6c\xe0\xa0\x1d\x51\xaa\xe6\xaa\x70\x42\xb5\xe6\x53\xd1\x2f\x64\xda\xb7\xa3\x9d\xac\x43\x88\x16\x87\x2a\x76\x35\xdc\x7e\xb0\xb6\xe2\x55\x30\x4e\xb4\xdb\xa6\x8f\xc1\xfe\x16\xc9\x16\x89\xcc\x8b\xd2\xb0\xc8\x38\x17\xec\x3a\xe3\x05\x7a\x16\x45\x32\x64\x25\x11\xdd\x0f\xa6\x39\x15\x74\xca\xfa\xee\xe3\xfd\xf0\xf1\x7e\xf8\xd6\x7d\xc0\xdc\x86\x6a\xa1\x49\x71\xd3\x39\xac\x03\xef\x1d\x9a\x2c\xf1\xe5\xd8\x99\x8e\x72\xfa\x85\xe7\x65\x4e\x68\x2e\x4b\x01\x32\xd9\x32\x38\xe1\xf2\x9a\xa5\xfb\x01\xd8\x0a\x40\xe9\xb5\x90\x6a\x09\x2d\xd2\x19\x31\xc9\xf3\xb5\x6c\xb5\xb2\x68\x75\xb3\x64\x75\xb0\x60\xed\x6c\xb9\xf2\x46\xea\xf6\xf8\xf8\xd1\xdb\xcd\x1b\x18\xc9\xc5\x56\x8c\xf4\x07\x1c\x5c\x3b\xc2\x38\x5c\x13\x99\x73\x63\x82\x4b\x56\xc0\xb0\x1e\xe1\xa6\x66\xfd\x74\x67\x81\x4f\x90\xc6\x72\x4d\xd8\x17\xab\x4d\x71\xb0\xa2\xfb\x5b\x8b\x1e\x72\xd9\x3b\xae\xc1\x80\x46\x05\xe1\x79\x91\xb1\xdc\xfb\x90\xf6\xbd\x6e\xe6\x9c\x0c\x5e\xce\xc7\xcb\xf9\x58\xd5\x49\x77\x91\x45\x62\x31\x04\x0d\x05\x63\x96\x55\xe2\x88\xc5\xec\x42\xa6\xda\xc9\x0b\x1e\x87\xec\x59\xb8\xfc\xc2\x35\x78\xe2\x7e\x64\x60\x19\x18\x31\xa3\xc9\xdd\x4c\x6a\x86\x3d\xa8\x62\x6e\x9c\x88\x35\x7a\x4b\x08\xdc\x23\x80\xd3\xe8\x64\x52\x6f\x91\xb2\x22\x93\x8b\x1c\x24\xdb\xa1\x89\xe5\x99\x20\xba\xb0\xbc\xc8\xa8\x61\x41\xb0\xd9\x6c\x6d\xb8\x37\xe7\x83\xaf\x5f\x7e\xb1\x12\x40\x14\x07\xd1\x02\xb6\xcd\x8e\x75\xd3\x54\x03\xd2\x8e\xc8\xe4\xe8\xb3\x7c\x03\x12\x7e\xf5\x06\xa0\x79\x76\x75\xb1\xde\x41\x92\xb4\x32\xaf\x90\xed\x26\x96\xa5\x65\x9c\x6d\x98\x6a\x43\x7a\x45\x9f\x5f\xef\xc1\x8a\x1e\xe8\x3d\x34\x5e\xf5\x9c\xfb\x5c\x88\x0e\xc0\xc6\x8a\x65\x18\xfa\xe0\x0c\xcd\xb6\x91\xf3\x5c\xdf\x8f\x46\xd6\xd6\xee\xde\xc6\xe6\xde\x0f\x93\xdf\x93\x12\xd8\xca\x28\x5f\xdb\x0c\x50\xb2\xe3\xa3\x0a\x2e\x47\x16\x92\x68\x9f\x77\x1b\x41\x8b\x22\x83\xfb\x3a\xd9\xd6\x37\xab\xa5\x3a\x86\xcb\xef\x38\xe9\xb0\xe5\xb1\xc3\xad\x9d\xf9\xa1\x46\x04\xb0\xa7\x63\xc6\x0b\xe7\xcd\x88\xd6\x3a\x1f\xbf\xf0\x19\xec\xa8\x55\x4c\x89\x3d\x09\x43\xd1\x23\x57\xd2\xd8\xff\x5d\xa2\x4d\xd4\xe2\xcd\x85\x64\xfa\x4a\x1a\x78\xb3\xd7\x65\xe3\x54\x3a\x2e\x1a\x3b\xc1\x01\x11\x78\x26\xc1\x20\x1d\x05\x34\xa0\xaf\x28\x90\x42\x0f\x20\xae\xc9\x50\x10\xa9\xfc\xea\x82\x55\x57\xbb\x21\xbc\x66\x28\xa4\xe8\xa3\x1b\xe1\xaa\x31\x2e\x83\x0f\x65\x0c\x93\x0d\xc3\xb9\xa1\x6e\x2c\x05\xc6\x5f\x30\x84\x25\xa3\x09\x4b\x49\x5a\xc2\xa4\x21\x1c\x83\x1a\x36\xe5\x09\xc9\x99\x9a\x32\xcb\xb4\x93\x59\x5b\x50\x6f\xa3\x4b\xf8\xb4\xa0\x4e\xf1\xa0\x5b\xf6\x0f\x48\xf0\x3b\xe0\x12\xdd\xc8\x36\xf6\x41\xf2\x96\xd3\xc2\x6e\xdd\x3f\x2c\x15\x03\xe8\xfd\x8b\x14\x94\x2b\x3d\x20\x67\xde\xf5\x36\xfe\xcd\xd9\xc0\xe2\x61\xec\x08\x56\xea\xfb\xa1\xe4\x73\x9a\x59\xba\x89\x02\x1e\x43\xf1\xce\x8e\xde\x64\x16\x3d\xc7\x4b\xed\xf9\x46\x7f\x17\xae\xc9\xc1\x2d\x5b\x1c\xf4\x96\xb6\xfb\x60\x28\x0e\x90\xbe\x2e\x6d\x70\x20\xc6\xe0\x51\x72\x00\xbf\x1d\xdc\x8f\xbf\x3c\x80\xf0\xb7\x75\x2f\x8d\xcc\x98\x8a\x43\x3f\xb7\xec\xe1\x4d\xd5\x1e\x96\x56\x5d\xef\x46\x23\x3d\xce\x2d\xc5\x8d\x17\x5b\xec\xd9\xaa\xe6\x05\xa8\x65\x0c\x4d\x66\xe8\xc5\xed\xe6\x05\x71\x34\x0b\x62\xf7\xcc\x20\x5d\x07\xc4\x70\x1c\xd2\x28\xb8\xf4\xf9\x6d\xc0\xb6\x1e\x03\xf9\xe9\x77\x91\x7f\x3b\xb4\xb7\x7f\x04\x0c\xf9\xad\xff\xd7\xef\xee\x19\xb7\xd0\x8e\xb1\xe1\x94\x3a\x08\x18\x97\xd0\x81\x70\x91\xc2\x05\x93\x5b\x2a\x40\x00\xc7\xb2\xf0\x81\x65\x0d\xc8\xa5\x25\x54\x24\x67\x54\x68\x6f\xe6\x82\x9b\xa8\xaa\xb1\x76\x57\x66\x91\x5e\xe5\x4c\x0a\xd5\xc9\x60\xe4\x4a\x8e\x9c\xed\xab\x47\xae\xc1\x96\x5a\xbd\x81\x93\x74\x25\x2f\xbf\xb0\xa4\x34\x6b\xef\xb2\x62\xb8\x6d\xe5\x22\x5b\x19\x7d\x0d\x20\xdf\x56\x4c\x1e\x57\x56\x63\xf2\x15\x06\xc7\x6c\x7e\x23\x64\x6e\xd9\xa2\x62\x36\x4e\x84\x00\x92\xdf\xab\xb0\xc4\xb3\x02\xe4\x1d\xff\xed\x4d\x59\xf9\x98\x0b\xfc\x18\x0e\xed\xb7\x02\x46\xf7\x00\xb5\x92\x5d\x96\xe1\x67\xf6\x01\xae\x76\x72\x46\x0d\x66\x1f\x3a\xc8\x18\x81\x4a\xae\x96\x2e\x22\x91\xe2\xf2\x87\x92\x66\xf5\x20\x04\xf7\xca\x35\x5a\xa2\xea\x77\x3c\x4b\x13\xaa\x9c\x97\x17\x86\x69\x6a\x89\xbb\x47\x81\x10\x24\x54\x84\xd3\x5e\xed\x91\xc6\xab\xca\x82\x2a\xc3\x93\x32\xa3\xca\x47\x8e\xb7\x0a\x14\xd8\x0a\xd1\x0a\x69\x46\x2c\x91\x22\xed\xa2\x00\xdc\x34\xfb\x36\xef\x5a\x0b\xa6\xb8\x44\xef\x62\x9e\xb3\x26\x92\x1e\xd5\x6d\xda\x72\xe2\x4f\x75\x38\x62\x35\xcb\x07\xc4\x66\x7a\x86\xc7\xa7\x42\x2a\x96\x1e\x47\xe4\x31\x9c\x8a\x01\x79\xb3\xf0\x66\x16\x30\xb9\xb8\xe8\x0a\xcd\x8c\x0f\x84\xf1\x28\xeb\x80\x5d\x1d\xa8\x89\x54\x10\x9c\x72\x94\x4a\x8c\xc8\x98\xf3\xc4\x1c\x0f\xc8\xff\x65\x4a\xc2\xc6\x0b\x36\xa5\x86\xcf\x03\x37\x0d\x8a\xab\x62\xd4\xdd\xe0\xbf\x22\x47\xd0\x8d\xf0\x3c\x67\x29\xa7\x86\x65\x8b\x63\xd4\x63\x19\xd1\x0b\x6d\x58\xde\x66\xeb\xda\x18\x0d\xd0\xd7\x0e\xda\xfe\xea\xeb\x0d\x2d\xbb\xc6\x50\x7d\xf6\x51\x29\x15\x64\xd0\x87\xa0\xb1\x85\x81\x07\xc9\x0d\xe2\x66\xec\x83\xe0\x02\x9b\xbd\x64\x19\x6f\xf0\xf7\x16\x0f\x28\x51\x0c\x32\x10\x38\xcc\xbd\x27\x8e\xa3\x37\xe5\x7b\x59\x8a\xf5\x26\xc1\xda\xc2\xdf\x39\x25\xfc\x73\xd4\x71\x6d\x94\xe2\xa3\x88\x09\xd1\x4c\x22\x13\x25\x25\x60\x97\x04\x76\x6e\xc9\x03\xb6\xaa\x3c\x51\xb6\x4e\x72\xaf\x11\x89\x30\x97\x2d\x5e\xef\x7b\x89\x5b\x0c\x1f\xea\x80\xcb\xe0\x20\xee\x00\xd3\x88\xdb\x33\x8e\x1c\x00\x7e\x22\x04\x2b\x04\x85\x6f\xb1\xd4\x7b\xb1\x59\x6a\xe0\xba\x92\xc3\xd3\xc3\xbd\x10\x5f\x5c\x8e\x92\x05\x9d\xc2\x79\xea\xb0\xaa\x66\x57\x92\x32\xc3\x54\x0e\x01\xd7\x33\x79\x87\xbf\x23\xdb\x2a\x5c\x2b\x96\x56\xb1\xed\x33\xa9\x81\x2b\xd5\x83\x18\xe1\xfc\xc2\xc5\xe8\x1d\x5d\x10\xaa\x64\x29\x52\x27\x35\x05\x02\xfa\xbe\xf1\xe1\x2b\x29\x80\x52\x94\xda\xc2\xea\xa6\x46\xa5\xc7\xcc\x50\x7b\x6c\x5e\x0f\x5e\xbf\xda\x0b\xc0\x3a\xc6\xad\xc2\x6c\x1a\x96\x42\x7f\x57\xee\xcf\xcc\x5e\xe6\xa5\x18\x4d\x3f\x88\xac\x8b\x2c\xf7\x1e\xd1\x0b\xba\xf6\x41\x09\xe3\x13\xb0\xdd\xf6\xf0\xd5\x9d\xe2\x86\x45\xe4\xf1\x68\x42\x33\xcd\xac\xea\x5e\x8a\x20\xc2\x1e\xd7\x45\x10\x68\xd2\x66\x41\xdb\xfd\x41\x74\x39\xbe\xe7\x39\x73\x07\x0a\x50\xae\x3a\x66\x01\xe1\x0e\xf5\x86\x23\x57\x0f\xee\x24\x47\xd8\xd2\x4a\x6c\x52\x9a\xe3\xfd\x38\x89\xe0\x02\xad\x66\xdd\x45\x25\xf1\x71\xc3\xc5\x1e\x57\xfb\x86\xcd\xe8\x9c\x69\xa2\x79\xce\x33\xaa\x32\x88\x15\x1c\xe1\xfc\xc8\xb8\x34\xab\x23\xd0\xbb\x45\x37\xc7\x33\x89\x86\xdb\x0a\x6a\x3f\x0f\x0b\x27\xa0\x11\x7e\x5e\xf6\x3b\x79\x69\x4a\x9a\x65\x0b\xc2\xbe\x24\x59\xa9\xf9\xfc\xbe\xa7\xc9\x45\x3f\xec\xc0\xaa\x9b\x5c\xba\x90\xe9\xa8\x60\xc9\x63\xf2\xe8\xba\x86\x61\x49\x55\xea\x37\x1d\x78\x32\x2a\xfb\xa0\xb9\x2f\xc0\xf3\x29\x49\x98\xd6\xde\xa7\x72\x11\xfb\x79\x86\x35\xfc\x58\x12\x0a\xd0\x3b\x7d\x99\x51\x6d\x78\xf2\x26\x93\xc9\xed\xc8\x48\xd5\x29\x66\xff\xec\xbb\xd1\x52\xff\x46\x1a\x86\xb3\xef\x46\xe4\x82\xeb\xdb\x38\xb1\x0b\x5e\x9a\xc6\xe6\x12\x4a\x6e\xcb\x31\xcb\x98\x39\x3c\xd4\xc8\xe5\x72\x9a\xcc\xb8\x60\x9e\xc1\x89\x10\x92\xe2\x14\x3e\x0b\xe5\xae\x77\xa6\x2e\xf0\xe9\xc4\xe1\xeb\xcf\xe8\x9d\x66\x38\xfd\xb1\x9d\xbe\xfd\x99\xb5\x89\x48\xdf\xeb\x3d\x05\x4e\x66\x78\xb1\xa7\x3b\x88\x89\xbe\xb1\x73\xec\x66\xdc\x3e\x7c\xcb\x33\x86\x3a\x0e\x2c\xd1\x7b\xa5\xb9\x73\x00\x3b\xb6\x90\x25\xb9\xa3\xa8\x15\x03\x0d\x1c\x90\x1b\x5e\x9c\x92\x4b\xa1\x4b\xc5\x2a\x7b\xc6\xa4\x31\x14\xd7\x55\x64\x99\x57\xa7\x60\x87\x51\xe5\xb0\x94\xce\x69\x57\xe4\xf2\x0b\xcd\x8b\x8c\xe9\x53\x72\xc0\xbe\x98\xaf\x0f\x7a\xe4\xe0\xcb\x44\xdb\xff\x09\x33\xd1\x07\x03\x32\xcc\xc3\x3d\x3b\xa4\xfe\x51\xcc\xbb\x3e\x61\x07\xcb\x8c\x23\x3e\xfb\x20\x08\xe2\xdc\xe8\xac\xb4\x96\x4a\x72\x87\x19\x28\x2c\x89\x67\x4a\x49\x15\x3c\xcf\x23\x30\x00\x77\x49\x64\x5e\x28\x99\xf3\xc8\xb0\x07\x08\xbe\x57\xff\x3a\x30\x37\x6c\x17\x49\x97\xf7\x1f\x73\xba\xb9\xce\xa4\xce\x1c\xd7\xed\xfe\x70\xe2\x3d\x26\x50\x55\x74\xba\x3b\xe8\x9f\xae\x91\xdd\x6f\x37\x8a\xa5\x56\xf1\x0e\xbf\x0d\x51\x73\xe4\x24\x65\xf3\x13\x9d\xd2\xd7\x3d\xf8\x8c\x76\xde\x7e\xa6\x36\x27\xaa\xc9\xc1\xeb\x83\x01\x19\x79\x6e\xdb\x8b\xe7\x58\xb5\x9b\x48\x15\x06\x04\x63\xfa\xab\x03\x72\x24\x15\x8c\x9c\x50\x41\x32\x46\xe7\xce\x80\x8c\x67\x6a\x81\x3a\xed\x71\xeb\xa8\xc7\xb6\x01\x60\x91\x96\xff\x9f\xbf\xdc\xd2\xba\x9d\x24\xba\xbc\x6f\xde\x33\xf2\xc0\x8a\xa0\x07\x20\x4c\x4a\x4b\x63\x2d\xd5\xb4\x6c\x15\xd2\x6a\xb9\xb1\xab\x05\x73\xb1\xa4\x29\xe3\x00\x1b\x37\xf5\x00\xe4\xd4\x83\x27\xa0\xba\xa4\x63\x7c\xbd\x27\xa9\x5d\xa1\xf9\x49\xf0\x1f\x4a\x46\x86\x17\x21\xb2\x9e\x29\xcd\xb5\xb1\xa7\x3b\xad\xf1\x30\x8e\x8c\xed\xe8\x2c\xa7\x7f\x97\x82\x5c\xbe\x19\xb9\x8f\x1e\x3f\x29\x78\xb6\x12\x09\xfa\xf7\x52\x31\xcb\x8e\xbb\x38\x0c\xf8\x3e\x4d\xce\x6e\xdf\x93\x0b\x6a\x28\x32\x78\xe7\x72\x25\x2a\x0a\x6f\xb1\x70\xcc\x45\xea\x7e\x8a\x38\xf7\x63\x33\x59\xbb\x7b\x57\x9b\xe4\xa5\xb8\xe1\xa7\x8f\xc3\x3d\x31\xe3\x04\x68\xfc\xf4\xbd\x4c\x3b\x73\xe4\x3f\x58\x00\x9e\x63\x7f\x92\xdb\x01\x88\xd5\xd9\x7b\x70\x9c\x89\x3d\xcf\xee\x9f\xdf\x59\x8d\xb3\x35\xf1\x6a\xc5\x46\x3c\xb4\x3a\xce\xf9\x26\xd2\xd3\x81\x76\x58\xd4\x80\x73\xe3\x18\xca\x38\x93\x63\xe2\xf0\x7d\xdf\xf3\xfd\xf4\x71\xb8\xc3\x74\x3f\x7d\x1c\x3e\xee\x54\x77\x12\xcf\x9a\xd2\x59\xc5\x83\xab\x70\x8c\xa6\xd8\xd5\x5e\xe6\x1a\xec\x4b\xda\xda\x27\x9c\x56\x65\x95\xdc\x02\xa5\xc3\xcb\x2f\x05\x3a\x9f\x39\x23\xff\x68\x46\x21\x8e\x39\x44\xd7\xc1\xa6\xda\x5d\xd6\x96\xb2\xfb\xed\xb5\x1a\x1d\xd0\x27\x72\xc1\xf0\xca\x32\x3d\xf5\x8e\x00\xa1\xc7\xea\x0e\xef\xc1\xed\x32\x3d\x45\xba\x4a\xd0\x0b\x33\x8d\xb0\xe9\x08\x4d\x44\x22\xfc\x44\xe7\x94\x67\x74\xcc\x33\x6e\x16\x96\x43\x1f\x0f\x6a\xae\xa5\x1a\xa6\xbc\xd7\xc3\xbc\xa3\x68\xb1\x64\xa0\x22\x47\x76\xa4\x13\x30\x70\x1d\x0f\x2a\xa9\x62\xc6\x94\x0b\x42\x44\xd1\xa3\x26\x72\x68\x66\x00\xdb\x1a\x12\x47\x5b\x54\xd9\xce\xee\x01\xf0\xf6\x7c\x74\x65\x68\xb6\xcf\x4a\x86\x06\x3f\x8c\x5c\x4e\xb8\xe7\xcc\xd3\x30\x5e\xaa\x15\x57\x03\xb4\xda\xda\xb2\x3d\x5f\xfb\x69\xe3\x14\x09\xc1\x68\x3b\x30\x41\x3b\x55\xe1\x98\xa0\x8f\xaf\xaf\xb9\x51\x22\x96\x8d\x1c\x29\x71\xe9\x92\x90\x6f\x5a\xdc\xfa\xb6\x45\xaa\x80\x2e\x09\x16\xfc\xce\x77\x0d\xb9\x9a\x81\x5b\xc5\x76\xe4\x6a\x3d\x9b\x84\x15\xb3\x49\x97\x7b\xea\x73\x56\xcc\xde\x8e\xea\xe6\x39\xfb\x8e\xbc\x1d\xad\x38\x97\x00\x64\x58\xad\x46\xa3\xdd\xa1\x26\x19\x9f\x30\xc3\xb7\x2c\xe1\x01\x4e\x66\x2e\x05\x37\x52\xad\x8f\x4b\x26\x9d\x4e\x9b\x1f\xae\x2b\x3f\xac\x32\x79\xbc\x77\x23\xa0\x03\x5c\x22\xb3\x8c\x25\x3e\x8f\x35\x80\xd4\x7f\x62\x95\xf2\xc2\x9c\xce\x1e\xb2\xfc\xa3\xa2\x72\x82\x1b\x7a\xf2\xf1\xf2\xec\xe2\xfd\xe5\x20\x4f\x7f\x36\x93\x77\x7d\x23\xfb\xa5\x66\x7d\xde\x22\x55\xc8\xd3\xb9\x11\xe2\x53\xb4\xca\x5c\x55\x07\xe9\x07\x1f\xc0\x48\x3e\x69\x74\x1b\x00\x53\x8e\xbf\x14\x92\xd2\xf4\x88\xa2\x2e\x48\x91\x3a\x4b\x50\x99\x65\x08\x65\xa3\x18\xeb\xc5\x2a\xf5\xc6\xd8\x8c\xce\x0b\xda\xd5\x88\x50\x2d\xea\x61\x09\xf4\xe3\x23\x57\x17\x5a\xbf\x5d\x88\xd8\x04\xb9\x51\x18\xc3\xfb\x5f\xc0\x55\x93\x91\xe0\x9f\x05\xfe\xb6\x13\xa9\x2c\xd6\xa8\x3a\x06\x30\x93\xc0\x62\x4f\x4a\xcd\xd4\xc0\x71\x8c\x47\x07\x54\x87\x64\x3d\x3b\xe4\x48\x6b\x82\xe9\x23\x9b\xa0\x43\xb2\xcf\x99\xeb\xa4\x28\x5a\x9a\x19\x13\xc6\xa7\x1c\x77\xc0\x58\x09\x37\xe7\xe1\xfc\xe8\x80\x6a\x99\x1e\xa8\x5b\x32\x9f\x97\x04\x38\x5d\xd0\xd0\x1e\x94\x7b\xd1\xed\x10\x1d\xa5\x68\x2a\xc1\x05\x02\x73\xba\xd5\x10\x8c\xa6\x39\x17\xcf\xf0\x20\x26\x5c\xa4\xdb\xd6\xdf\x48\x5c\x07\x3d\xea\x72\x14\x8e\xe2\xad\xe7\xe1\x26\x8e\x7a\xbd\x06\x43\xc8\xdd\x9d\x5c\xfd\x46\xae\xd5\xa1\xcb\x17\xfa\x87\xac\x8f\x5f\xe9\x17\x69\x05\x95\x97\xeb\xb5\xfd\x1b\x70\x1e\xe1\xd2\x6c\x4f\xfb\x4b\xfe\xfd\x04\x9a\x7b\x43\xaa\x8b\x0c\x73\x2f\xde\x0c\x55\x53\xb4\x0f\xda\xc2\x8c\x60\x58\x7e\xc5\xe9\xae\x16\x04\x05\x55\x34\x67\x86\x29\x74\x1d\x73\xce\x68\xc2\x79\xf5\x7f\x28\x98\x18\x19\x9a\xdc\xee\x3b\x85\xe8\x0b\x3f\x7d\x38\x7e\xba\xeb\x6d\x99\x77\x92\x49\x03\x26\xb8\x84\x42\x8b\xf8\x66\x96\x0b\xc7\x6c\x9e\x09\x5d\x09\x79\xbc\xba\x58\x22\x42\x1e\xa7\x3a\x13\xad\xf2\x7a\xa1\xf1\x01\x5c\xc4\x42\x62\x3a\x70\x7d\x47\x28\xec\x87\xe9\xb5\x3f\x04\x4e\x8e\xd9\xe5\xde\xa9\xa2\x07\xb9\x4c\x19\x19\x73\x53\x9d\x74\xcd\x0c\x29\x98\xca\xb9\x0b\x80\x96\x02\x6b\xf0\xb1\x14\xb9\x97\xe5\x54\xee\xd3\x11\x67\x13\x44\x26\xc6\x17\xb9\x22\x63\x66\xee\x18\x13\xe4\xd5\xab\x57\xaf\x40\xde\x78\xf5\xeb\x5f\xff\x9a\x40\xc6\x85\x94\x25\x3c\x5f\x6e\x08\xad\xfe\xeb\xf5\xeb\x01\xf9\xe3\xd9\xfb\x77\xe0\x7f\x55\x18\x4d\xc6\xd2\xcc\xdc\xc8\xb6\x41\xad\xb3\xee\x91\xff\x19\x7d\xb8\xf2\x62\x82\x6e\xfc\x0a\x2a\x45\x58\x5e\xdd\x99\xee\xd5\xaf\xbe\xfe\x7a\x40\x2e\xb8\x82\xc8\x5b\x0e\xb1\x02\xc1\x5d\xb0\xf0\x2e\x74\x42\x9a\xe5\x58\x77\xc7\x26\x9c\x3b\x6d\xce\xa7\x33\x83\xd5\x92\x00\x53\x32\x9e\x18\xcc\xbe\x87\x87\x1d\x73\x21\x69\x17\x4a\xe2\x02\xa3\x9c\xe3\x08\x4c\xae\x47\x32\x7e\xcb\xc8\x44\x7f\xa3\x64\x59\x54\x01\x81\x8a\x69\x2b\xa3\xba\x5a\x4c\x38\x58\xb5\x57\x9a\x99\x27\xf5\x64\x68\x69\xa9\xa9\x21\xdd\xb0\x26\x80\xf4\x42\xfe\xb1\x3e\x62\x42\x41\x79\x70\xae\x83\xeb\xe6\x5a\xf6\xfb\xa0\x45\xa6\xd1\x39\xf5\xf1\x1d\x85\x92\xdf\xe3\x26\x71\xe1\x23\x85\x9c\xcc\xab\x9d\xcc\xe5\x02\x33\xc1\x66\xcb\xeb\x91\xeb\x96\xef\xb9\xa8\xf8\x28\xc6\x68\x38\x89\x83\xd1\x20\x74\x9b\x6b\xfb\x89\x5a\x72\xc8\x15\x5f\x8e\xcb\x13\x9a\x99\xc6\x1d\x2d\xc5\x52\x6f\x57\x6b\xc4\x51\x1a\x57\x81\xc6\x85\x79\x55\x63\xa0\xbb\xaa\x0b\x92\x89\xea\x1a\xd5\x12\xb6\xd5\x9c\x64\x34\x33\xa5\x03\x0d\xf8\x2a\xd9\x6f\x33\xad\x5d\xac\x4d\x4e\xd5\xad\x15\xfb\xdd\xf9\x1f\x80\x67\xb0\x0e\x71\x3e\x18\x74\x35\x67\xa1\x48\x5d\xec\x59\x6f\x3f\x72\x38\x18\x1c\xe2\x01\x91\x0a\xf3\x5d\x22\xb6\xdb\xf7\x4f\x14\x53\x5c\xf7\xdc\xa6\x45\x54\x82\xce\x95\xf6\xa0\x35\x8f\x60\xea\x20\xd5\x26\xcb\x6d\x27\xf1\xa5\x5b\xbe\xe0\xb6\x19\x83\xb1\x65\xd1\xa6\x6c\x41\x57\x09\xaa\x43\x82\xe1\xf5\x75\x53\xdc\x11\x68\x97\x33\xb8\x73\x0e\x5c\x82\x5e\x11\xbb\xcc\xb1\x2b\x93\x73\x41\x6c\xb5\x8a\x59\xcf\x9f\xab\x0d\x27\x18\xfe\x51\xa7\x55\x8e\x16\x44\x12\x42\x55\x9d\xaa\x8a\x05\x79\xd6\xcc\x2b\x46\x97\x6e\xd9\xd8\xbb\x30\x32\x7c\xda\x5d\x12\xe0\xb3\x74\x0e\x02\xcd\x2c\x6a\xd5\x2e\x32\x34\x00\x80\xdc\xe8\x0f\xcb\x80\xbc\x77\x34\x15\x91\x8b\x8e\xb5\xcc\x4a\x83\x5d\xab\x1f\x63\x82\x0b\x83\xfa\x94\x03\x40\x65\x43\xb3\x88\xfc\x9a\xaa\xde\x57\x3b\x4a\x8c\x4f\x87\xc3\xf8\x92\xfa\xf2\xc9\xd2\xca\x56\x19\xbb\xf5\x83\xa5\x98\x4d\x34\xef\xa2\x2a\x8d\x86\xe4\xa8\x2a\x95\xe1\xaf\xb9\x87\xc2\x30\x35\xa1\x09\x3b\x8e\x55\xa8\x50\x92\x24\x78\xd6\xf8\xd8\x80\x19\x15\x69\x86\xa2\x75\xc2\x14\xa0\x3c\xfb\xe2\x8a\xe5\xda\x4f\xa4\x8a\x43\x11\xd8\xa3\x37\xcc\xca\x83\x8c\x9a\x52\xb1\x56\x11\x46\xfb\x75\x2b\x84\x69\xec\x4b\x69\x83\xc1\xba\xba\x54\x40\x27\x2f\xa1\x8a\xe8\x58\x55\x60\x42\xa8\x22\x48\x75\xac\x96\x0e\x2c\x2a\x01\x3d\x06\x52\xb1\x90\xa5\x72\x76\x6f\x9f\x5b\x34\x91\xca\x2a\x42\x38\x30\xd5\x44\xb1\xa9\x95\x56\x15\x88\xb5\xd8\x22\x2b\xed\x8b\xbd\x3a\x7f\xed\xd9\x49\x6e\x93\x8b\xdb\xc4\x89\xcf\x72\xce\x53\xcf\x22\xe1\x6e\xa9\x2a\xf1\x57\x50\x1d\xc5\x9d\x44\xe9\xd8\x23\x08\xa3\x30\x0e\x8c\x34\x44\x74\xd6\xfc\xa7\x63\xeb\xae\x84\x44\x0f\x2d\x6a\x29\x74\x21\xc2\x32\x65\xd7\xe5\x38\xe3\x7a\x36\xda\xd1\x14\x78\xb5\x62\x08\x74\x18\x58\xba\xa8\x5b\x6b\x1e\xd4\x4c\x68\x0e\x2c\xcf\x92\x71\xcb\x6c\xa1\x76\xb0\x04\x20\xfa\xde\x31\x66\x4a\x08\x8c\xc8\x98\x0b\xe7\xb7\x3f\x45\xf3\x70\x11\x5a\x98\xc0\x23\x65\x9f\x44\x51\x7b\x9f\xd0\x2c\xd3\xcd\xe8\x55\x4f\x68\x51\xe6\xf0\x51\x5b\xb8\xa7\xdc\x6e\x77\x28\x13\xd2\x48\x05\xb9\x76\x61\x9a\xe4\x12\x23\x5c\x04\x91\xc2\x37\x82\x3c\x24\xbe\x43\x14\xd5\x07\xb1\xbb\x80\x32\x7b\xae\xa3\xf8\x62\x03\x7d\x38\x1b\xe8\x8e\x37\x0d\x55\x25\x25\x1a\x45\x04\xd7\x4b\x3d\x7b\x52\xea\x49\xee\x96\x2b\x89\xbd\xde\x0a\xe0\x37\xcf\x0c\x96\x27\xef\x9c\xf3\xec\x73\xa3\x3b\xb0\x69\xab\x77\xc0\xe1\xed\x3b\xcd\x22\x89\x30\xd3\x29\x04\xe1\x08\x2c\x1f\xf9\x8a\xe7\x00\xbb\xc1\x97\x87\x9a\xa4\x32\x29\x43\x6e\x54\x00\x5a\x75\x01\xd6\x26\x83\x20\xe9\x7a\x9c\xba\xa7\xb5\x8a\x3f\xb2\x15\xab\x52\x79\x27\xee\xa8\x4a\xcf\xae\xb7\xf8\xa5\xd7\xd9\x79\xd5\x2b\x16\x94\xfc\x60\x50\x09\x8f\x8e\x65\x69\xaa\xf4\x99\x3f\x6d\xd3\xb3\x91\x96\x22\xb4\xb4\x34\x93\x17\xe3\xf5\x8b\xf1\xba\xf9\x3c\xb8\xf1\xda\xf6\xa9\xe7\x82\xad\x1d\x57\x9f\x62\x80\x67\x6d\x5d\x69\x1f\xd2\x0a\x1a\x11\x18\xa4\xee\x4d\x3f\xf8\x86\xdc\x86\x47\xa4\xda\xdb\x48\xd6\xf3\x14\x08\x58\xf5\xd3\x5b\x4c\x1f\xc8\x0e\xda\xbe\x56\x2f\x3e\xeb\x5c\x70\x37\xd5\xee\x05\xa9\x21\x2a\xb6\xdb\x73\x99\x90\x7b\x4e\xef\x12\x69\x55\xc6\x0e\x13\x31\x77\x28\xd5\x89\x4f\x47\xe0\x93\xce\x1b\x40\x3a\x16\xd2\xc5\xa7\xeb\x6e\x90\x1d\x8a\xea\xe2\xf3\xc4\xa5\x75\xf1\xe9\x6c\xe2\x26\xdd\xcb\xec\xae\x58\xee\xc3\x16\xdb\xdd\x71\x69\x8f\x6f\xbd\xef\x55\x25\xde\x9e\x3f\x5b\x7f\xb1\xde\x2f\x3d\x8f\x68\xbd\x8f\x08\xb7\x27\x06\x0e\x00\xb1\x45\x3f\x36\xb7\x79\xb3\xfe\x98\x79\xb1\x72\x50\x65\x20\xb3\x28\xe7\x0d\xfa\x52\xd5\xaf\x4d\x0f\x07\x83\xc3\x43\x6f\xe6\x77\xf8\x59\x9a\x49\xff\x37\x84\x89\x44\xa6\xb8\xa9\x76\x7c\xa5\x0d\x30\xfd\x4a\x3b\x8f\xe7\x92\xfb\x6f\xc5\x57\xaf\x30\x76\xb7\x2d\xe9\x70\x82\xbb\x97\xce\x5e\x05\xe9\xc7\x28\xa0\x1d\x97\xc9\xae\x57\xc5\xc6\x16\xf7\x29\x85\x1d\x03\xef\xc1\xf9\x6b\xeb\xe2\xd8\xf8\xec\xc2\x5e\x77\x28\x94\x8d\xcf\x23\x97\xcb\xc6\x67\x27\x8e\xda\xa9\x74\xf6\x8a\xc5\x3d\x5e\x01\x6d\x7c\x9e\x69\x31\x95\xfa\xd3\xa9\x98\x36\x3e\xbb\x95\xd4\xae\xf7\xed\xb8\xf5\x7b\x29\xaf\x8d\x4f\xb7\x22\xdb\xf8\xec\xbb\xd4\x36\x3e\x2d\x21\x01\x36\xf0\x0b\xde\x29\x78\xe0\xd2\xf5\xa9\x7b\x3e\x1a\x96\x17\x52\x51\xb5\x20\xa9\xb3\x35\x2c\x56\x04\x60\x46\x11\x98\xf7\xce\x8a\x02\x73\x4f\xb9\xda\x53\xfc\x40\x87\xe0\x4b\x96\xf2\x72\x6d\xc9\xe2\x75\x60\xfb\x0e\xb2\x61\xb9\x4c\x5a\xfe\x72\x13\x87\x0a\xa9\x04\x69\x72\xeb\x6a\xe4\x78\x18\x22\xa7\x8f\x53\xee\x1c\x34\x32\x1f\x83\x31\x0c\x6e\xfa\x5c\x2d\x40\xdf\x18\xc7\xae\x19\xae\xf0\xca\xc3\xdd\xfd\x1f\xb9\x86\xc7\x56\xfe\x78\x0f\x4c\xef\x91\xf6\x84\x74\x0c\x32\xe3\x7f\x67\x50\x60\xab\x73\x0a\x2b\x09\x62\x77\x28\xfc\x95\xc9\x24\xba\x58\xae\xb1\x1f\x80\x7a\xc0\x6c\x6f\x98\xb7\xb0\xb7\x5f\x47\xe1\x01\x2c\x3a\x99\xc6\xbb\x3a\x9e\x40\xee\x46\x10\xd1\x01\x76\x01\xde\x37\x51\x19\xbc\x52\xdb\x2f\x41\x6a\xf5\xa8\x4d\xf5\xa1\x3b\x9f\x42\xd2\x44\x95\xca\xea\x8a\x85\xfd\x65\xe4\x21\x10\x29\x65\x10\x9e\xe0\xa5\x70\x5d\x82\x0c\xe8\xbe\xe2\x64\x21\x39\x81\xfb\xa8\xaa\xee\x57\xc8\x5e\xb8\x84\x55\x82\x67\x75\xb4\xf2\xa9\xdb\xc2\xc2\x4b\xe1\xbc\x08\x96\x70\x64\x35\x8a\x94\x9a\xa9\xfe\xb4\xe4\xe9\x2e\xc8\xf1\x8c\xb9\x5b\x6b\x9e\xd6\x9d\x93\x75\xe4\x5f\xf7\xe0\x5a\xc1\xcb\xa2\x03\xdd\x3f\xb8\x0c\xae\x19\x35\xc2\x1f\xa7\x84\xab\xbb\x69\x50\xef\x09\x10\x8e\x9c\xbf\xef\xb9\x09\x7a\xab\x63\x08\xc9\x22\x71\x61\xb2\xbc\x96\xcf\x11\x87\x45\xcc\x03\xaf\xd4\xbe\xfd\x8f\xd7\x6f\xbd\xb1\x7e\xcc\x26\xb2\x2a\x01\x82\xea\x8e\xf3\xa5\x4d\x59\xc6\xa0\x4e\xba\xaf\xc1\x6e\x1b\xc0\x35\x6f\x2e\xe7\x16\x99\xff\x2c\xc8\x27\x9f\x94\x9e\x4f\x4e\x09\x3d\xae\x85\x2a\xb8\xb2\x2a\x82\xb1\x14\x1d\x6c\xb3\xea\x3b\xaa\x14\xba\x47\xc6\xc7\xde\xd9\x04\x4e\x9c\xb0\x32\x5f\xe6\xc5\x59\x54\x9a\x15\xb3\x00\x80\x80\x5f\x25\x73\xa2\x05\x2d\xf4\x4c\x42\x75\xfd\x84\x16\x34\xe1\x66\x61\xc1\x6d\x14\x4d\x6e\xa1\x0c\x8f\x62\xee\x8b\x3d\x92\x1c\x3b\x7f\xad\x18\x82\x75\xb7\x5f\x33\x53\xb2\x9c\xce\xc0\x93\x15\x5b\x25\x19\xd5\x1e\x00\x2b\xfb\x3b\x6d\x46\x93\x74\x21\x68\xce\x93\x90\x34\x4f\xc9\x39\xd7\x5c\x3a\x6b\x2e\x8e\x6b\xb1\x9e\x5c\x87\xbc\x67\x68\x24\x3e\xcf\x28\xcf\xc9\x91\x66\x8c\x04\xc4\xc0\x5f\x5c\xb5\x76\x34\x5e\x28\x66\xbb\xc7\x16\x64\x19\x92\x77\x0b\x97\x71\xa0\xa2\x74\xe1\x8a\x0a\x19\x25\x1c\xb7\x74\xf5\xa7\x8f\xc3\xd6\xad\x9e\x99\x54\x70\x31\xef\xb3\x56\x32\x91\xca\xe8\x7a\xf2\xec\x7a\xa8\x63\xb5\x03\xf1\xcc\xe5\x76\x83\x1f\x32\x29\xa6\x71\xc8\x7e\x85\xa5\x96\xac\x0a\xa8\x65\x32\xe7\x69\x49\x33\x24\xa8\x6e\x32\xe7\xa3\x21\x76\xe7\xd3\x99\xe9\xdf\x31\x30\xbb\x20\xdf\xa9\x5c\x9b\xfc\x47\xf9\x92\x5b\x0e\xd7\x40\x80\x8d\x33\x1b\xa0\x09\xcb\x4e\xed\x8e\x2e\x20\xbf\x8b\x73\x21\xa9\xdd\x8c\xfa\xdc\x5a\x38\x44\x80\x7b\x04\x74\x98\xde\x59\xa8\x4d\x61\x25\x06\xb0\x4b\x59\x28\x03\xd6\x2e\xcf\xcd\x02\x3e\xca\x75\x17\x5e\xbb\x32\x64\xd4\xee\x11\x48\x71\x7f\x16\x68\x61\x82\xeb\x8e\x71\xe4\x7b\x05\x43\xa0\x1d\x1b\x33\x1c\x81\x63\xbd\x3b\x86\xdf\x30\xc1\x14\x4f\x1a\xa8\x13\xba\x4e\xa9\x81\xc3\xc7\x84\xed\x96\x0e\x36\xab\x46\x0f\x20\xe3\xcd\x2b\x54\xba\x71\xd5\x08\x3b\x4a\x1f\x07\xdf\x45\x56\xb8\xe8\xde\xc4\x9e\x52\x2a\xd2\x3e\xcd\x2c\x7e\x5e\x7f\x3e\x77\x7e\xd1\x78\xee\x6a\x7e\x01\xbe\xb0\x10\x17\x21\x13\xb5\x95\x52\x56\x1e\x37\x08\x80\x1f\xb3\x14\xc8\x54\x5c\x83\xf1\xce\x2a\xdc\x0e\x45\xae\x3f\x9f\xf7\x08\x1f\xb0\x81\xff\x2b\x34\xf5\x74\xd2\xc8\x29\x7a\x15\x06\x4f\x51\xc0\x6e\x98\x4a\x6c\xdb\x8a\xfb\xfe\xed\xb7\x76\x92\xf6\xd7\xdf\xf5\x7f\x1b\xe5\xf6\xfc\xdd\xdf\xec\x7e\x2b\xdb\xa0\xfe\x36\x76\x4d\x0b\x89\xec\xff\x76\xed\x12\x3d\xbb\x34\xd0\x7f\x73\xf5\xad\x98\x30\x56\x30\xbd\x96\x70\xe9\xcf\x53\xc4\x79\xf8\xb6\x62\xdf\x7b\x3b\x25\x80\x29\xd8\x88\x12\x6a\x98\x00\xd6\xe0\x63\x38\x84\x34\xd8\xdd\x95\x72\xb5\xf3\x3f\x02\x0b\x03\x86\x9b\xf5\x88\x91\x12\x0e\x3d\x12\x96\x33\x41\x98\x2f\x7f\x89\x6b\x05\x70\x50\xe7\xf7\xe6\xb9\x9d\x1d\xd6\x42\x38\x44\xe4\xda\x79\xc0\xdc\x7e\x21\xa4\xf9\x45\xd8\xfe\x46\x61\x6e\x3a\x97\xdc\xe7\xf4\xb6\xe7\x51\x60\x91\xc4\x90\x65\x7a\xbc\x20\x39\xd7\x86\xde\xb2\x01\x19\x59\x6e\x16\x5f\xae\x21\xf4\x04\x81\x5c\x90\x2c\x25\xa5\x30\x3c\x83\x5f\xab\x71\xec\x94\x63\x2e\x37\x9c\x10\x5d\x42\xc5\xf0\x42\xb1\xbe\xe7\x9b\xae\xd5\x12\xc5\xa9\xd6\xd2\x0b\x9b\x3d\xa3\xa8\x6c\x14\x29\x74\x05\x78\x50\xe1\xd0\x6b\xc9\x1b\xcc\xce\x53\x8a\xa4\xe2\x95\x00\x4c\x3d\x20\x57\xc0\x1e\x33\x7f\xc3\x8c\x7a\x8f\xb3\x87\x0a\x96\x30\xad\xa9\x5a\xf4\x20\x57\x3a\x0f\xf9\xb5\x9d\x03\x10\x10\x8f\x9c\x0a\xcc\x54\xae\x58\x22\x85\x36\xaa\x4c\x0c\x96\xae\x1b\x2b\x79\xcb\x44\xf0\x3e\x0c\x84\x29\xb8\x81\x55\xee\x38\x70\x7d\x26\x49\x32\xa3\x62\x1a\x95\x7e\xc9\x69\x0a\xb0\xff\x36\xc8\x55\x7e\x3d\x16\x02\x74\x62\x45\x19\x6e\x00\x14\x63\xcb\xb0\x82\x55\xf7\xcf\x82\x78\xc5\xbd\x57\x99\x5d\xed\x92\x78\xb6\x85\x76\x75\xa2\x5f\xa4\xa3\x8d\xb0\x0f\x52\xc2\x9e\xdd\xc8\x72\x66\x68\x4a\x0d\xdd\xc1\x95\xec\x7d\x55\xaf\xce\x97\xac\xc7\x9a\xa1\xe1\x9e\xd3\x71\x3b\x2f\xe0\xc9\x82\xc7\xe1\x52\x70\x12\x67\x1e\xf2\x10\x7f\x6d\x2c\x4e\xb9\x7b\x07\xf4\x10\x03\xf1\xc9\x17\x04\xb3\xc3\xfb\xd1\x90\x5c\x54\xd5\x0e\x2b\x72\xd2\xee\x56\xab\xa3\x41\xd7\x82\x7e\x07\x18\xdd\x54\x57\x6f\x49\xdd\x5d\x6c\xa5\xa0\x83\x5c\x82\x09\xc3\x15\x8b\xa3\xd3\x1c\xe8\x4a\x81\x48\xde\x00\x22\x40\x79\xca\x8c\xae\x1c\x5e\x90\x0e\x5b\xe2\xe2\xf8\x9d\x53\x7f\x81\x48\x3b\xc0\x3a\x0d\x72\xb5\xc4\x85\x60\xd7\xd2\xd1\x59\x4b\xf9\x1f\x04\xae\xbb\xd8\xb0\x31\x43\xff\x7b\x99\x76\x31\x7b\x37\x12\xdb\x57\x43\x54\x5e\xa0\xe8\xcf\xab\xc1\x8c\x80\xdf\x80\xcb\x2f\x5d\x8b\xb1\x43\x22\x37\xa3\xf3\xdd\x6d\x5e\x95\x24\xd6\x0f\x49\x81\xe1\x73\x7d\xf8\x5c\xff\x75\x7b\xdb\x60\x17\x87\x12\xff\xb4\x76\x2c\xa9\x7f\xa4\x93\x21\xd6\x92\x94\x51\x47\xeb\x69\x33\x63\x79\xa0\xf6\xee\x3a\x32\x5c\x01\xbb\x90\x09\xc6\x2d\x9d\x38\x25\xbf\xa8\xf1\x77\x27\x47\x05\xad\x0c\x3d\x7d\x8f\xbc\x9a\x36\x70\x9b\xe0\x03\xd2\xeb\xcd\x8f\x1b\x83\x81\x60\xb1\x5a\x63\xf1\x1e\xc5\x41\xd8\xb3\x82\x99\x02\xbb\x9c\x0f\x64\xb0\x88\xa5\x64\x96\x31\x05\x4b\x70\x6a\x5a\xe3\x3a\x1e\x72\x89\xa2\x71\xb8\x17\xd4\xe1\x20\x5d\x0a\x76\x17\xc4\x08\xaa\x31\x6b\x8b\xbf\x3a\x63\xae\x0a\xdd\xda\xf1\x82\xd7\xf3\x99\x58\xe0\xd4\x2f\xc2\xb6\xac\x13\xce\x7b\x71\x45\x37\x98\x0b\xcd\xee\xe8\x42\x03\xc6\x57\xda\x42\xf8\xbe\xcb\x90\x56\x0d\xfc\x91\x4d\xb0\x77\xeb\xab\xb5\x9d\x2e\xd7\x76\xb9\x5e\x83\xb8\x4b\x2e\xda\xf8\x32\x55\x1d\x36\x56\xe1\x68\x3e\xbb\xdc\xc7\x81\xc3\x0b\xdc\xc3\x77\xbb\x5c\xa9\xa7\x3c\xbd\x1e\xc2\x10\x5e\x1a\x9f\xc2\x1f\x9e\xd7\x84\xdb\x87\x31\xb3\x58\x5d\x45\x54\x03\x86\xc4\x7d\x57\xb8\x24\x54\xa8\xf5\x2d\xa4\x45\x75\x06\xe8\x50\xb6\x4b\x31\x70\x29\x81\x2f\x0e\x20\xed\x3f\x15\x0b\xc7\xc3\xcd\x8c\xab\xb4\x5f\x50\x65\x16\xa8\x9e\xf6\x6a\x5f\x0b\xee\xf9\x9d\x16\xbe\xe3\xbd\x50\xbb\x8c\xc3\x6b\x21\x0c\x8b\xf7\xa5\xf7\x9c\xe1\x7f\x2d\x5c\x1f\x63\x3d\xed\x03\x00\x56\xae\xe7\x2a\x8a\x87\xf7\xba\xe0\x93\xad\x27\x8d\xc9\xc7\xae\x1c\xa3\x71\x6b\x8b\x84\x3f\xae\xfc\x24\x63\x07\xea\xc0\xd1\x41\xf9\xb1\x13\xe8\x59\x9d\x93\x56\xa5\xba\x23\xb3\xa1\x93\x0a\xbc\xfb\x8d\x2b\x14\x24\x16\xce\x18\x14\x7f\x2b\x1e\x20\x9c\x0b\x72\x24\xa4\xc0\xb3\x82\x6d\x8f\xd1\xfb\x68\x8d\xb5\x0b\x9a\xb8\x0a\x6f\xf5\x02\x9b\xd1\xd9\xf4\x6c\x81\x8b\xd4\x6e\x16\xd0\x6a\xd0\x87\x74\x99\x24\x8c\x05\x0d\x3a\xae\xf7\x52\x9d\x65\x37\x65\x5f\x29\x52\x4b\x48\xe5\xa2\x0d\xcd\xb2\x4a\x73\x75\xe0\x92\xc0\xd9\xbc\x71\x31\x62\x78\xb5\xd0\x1c\xa7\xc4\x43\x0d\x72\xf4\x98\x29\x45\x82\xb7\xff\xdc\x2c\xfc\x0c\x62\x0e\x04\xdd\x40\x65\xd0\xa8\xd0\xf2\x09\x5a\xb2\x22\xd1\x3f\x00\x13\x88\x91\xab\x80\x5e\xe7\x45\x2e\x6d\x83\xa5\x3c\x63\x9a\xdc\xde\x51\x95\x42\x25\xdc\x82\x1a\x8e\x89\xb8\x7b\xb5\x61\x8f\xa2\x39\x40\x1d\xfa\x18\xf9\x8e\x83\x82\x01\xe5\x35\x64\xe3\x33\x84\x96\x46\xe6\xd4\xf0\x04\xd4\x56\x3e\x89\xec\x92\x79\xc8\x5b\xd8\xa8\xda\x07\x74\x35\xd4\x7f\xbf\xc1\xbb\x1e\xc5\x88\xb9\x93\x84\xe7\x56\x26\xa0\x50\x80\x62\x12\x62\x8c\xbc\x11\x75\xd3\x4c\xad\xe0\xf3\x1d\x98\xb0\xa3\x56\xa8\x10\x5b\x75\x49\xc3\xf0\xc1\x46\x1a\x8c\x83\x2e\x48\xa7\xd7\x60\xd9\xc4\xf7\xb2\x58\x6d\x67\x1b\x21\x6b\xcf\x6e\xd0\x1d\xb3\xb2\x80\xde\x88\xb2\x7a\xb0\x6a\x4e\x58\x14\x56\x93\x94\xeb\x46\x65\xe7\xa3\x54\xc9\xa2\x70\xe6\x90\xfc\x78\x79\x4e\x70\x33\xa1\xe6\x4c\x47\xe5\x8b\xd1\x12\x3e\x65\x22\xd4\xdf\x76\xd9\x2e\xe0\xf4\x36\x3f\x02\x9e\x5d\x24\x4a\x7e\x76\x74\x96\x15\x33\x7a\x4c\x3e\xb9\x42\x3d\x01\x7f\x83\xdf\x5e\x2b\x89\x09\x0d\x2c\xde\xa2\xf9\x22\xea\xb4\x7c\x5e\x44\x9d\x17\x51\xe7\xdf\x5b\xd4\x09\x0e\x63\xbb\x8a\x39\x1f\x83\x97\x64\xa3\xac\xb7\xf7\x38\xa8\xdc\x28\x1f\xde\x6e\x11\xbe\xf5\xc0\x14\x70\x37\x6a\x83\xae\x13\xf7\xc0\x9c\xc3\x77\xe8\x7c\x51\x55\x78\x36\x91\x3f\x48\xe5\x8b\x62\xa5\x8d\xd2\xb0\x08\xf4\x8e\x09\x75\x86\x75\x2d\xb6\xf4\x04\xab\x8a\xf4\xc3\xb0\xfd\xca\xfd\xa3\x45\x6a\xf1\xf8\xd9\x09\xea\xe4\x1e\x61\x94\xf1\xf3\x8c\x3d\x40\x1a\x8b\xed\xee\xe3\x48\xee\xe9\xe7\x48\xee\xe3\xeb\x48\xf6\xe9\xef\x48\x82\xd7\xf4\x7d\x4e\xcc\x47\xef\xaf\xdd\x38\x33\x8e\x38\x6d\x3a\x33\xb5\x68\xfd\x30\x0e\xd7\xbe\x62\x9d\xbb\xed\x0b\x67\x00\xec\x65\xb1\xd7\xad\x3b\xad\xa0\xf8\xe0\x95\x1e\xfb\x12\x72\xe3\x46\xbc\xbe\x2a\xdf\x6c\x24\x5c\xff\xe7\x05\xa6\xd9\x81\x53\xd7\x77\xbe\x51\x5e\xb1\x78\x39\xc1\x2f\x27\xb8\x6d\xff\xa7\x3c\xc1\xe8\x57\xdc\xc5\xed\xbd\x2e\x57\xe3\x25\x1e\xf9\xa1\x64\x6a\x41\xe4\x9c\x45\xfe\x34\x90\x04\x58\xf3\xd4\x79\xa4\x38\x9b\x43\x7b\x59\xf6\x11\x79\x3e\x58\x34\x2e\xbf\x58\xc9\x08\x22\xc4\xee\x41\xcb\x9a\x43\xd5\x83\x80\x11\x5a\x1e\xe8\x9e\x78\x59\x2a\xa2\x07\x2e\x3b\x58\xf5\x06\xf4\xfd\xb3\xab\x8b\xdd\x14\x80\x6e\xf7\x3b\x64\x97\x3b\x9e\xa5\xc5\x9f\x6d\x58\x20\x02\x22\xfc\x52\xaf\x7f\x14\xb4\x74\x72\xcb\x16\x3d\x77\x25\xec\xf2\x9a\xfb\xc6\xe8\xd9\x50\x4f\xc6\xd9\x36\x09\xc4\x2a\x00\xed\x40\x15\x77\xd3\xaa\xf1\x69\x9f\xbe\xb1\xde\xcb\x03\xa1\x2b\xf1\xdd\x99\x6c\x77\x4a\xf3\x18\x3f\x35\x54\x70\xa9\x49\xc1\x71\x0e\x70\x02\x52\xda\x79\xa7\xe2\x80\x06\xe0\x48\x0d\xd4\xa2\xeb\x26\x92\xdd\x55\x43\x7c\x3c\x60\xef\xbd\xd4\x80\xa6\x35\xaf\xd8\x5b\xb6\x38\xd4\x2e\x1e\x4f\x0a\x3d\xe3\x85\xcf\xa2\x0e\x94\xc0\x61\x2e\xf9\x0c\x57\xe5\x7e\x08\x3c\xf3\x43\xd1\x23\x57\xd2\xd8\xff\x5d\x82\xd7\x0c\x1a\xf2\x24\xd3\x57\xd2\xc0\x9b\x47\x07\x16\x4e\xf7\xde\xa0\x72\x36\x3c\x0e\x16\x38\xf4\xee\x82\x58\x08\xef\x8d\x01\x20\x71\x17\x90\x01\xac\x5c\x93\xa1\x20\x52\x79\x98\x18\x9f\x76\x57\xbb\x21\xbc\xcd\x25\x32\x98\xae\x18\xc3\x81\x52\xaa\x1a\x24\x37\x0c\x17\x6c\xaf\xdc\xff\x02\x36\x19\x30\x56\x07\x17\x12\x48\x1e\x4b\x0d\x9b\xf2\x84\xe4\x4c\x4d\x21\xf2\x32\x99\xed\xbe\x41\xdd\xe9\x36\x3e\x3b\x51\xef\xf8\xc3\x9d\x31\x03\x58\xdd\x3b\x70\xe2\xb9\x2f\xc3\xc4\x51\x90\x45\xe4\xb4\xb0\x48\xf1\x0f\xcb\x09\x60\x5f\xfe\x05\xc9\x9e\xf5\x80\x9c\xf9\x0a\x9c\xf1\x6f\xce\xd0\x16\x0f\x63\x47\xb0\x72\xfc\x0f\x25\x9f\xd3\x8c\xa1\x6b\x1b\x15\x21\x2f\xa6\x9c\x2c\xb1\xe9\x9e\xcb\xf8\x6c\xa9\x54\xb8\x38\x39\xb8\x65\x8b\x83\xde\x12\x22\x1d\x0c\xc5\x41\x15\xfe\x5c\x43\x9d\xc0\xd0\xc0\xa6\x7e\x00\xbf\x1d\xec\x9b\xb3\x3f\x91\x38\xbf\x03\x96\x38\x23\xd0\x79\x46\xb5\xee\x16\x39\xba\x3e\xff\xd8\x28\x1a\xb3\x8a\xe0\x71\x0e\x8b\x09\x3a\x44\xed\xcf\x56\x05\x7e\xf4\xdd\x9d\x6b\x3a\x41\x69\xee\xca\x87\xb4\x4f\x7d\xd0\xa4\xaa\x61\x80\x10\x28\x71\x17\xc7\x9a\x55\x77\x92\x6b\xe0\xf5\x19\x6e\x3d\xe4\x24\xce\x97\xc8\x35\xa8\xb8\xdc\x87\x4e\x08\x69\x08\x17\x49\x56\xa6\x98\xe7\x11\xba\x82\x82\xdc\x55\xa4\xdf\x01\x38\xf7\x40\x9e\xcf\x61\x00\x2f\x8f\xf8\xdb\xcf\x25\x9f\xd5\xe6\x35\x15\x5c\x0d\x86\x1b\x1f\x84\xd5\xbe\xd7\x3a\xd9\xe2\x21\x58\x4f\x67\x79\x5e\x97\x31\xde\xf2\xb1\x62\xe4\x7c\x46\x85\x60\x59\x14\x2f\xea\x0c\x19\xa1\x84\x13\x08\x1e\xae\x70\xd3\x61\xbd\x72\x93\xa7\x63\x22\x44\x27\xef\xbd\x7a\xed\x8f\xbb\x90\xd2\xde\x2a\x61\xbb\xac\x86\x33\x79\x47\x52\x49\xee\x20\x97\xff\xdc\xb2\x23\xb8\x89\xd4\x9e\x91\x45\x33\x05\xdf\x80\x44\xe6\x85\x92\x39\xd7\xde\x03\xdc\x6d\xdc\x5e\x03\x2c\xb3\xb2\x45\xde\x9c\x75\x09\x57\xde\x9e\x13\x43\xd5\x94\x19\x3b\x0c\x11\x65\x3e\x66\xad\xc3\x3f\x1f\x22\x61\xd7\x73\xaf\x10\xb5\xdf\x22\x4f\x08\xfa\xef\xbe\xbb\xea\x5c\x0a\x76\xd5\x0e\xde\x49\x95\xa5\x77\x3c\xc5\x4b\x2f\x4d\x8e\xec\xc0\xc7\xcf\xbf\x6e\xeb\xdd\x1d\x4f\xef\x07\x00\xef\xd9\x63\x01\x40\x00\x02\xae\x72\x11\x87\x9c\xd2\xf0\x81\x63\x72\xc9\x31\x36\xc6\xfe\x85\x59\x5b\xf2\x31\x17\x55\x14\x56\xd8\x0c\xa0\xab\xf6\x3c\x78\x6d\x42\x33\x83\x51\x0d\x10\x18\x20\xcd\x8c\x68\x9e\x97\x99\xa1\x82\xc9\x52\x67\x8b\xd6\x68\xf1\x34\x40\x9e\x64\xec\x0b\x62\x71\x17\x7e\x15\x3a\xd5\xf9\xd6\x14\x63\xbf\x3c\xcc\x97\x18\x57\xe5\x2e\x94\x9e\x04\x26\x16\x82\x65\xd8\x17\x96\x38\xcf\xd6\x22\x2b\xa7\x7c\x8b\xf3\xfe\xbf\x59\x8a\xef\x2a\x89\x72\xa9\x59\x15\xd9\xde\xb6\x88\xc9\xd3\x65\xe4\x7e\x50\x66\x7d\xb3\x3a\xed\x76\xca\x0a\x26\x52\xc8\x08\x16\xe1\x2a\x4e\x77\xaf\xb0\x72\xd9\xb5\x76\xa7\x50\x97\x5f\x8c\xa2\x96\xdc\xe4\x10\x54\xe9\x92\x75\xf1\x09\xa1\xa2\x3d\xe9\x78\x1e\x59\x70\xc9\xbf\x1d\x8f\x7e\xf0\x22\xc9\xf7\xcb\xbd\x8e\x54\xd4\xa1\xbd\xae\x3b\xac\xae\xc8\x91\xee\xbe\x12\x7b\x96\xde\x37\x57\xba\x5e\x91\x1e\xba\x31\xab\x97\xe2\x91\x3f\x8a\xc4\xe9\x13\x88\x49\xed\x92\x4e\xe8\x2d\xf6\x68\x68\xb6\xee\x65\xb3\x18\xf1\x06\x4d\xd6\xe1\x6d\x44\xd2\x21\x77\xa7\x1b\xc8\xc5\xd5\x10\x6d\x61\x59\xb9\x70\x95\x42\x6c\x23\x56\x0f\x91\x0f\x9b\x1a\xaa\x99\x69\x67\xd5\x58\x76\x4b\xf3\x9c\x1e\x47\xc1\x04\xec\xe0\x10\xed\x03\x33\x49\xff\x77\x4e\x26\x10\xb5\x96\x56\x1a\xf0\x00\xf1\x19\x87\x58\xb8\xa6\xc5\x31\x52\xbb\x0d\x09\x35\xad\xab\xc5\xb4\xa2\xf7\x6e\x06\x9f\x3e\x75\x2e\x29\x6a\xbb\x34\x56\x3c\x08\xf9\x06\x4a\xc1\x7f\x28\x63\x49\x1d\x72\x33\x84\x35\xba\xf6\xfb\x5a\xc8\x34\x61\x95\x89\xe8\x82\xeb\xdb\x2e\x49\xb3\xbe\x39\xbf\xac\x77\xae\x23\xfc\x37\xe7\x97\xc4\xbd\x6d\x65\xc5\xe9\x62\xc6\xb9\x6f\x4e\xa7\x69\xc2\x2a\xd3\x68\xca\xf5\xed\xa3\x17\xec\x2e\xd2\xab\x6d\x7e\xc6\x8f\x6d\x65\xf2\x79\x45\xa2\xe4\x37\x0b\x59\x92\x3b\x17\x49\xef\x84\xda\x1b\x5e\x9c\x92\x4b\xa1\x4b\xc5\xaa\xdb\xcf\xa6\x7c\x6b\x39\xe9\x73\x2a\xec\x7d\x2f\xdc\x78\xce\x66\xae\x82\x2a\x03\x92\x6d\xe7\x3c\x62\x90\x2a\xdf\x75\xf6\x4b\xd8\xb2\xf5\xc3\x89\xf7\x41\xeb\xb9\x28\xe1\x90\x6c\xcb\x37\xb2\x9b\x1d\x25\xc6\x88\xb7\xf7\x6d\x48\x4d\x43\x4e\x52\x36\x3f\xd1\x29\x7d\xdd\x83\xcf\xf8\x50\x56\x53\x9b\x13\xd5\xe4\xe0\xf5\xc1\x80\x8c\x78\xce\x33\xaa\xb2\x45\x2d\x37\x70\xd5\xce\xb2\x00\x3f\x20\x5c\x66\xbd\x3a\x20\x47\x52\xc1\xc8\x09\x15\x24\x63\x3e\x4e\xc6\x1d\xa8\x05\x8a\x80\xc7\x8f\x4d\x45\xc8\x83\xda\x08\x91\xa0\x74\x45\x83\x4f\xc8\x6e\x6a\x69\x50\x2e\x2a\x8a\xcd\x85\x25\xe3\x03\xf2\x69\x55\xe9\x6b\x38\x1b\xbe\xc5\x53\x81\xf2\x41\x75\xb3\x7b\xd6\xcd\x5f\x52\xe8\x9e\x0e\x4c\xdb\xb5\xba\x29\x37\x1f\x59\x21\x3b\x09\x00\xd8\xa5\x61\x09\xe3\xc6\xbe\x90\x9a\x43\xbe\x4c\x6a\xa0\xfa\xac\x32\x3c\x29\x33\x6a\x65\x62\xb4\x83\x0d\xc8\xc5\xe5\xf5\xc7\xcb\xf3\xb3\x9b\xcb\x8b\x53\xe2\x47\xe2\xb1\xb4\x36\x20\x37\x71\x16\xa1\xc8\xe5\xd5\xa5\x6a\x09\xdf\xea\x39\xe2\x43\x45\x95\x86\x10\x72\x43\x50\x41\x86\x82\x9b\x2a\x4b\x2f\x3a\x69\x65\x52\x38\xb7\x2b\xdb\xdb\xd9\xe1\xa6\x1c\x5d\x27\x84\x1b\xcc\xfe\x5c\x1f\x0d\x4e\x07\x66\xfc\x0c\x53\xd9\xa2\xc5\x3d\x80\xe4\x50\x01\x77\x5f\xb2\xbb\x4f\xcc\xd9\xf1\x78\xdc\xa0\x81\xbd\xca\x8d\x8a\x14\x3f\xa4\x03\xf7\x59\x51\x56\x14\x4a\x26\x96\x97\x1c\x0e\x0e\xbd\xa0\x90\x2d\xa5\x7e\x0f\x83\xc6\x89\x9f\xea\xb8\x35\x20\xe4\x83\x77\x61\x86\xa8\xd5\xd5\x59\xe4\x31\x95\x40\x94\x8b\xbc\x81\xa1\xbe\x34\x40\x39\x8e\x3f\xea\x32\x45\x4d\xf9\x9c\x09\x5c\xd8\x7e\x09\x92\xff\x7c\x47\x98\x7f\xac\xe6\xfd\xe9\xe3\xbb\xfd\x4e\x09\xcf\x59\xc7\x09\x9d\xcb\x3c\xc7\xfc\x41\xb3\x10\x7d\x56\x05\x90\x85\xd3\xbe\x37\x85\x05\x33\x21\x4d\xb6\x20\x75\x83\x4e\xf9\x4e\x0d\x05\x25\xbc\x76\xde\xf8\xa2\x92\x53\xbb\xa7\xf9\x75\x49\xb7\xb4\x4f\xa9\xe1\x48\xf6\x49\x98\xf1\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\x7d\x74\x92\xc1\x44\x5a\x48\x2e\x8c\xde\xae\x96\x6c\x2b\x6a\xd2\x9e\xac\x84\x8f\x76\xe5\xba\x97\xbe\x63\xec\xe2\xe0\x47\x8b\x72\x95\xa5\xcc\x50\x9e\xe9\x68\x1f\x8d\x2c\x64\x26\xa7\xab\x73\xfe\x76\xd8\xa0\x9f\x61\xe6\x91\x3e\xed\xdb\x9d\xdf\xaf\xbc\xde\xa6\x54\x43\x1d\x1e\xbe\x34\x03\xe4\x18\x0c\x6b\x0d\x72\x30\x54\x54\x78\xa6\xcb\x7d\x10\xc1\x6b\x09\x06\xa8\x0d\xc2\x21\xf6\x69\xdc\xaa\xbc\x68\x51\x99\x94\xb6\x12\xd9\x43\x83\x6e\xbb\x30\x66\x69\xd0\xf6\x5a\x38\x75\x98\xfd\xc1\xf5\xa9\x13\xb9\x42\xb1\x7e\x48\xe4\x03\xd5\x3b\xa4\x8a\xb8\x6b\x4c\xf3\xbc\xe1\xc5\x9b\x69\xb0\x55\xb6\x68\x1a\x60\x2a\xd9\x27\x58\xad\x30\x0e\x3d\xcb\x16\x55\x6a\x40\xa7\x0a\xd3\x29\x26\xe8\x51\xce\x7e\x5b\x28\x3e\xe7\x19\x9b\x42\x12\x50\x2e\xa6\x51\x2d\x45\x1f\xb1\x0e\xc9\xe1\xd9\xd2\xbc\xec\x56\x69\x13\xa7\x7e\x06\xbc\xb8\xfa\x70\x03\x89\x65\xe1\x52\xf0\xde\x02\xb6\xfd\x20\x14\x1a\xe9\xf7\xfb\xa0\xf7\x1f\x7d\x6f\x65\xc5\x34\x3b\x26\xdf\x31\xf7\x1d\x09\xc9\x6f\x15\x54\x9b\x99\xc9\x90\x7d\x14\xe6\x5a\x41\x16\xd0\x11\x2f\xcd\x5d\xab\x13\xdb\xd2\x0a\x46\xc8\x6e\x6a\xed\xa1\xb8\x26\xa6\xf3\xc3\xfb\x9e\xc7\x97\x2b\xf7\x48\xfa\x77\xa6\x72\xde\x2a\xba\x0a\x3f\xc3\x8d\x4c\xe1\xe8\x21\x25\x7a\x91\x67\x5c\xdc\x56\x19\xa3\x26\xd2\xe2\x10\xfa\xe8\x73\x71\xeb\x31\x56\x31\x9a\xad\xa7\x94\xbb\xe0\xc7\x5e\xa9\xa4\xd9\xc1\x78\x77\xb3\x28\xf0\x2e\x3c\x1c\x7b\x77\xd5\x1b\x93\xb8\x83\x83\x67\xb7\x5e\xae\xbb\x55\x5a\x3f\x1c\x8e\xce\x47\xb5\x2a\xa1\x56\xa7\x83\x77\x8f\x69\x5c\x5e\xc7\x12\x60\x39\x4f\x28\xd9\xf1\x1f\xb6\xdd\xd4\xf6\x49\x56\x6e\x6f\x83\x6e\x3e\xd7\x52\x19\x9a\xed\x89\x08\x24\x33\x5a\x9c\x95\x66\x76\xc1\x75\x22\xe7\xac\xb3\xaa\x73\x37\xc3\xac\xbd\x3e\x61\x1c\xf7\x9b\x8e\xa3\x91\xf3\x3f\x9c\x5d\x13\x5a\xda\x5d\x34\x2e\xad\xe4\x5e\xaf\xb8\xfd\xfc\x47\xe8\x50\xbf\x97\xd9\xbb\xb1\x1e\x7c\xee\x2f\x17\x02\x7b\xbc\x10\x80\x33\xfe\x9c\x2f\x01\xb8\xe0\x86\x53\x23\x5b\xd6\xb2\xaa\xeb\xef\xa5\x36\x32\x77\xe8\x39\xf4\x03\xc1\xad\x2c\x30\xdc\xda\xd8\xf5\x1c\xfd\x20\x68\x03\x70\x86\xc2\x8a\xc5\x34\x61\x0d\x0f\xc0\x1e\x64\x6e\xc4\xb1\x79\x68\xf3\x5b\xe7\x99\x09\x29\x9f\xb2\xdf\x9d\xd6\x32\x69\x2f\x15\x42\xf0\x46\x85\x2a\xb9\xfe\x5e\x2d\x31\xfc\x87\xae\x27\xdb\x99\xbd\x70\x55\xff\x5b\xd2\x0c\xa1\x71\xb5\x6f\x1b\x51\x1d\xb2\x1d\x27\xe9\xf7\xd3\xc3\xfc\x2a\x68\xcd\xa5\xc6\x6c\x51\xd8\xc2\x28\x2a\xb4\xdd\x88\xba\x6e\x74\xe8\xae\x76\x0e\xc9\x91\x49\x8a\xd6\xe5\xda\x1f\xc8\x33\x1b\xa7\xea\xe0\xfe\x2e\x78\x64\xb7\x9d\xd5\x83\xdc\xb6\x00\xee\x76\x35\x6d\xd4\x16\x82\xcc\x96\xbc\xe3\xda\xf8\xb4\xf8\xf0\x82\x6b\x97\xd3\x15\x24\x9d\x6b\xab\x3a\xf1\xe2\xaf\x34\x4d\xd5\x29\x72\x12\x5f\x52\x57\x81\xbc\xe3\xf3\x2e\x51\x11\xee\xe3\x8e\xcc\xa2\x70\xa9\xd9\x6e\xce\xaf\x09\x56\xc5\xf8\xcd\xaf\xb0\x9c\xe7\x7f\xfe\xf2\x57\xaf\x5a\x6f\xe8\xd3\xb9\x3f\xef\x68\x39\xd8\xfb\x8d\xcd\xb3\xf0\x9a\x03\x71\x01\xfd\xe5\x80\x1e\xba\xb3\x8b\x78\x64\x37\x35\x50\xe9\xdd\x84\x8a\x17\x0f\xb3\x27\xf5\x30\x23\x21\xe8\x01\x69\xc2\xfd\xa9\x0a\x12\x94\xeb\xe7\x47\x50\xb6\xc2\x62\x3b\xd6\xd4\xb1\x05\xcf\xaf\xd5\xef\xa2\xdb\x27\xf0\xb9\xbe\xb8\x1a\xfd\xf5\xdd\xd9\x9b\xcb\x77\x30\x4b\xe7\x57\x65\xd1\x80\x8b\x9d\xfd\x88\xda\xa3\x55\x1b\x4d\x70\x3b\x30\xba\xdd\x73\x5c\xbd\x1d\x35\x14\x65\xfb\xa6\xe3\xe5\xc6\x7d\xa5\x65\x31\x69\xb5\xf6\xc7\x35\x5d\x41\xd9\x08\xa6\xf6\x17\xe2\xb0\xb3\x85\x2b\x4a\xc9\x54\x53\x86\xec\x4e\xe1\x0c\xef\xad\xaf\x6c\xdd\x01\xf2\x0c\x8c\xf8\x76\xbd\x08\x83\xbd\x9b\xef\x1f\x08\x56\x6d\x59\xbc\xea\x1e\xfb\x72\x38\x82\x5e\xfe\x92\xc7\x1e\x52\xf4\xc8\x51\x96\x5e\x5b\x4a\xcd\x74\x48\x72\xff\x4c\x31\xa5\x58\x95\x11\xb7\x0b\xf5\x5a\x99\x52\xb7\x56\x0f\xaa\x76\xb1\x51\x8b\x18\x58\x97\x43\xda\xdf\xed\x53\xa7\x5e\xea\x82\x26\x7b\xcd\xfc\x58\xbd\xc2\x37\x10\x52\xfd\xf8\x04\x10\x3e\xbb\x47\x87\xd2\x30\x5e\x57\x44\x3e\xf7\x1d\x9b\x81\x5c\x9d\x76\xc8\xd7\x53\x28\xa4\x0f\x92\x8b\x23\xbe\x9e\x78\xfb\xc8\xa3\x50\xcf\xef\x76\x54\x5d\xf6\xad\xb6\x14\x33\x69\xa4\xd8\xd9\x49\xfc\x7a\x45\xf7\xfa\x39\xc6\x16\xe7\x55\x91\x90\xa8\x42\x1f\x78\x18\x06\x83\xbe\x15\xe3\x3c\x97\x90\xc2\x9b\xf6\xeb\x86\xfd\x47\x97\x3c\xd2\xe1\xc5\x9e\xce\xdc\x8f\x29\xf8\xb0\xab\x09\x76\xaf\x2e\x14\x69\xe7\x88\x8b\xe1\x85\x93\xbb\x7c\x54\x85\x76\x68\x47\xd6\xe3\xdd\xde\xf8\xa2\x54\xe6\x4e\xaa\xee\xa1\xc6\xd7\xb5\x8e\x8d\x5b\x7d\xf7\xdb\x52\x34\xd1\x73\x3c\x23\x38\xc7\x27\x3e\x27\x23\xb8\x30\x6d\xe4\x8a\x6e\x9e\x8c\xe0\xc5\xfe\x00\x87\xe7\x69\x0f\xcd\x8e\x5c\xe8\x61\x43\x52\xf7\x2a\x78\x7b\x2c\xeb\xb8\xc2\xcf\xae\x9b\x33\x10\xd8\xbd\xa9\x88\x04\x0d\x87\xd0\x0d\xbf\x37\xa2\xa0\x24\xd6\xed\xeb\x40\x0f\x86\x86\xe5\x58\xe0\x97\x66\x99\x85\xa5\x14\x71\xda\x60\x17\x76\xda\x23\x98\x79\x37\xa7\x85\xaf\x96\x2c\xef\xc4\x1d\x55\x29\x39\xbb\x1e\xee\xe7\xe8\x77\x70\x2d\x46\xfc\x69\x97\x09\xaa\x5e\x56\x51\xa6\x8c\x8c\xb9\xd1\x55\xc1\x33\x66\x62\x6d\xd0\x92\xb7\x70\x47\x64\x0f\xa9\x3d\x90\xee\x7b\x11\xf7\x13\x44\x26\x86\x66\x8d\x02\xf4\xaf\x5e\xbd\x42\xe3\xd5\xab\x5f\xff\xfa\xd7\x58\x84\x26\x65\x09\xcf\x97\x1b\x42\xab\xff\x7a\xfd\x7a\x40\xfe\x78\xf6\xfe\x1d\x14\xc4\x2b\x8c\xc6\x74\x17\x38\x32\x96\xe4\x8e\x3a\xeb\x1e\xf9\x9f\xd1\x87\xab\xaa\x94\x46\xfd\x57\x57\xcd\xd8\x2d\x6f\x40\x2e\x22\x17\xa0\xd8\x3c\x45\xcd\xcc\xd5\x7e\x31\x84\x4e\x26\x58\xe6\x71\xec\xab\x8c\xe2\x91\xf2\x91\xcd\x50\x92\x19\x6b\x34\xd8\xed\xcf\xc0\x37\xc9\x2a\xd2\x68\xcc\xf3\xc1\xf5\xe8\x6a\x05\x63\x05\xfa\x07\x53\xe9\x61\x51\xef\x89\x86\x4a\x0d\x55\x2a\x38\xc5\xb4\x95\x29\x5d\xe9\x39\x1c\x2c\x4c\xdd\x4e\xe2\x29\xef\x60\x5a\x57\x10\xa8\x21\x96\x4f\x5c\x5b\x55\x07\xff\x1e\xaf\x15\xb7\x39\xc7\x3e\xd0\x9d\x48\x9d\xe7\x87\xd9\xe0\x5e\xb9\x90\xf5\x40\x2e\x08\xcd\x24\x54\x39\x0a\x5b\x5b\xf1\xa3\xa8\xca\xf8\xf6\xa5\x74\xce\xbc\xd7\x35\xfb\x2a\x52\xa1\xf7\xb4\x75\x8d\x93\xba\x49\x3b\x0a\xed\xa7\x63\x59\x1a\x7f\x05\x8c\x63\x62\x79\x3f\xac\x31\xdd\x21\x73\xe0\x0e\xc9\x06\x77\x49\x3a\xdb\x39\x6f\x65\x9d\xcc\xd7\x84\x80\x1e\x61\x34\x99\x91\x5b\xb6\xe8\x23\x61\x2a\x28\x44\xa3\x84\x2a\x52\x2e\xb7\x63\xfd\xbe\x24\x61\xa9\x95\x6c\x1d\xb0\xfc\x8d\x7a\x85\x45\x21\x9a\xc5\x8b\x8f\xda\x49\x3a\x2e\x67\xa4\x88\x14\x78\x9f\x98\x38\xaa\xc3\x1a\x92\x44\x62\x11\xe6\x7a\xd4\x85\x3d\x5f\x2c\xb5\xdd\xf4\xa6\x2f\x57\x6e\x04\x96\xd0\x39\x56\x55\x8a\xa5\xde\xae\xe8\xb0\x13\xdb\xe0\x83\xd4\xa7\xe2\x8d\x5c\x11\xa0\xb4\x99\x2b\x67\xe3\xda\x7a\x28\x05\x40\xd4\xa2\x42\x34\x33\xa5\x03\x0d\xd6\x4d\x2a\x45\xc6\xb4\x26\x1c\x56\x98\x53\x75\xcb\x7c\x52\x12\x9a\x0d\xc8\xb5\x9d\x64\xc8\x7c\x84\x39\x70\xe7\xe8\x46\x66\xcf\x68\x1c\xee\x62\x3f\x72\x38\x18\x1c\x22\x05\x5f\x11\xfc\xd2\x01\x33\x76\x4b\xa0\xba\x43\xe2\xd4\x46\x49\xe3\x42\x63\x1a\x58\x2b\xb5\x41\x9a\x63\x09\x51\x5c\x66\xe6\x39\x14\x6d\x9d\x7e\x67\x79\x39\x3b\x64\xfb\xdc\x35\x49\xf5\x2e\x29\xaa\x5b\x5d\x27\xd4\x9f\xdd\x53\x53\xef\x94\x98\x7a\xa9\xb6\xb2\xdb\x22\x77\xcc\xba\x67\xea\xbd\x47\x22\xe5\xbc\x53\x92\x4f\xff\xac\xcb\x09\x93\xb7\x91\xfa\x5c\xb5\xb2\x8c\xfd\xa8\xc4\xbc\xe1\x64\x55\xad\x2d\x1f\xee\x56\xc9\xc9\x81\x68\x5a\x08\x3c\xbd\x7c\xd7\xad\x3a\x07\xe9\x2c\xf0\x35\x9f\x2e\x02\x60\xf3\x69\x77\x29\xd7\x7c\x96\x4e\x53\xa0\xee\x45\xe4\x92\x0e\xa0\x34\x12\x32\x31\x9b\x70\xe4\x06\x50\xfe\xdd\xf1\x28\x6a\x65\x15\x2d\xb3\xd2\x84\xb0\x9c\x15\xac\x01\x06\xf5\x79\x9b\x31\x18\xd2\x37\x8b\x18\x05\xb0\x48\xa4\xbf\x5d\x79\x06\x3e\x3b\x1d\xe9\xae\x15\xc6\x7e\xb2\x8e\x1b\xf7\x80\xa1\x97\x19\x76\x86\xe3\xc8\x65\x43\xf0\x1e\xc4\x35\x19\x06\x9c\x37\x8c\x46\x01\xc9\x8b\x23\xae\x52\x4f\xe7\x95\xb5\x33\xac\xb8\x29\x3a\x2b\xc2\xd9\xf5\x70\x8f\x12\x7d\x34\xea\x4f\x5a\xa6\x07\xd3\x4d\xad\x6e\xca\x45\xb5\x72\x67\xe0\xb5\x14\xe6\xd9\x8b\x86\x4b\xd3\x7e\x6b\xe9\x62\x64\x56\x6d\x24\x65\x73\x25\xdc\x03\x05\x8d\x12\xb9\xf9\x0b\x3e\x38\xaf\xcf\x5d\x8c\x7c\x44\x91\x10\xe0\xd1\xa9\x00\xb4\x7f\x96\x4b\x90\xc1\x62\xc9\x08\x6a\x93\xa0\x8e\x17\x29\x8b\x85\x4c\x4f\x5d\xa9\x5c\x21\x24\x56\xfd\xd2\x3d\x2c\x6e\xa2\x7b\xa8\x04\x5a\x41\x21\xba\x96\x55\x91\x01\x7c\x67\xd1\x60\xa7\x32\x35\xf7\x29\x54\x63\x37\x10\x56\x7e\xdd\x75\x17\xc9\x3d\xeb\xce\x90\x88\x0b\xed\x56\xc9\xa2\x6e\xac\xc6\x91\x42\x1d\xeb\x64\xc6\x72\x8a\x49\xe1\xfc\xf2\x2c\x95\xb9\x53\xdc\x18\x86\x59\x7d\x98\xca\x35\x91\x93\x5e\xad\x42\xdc\xc1\xfc\xf5\xc1\x2e\xf5\x3c\xee\x59\x72\x85\x54\xbb\xb0\x07\x60\x5c\xd7\xa4\x33\x8b\xd7\xa0\x2e\x64\x90\xc9\x51\x34\x8c\x0c\x96\xc1\xcc\x11\x7a\x8f\xbe\xf0\xa7\x54\x91\x7a\x41\x48\x78\x51\x91\x5e\x54\xa4\xbd\xa8\x48\x11\x63\xf1\x04\xc7\x01\x2a\x56\x9b\xe2\x8c\x52\x5e\x77\xaa\xa2\x7a\xa2\x2c\x31\x16\x35\xbd\xd6\x24\x55\xdd\x8a\x66\x55\x9f\x43\xaf\x4b\x39\x3c\x2e\xcd\xa4\xff\x1b\xc2\x44\x22\x53\xdc\x7c\x3b\xbe\xd2\x06\x44\x9b\x4a\xfd\x88\xe7\x92\xfb\x6f\xc5\x96\x38\x18\x7b\xd7\xad\xdb\x89\x0e\xf8\xbb\xba\xb7\x7b\x62\xf0\x15\x5b\x0f\x41\xb0\x6e\xf9\x21\x46\xde\xf1\xf7\xea\x96\x10\x6b\x01\x03\x72\xfb\x32\xa7\xe4\x08\x5f\x0e\x92\xa2\xec\xb9\x06\x83\x9c\xe5\x52\x2d\x7a\xa1\x91\xfd\xb1\xd6\xcb\xb5\x38\x06\x99\x20\x29\x95\x55\xf6\xb2\xc5\x8f\x55\x3a\xf0\x00\x7a\x64\xe1\x20\xec\x53\xb7\x6a\x30\xf1\xd3\x70\xbf\x0b\x89\xae\x40\x95\xaf\xaa\xe3\x4c\x42\xf2\x3d\xdd\x0b\x2a\x2a\xbc\x65\x62\x4e\xe6\x54\x75\x28\x5d\x1d\x3f\xf7\x94\x07\x52\x3e\xe7\x7a\xb7\x82\x75\x2b\xb5\x66\xee\xd2\x7a\xc9\xd2\x14\xa5\x71\x94\xd2\x9f\x0a\x1f\xea\x1d\x4e\x43\x43\x28\x7a\x7d\xb0\xd3\x34\x7e\x34\x45\x61\xf1\xd9\xb1\x34\x2c\x3e\xf7\x2d\x10\x5b\x1f\x65\x67\xb4\xd9\x6b\xb9\x67\xff\x78\xb4\xd8\xc7\x39\xac\x58\x64\x95\x9f\xc0\x0b\xa7\x8f\x74\xd0\xd0\x1f\x64\x8f\xb6\x1a\x97\x08\xfd\xa7\x6c\xa6\xd9\xd3\xd5\xab\x8b\xd4\xfb\x37\xbf\x77\x1d\xb9\x9c\xf8\x2f\x97\xae\xad\x90\xef\xe5\xd2\xf5\xe5\xd2\xb5\xed\xf3\x72\xe9\xfa\x62\x51\xa8\x3f\x3f\x6a\x8b\xc2\xcb\xa5\xeb\xcb\xa5\xeb\xfd\x60\xf8\x20\x97\xae\x4e\x8c\xab\x6e\x5c\x1f\xf5\xc2\xd5\x95\x75\x39\x4b\x12\x59\x0a\x73\x23\x6f\x59\xeb\x1b\x84\x56\xc2\xfc\xd2\xe8\x8f\x27\xd9\x77\x17\x2c\x3a\x89\x07\xbb\x08\x06\xb4\x4c\xb9\x15\xde\x77\x46\xa0\x33\x37\x80\x97\xd3\x2d\x29\x16\x29\x4b\xc3\xc8\xfe\x90\x1a\x0b\xeb\x01\x39\x23\x8a\x25\xbc\xe0\xae\x7a\x37\xc5\xf7\x88\x61\x21\xcb\x3e\x37\x9a\x65\x13\x97\xed\x5c\xc4\x45\x61\x2a\x11\xdc\x51\xb8\x95\x9f\x41\x9e\x23\x7d\x92\x6c\x5f\x21\x47\xb1\xef\x3d\xb3\x72\xb3\xb9\x89\x47\x88\x8d\x22\xb0\x94\x5a\x2d\x1a\xf8\x58\xc1\x5d\x04\xf2\x43\x1f\x6c\xf6\xa5\xe0\x0a\x90\x77\xc4\x12\x29\xda\x54\xc4\x5c\xb3\x41\x97\xcd\x91\xfc\x4e\x39\x8b\x26\x16\xc0\x0f\x75\x2f\xe7\x34\xe3\x29\x37\x8b\x70\xd7\xe6\xaa\x2c\x51\x3c\x31\x61\x1b\x75\x05\x46\x42\x8b\x42\x49\x9a\xcc\x98\x8e\xe6\x8d\x22\x87\x0b\xc4\x0a\x5e\xe7\x58\x09\x0c\xa4\x0e\xe8\x63\x59\x5f\xb6\x20\x4a\x1a\x7f\x5d\xbe\xe6\x83\x37\xd1\x60\xd0\x1d\xf9\x97\x51\x0b\xb8\x53\x97\xf1\x10\x38\x2b\x3e\x89\xff\xd0\x44\x66\xa9\xcf\xef\xf1\x9b\x57\x56\xcc\x4b\x1c\x0e\x5a\x2a\x07\x19\x20\x8c\x24\x99\x65\xc5\x96\xf2\xad\xef\xfc\xcb\xaf\xc9\x4c\x96\x4a\x0f\xe2\x20\xa1\xd7\xf0\x0e\x55\x34\x2f\x26\x1a\x92\x31\xaa\x0d\x79\xfd\x8a\xe4\x5c\x94\x96\x03\x75\x46\x9b\xee\x92\x4d\x24\xd3\xfc\xea\xeb\xd6\xfd\xba\x4a\x33\xcb\x37\x92\x0e\xab\x0a\xcc\xc4\xeb\x84\x1a\x77\x92\x30\xb8\x0c\xf3\x58\x37\x44\x1c\x47\x74\x63\x68\x0b\x23\x1f\xe0\x7c\xfd\x50\xca\xf1\xc2\x74\x09\x44\xfc\x5f\xec\x51\x8f\x40\xf4\x2f\xdb\x64\x17\xa9\x92\x8b\x6c\xfc\xe8\x83\xd4\x4a\x98\x72\x6d\xb6\x54\x4a\xa8\x62\x14\x37\x36\x6b\xcf\x56\xa6\x56\xde\xef\x18\x96\x02\x3a\x82\x97\x75\xbd\x79\x28\x49\x18\xd6\x34\xbc\xa8\x2a\xed\x08\x89\xe3\x6f\x1d\xfe\x89\x93\x6d\x79\x04\xd9\x43\x8e\xee\x96\x4b\x6d\x27\x5d\x79\x94\xe8\xbc\x56\xec\x56\x3f\x05\x9a\x8b\x29\xa6\xd4\xce\xcb\xcc\xf0\x22\xab\xd6\x1d\x3a\x38\x42\x1e\x9b\xcd\x68\x64\xe9\xa1\x18\x9c\x8b\xa9\x98\xc0\xc4\x78\x14\xc6\x62\xc2\x60\x66\x68\x65\xf9\x41\x41\x15\x0d\xc0\x83\xba\xa9\xfa\xd8\x59\xe0\x28\xdc\x03\x22\xe5\xb1\xe4\x5c\xd1\x2c\x2c\x34\xbe\xfb\xd9\x27\xd2\x18\x26\xa8\x68\x61\x60\xae\xab\x7a\xd0\x89\xc8\xbb\xe0\x02\x86\x15\x36\x1a\xd8\xe2\x84\x9a\x37\x34\xb9\x65\x22\xc5\xf2\x43\xb0\xec\x74\x21\x68\xee\x52\x51\x45\x35\x95\x1b\xfd\x75\xcf\x99\x1a\x30\x52\xce\x87\xea\x22\xd7\xdd\x27\x0c\x4a\xdd\x39\xd7\xcb\x27\x8d\xb5\x8c\x37\x9d\x73\x8d\x46\x18\xc5\xe7\x09\xf3\xfc\xdf\x7e\x6a\x9f\x53\x9f\xb7\x88\x47\x5f\x9a\xbc\x73\x55\xe4\x11\xfe\x02\xb9\x0f\xc6\x6f\xc8\x3a\x45\x33\x7b\xb4\x17\x21\x3c\xb3\xb1\xb9\xe3\xc5\x7e\x0b\xaa\xa8\x71\x97\x30\xda\xc3\x8f\x6f\x2e\xea\x87\xf8\x23\x4d\xa5\x26\x6f\x32\x99\xdc\x92\x0b\x06\x42\xd7\x43\x16\x04\x51\xe3\xf4\x29\x13\x46\xe7\x74\xba\xed\x76\xac\x4f\x72\x29\xb8\x91\x6a\x33\xbd\x78\xa9\x4f\xf8\x24\xe9\x88\xd5\x38\x7d\xd6\xc9\x88\x2d\x82\xed\x52\x8d\x50\xc1\x31\x84\xee\x3e\x97\xdf\x8e\x87\xea\x67\x33\x79\xd7\x37\xb2\x5f\x6a\xd6\xe7\x2d\xee\x5b\x3b\xac\xee\x96\x2d\xe0\x92\xb9\xe3\xfa\xbe\xc5\x6e\x35\xe5\xc0\x48\xb0\x29\xc1\x7b\xcb\xa2\x3f\xbe\xb9\xb0\xbc\x61\x10\x0b\x7b\x27\xcc\x24\x27\x09\x2b\x66\x27\xee\xc3\xcf\x12\x28\x9e\x5a\x74\x85\xca\x19\x49\x64\x96\xb9\x78\x67\x39\x21\xe7\xac\x98\x85\xc1\x1e\x7b\xa5\x4f\x97\xea\xb6\x90\xb2\x6b\xca\xcf\xe8\xc0\xd8\xde\xee\xbc\x44\x88\xa3\xc6\xdd\xea\x18\x3c\x16\xaa\x3c\xeb\x4a\x8c\x0f\x08\x9c\x07\xae\xaa\x5f\xab\xa5\x1f\xbb\x5e\xd6\xd3\x01\x7b\x1f\x8e\x1a\xb9\x19\x4e\x50\x92\x4e\x59\x4a\xe4\x9c\x29\xc5\x53\xa6\x49\xa0\x37\xb1\xea\xc9\xb3\xc7\x86\xdb\x4b\x66\xe2\x27\xcf\x4c\xbc\x83\x8e\x13\x91\x27\xdb\x7b\x99\x3c\xd1\x34\xe7\xe2\xd9\x11\x28\x9d\xd0\x8c\x0d\x3f\x74\x50\x26\x46\xd8\xa3\xae\x4f\xf8\x97\x51\x42\xb1\x2d\x69\xba\xbe\x0d\xf8\x42\x84\x4c\xb7\xd9\x47\x1f\x40\x2b\x98\x52\xc3\xee\xb6\xb2\xbf\x7e\x45\xa0\xb6\xb7\x04\xb9\xf3\x29\xf5\x87\x27\x4a\x8d\x17\x61\x39\xe6\xfd\xda\x27\xfb\x74\xfb\xd4\xd5\xe8\xe2\x17\xd2\xc8\x24\xeb\x11\xf5\xec\x7a\x48\xbe\xc1\x91\xf7\x9b\xa9\x4f\x49\x83\xd2\xdd\x85\xcc\x29\xef\x5c\x68\x63\x56\x2f\x4c\xed\xa7\x7b\x1d\x86\x25\x38\x6e\x5c\x23\x64\xc2\xa7\xa5\xd5\xc0\x9c\xd6\xf4\x92\x44\xed\x51\x04\x90\x4a\xfe\x88\x2c\x41\xde\xe3\xb0\x92\x39\xfc\x0e\x02\x53\x08\x57\x93\x44\x33\xa1\x39\xdc\x93\x44\x97\xd5\xae\xdc\x1b\xd6\x17\x44\xf7\x42\x14\x52\x7a\xe4\x9d\x9c\x72\xe1\x4f\xa5\x74\xd7\x68\x13\xca\xb3\xb6\xc0\x78\x91\x2a\x9e\x5c\xaa\xd0\x3a\xbb\x14\x74\x9c\xb5\xf1\x02\xa8\x93\xf5\x8c\xc2\x3d\x27\x83\xde\x27\x29\xd7\xf6\xff\x64\x34\x7a\x07\x36\xf1\x52\x78\x59\x17\xec\xc5\x8e\xac\x05\x4f\x7f\x3c\x80\xfb\x3d\x33\x48\x69\x76\xc8\x71\x37\x14\xa9\x9d\x2c\xd3\x35\xb7\x13\x37\x1e\x66\xfa\x0b\x9e\xb3\x78\x73\x3f\x66\xe4\x66\xc6\x93\xdb\xeb\xc8\xf4\x2d\x95\x7d\x27\xa2\x57\x35\x26\xd4\xfc\x6d\x9f\x04\xd1\x4d\xf5\xba\xbb\x02\x7b\x13\xd1\xf3\x91\x5b\xb0\x1d\x86\x50\xad\x65\xc2\xab\x7b\x0e\x30\x97\x54\x04\x3f\x05\x82\xbf\xdf\x45\x00\x4f\xbf\x27\x6f\xf2\x9b\xe6\xab\x9e\xea\x98\x17\x71\xe1\xd7\xba\xd7\x89\x23\x6a\xec\x90\xa5\xfb\xa6\x96\x97\xdb\xcb\xa6\x0d\xa3\xbd\xf7\xe2\x76\x9b\xe4\xa5\x24\x5f\x65\x71\x69\x9b\x42\x7e\x6e\x97\x97\x6f\x6f\x4b\x6d\x13\xc8\xb0\x4a\x1b\x6e\xdc\xd4\xe1\x3b\x67\xc6\x87\xc3\x54\xc8\xa2\xcc\xd0\x57\xe2\xfe\xc9\xc5\xbd\x75\x16\xbf\xb3\x27\xb3\xfe\x63\x24\xda\xec\xea\x08\xfc\xd3\xc8\xb9\x19\x89\x64\xaf\x7e\xf5\xf5\xd7\x3f\xf6\x2c\x9c\x6d\x55\xe0\x87\x48\xc3\xd9\xd2\x24\xfa\x12\x69\xf3\x12\x69\x13\xa3\xe2\x43\xa6\x51\xdd\x73\x2c\x4d\x47\x17\xd7\x6e\xee\xad\xed\xa3\x65\x5a\x3b\xc1\x76\x75\x80\xed\x10\x0f\xb3\xa7\x28\x98\xce\xbe\xa0\x5d\x22\x5e\x5e\xe2\x5c\x7e\x6a\x71\x2e\xbb\xf8\x80\x76\x8f\x69\xe9\xe2\xfb\xf9\x53\x8a\x5f\xe9\x70\x18\xdb\xc7\x59\x74\x8f\xae\xe8\x9e\xcf\xae\xbb\x65\x6b\x97\x92\x46\xb1\x7d\xc6\x69\x11\x55\x05\x41\x5f\x78\x10\xf3\x63\x19\x69\x0f\xd6\xa3\xe8\x10\xa4\x83\x02\x85\xc3\xcb\x2e\xb5\x04\x9d\x4e\xfe\x61\xd4\xb8\xda\x08\xaf\x9f\xe6\x46\xe3\xa7\x79\x65\xf0\x52\x18\xe4\x79\xdb\xb4\x75\x2d\xb7\x88\xb7\x24\xc0\x59\x07\x46\x2c\xc7\x71\x4e\xc3\xea\x8c\x9c\x5d\x0f\xad\xba\x0c\xe1\x33\x34\xd3\x03\xb2\x82\x4f\x7b\xbb\xa4\xe3\xeb\x9e\x3f\x53\x63\x58\x5e\x98\xf6\x9b\xfd\x62\xd2\x7e\x72\x93\xf6\xce\xf6\xb8\xcf\xa1\x63\xa8\x00\x59\xe6\x54\xf4\xed\x89\x02\xe3\x76\xed\x16\xac\x41\x82\x07\xc4\x7b\xe5\x22\x2c\xa8\x62\x98\xf4\xa9\x5e\xf1\x96\x46\xf5\x0f\x1f\xc6\x08\x09\x63\xef\xbc\x72\x64\xa0\x8d\x93\x96\xc8\x25\xb7\x4f\xb7\x9c\x00\x05\x7f\xa8\x22\x2e\x5c\xd3\x9b\xcd\x8c\x21\xb3\xbe\x86\x40\x94\xaa\x55\x5d\x12\x46\x51\x98\x66\x99\xbc\xc3\x6f\xc7\x0c\xcc\x42\xdf\xce\xc5\x45\x58\x8d\x19\xc9\xb9\x55\xaa\x9d\xf1\x33\x9e\x0e\x5e\x45\x5a\x89\x9a\x29\x14\x58\x95\xbb\xcd\x1a\x31\x13\x6f\xb4\x55\x48\x05\x3a\x42\xdb\x7f\x7b\xc7\x1b\xcc\x8a\xeb\x68\xc2\x98\xcd\xe8\x9c\xcb\x52\x61\x6f\x23\xc9\x81\xfb\x09\x58\xc2\x42\x96\xc1\x34\x85\x55\x12\xc3\xea\xf4\x0a\x38\x5d\x55\x3f\x82\x28\x9f\x4a\x6f\x4b\xe8\xb3\x2f\x5c\x9b\xe5\xb5\x78\x10\xf9\xa4\x6d\xfb\xc2\x9b\xb9\x2e\x2c\x5b\xe8\x5c\x11\xed\x73\xdc\xaf\x2e\x98\xcc\x47\xf0\xd3\x8f\xa8\x1e\xda\xd6\x5c\xa4\x2f\xb2\xce\xbe\x65\x9d\x70\x5d\x95\xf1\x64\xd1\xb9\x52\x58\x75\x4d\x65\xbb\x93\x37\x54\xb3\x94\xbc\xa7\x82\x4e\x51\x2d\x3b\x1a\x5d\xbf\x79\x7f\x6c\xb7\x0d\xd4\xbe\xe1\xc5\xca\xbb\xac\x51\x3c\x87\xab\x7d\x86\x41\x2c\xad\x70\x07\x4e\xd4\x71\x8d\x7b\x0d\xe3\x20\x81\x9b\xb4\x4b\x10\xbb\x1c\x7a\xd9\xac\xf1\xd8\x20\x0a\xf3\x3c\xbd\x67\x55\x47\x2e\xb4\xa1\x59\x76\x9d\x51\x71\x56\x14\x4a\xce\x57\x6b\xc2\xf5\xc0\x70\xd7\xd0\xb3\x76\xf4\x7d\xf0\x2f\x0b\x04\x34\xdc\xf5\x0a\x32\xac\xc6\x1f\x90\xa1\x09\x0a\xb1\x14\xc0\x06\x0f\xce\x4a\x23\x73\x6a\x78\x72\x60\xf5\xe6\x83\xf7\x54\x94\x34\x5b\xe9\x61\xb4\x71\x19\xeb\xc4\xba\x8d\x9d\xd6\x27\x47\x6b\xd1\x6d\xa3\x7c\xb0\xb9\xbf\xa1\xca\xd2\x96\xf3\xd1\xe7\x4e\x7d\xb5\xa1\xa6\x5c\xa2\x9c\x1b\xa8\xf9\x7a\xfa\xdd\x27\x19\xd5\xe6\x53\x91\xda\x93\xdc\xf8\x75\x13\x91\x4e\xa8\xa1\x99\x9c\xfe\x81\xd1\x6c\x35\x3e\xd7\xf0\xe4\x3c\x6e\xed\x8d\x3f\x88\x32\xa3\x72\x1c\x1a\x1e\x6a\x62\x85\x62\x1f\xaf\xad\x58\xc6\xe6\x54\x18\xdf\x1d\x2b\x65\xeb\x43\xb7\x7e\xc0\x22\x5e\x19\x3c\x53\x66\x98\xca\xb9\xa8\x8f\x39\x82\xb6\xe7\x52\xa4\x1c\x4d\x7d\x60\xcc\xc2\x1e\xf5\x71\xd7\xa3\xda\x3a\x73\xfe\x06\x03\x7e\x9d\xf2\x44\xf3\xa9\x83\x02\x9b\x8d\x9d\x4c\x38\xc3\x97\x70\x73\x5d\x9b\xdb\x12\xa4\xc8\xad\xb0\xc2\x1c\xe4\xbc\x58\x4d\xa4\xb6\xf2\xf6\x6d\x3c\xbd\xef\xf7\x18\xa7\xb0\xde\x2f\xb2\xef\xe6\xbd\xce\xd0\xbf\x09\xc5\xf0\xd9\x2e\x0d\x34\xa7\xb2\x9e\x82\xae\xc2\xbb\xd0\x0d\x83\xfb\x1a\xd5\xd5\x6b\x8d\xd6\x53\xfc\x56\xc2\x52\x3b\xb9\xa6\x6d\xde\xf4\x3a\xad\xad\xb2\x7c\x2f\xa9\x9f\x2d\xa4\xbc\xad\x2c\xaa\x65\xfa\xf2\xba\x32\x3c\x74\x4e\x71\xca\xa9\x0f\x94\x14\x9c\x61\xa2\x0e\x2a\x1c\xb0\x80\xb3\x30\x9a\xba\x97\x96\x83\x59\x35\x0e\x7e\xeb\xb9\xbb\x66\x34\xec\x3a\xdf\x05\x6f\x1c\xa6\x98\xa8\x02\x2e\x0b\x4e\xbe\x91\xee\xa2\xd4\x05\x94\x5a\x1a\x00\x7c\xbb\x47\x74\x99\xcc\x08\xd5\x76\x6a\x16\xa1\xed\x89\x67\x83\x9c\x0a\x3e\x61\xda\x0c\x42\x1e\x5a\xfd\xa7\x5f\xfe\x65\x40\xde\x4a\x45\x9c\x1f\x76\xcf\x67\x80\x70\xf3\xac\xf0\x82\x6b\x5c\x4c\xe8\x5b\x69\x9a\x85\x4c\xdd\xa4\xef\x60\xb2\x86\xde\x5a\x1e\x86\x93\x2d\x19\x5c\x17\x9c\x92\x03\x2b\xe4\x45\x9f\xfe\x87\x65\x4b\xff\x3a\x20\x47\x77\xc0\xb4\x0f\xec\x9f\x07\xf8\xc1\xe0\x4b\x18\x2b\xc2\xd5\x87\x31\xcc\x4f\xf1\xe9\x94\x29\x54\xf9\x08\x84\xc3\x1d\xbb\x0c\x16\x42\x46\x8d\xfd\xcd\x6f\xa5\x22\x36\x27\xf2\xa7\x5f\xfe\xe5\x80\x1c\xd5\xd7\x45\xb8\x48\xd9\x17\xf2\x4b\x34\xfd\x72\x6d\xd7\x78\xec\x2e\x50\xf4\x42\x18\xfa\xc5\x8e\x99\xcc\xa4\x66\x02\xd5\x6f\x23\xc9\x8c\xce\x19\xd1\xd2\x6a\xad\x2c\xcb\xfa\xce\xac\x4d\xee\x28\x64\x15\xf1\xa0\x84\x20\x70\x52\x50\x65\x6a\x28\x31\x70\x56\x0d\xf8\x9a\xdd\xb6\xa9\xf0\xd7\xbf\x13\x2e\xdc\x9d\x91\xbb\xad\xb2\x7b\x0e\x21\x8d\xb8\x49\x46\x92\x64\x46\xc5\x34\xc4\x51\x4f\x4a\x53\x2a\xb6\xe5\xba\xa5\xe5\x19\xb8\xe5\xa2\x53\xb8\xed\xb7\x5c\x34\x6f\xee\x57\xdb\x82\xa6\xdc\x78\xa7\x7f\xe7\xc8\x67\x16\x27\x76\x17\x14\x1f\x97\x46\x2a\x7d\x92\xb2\x39\xcb\x4e\x34\x9f\xf6\xa9\x4a\x66\xdc\xb0\xc4\x2e\xeb\x84\x16\xbc\x9f\x48\x61\x77\x1c\x32\x08\xe4\xe9\xcf\xa0\x08\x66\xdf\x4e\x75\x4b\x5e\xe3\x96\x8b\xde\x6e\x08\x7b\x52\x03\xd8\xde\xd6\xd8\xc2\x86\xb3\xbc\x50\xb4\xa7\x3c\xc2\x6a\xc1\x78\x71\xb2\x97\xc5\xfa\xb4\xbc\xdd\x79\xcc\xa1\xcb\x34\x9d\x34\xc7\xb0\xc7\x0e\xbd\x34\xe0\x54\xd6\x28\x65\x4e\x53\x24\xa5\x54\x2c\x1e\x1c\xf9\x2d\x48\x21\x21\x7b\xb2\xe8\x27\x58\xdf\xbe\x4f\x45\x6a\xff\x8d\xf1\x28\xc9\x62\x2f\x30\x2c\x79\x27\x42\xf0\x69\x78\xf1\x38\x47\xa2\xe4\x7b\x38\xf5\x4e\x5e\x6b\x29\x44\xa1\xa8\x0a\x2e\x3b\x46\x95\xcc\x33\xcd\xba\x80\xca\xb5\x1f\xf5\xbf\xdd\x9d\x49\xc8\xcc\xb5\x4d\xa4\xda\x7c\xd3\x11\xc9\x8e\x2d\xe7\xfb\xae\xea\xd1\xac\x89\x6f\x07\x73\x69\xa0\x7c\xf4\x7c\x6d\x19\x5e\x41\x01\x06\xb3\xfe\x8e\xb6\x15\x0e\xf9\x3b\x7a\x3b\x91\xfe\xca\xfc\x40\x49\x50\x4a\xb6\x2b\x50\x95\xfe\x52\xab\xb4\x85\x8b\x32\x4c\x1b\x42\xe7\x94\x67\x60\x51\x97\x63\xcd\xd4\x1c\x4b\x1e\xb9\xb4\x78\xb4\xa9\x67\xb9\xaa\x06\x28\x46\x3d\x92\xe6\xe3\xd7\xb0\xbc\x2b\x9b\x16\x00\xda\x50\x63\xf6\x6b\x67\xbd\x17\xbd\x07\xd5\xcb\xb5\x3f\xdb\x2f\xec\xa8\xc6\x58\xfc\xfb\x03\xa3\xca\x8c\x19\x35\x37\x7c\x13\xdf\x5d\x42\xe9\x5a\x3f\x6f\x70\xa9\x10\xfa\x8e\x91\xa9\x34\x56\xc4\x2a\x01\xf7\x51\x26\xc5\x04\x34\x01\xd1\x1e\x1a\xa3\xab\x55\xde\x28\x0a\x71\x2f\x52\x74\x5c\x66\xbd\xe3\xf2\x3a\x9d\x74\xec\x30\xc9\x60\x6b\x4c\x01\x21\x05\x73\x7b\x87\x37\x10\x40\x81\x1e\x67\xc9\x39\xd3\x7a\x63\x6a\x88\xba\x0b\x1f\xb6\xc6\xa3\xdc\xb8\x0e\xcb\xfd\x6f\x18\x3f\x61\x05\xe8\x94\x19\xca\x33\x7f\x94\x11\x14\x01\x4a\xdb\xa8\xeb\xc6\x05\x2a\x46\xf5\x26\x01\xa1\x99\x11\x4b\x4b\x81\x93\x96\x82\xf5\xef\xa4\x4a\xc9\x39\xcd\x59\x76\x4e\x35\x73\x63\xc5\xe1\x6a\xb8\x47\x87\x7a\xaf\x53\x5e\x6d\xfb\x5a\x33\x65\x34\xfe\x78\x24\x72\xb8\x51\xa9\x58\x38\xc1\x9e\x37\x41\xde\xa8\x92\xf5\xc8\x5b\xcb\xbd\x7a\xe4\x93\xb8\x15\xf2\xee\x7e\x73\x35\x1b\x6f\x2e\xea\x6e\x56\x2e\x73\x0b\xa4\xc8\x73\x09\x61\x6a\x06\x9f\x30\xdd\x1d\x67\xe4\x08\xfe\x1a\x53\x63\x9d\xd9\x84\xa6\x7e\x46\xf6\x9f\x4b\x26\x28\xab\x28\x2a\x39\x55\x4c\x63\xce\x95\x95\x09\xfd\xda\x9a\x9c\xbf\x61\xc2\x45\xbc\x6d\x9d\xde\x70\x55\x2f\x3f\x53\xcf\xd7\xa6\xd5\x2f\x6e\xbf\xdd\xc7\x8a\x6c\xa5\xa8\xb1\xd9\x0b\x2f\x9a\xe8\x1a\xe3\xd3\xba\x19\xae\x36\x3a\x45\x5c\x2f\x6a\x8b\x42\xc9\x26\xeb\xa8\x5f\xdd\xf9\xe8\xf3\x7a\x60\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb3\xd4\x7d\x0d\x52\x5b\xcf\xcc\x56\x23\xd4\x8b\xf9\xe9\xc5\xfc\xf4\x63\x32\x3f\x6d\xc5\xf8\x4d\x26\xa7\x1f\x87\xb1\x69\xeb\x12\x37\x19\x98\x9e\xa5\x69\xa9\xd5\x8a\x36\x9a\x93\x9e\xad\x21\x69\xeb\xd2\x5a\x1a\x8f\xfe\x7d\xcc\x46\x5b\x21\xb6\xc1\x54\xf4\x0c\x8d\x44\x6d\x04\x32\x96\xb6\x11\x13\x87\x51\xe3\x58\x50\xac\x0a\x26\x86\xe1\xbc\x4b\x4d\x2c\xce\xec\x2a\x2d\x5a\x01\x6e\xeb\xdc\x0e\xdd\xe4\xda\xcb\x5e\x4e\x60\x74\xe5\x04\x97\x26\x4b\x2e\x2e\xaf\x3f\x5e\x9e\x9f\xdd\x5c\x5e\x34\xe5\xbb\x55\x90\xde\x22\x89\x6d\xb6\x41\xf4\x23\x49\x6c\x4d\x03\x4b\x90\xd7\xfc\x64\x71\x60\xcd\x4f\x65\xc9\x57\xf5\xba\xbf\x5c\x78\x2f\x2e\x77\x2f\xfe\xb1\xfd\x74\xb6\x3d\x9e\xf6\x74\x02\xb6\xa0\xc7\x98\x95\x7b\x66\x32\x4b\xb5\xf7\x35\x1d\x5e\x84\xe8\x25\x2e\x92\xac\x4c\xad\x70\xf1\xe9\xd3\xf0\x42\x0f\x08\x79\xc3\x12\x5a\x6a\xb0\xc2\xa4\x52\x1c\x1a\xf2\xe1\xea\xdd\x1f\xc1\x87\x1a\x5a\xf4\x42\xb2\x0f\xc8\x20\xcb\x29\x26\xc1\x35\x98\x85\x8c\xbc\x61\x28\xa8\xc0\x97\x13\x5a\x58\x2a\xa6\xb1\xca\x82\x01\x59\x64\xc6\xb2\xc2\x52\xcc\x5b\x46\xaa\xdc\x9f\x76\xe0\xaa\x86\xb9\x77\x79\x9c\x32\x83\x91\x4e\x9b\xbc\x1a\x37\x42\x6d\x8b\xc5\xf5\x1e\xb6\xd6\x9a\xfa\xe8\xb4\xf1\x3b\xaa\x9d\xc5\x6a\xe5\x6c\xb7\xec\xef\x76\xfb\xcc\x7a\x13\xc7\x1a\xe3\x06\x92\x67\xf8\x6b\x69\xce\x76\xb2\x95\x1d\x03\x9d\x48\xb8\x69\x6d\x4d\x5d\xef\x06\xb4\x3a\x67\xfd\x92\x2d\x83\x35\x81\x5c\xfb\x70\xf0\xa2\x8e\xa6\xdc\x6e\x2e\x50\xf0\x22\xad\x55\x97\x74\xde\x76\xf5\x77\xe5\x38\xd4\x17\xad\xe6\xeb\x2c\x32\xe4\x1f\xff\xfa\xea\xff\x07\x00\x00\xff\xff\xda\x8b\x54\xf8\x5f\xac\x01\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\x95\xe8\xf7\xf9\x15\x28\x27\x55\xb6\xb3\x92\xdc\x9d\x9d\x4d\x72\xbd\xa9\xa4\xdc\xb6\x7b\xa2\x9d\x6e\xb7\xb7\xe5\xee\xa9\xdc\x24\x37\x81\x48\x48\xc2\x98\x04\x38\x00\x28\xb7\xf2\xf8\xef\xb7\x70\x0e\x00\x82\xd4\x8b\x94\xe5\xc7\x4c\xcc\x0f\x33\x6d\x0a\x00\x81\x83\x83\xf3\xc2\x79\xd0\x82\x7f\x66\x4a\x73\x29\x4e\x09\x2d\x38\xfb\x62\x98\xb0\x7f\xe9\xc1\xed\x6f\xf4\x80\xcb\x93\xf9\xeb\xaf\x6e\xb9\x48\x4f\xc9\x79\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x0b\x36\xe1\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\x9e\x7e\x45\x08\x15\x42\x1a\x6a\x5f\x6b\xfb\x27\x21\x89\x14\x46\xc9\x2c\x63\xaa\x3f\x65\x62\x70\x5b\x8e\xd9\xb8\xe4\x59\xca\x14\x0c\xee\x3f\x3d\x7f\x35\xf8\xd5\xe0\x97\x5f\x11\x92\x28\x06\xdd\x6f\x78\xce\xb4\xa1\x79\x71\x4a\x44\x99\x65\x5f\x11\x22\x68\xce\x4e\x89\x2e\xc7\x3a\x51\xbc\x80\x4f\x0c\x64\xc1\x14\x35\x52\xe9\x41\x22\x15\x93\xf6\x7f\xf9\x57\xba\x60\x89\xfd\xf8\x54\xc9\xb2\x38\x25\x2b\xdb\xe0\x70\x7e\x8e\xd4\xb0\xa9\x54\xdc\xff\x4d\x48\x9f\xc8\x2c\x87\x7f\xe3\xda\x47\xd1\x57\xe1\x75\xc6\xb5\xf9\x76\xe9\xa7\x77\x5c\x1b\xf8\xb9\xc8\x4a\x45\xb3\xc6\x6c\xe1\x17\x3d\x93\xca\x5c\x55\xdf\xb6\xdf\xd2\xe5\x38\xfe\xb7\x6b\xc8\xc5\xb4\xcc\xa8\xaa\x0f\xf2\x15\x21\x3a\x91\x05\x3b\x25\x30\x46\x41\x13\x96\x7e\x45\x88\x83\xa3\x1b\xb3\x4f\x68\x9a\xc2\xde\xd0\xec\x5a\x71\x61\x98\x3a\x97\x59\x99\x8b\xf0\x4d\xdb\x26\x65\x61\xd4\x53\x72\x33\x63\xa4\xa0\xc9\x2d\x9d\x32\xff\xbd\x31\x4b\x89\x91\xa1\x03\x21\xdf\x6b\x29\xae\xa9\x99\x9d\x92\x81\x05\xf1\xc0\x42\x30\xfa\x19\xf7\xe7\x1a\x07\x89\xde\x9b\x85\x9d\xae\x36\x8a\x8b\xe9\xa6\xcf\x27\xd4\xd0\x4c\x4e\x09\xe2\x17\x99\x48\x45\xcc\x8c\x11\xfb\x29\x3e\xe1\x2c\xf5\xf3\xdb\x30\x23\xec\xba\x34\xa7\x51\xf3\x75\xeb\x29\xcd\xa8\x10\x2c\x23\x72\x42\xca\x22\xa5\x86\x69\x62\x64\x05\x9f\xcd\xe0\x71\x9d\x97\x66\x73\xbe\xf4\x7e\xc5\x74\xb0\xe9\xfc\x35\xcd\x8a\x19\x7d\xed\x5e\xea\x64\xc6\x72\x5a\xed\xa1\x2c\x98\x38\xbb\x1e\x7e\xfe\xcf\x51\xe3\x07\x52\x5f\x4a\x8c\xa2\xe4\x96\xb1\x42\x57\x87\x82\x94\x85\x5d\x93\x5d\x1c\x19\x2f\x88\x51\x34\xb9\xe5\x62\x0a\x4b\x9f\xe2\x7a\xcf\x71\x63\xf4\x60\x69\xca\x72\xfc\x3d\x4b\x4c\xf4\x5a\xb1\x1f\x4a\xae\x58\x1a\x4f\xc5\x42\xd6\x93\x88\xc6\x6b\x0b\xa7\xe8\x55\xa1\xec\xb4\x4c\x74\x0e\xf1\x89\x68\x54\xed\x7d\x63\x99\x87\x16\x16\xd8\x8e\xa4\x96\x3c\xd9\xe9\xcf\x98\x3f\x1c\x2c\x75\x00\xb4\xdb\x69\x66\x5c\x13\xc5\x0a\xc5\x34\x13\x48\xb0\xec\x6b\x2a\xdc\x9a\x06\x64\xc4\x94\xed\x68\x0f\x6c\x99\xa5\x96\x8e\xcd\x99\x32\x44\xb1\x44\x4e\x05\xff\x7b\x18\x0d\x40\x64\x3f\x93\x59\xfc\x30\x04\x8e\x9b\xa0\x19\x99\xd3\xac\x64\x3d\x42\x45\x4a\x72\xba\x20\x8a\xd9\x71\x49\x29\xa2\x11\xa0\x89\x1e\x90\xf7\x52\x31\xc2\xc5\x44\x9e\x92\x99\x31\x85\x3e\x3d\x39\x99\x72\xe3\x29\x70\x22\xf3\xbc\x14\xdc\x2c\x4e\x80\x98\xf2\x71\x69\x37\xee\x24\x65\x73\x96\x9d\x68\x3e\xed\x53\x95\xcc\xb8\x61\x89\x29\x15\x3b\xa1\x05\xef\xc3\x64\x05\x92\xc8\x3c\xfd\x99\x72\x34\x5b\x1f\x36\xc0\xb7\xf2\x1c\x10\x4f\xf5\x36\xc2\xda\x12\x3f\xc2\x35\xa1\xae\x3b\xae\xa5\x02\xa9\x7d\x65\xa1\xf2\xf1\x72\x74\x43\xfc\x04\x10\xec\x08\xe1\xaa\xa9\xae\x80\x6d\x01\xc5\xc5\x84\x29\x6c\x39\x51\x32\x87\x51\x98\x48\x0b\xc9\x85\x81\x3f\x92\x8c\x33\x61\xec\x31\xcc\xb9\xd1\x80\x73\x4c\x1b\xbb\x0f\x03\x72\x0e\x0c\x88\x8c\x99\x3b\xb0\xe9\x80\x0c\x05\x39\xa7\x39\xcb\xce\xa9\x66\x0f\x0e\x6a\x0b\x51\xdd\xb7\xe0\x6b\x0f\xec\x98\x7f\x2e\x77\x58\x3a\x63\x84\x78\x06\xb7\x76\x77\xe2\x03\x3f\x2a\x58\x12\x8e\x03\x15\xe4\xac\x28\x32\x9e\x20\xc6\x9b\x19\x35\x24\xa1\xc2\xc2\x8b\x0b\x6d\x68\x96\x01\x3b\x69\x35\x8b\x75\xa7\x9d\xc0\xd1\x6e\x30\x07\xff\x7a\x89\x42\xd7\x7f\x08\x4c\xad\xd1\x62\x1d\x65\xb0\x8f\xa3\xb3\xcb\x3f\x6c\x00\x39\x41\xc9\x64\xc2\xa7\xab\xba\xad\x85\xe5\x39\x74\x01\x99\x86\x72\xa1\xdd\x10\xa5\x42\x68\x56\x9c\xca\xf2\x2e\x5a\xe3\xdb\x83\xb5\xb3\x5b\x09\xd9\x6d\x6b\xb6\x0f\x13\xf3\xd5\x3f\x34\x16\x70\x29\xe6\x78\x50\xad\xcc\x62\x89\x1c\x13\x73\xae\xa4\xc8\xed\x21\x9a\x53\xc5\xe9\x38\x73\x8c\x8d\x59\xf2\x85\x67\x0c\x97\xc8\xd4\xaa\x23\xb5\xe6\xab\xb8\x1e\xaa\x14\x5d\xac\x69\xc1\x0d\xcb\xd7\xac\x66\xd5\xb4\x3f\x53\x15\x51\x09\x8b\xbc\xab\xa6\x4e\x5c\x03\x3b\x75\x4a\xce\xc3\xc4\xd7\x7e\x66\x0b\xdc\xf1\x59\x8f\xdb\xd5\xb3\x06\xcb\xfd\xb3\x6d\x03\xf1\x01\x4e\xbf\xe1\xf7\x06\x58\xec\x09\x41\x06\xc6\x56\x42\x63\x40\xde\x97\x1a\x76\x8b\x92\xf3\xbf\x0e\x2f\x2e\xaf\x6e\x86\x6f\x87\x97\x1f\xd7\x83\x83\x6c\x3b\x28\xd5\x03\x34\xbe\xc3\x64\x0f\x3f\xfb\x3d\x52\x6c\xc2\x14\x13\x09\xd3\xe4\xe7\x47\x9f\xcf\x3e\xfe\xf5\xea\xec\xfd\xe5\x31\xa1\x8a\x11\xf6\xa5\xa0\x22\x65\x29\x29\xb5\x67\x1a\x85\x62\x73\x2e\x4b\x9d\x2d\x1c\xe5\x4a\xd7\x20\x6d\x13\x5b\x81\xdb\x52\xb1\x20\x9a\xa9\x39\x4f\x56\x83\x48\x0f\xc8\x70\x42\x68\x85\x40\x49\xc0\x70\xcb\xa8\xb2\x39\x4b\x7b\x30\x6c\x98\xb4\xff\x0e\x17\x45\x69\x3c\xc3\xbb\xe3\x59\x06\xa7\x42\xa0\xac\x94\x0e\xc8\x85\x2c\xed\x78\x3f\xff\x39\x2c\x4c\xb1\xb4\x4c\x40\x88\xb6\xc4\x80\x8b\xa9\xfd\xa9\x47\xee\x66\x3c\x99\x11\x9a\x65\xf2\x4e\x03\xa5\x60\x3a\xa1\x85\x5f\x7a\x0c\x1d\xbd\x10\x86\x7e\x39\x25\x7c\xc0\x06\xe4\xe0\xe7\xd1\x4f\x07\xf8\xf5\x42\x49\xfb\x09\x94\x93\x71\x56\x19\x37\x4c\xd1\x8c\x1c\xc4\xad\x07\xe4\xd2\x7e\x83\xa5\xf1\x3e\xc0\x08\x82\xcd\x99\xb2\xab\xf0\xbb\xd0\x23\x8a\x4d\xa9\x4a\x33\xa6\xb5\xc5\xb3\xbb\x19\x33\x33\x86\xa2\x78\x00\x18\xfb\xc2\x2d\xc3\x95\x8a\x08\x69\x06\xe4\x82\x4d\x68\x99\x01\x07\x26\x07\x07\x83\x26\xe3\xdb\x1d\xd5\xde\x2a\x99\x77\x40\xb7\x51\x5d\x73\x58\xb5\xf7\x87\x1a\x47\xae\x91\x35\xcd\x52\xc2\x27\x4e\x82\xe1\xda\x2e\x8a\xb0\xbc\x30\x8b\x36\x87\x66\x0b\x1d\x21\xad\x09\x01\x09\x3c\xe9\x3d\x2d\xbe\x65\x8b\x8f\x6c\xb2\xad\x79\x73\xfd\x2c\x63\x89\x25\x94\xe4\x96\x2d\x40\x9c\x25\xe7\x7e\xc0\xcd\x4b\xe9\xb4\x1c\xd2\x92\x3c\xfa\xa7\x6f\xa7\xb3\xb5\x5d\x7b\x20\xd9\xe7\x96\x2d\xda\x34\x23\xcb\x3a\x9d\x05\x0d\xf0\x3a\x0b\xab\xed\x50\x21\xed\x51\xd6\x3f\xdb\x29\xfa\xca\xc9\x1d\xc6\xa4\xdd\x9d\x53\xb3\x52\x60\xbd\x2d\xc7\x4c\x09\x66\x18\xc8\xac\xa9\x4c\xb4\x15\x57\x13\x56\x18\x7d\x22\xe7\x96\xf2\xb1\xbb\x93\x3b\xa9\xac\x22\xd7\xbf\xe3\x66\xd6\xc7\x5d\xd5\x27\x60\xf4\x38\xf9\x19\xfc\x8f\xdc\x7c\xb8\xf8\x70\x4a\xce\xd2\x94\x48\x38\xe2\xa5\x66\x93\x32\x23\x13\xce\xb2\x54\x0f\x22\xad\xab\x07\xfa\x40\x8f\x94\x3c\xfd\xfd\xe6\xc3\xbd\x23\xc4\x64\x81\xc6\x8a\x1d\xa0\x36\x02\xa1\x6b\x51\xa3\x53\x01\xe9\x2d\x85\xb2\x2a\x82\xdd\xf3\xdc\xb1\x45\xc7\x50\x3a\x2c\x63\x2c\x65\xc6\xa8\xd8\xd2\x03\xc0\xd6\xfd\xcc\x1e\x56\x87\x16\x46\xf0\x08\x50\xc8\xf4\x94\xe8\xb2\x28\xa4\x32\x3a\xa8\x08\x60\x73\xe9\xd5\xff\x04\x79\xb9\x47\xfe\x16\x5e\x66\x74\xcc\x32\xfd\xa7\xc3\xc3\xdf\x7e\x7b\xf9\xc7\xdf\x1d\x1e\xfe\xe5\x6f\xf1\xaf\x91\x85\xae\xde\x04\x6d\x3a\x32\x05\x21\xdc\xfd\xe9\xd8\xe8\x59\x92\xc8\x52\x18\xf7\x83\xa1\xa6\xd4\x83\x99\xd4\x66\x78\x1d\xfe\x2c\x64\xda\xfc\x4b\x6f\xe1\x04\xe4\x61\x89\x0e\x80\xf3\x9a\x9a\xd9\x9e\x49\xcf\x7a\x6b\xc4\xea\xa7\xb6\xdd\xde\x3e\xe1\x76\xd9\x19\x24\xec\x3f\xdf\xfa\xe9\x5a\x0e\x74\xa7\xb8\x31\x4c\x80\xdc\xc1\x54\x6e\x39\x71\xcf\x62\x6e\xc5\x66\xe7\xaf\x0f\x1e\x84\x78\x05\xa8\xed\xb0\x38\x98\xbd\x5b\x19\x22\x73\x20\xb4\x5e\x82\xaa\x74\xa4\xb3\xeb\xa1\xb7\xcc\xec\x7d\x21\xde\xde\xf0\xf6\xde\x67\x32\x58\x2e\xdc\xb2\x82\xa4\x79\x4a\xa4\xc8\x16\xe1\x77\x4d\x32\x0e\xd6\x08\x2b\x80\x06\x8b\xc4\x11\xbe\x1c\x24\x45\xd9\x73\x0d\x06\x39\xcb\xa5\x5a\x84\x3f\x59\x31\x63\xb9\x95\xd8\xfa\xda\x48\x45\xa7\xac\x17\xba\x63\xb7\xf0\x17\x76\xac\x7d\x60\xb9\x37\x8a\xd4\x49\xa9\x2c\xf3\xc8\x16\x9e\x82\xb0\xf4\x69\xcf\xa2\x07\xd3\x9e\x8f\x62\xd8\x8d\xab\x1d\x59\x6e\xd0\x16\x9d\xc1\xd5\xaf\x0a\x64\xc8\xb9\xcc\xca\x9c\xe9\x5e\x60\x4f\x28\xad\x8b\xb9\x95\x26\x97\xcc\x3b\xab\x9f\x8e\xa7\x2f\xe5\x73\xae\xa5\xda\x99\x0f\x72\x67\xf2\x94\xa5\xb1\x9a\xca\x44\xaa\x9c\x9a\xa0\x2e\x7e\x29\xa4\x06\x1d\xc0\xe1\x6c\x83\xa4\xbc\x3e\x68\xf5\xd9\x82\x1a\xc3\x94\x38\x25\xff\xef\xe8\xcf\xff\xf1\xcf\xfe\xf1\xef\x8f\x8e\xfe\xf4\xaa\xff\x7f\xfe\xf2\x1f\x47\x7f\x1e\xc0\x3f\x7e\x71\xfc\xfb\xe3\x7f\xfa\x3f\xfe\xe3\xf8\xf8\xe8\xe8\x4f\xdf\xbe\xff\xe6\xe6\xfa\xf2\x2f\xfc\xf8\x9f\x7f\x12\x65\x7e\x8b\x7f\xfd\xf3\xe8\x4f\xec\xf2\x2f\x2d\x07\x39\x3e\xfe\xfd\xcf\x5b\x4d\x8f\x8a\xc5\x87\x16\x07\x1e\x9f\xbe\xdb\x20\x2e\x0c\x9b\x32\xd5\xb1\x57\xeb\x6d\x25\xe4\x4b\xbf\x12\xda\xfa\x5c\x98\xbe\x54\x7d\xec\x7e\x4a\x8c\x2a\xb7\x1f\x8c\x8a\xa8\xed\x82\xe7\x1f\xfd\x69\x8d\x4c\xb1\x9e\x34\xef\x1d\x91\x35\x4b\x14\x33\xfb\xd2\x60\x70\x34\xcf\x3f\x0a\x99\x1e\x6a\x22\xd6\x98\x09\xd7\x4d\xfb\xdf\x42\xa9\xf1\x22\x05\xc2\xab\xe2\xbc\x13\x25\xf3\x01\x89\xcc\x42\x73\x9a\xf1\xd4\xb7\xbb\x65\x5b\xb4\x5c\xff\xbc\x28\x41\x3f\x2e\x25\x68\x84\xfb\xfb\xe0\x1a\x10\x13\xf3\x4d\x66\x9a\xa6\x4d\xd7\xb6\xad\x9b\xa3\xbd\x00\x65\x24\x29\x64\x51\x66\xd4\xac\x31\xdb\xad\xb0\x4d\x3b\xdc\xd7\xc1\x4c\x68\x37\x1a\xec\xc0\x8e\xca\xe5\xab\x8d\xa1\xe4\x2c\xcb\x08\x17\x78\x12\x60\x00\x6f\xcd\x53\x0c\xe5\x25\x42\xd1\xe0\x3c\xb7\x53\xb8\x9b\xb1\xa6\xa1\x91\x6b\xab\xeb\x28\xc3\xc5\x74\x40\xbe\xb3\xbf\x23\xcd\x72\xa6\x31\x2e\x48\x5e\x66\x86\x17\x19\x23\x81\xdb\xa2\x0d\x2d\x2b\x19\xa1\x5a\xcb\x84\x53\xe3\x66\xec\xee\x0f\xb5\xf1\xd3\x86\xd9\x18\x7a\x0b\xa6\xd0\x84\xa5\x4c\x24\x6c\x40\x3e\xc3\x75\x61\x58\xeb\xd8\x0a\x83\x60\xde\x87\x31\x28\x49\x4b\xbc\xda\x41\x7a\xb0\x7a\x8c\x61\x9e\x97\x06\x0c\xc5\x8f\x65\xc5\xb7\x3b\xee\x2c\x73\x91\x31\x1f\x48\x55\x10\xad\x29\xdc\x3d\xc8\x49\xa5\xba\xeb\xfb\x99\xef\xdb\x11\xde\x60\x6e\xdb\xca\xa9\x96\x28\x6e\x65\x63\xa8\x53\xda\xc7\xb6\x18\xb6\xa3\xb3\x3f\x49\x1a\xdb\x81\xbe\xb6\xa7\xad\x1d\x8c\x4b\x5d\xe9\x69\x5b\x6b\x52\xa1\xd8\x84\x7f\xe9\x80\x8f\x67\xa2\x52\x51\x78\xca\x84\xb1\x8a\x80\x02\x82\xaa\x58\xc1\x04\xe8\xe1\x8c\x26\x33\xa0\x0b\x8e\x8a\x56\x96\xe1\x87\xbc\x31\x42\x29\xa3\xfb\xf1\x1a\xad\x92\x62\x5e\xce\xd6\x4f\xfc\x6c\xb9\x5d\xdf\xff\xc1\x12\x32\x65\xa8\x5b\xac\x57\xae\x1b\xfb\x18\xf5\x70\x7e\x2e\xfe\x2f\xbc\xc0\xf3\x93\xb4\xda\x5b\xb8\x72\x2a\x24\x9c\xb5\x09\x37\x44\x5a\x89\xc0\x7e\x77\x40\x46\x2b\x7a\xe6\xd4\x24\x33\xd7\xe2\xf0\x50\x13\x34\xda\x36\x07\x1a\xa3\x89\x30\x2d\x33\x96\x12\xef\xb0\x81\x83\x76\x44\xa9\x9a\xab\xc2\x09\xd5\x9a\x4f\x45\xbf\x90\x69\xdf\x8e\x76\xb2\x0e\x21\x5a\x1c\xaa\xd8\xd5\x70\xfb\xc1\xda\x8a\x57\xc1\x38\xd1\x6e\x9b\x3e\x06\xfb\x5b\x24\x5b\x24\x32\x2f\x4a\xc3\x22\xe3\x5c\xb0\xeb\x8c\x17\xe8\x59\x14\xc9\x90\x95\x44\x74\x3f\x98\xe6\x54\xd0\x29\xeb\xbb\x8f\xf7\xc3\xc7\xfb\xe1\x5b\xf7\x01\x73\x1b\xaa\x85\x26\xc5\x4d\xe7\xb0\x0e\xbc\x77\x68\xb2\xc4\x97\x63\x67\x3a\xca\xe9\x17\x9e\x97\x39\xa1\xb9\x2c\x05\xc8\x64\xcb\xe0\x84\xcb\x6b\x96\xee\x07\x60\x2b\x00\xa5\xd7\x42\xaa\x25\xb4\x48\x67\xc4\x24\xcf\xd7\xb2\xd5\xca\xa2\xd5\xcd\x92\xd5\xc1\x82\xb5\xb3\xe5\xca\x1b\xa9\xdb\xe3\xe3\x47\x6f\x37\x6f\x60\x24\x17\x5b\x31\xd2\x1f\x70\x70\xed\x08\xe3\x70\x4d\x64\xce\x8d\x09\x2e\x59\x01\xc3\x7a\x84\x9b\x9a\xf5\xd3\x9d\x05\x3e\x41\x1a\xcb\x35\x61\x5f\xac\x36\xc5\xc1\x8a\xee\x6f\x2d\x7a\xc8\x65\xef\xb8\x06\x03\x1a\x15\x84\xe7\x45\xc6\x72\xef\x43\xda\xf7\xba\x99\x73\x32\x78\x39\x1f\x2f\xe7\x63\x55\x27\xdd\x45\x16\x89\xc5\x10\x34\x14\x8c\x59\x56\x89\x23\x16\xb3\x0b\x99\x6a\x27\x2f\x78\x1c\xb2\x67\xe1\xf2\x0b\xd7\xe0\x89\xfb\x91\x81\x65\x60\xc4\x8c\x26\x77\x33\xa9\x19\xf6\xa0\x8a\xb9\x71\x22\xd6\xe8\x2d\x21\x70\x8f\x00\x4e\xa3\x93\x49\xbd\x45\xca\x8a\x4c\x2e\x72\x90\x6c\x87\x26\x96\x67\x82\xe8\xc2\xf2\x22\xa3\x86\x05\xc1\x66\xb3\xb5\xe1\xde\x9c\x0f\xbe\x7e\xf9\xc5\x4a\x00\x51\x1c\x44\x0b\xd8\x36\x3b\xd6\x4d\x53\x0d\x48\x3b\x22\x93\xa3\xcf\xf2\x0d\x48\xf8\xd5\x1b\x80\xe6\xd9\xd5\xc5\x7a\x07\x49\xd2\xca\xbc\x42\xb6\x9b\x58\x96\x96\x71\xb6\x61\xaa\x0d\xe9\x15\x7d\x7e\xbd\x07\x2b\x7a\xa0\xf7\xd0\x78\xd5\x73\xee\x73\x21\x3a\x00\x1b\x2b\x96\x61\xe8\x83\x33\x34\xdb\x46\xce\x73\x7d\x3f\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\x3f\x4c\x7e\x4f\x4a\x60\x2b\xa3\x7c\x6d\x33\x40\xc9\x8e\x8f\x2a\xb8\x1c\x59\x48\xa2\x7d\xde\x6d\x04\x2d\x8a\x0c\xee\xeb\x64\x5b\xdf\xac\x96\xea\x18\x2e\xbf\xe3\xa4\xc3\x96\xc7\x0e\xb7\x76\xe6\x87\x1a\x11\xc0\x9e\x8e\x19\x2f\x9c\x37\x23\x5a\xeb\x7c\xfc\xc2\x67\xb0\xa3\x56\x31\x25\xf6\x24\x0c\x45\x8f\x5c\x49\x63\xff\x77\x89\x36\x51\x8b\x37\x17\x92\xe9\x2b\x69\xe0\xcd\x5e\x97\x8d\x53\xe9\xb8\x68\xec\x04\x07\x44\xe0\x99\x04\x83\x74\x14\xd0\x80\xbe\xa2\x40\x0a\x3d\x80\xb8\x26\x43\x41\xa4\xf2\xab\x0b\x56\x5d\xed\x86\xf0\x9a\xa1\x90\xa2\x8f\x6e\x84\xab\xc6\xb8\x0c\x3e\x94\x31\x4c\x36\x0c\xe7\x86\xba\xb1\x14\x18\x7f\xc1\x10\x96\x8c\x26\x2c\x25\x69\x09\x93\x86\x70\x0c\x6a\xd8\x94\x27\x24\x67\x6a\xca\x2c\xd3\x4e\x66\x6d\x41\xbd\x8d\x2e\xe1\xd3\x82\x3a\xc5\x83\x6e\xd9\x3f\x20\xc1\xef\x80\x4b\x74\x23\xdb\xd8\x07\xc9\x5b\x4e\x0b\xbb\x75\xff\xb0\x54\x0c\xa0\xf7\x2f\x52\x50\xae\xf4\x80\x9c\x79\xd7\xdb\xf8\x37\x67\x03\x8b\x87\xb1\x23\x58\xa9\xef\x87\x92\xcf\x69\x66\xe9\x26\x0a\x78\x0c\xc5\x3b\x3b\x7a\x93\x59\xf4\x1c\x2f\xb5\xe7\x1b\xfd\x5d\xb8\x26\x07\xb7\x6c\x71\xd0\x5b\xda\xee\x83\xa1\x38\x40\xfa\xba\xb4\xc1\x81\x18\x83\x47\xc9\x01\xfc\x76\x70\x3f\xfe\xf2\x00\xc2\xdf\xd6\xbd\x34\x32\x63\x2a\x0e\xfd\xdc\xb2\x87\x37\x55\x7b\x58\x5a\x75\xbd\x1b\x8d\xf4\x38\xb7\x14\x37\x5e\x6c\xb1\x67\xab\x9a\x17\xa0\x96\x31\x34\x99\xa1\x17\xb7\x9b\x17\xc4\xd1\x2c\x88\xdd\x33\x83\x74\x1d\x10\xc3\x71\x48\xa3\xe0\xd2\xe7\xb7\x01\xdb\x7a\x0c\xe4\xa7\xdf\x45\xfe\xed\xd0\xde\xfe\x11\x30\xe4\xb7\xfe\x5f\xbf\xbb\x67\xdc\x42\x3b\xc6\x86\x53\xea\x20\x60\x5c\x42\x07\xc2\x45\x0a\x17\x4c\x6e\xa9\x00\x01\x1c\xcb\xc2\x07\x96\x35\x20\x97\x96\x50\x91\x9c\x51\xa1\xbd\x99\x0b\x6e\xa2\xaa\xc6\xda\x5d\x99\x45\x7a\x95\x33\x29\x54\x27\x83\x91\x2b\x39\x72\xb6\xaf\x1e\xb9\x06\x5b\x6a\xf5\x06\x4e\xd2\x95\xbc\xfc\xc2\x92\xd2\xac\xbd\xcb\x8a\xe1\xb6\x95\x8b\x6c\x65\xf4\x35\x80\x7c\x5b\x31\x79\x5c\x59\x8d\xc9\x57\x18\x1c\xb3\xf9\x8d\x90\xb9\x65\x8b\x8a\xd9\x38\x11\x02\x48\x7e\xaf\xc2\x12\xcf\x0a\x90\x77\xfc\xb7\x37\x65\xe5\x63\x2e\xf0\x63\x38\xb4\xdf\x0a\x18\xdd\x03\xd4\x4a\x76\x59\x86\x9f\xd9\x07\xb8\xda\xc9\x19\x35\x98\x7d\xe8\x20\x63\x04\x2a\xb9\x5a\xba\x88\x44\x8a\xcb\x1f\x4a\x9a\xd5\x83\x10\xdc\x2b\xd7\x68\x89\xaa\xdf\xf1\x2c\x4d\xa8\x72\x5e\x5e\x18\xa6\xa9\x25\xee\x1e\x05\x42\x90\x50\x11\x4e\x7b\xb5\x47\x1a\xaf\x2a\x0b\xaa\x0c\x4f\xca\x8c\x2a\x1f\x39\xde\x2a\x50\x60\x2b\x44\x2b\xa4\x19\xb1\x44\x8a\xb4\x8b\x02\x70\xd3\xec\xdb\xbc\x6b\x2d\x98\xe2\x12\xbd\x8b\x79\xce\x9a\x48\x7a\x54\xb7\x69\xcb\x89\x3f\xd5\xe1\x88\xd5\x2c\x1f\x10\x9b\xe9\x19\x1e\x9f\x0a\xa9\x58\x7a\x1c\x91\xc7\x70\x2a\x06\xe4\xcd\xc2\x9b\x59\xc0\xe4\xe2\xa2\x2b\x34\x33\x3e\x10\xc6\xa3\xac\x03\x76\x75\xa0\x26\x52\x41\x70\xca\x51\x2a\x31\x22\x63\xce\x13\x73\x3c\x20\xff\x97\x29\x09\x1b\x2f\xd8\x94\x1a\x3e\x0f\xdc\x34\x28\xae\x8a\x51\x77\x83\xff\x8a\x1c\x41\x37\xc2\xf3\x9c\xa5\x9c\x1a\x96\x2d\x8e\x51\x8f\x65\x44\x2f\xb4\x61\x79\x9b\xad\x6b\x63\x34\x40\x5f\x3b\x68\xfb\xab\xaf\x37\xb4\xec\x1a\x43\xf5\xd9\x47\xa5\x54\x90\x41\x1f\x82\xc6\x16\x06\x1e\x24\x37\x88\x9b\xb1\x0f\x82\x0b\x6c\xf6\x92\x65\xbc\xc1\xdf\x5b\x3c\xa0\x44\x31\xc8\x40\xe0\x30\xf7\x9e\x38\x8e\xde\x94\xef\x65\x29\xd6\x9b\x04\x6b\x0b\x7f\xe7\x94\xf0\xcf\x51\xc7\xb5\x51\x8a\x8f\x22\x26\x44\x33\x89\x4c\x94\x94\x80\x5d\x12\xd8\xb9\x25\x0f\xd8\xaa\xf2\x44\xd9\x3a\xc9\xbd\x46\x24\xc2\x5c\xb6\x78\xbd\xef\x25\x6e\x31\x7c\xa8\x03\x2e\x83\x83\xb8\x03\x4c\x23\x6e\xcf\x38\x72\x00\xf8\x89\x10\xac\x10\x14\xbe\xc5\x52\xef\xc5\x66\xa9\x81\xeb\x4a\x0e\x4f\x0f\xf7\x42\x7c\x71\x39\x4a\x16\x74\x0a\xe7\xa9\xc3\xaa\x9a\x5d\x49\xca\x0c\x53\x39\x04\x5c\xcf\xe4\x1d\xfe\x8e\x6c\xab\x70\xad\x58\x5a\xc5\xb6\xcf\xa4\x06\xae\x54\x0f\x62\x84\xf3\x0b\x17\xa3\x77\x74\x41\xa8\x92\xa5\x48\x9d\xd4\x14\x08\xe8\xfb\xc6\x87\xaf\xa4\x00\x4a\x51\x6a\x0b\xab\x9b\x1a\x95\x1e\x33\x43\xed\xb1\x79\x3d\x78\xfd\x6a\x2f\x00\xeb\x18\xb7\x0a\xb3\x69\x58\x0a\xfd\x5d\xb9\x3f\x33\x7b\x99\x97\x62\x34\xfd\x20\xb2\x2e\xb2\xdc\x7b\x44\x2f\xe8\xda\x07\x25\x8c\x4f\xc0\x76\xdb\xc3\x57\x77\x8a\x1b\x16\x91\xc7\xa3\x09\xcd\x34\xb3\xaa\x7b\x29\x82\x08\x7b\x5c\x17\x41\xa0\x49\x9b\x05\x6d\xf7\x07\xd1\xe5\xf8\x9e\xe7\xcc\x1d\x28\x40\xb9\xea\x98\x05\x84\x3b\xd4\x1b\x8e\x5c\x3d\xb8\x93\x1c\x61\x4b\x2b\xb1\x49\x69\x8e\xf7\xe3\x24\x82\x0b\xb4\x9a\x75\x17\x95\xc4\xc7\x0d\x17\x7b\x5c\xed\x1b\x36\xa3\x73\xa6\x89\xe6\x39\xcf\xa8\xca\x20\x56\x70\x84\xf3\x23\xe3\xd2\xac\x8e\x40\xef\x16\xdd\x1c\xcf\x24\x1a\x6e\x2b\xa8\xfd\x3c\x2c\x9c\x80\x46\xf8\x79\xd9\xef\xe4\xa5\x29\x69\x96\x2d\x08\xfb\x92\x64\xa5\xe6\xf3\xfb\x9e\x26\x17\xfd\xb0\x03\xab\x6e\x72\xe9\x42\xa6\xa3\x82\x25\x8f\xc9\xa3\xeb\x1a\x86\x25\x55\xa9\xdf\x74\xe0\xc9\xa8\xec\x83\xe6\xbe\x00\xcf\xa7\x24\x61\x5a\x7b\x9f\xca\x45\xec\xe7\x19\xd6\xf0\x63\x49\x28\x40\xef\xf4\x65\x46\xb5\xe1\xc9\x9b\x4c\x26\xb7\x23\x23\x55\xa7\x98\xfd\xb3\xef\x46\x4b\xfd\x1b\x69\x18\xce\xbe\x1b\x91\x0b\xae\x6f\xe3\xc4\x2e\x78\x69\x1a\x9b\x4b\x28\xb9\x2d\xc7\x2c\x63\xe6\xf0\x50\x23\x97\xcb\x69\x32\xe3\x82\x79\x06\x27\x42\x48\x8a\x53\xf8\x2c\x94\xbb\xde\x99\xba\xc0\xa7\x13\x87\xaf\x3f\xa3\x77\x9a\xe1\xf4\xc7\x76\xfa\xf6\x67\xd6\x26\x22\x7d\xaf\xf7\x14\x38\x99\xe1\xc5\x9e\xee\x20\x26\xfa\xc6\xce\xb1\x9b\x71\xfb\xf0\x2d\xcf\x18\xea\x38\xb0\x44\xef\x95\xe6\xce\x01\xec\xd8\x42\x96\xe4\x8e\xa2\x56\x0c\x34\x70\x40\x6e\x78\x71\x4a\x2e\x85\x2e\x15\xab\xec\x19\x93\xc6\x50\x5c\x57\x91\x65\x5e\x9d\x82\x1d\x46\x95\xc3\x52\x3a\xa7\x5d\x91\xcb\x2f\x34\x2f\x32\xa6\x4f\xc9\x01\xfb\x62\xbe\x3e\xe8\x91\x83\x2f\x13\x6d\xff\x27\xcc\x44\x1f\x0c\xc8\x30\x0f\xf7\xec\x90\xfa\x47\x31\xef\xfa\x84\x1d\x2c\x33\x8e\xf8\xec\x83\x20\x88\x73\xa3\xb3\xd2\x5a\x2a\xc9\x1d\x66\xa0\xb0\x24\x9e\x29\x25\x55\xf0\x3c\x8f\xc0\x00\xdc\x25\x91\x79\xa1\x64\xce\x23\xc3\x1e\x20\xf8\x5e\xfd\xeb\xc0\xdc\xb0\x5d\x24\x5d\xde\x7f\xcc\xe9\xe6\x3a\x93\x3a\x73\x5c\xb7\xfb\xc3\x89\xf7\x98\x40\x55\xd1\xe9\xee\xa0\x7f\xba\x46\x76\xbf\xdd\x28\x96\x5a\xc5\x3b\xfc\x36\x44\xcd\x91\x93\x94\xcd\x4f\x74\x4a\x5f\xf7\xe0\x33\xda\x79\xfb\x99\xda\x9c\xa8\x26\x07\xaf\x0f\x06\x64\xe4\xb9\x6d\x2f\x9e\x63\xd5\x6e\x22\x55\x18\x10\x8c\xe9\xaf\x0e\xc8\x91\x54\x30\x72\x42\x05\xc9\x18\x9d\x3b\x03\x32\x9e\xa9\x05\xea\xb4\xc7\xad\xa3\x1e\xdb\x06\x80\x45\x5a\xfe\x7f\xfe\x72\x4b\xeb\x76\x92\xe8\xf2\xbe\x79\xcf\xc8\x03\x2b\x82\x1e\x80\x30\x29\x2d\x8d\xb5\x54\xd3\xb2\x55\x48\xab\xe5\xc6\xae\x16\xcc\xc5\x92\xa6\x8c\x03\x6c\xdc\xd4\x03\x90\x53\x0f\x9e\x80\xea\x92\x8e\xf1\xf5\x9e\xa4\x76\x85\xe6\x27\xc1\x7f\x28\x19\x19\x5e\x84\xc8\x7a\xa6\x34\xd7\xc6\x9e\xee\xb4\xc6\xc3\x38\x32\xb6\xa3\xb3\x9c\xfe\x5d\x0a\x72\xf9\x66\xe4\x3e\x7a\xfc\xa4\xe0\xd9\x4a\x24\xe8\xdf\x4b\xc5\x2c\x3b\xee\xe2\x30\xe0\xfb\x34\x39\xbb\x7d\x4f\x2e\xa8\xa1\xc8\xe0\x9d\xcb\x95\xa8\x28\xbc\xc5\xc2\x31\x17\xa9\xfb\x29\xe2\xdc\x8f\xcd\x64\xed\xee\x5d\x6d\x92\x97\xe2\x86\x9f\x3e\x0e\xf7\xc4\x8c\x13\xa0\xf1\xd3\xf7\x32\xed\xcc\x91\xff\x60\x01\x78\x8e\xfd\x49\x6e\x07\x20\x56\x67\xef\xc1\x71\x26\xf6\x3c\xbb\x7f\x7e\x67\x35\xce\xd6\xc4\xab\x15\x1b\xf1\xd0\xea\x38\xe7\x9b\x48\x4f\x07\xda\x61\x51\x03\xce\x8d\x63\x28\xe3\x4c\x8e\x89\xc3\xf7\x7d\xcf\xf7\xd3\xc7\xe1\x0e\xd3\xfd\xf4\x71\xf8\xb8\x53\xdd\x49\x3c\x6b\x4a\x67\x15\x0f\xae\xc2\x31\x9a\x62\x57\x7b\x99\x6b\xb0\x2f\x69\x6b\x9f\x70\x5a\x95\x55\x72\x0b\x94\x0e\x2f\xbf\x14\xe8\x7c\xe6\x8c\xfc\xa3\x19\x85\x38\xe6\x10\x5d\x07\x9b\x6a\x77\x59\x5b\xca\xee\xb7\xd7\x6a\x74\x40\x9f\xc8\x05\xc3\x2b\xcb\xf4\xd4\x3b\x02\x84\x1e\xab\x3b\xbc\x07\xb7\xcb\xf4\x14\xe9\x2a\x41\x2f\xcc\x34\xc2\xa6\x23\x34\x11\x89\xf0\x13\x9d\x53\x9e\xd1\x31\xcf\xb8\x59\x58\x0e\x7d\x3c\xa8\xb9\x96\x6a\x98\xf2\x5e\x0f\xf3\x8e\xa2\xc5\x92\x81\x8a\x1c\xd9\x91\x4e\xc0\xc0\x75\x3c\xa8\xa4\x8a\x19\x53\x2e\x08\x11\x45\x8f\x9a\xc8\xa1\x99\x01\x6c\x6b\x48\x1c\x6d\x51\x65\x3b\xbb\x07\xc0\xdb\xf3\xd1\x95\xa1\xd9\x3e\x2b\x19\x1a\xfc\x30\x72\x39\xe1\x9e\x33\x4f\xc3\x78\xa9\x56\x5c\x0d\xd0\x6a\x6b\xcb\xf6\x7c\xed\xa7\x8d\x53\x24\x04\xa3\xed\xc0\x04\xed\x54\x85\x63\x82\x3e\xbe\xbe\xe6\x46\x89\x58\x36\x72\xa4\xc4\xa5\x4b\x42\xbe\x69\x71\xeb\xdb\x16\xa9\x02\xba\x24\x58\xf0\x3b\xdf\x35\xe4\x6a\x06\x6e\x15\xdb\x91\xab\xf5\x6c\x12\x56\xcc\x26\x5d\xee\xa9\xcf\x59\x31\x7b\x3b\xaa\x9b\xe7\xec\x3b\xf2\x76\xb4\xe2\x5c\x02\x90\x61\xb5\x1a\x8d\x76\x87\x9a\x64\x7c\xc2\x0c\xdf\xb2\x84\x07\x38\x99\xb9\x14\xdc\x48\xb5\x3e\x2e\x99\x74\x3a\x6d\x7e\xb8\xae\xfc\xb0\xca\xe4\xf1\xde\x8d\x80\x0e\x70\x89\xcc\x32\x96\xf8\x3c\xd6\x00\x52\xff\x89\x55\xca\x0b\x73\x3a\x7b\xc8\xf2\x8f\x8a\xca\x09\x6e\xe8\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\xfd\xd9\x4c\xde\xf5\x8d\xec\x97\x9a\xf5\x79\x8b\x54\x21\x4f\xe7\x46\x88\x4f\xd1\x2a\x73\x55\x1d\xa4\x1f\x7c\x00\x23\xf9\xa4\xd1\x6d\x00\x4c\x39\xfe\x52\x48\x4a\xd3\x23\x8a\xba\x20\x45\xea\x2c\x41\x65\x96\x21\x94\x8d\x62\xac\x17\xab\xd4\x1b\x63\x33\x3a\x2f\x68\x57\x23\x42\xb5\xa8\x87\x25\xd0\x8f\x8f\x5c\x5d\x68\xfd\x76\x21\x62\x13\xe4\x46\x61\x0c\xef\x7f\x01\x57\x4d\x46\x82\x7f\x16\xf8\xdb\x4e\xa4\xb2\x58\xa3\xea\x18\xc0\x4c\x02\x8b\x3d\x29\x35\x53\x03\xc7\x31\x1e\x1d\x50\x1d\x92\xf5\xec\x90\x23\xad\x09\xa6\x8f\x6c\x82\x0e\xc9\x3e\x67\xae\x93\xa2\x68\x69\x66\x4c\x18\x9f\x72\xdc\x01\x63\x25\xdc\x9c\x87\xf3\xa3\x03\xaa\x65\x7a\xa0\x6e\xc9\x7c\x5e\x12\xe0\x74\x41\x43\x7b\x50\xee\x45\xb7\x43\x74\x94\xa2\xa9\x04\x17\x08\xcc\xe9\x56\x43\x30\x9a\xe6\x5c\x3c\xc3\x83\x98\x70\x91\x6e\x5b\x7f\x23\x71\x1d\xf4\xa8\xcb\x51\x38\x8a\xb7\x9e\x87\x9b\x38\xea\xf5\x1a\x0c\x21\x77\x77\x72\xf5\x1b\xb9\x56\x87\x2e\x5f\xe8\x1f\xb2\x3e\x7e\xa5\x5f\xa4\x15\x54\x5e\xae\xd7\xf6\x6f\xc0\x79\x84\x4b\xb3\x3d\xed\x2f\xf9\xf7\x13\x68\xee\x0d\xa9\x2e\x32\xcc\xbd\x78\x33\x54\x4d\xd1\x3e\x68\x0b\x33\x82\x61\xf9\x15\xa7\xbb\x5a\x10\x14\x54\xd1\x9c\x19\xa6\xd0\x75\xcc\x39\xa3\x09\xe7\xd5\xff\xa1\x60\x62\x64\x68\x72\xbb\xef\x14\xa2\x2f\xfc\xf4\xe1\xf8\xe9\xae\xb7\x65\xde\x49\x26\x0d\x98\xe0\x12\x0a\x2d\xe2\x9b\x59\x2e\x1c\xb3\x79\x26\x74\x25\xe4\xf1\xea\x62\x89\x08\x79\x9c\xea\x4c\xb4\xca\xeb\x85\xc6\x07\x70\x11\x0b\x89\xe9\xc0\xf5\x1d\xa1\xb0\x1f\xa6\xd7\xfe\x10\x38\x39\x66\x97\x7b\xa7\x8a\x1e\xe4\x32\x65\x64\xcc\x4d\x75\xd2\x35\x33\xa4\x60\x2a\xe7\x2e\x00\x5a\x0a\xac\xc1\xc7\x52\xe4\x5e\x96\x53\xb9\x4f\x47\x9c\x4d\x10\x99\x18\x5f\xe4\x8a\x8c\x99\xb9\x63\x4c\x90\x57\xaf\x5e\xbd\x02\x79\xe3\xd5\xaf\x7f\xfd\x6b\x02\x19\x17\x52\x96\xf0\x7c\xb9\x21\xb4\xfa\xaf\xd7\xaf\x07\xe4\x8f\x67\xef\xdf\x81\xff\x55\x61\x34\x19\x4b\x33\x73\x23\xdb\x06\xb5\xce\xba\x47\xfe\x67\xf4\xe1\xca\x8b\x09\xba\xf1\x2b\xa8\x14\x61\x79\x75\x67\xba\x57\xbf\xfa\xfa\xeb\x01\xb9\xe0\x0a\x22\x6f\x39\xc4\x0a\x04\x77\xc1\xc2\xbb\xd0\x09\x69\x96\x63\xdd\x1d\x9b\x70\xee\xb4\x39\x9f\xce\x0c\x56\x4b\x02\x4c\xc9\x78\x62\x30\xfb\x1e\x1e\x76\xcc\x85\xa4\x5d\x28\x89\x0b\x8c\x72\x8e\x23\x30\xb9\x1e\xc9\xf8\x2d\x23\x13\xfd\x8d\x92\x65\x51\x05\x04\x2a\xa6\xad\x8c\xea\x6a\x31\xe1\x60\xd5\x5e\x69\x66\x9e\xd4\x93\xa1\xa5\xa5\xa6\x86\x74\xc3\x9a\x00\xd2\x0b\xf9\xc7\xfa\x88\x09\x05\xe5\xc1\xb9\x0e\xae\x9b\x6b\xd9\xef\x83\x16\x99\x46\xe7\xd4\xc7\x77\x14\x4a\x7e\x8f\x9b\xc4\x85\x8f\x14\x72\x32\xaf\x76\x32\x97\x0b\xcc\x04\x9b\x2d\xaf\x47\xae\x5b\xbe\xe7\xa2\xe2\xa3\x18\xa3\xe1\x24\x0e\x46\x83\xd0\x6d\xae\xed\x27\x6a\xc9\x21\x57\x7c\x39\x2e\x4f\x68\x66\x1a\x77\xb4\x14\x4b\xbd\x5d\xad\x11\x47\x69\x5c\x05\x1a\x17\xe6\x55\x8d\x81\xee\xaa\x2e\x48\x26\xaa\x6b\x54\x4b\xd8\x56\x73\x92\xd1\xcc\x94\x0e\x34\xe0\xab\x64\xbf\xcd\xb4\x76\xb1\x36\x39\x55\xb7\x56\xec\x77\xe7\x7f\x00\x9e\xc1\x3a\xc4\xf9\x60\xd0\xd5\x9c\x85\x22\x75\xb1\x67\xbd\xfd\xc8\xe1\x60\x70\x88\x07\x44\x2a\xcc\x77\x89\xd8\x6e\xdf\x3f\x51\x4c\x71\xdd\x73\x9b\x16\x51\x09\x3a\x57\xda\x83\xd6\x3c\x82\xa9\x83\x54\x9b\x2c\xb7\x9d\xc4\x97\x6e\xf9\x82\xdb\x66\x0c\xc6\x96\x45\x9b\xb2\x05\x5d\x25\xa8\x0e\x09\x86\xd7\xd7\x4d\x71\x47\xa0\x5d\xce\xe0\xce\x39\x70\x09\x7a\x45\xec\x32\xc7\xae\x4c\xce\x05\xb1\xd5\x2a\x66\x3d\x7f\xae\x36\x9c\x60\xf8\x47\x9d\x56\x39\x5a\x10\x49\x08\x55\x75\xaa\x2a\x16\xe4\x59\x33\xaf\x18\x5d\xba\x65\x63\xef\xc2\xc8\xf0\x69\x77\x49\x80\xcf\xd2\x39\x08\x34\xb3\xa8\x55\xbb\xc8\xd0\x00\x00\x72\xa3\x3f\x2c\x03\xf2\xde\xd1\x54\x44\x2e\x3a\xd6\x32\x2b\x0d\x76\xad\x7e\x8c\x09\x2e\x0c\xea\x53\x0e\x00\x95\x0d\xcd\x22\xf2\x6b\xaa\x7a\x5f\xed\x28\x31\x3e\x1d\x0e\xe3\x4b\xea\xcb\x27\x4b\x2b\x5b\x65\xec\xd6\x0f\x96\x62\x36\xd1\xbc\x8b\xaa\x34\x1a\x92\xa3\xaa\x54\x86\xbf\xe6\x1e\x0a\xc3\xd4\x84\x26\xec\x38\x56\xa1\x42\x49\x92\xe0\x59\xe3\x63\x03\x66\x54\xa4\x19\x8a\xd6\x09\x53\x80\xf2\xec\x8b\x2b\x96\x6b\x3f\x91\x2a\x0e\x45\x60\x8f\xde\x30\x2b\x0f\x32\x6a\x4a\xc5\x5a\x45\x18\xed\xd7\xad\x10\xa6\xb1\x2f\xa5\x0d\x06\xeb\xea\x52\x01\x9d\xbc\x84\x2a\xa2\x63\x55\x81\x09\xa1\x8a\x20\xd5\xb1\x5a\x3a\xb0\xa8\x04\xf4\x18\x48\xc5\x42\x96\xca\xd9\xbd\x7d\x6e\xd1\x44\x2a\xab\x08\xe1\xc0\x54\x13\xc5\xa6\x56\x5a\x55\x20\xd6\x62\x8b\xac\xb4\x2f\xf6\xea\xfc\xb5\x67\x27\xb9\x4d\x2e\x6e\x13\x27\x3e\xcb\x39\x4f\x3d\x8b\x84\xbb\xa5\xaa\xc4\x5f\x41\x75\x14\x77\x12\xa5\x63\x8f\x20\x8c\xc2\x38\x30\xd2\x10\xd1\x59\xf3\x9f\x8e\xad\xbb\x12\x12\x3d\xb4\xa8\xa5\xd0\x85\x08\xcb\x94\x5d\x97\xe3\x8c\xeb\xd9\x68\x47\x53\xe0\xd5\x8a\x21\xd0\x61\x60\xe9\xa2\x6e\xad\x79\x50\x33\xa1\x39\xb0\x3c\x4b\xc6\x2d\xb3\x85\xda\xc1\x12\x80\xe8\x7b\xc7\x98\x29\x21\x30\x22\x63\x2e\x9c\xdf\xfe\x14\xcd\xc3\x45\x68\x61\x02\x8f\x94\x7d\x12\x45\xed\x7d\x42\xb3\x4c\x37\xa3\x57\x3d\xa1\x45\x99\xc3\x47\x6d\xe1\x9e\x72\xbb\xdd\xa1\x4c\x48\x23\x15\xe4\xda\x85\x69\x92\x4b\x8c\x70\x11\x44\x0a\xdf\x08\xf2\x90\xf8\x0e\x51\x54\x1f\xc4\xee\x02\xca\xec\xb9\x8e\xe2\x8b\x0d\xf4\xe1\x6c\xa0\x3b\xde\x34\x54\x95\x94\x68\x14\x11\x5c\x2f\xf5\xec\x49\xa9\x27\xb9\x5b\xae\x24\xf6\x7a\x2b\x80\xdf\x3c\x33\x58\x9e\xbc\x73\xce\xb3\xcf\x8d\xee\xc0\xa6\xad\xde\x01\x87\xb7\xef\x34\x8b\x24\xc2\x4c\xa7\x10\x84\x23\xb0\x7c\xe4\x2b\x9e\x03\xec\x06\x5f\x1e\x6a\x92\xca\xa4\x0c\xb9\x51\x01\x68\xd5\x05\x58\x9b\x0c\x82\xa4\xeb\x71\xea\x9e\xd6\x2a\xfe\xc8\x56\xac\x4a\xe5\x9d\xb8\xa3\x2a\x3d\xbb\xde\xe2\x97\x5e\x67\xe7\x55\xaf\x58\x50\xf2\x83\x41\x25\x3c\x3a\x96\xa5\xa9\xd2\x67\xfe\xb4\x4d\xcf\x46\x5a\x8a\xd0\xd2\xd2\x4c\x5e\x8c\xd7\x2f\xc6\xeb\xe6\xf3\xe0\xc6\x6b\xdb\xa7\x9e\x0b\xb6\x76\x5c\x7d\x8a\x01\x9e\xb5\x75\xa5\x7d\x48\x2b\x68\x44\x60\x90\xba\x37\xfd\xe0\x1b\x72\x1b\x1e\x91\x6a\x6f\x23\x59\xcf\x53\x20\x60\xd5\x4f\x6f\x31\x7d\x20\x3b\x68\xfb\x5a\xbd\xf8\xac\x73\xc1\xdd\x54\xbb\x17\xa4\x86\xa8\xd8\x6e\xcf\x65\x42\xee\x39\xbd\x4b\xa4\x55\x19\x3b\x4c\xc4\xdc\xa1\x54\x27\x3e\x1d\x81\x4f\x3a\x6f\x00\xe9\x58\x48\x17\x9f\xae\xbb\x41\x76\x28\xaa\x8b\xcf\x13\x97\xd6\xc5\xa7\xb3\x89\x9b\x74\x2f\xb3\xbb\x62\xb9\x0f\x5b\x6c\x77\xc7\xa5\x3d\xbe\xf5\xbe\x57\x95\x78\x7b\xfe\x6c\xfd\xc5\x7a\xbf\xf4\x3c\xa2\xf5\x3e\x22\xdc\x9e\x18\x38\x00\xc4\x16\xfd\xd8\xdc\xe6\xcd\xfa\x63\xe6\xc5\xca\x41\x95\x81\xcc\xa2\x9c\x37\xe8\x4b\x55\xbf\x36\x3d\x1c\x0c\x0e\x0f\xbd\x99\xdf\xe1\x67\x69\x26\xfd\xdf\x10\x26\x12\x99\xe2\xa6\xda\xf1\x95\x36\xc0\xf4\x2b\xed\x3c\x9e\x4b\xee\xbf\x15\x5f\xbd\xc2\xd8\xdd\xb6\xa4\xc3\x09\xee\x5e\x3a\x7b\x15\xa4\x1f\xa3\x80\x76\x5c\x26\xbb\x5e\x15\x1b\x5b\xdc\xa7\x14\x76\x0c\xbc\x07\xe7\xaf\xad\x8b\x63\xe3\xb3\x0b\x7b\xdd\xa1\x50\x36\x3e\x8f\x5c\x2e\x1b\x9f\x9d\x38\x6a\xa7\xd2\xd9\x2b\x16\xf7\x78\x05\xb4\xf1\x79\xa6\xc5\x54\xea\x4f\xa7\x62\xda\xf8\xec\x56\x52\xbb\xde\xb7\xe3\xd6\xef\xa5\xbc\x36\x3e\xdd\x8a\x6c\xe3\xb3\xef\x52\xdb\xf8\xb4\x84\x04\xd8\xc0\x2f\x78\xa7\xe0\x81\x4b\xd7\xa7\xee\xf9\x68\x58\x5e\x48\x45\xd5\x82\xa4\xce\xd6\xb0\x58\x11\x80\x19\x45\x60\xde\x3b\x2b\x0a\xcc\x3d\xe5\x6a\x4f\xf1\x03\x1d\x82\x2f\x59\xca\xcb\xb5\x25\x8b\xd7\x81\xed\x3b\xc8\x86\xe5\x32\x69\xf9\xcb\x4d\x1c\x2a\xa4\x12\xa4\xc9\xad\xab\x91\xe3\x61\x88\x9c\x3e\x4e\xb9\x73\xd0\xc8\x7c\x0c\xc6\x30\xb8\xe9\x73\xb5\x00\x7d\x63\x1c\xbb\x66\xb8\xc2\x2b\x0f\x77\xf7\x7f\xe4\x1a\x1e\x5b\xf9\xe3\x3d\x30\xbd\x47\xda\x13\xd2\x31\xc8\x8c\xff\x9d\x41\x81\xad\xce\x29\xac\x24\x88\xdd\xa1\xf0\x57\x26\x93\xe8\x62\xb9\xc6\x7e\x00\xea\x01\xb3\xbd\x61\xde\xc2\xde\x7e\x1d\x85\x07\xb0\xe8\x64\x1a\xef\xea\x78\x02\xb9\x1b\x41\x44\x07\xd8\x05\x78\xdf\x44\x65\xf0\x4a\x6d\xbf\x04\xa9\xd5\xa3\x36\xd5\x87\xee\x7c\x0a\x49\x13\x55\x2a\xab\x2b\x16\xf6\x97\x91\x87\x40\xa4\x94\x41\x78\x82\x97\xc2\x75\x09\x32\xa0\xfb\x8a\x93\x85\xe4\x04\xee\xa3\xaa\xba\x5f\x21\x7b\xe1\x12\x56\x09\x9e\xd5\xd1\xca\xa7\x6e\x0b\x0b\x2f\x85\xf3\x22\x58\xc2\x91\xd5\x28\x52\x6a\xa6\xfa\xd3\x92\xa7\xbb\x20\xc7\x33\xe6\x6e\xad\x79\x5a\x77\x4e\xd6\x91\x7f\xdd\x83\x6b\x05\x2f\x8b\x0e\x74\xff\xe0\x32\xb8\x66\xd4\x08\x7f\x9c\x12\xae\xee\xa6\x41\xbd\x27\x40\x38\x72\xfe\xbe\xe7\x26\xe8\xad\x8e\x21\x24\x8b\xc4\x85\xc9\xf2\x5a\x3e\x47\x1c\x16\x31\x0f\xbc\x52\xfb\xf6\x3f\x5e\xbf\xf5\xc6\xfa\x31\x9b\xc8\xaa\x04\x08\xaa\x3b\xce\x97\x36\x65\x19\x83\x3a\xe9\xbe\x06\xbb\x6d\x00\xd7\xbc\xb9\x9c\x5b\x64\xfe\xb3\x20\x9f\x7c\x52\x7a\x3e\x39\x25\xf4\xb8\x16\xaa\xe0\xca\xaa\x08\xc6\x52\x74\xb0\xcd\xaa\xef\xa8\x52\xe8\x1e\x19\x1f\x7b\x67\x13\x38\x71\xc2\xca\x7c\x99\x17\x67\x51\x69\x56\xcc\x02\x00\x02\x7e\x95\xcc\x89\x16\xb4\xd0\x33\x09\xd5\xf5\x13\x5a\xd0\x84\x9b\x85\x05\xb7\x51\x34\xb9\x85\x32\x3c\x8a\xb9\x2f\xf6\x48\x72\xec\xfc\xb5\x62\x08\xd6\xdd\x7e\xcd\x4c\xc9\x72\x3a\x03\x4f\x56\x6c\x95\x64\x54\x7b\x00\xac\xec\xef\xb4\x19\x4d\xd2\x85\xa0\x39\x4f\x42\xd2\x3c\x25\xe7\x5c\x73\xe9\xac\xb9\x38\xae\xc5\x7a\x72\x1d\xf2\x9e\xa1\x91\xf8\x3c\xa3\x3c\x27\x47\x9a\x31\x12\x10\x03\x7f\x71\xd5\xda\xd1\x78\xa1\x98\xed\x1e\x5b\x90\x65\x48\xde\x2d\x5c\xc6\x81\x8a\xd2\x85\x2b\x2a\x64\x94\x70\xdc\xd2\xd5\x9f\x3e\x0e\x5b\xb7\x7a\x66\x52\xc1\xc5\xbc\xcf\x5a\xc9\x44\x2a\xa3\xeb\xc9\xb3\xeb\xa1\x8e\xd5\x0e\xc4\x33\x97\xdb\x0d\x7e\xc8\xa4\x98\xc6\x21\xfb\x15\x96\x5a\xb2\x2a\xa0\x96\xc9\x9c\xa7\x25\xcd\x90\xa0\xba\xc9\x9c\x8f\x86\xd8\x9d\x4f\x67\xa6\x7f\xc7\xc0\xec\x82\x7c\xa7\x72\x6d\xf2\x1f\xe5\x4b\x6e\x39\x5c\x03\x01\x36\xce\x6c\x80\x26\x2c\x3b\xb5\x3b\xba\x80\xfc\x2e\xce\x85\xa4\x76\x33\xea\x73\x6b\xe1\x10\x01\xee\x11\xd0\x61\x7a\x67\xa1\x36\x85\x95\x18\xc0\x2e\x65\xa1\x0c\x58\xbb\x3c\x37\x0b\xf8\x28\xd7\x5d\x78\xed\xca\x90\x51\xbb\x47\x20\xc5\xfd\x59\xa0\x85\x09\xae\x3b\xc6\x91\xef\x15\x0c\x81\x76\x6c\xcc\x70\x04\x8e\xf5\xee\x18\x7e\xc3\x04\x53\x3c\x69\xa0\x4e\xe8\x3a\xa5\x06\x0e\x1f\x13\xb6\x5b\x3a\xd8\xac\x1a\x3d\x80\x8c\x37\xaf\x50\xe9\xc6\x55\x23\xec\x28\x7d\x1c\x7c\x17\x59\xe1\xa2\x7b\x13\x7b\x4a\xa9\x48\xfb\x34\xb3\xf8\x79\xfd\xf9\xdc\xf9\x45\xe3\xb9\xab\xf9\x05\xf8\xc2\x42\x5c\x84\x4c\xd4\x56\x4a\x59\x79\xdc\x20\x00\x7e\xcc\x52\x20\x53\x71\x0d\xc6\x3b\xab\x70\x3b\x14\xb9\xfe\x7c\xde\x23\x7c\xc0\x06\xfe\xaf\xd0\xd4\xd3\x49\x23\xa7\xe8\x55\x18\x3c\x45\x01\xbb\x61\x2a\xb1\x6d\x2b\xee\xfb\xb7\xdf\xda\x49\xda\x5f\x7f\xd7\xff\x6d\x94\xdb\xf3\x77\x7f\xb3\xfb\xad\x6c\x83\xfa\xdb\xd8\x35\x2d\x24\xb2\xff\xdb\xb5\x4b\xf4\xec\xd2\x40\xff\xcd\xd5\xb7\x62\xc2\x58\xc1\xf4\x5a\xc2\xa5\x3f\x4f\x11\xe7\xe1\xdb\x8a\x7d\xef\xed\x94\x00\xa6\x60\x23\x4a\xa8\x61\x02\x58\x83\x8f\xe1\x10\xd2\x60\x77\x57\xca\xd5\xce\xff\x08\x2c\x0c\x18\x6e\xd6\x23\x46\x4a\x38\xf4\x48\x58\xce\x04\x61\xbe\xfc\x25\xae\x15\xc0\x41\x9d\xdf\x9b\xe7\x76\x76\x58\x0b\xe1\x10\x91\x6b\xe7\x01\x73\xfb\x85\x90\xe6\x17\x61\xfb\x1b\x85\xb9\xe9\x5c\x72\x9f\xd3\xdb\x9e\x47\x81\x45\x12\x43\x96\xe9\xf1\x82\xe4\x5c\x1b\x7a\xcb\x06\x64\x64\xb9\x59\x7c\xb9\x86\xd0\x13\x04\x72\x41\xb2\x94\x94\xc2\xf0\x0c\x7e\xad\xc6\xb1\x53\x8e\xb9\xdc\x70\x42\x74\x09\x15\xc3\x0b\xc5\xfa\x9e\x6f\xba\x56\x4b\x14\xa7\x5a\x4b\x2f\x6c\xf6\x8c\xa2\xb2\x51\xa4\xd0\x15\xe0\x41\x85\x43\xaf\x25\x6f\x30\x3b\x4f\x29\x92\x8a\x57\x02\x30\xf5\x80\x5c\x01\x7b\xcc\xfc\x0d\x33\xea\x3d\xce\x1e\x2a\x58\xc2\xb4\xa6\x6a\xd1\x83\x5c\xe9\x3c\xe4\xd7\x76\x0e\x40\x40\x3c\x72\x2a\x30\x53\xb9\x62\x89\x14\xda\xa8\x32\x31\x58\xba\x6e\xac\xe4\x2d\x13\xc1\xfb\x30\x10\xa6\xe0\x06\x56\xb9\xe3\xc0\xf5\x99\x24\xc9\x8c\x8a\x69\x54\xfa\x25\xa7\x29\xc0\xfe\xdb\x20\x57\xf9\xf5\x58\x08\xd0\x89\x15\x65\xb8\x01\x50\x8c\x2d\xc3\x0a\x56\xdd\x3f\x0b\xe2\x15\xf7\x5e\x65\x76\xb5\x4b\xe2\xd9\x16\xda\xd5\x89\x7e\x91\x8e\x36\xc2\x3e\x48\x09\x7b\x76\x23\xcb\x99\xa1\x29\x35\x74\x07\x57\xb2\xf7\x55\xbd\x3a\x5f\xb2\x1e\x6b\x86\x86\x7b\x4e\xc7\xed\xbc\x80\x27\x0b\x1e\x87\x4b\xc1\x49\x9c\x79\xc8\x43\xfc\xb5\xb1\x38\xe5\xee\x1d\xd0\x43\x0c\xc4\x27\x5f\x10\xcc\x0e\xef\x47\x43\x72\x51\x55\x3b\xac\xc8\x49\xbb\x5b\xad\x8e\x06\x5d\x0b\xfa\x1d\x60\x74\x53\x5d\xbd\x25\x75\x77\xb1\x95\x82\x0e\x72\x09\x26\x0c\x57\x2c\x8e\x4e\x73\xa0\x2b\x05\x22\x79\x03\x88\x00\xe5\x29\x33\xba\x72\x78\x41\x3a\x6c\x89\x8b\xe3\x77\x4e\xfd\x05\x22\xed\x00\xeb\x34\xc8\xd5\x12\x17\x82\x5d\x4b\x47\x67\x2d\xe5\x7f\x10\xb8\xee\x62\xc3\xc6\x0c\xfd\xef\x65\xda\xc5\xec\xdd\x48\x6c\x5f\x0d\x51\x79\x81\xa2\x3f\xaf\x06\x33\x02\x7e\x03\x2e\xbf\x74\x2d\xc6\x0e\x89\xdc\x8c\xce\x77\xb7\x79\x55\x92\x58\x3f\x24\x05\x86\xcf\xf5\xe1\x73\xfd\xd7\xed\x6d\x83\x5d\x1c\x4a\xfc\xd3\xda\xb1\xa4\xfe\x91\x4e\x86\x58\x4b\x52\x46\x1d\xad\xa7\xcd\x8c\xe5\x81\xda\xbb\xeb\xc8\x70\x05\xec\x42\x26\x18\xb7\x74\xe2\x94\xfc\xa2\xc6\xdf\x9d\x1c\x15\xb4\x32\xf4\xf4\x3d\xf2\x6a\xda\xc0\x6d\x82\x0f\x48\xaf\x37\x3f\x6e\x0c\x06\x82\xc5\x6a\x8d\xc5\x7b\x14\x07\x61\xcf\x0a\x66\x0a\xec\x72\x3e\x90\xc1\x22\x96\x92\x59\xc6\x14\x2c\xc1\xa9\x69\x8d\xeb\x78\xc8\x25\x8a\xc6\xe1\x5e\x50\x87\x83\x74\x29\xd8\x5d\x10\x23\xa8\xc6\xac\x2d\xfe\xea\x8c\xb9\x2a\x74\x6b\xc7\x0b\x5e\xcf\x67\x62\x81\x53\xbf\x08\xdb\xb2\x4e\x38\xef\xc5\x15\xdd\x60\x2e\x34\xbb\xa3\x0b\x0d\x18\x5f\x69\x0b\xe1\xfb\x2e\x43\x5a\x35\xf0\x47\x36\xc1\xde\xad\xaf\xd6\x76\xba\x5c\xdb\xe5\x7a\x0d\xe2\x2e\xb9\x68\xe3\xcb\x54\x75\xd8\x58\x85\xa3\xf9\xec\x72\x1f\x07\x0e\x2f\x70\x0f\xdf\xed\x72\xa5\x9e\xf2\xf4\x7a\x08\x43\x78\x69\x7c\x0a\x7f\x78\x5e\x13\x6e\x1f\xc6\xcc\x62\x75\x15\x51\x0d\x18\x12\xf7\x5d\xe1\x92\x50\xa1\xd6\xb7\x90\x16\xd5\x19\xa0\x43\xd9\x2e\xc5\xc0\xa5\x04\xbe\x38\x80\xb4\xff\x54\x2c\x1c\x0f\x37\x33\xae\xd2\x7e\x41\x95\x59\xa0\x7a\xda\xab\x7d\x2d\xb8\xe7\x77\x5a\xf8\x8e\xf7\x42\xed\x32\x0e\xaf\x85\x30\x2c\xde\x97\xde\x73\x86\xff\xb5\x70\x7d\x8c\xf5\xb4\x0f\x00\x58\xb9\x9e\xab\x28\x1e\xde\xeb\x82\x4f\xb6\x9e\x34\x26\x1f\xbb\x72\x8c\xc6\xad\x2d\x12\xfe\xb8\xf2\x93\x8c\x1d\xa8\x03\x47\x07\xe5\xc7\x4e\xa0\x67\x75\x4e\x5a\x95\xea\x8e\xcc\x86\x4e\x2a\xf0\xee\x37\xae\x50\x90\x58\x38\x63\x50\xfc\xad\x78\x80\x70\x2e\xc8\x91\x90\x02\xcf\x0a\xb6\x3d\x46\xef\xa3\x35\xd6\x2e\x68\xe2\x2a\xbc\xd5\x0b\x6c\x46\x67\xd3\xb3\x05\x2e\x52\xbb\x59\x40\xab\x41\x1f\xd2\x65\x92\x30\x16\x34\xe8\xb8\xde\x4b\x75\x96\xdd\x94\x7d\xa5\x48\x2d\x21\x95\x8b\x36\x34\xcb\x2a\xcd\xd5\x81\x4b\x02\x67\xf3\xc6\xc5\x88\xe1\xd5\x42\x73\x9c\x12\x0f\x35\xc8\xd1\x63\xa6\x14\x09\xde\xfe\x73\xb3\xf0\x33\x88\x39\x10\x74\x03\x95\x41\xa3\x42\xcb\x27\x68\xc9\x8a\x44\xff\x00\x4c\x20\x46\xae\x02\x7a\x9d\x17\xb9\xb4\x0d\x96\xf2\x8c\x69\x72\x7b\x47\x55\x0a\x95\x70\x0b\x6a\x38\x26\xe2\xee\xd5\x86\x3d\x8a\xe6\x00\x75\xe8\x63\xe4\x3b\x0e\x0a\x06\x94\xd7\x90\x8d\xcf\x10\x5a\x1a\x99\x53\xc3\x13\x50\x5b\xf9\x24\xb2\x4b\xe6\x21\x6f\x61\xa3\x6a\x1f\xd0\xd5\x50\xff\xfd\x06\xef\x7a\x14\x23\xe6\x4e\x12\x9e\x5b\x99\x80\x42\x01\x8a\x49\x88\x31\xf2\x46\xd4\x4d\x33\xb5\x82\xcf\x77\x60\xc2\x8e\x5a\xa1\x42\x6c\xd5\x25\x0d\xc3\x07\x1b\x69\x30\x0e\xba\x20\x9d\x5e\x83\x65\x13\xdf\xcb\x62\xb5\x9d\x6d\x84\xac\x3d\xbb\x41\x77\xcc\xca\x02\x7a\x23\xca\xea\xc1\xaa\x39\x61\x51\x58\x4d\x52\xae\x1b\x95\x9d\x8f\x52\x25\x8b\xc2\x99\x43\xf2\xe3\xe5\x39\xc1\xcd\x84\x9a\x33\x1d\x95\x2f\x46\x4b\xf8\x94\x89\x50\x7f\xdb\x65\xbb\x80\xd3\xdb\xfc\x08\x78\x76\x91\x28\xf9\xd9\xd1\x59\x56\xcc\xe8\x31\xf9\xe4\x0a\xf5\x04\xfc\x0d\x7e\x7b\xad\x24\x26\x34\xb0\x78\x8b\xe6\x8b\xa8\xd3\xf2\x79\x11\x75\x5e\x44\x9d\x7f\x6f\x51\x27\x38\x8c\xed\x2a\xe6\x7c\x0c\x5e\x92\x8d\xb2\xde\xde\xe3\xa0\x72\xa3\x7c\x78\xbb\x45\xf8\xd6\x03\x53\xc0\xdd\xa8\x0d\xba\x4e\xdc\x03\x73\x0e\xdf\xa1\xf3\x45\x55\xe1\xd9\x44\xfe\x20\x95\x2f\x8a\x95\x36\x4a\xc3\x22\xd0\x3b\x26\xd4\x19\xd6\xb5\xd8\xd2\x13\xac\x2a\xd2\x0f\xc3\xf6\x2b\xf7\x8f\x16\xa9\xc5\xe3\x67\x27\xa8\x93\x7b\x84\x51\xc6\xcf\x33\xf6\x00\x69\x2c\xb6\xbb\x8f\x23\xb9\xa7\x9f\x23\xb9\x8f\xaf\x23\xd9\xa7\xbf\x23\x09\x5e\xd3\xf7\x39\x31\x1f\xbd\xbf\x76\xe3\xcc\x38\xe2\xb4\xe9\xcc\xd4\xa2\xf5\xc3\x38\x5c\xfb\x8a\x75\xee\xb6\x2f\x9c\x01\xb0\x97\xc5\x5e\xb7\xee\xb4\x82\xe2\x83\x57\x7a\xec\x4b\xc8\x8d\x1b\xf1\xfa\xaa\x7c\xb3\x91\x70\xfd\x9f\x17\x98\x66\x07\x4e\x5d\xdf\xf9\x46\x79\xc5\xe2\xe5\x04\xbf\x9c\xe0\xb6\xfd\x9f\xf2\x04\xa3\x5f\x71\x17\xb7\xf7\xba\x5c\x8d\x97\x78\xe4\x87\x92\xa9\x05\x91\x73\x16\xf9\xd3\x40\x12\x60\xcd\x53\xe7\x91\xe2\x6c\x0e\xed\x65\xd9\x47\xe4\xf9\x60\xd1\xb8\xfc\x62\x25\x23\x88\x10\xbb\x07\x2d\x6b\x0e\x55\x0f\x02\x46\x68\x79\xa0\x7b\xe2\x65\xa9\x88\x1e\xb8\xec\x60\xd5\x1b\xd0\xf7\xcf\xae\x2e\x76\x53\x00\xba\xdd\xef\x90\x5d\xee\x78\x96\x16\x7f\xb6\x61\x81\x08\x88\xf0\x4b\xbd\xfe\x51\xd0\xd2\xc9\x2d\x5b\xf4\xdc\x95\xb0\xcb\x6b\xee\x1b\xa3\x67\x43\x3d\x19\x67\xdb\x24\x10\xab\x00\xb4\x03\x55\xdc\x4d\xab\xc6\xa7\x7d\xfa\xc6\x7a\x2f\x0f\x84\xae\xc4\x77\x67\xb2\xdd\x29\xcd\x63\xfc\xd4\x50\xc1\xa5\x26\x05\xc7\x39\xc0\x09\x48\x69\xe7\x9d\x8a\x03\x1a\x80\x23\x35\x50\x8b\xae\x9b\x48\x76\x57\x0d\xf1\xf1\x80\xbd\xf7\x52\x03\x9a\xd6\xbc\x62\x6f\xd9\xe2\x50\xbb\x78\x3c\x29\xf4\x8c\x17\x3e\x8b\x3a\x50\x02\x87\xb9\xe4\x33\x5c\x95\xfb\x21\xf0\xcc\x0f\x45\x8f\x5c\x49\x63\xff\x77\x09\x5e\x33\x68\xc8\x93\x4c\x5f\x49\x03\x6f\x1e\x1d\x58\x38\xdd\x7b\x83\xca\xd9\xf0\x38\x58\xe0\xd0\xbb\x0b\x62\x21\xbc\x37\x06\x80\xc4\x5d\x40\x06\xb0\x72\x4d\x86\x82\x48\xe5\x61\x62\x7c\xda\x5d\xed\x86\xf0\x36\x97\xc8\x60\xba\x62\x0c\x07\x4a\xa9\x6a\x90\xdc\x30\x5c\xb0\xbd\x72\xff\x0b\xd8\x64\xc0\x58\x1d\x5c\x48\x20\x79\x2c\x35\x6c\xca\x13\x92\x33\x35\x85\xc8\xcb\x64\xb6\xfb\x06\x75\xa7\xdb\xf8\xec\x44\xbd\xe3\x0f\x77\xc6\x0c\x60\x75\xef\xc0\x89\xe7\xbe\x0c\x13\x47\x41\x16\x91\xd3\xc2\x22\xc5\x3f\x2c\x27\x80\x7d\xf9\x17\x24\x7b\xd6\x03\x72\xe6\x2b\x70\xc6\xbf\x39\x43\x5b\x3c\x8c\x1d\xc1\xca\xf1\x3f\x94\x7c\x4e\x33\x86\xae\x6d\x54\x84\xbc\x98\x72\xb2\xc4\xa6\x7b\x2e\xe3\xb3\xa5\x52\xe1\xe2\xe4\xe0\x96\x2d\x0e\x7a\x4b\x88\x74\x30\x14\x07\x55\xf8\x73\x0d\x75\x02\x43\x03\x9b\xfa\x01\xfc\x76\xb0\x6f\xce\xfe\x44\xe2\xfc\x0e\x58\xe2\x8c\x40\xe7\x19\xd5\xba\x5b\xe4\xe8\xfa\xfc\x63\xa3\x68\xcc\x2a\x82\xc7\x39\x2c\x26\xe8\x10\xb5\x3f\x5b\x15\xf8\xd1\x77\x77\xae\xe9\x04\xa5\xb9\x2b\x1f\xd2\x3e\xf5\x41\x93\xaa\x86\x01\x42\xa0\xc4\x5d\x1c\x6b\x56\xdd\x49\xae\x81\xd7\x67\xb8\xf5\x90\x93\x38\x5f\x22\xd7\xa0\xe2\x72\x1f\x3a\x21\xa4\x21\x5c\x24\x59\x99\x62\x9e\x47\xe8\x0a\x0a\x72\x57\x91\x7e\x07\xe0\xdc\x03\x79\x3e\x87\x01\xbc\x3c\xe2\x6f\x3f\x97\x7c\x56\x9b\xd7\x54\x70\x35\x18\x6e\x7c\x10\x56\xfb\x5e\xeb\x64\x8b\x87\x60\x3d\x9d\xe5\x79\x5d\xc6\x78\xcb\xc7\x8a\x91\xf3\x19\x15\x82\x65\x51\xbc\xa8\x33\x64\x84\x12\x4e\x20\x78\xb8\xc2\x4d\x87\xf5\xca\x4d\x9e\x8e\x89\x10\x9d\xbc\xf7\xea\xb5\x3f\xee\x42\x4a\x7b\xab\x84\xed\xb2\x1a\xce\xe4\x1d\x49\x25\xb9\x83\x5c\xfe\x73\xcb\x8e\xe0\x26\x52\x7b\x46\x16\xcd\x14\x7c\x03\x12\x99\x17\x4a\xe6\x5c\x7b\x0f\x70\xb7\x71\x7b\x0d\xb0\xcc\xca\x16\x79\x73\xd6\x25\x5c\x79\x7b\x4e\x0c\x55\x53\x66\xec\x30\x44\x94\xf9\x98\xb5\x0e\xff\x7c\x88\x84\x5d\xcf\xbd\x42\xd4\x7e\x8b\x3c\x21\xe8\xbf\xfb\xee\xaa\x73\x29\xd8\x55\x3b\x78\x27\x55\x96\xde\xf1\x14\x2f\xbd\x34\x39\xb2\x03\x1f\x3f\xff\xba\xad\x77\x77\x3c\xbd\x1f\x00\xbc\x67\x8f\x05\x00\x01\x08\xb8\xca\x45\x1c\x72\x4a\xc3\x07\x8e\xc9\x25\xc7\xd8\x18\xfb\x17\x66\x6d\xc9\xc7\x5c\x54\x51\x58\x61\x33\x80\xae\xda\xf3\xe0\xb5\x09\xcd\x0c\x46\x35\x40\x60\x80\x34\x33\xa2\x79\x5e\x66\x86\x0a\x26\x4b\x9d\x2d\x5a\xa3\xc5\xd3\x00\x79\x92\xb1\x2f\x88\xc5\x5d\xf8\x55\xe8\x54\xe7\x5b\x53\x8c\xfd\xf2\x30\x5f\x62\x5c\x95\xbb\x50\x7a\x12\x98\x58\x08\x96\x61\x5f\x58\xe2\x3c\x5b\x8b\xac\x9c\xf2\x2d\xce\xfb\xff\x66\x29\xbe\xab\x24\xca\xa5\x66\x55\x64\x7b\xdb\x22\x26\x4f\x97\x91\xfb\x41\x99\xf5\xcd\xea\xb4\xdb\x29\x2b\x98\x48\x21\x23\x58\x84\xab\x38\xdd\xbd\xc2\xca\x65\xd7\xda\x9d\x42\x5d\x7e\x31\x8a\x5a\x72\x93\x43\x50\xa5\x4b\xd6\xc5\x27\x84\x8a\xf6\xa4\xe3\x79\x64\xc1\x25\xff\x76\x3c\xfa\xc1\x8b\x24\xdf\x2f\xf7\x3a\x52\x51\x87\xf6\xba\xee\xb0\xba\x22\x47\xba\xfb\x4a\xec\x59\x7a\xdf\x5c\xe9\x7a\x45\x7a\xe8\xc6\xac\x5e\x8a\x47\xfe\x28\x12\xa7\x4f\x20\x26\xb5\x4b\x3a\xa1\xb7\xd8\xa3\xa1\xd9\xba\x97\xcd\x62\xc4\x1b\x34\x59\x87\xb7\x11\x49\x87\xdc\x9d\x6e\x20\x17\x57\x43\xb4\x85\x65\xe5\xc2\x55\x0a\xb1\x8d\x58\x3d\x44\x3e\x6c\x6a\xa8\x66\xa6\x9d\x55\x63\xd9\x2d\xcd\x73\x7a\x1c\x05\x13\xb0\x83\x43\xb4\x0f\xcc\x24\xfd\xdf\x39\x99\x40\xd4\x5a\x5a\x69\xc0\x03\xc4\x67\x1c\x62\xe1\x9a\x16\xc7\x48\xed\x36\x24\xd4\xb4\xae\x16\xd3\x8a\xde\xbb\x19\x7c\xfa\xd4\xb9\xa4\xa8\xed\xd2\x58\xf1\x20\xe4\x1b\x28\x05\xff\xa1\x8c\x25\x75\xc8\xcd\x10\xd6\xe8\xda\xef\x6b\x21\xd3\x84\x55\x26\xa2\x0b\xae\x6f\xbb\x24\xcd\xfa\xe6\xfc\xb2\xde\xb9\x8e\xf0\xdf\x9c\x5f\x12\xf7\xb6\x95\x15\xa7\x8b\x19\xe7\xbe\x39\x9d\xa6\x09\xab\x4c\xa3\x29\xd7\xb7\x8f\x5e\xb0\xbb\x48\xaf\xb6\xf9\x19\x3f\xb6\x95\xc9\xe7\x15\x89\x92\xdf\x2c\x64\x49\xee\x5c\x24\xbd\x13\x6a\x6f\x78\x71\x4a\x2e\x85\x2e\x15\xab\x6e\x3f\x9b\xf2\xad\xe5\xa4\xcf\xa9\xb0\xf7\xbd\x70\xe3\x39\x9b\xb9\x0a\xaa\x0c\x48\xb6\x9d\xf3\x88\x41\xaa\x7c\xd7\xd9\x2f\x61\xcb\xd6\x0f\x27\xde\x07\xad\xe7\xa2\x84\x43\xb2\x2d\xdf\xc8\x6e\x76\x94\x18\x23\xde\xde\xb7\x21\x35\x0d\x39\x49\xd9\xfc\x44\xa7\xf4\x75\x0f\x3e\xe3\x43\x59\x4d\x6d\x4e\x54\x93\x83\xd7\x07\x03\x32\xe2\x39\xcf\xa8\xca\x16\xb5\xdc\xc0\x55\x3b\xcb\x02\xfc\x80\x70\x99\xf5\xea\x80\x1c\x49\x05\x23\x27\x54\x90\x8c\xf9\x38\x19\x77\xa0\x16\x28\x02\x1e\x3f\x36\x15\x21\x0f\x6a\x23\x44\x82\xd2\x15\x0d\x3e\x21\xbb\xa9\xa5\x41\xb9\xa8\x28\x36\x17\x96\x8c\x0f\xc8\xa7\x55\xa5\xaf\xe1\x6c\xf8\x16\x4f\x05\xca\x07\xd5\xcd\xee\x59\x37\x7f\x49\xa1\x7b\x3a\x30\x6d\xd7\xea\xa6\xdc\x7c\x64\x85\xec\x24\x00\x60\x97\x86\x25\x8c\x1b\xfb\x42\x6a\x0e\xf9\x32\xa9\x81\xea\xb3\xca\xf0\xa4\xcc\xa8\x95\x89\xd1\x0e\x36\x20\x17\x97\xd7\x1f\x2f\xcf\xcf\x6e\x2e\x2f\x4e\x89\x1f\x89\xc7\xd2\xda\x80\xdc\xc4\x59\x84\x22\x97\x57\x97\xaa\x25\x7c\xab\xe7\x88\x0f\x15\x55\x1a\x42\xc8\x0d\x41\x05\x19\x0a\x6e\xaa\x2c\xbd\xe8\xa4\x95\x49\xe1\xdc\xae\x6c\x6f\x67\x87\x9b\x72\x74\x9d\x10\x6e\x30\xfb\x73\x7d\x34\x38\x1d\x98\xf1\x33\x4c\x65\x8b\x16\xf7\x00\x92\x43\x05\xdc\x7d\xc9\xee\x3e\x31\x67\xc7\xe3\x71\x83\x06\xf6\x2a\x37\x2a\x52\xfc\x90\x0e\xdc\x67\x45\x59\x51\x28\x99\x58\x5e\x72\x38\x38\xf4\x82\x42\xb6\x94\xfa\x3d\x0c\x1a\x27\x7e\xaa\xe3\xd6\x80\x90\x0f\xde\x85\x19\xa2\x56\x57\x67\x91\xc7\x54\x02\x51\x2e\xf2\x06\x86\xfa\xd2\x00\xe5\x38\xfe\xa8\xcb\x14\x35\xe5\x73\x26\x70\x61\xfb\x25\x48\xfe\xf3\x1d\x61\xfe\xb1\x9a\xf7\xa7\x8f\xef\xf6\x3b\x25\x3c\x67\x1d\x27\x74\x2e\xf3\x1c\xf3\x07\xcd\x42\xf4\x59\x15\x40\x16\x4e\xfb\xde\x14\x16\xcc\x84\x34\xd9\x82\xd4\x0d\x3a\xe5\x3b\x35\x14\x94\xf0\xda\x79\xe3\x8b\x4a\x4e\xed\x9e\xe6\xd7\x25\xdd\xd2\x3e\xa5\x86\x23\xd9\x27\x61\xc6\x27\x1f\x2f\xcf\x2e\xde\x5f\x0e\xf2\xf4\xd1\x49\x06\x13\x69\x21\xb9\x30\x7a\xbb\x5a\xb2\xad\xa8\x49\x7b\xb2\x12\x3e\xda\x95\xeb\x5e\xfa\x8e\xb1\x8b\x83\x1f\x2d\xca\x55\x96\x32\x43\x79\xa6\xa3\x7d\x34\xb2\x90\x99\x9c\xae\xce\xf9\xdb\x61\x83\x7e\x86\x99\x47\xfa\xb4\x6f\x77\x7e\xbf\xf2\x7a\x9b\x52\x0d\x75\x78\xf8\xd2\x0c\x90\x63\x30\xac\x35\xc8\xc1\x50\x51\xe1\x99\x2e\xf7\x41\x04\xaf\x25\x18\xa0\x36\x08\x87\xd8\xa7\x71\xab\xf2\xa2\x45\x65\x52\xda\x4a\x64\x0f\x0d\xba\xed\xc2\x98\xa5\x41\xdb\x6b\xe1\xd4\x61\xf6\x07\xd7\xa7\x4e\xe4\x0a\xc5\xfa\x21\x91\x0f\x54\xef\x90\x2a\xe2\xae\x31\xcd\xf3\x86\x17\x6f\xa6\xc1\x56\xd9\xa2\x69\x80\xa9\x64\x9f\x60\xb5\xc2\x38\xf4\x2c\x5b\x54\xa9\x01\x9d\x2a\x4c\xa7\x98\xa0\x47\x39\xfb\x6d\xa1\xf8\x9c\x67\x6c\x0a\x49\x40\xb9\x98\x46\xb5\x14\x7d\xc4\x3a\x24\x87\x67\x4b\xf3\xb2\x5b\xa5\x4d\x9c\xfa\x19\xf0\xe2\xea\xc3\x0d\x24\x96\x85\x4b\xc1\x7b\x0b\xd8\xf6\x83\x50\x68\xa4\xdf\xef\x83\xde\x7f\xf4\xbd\x95\x15\xd3\xec\x98\x7c\xc7\xdc\x77\x24\x24\xbf\x55\x50\x6d\x66\x26\x43\xf6\x51\x98\x6b\x05\x59\x40\x47\xbc\x34\x77\xad\x4e\x6c\x4b\x2b\x18\x21\xbb\xa9\xb5\x87\xe2\x9a\x98\xce\x0f\xef\x7b\x1e\x5f\xae\xdc\x23\xe9\xdf\x99\xca\x79\xab\xe8\x2a\xfc\x0c\x37\x32\x85\xa3\x87\x94\xe8\x45\x9e\x71\x71\x5b\x65\x8c\x9a\x48\x8b\x43\xe8\xa3\xcf\xc5\xad\xc7\x58\xc5\x68\xb6\x9e\x52\xee\x82\x1f\x7b\xa5\x92\x66\x07\xe3\xdd\xcd\xa2\xc0\xbb\xf0\x70\xec\xdd\x55\x6f\x4c\xe2\x0e\x0e\x9e\xdd\x7a\xb9\xee\x56\x69\xfd\x70\x38\x3a\x1f\xd5\xaa\x84\x5a\x9d\x0e\xde\x3d\xa6\x71\x79\x1d\x4b\x80\xe5\x3c\xa1\x64\xc7\x7f\xd8\x76\x53\xdb\x27\x59\xb9\xbd\x0d\xba\xf9\x5c\x4b\x65\x68\xb6\x27\x22\x90\xcc\x68\x71\x56\x9a\xd9\x05\xd7\x89\x9c\xb3\xce\xaa\xce\xdd\x0c\xb3\xf6\xfa\x84\x71\xdc\x6f\x3a\x8e\x46\xce\xff\x70\x76\x4d\x68\x69\x77\xd1\xb8\xb4\x92\x7b\xbd\xe2\xf6\xf3\x1f\xa1\x43\xfd\x5e\x66\xef\xc6\x7a\xf0\xb9\xbf\x5c\x08\xec\xf1\x42\x00\xce\xf8\x73\xbe\x04\xe0\x82\x1b\x4e\x8d\x6c\x59\xcb\xaa\xae\xbf\x97\xda\xc8\xdc\xa1\xe7\xd0\x0f\x04\xb7\xb2\xc0\x70\x6b\x63\xd7\x73\xf4\x83\xa0\x0d\xc0\x19\x0a\x2b\x16\xd3\x84\x35\x3c\x00\x7b\x90\xb9\x11\xc7\xe6\xa1\xcd\x6f\x9d\x67\x26\xa4\x7c\xca\x7e\x77\x5a\xcb\xa4\xbd\x54\x08\xc1\x1b\x15\xaa\xe4\xfa\x7b\xb5\xc4\xf0\x1f\xba\x9e\x6c\x67\xf6\xc2\x55\xfd\x6f\x49\x33\x84\xc6\xd5\xbe\x6d\x44\x75\xc8\x76\x9c\xa4\xdf\x4f\x0f\xf3\xab\xa0\x35\x97\x1a\xb3\x45\x61\x0b\xa3\xa8\xd0\x76\x23\xea\xba\xd1\xa1\xbb\xda\x39\x24\x47\x26\x29\x5a\x97\x6b\x7f\x20\xcf\x6c\x9c\xaa\x83\xfb\xbb\xe0\x91\xdd\x76\x56\x0f\x72\xdb\x02\xb8\xdb\xd5\xb4\x51\x5b\x08\x32\x5b\xf2\x8e\x6b\xe3\xd3\xe2\xc3\x0b\xae\x5d\x4e\x57\x90\x74\xae\xad\xea\xc4\x8b\xbf\xd2\x34\x55\xa7\xc8\x49\x7c\x49\x5d\x05\xf2\x8e\xcf\xbb\x44\x45\xb8\x8f\x3b\x32\x8b\xc2\xa5\x66\xbb\x39\xbf\x26\x58\x15\xe3\x37\xbf\xc2\x72\x9e\xff\xf9\xcb\x5f\xbd\x6a\xbd\xa1\x4f\xe7\xfe\xbc\xa3\xe5\x60\xef\x37\x36\xcf\xc2\x6b\x0e\xc4\x05\xf4\x97\x03\x7a\xe8\xce\x2e\xe2\x91\xdd\xd4\x40\xa5\x77\x13\x2a\x5e\x3c\xcc\x9e\xd4\xc3\x8c\x84\xa0\x07\xa4\x09\xf7\xa7\x2a\x48\x50\xae\x9f\x1f\x41\xd9\x0a\x8b\xed\x58\x53\xc7\x16\x3c\xbf\x56\xbf\x8b\x6e\x9f\xc0\xe7\xfa\xe2\x6a\xf4\xd7\x77\x67\x6f\x2e\xdf\xc1\x2c\x9d\x5f\x95\x45\x03\x2e\x76\xf6\x23\x6a\x8f\x56\x6d\x34\xc1\xed\xc0\xe8\x76\xcf\x71\xf5\x76\xd4\x50\x94\xed\x9b\x8e\x97\x1b\xf7\x95\x96\xc5\xa4\xd5\xda\x1f\xd7\x74\x05\x65\x23\x98\xda\x5f\x88\xc3\xce\x16\xae\x28\x25\x53\x4d\x19\xb2\x3b\x85\x33\xbc\xb7\xbe\xb2\x75\x07\xc8\x33\x30\xe2\xdb\xf5\x22\x0c\xf6\x6e\xbe\x7f\x20\x58\xb5\x65\xf1\xaa\x7b\xec\xcb\xe1\x08\x7a\xf9\x4b\x1e\x7b\x48\xd1\x23\x47\x59\x7a\x6d\x29\x35\xd3\x21\xc9\xfd\x33\xc5\x94\x62\x55\x46\xdc\x2e\xd4\x6b\x65\x4a\xdd\x5a\x3d\xa8\xda\xc5\x46\x2d\x62\x60\x5d\x0e\x69\x7f\xb7\x4f\x9d\x7a\xa9\x0b\x9a\xec\x35\xf3\x63\xf5\x0a\xdf\x40\x48\xf5\xe3\x13\x40\xf8\xec\x1e\x1d\x4a\xc3\x78\x5d\x11\xf9\xdc\x77\x6c\x06\x72\x75\xda\x21\x5f\x4f\xa1\x90\x3e\x48\x2e\x8e\xf8\x7a\xe2\xed\x23\x8f\x42\x3d\xbf\xdb\x51\x75\xd9\xb7\xda\x52\xcc\xa4\x91\x62\x67\x27\xf1\xeb\x15\xdd\xeb\xe7\x18\x5b\x9c\x57\x45\x42\xa2\x0a\x7d\xe0\x61\x18\x0c\xfa\x56\x8c\xf3\x5c\x42\x0a\x6f\xda\xaf\x1b\xf6\x1f\x5d\xf2\x48\x87\x17\x7b\x3a\x73\x3f\xa6\xe0\xc3\xae\x26\xd8\xbd\xba\x50\xa4\x9d\x23\x2e\x86\x17\x4e\xee\xf2\x51\x15\xda\xa1\x1d\x59\x8f\x77\x7b\xe3\x8b\x52\x99\x3b\xa9\xba\x87\x1a\x5f\xd7\x3a\x36\x6e\xf5\xdd\x6f\x4b\xd1\x44\xcf\xf1\x8c\xe0\x1c\x9f\xf8\x9c\x8c\xe0\xc2\xb4\x91\x2b\xba\x79\x32\x82\x17\xfb\x03\x1c\x9e\xa7\x3d\x34\x3b\x72\xa1\x87\x0d\x49\xdd\xab\xe0\xed\xb1\xac\xe3\x0a\x3f\xbb\x6e\xce\x40\x60\xf7\xa6\x22\x12\x34\x1c\x42\x37\xfc\xde\x88\x82\x92\x58\xb7\xaf\x03\x3d\x18\x1a\x96\x63\x81\x5f\x9a\x65\x16\x96\x52\xc4\x69\x83\x5d\xd8\x69\x8f\x60\xe6\xdd\x9c\x16\xbe\x5a\xb2\xbc\x13\x77\x54\xa5\xe4\xec\x7a\xb8\x9f\xa3\xdf\xc1\xb5\x18\xf1\xa7\x5d\x26\xa8\x7a\x59\x45\x99\x32\x32\xe6\x46\x57\x05\xcf\x98\x89\xb5\x41\x4b\xde\xc2\x1d\x91\x3d\xa4\xf6\x40\xba\xef\x45\xdc\x4f\x10\x99\x18\x9a\x35\x0a\xd0\xbf\x7a\xf5\x0a\x8d\x57\xaf\x7e\xfd\xeb\x5f\x63\x11\x9a\x94\x25\x3c\x5f\x6e\x08\xad\xfe\xeb\xf5\xeb\x01\xf9\xe3\xd9\xfb\x77\x50\x10\xaf\x30\x1a\xd3\x5d\xe0\xc8\x58\x92\x3b\xea\xac\x7b\xe4\x7f\x46\x1f\xae\xaa\x52\x1a\xf5\x5f\x5d\x35\x63\xb7\xbc\x01\xb9\x88\x5c\x80\x62\xf3\x14\x35\x33\x57\xfb\xc5\x10\x3a\x99\x60\x99\xc7\xb1\xaf\x32\x8a\x47\xca\x47\x36\x43\x49\x66\xac\xd1\x60\xb7\x3f\x03\xdf\x24\xab\x48\xa3\x31\xcf\x07\xd7\xa3\xab\x15\x8c\x15\xe8\x1f\x4c\xa5\x87\x45\xbd\x27\x1a\x2a\x35\x54\xa9\xe0\x14\xd3\x56\xa6\x74\xa5\xe7\x70\xb0\x30\x75\x3b\x89\xa7\xbc\x83\x69\x5d\x41\xa0\x86\x58\x3e\x71\x6d\x55\x1d\xfc\x7b\xbc\x56\xdc\xe6\x1c\xfb\x40\x77\x22\x75\x9e\x1f\x66\x83\x7b\xe5\x42\xd6\x03\xb9\x20\x34\x93\x50\xe5\x28\x6c\x6d\xc5\x8f\xa2\x2a\xe3\xdb\x97\xd2\x39\xf3\x5e\xd7\xec\xab\x48\x85\xde\xd3\xd6\x35\x4e\xea\x26\xed\x28\xb4\x9f\x8e\x65\x69\xfc\x15\x30\x8e\x89\xe5\xfd\xb0\xc6\x74\x87\xcc\x81\x3b\x24\x1b\xdc\x25\xe9\x6c\xe7\xbc\x95\x75\x32\x5f\x13\x02\x7a\x84\xd1\x64\x46\x6e\xd9\xa2\x8f\x84\xa9\xa0\x10\x8d\x12\xaa\x48\xb9\xdc\x8e\xf5\xfb\x92\x84\xa5\x56\xb2\x75\xc0\xf2\x37\xea\x15\x16\x85\x68\x16\x2f\x3e\x6a\x27\xe9\xb8\x9c\x91\x22\x52\xe0\x7d\x62\xe2\xa8\x0e\x6b\x48\x12\x89\x45\x98\xeb\x51\x17\xf6\x7c\xb1\xd4\x76\xd3\x9b\xbe\x5c\xb9\x11\x58\x42\xe7\x58\x55\x29\x96\x7a\xbb\xa2\xc3\x4e\x6c\x83\x0f\x52\x9f\x8a\x37\x72\x45\x80\xd2\x66\xae\x9c\x8d\x6b\xeb\xa1\x14\x00\x51\x8b\x0a\xd1\xcc\x94\x0e\x34\x58\x37\xa9\x14\x19\xd3\x9a\x70\x58\x61\x4e\xd5\x2d\xf3\x49\x49\x68\x36\x20\xd7\x76\x92\x21\xf3\x11\xe6\xc0\x9d\xa3\x1b\x99\x3d\xa3\x71\xb8\x8b\xfd\xc8\xe1\x60\x70\x88\x14\x7c\x45\xf0\x4b\x07\xcc\xd8\x2d\x81\xea\x0e\x89\x53\x1b\x25\x8d\x0b\x8d\x69\x60\xad\xd4\x06\x69\x8e\x25\x44\x71\x99\x99\xe7\x50\xb4\x75\xfa\x9d\xe5\xe5\xec\x90\xed\x73\xd7\x24\xd5\xbb\xa4\xa8\x6e\x75\x9d\x50\x7f\x76\x4f\x4d\xbd\x53\x62\xea\xa5\xda\xca\x6e\x8b\xdc\x31\xeb\x9e\xa9\xf7\x1e\x89\x94\xf3\x4e\x49\x3e\xfd\xb3\x2e\x27\x4c\xde\x46\xea\x73\xd5\xca\x32\xf6\xa3\x12\xf3\x86\x93\x55\xb5\xb6\x7c\xb8\x5b\x25\x27\x07\xa2\x69\x21\xf0\xf4\xf2\x5d\xb7\xea\x1c\xa4\xb3\xc0\xd7\x7c\xba\x08\x80\xcd\xa7\xdd\xa5\x5c\xf3\x59\x3a\x4d\x81\xba\x17\x91\x4b\x3a\x80\xd2\x48\xc8\xc4\x6c\xc2\x91\x1b\x40\xf9\x77\xc7\xa3\xa8\x95\x55\xb4\xcc\x4a\x13\xc2\x72\x56\xb0\x06\x18\xd4\xe7\x6d\xc6\x60\x48\xdf\x2c\x62\x14\xc0\x22\x91\xfe\x76\xe5\x19\xf8\xec\x74\xa4\xbb\x56\x18\xfb\xc9\x3a\x6e\xdc\x03\x86\x5e\x66\xd8\x19\x8e\x23\x97\x0d\xc1\x7b\x10\xd7\x64\x18\x70\xde\x30\x1a\x05\x24\x2f\x8e\xb8\x4a\x3d\x9d\x57\xd6\xce\xb0\xe2\xa6\xe8\xac\x08\x67\xd7\xc3\x3d\x4a\xf4\xd1\xa8\x3f\x69\x99\x1e\x4c\x37\xb5\xba\x29\x17\xd5\xca\x9d\x81\xd7\x52\x98\x67\x2f\x1a\x2e\x4d\xfb\xad\xa5\x8b\x91\x59\xb5\x91\x94\xcd\x95\x70\x0f\x14\x34\x4a\xe4\xe6\x2f\xf8\xe0\xbc\x3e\x77\x31\xf2\x11\x45\x42\x80\x47\xa7\x02\xd0\xfe\x59\x2e\x41\x06\x8b\x25\x23\xa8\x4d\x82\x3a\x5e\xa4\x2c\x16\x32\x3d\x75\xa5\x72\x85\x90\x58\xf5\x4b\xf7\xb0\xb8\x89\xee\xa1\x12\x68\x05\x85\xe8\x5a\x56\x45\x06\xf0\x9d\x45\x83\x9d\xca\xd4\xdc\xa7\x50\x8d\xdd\x40\x58\xf9\x75\xd7\x5d\x24\xf7\xac\x3b\x43\x22\x2e\xb4\x5b\x25\x8b\xba\xb1\x1a\x47\x0a\x75\xac\x93\x19\xcb\x29\x26\x85\xf3\xcb\xb3\x54\xe6\x4e\x71\x63\x18\x66\xf5\x61\x2a\xd7\x44\x4e\x7a\xb5\x0a\x71\x07\xf3\xd7\x07\xbb\xd4\xf3\xb8\x67\xc9\x15\x52\xed\xc2\x1e\x80\x71\x5d\x93\xce\x2c\x5e\x83\xba\x90\x41\x26\x47\xd1\x30\x32\x58\x06\x33\x47\xe8\x3d\xfa\xc2\x9f\x52\x45\xea\x05\x21\xe1\x45\x45\x7a\x51\x91\xf6\xa2\x22\x45\x8c\xc5\x13\x1c\x07\xa8\x58\x6d\x8a\x33\x4a\x79\xdd\xa9\x8a\xea\x89\xb2\xc4\x58\xd4\xf4\x5a\x93\x54\x75\x2b\x9a\x55\x7d\x0e\xbd\x2e\xe5\xf0\xb8\x34\x93\xfe\x6f\x08\x13\x89\x4c\x71\xf3\xed\xf8\x4a\x1b\x10\x6d\x2a\xf5\x23\x9e\x4b\xee\xbf\x15\x5b\xe2\x60\xec\x5d\xb7\x6e\x27\x3a\xe0\xef\xea\xde\xee\x89\xc1\x57\x6c\x3d\x04\xc1\xba\xe5\x87\x18\x79\xc7\xdf\xab\x5b\x42\xac\x05\x0c\xc8\xed\xcb\x9c\x92\x23\x7c\x39\x48\x8a\xb2\xe7\x1a\x0c\x72\x96\x4b\xb5\xe8\x85\x46\xf6\xc7\x5a\x2f\xd7\xe2\x18\x64\x82\xa4\x54\x56\xd9\xcb\x16\x3f\x56\xe9\xc0\x03\xe8\x91\x85\x83\xb0\x4f\xdd\xaa\xc1\xc4\x4f\xc3\xfd\x2e\x24\xba\x02\x55\xbe\xaa\x8e\x33\x09\xc9\xf7\x74\x2f\xa8\xa8\xf0\x96\x89\x39\x99\x53\xd5\xa1\x74\x75\xfc\xdc\x53\x1e\x48\xf9\x9c\xeb\xdd\x0a\xd6\xad\xd4\x9a\xb9\x4b\xeb\x25\x4b\x53\x94\xc6\x51\x4a\x7f\x2a\x7c\xa8\x77\x38\x0d\x0d\xa1\xe8\xf5\xc1\x4e\xd3\xf8\xd1\x14\x85\xc5\x67\xc7\xd2\xb0\xf8\xdc\xb7\x40\x6c\x7d\x94\x9d\xd1\x66\xaf\xe5\x9e\xfd\xe3\xd1\x62\x1f\xe7\xb0\x62\x91\x55\x7e\x02\x2f\x9c\x3e\xd2\x41\x43\x7f\x90\x3d\xda\x6a\x5c\x22\xf4\x9f\xb2\x99\x66\x4f\x57\xaf\x2e\x52\xef\xdf\xfc\xde\x75\xe4\x72\xe2\xbf\x5c\xba\xb6\x42\xbe\x97\x4b\xd7\x97\x4b\xd7\xb6\xcf\xcb\xa5\xeb\x8b\x45\xa1\xfe\xfc\xa8\x2d\x0a\x2f\x97\xae\x2f\x97\xae\xf7\x83\xe1\x83\x5c\xba\x3a\x31\xae\xba\x71\x7d\xd4\x0b\x57\x57\xd6\xe5\x2c\x49\x64\x29\xcc\x8d\xbc\x65\xad\x6f\x10\x5a\x09\xf3\x4b\xa3\x3f\x9e\x64\xdf\x5d\xb0\xe8\x24\x1e\xec\x22\x18\xd0\x32\xe5\x56\x78\xdf\x19\x81\xce\xdc\x00\x5e\x4e\xb7\xa4\x58\xa4\x2c\x0d\x23\xfb\x43\x6a\x2c\xac\x07\xe4\x8c\x28\x96\xf0\x82\xbb\xea\xdd\x14\xdf\x23\x86\x85\x2c\xfb\xdc\x68\x96\x4d\x5c\xb6\x73\x11\x17\x85\xa9\x44\x70\x47\xe1\x56\x7e\x06\x79\x8e\xf4\x49\xb2\x7d\x85\x1c\xc5\xbe\xf7\xcc\xca\xcd\xe6\x26\x1e\x21\x36\x8a\xc0\x52\x6a\xb5\x68\xe0\x63\x05\x77\x11\xc8\x0f\x7d\xb0\xd9\x97\x82\x2b\x40\xde\x11\x4b\xa4\x68\x53\x11\x73\xcd\x06\x5d\x36\x47\xf2\x3b\xe5\x2c\x9a\x58\x00\x3f\xd4\xbd\x9c\xd3\x8c\xa7\xdc\x2c\xc2\x5d\x9b\xab\xb2\x44\xf1\xc4\x84\x6d\xd4\x15\x18\x09\x2d\x0a\x25\x69\x32\x63\x3a\x9a\x37\x8a\x1c\x2e\x10\x2b\x78\x9d\x63\x25\x30\x90\x3a\xa0\x8f\x65\x7d\xd9\x82\x28\x69\xfc\x75\xf9\x9a\x0f\xde\x44\x83\x41\x77\xe4\x5f\x46\x2d\xe0\x4e\x5d\xc6\x43\xe0\xac\xf8\x24\xfe\x43\x13\x99\xa5\x3e\xbf\xc7\x6f\x5e\x59\x31\x2f\x71\x38\x68\xa9\x1c\x64\x80\x30\x92\x64\x96\x15\x5b\xca\xb7\xbe\xf3\x2f\xbf\x26\x33\x59\x2a\x3d\x88\x83\x84\x5e\xc3\x3b\x54\xd1\xbc\x98\x68\x48\xc6\xa8\x36\xe4\xf5\x2b\x92\x73\x51\x5a\x0e\xd4\x19\x6d\xba\x4b\x36\x91\x4c\xf3\xab\xaf\x5b\xf7\xeb\x2a\xcd\x2c\xdf\x48\x3a\xac\x2a\x30\x13\xaf\x13\x6a\xdc\x49\xc2\xe0\x32\xcc\x63\xdd\x10\x71\x1c\xd1\x8d\xa1\x2d\x8c\x7c\x80\xf3\xf5\x43\x29\xc7\x0b\xd3\x25\x10\xf1\x7f\xb1\x47\x3d\x02\xd1\xbf\x6c\x93\x5d\xa4\x4a\x2e\xb2\xf1\xa3\x0f\x52\x2b\x61\xca\xb5\xd9\x52\x29\xa1\x8a\x51\xdc\xd8\xac\x3d\x5b\x99\x5a\x79\xbf\x63\x58\x0a\xe8\x08\x5e\xd6\xf5\xe6\xa1\x24\x61\x58\xd3\xf0\xa2\xaa\xb4\x23\x24\x8e\xbf\x75\xf8\x27\x4e\xb6\xe5\x11\x64\x0f\x39\xba\x5b\x2e\xb5\x9d\x74\xe5\x51\xa2\xf3\x5a\xb1\x5b\xfd\x14\x68\x2e\xa6\x98\x52\x3b\x2f\x33\xc3\x8b\xac\x5a\x77\xe8\xe0\x08\x79\x6c\x36\xa3\x91\xa5\x87\x62\x70\x2e\xa6\x62\x02\x13\xe3\x51\x18\x8b\x09\x83\x99\xa1\x95\xe5\x07\x05\x55\x34\x00\x0f\xea\xa6\xea\x63\x67\x81\xa3\x70\x0f\x88\x94\xc7\x92\x73\x45\xb3\xb0\xd0\xf8\xee\x67\x9f\x48\x63\x98\xa0\xa2\x85\x81\xb9\xae\xea\x41\x27\x22\xef\x82\x0b\x18\x56\xd8\x68\x60\x8b\x13\x6a\xde\xd0\xe4\x96\x89\x14\xcb\x0f\xc1\xb2\xd3\x85\xa0\xb9\x4b\x45\x15\xd5\x54\x6e\xf4\xd7\x3d\x67\x6a\xc0\x48\x39\x1f\xaa\x8b\x5c\x77\x9f\x30\x28\x75\xe7\x5c\x2f\x9f\x34\xd6\x32\xde\x74\xce\x35\x1a\x61\x14\x9f\x27\xcc\xf3\x7f\xfb\xa9\x7d\x4e\x7d\xde\x22\x1e\x7d\x69\xf2\xce\x55\x91\x47\xf8\x0b\xe4\x3e\x18\xbf\x21\xeb\x14\xcd\xec\xd1\x5e\x84\xf0\xcc\xc6\xe6\x8e\x17\xfb\x2d\xa8\xa2\xc6\x5d\xc2\x68\x0f\x3f\xbe\xb9\xa8\x1f\xe2\x8f\x34\x95\x9a\xbc\xc9\x64\x72\x4b\x2e\x18\x08\x5d\x0f\x59\x10\x44\x8d\xd3\xa7\x4c\x18\x9d\xd3\xe9\xb6\xdb\xb1\x3e\xc9\xa5\xe0\x46\xaa\xcd\xf4\xe2\xa5\x3e\xe1\x93\xa4\x23\x56\xe3\xf4\x59\x27\x23\xb6\x08\xb6\x4b\x35\x42\x05\xc7\x10\xba\xfb\x5c\x7e\x3b\x1e\xaa\x9f\xcd\xe4\x5d\xdf\xc8\x7e\xa9\x59\x9f\xb7\xb8\x6f\xed\xb0\xba\x5b\xb6\x80\x4b\xe6\x8e\xeb\xfb\x16\xbb\xd5\x94\x03\x23\xc1\xa6\x04\xef\x2d\x8b\xfe\xf8\xe6\xc2\xf2\x86\x41\x2c\xec\x9d\x30\x93\x9c\x24\xac\x98\x9d\xb8\x0f\x3f\x4b\xa0\x78\x6a\xd1\x15\x2a\x67\x24\x91\x59\xe6\xe2\x9d\xe5\x84\x9c\xb3\x62\x16\x06\x7b\xec\x95\x3e\x5d\xaa\xdb\x42\xca\xae\x29\x3f\xa3\x03\x63\x7b\xbb\xf3\x12\x21\x8e\x1a\x77\xab\x63\xf0\x58\xa8\xf2\xac\x2b\x31\x3e\x20\x70\x1e\xb8\xaa\x7e\xad\x96\x7e\xec\x7a\x59\x4f\x07\xec\x7d\x38\x6a\xe4\x66\x38\x41\x49\x3a\x65\x29\x91\x73\xa6\x14\x4f\x99\x26\x81\xde\xc4\xaa\x27\xcf\x1e\x1b\x6e\x2f\x99\x89\x9f\x3c\x33\xf1\x0e\x3a\x4e\x44\x9e\x6c\xef\x65\xf2\x44\xd3\x9c\x8b\x67\x47\xa0\x74\x42\x33\x36\xfc\xd0\x41\x99\x18\x61\x8f\xba\x3e\xe1\x5f\x46\x09\xc5\xb6\xa4\xe9\xfa\x36\xe0\x0b\x11\x32\xdd\x66\x1f\x7d\x00\xad\x60\x4a\x0d\xbb\xdb\xca\xfe\xfa\x15\x81\xda\xde\x12\xe4\xce\xa7\xd4\x1f\x9e\x28\x35\x5e\x84\xe5\x98\xf7\x6b\x9f\xec\xd3\xed\x53\x57\xa3\x8b\x5f\x48\x23\x93\xac\x47\xd4\xb3\xeb\x21\xf9\x06\x47\xde\x6f\xa6\x3e\x25\x0d\x4a\x77\x17\x32\xa7\xbc\x73\xa1\x8d\x59\xbd\x30\xb5\x9f\xee\x75\x18\x96\xe0\xb8\x71\x8d\x90\x09\x9f\x96\x56\x03\x73\x5a\xd3\x4b\x12\xb5\x47\x11\x40\x2a\xf9\x23\xb2\x04\x79\x8f\xc3\x4a\xe6\xf0\x3b\x08\x4c\x21\x5c\x4d\x12\xcd\x84\xe6\x70\x4f\x12\x5d\x56\xbb\x72\x6f\x58\x5f\x10\xdd\x0b\x51\x48\xe9\x91\x77\x72\xca\x85\x3f\x95\xd2\x5d\xa3\x4d\x28\xcf\xda\x02\xe3\x45\xaa\x78\x72\xa9\x42\xeb\xec\x52\xd0\x71\xd6\xc6\x0b\xa0\x4e\xd6\x33\x0a\xf7\x9c\x0c\x7a\x9f\xa4\x5c\xdb\xff\x93\xd1\xe8\x1d\xd8\xc4\x4b\xe1\x65\x5d\xb0\x17\x3b\xb2\x16\x3c\xfd\xf1\x00\xee\xf7\xcc\x20\xa5\xd9\x21\xc7\xdd\x50\xa4\x76\xb2\x4c\xd7\xdc\x4e\xdc\x78\x98\xe9\x2f\x78\xce\xe2\xcd\xfd\x98\x91\x9b\x19\x4f\x6e\xaf\x23\xd3\xb7\x54\xf6\x9d\x88\x5e\xd5\x98\x50\xf3\xb7\x7d\x12\x44\x37\xd5\xeb\xee\x0a\xec\x4d\x44\xcf\x47\x6e\xc1\x76\x18\x42\xb5\x96\x09\xaf\xee\x39\xc0\x5c\x52\x11\xfc\x14\x08\xfe\x7e\x17\x01\x3c\xfd\x9e\xbc\xc9\x6f\x9a\xaf\x7a\xaa\x63\x5e\xc4\x85\x5f\xeb\x5e\x27\x8e\xa8\xb1\x43\x96\xee\x9b\x5a\x5e\x6e\x2f\x9b\x36\x8c\xf6\xde\x8b\xdb\x6d\x92\x97\x92\x7c\x95\xc5\xa5\x6d\x0a\xf9\xb9\x5d\x5e\xbe\xbd\x2d\xb5\x4d\x20\xc3\x2a\x6d\xb8\x71\x53\x87\xef\x9c\x19\x1f\x0e\x53\x21\x8b\x32\x43\x5f\x89\xfb\x27\x17\xf7\xd6\x59\xfc\xce\x9e\xcc\xfa\x8f\x91\x68\xb3\xab\x23\xf0\x4f\x23\xe7\x66\x24\x92\xbd\xfa\xd5\xd7\x5f\xff\xd8\xb3\x70\xb6\x55\x81\x1f\x22\x0d\x67\x4b\x93\xe8\x4b\xa4\xcd\x4b\xa4\x4d\x8c\x8a\x0f\x99\x46\x75\xcf\xb1\x34\x1d\x5d\x5c\xbb\xb9\xb7\xb6\x8f\x96\x69\xed\x04\xdb\xd5\x01\xb6\x43\x3c\xcc\x9e\xa2\x60\x3a\xfb\x82\x76\x89\x78\x79\x89\x73\xf9\xa9\xc5\xb9\xec\xe2\x03\xda\x3d\xa6\xa5\x8b\xef\xe7\x4f\x29\x7e\xa5\xc3\x61\x6c\x1f\x67\xd1\x3d\xba\xa2\x7b\x3e\xbb\xee\x96\xad\x5d\x4a\x1a\xc5\xf6\x19\xa7\x45\x54\x15\x04\x7d\xe1\x41\xcc\x8f\x65\xa4\x3d\x58\x8f\xa2\x43\x90\x0e\x0a\x14\x0e\x2f\xbb\xd4\x12\x74\x3a\xf9\x87\x51\xe3\x6a\x23\xbc\x7e\x9a\x1b\x8d\x9f\xe6\x95\xc1\x4b\x61\x90\xe7\x6d\xd3\xd6\xb5\xdc\x22\xde\x92\x00\x67\x1d\x18\xb1\x1c\xc7\x39\x0d\xab\x33\x72\x76\x3d\xb4\xea\x32\x84\xcf\xd0\x4c\x0f\xc8\x0a\x3e\xed\xed\x92\x8e\xaf\x7b\xfe\x4c\x8d\x61\x79\x61\xda\x6f\xf6\x8b\x49\xfb\xc9\x4d\xda\x3b\xdb\xe3\x3e\x87\x8e\xa1\x02\x64\x99\x53\xd1\xb7\x27\x0a\x8c\xdb\xb5\x5b\xb0\x06\x09\x1e\x10\xef\x95\x8b\xb0\xa0\x8a\x61\xd2\xa7\x7a\xc5\x5b\x1a\xd5\x3f\x7c\x18\x23\x24\x8c\xbd\xf3\xca\x91\x81\x36\x4e\x5a\x22\x97\xdc\x3e\xdd\x72\x02\x14\xfc\xa1\x8a\xb8\x70\x4d\x6f\x36\x33\x86\xcc\xfa\x1a\x02\x51\xaa\x56\x75\x49\x18\x45\x61\x9a\x65\xf2\x0e\xbf\x1d\x33\x30\x0b\x7d\x3b\x17\x17\x61\x35\x66\x24\xe7\x56\xa9\x76\xc6\xcf\x78\x3a\x78\x15\x69\x25\x6a\xa6\x50\x60\x55\xee\x36\x6b\xc4\x4c\xbc\xd1\x56\x21\x15\xe8\x08\x6d\xff\xed\x1d\x6f\x30\x2b\xae\xa3\x09\x63\x36\xa3\x73\x2e\x4b\x85\xbd\x8d\x24\x07\xee\x27\x60\x09\x0b\x59\x06\xd3\x14\x56\x49\x0c\xab\xd3\x2b\xe0\x74\x55\xfd\x08\xa2\x7c\x2a\xbd\x2d\xa1\xcf\xbe\x70\x6d\x96\xd7\xe2\x41\xe4\x93\xb6\xed\x0b\x6f\xe6\xba\xb0\x6c\xa1\x73\x45\xb4\xcf\x71\xbf\xba\x60\x32\x1f\xc1\x4f\x3f\xa2\x7a\x68\x5b\x73\x91\xbe\xc8\x3a\xfb\x96\x75\xc2\x75\x55\xc6\x93\x45\xe7\x4a\x61\xd5\x35\x95\xed\x4e\xde\x50\xcd\x52\xf2\x9e\x0a\x3a\x45\xb5\xec\x68\x74\xfd\xe6\xfd\xb1\xdd\x36\x50\xfb\x86\x17\x2b\xef\xb2\x46\xf1\x1c\xae\xf6\x19\x06\xb1\xb4\xc2\x1d\x38\x51\xc7\x35\xee\x35\x8c\x83\x04\x6e\xd2\x2e\x41\xec\x72\xe8\x65\xb3\xc6\x63\x83\x28\xcc\xf3\xf4\x9e\x55\x1d\xb9\xd0\x86\x66\xd9\x75\x46\xc5\x59\x51\x28\x39\x5f\xad\x09\xd7\x03\xc3\x5d\x43\xcf\xda\xd1\xf7\xc1\xbf\x2c\x10\xd0\x70\xd7\x2b\xc8\xb0\x1a\x7f\x40\x86\x26\x28\xc4\x52\x00\x1b\x3c\x38\x2b\x8d\xcc\xa9\xe1\xc9\x81\xd5\x9b\x0f\xde\x53\x51\xd2\x6c\xa5\x87\xd1\xc6\x65\xac\x13\xeb\x36\x76\x5a\x9f\x1c\xad\x45\xb7\x8d\xf2\xc1\xe6\xfe\x86\x2a\x4b\x5b\xce\x47\x9f\x3b\xf5\xd5\x86\x9a\x72\x89\x72\x6e\xa0\xe6\xeb\xe9\x77\x9f\x64\x54\x9b\x4f\x45\x6a\x4f\x72\xe3\xd7\x4d\x44\x3a\xa1\x86\x66\x72\xfa\x07\x46\xb3\xd5\xf8\x5c\xc3\x93\xf3\xb8\xb5\x37\xfe\x20\xca\x8c\xca\x71\x68\x78\xa8\x89\x15\x8a\x7d\xbc\xb6\x62\x19\x9b\x53\x61\x7c\x77\xac\x94\xad\x0f\xdd\xfa\x01\x8b\x78\x65\xf0\x4c\x99\x61\x2a\xe7\xa2\x3e\xe6\x08\xda\x9e\x4b\x91\x72\x34\xf5\x81\x31\x0b\x7b\xd4\xc7\x5d\x8f\x6a\xeb\xcc\xf9\x1b\x0c\xf8\x75\xca\x13\xcd\xa7\x0e\x0a\x6c\x36\x76\x32\xe1\x0c\x5f\xc2\xcd\x75\x6d\x6e\x4b\x90\x22\xb7\xc2\x0a\x73\x90\xf3\x62\x35\x91\xda\xca\xdb\xb7\xf1\xf4\xbe\xdf\x63\x9c\xc2\x7a\xbf\xc8\xbe\x9b\xf7\x3a\x43\xff\x26\x14\xc3\x67\xbb\x34\xd0\x9c\xca\x7a\x0a\xba\x0a\xef\x42\x37\x0c\xee\x6b\x54\x57\xaf\x35\x5a\x4f\xf1\x5b\x09\x4b\xed\xe4\x9a\xb6\x79\xd3\xeb\xb4\xb6\xca\xf2\xbd\xa4\x7e\xb6\x90\xf2\xb6\xb2\xa8\x96\xe9\xcb\xeb\xca\xf0\xd0\x39\xc5\x29\xa7\x3e\x50\x52\x70\x86\x89\x3a\xa8\x70\xc0\x02\xce\xc2\x68\xea\x5e\x5a\x0e\x66\xd5\x38\xf8\xad\xe7\xee\x9a\xd1\xb0\xeb\x7c\x17\xbc\x71\x98\x62\xa2\x0a\xb8\x2c\x38\xf9\x46\xba\x8b\x52\x17\x50\x6a\x69\x00\xf0\xed\x1e\xd1\x65\x32\x23\x54\xdb\xa9\x59\x84\xb6\x27\x9e\x0d\x72\x2a\xf8\x84\x69\x33\x08\x79\x68\xf5\x9f\x7e\xf9\x97\x01\x79\x2b\x15\x71\x7e\xd8\x3d\x9f\x01\xc2\xcd\xb3\xc2\x0b\xae\x71\x31\xa1\x6f\xa5\x69\x16\x32\x75\x93\xbe\x83\xc9\x1a\x7a\x6b\x79\x18\x4e\xb6\x64\x70\x5d\x70\x4a\x0e\xac\x90\x17\x7d\xfa\x1f\x96\x2d\xfd\xeb\x80\x1c\xdd\x01\xd3\x3e\xb0\x7f\x1e\xe0\x07\x83\x2f\x61\xac\x08\x57\x1f\xc6\x30\x3f\xc5\xa7\x53\xa6\x50\xe5\x23\x10\x0e\x77\xec\x32\x58\x08\x19\x35\xf6\x37\xbf\x95\x8a\xd8\x9c\xc8\x9f\x7e\xf9\x97\x03\x72\x54\x5f\x17\xe1\x22\x65\x5f\xc8\x2f\xd1\xf4\xcb\xb5\x5d\xe3\xb1\xbb\x40\xd1\x0b\x61\xe8\x17\x3b\x66\x32\x93\x9a\x09\x54\xbf\x8d\x24\x33\x3a\x67\x44\x4b\xab\xb5\xb2\x2c\xeb\x3b\xb3\x36\xb9\xa3\x90\x55\xc4\x83\x12\x82\xc0\x49\x41\x95\xa9\xa1\xc4\xc0\x59\x35\xe0\x6b\x76\xdb\xa6\xc2\x5f\xff\x4e\xb8\x70\x77\x46\xee\xb6\xca\xee\x39\x84\x34\xe2\x26\x19\x49\x92\x19\x15\xd3\x10\x47\x3d\x29\x4d\xa9\xd8\x96\xeb\x96\x96\x67\xe0\x96\x8b\x4e\xe1\xb6\xdf\x72\xd1\xbc\xb9\x5f\x6d\x0b\x9a\x72\xe3\x9d\xfe\x9d\x23\x9f\x59\x9c\xd8\x5d\x50\x7c\x5c\x1a\xa9\xf4\x49\xca\xe6\x2c\x3b\xd1\x7c\xda\xa7\x2a\x99\x71\xc3\x12\xbb\xac\x13\x5a\xf0\x7e\x22\x85\xdd\x71\xc8\x20\x90\xa7\x3f\x83\x22\x98\x7d\x3b\xd5\x2d\x79\x8d\x5b\x2e\x7a\xbb\x21\xec\x49\x0d\x60\x7b\x5b\x63\x0b\x1b\xce\xf2\x42\xd1\x9e\xf2\x08\xab\x05\xe3\xc5\xc9\x5e\x16\xeb\xd3\xf2\x76\xe7\x31\x87\x2e\xd3\x74\xd2\x1c\xc3\x1e\x3b\xf4\xd2\x80\x53\x59\xa3\x94\x39\x4d\x91\x94\x52\xb1\x78\x70\xe4\xb7\x20\x85\x84\xec\xc9\xa2\x9f\x60\x7d\xfb\x3e\x15\xa9\xfd\x37\xc6\xa3\x24\x8b\xbd\xc0\xb0\xe4\x9d\x08\xc1\xa7\xe1\xc5\xe3\x1c\x89\x92\xef\xe1\xd4\x3b\x79\xad\xa5\x10\x85\xa2\x2a\xb8\xec\x18\x55\x32\xcf\x34\xeb\x02\x2a\xd7\x7e\xd4\xff\x76\x77\x26\x21\x33\xd7\x36\x91\x6a\xf3\x4d\x47\x24\x3b\xb6\x9c\xef\xbb\xaa\x47\xb3\x26\xbe\x1d\xcc\xa5\x81\xf2\xd1\xf3\xb5\x65\x78\x05\x05\x18\xcc\xfa\x3b\xda\x56\x38\xe4\xef\xe8\xed\x44\xfa\x2b\xf3\x03\x25\x41\x29\xd9\xae\x40\x55\xfa\x4b\xad\xd2\x16\x2e\xca\x30\x6d\x08\x9d\x53\x9e\x81\x45\x5d\x8e\x35\x53\x73\x2c\x79\xe4\xd2\xe2\xd1\xa6\x9e\xe5\xaa\x1a\xa0\x18\xf5\x48\x9a\x8f\x5f\xc3\xf2\xae\x6c\x5a\x00\x68\x43\x8d\xd9\xaf\x9d\xf5\x5e\xf4\x1e\x54\x2f\xd7\xfe\x6c\xbf\xb0\xa3\x1a\x63\xf1\xef\x0f\x8c\x2a\x33\x66\xd4\xdc\xf0\x4d\x7c\x77\x09\xa5\x6b\xfd\xbc\xc1\xa5\x42\xe8\x3b\x46\xa6\xd2\x58\x11\xab\x04\xdc\x47\x99\x14\x13\xd0\x04\x44\x7b\x68\x8c\xae\x56\x79\xa3\x28\xc4\xbd\x48\xd1\x71\x99\xf5\x8e\xcb\xeb\x74\xd2\xb1\xc3\x24\x83\xad\x31\x05\x84\x14\xcc\xed\x1d\xde\x40\x00\x05\x7a\x9c\x25\xe7\x4c\xeb\x8d\xa9\x21\xea\x2e\x7c\xd8\x1a\x8f\x72\xe3\x3a\x2c\xf7\xbf\x61\xfc\x84\x15\xa0\x53\x66\x28\xcf\xfc\x51\x46\x50\x04\x28\x6d\xa3\xae\x1b\x17\xa8\x18\xd5\x9b\x04\x84\x66\x46\x2c\x2d\x05\x4e\x5a\x0a\xd6\xbf\x93\x2a\x25\xe7\x34\x67\xd9\x39\xd5\xcc\x8d\x15\x87\xab\xe1\x1e\x1d\xea\xbd\x4e\x79\xb5\xed\x6b\xcd\x94\xd1\xf8\xe3\x91\xc8\xe1\x46\xa5\x62\xe1\x04\x7b\xde\x04\x79\xa3\x4a\xd6\x23\x6f\x2d\xf7\xea\x91\x4f\xe2\x56\xc8\xbb\xfb\xcd\xd5\x6c\xbc\xb9\xa8\xbb\x59\xb9\xcc\x2d\x90\x22\xcf\x25\x84\xa9\x19\x7c\xc2\x74\x77\x9c\x91\x23\xf8\x6b\x4c\x8d\x75\x66\x13\x9a\xfa\x19\xd9\x7f\x2e\x99\xa0\xac\xa2\xa8\xe4\x54\x31\x8d\x39\x57\x56\x26\xf4\x6b\x6b\x72\xfe\x86\x09\x17\xf1\xb6\x75\x7a\xc3\x55\xbd\xfc\x4c\x3d\x5f\x9b\x56\xbf\xb8\xfd\x76\x1f\x2b\xb2\x95\xa2\xc6\x66\x2f\xbc\x68\xa2\x6b\x8c\x4f\xeb\x66\xb8\xda\xe8\x14\x71\xbd\xa8\x2d\x0a\x25\x9b\xac\xa3\x7e\x75\xe7\xa3\xcf\xeb\x81\xbd\x96\xf7\x6d\xe3\x4f\xdb\xcd\x52\xf7\x35\x48\x6d\x3d\x33\x5b\x8d\x50\x2f\xe6\xa7\x17\xf3\xd3\x8f\xc9\xfc\xb4\x15\xe3\x37\x99\x9c\x7e\x1c\xc6\xa6\xad\x4b\xdc\x64\x60\x7a\x96\xa6\xa5\x56\x2b\xda\x68\x4e\x7a\xb6\x86\xa4\xad\x4b\x6b\x69\x3c\xfa\xf7\x31\x1b\x6d\x85\xd8\x06\x53\xd1\x33\x34\x12\xb5\x11\xc8\x58\xda\x46\x4c\x1c\x46\x8d\x63\x41\xb1\x2a\x98\x18\x86\xf3\x2e\x35\xb1\x38\xb3\xab\xb4\x68\x05\xb8\xad\x73\x3b\x74\x93\x6b\x2f\x7b\x39\x81\xd1\x95\x13\x5c\x9a\x2c\xb9\xb8\xbc\xfe\x78\x79\x7e\x76\x73\x79\xd1\x94\xef\x56\x41\x7a\x8b\x24\xb6\xd9\x06\xd1\x8f\x24\xb1\x35\x0d\x2c\x41\x5e\xf3\x93\xc5\x81\x35\x3f\x95\x25\x5f\xd5\xeb\xfe\x72\xe1\xbd\xb8\xdc\xbd\xf8\xc7\xf6\xd3\xd9\xf6\x78\xda\xd3\x09\xd8\x82\x1e\x63\x56\xee\x99\xc9\x2c\xd5\xde\xd7\x74\x78\x11\xa2\x97\xb8\x48\xb2\x32\xb5\xc2\xc5\xa7\x4f\xc3\x0b\x3d\x20\xe4\x0d\x4b\x68\xa9\xc1\x0a\x93\x4a\x71\x68\xc8\x87\xab\x77\x7f\x04\x1f\x6a\x68\xd1\x0b\xc9\x3e\x20\x83\x2c\xa7\x98\x04\xd7\x60\x16\x32\xf2\x86\xa1\xa0\x02\x5f\x4e\x68\x61\xa9\x98\xc6\x2a\x0b\x06\x64\x91\x19\xcb\x0a\x4b\x31\x6f\x19\xa9\x72\x7f\xda\x81\xab\x1a\xe6\xde\xe5\x71\xca\x0c\x46\x3a\x6d\xf2\x6a\xdc\x08\xb5\x2d\x16\xd7\x7b\xd8\x5a\x6b\xea\xa3\xd3\xc6\xef\xa8\x76\x16\xab\x95\xb3\xdd\xb2\xbf\xdb\xed\x33\xeb\x4d\x1c\x6b\x8c\x1b\x48\x9e\xe1\xaf\xa5\x39\xdb\xc9\x56\x76\x0c\x74\x22\xe1\xa6\xb5\x35\x75\xbd\x1b\xd0\xea\x9c\xf5\x4b\xb6\x0c\xd6\x04\x72\xed\xc3\xc1\x8b\x3a\x9a\x72\xbb\xb9\x40\xc1\x8b\xb4\x56\x5d\xd2\x79\xdb\xd5\xdf\x95\xe3\x50\x5f\xb4\x9a\xaf\xb3\xc8\x90\x7f\xfc\xeb\xab\xff\x1f\x00\x00\xff\xff\x19\x53\xdb\x44\x5f\xac\x01\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/staging/api/go.mod b/staging/api/go.mod index 2836cfa699..ae95703c39 100644 --- a/staging/api/go.mod +++ b/staging/api/go.mod @@ -9,12 +9,12 @@ require ( github.com/go-bindata/go-bindata/v3 v3.1.3 github.com/mikefarah/yq/v3 v3.0.0-20201202084205-8846255d1c37 github.com/sirupsen/logrus v1.8.1 - github.com/spf13/cobra v1.1.3 + github.com/spf13/cobra v1.2.1 github.com/stretchr/testify v1.7.0 - k8s.io/api v0.22.0 - k8s.io/apiextensions-apiserver v0.22.0 - k8s.io/apimachinery v0.22.0 - k8s.io/client-go v0.22.0 - sigs.k8s.io/controller-runtime v0.9.0 - sigs.k8s.io/controller-tools v0.6.0 + k8s.io/api v0.22.1 + k8s.io/apiextensions-apiserver v0.22.1 + k8s.io/apimachinery v0.22.1 + k8s.io/client-go v0.22.1 + sigs.k8s.io/controller-runtime v0.10.0 + sigs.k8s.io/controller-tools v0.6.2 ) diff --git a/staging/api/go.sum b/staging/api/go.sum index ca205d95ce..b32a88119d 100644 --- a/staging/api/go.sum +++ b/staging/api/go.sum @@ -9,18 +9,33 @@ cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6T cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= @@ -56,14 +71,16 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= -github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= @@ -80,6 +97,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= @@ -114,6 +132,7 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -168,8 +187,8 @@ github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTM github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= -github.com/gobuffalo/flect v0.2.2 h1:PAVD7sp0KOdfswjAw9BpLCU9hXo7wFSzgpQ+zNeks/A= -github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= +github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY= +github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc= github.com/goccy/go-yaml v1.8.1 h1:JuZRFlqLM5cWF6A+waL8AKVuCcqvKOuhJtUQI+L3ez0= github.com/goccy/go-yaml v1.8.1/go.mod h1:wS4gNoLalDSJxo/SpngzPQ2BN4uuZVLCmbM4S3vd4+Y= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -191,11 +210,15 @@ github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= @@ -215,8 +238,11 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= @@ -225,11 +251,19 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/gofuzz v1.1.0 h1:Hsa8mG0dQ46ij8Sl2AYJDUv1oA9/d6Vk+3LG99Oe02g= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -269,7 +303,6 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -277,6 +310,7 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -305,6 +339,7 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -318,6 +353,7 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= @@ -349,8 +385,9 @@ github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eI github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= @@ -377,23 +414,25 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -442,15 +481,19 @@ github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4k github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= 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 v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -458,6 +501,7 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -477,7 +521,9 @@ github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGr github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -496,6 +542,9 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= @@ -527,12 +576,14 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -559,6 +610,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -570,6 +622,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -589,6 +643,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -599,12 +654,23 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= @@ -613,14 +679,23 @@ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAG golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 h1:0Ja1LBD+yisY6RWM/BH7TJVXWsSjs2VwBSmvSX4HdBc= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -661,24 +736,38 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 h1:RqytpXGR1iVNX7psjB3ff8y7sNFinVFvkx1c8SjBkio= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -735,14 +824,30 @@ golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -758,12 +863,25 @@ google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsb google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= @@ -783,12 +901,32 @@ google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvx google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c h1:wtujag7C+4D6KMoulW9YauvK2lgdvCMS260jsqqBXr0= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -800,9 +938,17 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= @@ -833,6 +979,7 @@ gopkg.in/go-playground/validator.v9 v9.30.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWd gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473 h1:6D+BvnJ/j6e222UW8s2qTSe3wGBtvo0MbVQG/c5k8RE= gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473/go.mod h1:N1eN2tsCx0Ydtgjl4cqmbRCsY4/+z4cYDeqwZTk6zog= @@ -862,26 +1009,27 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.21.1/go.mod h1:FstGROTmsSHBarKc8bylzXih8BLNYTiS3TZcsoEDg2s= -k8s.io/api v0.22.0 h1:elCpMZ9UE8dLdYxr55E06TmSeji9I3KH494qH70/y+c= -k8s.io/api v0.22.0/go.mod h1:0AoXXqst47OI/L0oGKq9DG61dvGRPXs7X4/B7KyjBCU= -k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA= -k8s.io/apiextensions-apiserver v0.22.0 h1:QTuZIQggaE7N8FTjur+1zxLmEPziphK7nNm8t+VNO3g= -k8s.io/apiextensions-apiserver v0.22.0/go.mod h1:+9w/QQC/lwH2qTbpqndXXjwBgidlSmytvIUww16UACE= -k8s.io/apimachinery v0.21.1/go.mod h1:jbreFvJo3ov9rj7eWT7+sYiRx+qZuCYXwWT1bcDswPY= -k8s.io/apimachinery v0.22.0 h1:CqH/BdNAzZl+sr3tc0D3VsK3u6ARVSo3GWyLmfIjbP0= -k8s.io/apimachinery v0.22.0/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apiserver v0.21.1/go.mod h1:nLLYZvMWn35glJ4/FZRhzLG/3MPxAaZTgV4FJZdr+tY= -k8s.io/apiserver v0.22.0 h1:KZh2asnRBjawLLfPOi6qiD+A2jaNt31HCnZG6AX3Qcs= -k8s.io/apiserver v0.22.0/go.mod h1:04kaIEzIQrTGJ5syLppQWvpkLJXQtJECHmae+ZGc/nc= -k8s.io/client-go v0.21.1/go.mod h1:/kEw4RgW+3xnBGzvp9IWxKSNA+lXn3A7AuH3gdOAzLs= -k8s.io/client-go v0.22.0 h1:sD6o9O6tCwUKCENw8v+HFsuAbq2jCu8cWC61/ydwA50= -k8s.io/client-go v0.22.0/go.mod h1:GUjIuXR5PiEv/RVK5OODUsm6eZk7wtSWZSaSJbpFdGg= -k8s.io/code-generator v0.21.1/go.mod h1:hUlps5+9QaTrKx+jiM4rmq7YmH8wPOIko64uZCHDh6Q= -k8s.io/code-generator v0.22.0/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= -k8s.io/component-base v0.21.1/go.mod h1:NgzFZ2qu4m1juby4TnrmpR8adRk6ka62YdH5DkIIyKA= -k8s.io/component-base v0.22.0 h1:ZTmX8hUqH9T9gc0mM42O+KDgtwTYbVTt2MwmLP0eK8A= -k8s.io/component-base v0.22.0/go.mod h1:SXj6Z+V6P6GsBhHZVbWCw9hFjUdUYnJerlhhPnYCBCg= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg= +k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY= +k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= +k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE= +k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= +k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= +k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCFI= +k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apiserver v0.21.3/go.mod h1:eDPWlZG6/cCCMj/JBcEpDoK+I+6i3r9GsChYBHSbAzU= +k8s.io/apiserver v0.22.1 h1:Ul9Iv8OMB2s45h2tl5XWPpAZo1VPIJ/6N+MESeed7L8= +k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= +k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU= +k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw= +k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= +k8s.io/code-generator v0.21.3/go.mod h1:K3y0Bv9Cz2cOW2vXUrNZlFbflhuPvuadW6JdnN6gGKo= +k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= +k8s.io/component-base v0.21.3/go.mod h1:kkuhtfEHeZM6LkX0saqSK8PbdO7A0HigUngmhhrwfGQ= +k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= +k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= @@ -893,21 +1041,20 @@ k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iL k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9 h1:imL9YgXQ9p7xmPzHFm/vVd/cF78jad+n4wK1ABwYtMM= k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22 h1:fmRfl9WJ4ApJn7LxNuED4m0t18qivVQOxP6aAYG9J6c= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/controller-runtime v0.9.0 h1:ZIZ/dtpboPSbZYY7uUz2OzrkaBTOThx2yekLtpGB+zY= -sigs.k8s.io/controller-runtime v0.9.0/go.mod h1:TgkfvrhhEw3PlI0BRL/5xM+89y3/yc0ZDfdbTl84si8= -sigs.k8s.io/controller-tools v0.6.0 h1:o2Fm1K7CmIp8OVaBtXsWB/ssBAzyoKZPPAGR3VuxaKs= -sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc= +sigs.k8s.io/controller-runtime v0.10.0 h1:HgyZmMpjUOrtkaFtCnfxsR1bGRuFoAczSNbn2MoKj5U= +sigs.k8s.io/controller-runtime v0.10.0/go.mod h1:GCdh6kqV6IY4LK0JLwX0Zm6g233RtVGdb/f0+KSfprg= +sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU= +sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go index 1a7a4c7e57..545bd9d379 100644 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -140,7 +140,7 @@ func testOnGCE() bool { }() go func() { - addrs, err := net.LookupHost("metadata.google.internal") + addrs, err := net.DefaultResolver.LookupHost(ctx, "metadata.google.internal") if err != nil || len(addrs) == 0 { resc <- false return @@ -296,6 +296,7 @@ func (c *Client) getETag(suffix string) (value, etag string, err error) { // being stable anyway. host = metadataIP } + suffix = strings.TrimLeft(suffix, "/") u := "http://" + host + "/computeMetadata/v1/" + suffix req, err := http.NewRequest("GET", u, nil) if err != nil { diff --git a/vendor/github.com/mitchellh/mapstructure/.travis.yml b/vendor/github.com/mitchellh/mapstructure/.travis.yml deleted file mode 100644 index 1689c7d735..0000000000 --- a/vendor/github.com/mitchellh/mapstructure/.travis.yml +++ /dev/null @@ -1,8 +0,0 @@ -language: go - -go: - - "1.11.x" - - tip - -script: - - go test diff --git a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md index 3b3cb723f8..1955f2878c 100644 --- a/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md +++ b/vendor/github.com/mitchellh/mapstructure/CHANGELOG.md @@ -1,3 +1,55 @@ +## unreleased + +* Fix regression where `*time.Time` value would be set to empty and not be sent + to decode hooks properly [GH-232] + +## 1.4.0 + +* A new decode hook type `DecodeHookFuncValue` has been added that has + access to the full values. [GH-183] +* Squash is now supported with embedded fields that are struct pointers [GH-205] +* Empty strings will convert to 0 for all numeric types when weakly decoding [GH-206] + +## 1.3.3 + +* Decoding maps from maps creates a settable value for decode hooks [GH-203] + +## 1.3.2 + +* Decode into interface type with a struct value is supported [GH-187] + +## 1.3.1 + +* Squash should only squash embedded structs. [GH-194] + +## 1.3.0 + +* Added `",omitempty"` support. This will ignore zero values in the source + structure when encoding. [GH-145] + +## 1.2.3 + +* Fix duplicate entries in Keys list with pointer values. [GH-185] + +## 1.2.2 + +* Do not add unsettable (unexported) values to the unused metadata key + or "remain" value. [GH-150] + +## 1.2.1 + +* Go modules checksum mismatch fix + +## 1.2.0 + +* Added support to capture unused values in a field using the `",remain"` value + in the mapstructure tag. There is an example to showcase usage. +* Added `DecoderConfig` option to always squash embedded structs +* `json.Number` can decode into `uint` types +* Empty slices are preserved and not replaced with nil slices +* Fix panic that can occur in when decoding a map into a nil slice of structs +* Improved package documentation for godoc + ## 1.1.2 * Fix error when decode hook decodes interface implementation into interface diff --git a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go index 1f0abc65ab..92e6f76fff 100644 --- a/vendor/github.com/mitchellh/mapstructure/decode_hooks.go +++ b/vendor/github.com/mitchellh/mapstructure/decode_hooks.go @@ -1,6 +1,7 @@ package mapstructure import ( + "encoding" "errors" "fmt" "net" @@ -16,10 +17,11 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { // Create variables here so we can reference them with the reflect pkg var f1 DecodeHookFuncType var f2 DecodeHookFuncKind + var f3 DecodeHookFuncValue // Fill in the variables into this interface and the rest is done // automatically using the reflect package. - potential := []interface{}{f1, f2} + potential := []interface{}{f1, f2, f3} v := reflect.ValueOf(h) vt := v.Type() @@ -38,13 +40,15 @@ func typedDecodeHook(h DecodeHookFunc) DecodeHookFunc { // that took reflect.Kind instead of reflect.Type. func DecodeHookExec( raw DecodeHookFunc, - from reflect.Type, to reflect.Type, - data interface{}) (interface{}, error) { + from reflect.Value, to reflect.Value) (interface{}, error) { + switch f := typedDecodeHook(raw).(type) { case DecodeHookFuncType: - return f(from, to, data) + return f(from.Type(), to.Type(), from.Interface()) case DecodeHookFuncKind: - return f(from.Kind(), to.Kind(), data) + return f(from.Kind(), to.Kind(), from.Interface()) + case DecodeHookFuncValue: + return f(from, to) default: return nil, errors.New("invalid decode hook signature") } @@ -56,22 +60,16 @@ func DecodeHookExec( // The composed funcs are called in order, with the result of the // previous transformation. func ComposeDecodeHookFunc(fs ...DecodeHookFunc) DecodeHookFunc { - return func( - f reflect.Type, - t reflect.Type, - data interface{}) (interface{}, error) { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { var err error + var data interface{} + newFrom := f for _, f1 := range fs { - data, err = DecodeHookExec(f1, f, t, data) + data, err = DecodeHookExec(f1, newFrom, t) if err != nil { return nil, err } - - // Modify the from kind to be correct with the new data - f = nil - if val := reflect.ValueOf(data); val.IsValid() { - f = val.Type() - } + newFrom = reflect.ValueOf(data) } return data, nil @@ -215,3 +213,44 @@ func WeaklyTypedHook( return data, nil } + +func RecursiveStructToMapHookFunc() DecodeHookFunc { + return func(f reflect.Value, t reflect.Value) (interface{}, error) { + if f.Kind() != reflect.Struct { + return f.Interface(), nil + } + + var i interface{} = struct{}{} + if t.Type() != reflect.TypeOf(&i).Elem() { + return f.Interface(), nil + } + + m := make(map[string]interface{}) + t.Set(reflect.ValueOf(m)) + + return f.Interface(), nil + } +} + +// TextUnmarshallerHookFunc returns a DecodeHookFunc that applies +// strings to the UnmarshalText function, when the target type +// implements the encoding.TextUnmarshaler interface +func TextUnmarshallerHookFunc() DecodeHookFuncType { + return func( + f reflect.Type, + t reflect.Type, + data interface{}) (interface{}, error) { + if f.Kind() != reflect.String { + return data, nil + } + result := reflect.New(t).Interface() + unmarshaller, ok := result.(encoding.TextUnmarshaler) + if !ok { + return data, nil + } + if err := unmarshaller.UnmarshalText([]byte(data.(string))); err != nil { + return nil, err + } + return result, nil + } +} diff --git a/vendor/github.com/mitchellh/mapstructure/go.mod b/vendor/github.com/mitchellh/mapstructure/go.mod index d2a7125620..a03ae97308 100644 --- a/vendor/github.com/mitchellh/mapstructure/go.mod +++ b/vendor/github.com/mitchellh/mapstructure/go.mod @@ -1 +1,3 @@ module github.com/mitchellh/mapstructure + +go 1.14 diff --git a/vendor/github.com/mitchellh/mapstructure/mapstructure.go b/vendor/github.com/mitchellh/mapstructure/mapstructure.go index 256ee63fbf..3643901f55 100644 --- a/vendor/github.com/mitchellh/mapstructure/mapstructure.go +++ b/vendor/github.com/mitchellh/mapstructure/mapstructure.go @@ -1,10 +1,161 @@ -// Package mapstructure exposes functionality to convert an arbitrary -// map[string]interface{} into a native Go structure. +// Package mapstructure exposes functionality to convert one arbitrary +// Go type into another, typically to convert a map[string]interface{} +// into a native Go structure. // // The Go structure can be arbitrarily complex, containing slices, // other structs, etc. and the decoder will properly decode nested // maps and so on into the proper structures in the native Go struct. // See the examples to see what the decoder is capable of. +// +// The simplest function to start with is Decode. +// +// Field Tags +// +// When decoding to a struct, mapstructure will use the field name by +// default to perform the mapping. For example, if a struct has a field +// "Username" then mapstructure will look for a key in the source value +// of "username" (case insensitive). +// +// type User struct { +// Username string +// } +// +// You can change the behavior of mapstructure by using struct tags. +// The default struct tag that mapstructure looks for is "mapstructure" +// but you can customize it using DecoderConfig. +// +// Renaming Fields +// +// To rename the key that mapstructure looks for, use the "mapstructure" +// tag and set a value directly. For example, to change the "username" example +// above to "user": +// +// type User struct { +// Username string `mapstructure:"user"` +// } +// +// Embedded Structs and Squashing +// +// Embedded structs are treated as if they're another field with that name. +// By default, the two structs below are equivalent when decoding with +// mapstructure: +// +// type Person struct { +// Name string +// } +// +// type Friend struct { +// Person +// } +// +// type Friend struct { +// Person Person +// } +// +// This would require an input that looks like below: +// +// map[string]interface{}{ +// "person": map[string]interface{}{"name": "alice"}, +// } +// +// If your "person" value is NOT nested, then you can append ",squash" to +// your tag value and mapstructure will treat it as if the embedded struct +// were part of the struct directly. Example: +// +// type Friend struct { +// Person `mapstructure:",squash"` +// } +// +// Now the following input would be accepted: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// When decoding from a struct to a map, the squash tag squashes the struct +// fields into a single map. Using the example structs from above: +// +// Friend{Person: Person{Name: "alice"}} +// +// Will be decoded into a map: +// +// map[string]interface{}{ +// "name": "alice", +// } +// +// DecoderConfig has a field that changes the behavior of mapstructure +// to always squash embedded structs. +// +// Remainder Values +// +// If there are any unmapped keys in the source value, mapstructure by +// default will silently ignore them. You can error by setting ErrorUnused +// in DecoderConfig. If you're using Metadata you can also maintain a slice +// of the unused keys. +// +// You can also use the ",remain" suffix on your tag to collect all unused +// values in a map. The field with this tag MUST be a map type and should +// probably be a "map[string]interface{}" or "map[interface{}]interface{}". +// See example below: +// +// type Friend struct { +// Name string +// Other map[string]interface{} `mapstructure:",remain"` +// } +// +// Given the input below, Other would be populated with the other +// values that weren't used (everything but "name"): +// +// map[string]interface{}{ +// "name": "bob", +// "address": "123 Maple St.", +// } +// +// Omit Empty Values +// +// When decoding from a struct to any other value, you may use the +// ",omitempty" suffix on your tag to omit that value if it equates to +// the zero value. The zero value of all types is specified in the Go +// specification. +// +// For example, the zero type of a numeric type is zero ("0"). If the struct +// field value is zero and a numeric type, the field is empty, and it won't +// be encoded into the destination type. +// +// type Source { +// Age int `mapstructure:",omitempty"` +// } +// +// Unexported fields +// +// Since unexported (private) struct fields cannot be set outside the package +// where they are defined, the decoder will simply skip them. +// +// For this output type definition: +// +// type Exported struct { +// private string // this unexported field will be skipped +// Public string +// } +// +// Using this map as input: +// +// map[string]interface{}{ +// "private": "I will be ignored", +// "Public": "I made it through!", +// } +// +// The following struct will be decoded: +// +// type Exported struct { +// private: "" // field is left with an empty string (zero value) +// Public: "I made it through!" +// } +// +// Other Configuration +// +// mapstructure is highly configurable. See the DecoderConfig struct +// for other features and options that are supported. package mapstructure import ( @@ -21,10 +172,11 @@ import ( // data transformations. See "DecodeHook" in the DecoderConfig // struct. // -// The type should be DecodeHookFuncType or DecodeHookFuncKind. -// Either is accepted. Types are a superset of Kinds (Types can return -// Kinds) and are generally a richer thing to use, but Kinds are simpler -// if you only need those. +// The type must be one of DecodeHookFuncType, DecodeHookFuncKind, or +// DecodeHookFuncValue. +// Values are a superset of Types (Values can return types), and Types are a +// superset of Kinds (Types can return Kinds) and are generally a richer thing +// to use, but Kinds are simpler if you only need those. // // The reason DecodeHookFunc is multi-typed is for backwards compatibility: // we started with Kinds and then realized Types were the better solution, @@ -40,15 +192,22 @@ type DecodeHookFuncType func(reflect.Type, reflect.Type, interface{}) (interface // source and target types. type DecodeHookFuncKind func(reflect.Kind, reflect.Kind, interface{}) (interface{}, error) +// DecodeHookFuncRaw is a DecodeHookFunc which has complete access to both the source and target +// values. +type DecodeHookFuncValue func(from reflect.Value, to reflect.Value) (interface{}, error) + // DecoderConfig is the configuration that is used to create a new decoder // and allows customization of various aspects of decoding. type DecoderConfig struct { // DecodeHook, if set, will be called before any decoding and any // type conversion (if WeaklyTypedInput is on). This lets you modify - // the values before they're set down onto the resulting struct. + // the values before they're set down onto the resulting struct. The + // DecodeHook is called for every map and value in the input. This means + // that if a struct has embedded fields with squash tags the decode hook + // is called only once with all of the input data, not once for each + // embedded struct. // - // If an error is returned, the entire decode will fail with that - // error. + // If an error is returned, the entire decode will fail with that error. DecodeHook DecodeHookFunc // If ErrorUnused is true, then it is an error for there to exist @@ -80,6 +239,14 @@ type DecoderConfig struct { // WeaklyTypedInput bool + // Squash will squash embedded structs. A squash tag may also be + // added to an individual struct field using a tag. For example: + // + // type Parent struct { + // Child `mapstructure:",squash"` + // } + Squash bool + // Metadata is the struct that will contain extra metadata about // the decoding. If this is nil, then no metadata will be tracked. Metadata *Metadata @@ -261,9 +428,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e if d.config.DecodeHook != nil { // We have a DecodeHook, so let's pre-process the input. var err error - input, err = DecodeHookExec( - d.config.DecodeHook, - inputVal.Type(), outVal.Type(), input) + input, err = DecodeHookExec(d.config.DecodeHook, inputVal, outVal) if err != nil { return fmt.Errorf("error decoding '%s': %s", name, err) } @@ -271,6 +436,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e var err error outputKind := getKind(outVal) + addMetaKey := true switch outputKind { case reflect.Bool: err = d.decodeBool(name, input, outVal) @@ -289,7 +455,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e case reflect.Map: err = d.decodeMap(name, input, outVal) case reflect.Ptr: - err = d.decodePtr(name, input, outVal) + addMetaKey, err = d.decodePtr(name, input, outVal) case reflect.Slice: err = d.decodeSlice(name, input, outVal) case reflect.Array: @@ -303,7 +469,7 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // If we reached here, then we successfully decoded SOMETHING, so // mark the key as used if we're tracking metainput. - if d.config.Metadata != nil && name != "" { + if addMetaKey && d.config.Metadata != nil && name != "" { d.config.Metadata.Keys = append(d.config.Metadata.Keys, name) } @@ -314,7 +480,34 @@ func (d *Decoder) decode(name string, input interface{}, outVal reflect.Value) e // value to "data" of that type. func (d *Decoder) decodeBasic(name string, data interface{}, val reflect.Value) error { if val.IsValid() && val.Elem().IsValid() { - return d.decode(name, data, val.Elem()) + elem := val.Elem() + + // If we can't address this element, then its not writable. Instead, + // we make a copy of the value (which is a pointer and therefore + // writable), decode into that, and replace the whole value. + copied := false + if !elem.CanAddr() { + copied = true + + // Make *T + copy := reflect.New(elem.Type()) + + // *T = elem + copy.Elem().Set(elem) + + // Set elem so we decode into it + elem = copy + } + + // Decode. If we have an error then return. We also return right + // away if we're not a copy because that means we decoded directly. + if err := d.decode(name, data, elem); err != nil || !copied { + return err + } + + // If we're a copy, we need to set te final result + val.Set(elem.Elem()) + return nil } dataVal := reflect.ValueOf(data) @@ -386,8 +579,8 @@ func (d *Decoder) decodeString(name string, data interface{}, val reflect.Value) if !converted { return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -412,7 +605,12 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er val.SetInt(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - i, err := strconv.ParseInt(dataVal.String(), 0, val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseInt(str, 0, val.Type().Bits()) if err == nil { val.SetInt(i) } else { @@ -428,8 +626,8 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er val.SetInt(i) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -438,6 +636,7 @@ func (d *Decoder) decodeInt(name string, data interface{}, val reflect.Value) er func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) error { dataVal := reflect.Indirect(reflect.ValueOf(data)) dataKind := getKind(dataVal) + dataType := dataVal.Type() switch { case dataKind == reflect.Int: @@ -463,16 +662,33 @@ func (d *Decoder) decodeUint(name string, data interface{}, val reflect.Value) e val.SetUint(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - i, err := strconv.ParseUint(dataVal.String(), 0, val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + i, err := strconv.ParseUint(str, 0, val.Type().Bits()) if err == nil { val.SetUint(i) } else { return fmt.Errorf("cannot parse '%s' as uint: %s", name, err) } + case dataType.PkgPath() == "encoding/json" && dataType.Name() == "Number": + jn := data.(json.Number) + i, err := jn.Int64() + if err != nil { + return fmt.Errorf( + "error decoding json.Number into %s: %s", name, err) + } + if i < 0 && !d.config.WeaklyTypedInput { + return fmt.Errorf("cannot parse '%s', %d overflows uint", + name, i) + } + val.SetUint(uint64(i)) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -502,8 +718,8 @@ func (d *Decoder) decodeBool(name string, data interface{}, val reflect.Value) e } default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -528,7 +744,12 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) val.SetFloat(0) } case dataKind == reflect.String && d.config.WeaklyTypedInput: - f, err := strconv.ParseFloat(dataVal.String(), val.Type().Bits()) + str := dataVal.String() + if str == "" { + str = "0" + } + + f, err := strconv.ParseFloat(str, val.Type().Bits()) if err == nil { val.SetFloat(f) } else { @@ -544,8 +765,8 @@ func (d *Decoder) decodeFloat(name string, data interface{}, val reflect.Value) val.SetFloat(i) default: return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } return nil @@ -596,7 +817,7 @@ func (d *Decoder) decodeMapFromSlice(name string, dataVal reflect.Value, val ref for i := 0; i < dataVal.Len(); i++ { err := d.decode( - fmt.Sprintf("%s[%d]", name, i), + name+"["+strconv.Itoa(i)+"]", dataVal.Index(i).Interface(), val) if err != nil { return err @@ -629,7 +850,7 @@ func (d *Decoder) decodeMapFromMap(name string, dataVal reflect.Value, val refle } for _, k := range dataVal.MapKeys() { - fieldName := fmt.Sprintf("%s[%s]", name, k) + fieldName := name + "[" + k.String() + "]" // First decode the key into the proper type currentKey := reflect.Indirect(reflect.New(valKeyType)) @@ -678,27 +899,40 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re } tagValue := f.Tag.Get(d.config.TagName) - tagParts := strings.Split(tagValue, ",") + keyName := f.Name + + // If Squash is set in the config, we squash the field down. + squash := d.config.Squash && v.Kind() == reflect.Struct && f.Anonymous // Determine the name of the key in the map - keyName := f.Name - if tagParts[0] != "" { - if tagParts[0] == "-" { + if index := strings.Index(tagValue, ","); index != -1 { + if tagValue[:index] == "-" { + continue + } + // If "omitempty" is specified in the tag, it ignores empty values. + if strings.Index(tagValue[index+1:], "omitempty") != -1 && isEmptyValue(v) { continue } - keyName = tagParts[0] - } - // If "squash" is specified in the tag, we squash the field down. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break + // If "squash" is specified in the tag, we squash the field down. + squash = !squash && strings.Index(tagValue[index+1:], "squash") != -1 + if squash { + // When squashing, the embedded type can be a pointer to a struct. + if v.Kind() == reflect.Ptr && v.Elem().Kind() == reflect.Struct { + v = v.Elem() + } + + // The final type must be a struct + if v.Kind() != reflect.Struct { + return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + } } - } - if squash && v.Kind() != reflect.Struct { - return fmt.Errorf("cannot squash non-struct type '%s'", v.Type()) + keyName = tagValue[:index] + } else if len(tagValue) > 0 { + if tagValue == "-" { + continue + } + keyName = tagValue } switch v.Kind() { @@ -713,11 +947,22 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re mType := reflect.MapOf(vKeyType, vElemType) vMap := reflect.MakeMap(mType) - err := d.decode(keyName, x.Interface(), vMap) + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(vMap.Type()) + reflect.Indirect(addrVal).Set(vMap) + + err := d.decode(keyName, x.Interface(), reflect.Indirect(addrVal)) if err != nil { return err } + // the underlying map may have been completely overwritten so pull + // it indirectly out of the enclosing value. + vMap = reflect.Indirect(addrVal) + if squash { for _, k := range vMap.MapKeys() { valMap.SetMapIndex(k, vMap.MapIndex(k)) @@ -738,7 +983,7 @@ func (d *Decoder) decodeMapFromStruct(name string, dataVal reflect.Value, val re return nil } -func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) error { +func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) (bool, error) { // If the input data is nil, then we want to just set the output // pointer to be nil as well. isNil := data == nil @@ -759,7 +1004,7 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er val.Set(nilValue) } - return nil + return true, nil } // Create an element of the concrete (non pointer) type and decode @@ -773,16 +1018,16 @@ func (d *Decoder) decodePtr(name string, data interface{}, val reflect.Value) er } if err := d.decode(name, data, reflect.Indirect(realVal)); err != nil { - return err + return false, err } val.Set(realVal) } else { if err := d.decode(name, data, reflect.Indirect(val)); err != nil { - return err + return false, err } } - return nil + return false, nil } func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) error { @@ -791,8 +1036,8 @@ func (d *Decoder) decodeFunc(name string, data interface{}, val reflect.Value) e dataVal := reflect.Indirect(reflect.ValueOf(data)) if val.Type() != dataVal.Type() { return fmt.Errorf( - "'%s' expected type '%s', got unconvertible type '%s'", - name, val.Type(), dataVal.Type()) + "'%s' expected type '%s', got unconvertible type '%s', value: '%v'", + name, val.Type(), dataVal.Type(), data) } val.Set(dataVal) return nil @@ -805,8 +1050,8 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) valElemType := valType.Elem() sliceType := reflect.SliceOf(valElemType) - valSlice := val - if valSlice.IsNil() || d.config.ZeroFields { + // If we have a non array/slice type then we first attempt to convert. + if dataValKind != reflect.Array && dataValKind != reflect.Slice { if d.config.WeaklyTypedInput { switch { // Slice and array we use the normal logic @@ -833,18 +1078,17 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } } - // Check input type - if dataValKind != reflect.Array && dataValKind != reflect.Slice { - return fmt.Errorf( - "'%s': source data must be an array or slice, got %s", name, dataValKind) - - } + return fmt.Errorf( + "'%s': source data must be an array or slice, got %s", name, dataValKind) + } - // If the input value is empty, then don't allocate since non-nil != nil - if dataVal.Len() == 0 { - return nil - } + // If the input value is nil, then don't allocate since empty != nil + if dataVal.IsNil() { + return nil + } + valSlice := val + if valSlice.IsNil() || d.config.ZeroFields { // Make a new slice to hold our result, same size as the original data. valSlice = reflect.MakeSlice(sliceType, dataVal.Len(), dataVal.Len()) } @@ -859,7 +1103,7 @@ func (d *Decoder) decodeSlice(name string, data interface{}, val reflect.Value) } currentField := valSlice.Index(i) - fieldName := fmt.Sprintf("%s[%d]", name, i) + fieldName := name + "[" + strconv.Itoa(i) + "]" if err := d.decode(fieldName, currentData, currentField); err != nil { errors = appendErrors(errors, err) } @@ -926,7 +1170,7 @@ func (d *Decoder) decodeArray(name string, data interface{}, val reflect.Value) currentData := dataVal.Index(i).Interface() currentField := valArray.Index(i) - fieldName := fmt.Sprintf("%s[%d]", name, i) + fieldName := name + "[" + strconv.Itoa(i) + "]" if err := d.decode(fieldName, currentData, currentField); err != nil { errors = appendErrors(errors, err) } @@ -962,13 +1206,23 @@ func (d *Decoder) decodeStruct(name string, data interface{}, val reflect.Value) // Not the most efficient way to do this but we can optimize later if // we want to. To convert from struct to struct we go to map first // as an intermediary. - m := make(map[string]interface{}) - mval := reflect.Indirect(reflect.ValueOf(&m)) - if err := d.decodeMapFromStruct(name, dataVal, mval, mval); err != nil { + + // Make a new map to hold our result + mapType := reflect.TypeOf((map[string]interface{})(nil)) + mval := reflect.MakeMap(mapType) + + // Creating a pointer to a map so that other methods can completely + // overwrite the map if need be (looking at you decodeMapFromMap). The + // indirection allows the underlying map to be settable (CanSet() == true) + // where as reflect.MakeMap returns an unsettable map. + addrVal := reflect.New(mval.Type()) + + reflect.Indirect(addrVal).Set(mval) + if err := d.decodeMapFromStruct(name, dataVal, reflect.Indirect(addrVal), mval); err != nil { return err } - result := d.decodeStructFromMap(name, mval, val) + result := d.decodeStructFromMap(name, reflect.Indirect(addrVal), val) return result default: @@ -1005,6 +1259,11 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e field reflect.StructField val reflect.Value } + + // remainField is set to a valid field set with the "remain" tag if + // we are keeping track of remaining values. + var remainField *field + fields := []field{} for len(structs) > 0 { structVal := structs[0] @@ -1014,30 +1273,47 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e for i := 0; i < structType.NumField(); i++ { fieldType := structType.Field(i) - fieldKind := fieldType.Type.Kind() + fieldVal := structVal.Field(i) + if fieldVal.Kind() == reflect.Ptr && fieldVal.Elem().Kind() == reflect.Struct { + // Handle embedded struct pointers as embedded structs. + fieldVal = fieldVal.Elem() + } // If "squash" is specified in the tag, we squash the field down. - squash := false + squash := d.config.Squash && fieldVal.Kind() == reflect.Struct && fieldType.Anonymous + remain := false + + // We always parse the tags cause we're looking for other tags too tagParts := strings.Split(fieldType.Tag.Get(d.config.TagName), ",") for _, tag := range tagParts[1:] { if tag == "squash" { squash = true break } + + if tag == "remain" { + remain = true + break + } } if squash { - if fieldKind != reflect.Struct { + if fieldVal.Kind() != reflect.Struct { errors = appendErrors(errors, - fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldKind)) + fmt.Errorf("%s: unsupported type for squash: %s", fieldType.Name, fieldVal.Kind())) } else { - structs = append(structs, structVal.FieldByName(fieldType.Name)) + structs = append(structs, fieldVal) } continue } - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) + // Build our field + if remain { + remainField = &field{fieldType, fieldVal} + } else { + // Normal struct field, store it away + fields = append(fields, field{fieldType, fieldVal}) + } } } @@ -1078,9 +1354,6 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } - // Delete the key we're using from the unused map so we stop tracking - delete(dataValKeysUnused, rawMapKey.Interface()) - if !fieldValue.IsValid() { // This should never happen panic("field is not valid") @@ -1092,10 +1365,13 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e continue } + // Delete the key we're using from the unused map so we stop tracking + delete(dataValKeysUnused, rawMapKey.Interface()) + // If the name is empty string, then we're at the root, and we // don't dot-join the fields. if name != "" { - fieldName = fmt.Sprintf("%s.%s", name, fieldName) + fieldName = name + "." + fieldName } if err := d.decode(fieldName, rawMapVal.Interface(), fieldValue); err != nil { @@ -1103,6 +1379,25 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e } } + // If we have a "remain"-tagged field and we have unused keys then + // we put the unused keys directly into the remain field. + if remainField != nil && len(dataValKeysUnused) > 0 { + // Build a map of only the unused values + remain := map[interface{}]interface{}{} + for key := range dataValKeysUnused { + remain[key] = dataVal.MapIndex(reflect.ValueOf(key)).Interface() + } + + // Decode it as-if we were just decoding this map onto our map. + if err := d.decodeMap(name, remain, remainField.val); err != nil { + errors = appendErrors(errors, err) + } + + // Set the map to nil so we have none so that the next check will + // not error (ErrorUnused) + dataValKeysUnused = nil + } + if d.config.ErrorUnused && len(dataValKeysUnused) > 0 { keys := make([]string, 0, len(dataValKeysUnused)) for rawKey := range dataValKeysUnused { @@ -1123,7 +1418,7 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e for rawKey := range dataValKeysUnused { key := rawKey.(string) if name != "" { - key = fmt.Sprintf("%s.%s", name, key) + key = name + "." + key } d.config.Metadata.Unused = append(d.config.Metadata.Unused, key) @@ -1133,6 +1428,24 @@ func (d *Decoder) decodeStructFromMap(name string, dataVal, val reflect.Value) e return nil } +func isEmptyValue(v reflect.Value) bool { + switch getKind(v) { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + } + return false +} + func getKind(val reflect.Value) reflect.Kind { kind := val.Kind() diff --git a/vendor/github.com/onsi/gomega/types/types.go b/vendor/github.com/onsi/gomega/types/types.go index ac59a3a5a4..c75fcb3cce 100644 --- a/vendor/github.com/onsi/gomega/types/types.go +++ b/vendor/github.com/onsi/gomega/types/types.go @@ -1,21 +1,35 @@ package types -type TWithHelper interface { - Helper() -} +import ( + "time" +) type GomegaFailHandler func(message string, callerSkip ...int) -type GomegaFailWrapper struct { - Fail GomegaFailHandler - TWithHelper TWithHelper -} - //A simple *testing.T interface wrapper type GomegaTestingT interface { + Helper() Fatalf(format string, args ...interface{}) } +// Gomega represents an object that can perform synchronous and assynchronous assertions with Gomega matchers +type Gomega interface { + Ω(actual interface{}, extra ...interface{}) Assertion + Expect(actual interface{}, extra ...interface{}) Assertion + ExpectWithOffset(offset int, actual interface{}, extra ...interface{}) Assertion + + Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion + EventuallyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion + + Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion + ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion + + SetDefaultEventuallyTimeout(time.Duration) + SetDefaultEventuallyPollingInterval(time.Duration) + SetDefaultConsistentlyDuration(time.Duration) + SetDefaultConsistentlyPollingInterval(time.Duration) +} + //All Gomega matchers must implement the GomegaMatcher interface // //For details on writing custom matchers, check out: http://onsi.github.io/gomega/#adding-your-own-matchers @@ -24,3 +38,42 @@ type GomegaMatcher interface { FailureMessage(actual interface{}) (message string) NegatedFailureMessage(actual interface{}) (message string) } + +/* +GomegaMatchers that also match the OracleMatcher interface can convey information about +whether or not their result will change upon future attempts. + +This allows `Eventually` and `Consistently` to short circuit if success becomes impossible. + +For example, a process' exit code can never change. So, gexec's Exit matcher returns `true` +for `MatchMayChangeInTheFuture` until the process exits, at which point it returns `false` forevermore. +*/ +type OracleMatcher interface { + MatchMayChangeInTheFuture(actual interface{}) bool +} + +func MatchMayChangeInTheFuture(matcher GomegaMatcher, value interface{}) bool { + oracleMatcher, ok := matcher.(OracleMatcher) + if !ok { + return true + } + + return oracleMatcher.MatchMayChangeInTheFuture(value) +} + +// AsyncAssertions are returned by Eventually and Consistently and enable matchers to be polled repeatedly to ensure +// they are eventually satisfied +type AsyncAssertion interface { + Should(matcher GomegaMatcher, optionalDescription ...interface{}) bool + ShouldNot(matcher GomegaMatcher, optionalDescription ...interface{}) bool +} + +// Assertions are returned by Ω and Expect and enable assertions against Gomega matchers +type Assertion interface { + Should(matcher GomegaMatcher, optionalDescription ...interface{}) bool + ShouldNot(matcher GomegaMatcher, optionalDescription ...interface{}) bool + + To(matcher GomegaMatcher, optionalDescription ...interface{}) bool + ToNot(matcher GomegaMatcher, optionalDescription ...interface{}) bool + NotTo(matcher GomegaMatcher, optionalDescription ...interface{}) bool +} 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 8464f6c8ec..4518bc3037 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 @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: catalogsources.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml index 231df701d0..7d3a2abe33 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_clusterserviceversions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: clusterserviceversions.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml index 506b2b1554..616f51ba0d 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_installplans.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: installplans.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml index af96a5c20b..eb9a6d5a79 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorconditions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operatorconditions.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml index 0927d45a0e..e59131ac3a 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operatorgroups.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operatorgroups.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml index 9c47bf45f3..ef206c5e7a 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_operators.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: operators.operators.coreos.com spec: diff --git a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml index 4b92cac164..f4070f0878 100644 --- a/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml +++ b/vendor/github.com/operator-framework/api/crds/operators.coreos.com_subscriptions.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.0 + controller-gen.kubebuilder.io/version: v0.6.2 creationTimestamp: null name: subscriptions.operators.coreos.com spec: 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 762a868c8e..e7af33e538 100644 --- a/vendor/github.com/operator-framework/api/crds/zz_defs.go +++ b/vendor/github.com/operator-framework/api/crds/zz_defs.go @@ -84,7 +84,7 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x5a\x6d\x73\x1b\xb7\x8f\x7f\xef\x4f\x81\xf1\xdd\x4c\xe2\x9c\xb4\x8e\x93\x4e\xae\xd5\x34\xcd\xb8\xce\xa5\xe7\x69\x9c\x78\xec\xa4\x33\x77\xb1\xef\x0a\xed\x42\x2b\xd6\x5c\x72\x4b\x72\x6d\xab\x9d\x7e\xf7\xff\x80\x0f\xbb\x7a\x5a\x49\x76\x1b\xbd\xb1\xc5\x07\x00\x04\x01\xfc\x00\x50\x58\x8b\x5f\xc8\x58\xa1\xd5\x08\xb0\x16\x74\xef\x48\xf1\x37\x9b\xdd\x7c\x6b\x33\xa1\x0f\x6f\x8f\xf6\x6e\x84\x2a\x46\x70\xd2\x58\xa7\xab\x0b\xb2\xba\x31\x39\xbd\xa5\x89\x50\xc2\x09\xad\xf6\x2a\x72\x58\xa0\xc3\xd1\x1e\x00\x2a\xa5\x1d\xf2\xb0\xe5\xaf\x00\xb9\x56\xce\x68\x29\xc9\x0c\x4b\x52\xd9\x4d\x33\xa6\x71\x23\x64\x41\xc6\x13\x4f\xac\x6f\x9f\x67\xaf\xb2\xe7\x7b\x00\xb9\x21\xbf\xfd\x93\xa8\xc8\x3a\xac\xea\x11\xa8\x46\xca\x3d\x00\x85\x15\x8d\x20\x47\x87\x52\x97\x41\x08\x9b\xe9\x9a\x0c\x3a\x6d\x6c\x96\x6b\x43\x9a\xff\x54\x7b\xb6\xa6\x9c\xb9\x97\x46\x37\xf5\x08\xd6\xae\x09\xf4\x92\x90\xe8\xa8\xd4\x46\xa4\xef\x00\x43\xd0\xb2\xf2\xff\xc7\xc3\x07\xb6\x97\x9e\xad\x1f\x97\xc2\xba\x9f\x57\xe7\xde\x0b\xeb\xfc\x7c\x2d\x1b\x83\x72\x59\x60\x3f\x65\xa7\xda\xb8\x0f\x1d\x7b\x66\x97\xa3\xb3\x26\x0f\xd3\x42\x95\x8d\x44\xb3\xb4\x77\x0f\xc0\xe6\xba\xa6\x11\xf8\xad\x35\xe6\x54\xec\x01\x44\x15\x46\x52\x43\xc0\xa2\xf0\xd7\x82\xf2\xdc\x08\xe5\xc8\x9c\x68\xd9\x54\xaa\x65\xc5\x6b\x0a\xb2\xb9\x11\xb5\xf3\xaa\xff\x34\x25\xa8\x0d\x39\x37\xf3\x2a\x01\x3d\x01\x37\xa5\xc4\xbb\xdd\x05\xf0\x9b\xd5\xea\x1c\xdd\x74\x04\x19\x6b\x38\x2b\x84\xad\x25\xce\x58\x9a\xb9\x55\xe1\x9a\xde\x86\xb9\xb9\x71\x37\x63\xd1\xad\x33\x42\x95\x9b\x44\xe1\x75\xbb\xcb\x10\x54\xf3\x69\x56\xaf\x8a\xb0\x34\xb8\x2b\xff\xba\x19\x4b\x61\xa7\x64\x76\x17\xa2\xdd\xb2\x22\xc3\xf9\x9a\x99\x1e\x41\xe6\x88\x26\x87\xca\x56\x9c\x61\x85\xc1\x71\xb9\x7a\xc6\x02\x5d\x1a\x0c\x8b\x6e\x8f\x50\xd6\x53\x3c\x8a\x83\x36\x9f\x52\x85\x9d\x3d\xe8\x9a\xd4\xf1\xf9\xe9\x2f\x2f\x2f\x97\x26\x60\x51\x3b\x0b\x76\x0e\xc2\x02\x82\xa1\x5a\x5b\xe1\xb4\x99\xb1\xb6\x4e\x2e\x7f\xb1\x03\x38\xb9\x78\x6b\x07\x80\xaa\x68\x1d\x0f\x6a\xcc\x6f\xb0\x24\x9b\xad\xc8\xaa\xc7\xbf\x51\xee\xe6\x86\x0d\xfd\xde\x08\x43\xc5\xbc\x14\xac\x9e\xa4\x93\xa5\x61\xd6\xff\xdc\x50\x6d\x98\xa7\x9b\x73\xe4\xf0\x99\x8b\x72\x0b\xe3\x4b\x27\x7c\xc2\x6a\x08\xeb\xa0\xe0\x00\x47\xd6\x9b\x40\xf4\x31\x2a\xa2\xee\x82\x69\x08\xcb\xe7\x37\x64\x49\x85\x90\xc7\xc3\xa8\xe2\x99\x32\xb8\x24\xc3\x1b\xd9\xdd\x1b\x59\x70\x24\xbc\x25\xe3\xc0\x50\xae\x4b\x25\xfe\x68\xa9\x59\x70\xda\xb3\x91\xe8\xc8\x3a\xf0\x5e\xab\x50\xc2\x2d\xca\x86\x82\x2a\x2b\x9c\x81\x21\xa6\x0b\x8d\x9a\xa3\xe0\x97\xd8\x0c\xce\xb4\x21\x10\x6a\xa2\x47\x30\x75\xae\xb6\xa3\xc3\xc3\x52\xb8\x14\xc3\x73\x5d\x55\x8d\x12\x6e\x76\xe8\xc3\xb1\x18\x37\x1c\x0e\x0f\x0b\xba\x25\x79\x68\x45\x39\x44\x93\x4f\x85\xa3\xdc\x35\x86\x0e\xb1\x16\x43\x2f\xac\xf2\x71\x3c\xab\x8a\x7f\x33\x31\xea\xdb\x27\x4b\xea\x5b\x6b\xcc\x90\xc2\xe6\x46\x5d\x73\xf0\x0c\x56\x14\xb6\x87\xb3\x74\x2a\xe5\x21\xd6\xca\xc5\x7f\x5d\x7e\x82\x24\x40\x50\x7b\xd0\x70\xb7\xd4\x76\xca\x66\x45\x09\x35\x21\x13\x56\x4e\x8c\xae\x3c\x15\x52\x45\xad\x85\x72\xc1\xa5\xa5\x20\xe5\xc0\x36\xe3\x4a\x38\xeb\x6d\x8e\xac\xe3\x7b\xc8\xe0\xc4\x43\x18\x8c\x09\x9a\x9a\x3d\xa9\xc8\xe0\x54\xc1\x09\x56\x24\x4f\xd0\xd2\x57\x57\x35\x6b\xd4\x0e\x59\x7d\xbb\x2b\x7b\x1e\x81\x57\x37\xac\xf8\x18\x40\x42\xc8\x9d\x16\xf7\x39\x25\x04\x0f\x5c\x17\x81\x61\x83\x2f\xf2\x07\x8b\xc2\x90\x5d\x33\xb1\xe2\x90\x61\x61\xb0\x93\xa9\xb6\x7c\x7f\xe8\xe0\xe3\xfb\x33\xc8\x51\x41\x63\x89\x9d\x27\xd7\x4a\xb1\x41\x38\x0d\xc8\x58\x36\xa4\x7b\x61\xbd\x01\x19\x2a\x85\x75\x66\x96\xc1\x3b\x6d\x2a\x74\x23\xf8\x3e\x0d\x0d\x3d\x39\x6d\x40\xd4\x3f\x8c\xbe\xaf\xb5\x71\x3f\xc0\x47\x25\x67\x4c\xb4\x80\xbb\x29\x29\xb8\x6c\xcf\x06\xaf\xe7\xbe\xfc\x64\xea\x3c\x83\xd3\x52\x69\x93\x56\xb2\x55\x9d\x56\x58\x12\x4c\x04\x49\x6f\xd7\x96\x5c\xb6\x7c\x83\x1b\x6f\x11\x42\xba\x34\x11\xe5\x19\xd6\x5b\x55\x73\x92\x56\x32\x2f\x66\x3f\x0f\xde\xdd\xa4\xd3\xde\x94\xf9\x48\xfc\x2f\xe6\x37\x80\x91\x4b\x85\xf5\xd0\x7a\xb7\x99\x53\xd3\x6e\x1a\x38\x49\x04\x58\x7f\xdd\xf0\x69\x8c\x5c\xd9\x43\x8f\x3d\x7f\xb2\x07\xef\xed\xd2\x90\xad\x4a\x3b\x5b\x87\x22\x3b\xf0\x10\xf9\x26\xc1\xd6\xfa\x0c\x6c\xf4\x1b\xf0\xbe\x33\x46\x4b\xaf\xbe\xe9\x11\x28\xa0\x5e\x21\xd0\xad\xfa\x16\x6c\xf1\x2f\xfe\x74\xc4\xd7\xcf\x6f\x39\x32\xf8\xb8\x12\xd9\x3f\x8a\x82\x60\x7f\xd8\x7a\x25\xc1\x6b\xd8\xbf\x55\x9b\x30\x0c\x93\x3d\xfa\xf2\x01\x85\x22\x13\xa8\xb1\x0d\x0b\x65\x1d\x2a\x27\xd0\x91\xcf\x40\xa2\x37\x47\x4b\xbe\x13\x6e\xba\xab\x15\x47\x3f\x9e\x40\x84\x91\x81\xf7\x9d\x18\x9b\x3a\x47\x16\xc1\xd1\x1f\x6c\xd4\xb5\x11\xda\x08\x37\xdb\x1e\xe5\xce\xe3\xca\xc8\x13\xad\x15\xa5\xe2\x88\x77\x47\xa2\x9c\xba\x94\x1f\xc4\x4c\x14\x12\x14\xea\xc4\x42\xfc\xc1\xc0\x48\x15\x58\x1d\xe2\xa3\x70\x3e\x3c\x8e\x89\x15\x68\x9b\x8a\x0a\x18\xcf\x3c\x8d\x82\x6a\x52\x05\xa9\x7c\xe6\x31\x55\xde\x92\xc9\xe0\xb3\xe5\x9b\x82\xff\x16\x25\xe7\xbd\x91\xa9\x50\x85\xe0\xc2\xc8\x06\x92\x1e\x4e\x97\x24\x10\x96\x55\x37\x21\xc3\x71\x50\xb3\xfa\xa5\xbe\x6b\x29\x50\xb1\xb4\xde\x42\xd1\x78\xa4\x5f\x16\xa2\x61\x3d\x64\x3e\xfd\x36\xa8\xca\x36\x8c\x25\x0d\xc6\xd4\x80\x8f\x54\xea\x80\xe9\x3e\xef\x14\xb7\x5e\x0b\x8a\x4a\xf4\xff\x8b\x10\x88\x5b\x1a\x42\xb9\x97\x2f\x02\xdd\x82\x26\xd8\x48\x17\x29\x79\xa0\x58\x3a\x0c\x5b\x0e\x34\x2a\x28\x9f\x8a\x8e\xf9\x9d\x4f\xdf\xc6\x04\xcf\x03\xa9\x75\xfb\x98\xad\xe5\x00\xbc\x28\xb2\x85\x3b\x21\x25\xef\x35\xa8\x6e\xa8\x00\x49\xf7\x22\xd7\xa5\xc1\x7a\x2a\x72\x94\x72\xe6\xdd\xb4\x00\xad\x80\x33\x11\x8e\xe1\x1b\x40\x83\x33\xc3\x72\xa1\x98\x88\x96\x96\xca\x8c\x07\x07\x4f\x4b\xb9\x21\xb7\x1d\x88\x2f\xc3\xba\x2e\xe5\x62\x78\x63\x15\x47\x02\xc1\x46\xa2\xcd\x25\xb4\xc1\x3c\x67\x47\xf2\xa6\xab\x95\xe3\x44\x6d\xa9\xa8\xca\xe0\xd4\xb1\x15\x8d\x39\xef\x75\x1a\x6e\x88\xea\x60\x69\x5c\x5e\x83\xad\x50\xca\x01\x17\xc4\x39\x01\x61\x3e\x0d\xea\x54\x14\xd1\x8c\xc0\x19\x41\x05\x4c\xb4\x01\xba\x25\x8e\x17\xf1\x6e\x48\x31\x9a\xf5\x6a\x03\x8d\x59\x28\x4e\xd3\x47\x38\xaa\x7a\xc2\xe9\x66\x35\xb6\x31\x65\xbb\x26\xbb\x58\x14\x81\x3b\x55\xbc\xb6\x6b\x2e\x3c\x80\x75\xc8\x52\x2f\x9d\x41\x47\xe5\xf6\x58\xf3\x79\x61\x79\x5b\xe5\x4c\xf5\x5d\xca\x77\x57\x9c\x9c\x03\xaf\x4d\x77\x5b\x08\x9b\xb3\xa7\x53\xc1\x49\x86\x15\x36\xdc\x29\xaa\x50\xb6\xdc\xa2\x0c\xa6\x90\x08\xd7\x5a\x4a\xef\xf2\x8d\x09\x35\x12\x57\x33\xa8\x80\xaa\x31\x15\x05\xd7\x40\x49\x94\x1e\x98\xdb\x02\xb1\xdb\x50\x30\xe1\xc3\xb9\x96\x72\x33\x8a\xf5\xb2\xd8\x85\x0d\x7f\x92\x02\xfa\x57\x2c\x43\x5f\xd2\x98\xb0\xad\xcf\x14\xe4\xc8\x54\x42\x51\x30\x0d\x51\x51\xa7\xd8\x31\xb9\x3b\x22\x05\xf9\x94\xf2\x9b\xd6\x95\x62\xd5\xb8\x74\x6b\xb1\x64\x5d\x8c\x58\x5d\x41\xae\xa5\xf4\x65\xa7\x25\x02\x31\x01\x04\x45\x77\x69\xcf\x92\x8f\xce\x05\x7b\xbc\x45\x21\x71\x2c\xc9\xa3\x66\xfb\x6d\xb0\x50\xbd\x26\x3c\xaf\x1b\x29\xa9\xf0\xf7\x5d\x5e\x9c\x9f\x80\x33\x38\x99\x88\x9c\xa7\x0a\x61\x28\x77\xe1\xc0\xbd\x47\x58\xe7\xbd\x8b\x37\xb6\xc6\x23\xac\x43\xd7\xac\xdc\xd1\x86\x0b\xde\x74\xb1\xb9\x56\xa1\x97\xb6\x3d\x3e\x5e\xb4\xa5\x68\x80\x02\xc7\xd9\x09\xfb\xc5\x62\xd7\x24\x83\x0f\xda\x51\xf0\x90\x33\xb2\x0c\xbb\x5e\x41\x17\x84\x56\xab\xb9\xe8\xca\x44\xb4\x11\xa5\x50\x28\xe3\xa1\x7c\xcd\xc9\x35\x8c\xd0\x6a\x00\x77\x53\x91\x4f\x7d\xb5\x3b\x26\xa8\x44\x69\xd0\xb5\x41\xb1\x93\x3b\xa2\x4b\xc4\xc5\x49\xc3\x45\x67\x06\xc7\x6a\xe6\xef\x7b\x42\xc8\x03\x4c\xd9\x19\x5d\x34\x39\xe7\x4b\x1c\x60\xb9\xac\xea\x88\xfc\xa3\x61\x74\x41\x6b\xfb\x27\x89\x49\x4a\xf4\x2c\x3b\x00\x0a\x69\x7d\x4c\xd7\x8a\x00\xb9\x56\x75\xad\x4d\x36\xc6\x78\xf4\x49\x0a\xf6\x60\x71\x7c\x7e\x0a\xa9\x31\x9d\xc1\x70\x38\x84\x4f\x3c\x6c\x9d\x69\x72\x8f\x2f\xec\x42\xaa\x88\x48\x11\xac\xcf\x1f\x12\x7d\xda\xe9\x8f\x01\x18\xb4\x1e\x52\xb0\x1a\xdd\x14\xb2\xa0\xf8\x6c\x4e\x15\xc0\x75\x24\xd0\x3d\x56\xb5\xb7\x7b\x0e\xdd\xef\xb4\xbe\x0c\x37\x14\x18\xfe\xe9\x0f\x7a\x78\xb8\x6c\x14\x7a\xcc\x39\x6a\x68\x8e\x07\xdb\x98\x68\xfd\xc4\x2e\x9e\x29\x4b\x9b\x7f\x56\xfa\x4e\xad\x13\xc1\xf3\x44\x43\x23\xb8\xda\x3f\x4e\x2e\x78\xb5\x3f\x80\xab\xfd\x73\xa3\x4b\xce\x5d\x85\x2a\x79\x80\x2d\xeb\x6a\xff\x2d\x95\x06\x0b\x2a\xae\xf6\x13\xe9\xff\xa8\xd1\xe5\xd3\x33\x32\x25\xfd\x4c\xb3\xd7\x9e\xe0\xc2\x54\x82\x87\xd7\x15\xaf\x69\xe7\x18\x93\x19\xb8\x5e\x73\xe1\x37\x3f\x78\x86\xf5\x02\xa1\x93\xce\x00\xbf\x5c\x57\xe4\xf0\xf6\x28\xeb\xae\xfa\xd7\xdf\xac\x56\xa3\xab\xfd\xee\x4c\x03\x5d\xb1\xc9\xd4\x6e\x76\xb5\x0f\x0b\x12\x8c\xae\xf6\xbd\x0c\x69\x3c\x09\x3d\xba\xda\x67\x6e\x3c\x6c\xb4\xd3\xe3\x66\x32\xba\xda\x1f\xcf\x1c\xd9\xc1\xd1\xc0\x50\x3d\xe0\x4c\xea\x75\xc7\xe1\x6a\xff\x57\xb8\x52\x49\x68\xed\x38\xcf\xf5\x37\x6d\xe1\xaf\xfd\x0d\x78\xbf\x01\x14\x36\x17\x77\x5c\xbd\x49\xb4\xee\x93\x41\x65\x45\x6a\xe2\xf6\x2e\xad\x42\x30\xe8\x9d\x37\x3e\x40\xf4\x4e\x07\x2b\xe9\x9d\xee\x81\xd6\x5d\x60\x6d\xf5\x0c\xfd\xf0\xb6\xe0\xdb\xab\x1b\x53\xbe\xc3\x33\x01\xd9\x62\x66\x18\xed\xc2\xb5\xab\xd9\x51\x39\xc9\x67\xff\x8f\xc1\x8f\xd3\x49\xe5\xef\x2d\x8b\xce\x3d\x4d\x69\x79\xdb\x80\x69\x54\x41\x46\xce\x38\xdd\xe8\xa8\xe6\x53\xae\x06\x8a\x0c\x18\xb2\x42\x71\x64\x41\x69\x07\x37\xec\x60\x1e\xba\x14\x34\x36\x75\x1b\xbd\x5c\x2d\x45\x0e\x2c\x21\x20\x44\x32\x1e\x05\xf3\x9c\x6a\xe7\x61\xb0\x57\x15\x5b\x4b\x6b\xfe\x4c\x62\x4b\x8a\xd3\xae\xa1\xeb\x37\x8f\x68\x1c\x3b\x2a\x3e\xae\x8e\x2d\xb3\xa6\x42\xc6\x15\x2c\x58\xde\x6e\x2e\xd4\x76\xa1\x16\x0b\xf1\x16\xc7\xba\x09\x11\xb0\xbb\x87\xa8\xea\x88\x32\x3e\x6b\xab\xdd\x2c\x1e\xeb\x6f\x1e\xbe\xc2\xfb\xf7\xa4\x4a\x37\x1d\xc1\xcb\x17\xff\xf9\xea\xdb\x9e\x85\x21\x68\x52\xf1\x13\x29\x0a\x19\xe4\x8e\x6a\x58\xdd\x38\xd7\x2f\xf6\xe7\xec\xde\x59\xca\x6e\x4d\xac\x75\xe7\xed\xf2\x0e\x7d\x33\x2f\x62\x69\x53\xb3\x5e\x18\x05\x42\x23\x22\xa7\x01\x67\x50\x6b\x89\x89\x36\xb8\xcb\x19\x1c\xbd\x18\xc0\x38\xaa\x78\x35\xac\x7f\xb9\xbf\xce\xd6\x88\x2c\x2c\x7c\x37\x58\x92\x47\x58\xe0\xab\xd2\x13\x6f\x38\xa1\xfe\x34\x14\x60\x32\x75\x0a\x56\x61\x92\x5a\x79\xb7\x5d\x5c\x5f\x95\x99\x3e\xc9\x6c\x85\x72\xaf\xbe\xe9\xbf\x5f\xa1\x44\xd5\x54\x23\x78\xde\xb3\x24\x84\xb4\x1d\x6f\x33\x2c\xee\xb2\x04\xe4\xd0\x55\x1a\xac\x38\x1f\xca\x41\x14\xa4\x9c\x98\x08\x32\xf3\xa6\xed\x7b\x01\x61\x23\xe3\xfe\x82\x16\x9f\xd8\x18\x87\xe6\x8c\xfd\x3c\x24\x41\xc6\xa3\x33\xeb\x53\x70\xbe\x3a\x17\xa0\x66\x35\x05\x6f\x08\xd5\x0d\xd0\x7d\x1d\xf2\xd8\x58\xec\xfb\x97\x1a\x42\x25\x54\x69\x23\x4b\x11\x1b\x49\x01\x8d\xef\xa6\xe4\xa1\xc7\x3f\x2a\xc5\x3d\x26\x34\x69\x44\xe1\x8b\x2a\x84\xb2\x41\x83\xca\x71\x8d\x7b\x7c\x7e\x1a\x12\xf8\xd0\xb5\xe8\x42\x1e\x76\x0f\x12\xc9\x1b\x83\xab\x86\x60\xc5\x22\xc6\x47\x0c\xef\xb1\xff\x9c\xab\x1e\x3d\x7f\xb1\xf1\xca\xdb\x75\xbd\x8b\x6a\x74\x8e\x8c\x1a\xc1\xff\x7d\x39\x1e\xfe\x2f\x0e\xff\xb8\x7e\x1a\xff\x79\x3e\xfc\xee\xff\x07\xa3\xeb\x67\x73\x5f\xaf\x0f\xde\xfc\x7b\x0f\xa5\xf5\x99\x7e\x8f\xf9\x44\x10\x49\x49\x64\xba\xd1\x81\x47\x18\x3d\x81\x4f\xa6\xa1\x01\xbc\x43\x69\x69\x00\x9f\x95\x87\x86\xbf\xa9\x34\x52\x4d\xb5\xa9\x12\x1c\xc2\x3e\x73\x5d\x9f\x7c\xb4\x4b\xbc\x48\x9b\xd7\x44\x71\x37\xd5\xb6\xbb\x29\x29\xf5\x21\xe6\x22\xcd\xdc\xc3\x97\x7f\x29\x61\x47\xd2\x59\x4c\x7f\xb3\x5c\x57\x87\x73\x0f\x63\x9c\x77\x9f\xa1\x9a\x41\x17\xd6\x42\xb2\xba\x6c\xe9\xd6\x71\x6c\xc2\xdc\x68\x6b\xdb\x97\x3d\x0b\x52\xdc\x10\x1c\x77\x45\x25\x07\xcb\x31\xe5\xe8\x13\x75\x33\x16\xce\x60\xe8\x08\xa7\xdc\xb2\x6b\x37\x4d\x1a\x09\x4f\xb9\x96\xcd\x94\x2e\x68\x35\xba\x1e\xc4\xd6\xee\x58\x48\xe1\x66\xa1\xce\xce\xb5\x9a\x48\x11\xeb\x83\xaa\xd6\xc6\xa1\x72\xb1\x09\x49\x25\xdd\x83\x70\x50\x71\xce\x49\xfe\xf9\xe9\x69\xa1\xec\xd1\xd1\x8b\x97\x97\xcd\xb8\xd0\x15\x0a\xf5\xae\x72\x87\x07\x6f\x9e\xfe\xde\xa0\xe4\xc8\x53\x7c\xc0\x8a\xde\x55\xee\xe0\x9f\x83\xc5\xa3\x57\x3b\x78\xd1\xd3\x2f\xc1\x57\xae\x9f\x7e\x19\xc6\xff\x9e\xa5\xa1\x83\x37\x4f\xaf\xb2\x8d\xf3\x07\xcf\xf8\x0c\x73\x1e\x78\xfd\x65\xd8\xb9\x5f\x76\xfd\xec\xe0\xcd\xdc\xdc\xc1\x3a\x67\xbc\x1f\xde\x34\x63\x32\x8a\x1c\xd9\x21\x57\x03\xc3\x0a\xeb\xe1\x0d\xcd\x7a\x9c\xb3\x37\x1d\x5d\x25\x14\x34\x56\x61\xdd\xff\x4e\x76\x41\x13\x32\xa4\xf2\xb5\x46\xfe\x37\x9f\x67\x14\xf6\xa4\x64\x61\xca\xff\x04\xe7\x11\x2d\x29\xc6\x9d\xd0\x86\xdb\x94\x4e\xef\x60\x2d\xbb\xe5\x8f\xaa\xe7\x61\x6c\x27\x26\xed\x39\x1f\x4d\x21\xf9\x77\xcf\xef\x2f\x76\xa6\xd3\x88\xde\x4a\x6b\xb1\xc1\x79\xfa\x36\xa4\xbe\x3e\xf4\xf8\x74\x6e\xaa\xb9\xce\x6b\x94\xf8\xbd\x21\x38\x7d\x1b\xe3\xd1\x00\x84\xca\x65\x53\x70\xa6\xf0\xf9\xf3\xe9\x5b\x2e\xee\x7f\x8c\xe1\xe6\x8e\xa0\xd0\xea\x89\x83\x8f\x1f\xde\xff\x8f\xef\x14\xf8\x15\x83\x00\xe8\xe1\xb1\x0a\xa5\x08\x3f\xdd\x48\x00\x0c\x3f\x12\xd3\x8a\x9c\x73\xac\xdb\xe6\x8a\x0f\x77\xaa\x80\x29\xc9\x9a\x13\x88\x1b\x02\xdb\x98\x28\x1d\x13\xf6\xb3\x5e\xd7\x50\x68\x0f\xdd\x25\x39\x6f\xe4\xd2\xff\x04\xe1\x31\x4a\x8b\x8f\xe2\x42\xab\x4b\xce\x02\xbf\x82\x7f\xb0\x21\x7f\x8c\x39\xab\xe7\xf1\x08\x67\xd8\xf0\x4b\x80\xad\x27\x84\xe8\x4c\x27\xe1\xa4\x5f\xdd\x93\x56\xce\xfb\x28\x8e\xa1\xd9\xe9\x9f\x3d\x2f\xb6\x34\xa7\x57\x7e\x9c\xb6\x58\x3a\x2f\xfd\x20\xcb\x37\x5e\xdb\x97\xd3\x29\x5a\x18\x13\x29\xdf\xeb\x0d\xad\x41\x52\xd1\xea\xa8\xeb\xd2\x36\xf5\xd0\xe9\x61\xb1\xfe\xf2\xb6\x68\x6e\xbb\xd6\x36\x54\xae\x0b\x67\x3b\x7e\x70\xa1\x7a\x37\x9d\xad\xd3\x81\x0d\xbd\x4e\x2e\xbc\xda\x1c\xe4\xa1\x07\xeb\x2f\x4c\x96\x5a\xbe\xbe\xb2\x88\x4d\x8d\x58\x67\xac\x8a\xc4\xd5\xe3\x42\x67\xc3\x69\xff\xd4\xb7\xd8\xf5\x7b\xb8\x8c\xe1\x9a\x2f\xc9\xdc\x8a\x47\x81\xdf\x36\xc7\xf4\xbf\x3d\xa4\xe2\xf8\xeb\xbb\x15\xa7\x5e\x8f\x66\xe2\xdb\x7f\xb9\xde\xf2\xb6\xb3\x81\x80\x0d\x1a\xec\xfb\xf9\xc8\x43\x69\x3c\x14\x2c\x43\x34\x19\x81\x33\x4d\xd2\x8e\x75\xda\xf8\xf7\xf8\xf9\xb1\x66\xdc\x26\xca\x1d\xf5\x58\x03\xc1\x9f\x7f\xed\xfd\x2b\x00\x00\xff\xff\xff\x45\x04\xba\xc8\x2d\x00\x00") +var _operatorsCoreosCom_catalogsourcesYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xb4\x5a\x6d\x73\x1b\xb7\x8f\x7f\xef\x4f\x81\xf1\xdd\x4c\xe2\x9c\xb4\x8e\x93\x4e\xae\xd5\x34\xcd\xb8\xce\xa5\xe7\x69\x9c\x78\xec\xa4\x33\x77\xb1\xef\x0a\xed\x42\x2b\xd6\x5c\x72\x4b\x72\x6d\xab\x9d\x7e\xf7\xff\x80\x0f\xbb\x7a\x5a\x49\x76\x1b\xbd\xb1\xc5\x07\x00\x04\x01\xfc\x00\x50\x58\x8b\x5f\xc8\x58\xa1\xd5\x08\xb0\x16\x74\xef\x48\xf1\x37\x9b\xdd\x7c\x6b\x33\xa1\x0f\x6f\x8f\xf6\x6e\x84\x2a\x46\x70\xd2\x58\xa7\xab\x0b\xb2\xba\x31\x39\xbd\xa5\x89\x50\xc2\x09\xad\xf6\x2a\x72\x58\xa0\xc3\xd1\x1e\x00\x2a\xa5\x1d\xf2\xb0\xe5\xaf\x00\xb9\x56\xce\x68\x29\xc9\x0c\x4b\x52\xd9\x4d\x33\xa6\x71\x23\x64\x41\xc6\x13\x4f\xac\x6f\x9f\x67\xaf\xb2\x17\x7b\x00\xb9\x21\xbf\xfd\x93\xa8\xc8\x3a\xac\xea\x11\xa8\x46\xca\x3d\x00\x85\x15\x8d\x20\x47\x87\x52\x97\x41\x08\x9b\xe9\x9a\x0c\x3a\x6d\x6c\x96\x6b\x43\x9a\xff\x54\x7b\xb6\xa6\x9c\xb9\x97\x46\x37\xf5\x08\xd6\xae\x09\xf4\x92\x90\xe8\xa8\xd4\x46\xa4\xef\x00\x43\xd0\xb2\xf2\xff\xc7\xc3\x07\xb6\x97\x9e\xad\x1f\x97\xc2\xba\x9f\x57\xe7\xde\x0b\xeb\xfc\x7c\x2d\x1b\x83\x72\x59\x60\x3f\x65\xa7\xda\xb8\x0f\x1d\x7b\x66\x97\xa3\xb3\x26\x0f\xd3\x42\x95\x8d\x44\xb3\xb4\x77\x0f\xc0\xe6\xba\xa6\x11\xf8\xad\x35\xe6\x54\xec\x01\x44\x15\x46\x52\x43\xc0\xa2\xf0\xd7\x82\xf2\xdc\x08\xe5\xc8\x9c\x68\xd9\x54\xaa\x65\xc5\x6b\x0a\xb2\xb9\x11\xb5\xf3\xaa\xff\x34\x25\xa8\x0d\x39\x37\xf3\x2a\x01\x3d\x01\x37\xa5\xc4\xbb\xdd\x05\xf0\x9b\xd5\xea\x1c\xdd\x74\x04\x19\x6b\x38\x2b\x84\xad\x25\xce\x58\x9a\xb9\x55\xe1\x9a\xde\x86\xb9\xb9\x71\x37\x63\xd1\xad\x33\x42\x95\x9b\x44\xe1\x75\xbb\xcb\x10\x54\xf3\x69\x56\xaf\x8a\xb0\x34\xb8\x2b\xff\xba\x19\x4b\x61\xa7\x64\x76\x17\xa2\xdd\xb2\x22\xc3\xf9\x9a\x99\x1e\x41\xe6\x88\x26\x87\xca\x56\x9c\x61\x85\xc1\x71\xb9\x7a\xc6\x02\x5d\x1a\x0c\x8b\x6e\x8f\x50\xd6\x53\x3c\x8a\x83\x36\x9f\x52\x85\x9d\x3d\xe8\x9a\xd4\xf1\xf9\xe9\x2f\x2f\x2f\x97\x26\x60\x51\x3b\x0b\x76\x0e\xc2\x02\x82\xa1\x5a\x5b\xe1\xb4\x99\xb1\xb6\x4e\x2e\x7f\xb1\x03\x38\xb9\x78\x6b\x07\x80\xaa\x68\x1d\x0f\x6a\xcc\x6f\xb0\x24\x9b\xad\xc8\xaa\xc7\xbf\x51\xee\xe6\x86\x0d\xfd\xde\x08\x43\xc5\xbc\x14\xac\x9e\xa4\x93\xa5\x61\xd6\xff\xdc\x50\x6d\x98\xa7\x9b\x73\xe4\xf0\x99\x8b\x72\x0b\xe3\x4b\x27\x7c\xc2\x6a\x08\xeb\xa0\xe0\x00\x47\xd6\x9b\x40\xf4\x31\x2a\xa2\xee\x82\x69\x08\xcb\xe7\x37\x64\x49\x85\x90\xc7\xc3\xa8\xe2\x99\x32\xb8\x24\xc3\x1b\xd9\xdd\x1b\x59\x70\x24\xbc\x25\xe3\xc0\x50\xae\x4b\x25\xfe\x68\xa9\x59\x70\xda\xb3\x91\xe8\xc8\x3a\xf0\x5e\xab\x50\xc2\x2d\xca\x86\x82\x2a\x2b\x9c\x81\x21\xa6\x0b\x8d\x9a\xa3\xe0\x97\xd8\x0c\xce\xb4\x21\x10\x6a\xa2\x47\x30\x75\xae\xb6\xa3\xc3\xc3\x52\xb8\x14\xc3\x73\x5d\x55\x8d\x12\x6e\x76\xe8\xc3\xb1\x18\x37\x1c\x0e\x0f\x0b\xba\x25\x79\x68\x45\x39\x44\x93\x4f\x85\xa3\xdc\x35\x86\x0e\xb1\x16\x43\x2f\xac\xf2\x71\x3c\xab\x8a\x7f\x33\x31\xea\xdb\x27\x4b\xea\x5b\x6b\xcc\x90\xc2\xe6\x46\x5d\x73\xf0\x0c\x56\x14\xb6\x87\xb3\x74\x2a\xe5\x21\xd6\xca\xc5\x7f\x5d\x7e\x82\x24\x40\x50\x7b\xd0\x70\xb7\xd4\x76\xca\x66\x45\x09\x35\x21\x13\x56\x4e\x8c\xae\x3c\x15\x52\x45\xad\x85\x72\xc1\xa5\xa5\x20\xe5\xc0\x36\xe3\x4a\x38\xeb\x6d\x8e\xac\xe3\x7b\xc8\xe0\xc4\x43\x18\x8c\x09\x9a\x9a\x3d\xa9\xc8\xe0\x54\xc1\x09\x56\x24\x4f\xd0\xd2\x57\x57\x35\x6b\xd4\x0e\x59\x7d\xbb\x2b\x7b\x1e\x81\x57\x37\xac\xf8\x18\x40\x42\xc8\x9d\x16\xf7\x39\x25\x04\x0f\x5c\x17\x81\x61\x83\x2f\xf2\x07\x8b\xc2\x90\x5d\x33\xb1\xe2\x90\x61\x61\xb0\x93\xa9\xb6\x7c\x7f\xe8\xe0\xe3\xfb\x33\xc8\x51\x41\x63\x89\x9d\x27\xd7\x4a\xb1\x41\x38\x0d\xc8\x58\x36\xa4\x7b\x61\xbd\x01\x19\x2a\x85\x75\x66\x96\xc1\x3b\x6d\x2a\x74\x23\xf8\x3e\x0d\x0d\x3d\x39\x6d\x40\xd4\x3f\x8c\xbe\xaf\xb5\x71\x3f\xc0\x47\x25\x67\x4c\xb4\x80\xbb\x29\x29\xb8\x6c\xcf\x06\xaf\xe7\xbe\xfc\x64\xea\x3c\x83\xd3\x52\x69\x93\x56\xb2\x55\x9d\x56\x58\x12\x4c\x04\x49\x6f\xd7\x96\x5c\xb6\x7c\x83\x1b\x6f\x11\x42\xba\x34\x11\xe5\x19\xd6\x5b\x55\x73\x92\x56\x32\x2f\x66\x3f\x0f\xde\xdd\xa4\xd3\xde\x94\xf9\x48\xfc\x2f\xe6\x37\x80\x91\x4b\x85\xf5\xd0\x7a\xb7\x99\x53\xd3\x6e\x1a\x38\x49\x04\x58\x7f\xdd\xf0\x69\x8c\x5c\xd9\x43\x8f\x3d\x7f\xb2\x07\xef\xed\xd2\x90\xad\x4a\x3b\x5b\x87\x22\x3b\xf0\x10\xf9\x26\xc1\xd6\xfa\x0c\x6c\xf4\x1b\xf0\xbe\x33\x46\x4b\xaf\xbe\xe9\x11\x28\xa0\x5e\x21\xd0\xad\xfa\x16\x6c\xf1\x2f\xfe\x74\xc4\xd7\xcf\x6f\x39\x32\xf8\xb8\x12\xd9\x3f\x8a\x82\x60\x7f\xd8\x7a\x25\xc1\x6b\xd8\xbf\x55\x9b\x30\x0c\x93\x3d\xfa\xf2\x01\x85\x22\x13\xa8\xb1\x0d\x0b\x65\x1d\x2a\x27\xd0\x91\xcf\x40\xa2\x37\x47\x4b\xbe\x13\x6e\xba\xab\x15\x47\x3f\x9e\x40\x84\x91\x81\xf7\x9d\x18\x9b\x3a\x47\x16\xc1\xd1\x1f\x6c\xd4\xb5\x11\xda\x08\x37\xdb\x1e\xe5\xce\xe3\xca\xc8\x13\xad\x15\xa5\xe2\x88\x77\x47\xa2\x9c\xba\x94\x1f\xc4\x4c\x14\x12\x14\xea\xc4\x42\xfc\xc1\xc0\x48\x15\x58\x1d\xe2\xa3\x70\x3e\x3c\x8e\x89\x15\x68\x9b\x8a\x0a\x18\xcf\x3c\x8d\x82\x6a\x52\x05\xa9\x7c\xe6\x31\x55\xde\x92\xc9\xe0\xb3\xe5\x9b\x82\xff\x16\x25\xe7\xbd\x91\xa9\x50\x85\xe0\xc2\xc8\x06\x92\x1e\x4e\x97\x24\x10\x96\x55\x37\x21\xc3\x71\x50\xb3\xfa\xa5\xbe\x6b\x29\x50\xb1\xb4\xde\x42\xd1\x78\xa4\x5f\x16\xa2\x61\x3d\x64\x3e\xfd\x36\xa8\xca\x36\x8c\x25\x0d\xc6\xd4\x80\x8f\x54\xea\x80\xe9\x3e\xef\x14\xb7\x5e\x0b\x8a\x4a\xf4\xff\x8b\x10\x88\x5b\x1a\x42\xb9\x97\x2f\x02\xdd\x82\x26\xd8\x48\x17\x29\x79\xa0\x58\x3a\x0c\x5b\x0e\x34\x2a\x28\x9f\x8a\x8e\xf9\x9d\x4f\xdf\xc6\x04\xcf\x03\xa9\x75\xfb\x98\xad\xe5\x00\xbc\x28\xb2\x85\x3b\x21\x25\xef\x35\xa8\x6e\xa8\x00\x49\xf7\x22\xd7\xa5\xc1\x7a\x2a\x72\x94\x72\xe6\xdd\xb4\x00\xad\x80\x33\x11\x8e\xe1\x1b\x40\x83\x33\xc3\x72\xa1\x98\x88\x96\x96\xca\x8c\x07\x07\x4f\x4b\xb9\x21\xb7\x1d\x88\x2f\xc3\xba\x2e\xe5\x62\x78\x63\x15\x47\x02\xc1\x46\xa2\xcd\x25\xb4\xc1\x3c\x67\x47\xf2\xa6\xab\x95\xe3\x44\x6d\xa9\xa8\xca\xe0\xd4\xb1\x15\x8d\x39\xef\x75\x1a\x6e\x88\xea\x60\x69\x5c\x5e\x83\xad\x50\xca\x01\x17\xc4\x39\x01\x61\x3e\x0d\xea\x54\x14\xd1\x8c\xc0\x19\x41\x05\x4c\xb4\x01\xba\x25\x8e\x17\xf1\x6e\x48\x31\x9a\xf5\x6a\x03\x8d\x59\x28\x4e\xd3\x47\x38\xaa\x7a\xc2\xe9\x66\x35\xb6\x31\x65\xbb\x26\xbb\x58\x14\x81\x3b\x55\xbc\xb6\x6b\x2e\x3c\x80\x75\xc8\x52\x2f\x9d\x41\x47\xe5\xf6\x58\xf3\x79\x61\x79\x5b\xe5\x4c\xf5\x5d\xca\x77\x57\x9c\x9c\x03\xaf\x4d\x77\x5b\x08\x9b\xb3\xa7\x53\xc1\x49\x86\x15\x36\xdc\x29\xaa\x50\xb6\xdc\xa2\x0c\xa6\x90\x08\xd7\x5a\x4a\xef\xf2\x8d\x09\x35\x12\x57\x33\xa8\x80\xaa\x31\x15\x05\xd7\x40\x49\x94\x1e\x98\xdb\x02\xb1\xdb\x50\x30\xe1\xc3\xb9\x96\x72\x33\x8a\xf5\xb2\xd8\x85\x0d\x7f\x92\x02\xfa\x57\x2c\x43\x5f\xd2\x98\xb0\xad\xcf\x14\xe4\xc8\x54\x42\x51\x30\x0d\x51\x51\xa7\xd8\x31\xb9\x3b\x22\x05\xf9\x94\xf2\x9b\xd6\x95\x62\xd5\xb8\x74\x6b\xb1\x64\x5d\x8c\x58\x5d\x41\xae\xa5\xf4\x65\xa7\x25\x02\x31\x01\x04\x45\x77\x69\xcf\x92\x8f\xce\x05\x7b\xbc\x45\x21\x71\x2c\xc9\xa3\x66\xfb\x6d\xb0\x50\xbd\x26\x3c\xaf\x1b\x29\xa9\xf0\xf7\x5d\x5e\x9c\x9f\x80\x33\x38\x99\x88\x9c\xa7\x0a\x61\x28\x77\xe1\xc0\xbd\x47\x58\xe7\xbd\x8b\x37\xb6\xc6\x23\xac\x43\xd7\xac\xdc\xd1\x86\x0b\xde\x74\xb1\xb9\x56\xa1\x97\xb6\x3d\x3e\x5e\xb4\xa5\x68\x80\x02\xc7\xd9\x09\xfb\xc5\x62\xd7\x24\x83\x0f\xda\x51\xf0\x90\x33\xb2\x0c\xbb\x5e\x41\x17\x84\x56\xab\xb9\xe8\xca\x44\xb4\x11\xa5\x50\x28\xe3\xa1\x7c\xcd\xc9\x35\x8c\xd0\x6a\x00\x77\x53\x91\x4f\x7d\xb5\x3b\x26\xa8\x44\x69\xd0\xb5\x41\xb1\x93\x3b\xa2\x4b\xc4\xc5\x49\xc3\x45\x67\x06\xc7\x6a\xe6\xef\x7b\x42\xc8\x03\x4c\xd9\x19\x5d\x34\x39\xe7\x4b\x1c\x60\xb9\xac\xea\x88\xfc\xa3\x61\x74\x41\x6b\xfb\x27\x89\x49\x4a\xf4\x2c\x3b\x00\x0a\x69\x7d\x4c\xd7\x8a\x00\xb9\x56\x75\xad\x4d\x36\xc6\x78\xf4\x49\x0a\xf6\x60\x71\x7c\x7e\x0a\xa9\x31\x9d\xc1\x70\x38\x84\x4f\x3c\x6c\x9d\x69\x72\x8f\x2f\xec\x42\xaa\x88\x48\x11\xac\xcf\x1f\x12\x7d\xda\xe9\x8f\x01\x18\xb4\x1e\x52\xb0\x1a\xdd\x14\xb2\xa0\xf8\x6c\x4e\x15\xc0\x75\x24\xd0\x3d\x56\xb5\xb7\x7b\x0e\xdd\xef\xb4\xbe\x0c\x37\x14\x18\xfe\xe9\x0f\x7a\x78\xb8\x6c\x14\x7a\xcc\x39\x6a\x68\x8e\x07\xdb\x98\x68\xfd\xc4\x2e\x9e\x29\x4b\x9b\x7f\x56\xfa\x4e\xad\x13\xc1\xf3\x44\x43\x23\xb8\xda\x3f\x4e\x2e\x78\xb5\x3f\x80\xab\xfd\x73\xa3\x4b\xce\x5d\x85\x2a\x79\x80\x2d\xeb\x6a\xff\x2d\x95\x06\x0b\x2a\xae\xf6\x13\xe9\xff\xa8\xd1\xe5\xd3\x33\x32\x25\xfd\x4c\xb3\xd7\x9e\xe0\xc2\x54\x82\x87\xd7\x15\xaf\x69\xe7\x18\x93\x19\xb8\x5e\x73\xe1\x37\x3f\x78\x86\xf5\x02\xa1\x93\xce\x00\xbf\x5c\x57\xe4\xf0\xf6\x28\xeb\xae\xfa\xd7\xdf\xac\x56\xa3\xab\xfd\xee\x4c\x03\x5d\xb1\xc9\xd4\x6e\x76\xb5\x0f\x0b\x12\x8c\xae\xf6\xbd\x0c\x69\x3c\x09\x3d\xba\xda\x67\x6e\x3c\x6c\xb4\xd3\xe3\x66\x32\xba\xda\x1f\xcf\x1c\xd9\xc1\xd1\xc0\x50\x3d\xe0\x4c\xea\x75\xc7\xe1\x6a\xff\x57\xb8\x52\x49\x68\xed\x38\xcf\xf5\x37\x6d\xe1\xaf\xfd\x0d\x78\xbf\x01\x14\x36\x17\x77\x5c\xbd\x49\xb4\xee\x93\x41\x65\x45\x6a\xe2\xf6\x2e\xad\x42\x30\xe8\x9d\x37\x3e\x40\xf4\x4e\x07\x2b\xe9\x9d\xee\x81\xd6\x5d\x60\x6d\xf5\x0c\xfd\xf0\xb6\xe0\xdb\xab\x1b\x53\xbe\xc3\x33\x01\xd9\x62\x66\x18\xed\xc2\xb5\xab\xd9\x51\x39\xc9\x67\xff\x8f\xc1\x8f\xd3\x49\xe5\xef\x2d\x8b\xce\x3d\x4d\x69\x79\xdb\x80\x69\x54\x41\x46\xce\x38\xdd\xe8\xa8\xe6\x53\xae\x06\x8a\x0c\x18\xb2\x42\x71\x64\x41\x69\x07\x37\xec\x60\x1e\xba\x14\x34\x36\x75\x1b\xbd\x5c\x2d\x45\x0e\x2c\x21\x20\x44\x32\x1e\x05\xf3\x9c\x6a\xe7\x61\xb0\x57\x15\x5b\x4b\x6b\xfe\x4c\x62\x4b\x8a\xd3\xae\xa1\xeb\x37\x8f\x68\x1c\x3b\x2a\x3e\xae\x8e\x2d\xb3\xa6\x42\xc6\x15\x2c\x58\xde\x6e\x2e\xd4\x76\xa1\x16\x0b\xf1\x16\xc7\xba\x09\x11\xb0\xbb\x87\xa8\xea\x88\x32\x3e\x6b\xab\xdd\x2c\x1e\xeb\x6f\x1e\xbe\xc2\xfb\xf7\xa4\x4a\x37\x1d\xc1\xcb\x17\xff\xf9\xea\xdb\x9e\x85\x21\x68\x52\xf1\x13\x29\x0a\x19\xe4\x8e\x6a\x58\xdd\x38\xd7\x2f\xf6\xe7\xec\xde\x59\xca\x6e\x4d\xac\x75\xe7\xed\xf2\x0e\x7d\x33\x2f\x62\x69\x53\xb3\x5e\x18\x05\x42\x23\x22\xa7\x01\x67\x50\x6b\x89\x89\x36\xb8\xcb\x19\x1c\xbd\x18\xc0\x38\xaa\x78\x35\xac\x7f\xb9\xbf\xce\xd6\x88\x2c\x2c\x7c\x37\x58\x92\x47\x58\xe0\xab\xd2\x13\x6f\x38\xa1\xfe\x34\x14\x60\x32\x75\x0a\x56\x61\x92\x5a\x79\xb7\x5d\x5c\x5f\x95\x99\x3e\xc9\x6c\x85\x72\xaf\xbe\xe9\xbf\x5f\xa1\x44\xd5\x54\x23\x78\xde\xb3\x24\x84\xb4\x1d\x6f\x33\x2c\xee\xb2\x04\xe4\xd0\x55\x1a\xac\x38\x1f\xca\x41\x14\xa4\x9c\x98\x08\x32\xf3\xa6\xed\x7b\x01\x61\x23\xe3\xfe\x82\x16\x9f\xd8\x18\x87\xe6\x8c\xfd\x3c\x24\x41\xc6\xa3\x33\xeb\x53\x70\xbe\x3a\x17\xa0\x66\x35\x05\x6f\x08\xd5\x0d\xd0\x7d\x1d\xf2\xd8\x58\xec\xfb\x97\x1a\x42\x25\x54\x69\x23\x4b\x11\x1b\x49\x01\x8d\xef\xa6\xe4\xa1\xc7\x3f\x2a\xc5\x3d\x26\x34\x69\x44\xe1\x8b\x2a\x84\xb2\x41\x83\xca\x71\x8d\x7b\x7c\x7e\x1a\x12\xf8\xd0\xb5\xe8\x42\x1e\x76\x0f\x12\xc9\x1b\x83\xab\x86\x60\xc5\x22\xc6\x47\x0c\xef\xb1\xff\x9c\xab\x1e\x3d\x7f\xb1\xf1\xca\xdb\x75\xbd\x8b\x6a\x74\x8e\x8c\x1a\xc1\xff\x7d\x39\x1e\xfe\x2f\x0e\xff\xb8\x7e\x1a\xff\x79\x3e\xfc\xee\xff\x07\xa3\xeb\x67\x73\x5f\xaf\x0f\xde\xfc\x7b\x0f\xa5\xf5\x99\x7e\x8f\xf9\x44\x10\x49\x49\x64\xba\xd1\x81\x47\x18\x3d\x81\x4f\xa6\xa1\x01\xbc\x43\x69\x69\x00\x9f\x95\x87\x86\xbf\xa9\x34\x52\x4d\xb5\xa9\x12\x1c\xc2\x3e\x73\x5d\x9f\x7c\xb4\x4b\xbc\x48\x9b\xd7\x44\x71\x37\xd5\xb6\xbb\x29\x29\xf5\x21\xe6\x22\xcd\xdc\xc3\x97\x7f\x29\x61\x47\xd2\x59\x4c\x7f\xb3\x5c\x57\x87\x73\x0f\x63\x9c\x77\x9f\xa1\x9a\x41\x17\xd6\x42\xb2\xba\x6c\xe9\xd6\x71\x6c\xc2\xdc\x68\x6b\xdb\x97\x3d\x0b\x52\xdc\x10\x1c\x77\x45\x25\x07\xcb\x31\xe5\xe8\x13\x75\x33\x16\xce\x60\xe8\x08\xa7\xdc\xb2\x6b\x37\x4d\x1a\x09\x4f\xb9\x96\xcd\x94\x2e\x68\x35\xba\x1e\xc4\xd6\xee\x58\x48\xe1\x66\xa1\xce\xce\xb5\x9a\x48\x11\xeb\x83\xaa\xd6\xc6\xa1\x72\xb1\x09\x49\x25\xdd\x83\x70\x50\x71\xce\x49\xfe\xf9\xe9\x69\xa1\xec\xd1\xd1\x8b\x97\x97\xcd\xb8\xd0\x15\x0a\xf5\xae\x72\x87\x07\x6f\x9e\xfe\xde\xa0\xe4\xc8\x53\x7c\xc0\x8a\xde\x55\xee\xe0\x9f\x83\xc5\xa3\x57\x3b\x78\xd1\xd3\x2f\xc1\x57\xae\x9f\x7e\x19\xc6\xff\x9e\xa5\xa1\x83\x37\x4f\xaf\xb2\x8d\xf3\x07\xcf\xf8\x0c\x73\x1e\x78\xfd\x65\xd8\xb9\x5f\x76\xfd\xec\xe0\xcd\xdc\xdc\xc1\x3a\x67\xbc\x1f\xde\x34\x63\x32\x8a\x1c\xd9\x21\x57\x03\xc3\x0a\xeb\xe1\x0d\xcd\x7a\x9c\xb3\x37\x1d\x5d\x25\x14\x34\x56\x61\xdd\xff\x4e\x76\x41\x13\x32\xa4\xf2\xb5\x46\xfe\x37\x9f\x67\x14\xf6\xa4\x64\x61\xca\xff\x04\xe7\x11\x2d\x29\xc6\x9d\xd0\x86\xdb\x94\x4e\xef\x60\x2d\xbb\xe5\x8f\xaa\xe7\x61\x6c\x27\x26\xed\x39\x1f\x4d\x21\xf9\x77\xcf\xef\x2f\x76\xa6\xd3\x88\xde\x4a\x6b\xb1\xc1\x79\xfa\x36\xa4\xbe\x3e\xf4\xf8\x74\x6e\xaa\xb9\xce\x6b\x94\xf8\xbd\x21\x38\x7d\x1b\xe3\xd1\x00\x84\xca\x65\x53\x70\xa6\xf0\xf9\xf3\xe9\x5b\x2e\xee\x7f\x8c\xe1\xe6\x8e\xa0\xd0\xea\x89\x83\x8f\x1f\xde\xff\x8f\xef\x14\xf8\x15\x83\x00\xe8\xe1\xb1\x0a\xa5\x08\x3f\xdd\x48\x00\x0c\x3f\x12\xd3\x8a\x9c\x73\xac\xdb\xe6\x8a\x0f\x77\xaa\x80\x29\xc9\x9a\x13\x88\x1b\x02\xdb\x98\x28\x1d\x13\xf6\xb3\x5e\xd7\x50\x68\x0f\xdd\x25\x39\x6f\xe4\xd2\xff\x04\xe1\x31\x4a\x8b\x8f\xe2\x42\xab\x4b\xce\x02\xbf\x82\x7f\xb0\x21\x7f\x8c\x39\xab\xe7\xf1\x08\x67\xd8\xf0\x4b\x80\xad\x27\x84\xe8\x4c\x27\xe1\xa4\x5f\xdd\x93\x56\xce\xfb\x28\x8e\xa1\xd9\xe9\x9f\x3d\x2f\xb6\x34\xa7\x57\x7e\x9c\xb6\x58\x3a\x2f\xfd\x20\xcb\x37\x5e\xdb\x97\xd3\x29\x5a\x18\x13\x29\xdf\xeb\x0d\xad\x41\x52\xd1\xea\xa8\xeb\xd2\x36\xf5\xd0\xe9\x61\xb1\xfe\xf2\xb6\x68\x6e\xbb\xd6\x36\x54\xae\x0b\x67\x3b\x7e\x70\xa1\x7a\x37\x9d\xad\xd3\x81\x0d\xbd\x4e\x2e\xbc\xda\x1c\xe4\xa1\x07\xeb\x2f\x4c\x96\x5a\xbe\xbe\xb2\x88\x4d\x8d\x58\x67\xac\x8a\xc4\xd5\xe3\x42\x67\xc3\x69\xff\xd4\xb7\xd8\xf5\x7b\xb8\x8c\xe1\x9a\x2f\xc9\xdc\x8a\x47\x81\xdf\x36\xc7\xf4\xbf\x3d\xa4\xe2\xf8\xeb\xbb\x15\xa7\x5e\x8f\x66\xe2\xdb\x7f\xb9\xde\xf2\xb6\xb3\x81\x80\x0d\x1a\xec\xfb\xf9\xc8\x43\x69\x3c\x14\x2c\x43\x34\x19\x81\x33\x4d\xd2\x8e\x75\xda\xf8\xf7\xf8\xf9\xb1\x66\xdc\x26\xca\x1d\xf5\x58\x03\xc1\x9f\x7f\xed\xfd\x2b\x00\x00\xff\xff\x50\x85\x51\xd2\xc8\x2d\x00\x00") func operatorsCoreosCom_catalogsourcesYamlBytes() ([]byte, error) { return bindataRead( @@ -104,7 +104,7 @@ func operatorsCoreosCom_catalogsourcesYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\xe4\xb6\x95\x30\x8c\xff\x9f\x4f\x81\x92\xbd\x8f\xa4\x75\x77\x6b\x26\xc9\xe6\xb7\x3b\xbf\xbc\xeb\xd2\x4a\xb2\xa3\xd7\x33\x1a\x95\x24\xdb\x4f\xca\xf1\x3a\x68\xf2\x74\x37\x56\x24\xc0\x00\x60\x4b\x9d\xc7\xcf\x77\x7f\x0b\x07\x00\x09\xf6\x45\xea\x26\x39\xa3\x8b\x81\x54\xc5\xa3\x26\x09\x82\x07\x07\xe7\x7e\xa1\x05\xfb\x01\xa4\x62\x82\xbf\x23\xb4\x60\x70\xaf\x81\x9b\xbf\xd4\xe8\xf6\xdf\xd5\x88\x89\xa3\xf9\xdb\xdf\xdd\x32\x9e\xbe\x23\x27\xa5\xd2\x22\xbf\x02\x25\x4a\x99\xc0\x29\x4c\x18\x67\x9a\x09\xfe\xbb\x1c\x34\x4d\xa9\xa6\xef\x7e\x47\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x38\x05\x3e\xba\x2d\xc7\x30\x2e\x59\x96\x82\xc4\xc9\xfd\xab\xe7\x6f\x46\x7f\x1a\xbd\xf9\x1d\x21\x89\x04\x7c\xfc\x86\xe5\xa0\x34\xcd\x8b\x77\x84\x97\x59\xf6\x3b\x42\x38\xcd\xe1\x1d\x49\xb2\x52\x69\x90\x0a\xe4\x9c\x25\xe0\x9e\x57\x23\x51\x80\xa4\x5a\x48\x35\x4a\x84\x04\x61\xfe\x93\xff\x4e\x15\x90\x98\x55\x4c\xa5\x28\x8b\x77\x64\xed\x3d\x76\x5e\xbf\x58\xaa\x61\x2a\x24\xf3\x7f\x13\x32\x24\x22\xcb\xf1\xdf\x0e\x08\xf6\xf5\xd7\xf6\xf5\x0e\x72\x78\x3d\x63\x4a\x7f\xb7\xf9\x9e\xf7\x4c\x69\xbc\xaf\xc8\x4a\x49\xb3\x4d\x1f\x82\xb7\xa8\x99\x90\xfa\xa2\x5e\x96\x59\x46\xa2\xe6\xe1\xbf\xdd\x8d\x8c\x4f\xcb\x8c\xca\x0d\xb3\xfd\x8e\x10\x95\x88\x02\xde\x11\x9c\xac\xa0\x09\xa4\xbf\x23\xc4\xbf\xcb\x4e\x3e\x24\x34\x4d\x71\x23\x69\x76\x29\x19\xd7\x20\x4f\x44\x56\xe6\xbc\x7a\xb9\xb9\x27\x05\x95\x48\x56\x68\xdc\xac\x9b\x19\x20\xd4\x88\x98\x10\x3d\x03\x72\x72\xfd\x43\x75\x2b\x21\xff\xa3\x04\xbf\xa4\x7a\xf6\x8e\x8c\xcc\x06\x8c\x52\xa6\x8a\x8c\x2e\xcc\x12\x82\xbb\xec\x6e\x9e\xda\x6b\xc1\xef\x7a\x61\xd6\xab\xb4\x64\x7c\xfa\xd0\xfb\xdd\x47\x6c\xb7\x84\x79\xb0\x4f\xe1\xeb\x7f\x58\xf9\x7d\xdb\xd7\xfb\xcf\xa7\xe6\xcd\x44\xcf\xa8\x26\x7a\xc6\x14\x11\x1c\x88\x84\x22\xa3\x09\xa8\x07\x16\xb4\xe6\x16\xbb\xa2\xab\xd5\x0b\x1b\x96\x14\x4e\xa9\xa9\x2e\xd5\xa8\x98\x51\xb5\x0a\xe2\xcb\xa5\x5f\xd7\x4c\x67\x6f\x9c\xbf\xa5\x59\x31\xa3\x6f\xdd\x8f\x2a\x99\x41\x4e\x6b\x1c\x10\x05\xf0\xe3\xcb\xf3\x1f\xfe\x70\xbd\x74\x81\x34\xa1\xb3\x16\xfb\x09\x53\x06\x54\x48\x41\x88\x27\x21\xb8\x77\x8b\x02\xc8\xdf\xd7\x3e\x73\x5d\x40\xf2\xf7\xd1\xca\xca\xc5\xf8\x7f\x20\xd1\xc1\xcf\x12\xfe\x51\x32\x09\x69\xb8\x22\x03\x20\x4f\x96\x96\x7e\x36\xf0\x0f\x7e\x2a\xa4\x21\x0b\x3a\x38\xf2\x76\x04\x74\xb1\xf1\xfb\xd2\xd7\xee\x1b\x90\xb8\x6f\x4c\x0d\x49\x04\x85\xf8\xe8\x30\x0e\x52\x07\x47\x8b\xa7\x4c\x19\xe4\x90\xa0\x80\x5b\x22\x89\x28\xc4\xdd\x37\x8d\x88\x01\x00\x48\x65\x08\x40\x99\xa5\x86\x76\xce\x41\x6a\x22\x21\x11\x53\xce\xfe\x59\xcd\xa6\x88\x16\xf8\x9a\x8c\x6a\x50\x9a\xe0\xa9\xe5\x34\x23\x73\x9a\x95\x30\x20\x94\xa7\x24\xa7\x0b\x22\xc1\xcc\x4b\x4a\x1e\xcc\x80\xb7\xa8\x11\xf9\x20\x24\x10\xc6\x27\xe2\x1d\x99\x69\x5d\xa8\x77\x47\x47\x53\xa6\x3d\xd5\x4f\x44\x9e\x97\x9c\xe9\xc5\x11\x12\x70\x36\x2e\x0d\xe1\x3c\x4a\x61\x0e\xd9\x91\x62\xd3\x21\x95\xc9\x8c\x69\x48\x74\x29\xe1\x88\x16\x6c\x88\x8b\xe5\x48\xf9\x47\x79\xfa\x85\x74\x9b\xac\xf6\x97\xc0\xb7\x16\x9d\x89\x27\xb0\x0f\xc2\xda\x90\x57\x8b\x49\xf6\x71\xfb\x2d\x35\x48\xcd\x4f\x06\x2a\x57\x67\xd7\x37\xc4\x2f\xc0\x9d\x4b\x84\x70\x7d\xab\xaa\x81\x6d\x00\xc5\xf8\x04\xa4\xbd\x73\x22\x45\x8e\xb3\x00\x4f\x0b\xc1\xb8\xc6\x3f\x92\x8c\x01\xd7\x44\x95\xe3\x9c\x69\x85\x38\x07\x4a\x9b\x7d\x18\x91\x13\x64\x7a\x64\x0c\xa4\x2c\x52\xaa\x21\x1d\x91\x73\x4e\x4e\x68\x0e\xd9\x09\x55\xf0\xc9\x41\x6d\x20\xaa\x86\x06\x7c\xdb\x03\x3b\xe4\xd9\xab\x0f\xac\x9c\x31\x42\x3c\x2f\xdd\xb8\x3b\x1b\xcf\x30\x49\x21\xc9\xa8\xb4\x42\x01\xd1\x90\x65\xe4\xe3\xfb\x0f\x64\x26\xee\x0c\x16\x33\xae\x34\xcd\x32\x3c\x05\x8e\x3f\x5b\x72\x9a\x50\x4e\x72\xca\xe9\x14\x08\x2d\x0a\x45\x26\x42\x12\x4a\xa6\x6c\x0e\xdc\x9f\xae\xd1\xb6\x8b\xdf\x44\x24\x88\x25\xee\x6b\x19\x94\xbf\xea\x16\xb8\x74\x65\x13\xd9\x30\x63\x45\x06\x7a\x00\x6a\xc7\xf5\xbd\x88\xd9\x9c\x94\x5c\x69\x59\xe2\x66\xa7\xe4\x16\x16\x0e\xc9\x73\x5a\x10\xa5\x85\xf9\xf1\x8e\xe9\x19\xa1\x21\x82\x53\x8d\x58\x3c\x06\xa2\x40\x93\xf1\x82\x18\x31\x0e\x09\x82\x16\x22\x43\x6a\x81\xcf\x22\x61\x90\xa0\x25\x83\x39\x10\x2a\xc7\x4c\x4b\x2a\x17\x15\x36\x2c\x03\xf4\x11\xa0\xe2\xc7\x06\xc2\xc3\x66\x90\x90\x87\x70\x91\x58\x72\xeb\x64\x97\xb4\x12\x2c\xb7\x80\xde\xe5\xb9\xc3\xb7\x5a\x1c\x55\x0e\xdf\x40\x11\x83\x57\x4e\x3e\xa8\xe4\x5a\x7c\x93\x43\xac\x94\x08\x59\x61\x86\x01\x5b\x88\x84\x63\x30\xe4\x44\x52\x6e\x2e\xac\x45\xee\x16\xd0\x7a\x08\x6d\xcc\x10\x77\x7c\x1d\x8e\x86\x73\x53\x29\x1b\x02\x53\x38\x98\x86\x7c\xc3\xcc\x0f\xc2\xae\xfa\xd9\x2c\x70\xce\x52\x30\x40\xd4\x94\x59\xd4\x31\xa7\x95\x8e\x45\xa9\x2d\xec\xdc\x2d\x29\x99\x33\x4a\xe8\x74\x2a\x61\x8a\x08\xbc\xf1\xb5\x8f\xc0\xc4\x8e\xcd\x07\xb4\x1e\x43\x2b\xc9\x3f\x78\x87\x21\x83\x0f\xde\xc0\xd7\x1d\xf3\xf0\x86\x55\x61\xb1\x39\x1e\xdb\x43\x3b\x68\x62\x60\xe2\x41\x2b\xe4\x83\x37\x6f\xb3\xb7\x76\x3c\xb2\xc3\x76\x34\xf7\x79\x69\x21\xee\xea\xd8\x9c\x8f\x9a\x34\x1b\x72\x80\x37\xd6\xc4\x77\x0c\xa4\x00\x39\x11\x32\x37\x07\x85\x13\x4a\x12\x2b\xbf\x55\x84\x07\x49\x23\x4f\x1e\x02\x27\xd9\x76\xff\xed\xd8\x06\x0b\xec\x18\x92\x82\xea\xd9\x23\xb7\x6d\xb7\x55\x76\x84\x40\x7b\xf4\xe6\x47\xa8\xd9\xca\xdc\x35\x87\xe9\x7d\x6e\x03\x86\xde\x27\x45\x9e\xb3\xcd\xac\x0d\x54\xbb\xa2\x77\x1f\x40\x29\xc3\xb2\x51\x4a\x93\xf4\x8e\x00\x4f\x84\x21\x16\xff\xef\xf5\xc7\x0b\x3b\xed\x88\x9c\x6b\xc2\xf2\x22\x83\xdc\x08\x62\xe4\x03\x95\x6a\x46\x33\x90\xc8\x9d\xbe\xe7\x79\xe3\x6f\x87\x89\xa5\x82\xd4\xd0\xa2\x14\x32\xba\xb0\x93\xa5\x90\x88\xd4\xd0\x68\x21\x49\x61\x04\xdc\xbc\x28\x35\x10\x6a\xaf\xe2\x7b\x19\x9f\xae\x23\xd2\x9d\x40\x43\x8c\x24\x92\x53\xfd\x8e\x8c\x17\xfa\x31\xd4\x27\xe4\x7e\x98\x6e\x4b\x03\xc2\xc5\x3c\x4e\x09\xec\xd8\x8a\x1e\x84\x13\x3f\xfa\x95\x46\x08\xa5\x8c\x83\xbc\x14\x52\x6f\x43\xb4\x8c\xf2\x31\x05\xf9\xe0\x9d\x1e\x64\x8c\xeb\x3f\xfc\xfe\x81\x3b\x53\x28\x32\xb1\x30\x78\xf1\xf8\x59\xd9\xf2\x7b\xb6\x3e\xd7\xdb\xce\xb7\xed\x59\xde\x72\x3e\x6b\x9c\xea\x63\xa6\x75\x0a\x54\xab\x89\x78\x5f\xdf\x56\x29\x81\x4f\xc6\xfc\x2e\xcf\xbd\xb5\xe1\x0a\x26\x20\x81\x27\x8e\x36\x7d\x57\x8e\x41\x72\xd0\xa0\x02\x41\x7a\x51\x38\x4a\x63\x64\xc1\x65\x76\xf7\x34\x5c\xee\x11\x79\xc6\xdf\xf6\x88\x54\xe3\x6f\x7b\x4c\xb6\xb1\x63\x17\xb6\xf9\x38\xd2\xd9\xb1\x13\x8d\x7d\x1c\x01\x5b\x4c\x3a\x5f\x6f\xce\xe9\x30\xaf\xd1\x89\x9f\x81\x84\x77\xdd\x58\x46\x43\xbe\x9b\x30\xc8\x52\xc2\x8c\xf0\x66\x16\x4b\xc6\x99\x48\x6e\x9d\xdd\xf2\xea\x94\x28\x61\xc5\x3d\x23\xe1\x1b\x46\x9b\x08\xae\xca\x1c\x08\x7b\x0c\x83\xa3\x48\x17\x45\xba\x28\xd2\xbd\x14\x91\xce\xfa\x07\x9e\x03\xa5\x5a\x5a\xc8\x46\x5a\x85\xf7\x45\x6a\xf5\xd0\x88\xd4\x0a\x47\xa4\x56\x8f\x8c\x17\x47\xad\xb6\x92\xd3\x1e\x9d\xeb\xb1\x83\x1c\x8d\xa9\xd1\x98\x1a\x8d\xa9\x6e\x44\x5e\xe6\x46\xe4\x65\x91\x97\x45\x63\xea\x43\x53\x46\x63\xea\x8e\x13\x45\x63\x6a\x34\xa6\x46\x63\x6a\x34\xa6\x3e\xf6\x31\x51\xa4\x8b\x22\x5d\x14\xe9\xb6\x5d\x4c\x34\xa6\x46\x63\xea\x43\x23\x52\xab\x60\x44\x6a\xf5\xc0\x78\xdd\xd4\xaa\xbb\x31\x35\xc9\x80\xf2\xf5\x4a\xd5\x52\xfc\x37\xde\x87\xa2\x11\x9b\x30\x97\x07\xe1\x9e\x26\x63\x98\xd1\x39\x13\xa5\x24\x77\x33\xe0\x3e\x65\x87\x4c\x41\x2b\x83\x05\xa0\x61\x9d\x60\xfe\x08\xad\x79\x98\xbe\x0c\x09\x70\x3a\xce\xd6\x4e\xfc\x18\x29\x71\x4f\x3e\x6c\x3c\x1e\x0b\x61\xbe\x6e\x15\x62\xa8\xea\x78\x4d\x67\x97\x78\xe6\xbd\x4d\x39\x76\xeb\x83\x9a\x4f\xae\x4e\xfb\x0a\x65\x26\x7f\xe3\xe4\xbc\x9a\x95\xa0\x65\x1a\x13\x25\x0c\x0f\x31\xbf\x7e\xbc\xe3\x90\x62\x92\xdb\x80\x30\x6d\x6e\x30\x87\x9e\x25\x4c\x67\x8b\xea\xc5\xa3\xbd\xdd\x37\xf1\x19\x85\x44\x9f\x5c\x9d\x6e\x6f\xbe\xf7\x1b\xf0\x39\x2c\xf5\xd1\x0e\x1f\xed\xf0\xd5\x88\x62\x50\xcb\x49\xa3\x18\xf4\xc0\x78\xdd\x62\xd0\x73\xb7\x5b\x47\x6b\x33\x89\xd6\xe6\x87\x6f\x8b\xd6\xe6\x68\x6d\x8e\xf6\x9b\x0d\x23\x0a\x2e\x38\xa2\xe0\xf2\xc8\x78\x71\x82\x4b\xb4\x36\x47\x6a\x15\xa9\x55\xa4\x56\x2f\x83\x5a\xbd\xc4\xd0\xdd\x68\xf4\x8b\x46\xbf\x68\xf4\x8b\xdc\x28\x72\xa3\x47\xc6\x8b\xe3\x46\xd1\xe8\xb7\xeb\x44\xd1\xe8\xb7\x76\x44\xa3\xdf\x23\x23\x1a\xfd\xa2\xd1\x6f\xc3\x88\x82\x4b\xcb\x49\xa3\xe0\xf2\xc0\x78\xdd\x82\x4b\x34\xfa\x45\x6a\x15\xa9\x55\xa4\x56\x2f\x83\x5a\x75\x37\xfa\x3d\x72\x92\x1e\x7e\xf6\xe1\x93\xf2\xe0\xb3\x2c\x79\xe8\x85\x9b\x20\xfa\x00\x04\x1f\x25\x5c\x8f\x91\xab\x21\x19\x53\x05\x7f\xfa\xe3\x4a\xdd\xf2\xf0\x96\x1c\x52\x46\xcd\xab\xd6\xde\xf1\x38\x09\xab\x5f\xb1\x79\xcf\xb6\xd8\xfb\x6a\x19\x2d\x67\x71\x85\x95\x1f\x0d\x8a\x35\x5b\x9b\x9e\xdb\x9b\xaf\xb5\xa4\x1a\xa6\x8b\xa0\x90\x37\xda\x64\x6b\xce\xc3\x37\x14\xa0\xaf\x94\xc6\xbb\x19\x48\xc0\x87\x7c\xe9\x69\xe5\x27\x65\xaa\x8a\x5e\x4e\x5b\x14\xf7\x7d\x2c\x1c\xd9\xbf\x67\xcd\xe5\xc7\x36\x6d\x5d\xf5\xed\xb5\xc0\xf2\x00\x3a\xb5\xd6\xeb\xd3\x2a\x05\x78\x19\x62\x05\x95\x86\x42\x7a\x2b\x37\x32\xed\xe0\xee\x25\x78\x6f\x22\x8a\x5b\x70\xea\xc7\x39\xf4\x30\xc8\x54\xde\x64\x59\xdf\x86\x31\xbb\x1e\x18\x97\x20\x73\xa6\xd4\xa6\x80\xeb\xe6\xd2\x1f\x23\x9b\x5b\x90\xcb\x0d\xf0\xf7\x5f\x14\x2c\xa7\x12\x9f\x70\x07\xe4\x98\x26\x44\x96\x99\x11\xa6\x78\x4a\x5c\xf9\x6b\x42\x93\x44\x94\x5c\x13\x0e\x90\x5a\xcb\xc6\x3a\x5c\xdd\x82\xd8\x6e\x21\x3f\x6d\x2b\x3d\x0d\xed\x3a\x1f\xbd\xcb\x7d\xc3\xb1\xfd\x84\xb5\x05\xd5\xc3\xb1\xbd\xb4\x85\xaf\x7f\x9c\x6b\xed\xc2\x0a\xb7\x66\x84\x8d\xfd\xbd\x14\x19\x4b\x16\x57\x65\x06\x64\x26\xb2\x54\x61\x59\x7f\xc3\xdd\x2b\x87\x43\x28\x22\x17\x78\x37\xae\x7e\x40\xc6\xa5\x26\xa9\x00\x45\xb8\xd0\xbe\x30\x40\xe3\x71\xeb\x62\xba\x9b\xd9\xd6\x0e\xe6\x21\x42\x8b\x22\xc3\x54\x0a\x61\x84\x96\xbb\x19\x4b\x66\xb6\x5f\x4d\x41\x13\x58\x77\xdb\xf6\xd2\xcb\x56\xe2\x35\xd9\x49\xc4\x26\xde\x66\x35\x7e\x0c\x55\xc8\x8e\xb2\x36\xb1\x25\xe2\xbf\x95\xa2\x2c\xb6\xbc\x7d\xd5\xb2\x68\x9f\x36\x54\x5e\x2f\x35\xb0\xf1\x17\x9d\xcb\xc8\xee\x8d\xbd\xad\x32\x89\x8e\x08\x39\x9f\x90\xbc\xcc\x34\x2b\x32\x7c\xc4\x56\x1b\x50\x84\x4a\xa8\xf9\xc6\x80\x50\xbe\xf0\x1e\x28\xd7\x26\x02\x52\x42\xa7\x66\x46\x8d\xfd\x61\x7c\x49\x7a\x5e\xe6\x60\x4e\x73\x5a\xbf\x04\xd5\x29\xbe\xa8\x67\x27\x77\x2c\xcb\x8c\x3c\x4b\xb3\x4c\xdc\xad\x67\x4b\xeb\xc6\x6e\x42\x21\xd9\x4d\x30\x24\xbb\x8b\xc0\x84\x70\xc1\xbd\x69\xf7\xfb\xab\xf7\xed\x36\xf1\xa2\x39\x87\xeb\x05\x02\xda\x80\xb4\xa0\x52\x33\x9a\x91\x52\x66\xca\xee\x23\x35\x4a\x80\xf4\xcd\x54\x66\x14\x3d\x83\x09\x28\xdb\xb5\x83\xfc\xab\xdd\x39\x07\x58\x7b\x3e\x05\xcf\x16\x84\xda\x9d\x9f\x94\x59\x36\x20\x13\xc6\xa9\x21\xbb\x50\xf8\x4c\x18\xa3\x3f\x91\x6b\xc6\x13\x30\xdf\x34\xac\x04\x0b\x5c\x91\x99\xd1\x9c\xef\xea\x90\xa6\x03\xd7\x56\xc4\x6a\xcb\xca\xbd\xc2\x1c\xd8\x84\x8e\x33\xc0\xbe\x16\x4e\x64\xb9\x12\x19\x9a\xb7\x9d\xe1\x3b\xb5\xbd\x48\x68\x78\xf9\xbf\x18\x47\x25\x85\x5c\x21\xe3\x30\xca\x0e\x30\x3d\x33\xba\x4f\x51\x64\x0b\x43\x28\x0c\xee\xd4\x08\x75\xa0\xca\x64\x66\x3e\x69\xaf\x10\xa9\xda\x33\x64\x64\x4f\x41\x22\x41\xab\xbd\x43\xf3\xd7\xf2\x37\xe0\xf7\x85\xcf\x1d\xd1\x82\xed\x1d\x0e\x08\x02\x08\x1b\x9d\x08\x3d\x7b\xb9\x78\xe8\xbf\xb5\xd1\x5f\xeb\xb1\xd1\xd4\x5a\xc3\x19\x5c\xd7\x0e\x51\xd8\x26\x18\x86\x46\x6b\xc0\x3c\x29\x83\x94\x88\x06\xbe\x3d\xd4\x2a\xb1\x26\xe4\x98\x13\xc8\x0b\xbd\x40\x2c\xce\x81\x72\x77\x37\xcc\x41\x2e\xf4\xcc\x68\xab\x4c\xbd\xfc\xc3\xbf\xa5\x63\xa9\x1e\x6b\x01\xee\x0e\xbc\x07\x6e\x8d\xe4\xb6\xb3\xd2\x32\x70\xf7\xff\x75\x3f\x94\x7a\x8d\xf8\x54\x53\xf3\x17\x0b\x4a\x64\xaf\xad\xc0\xf8\x83\x79\xb2\x09\x42\xfb\x93\xa5\x96\x15\xfd\x78\xff\xde\x76\x51\x72\xb0\xfa\x8e\xf1\xd4\x8a\xa8\xc7\xda\xb6\x27\x82\x2b\x30\x0b\x4e\x6c\x66\xa2\xaf\x71\x94\x5a\x02\xe9\x76\x62\x2d\xf8\x71\xed\x2f\x11\xf4\xab\x82\xed\xb6\xc2\xe8\x23\xd3\x07\x9a\xcf\x73\x50\x56\xb0\x5f\x53\x43\xfe\x31\x14\x6c\x60\x9d\x51\x06\x05\x32\x3a\x86\xcc\x36\x63\x32\x57\xeb\xe5\x93\xe3\xf7\x1f\xaa\xbe\x65\x12\xe8\x23\x96\xae\x4f\xa0\xa2\x6c\xe1\x52\x5d\xe9\xfe\xb6\x3a\xb6\x97\x4a\x11\x14\xbb\x99\x89\xc9\x35\x68\x7b\x00\x73\x5a\x98\xf3\x67\xe7\x58\x6b\xe5\x7c\x8f\x90\x7e\xfc\xb0\xec\x24\xcd\x6f\xdf\xad\x69\xdd\x4b\xb6\x3a\x2a\xdb\xf9\x82\x77\x39\x7b\x0f\xd8\x3e\xea\xd1\x00\xf3\x12\x42\x3b\x89\xdf\xc9\xe8\x49\xd5\x79\xcf\x62\xb0\xb2\x29\xd3\x36\x41\x5d\xfa\xdf\xeb\x29\x7a\xde\x82\x5d\xd4\x29\xa3\x51\x67\x90\x68\xf1\x70\x41\x38\x7f\xb3\x86\xbc\xc8\x1e\x3b\x79\x64\x67\xd5\x2b\x67\xfc\x0a\x68\xba\xb8\x86\x44\xf0\x74\x4b\x02\xdb\xd8\x8f\x0f\x8c\xb3\xbc\xcc\x09\x2f\xf3\x31\x20\x88\x95\x9d\x0b\x09\x89\x55\x6b\x29\xe1\x70\x97\x2d\x1c\xf1\x48\x49\x21\x52\x4f\x4f\xc6\x46\x0d\xa3\xe9\x02\x3b\x9f\x61\xe9\x54\xbe\x30\x93\x30\x5d\x73\x1f\x49\x12\x49\x95\x11\x98\x06\x38\x29\xd3\x86\x97\x8d\x01\xbd\x4e\x2c\x05\xb3\xc7\x74\x4e\x59\x66\x84\xee\x11\x39\x85\x09\x2d\x33\x6c\xe0\x47\xde\x90\x03\xf3\x32\xaf\x69\xad\x7b\xc0\x08\xc2\x4a\x18\x1d\x5d\xb9\xec\x77\x5c\xd0\xe1\x0e\x76\xf4\x6d\x2a\xfb\xf9\xb1\x6d\x85\x3f\x3f\x0a\x5a\xaa\x6d\x15\xf4\xc6\xc6\x9c\xf3\xd4\x9c\x87\x50\x46\x0d\x48\x3a\x53\x6e\xe6\xed\x58\xf6\xc3\x55\x11\xd6\xac\x5a\x8a\xa9\x04\xa5\x4e\x81\xa6\x19\xe3\xd0\x1e\xbf\x6e\x66\x40\x72\x7a\x8f\x38\xa6\x59\x0e\x46\x12\x09\x31\x8c\x86\x5f\xa5\x05\xc9\xe9\x2d\x54\xaf\x27\x63\x98\x60\x83\x46\xfc\xe0\x60\xf7\x2d\xfe\x4c\x28\xcb\x20\x1d\xe1\x3b\x82\x59\xea\xbe\xc6\x16\x71\xcc\xdf\x8c\x97\x60\x9e\x2a\xa4\x40\x35\xd3\x3e\x1a\xf2\x78\xe4\xa1\xd4\xdc\x6c\xe9\xb0\xef\xe5\x77\xb9\x04\x8a\xb3\xfb\xc4\x9a\xff\x24\x50\x85\xb7\x59\xdc\x54\xa5\x9c\x18\xa5\xd2\xeb\xa2\xc1\x82\x5c\x13\x58\x72\x21\xb4\x6b\x09\x58\x7d\x20\x3e\xed\x5a\x54\x82\xd2\x2c\xc7\x03\x96\x96\xd2\x37\xcc\x44\x98\xd1\xf5\x5b\xdf\x38\x2a\x7f\x7a\xf3\x66\x4b\xf9\xed\xd3\x23\xbd\x04\xd4\xa1\xdb\xe0\xcb\x45\x45\x87\x3c\xf9\x37\xca\xb1\xd9\x63\xe6\x04\x64\xec\xfc\x09\x12\x3d\x88\x4c\x69\xc6\xa7\x25\x53\x33\x32\x06\x7d\x07\xc0\x09\xdc\xdb\xda\x17\xe4\x9f\x20\x05\x6e\xaa\x01\x6f\xed\x3c\x68\x00\xed\xed\xf3\x81\xd8\x9c\x29\x26\xf8\x5f\x98\xd2\x42\x2e\xde\xb3\x9c\x3d\x52\x94\xd4\x8f\xd5\xfe\xc7\x15\x04\x45\x96\x62\xd7\x62\x96\xd0\x6b\xb0\x1f\x2c\x01\x6d\x9b\x5a\x58\xc5\x95\x98\x73\x32\xa6\xc9\xed\x27\x03\xf0\x9b\xe7\x02\x61\xcf\xae\x5b\x40\x15\xe5\xbd\x6a\x02\x24\x5b\x16\x29\xcf\xee\x2d\x7c\x1a\x50\xbe\x9b\x09\x05\x78\x83\x35\x3f\xe2\x63\xde\x5d\xc0\x54\x45\x30\xcc\xe9\x16\x1c\x14\xa1\x93\x49\xf3\x8e\xfa\xb0\xa3\xe4\x99\x97\x4a\x93\x9c\xea\x64\x66\x8d\x5c\x22\xad\xc4\x89\x7d\xe5\xc4\xfe\x5d\xa0\xbc\xb5\x79\x79\x77\x43\x30\xb1\xeb\x3c\xbb\x37\xba\xe5\xa3\x7e\x9e\xe6\x68\x80\x7c\x79\x9a\xa6\x6e\x9c\x35\x37\xc4\xc9\x6d\xb9\x6d\x1e\x7c\x83\xa6\xe1\xfa\x17\xdc\x85\xe3\x8b\xd3\xed\x8d\x34\x6d\x14\xdc\x9d\x55\xdc\x65\x23\xf8\x03\x1f\xe5\x8d\xa9\xee\x4a\xd3\x12\x6e\x9b\x46\x0f\x08\x25\xb7\xb0\xb0\xfd\xa5\x57\x1a\xf6\x4a\xc8\x9c\x24\x01\xd8\xb7\xd6\xdc\xe4\x9a\x4d\xef\xb0\xde\x9d\xb1\xc7\x8e\xdd\x9c\x14\x7e\x0c\xcd\x42\x77\x7c\xc2\x7f\xf4\x0e\x8f\xed\x8e\xe0\x76\xdc\xc2\x62\xb7\x07\x96\xb6\xdb\xec\x82\xd3\x7d\xec\xbe\x9b\x1f\x2a\x41\xaf\xda\xea\xdd\xbc\x47\xe1\xd8\xd9\x78\xe5\x87\x07\x62\xa7\xcf\xab\xd0\x2f\xb4\x32\x99\x6f\xdc\x57\x16\x19\xcd\x99\x9e\xb1\x02\x19\x91\x77\x13\xf8\xf6\xe7\x3f\xd0\x8c\xa5\xd5\x14\xf6\xfc\x9e\xf3\x81\x11\x9f\xcc\x7f\x90\xe8\x5a\x71\xed\x54\x80\xba\x10\x1a\x7f\xf9\x6c\x00\xb2\xcb\xec\x04\x1e\x3b\x85\xb3\x4f\x23\x95\x41\xc5\x2b\xe8\x9c\xae\x46\xbe\xe6\x57\x05\x4a\xa6\xc8\x39\x27\x42\x7a\x38\x60\x2f\x7b\x3b\x91\x9d\x02\xf9\xc4\xd8\xba\x3e\xd0\x72\xbd\x76\x0e\x07\x3e\x21\x1b\xd0\x7b\x60\x3a\x37\x15\xca\x07\xf6\x8a\xed\x95\x9f\xa1\xb4\xeb\x44\x55\xea\xdd\xdf\x2c\x21\x39\xc8\x29\xfa\x62\x92\xad\x7d\x11\xcd\x4d\xd9\x8d\xee\xda\xb1\x33\xf5\x0d\x5f\xb8\x13\x16\x20\x6b\xb2\x26\xa0\x2e\xcc\xcd\xce\xd0\x30\x39\xfd\x1f\x43\xc1\x71\x0f\xfe\x2f\x29\x28\x93\x6a\x44\x8e\x89\x62\x7c\x9a\x41\xe3\x9a\xd3\x30\xc2\x69\xcc\x0c\x4c\x11\x43\x6a\xe7\x34\x73\xba\x14\xe5\x04\xac\xcd\xca\xcc\xbe\xcc\x52\x07\x4e\x52\x31\x94\xa7\x72\x81\xed\xdd\xc2\x62\x6f\xb0\x82\x34\x7b\xe7\x7c\xcf\xf2\x96\x15\x34\xa9\x18\x11\x7a\xcf\xf6\xf0\xda\x5e\x9f\x5c\x78\x47\x86\xd3\xd6\x8e\xd6\x7c\xe9\xd6\x18\xe1\xa3\x3e\x5a\x0a\xeb\x0d\x2d\xd1\xc5\x3a\x69\x41\x4a\x05\x56\x5a\xc7\x53\x46\xc0\xcb\x99\x28\x55\xa2\x62\xca\xe1\x0e\xa5\xc7\x67\x23\xf8\x19\x4d\x82\xf1\xe9\xf7\x45\x4a\xf5\x56\xe1\xa6\x76\x34\x20\xb2\x7f\x65\x27\x21\x25\xce\x62\x70\x6b\xc2\xa6\xa4\xa0\x92\xe6\x6a\x44\x2e\x5d\xdd\x43\xc4\x34\x36\x09\x6d\x89\x0e\x76\x37\x8b\x02\xc8\xff\x43\xae\xc2\xb5\x8c\xc8\x70\x38\x24\x37\x1f\x4f\x3f\xbe\x23\xf6\x17\x2b\x65\x6b\x41\x26\x02\x95\x20\x51\x4a\xf3\xaa\x39\x70\x54\xfc\x8d\x7c\x2f\x38\x7c\x9c\x98\x13\x42\x35\xcc\x41\x92\x3b\xb3\x55\x09\x4b\xa1\xb2\x5e\x8d\xf6\x3f\x2d\x1e\xb7\x93\x4c\x72\x7a\x7f\x5d\xca\xe9\x0e\x1b\x40\x56\x36\x21\x34\xd9\xd4\xca\x24\xa2\x5e\x98\xb7\xab\x92\x19\xa4\x65\x06\x29\xa1\x63\x31\x87\x86\xc9\xb6\xf9\x18\xb2\xf4\x12\xfc\x83\x86\xe7\x8d\x95\xc8\x4a\x5d\x29\xab\x07\x70\xff\x8e\xfc\x1b\x3a\xbd\x29\x29\x40\x26\xc0\x35\x9d\xc2\xb2\x19\xc0\xde\xf7\xf6\xcd\xbf\x1c\x3a\x7e\x64\x66\x74\xd6\x93\x37\x06\x23\x3e\xd0\xfb\xef\x79\x6d\x1a\x64\x8a\xbc\x19\x91\xe3\xa5\x97\xe1\x73\x59\x52\x66\x68\x6b\x41\x47\x7e\xf0\xca\xf1\x82\x48\x51\xa2\x2b\x9f\x94\x45\x53\x9b\xfd\xfd\xbf\xfd\x8b\x51\xfa\x68\x5e\x64\xf0\xce\x97\x4b\xb5\x6a\xb3\x91\x61\xb4\x20\x7f\x78\xf3\x2f\x96\x7a\x9a\xf3\x59\x6b\x85\x35\xcc\xa8\x01\x58\x59\x10\x96\xdb\x20\x4d\xc8\x16\x75\xdd\x55\xd9\x44\x7f\xa5\xa9\xd4\x6a\x40\xd0\xdf\x5f\x09\x87\x5a\x68\x9a\x2d\x69\xf9\xa8\x85\xc3\x9d\x05\x52\x2a\x10\x26\x80\x86\x2a\xf2\xf6\x0f\x6f\xfe\x65\xd5\x9c\xf2\x91\x27\x80\x4f\xe2\x13\x18\x80\x31\x36\xca\xfd\x2d\xcb\x32\x48\x07\x8f\x2e\x7f\x52\x4a\x3d\x03\x39\x20\xc0\x95\x37\x56\x99\xf5\x2d\xad\x0d\x67\x97\x25\xe7\x28\x23\x58\xeb\x30\x5a\xb4\x02\x0b\x97\xfb\x58\xc3\x08\x35\xc9\x85\xd2\xeb\x97\xbc\xfd\x71\x33\x83\xf2\xc5\xc7\xc9\xae\xe2\xc0\xb0\x85\x19\x62\xf5\xe9\x16\x22\xe5\xfd\xf0\xb6\xca\xa1\x1c\x32\xae\x87\x42\x0e\xed\x34\xef\x88\x96\xe5\xe3\x5e\x83\x7a\xe4\x8d\x13\xf0\x19\xc8\x40\x19\x9c\xb7\x95\x5d\xfd\x24\x27\xbf\xfd\x79\x4e\xc5\x1d\xdf\x4c\x39\x90\x70\x3a\x9a\xd1\xf2\xd4\x37\x2d\x6e\x4b\xc7\xc6\xbc\xdd\xdc\xfd\xff\x5b\xc5\xee\x1d\xc8\x81\x3b\xbb\xd5\x69\x37\x72\x15\x7a\x3c\x06\x5b\xbc\xbd\x3a\xb6\x96\xf3\x59\x9b\x93\xb9\xc1\xbe\x66\x0d\xe5\x5a\x39\xe1\x6b\x28\x90\x5d\x47\xed\x90\xd1\x18\x51\x60\xce\xb9\xda\x78\xd0\x33\xa0\x4a\xaf\x03\x45\x3c\xe8\x8f\x8f\x87\x43\xfb\x97\x47\x53\xe8\x34\x12\x12\x82\xbc\xb6\x31\x9e\x58\x44\xd9\xbb\x02\xeb\xe1\xb3\xa1\x68\x0d\x21\x6a\xaf\x3a\x12\x66\xff\x9a\xf2\xd5\xa7\x0a\xa8\xf1\x46\xce\x36\xa2\xb5\x7b\x34\x08\xf9\x75\xa6\x53\x47\xbc\x2a\x8f\xa2\x75\x69\x3e\x1b\x29\x3a\x07\x4d\x1f\x4e\xff\x58\x1e\x4d\xa2\x7d\xad\x29\x4f\xa9\x4c\xdd\x2a\xf7\xf7\x55\x35\xe5\x88\x7c\x40\x5f\x1a\x9f\x88\x77\x64\xa6\x75\xa1\xde\x1d\x1d\x4d\x99\x1e\xdd\xfe\xbb\x1a\x31\x71\x94\x88\x3c\x2f\x39\xd3\x8b\x23\x74\xa0\xb1\x71\xa9\x85\x54\x47\x29\xcc\x21\x3b\x52\x6c\x3a\xa4\x32\x99\x31\x0d\x89\x2e\x25\x1c\xd1\x82\x0d\x6b\x99\x59\x8d\xf2\xf4\x0b\xff\xa2\x4f\x2c\x18\x37\xce\x10\x5a\x97\xe4\x1c\x86\x25\xbf\xe5\xe2\x8e\x0f\x51\x93\x55\x3b\x9d\xa6\xed\xa2\x18\xfc\x58\x82\xf7\x2e\x81\x0b\x85\x48\x3f\xf9\x26\x98\x8f\x19\x52\x9e\x0e\xad\xd3\xf1\x13\xef\x45\x1b\xdb\xee\xb0\x0e\x0c\xd8\x26\x16\xdd\x8e\x76\xda\x10\x4d\x34\x9b\x43\x2b\x27\xb6\x1f\x8d\xed\xfe\xe8\x43\x49\xd3\x52\xda\x1d\x0f\xbc\xd9\xde\x37\x93\xd3\x05\xca\x3a\xf8\x6e\x22\x2c\x2b\xe7\x22\x05\x67\xf9\x9c\xa3\x6a\x7f\x6d\x98\xf9\x8d\x11\x85\x9d\x8f\x1b\xed\xbe\x0b\xa5\x21\xb7\xc4\xc9\x3e\x9f\x2d\x88\x96\x0b\xeb\x18\x97\xb7\x46\xf9\x74\x9e\x6b\x23\xf1\xdf\xe2\x7d\x4a\x89\x84\xa1\xe8\x53\xc3\xd5\xcb\x5d\xde\x86\x47\x49\x21\x14\xc3\x77\x3b\x9e\xb7\x9b\x65\xae\x3d\xbb\x0c\xdc\x74\x7f\xfa\xe3\x2e\x5b\x37\xc1\x06\x0b\x3b\x5a\xd9\x9b\x11\x14\x93\x30\xf6\xdf\x6d\xcf\xbe\xf2\x8a\xab\x11\x4b\x12\xc1\x95\x96\x94\x6d\xce\x6e\x5a\x3f\x5a\xba\x42\xda\xfb\x1b\x08\x62\xd0\x71\x2b\xa0\x90\xd5\x18\x2c\xcf\x14\x11\x2d\x3d\xa8\x43\xc0\xd8\xe4\x27\x1f\x4b\x68\x08\x57\x4b\xd3\x6a\x0b\x18\x91\x4e\x70\xb2\x4f\xc3\x04\xa4\x84\xf4\x14\xa5\xcf\xeb\xea\xbb\xce\xa7\x5c\x54\x3f\x9f\xdd\x43\x52\x6e\x9b\x23\xbe\x3a\x56\x6c\x79\xde\x20\xe2\xc2\x4e\xec\x22\xcc\xd1\xf5\x17\x9c\xfc\x21\x10\xec\x4e\x10\x51\x54\x33\x35\xb1\x99\x64\xd5\x46\x40\xe0\xf8\xac\x50\xb8\x72\x0f\x23\x8b\xb3\x49\x11\x4c\x23\xb9\x49\x66\x42\x28\x73\xca\x71\x3f\x71\xde\x39\x13\xd6\xe7\x87\x69\x2d\x92\xe4\x86\xc6\xf8\xf4\x96\x7a\x7a\x6b\xa8\xad\x1f\x63\xca\xaa\xe0\x15\x04\xbd\x97\xca\x4c\x83\x86\x47\xf3\xc7\x14\xa5\x26\xa5\x89\x2a\x73\x33\xe9\x1d\xb0\xe9\x4c\xab\x01\x61\x23\x18\x21\xd6\x00\x4d\x66\xc1\xb4\x39\x80\x6e\xf4\x47\x09\x51\x2d\xb4\x12\x1f\x54\xf9\x0e\x2e\x41\x67\x50\xf1\x98\xe5\xbd\x5c\x0b\xae\x01\x01\x9d\x8c\x0e\x07\xa4\x4e\x21\x37\x6b\x1c\x2f\x08\xd3\x60\x68\x36\xea\x22\x52\x94\x53\xfb\x25\xe0\x63\x3a\x71\x5d\x55\x32\x08\x7a\x51\x53\xd4\x19\xf7\xec\xc7\xed\x99\x7d\xc3\x95\x97\xb9\xd1\x17\x2b\xa2\x8e\x66\x75\xdf\x52\x47\x48\x09\xaa\x10\x56\xdb\x5c\x36\xb8\xff\xff\xab\x87\x0e\xd4\x61\x0d\xcc\x19\x9b\xce\x3c\x2c\xa9\x63\x04\xcd\x3d\xd8\xfd\xec\x91\x4e\xbe\x14\x3b\x5a\x7a\x54\xec\x68\xfa\xb6\x7d\x26\x45\x8d\x55\xc1\xfe\x6b\x90\x79\x05\x45\x44\x11\x24\x19\xce\xce\xed\x5b\xd9\x38\x1c\x23\x6f\xc8\x01\x22\x19\xd3\xfb\x0a\x11\x7e\x28\x8a\xc3\x11\x39\x26\xbc\xac\xce\xdc\x43\x2f\xe0\xa2\x9a\xdf\x4d\x64\x5e\xaa\x44\x3d\x57\xcb\x2f\xee\x44\xee\xec\x68\xe7\x29\x0f\xc7\xd0\x41\x00\x1e\x2f\x98\xf8\xd0\x24\x16\xd6\x2d\x27\xe8\x46\xba\xfd\x1c\xfe\x2b\xda\xcf\xb1\x12\x60\x81\xc7\xb5\x8e\xa2\x00\x99\x0f\x42\xe9\xa9\x3a\x90\xcd\x53\x6c\x61\xd1\x16\x2b\x48\x3f\x98\x41\x7a\x82\x2b\xe9\x14\xa1\xb3\x7e\x2c\x87\xb1\xf8\xfc\xaa\x06\xb4\x1b\x44\x7e\xbc\xc0\xab\x3b\x06\x2f\x6d\x1e\x5d\x29\x5d\x3d\x3a\xd1\xbc\x7a\x3c\x88\x78\xcf\x2f\xb0\x67\xfd\xe8\x09\x6d\xed\xe8\x4e\xda\xea\xb1\x7b\x68\xd0\xa6\x79\x5a\x04\x0c\xad\x1f\x7d\x9d\x4d\x3b\x5a\x04\x17\xad\x1f\x2b\x22\xea\xa7\x89\x35\x5a\x3f\x5a\x1b\x49\xd7\x8f\xb6\x71\x49\xeb\xc7\x52\x12\xe3\x27\x0a\x52\x1a\x34\x23\x94\xc8\xb7\xda\x9e\xe3\xf7\x9d\xf8\x49\x3d\x7a\x06\x71\xbb\xc8\xa6\xf5\x63\x59\x00\x7c\x21\x51\x4e\x6b\xa6\xfa\x56\x9b\x69\xde\x6f\x7c\xd8\x66\xaf\xfb\x38\x1d\xa7\x50\x0c\x5c\xea\x8c\xb7\x33\x63\x44\x75\x21\x01\x0b\x0e\x60\xd8\x97\xb7\xc3\x7c\x9e\xc0\xaa\xf5\xa3\x3f\xc6\x69\x47\x4f\xec\xd3\x8e\xde\x90\x1b\x05\x9e\x6f\xac\x5d\xf8\x09\x65\x1d\x6b\x99\x8e\xb2\x4e\x94\x75\x76\x18\x51\xd6\xd9\x76\x44\x59\x67\xd3\x88\xb2\xce\x9a\x11\x65\x9d\x28\xeb\x74\x1a\xcf\x4f\xd6\xb1\x96\xaa\xde\x0c\x66\x3f\x5a\x83\xeb\xb2\x85\x0c\xa5\x29\x1f\xd2\xd3\x34\x95\x19\xde\x7f\xed\x48\xec\x0d\x9a\xd7\x5c\xa4\xba\xa4\x7c\x0a\xe4\xed\xf0\xed\x9b\x2d\xd3\x01\xd7\x8f\x2e\x41\x3b\xe1\xd8\x35\x75\x70\x79\x6c\xf2\x48\x7c\x32\xef\x92\x3b\xa9\x95\xc3\xa3\x21\x61\x6e\x70\x10\x55\xf5\xae\x72\xd0\x84\xea\x86\x41\x9c\xe5\x50\x39\x44\x1b\x29\xc8\x75\x4c\xaf\xe0\xce\xdf\x61\x36\x75\xd4\x6e\x05\x09\x50\x1b\xc7\x3e\x86\x6a\x15\x22\x07\x9b\x60\xea\x0f\xbd\x59\x02\x78\x58\x91\x03\x18\x4d\x47\x24\xb5\xc9\xda\x94\xbb\x98\xb1\xc3\x41\xe8\x1e\xcf\x0d\x71\x95\xf8\x1f\xb3\x6c\xe7\x1f\x87\x39\x70\x5d\xd2\x2c\x5b\x10\x98\xb3\x44\x57\xdf\x87\x01\x81\x4c\x5b\x67\x67\x17\x57\x4a\x07\xf1\xb0\xab\x48\x38\x5c\x39\x5b\xbb\xf9\xab\xfd\xe8\x2e\xbb\xad\xac\xa3\x3d\xbd\x59\x92\x4b\x2c\x84\x46\x1b\xd5\x2a\x6d\xde\x66\xfd\x95\xf8\x4f\x44\xf0\x8f\x57\x6d\xdd\x63\xa4\x27\x9e\xd0\x99\x0f\x2c\x2b\x50\x65\x96\x19\xf4\xb6\x1e\xb3\x55\x10\xac\xf1\x64\xad\xc9\xb6\xb1\x6e\xd6\x3c\xc8\xba\xc1\x7b\x6e\x44\x21\x32\x31\x5d\x84\x3b\x68\x7b\xb5\x04\xe5\x6d\x28\x51\xe5\xd8\x89\x80\xe6\x10\x5d\x2c\x6d\x79\xf4\x85\x6c\x1c\xd1\x17\xb2\x32\xa2\x7d\x60\x79\x44\xfb\xc0\x0e\x23\xda\x07\xd6\x8c\x68\x1f\x58\x1d\xd1\x3e\x10\xed\x03\x5d\xc6\xeb\xb7\x0f\x90\xe8\x0b\xd9\x34\xa2\xac\x53\x8f\x28\xeb\x6c\x3f\xa2\xac\xb3\x3a\xa2\xac\x13\x65\x9d\x28\xeb\x44\x59\xa7\xed\xe8\x80\xdc\x85\x48\x7b\x4f\x91\x29\x44\xfa\x40\x86\x8c\xb5\x57\x27\x62\x98\x89\xa4\xaa\x2c\x62\x1e\x71\x9e\x0f\x45\x73\x6b\x42\x1f\x90\x7f\x0a\x0e\x36\x3d\xc1\x96\xac\xcd\x81\x08\x6c\x0f\x51\x88\xf4\x40\x1d\xb6\x08\x3c\x8f\x19\x36\x31\xc3\xe6\x37\x90\x61\x33\xa3\xca\x15\x3e\x42\xd2\xba\x39\xe1\x26\x38\xfe\x37\x20\xf3\xdf\x6c\xbe\x8d\x41\x38\x87\x30\xd8\x3d\xae\x46\x0a\x0b\xbb\xd4\xf9\x76\x21\xbd\x6c\x42\xcc\xe9\x65\xb6\xf9\x4e\x9a\x42\x4a\x0a\x90\x43\x8b\x64\x82\x4c\x98\xab\xff\xb5\x84\xbf\x0e\xc2\x2f\x3c\x6f\xa6\x09\x89\x17\x9d\x3c\xd3\xfc\x94\xde\x7c\x53\xa1\x8b\xae\xc1\x15\x5f\x5c\x2a\x4d\x3f\x5a\xe9\x90\x68\xe7\x4e\xfb\xae\x93\x5e\xda\x97\x12\x89\x4a\xde\xf5\x4e\x65\x8e\x37\x8f\xb5\xc5\x69\xff\x51\x82\x5c\x10\x31\x07\x59\x2b\x46\x55\xdf\x9e\x41\xd5\x64\x26\xa1\xae\x00\x72\x3f\x06\x9e\x5e\x4c\x11\x7d\x6a\xea\x7d\x7b\x0d\xc9\x33\xab\x7e\xbc\x79\xf4\xab\x38\xf4\xa8\x36\xbc\xb4\x5a\xca\x9b\x47\xaf\xe6\x37\xd2\xb3\x09\x8e\xf4\x68\x86\x23\xfd\x9a\xe2\x48\xef\xe6\x38\xd2\xa7\x49\x8e\x7c\xf6\x0a\xd0\x9b\x47\xcf\xe6\x23\xd2\xbb\x95\x8e\xbc\xc0\x7a\xd2\x9b\xc7\x27\x00\x77\x9f\x16\x3b\x12\xab\x53\x77\x1e\x7d\x1b\xd4\x48\xdf\x46\x35\xd2\x37\x1e\xb6\xaa\x82\xbd\x79\xc4\xfa\xd8\x9f\x40\x4e\xeb\x4d\x88\xe8\x5a\x53\xfb\xb1\x85\xf6\x80\x93\x55\x57\xdf\xcf\xa5\x00\x59\x2e\x5d\xb7\x92\x35\xef\x0e\x7a\x75\x61\xa8\x66\xd8\xf2\xd4\xc7\xad\x22\x46\xe3\xef\xa9\x37\x78\x95\x3c\x28\x1e\x17\x4c\xb6\xd2\x3a\xa6\x36\x9d\x55\xcd\x63\x8c\x52\x50\x37\x9d\x0a\x1e\xc6\x7b\x47\x36\x9c\xb4\x96\x26\x78\xba\x1c\x60\x5a\x3f\x81\xfa\x85\x6d\x74\xbb\xe7\xed\xd8\xfb\xaa\xbe\x63\x6f\x14\xf6\xc4\x75\x33\x1e\xfc\x9f\xff\x7b\xd8\xa8\xde\x52\x4f\xe8\xa8\x72\x75\x76\xc6\xa0\xe9\x30\x83\x39\x64\xb8\x0e\xdf\x70\x79\x26\xd0\x62\x6c\xcb\x9e\x06\x06\xa9\x8b\xe5\x1d\x25\x13\xa0\xba\x94\x58\x41\x14\x38\x1d\x67\xdd\xcf\x4a\x54\x30\xa3\x82\xb9\xdd\x88\x0a\xe6\xc6\x11\x15\xcc\x0e\x23\x2a\x98\xdb\x8d\xa8\x60\x6e\x1e\x51\xc1\x8c\x0a\x66\x8b\x11\x15\xcc\xa8\x60\xb6\x1d\xbf\x61\x05\xb3\xdf\xc0\xe9\x50\xdd\x73\x71\x28\x28\x3f\x6a\xaa\x59\x52\x07\x55\xfb\xbb\xec\xbf\xfa\x55\x33\x43\x15\x72\xbd\x92\x19\x2a\xa2\x2b\x8a\xf6\xe8\x11\x8d\xb2\xd2\x39\x57\x9e\x7c\x50\xd9\x7c\x6d\xb1\xe1\xbd\x21\x62\xe0\x74\xee\x15\x13\x6f\x7c\xe8\x5a\xdd\xda\xbd\x8a\x6b\x4b\xc9\x81\xf7\xf6\x63\xab\x16\x2e\x74\xf3\x22\xd7\x6c\x58\xdf\x51\xf9\xff\x31\x6c\xa7\x51\x31\xa0\xe1\xa4\xae\xa2\xe4\xaa\x08\xac\x1a\x79\x0c\x75\x04\xd9\x58\x03\xb6\xc6\x9d\x30\x6e\x63\x29\x7d\x5b\x21\xc1\x7d\x58\x96\x25\xa7\x48\x00\x3d\x9a\x5b\xc9\x17\xd7\x83\xe2\x6f\x0d\xbb\x20\x8e\x88\xe2\x19\xa3\xdc\xa5\xdb\x0a\xee\xfb\xde\xdb\x5e\xf6\xb5\xb8\x5c\x75\x6b\xa9\xde\x3e\x22\x67\x88\xf4\xe1\xc4\x4c\x21\x7c\xa8\xed\xb0\xd2\x8f\x89\xe2\x79\x95\x86\xb8\xdb\xb9\x34\xc4\x52\x4c\x4a\xac\x0c\x11\x2b\x43\x74\xaa\x0c\x81\x17\xed\xe1\xee\xbd\x44\x04\xf9\xd1\x35\x60\x92\x80\xa0\xca\xcb\x4c\xb3\xa2\x8e\xf1\x56\xf6\x55\x99\x55\x24\x26\x2e\xd6\xb4\x89\xef\xe6\x6d\x34\x99\x2d\xe3\x3d\xce\x87\x31\xe1\x0a\xc9\x89\x8b\xe7\xc4\x76\x49\x58\xd3\xc0\x6b\x1d\x36\x68\x95\xbd\xfc\x58\xc4\x53\x24\xd8\xaa\x56\x9a\x6d\x37\x2f\x43\xe7\x33\x83\x12\x86\x62\x3f\xc0\x20\xc2\x96\x19\x18\x17\xcb\xe6\xc0\x6b\x2e\x71\xa0\x0e\x0f\xbd\x30\xd4\x2b\xf7\xfa\x24\xdc\xe7\xcf\x01\x97\xf8\xcf\x6d\xf8\x0f\x7e\x50\xc5\x81\x6a\xf0\xd5\xfc\xe7\x65\x07\x5d\x76\x8f\x9f\xeb\xc3\x20\xd7\x5b\xdc\xdc\x93\xc7\xcc\xfd\x96\xaa\x6b\x3c\x4b\x17\xc6\xb3\xd3\x3a\x5e\x87\xdb\x22\xa6\xa4\x6e\x3f\x5e\x42\x4a\xea\x13\xb9\x26\x5e\x4e\x66\xea\x8b\x75\x47\xbc\x94\xcc\xd4\xe8\x82\xd8\x69\xbc\xd6\x84\xd1\xe6\xe8\xd1\xe5\x10\xdd\x0d\x3d\xcb\x54\xbd\x30\xff\x4f\xe3\x66\xe8\x05\xff\x7a\x8d\x5f\x8b\xb1\x6b\xaf\x3c\x76\x2d\x2a\x7a\x51\xd1\x6b\x8e\xa8\xe8\xad\x8c\xa8\xe8\xed\x30\xa2\xa2\xb7\x79\x44\x45\x6f\x75\x44\x45\x2f\x2a\x7a\x5b\x8c\xa8\xe8\x45\x45\x6f\xdb\xf1\x1b\x53\xf4\xfa\x2b\x1a\x1f\x63\xc8\xfa\x8f\x21\xeb\x87\x10\xf6\x40\xfe\x7a\x41\xba\x9e\x62\xc6\x62\xbc\xd8\xf3\x8e\x17\xeb\x58\x3a\x8f\x6b\xf6\x69\xca\xe7\x85\xbb\xbd\xa9\x86\x1e\x9d\x0b\x96\x92\xa2\xd4\xae\x82\x58\xac\xa3\xf7\x9c\xeb\xe8\x35\x76\x34\x16\xd3\xdb\xaa\x98\xde\x26\x98\xc5\x8a\x7a\x1b\xc6\xf3\x89\x62\x8b\x15\xf5\x76\x1d\xb1\xa2\xde\xfa\x11\x2b\xea\x3d\x30\x62\x45\xbd\x58\x51\x2f\x16\x3c\xe8\x30\x62\xc1\x83\x35\x23\x16\x3c\x68\x3f\x62\xc1\x83\xad\x46\x2c\x78\x10\x0b\x1e\x34\x47\x74\x42\x75\x1b\xb1\xe0\x41\xc7\x11\x1d\x53\xb1\xe0\x41\xa7\x09\x63\x45\xbd\x18\x95\xb8\xfb\x88\x0a\x66\x54\x30\xb7\x1b\x51\xc1\xdc\x38\xa2\x82\xd9\x61\x44\x05\x73\xbb\x11\x15\xcc\xcd\x23\x2a\x98\x51\xc1\x6c\x31\xa2\x82\x19\x15\xcc\xb6\xe3\x37\xac\x60\xc6\x8a\x7a\xcf\x3d\x1a\x92\x3c\xc7\x94\xa7\x58\x51\x2f\x46\x48\xb6\xda\xee\x58\x51\xef\xf1\xf1\x9b\xaf\xa8\xd7\x88\xd6\x7b\xba\xb2\x7a\xbb\x2f\x23\xd6\xd6\x8b\xb5\xf5\x62\x6d\xbd\x58\x5b\x2f\xd6\xd6\x8b\xb5\xf5\xb6\x1f\xcf\xdf\x99\xf1\xec\xf4\x8f\xd7\xe1\xc0\x88\x25\x17\xb6\x1f\xb1\xe4\xc2\xc6\x11\x4b\x2e\xc4\x92\x0b\xd1\x19\xd1\x66\xc4\x92\x0b\x3b\x8e\xe8\x78\x88\x25\x17\x76\x1a\xb1\xb6\x5e\x8c\x62\xdb\x7e\x44\x45\x2f\x2a\x7a\xcd\x11\x15\xbd\x95\x11\x15\xbd\x1d\x46\x54\xf4\x36\x8f\xa8\xe8\xad\x8e\xa8\xe8\x45\x45\x6f\x8b\x11\x15\xbd\xa8\xe8\x6d\x3b\x7e\x63\x8a\x5e\xac\xad\xf7\x9c\xa3\xc9\x62\x6d\xbd\x35\x23\x46\x8e\x3d\xef\xc8\xb1\x96\xb8\x42\x4b\x2d\x72\x51\x72\x7d\x0d\x72\xce\x12\x38\x4e\x12\xf3\xd7\x8d\xb8\x85\x1d\xa3\x95\x9a\x5a\xe8\x03\xd3\x12\xc6\x53\x96\xa0\x1e\x79\x37\x03\x2c\x8d\x67\xc4\x5b\xbc\x8f\x50\x7b\x23\xd1\x78\x67\x8d\x5e\xb8\x4e\x43\xd3\x30\x84\x07\xa7\xde\x15\x5e\x16\x42\x63\x21\x32\xa0\x7c\x87\x27\x1d\x33\x04\xb9\xe3\x69\x6e\x00\xe4\xbd\xa3\xc4\xf5\x64\x64\x0c\x99\xe0\x53\x17\x31\xe4\x4e\xc0\x88\x9c\xd4\x37\x24\x94\xe3\xe1\x29\xa5\x04\xae\xb3\x05\xc2\x01\x8b\x74\xa1\xd2\x90\x8b\x39\xa4\x48\xb1\x31\x50\xc9\x8a\x91\x54\x93\x0c\xa8\x79\x17\x87\xfa\x65\xe6\xf0\x50\x72\x89\xf3\xdb\x49\xc7\xe0\x82\xa7\x5a\x01\x71\x77\xda\xd8\x8a\x1a\x2e\x19\x36\x9c\xd4\x84\x6c\x29\x41\xf5\x28\xf8\x42\x3c\x9a\x0b\x51\x92\x3b\x6a\x05\x25\x59\x72\x3c\xcc\xf8\xe9\x06\xb4\x3b\xbe\xbc\x83\x48\xd2\xde\xfa\x30\x44\xaa\xb6\xe3\x63\x5d\xac\x01\x54\x4e\x5b\x31\xa9\xc6\xd6\xec\x1f\xcb\x69\x69\x25\x42\x87\xca\xc0\xb5\x5c\x60\x44\x9f\x15\x29\x52\x91\xdc\x1a\x34\xcc\xe9\x14\xf6\xf7\x15\x39\xf9\x70\x6a\x68\x5f\xa9\x0c\xa9\x76\x65\x02\x1d\x2d\x2c\xa4\x98\xb3\xd4\x60\xf6\x0f\x54\x32\x3a\xce\x8c\xcc\x39\x01\x09\xdc\x88\x04\x5f\x1e\xfc\x70\x7c\xf5\xcb\xc5\xf1\x87\xb3\x43\x94\x3e\xe1\xbe\xa0\xdc\x1c\x89\x52\xd5\x71\xa8\x0e\x27\xcc\x8b\x80\xcf\x99\x14\xdc\x2c\x0e\xf5\x34\x4a\xe6\x7e\xd6\xa4\x3a\x09\x12\x94\xc8\xe6\x90\x5a\x19\xb9\x7a\x9b\x67\x39\x8c\x17\xa5\xf6\x7a\x23\x46\x47\x9a\xd3\xc3\x93\x19\xe5\x53\xb3\xce\x53\x51\x9a\xf9\xbe\xfc\x12\x57\x24\x21\x2d\x13\x2b\x35\x51\x8f\xb2\x5f\x0e\x3c\x9b\x30\x84\x5e\xd9\x9a\x8e\x2a\xa1\x85\x5f\x73\xf8\x59\x6a\xc1\x35\xbd\x7f\x67\xc3\x03\xf7\xbe\x0c\x2e\xed\xf9\x7a\x98\xc2\xbc\xc2\x32\x1b\xbb\xaa\x0c\x4b\x31\x66\x64\x2f\xbc\x7b\x44\xce\xcc\x3b\x20\x0d\x01\x68\xa3\x3b\x61\x0e\x12\xb5\x4e\x07\xbe\x01\x91\x30\xa5\x32\xcd\x40\x61\x5c\xa3\x27\xcc\x56\x33\x70\x00\x83\x4a\xa7\xe5\x42\xaf\xa3\x24\xe4\x83\xc0\x18\xc7\x89\x78\x47\x66\x5a\x17\xea\xdd\xd1\xd1\x6d\x39\x06\xc9\x41\x83\x1a\x31\x71\x94\x8a\x44\x1d\x69\xaa\x6e\xd5\x11\xe3\xe6\x64\x0d\x53\xaa\xe9\x30\x38\xd2\x47\x96\x6d\x0f\x13\x91\xe7\x94\xa7\x43\xea\x50\x6b\x58\x6d\xeb\xd1\x17\x8e\xa1\x0e\x69\x75\x17\xe3\x43\x3a\x54\x33\xc8\xb2\xfd\x16\xc8\xdc\x4d\xe0\xeb\x20\xe8\x75\x12\xf0\xdc\xb7\x77\x3f\xbd\x67\xd5\x61\xb5\x30\x18\x91\x0b\xa1\x5d\xf8\xad\x8b\xf4\x46\x22\x8a\xf0\x5d\x7f\x9e\xcf\x2e\x6e\xae\xfe\x7a\xf9\xf1\xfc\xe2\x26\x1e\xeb\x78\xac\xe3\xb1\xee\x70\xac\x81\xcf\x3b\x1f\x69\x2f\x6d\x06\xc7\xa4\xda\x6f\xe4\xd1\x0a\xb4\x3f\x06\xd5\x06\x74\x96\x0d\xed\x78\x32\xa8\x37\x20\x70\xc6\xe7\x3f\xd0\xa6\x69\x9d\xaf\x05\x07\x71\x37\x58\x11\xb9\x92\xbe\xbb\xc4\xde\x77\x30\x63\x75\xf5\x5b\xb5\x92\x1f\xed\xe8\xee\x53\x32\xaf\x6e\x6f\x62\x68\x6c\xdf\x05\xcd\xeb\xfa\xda\x6b\x76\x6d\x44\x3e\x78\x85\x87\x9c\xfc\x72\x7e\x7a\x76\x71\x73\xfe\xcd\xf9\xd9\x55\x7b\x0d\xba\x07\x5b\x0b\x5a\x13\x7a\x02\xc0\x7e\x4b\x2e\x59\x48\x98\x33\x51\xaa\x6c\x51\xd9\x3f\xd6\x13\x81\xe5\xd3\xef\x1c\xbe\x8b\x4a\x13\x5f\xfb\x58\x64\xb6\xfd\x32\xdb\x53\x98\xd0\x32\xb3\x7a\xd3\xde\xde\xa8\x0d\x97\xb3\xa3\x2f\xf4\xfd\x46\x8a\x0e\xf5\xa3\x1b\x28\x7c\x6d\x2b\xcf\x4f\x84\xdc\x78\x8c\xf7\x5d\xd8\x41\x83\xf5\x38\xe1\xd1\xda\xe6\x9c\xf4\x68\xbd\x63\x1d\xa1\xd3\xd1\xbd\xd0\x8f\xd3\x3d\x11\x7c\xc2\xa6\x1f\x68\xf1\x1d\x2c\xae\x60\xd2\xcd\x40\xdc\x84\x37\xda\x1d\x9d\x0f\x19\xad\x94\x86\x9d\xd9\x97\x75\xf3\xcf\xf4\xe6\x9d\xe9\x2b\x2c\xa3\x7b\x48\x46\x7f\x11\x14\xbd\x44\x4f\xac\x54\xf3\xb7\x16\x68\x67\x4b\xee\x2b\xb8\xa6\x17\x97\x7d\x37\x2e\xef\x47\x93\xd9\x85\xec\xde\xd1\x59\xbd\xad\xda\x91\x08\x9e\x40\xa1\xd5\x91\x98\x1b\xce\x05\x77\x47\x77\x42\xde\x1a\x3d\xc2\x28\xae\x43\x8b\xb5\xea\x08\xbd\x05\x47\x5f\x58\xff\xd7\xcd\xc7\xd3\x8f\xef\xc8\x71\x9a\xba\xd6\x2c\xa5\x82\x49\x99\xb9\x66\x08\x23\x42\x0b\xf6\x03\x48\xc5\x04\x1f\x90\x5b\xc6\xd3\x01\x29\x59\xfa\x75\x7b\xe2\xec\x47\x8f\xbb\x20\x0a\xeb\xe3\xec\x79\x27\xae\xd1\xbb\xb2\x68\xf0\xae\x8a\x88\x18\xae\xc5\xb4\x42\xdc\xf4\xf6\x66\x27\x64\xf4\x04\x9a\xdd\x8d\xf3\xcb\x03\xb7\xb0\x5f\xba\xba\x5f\x13\x56\xeb\xdb\x74\x88\x5a\x88\xf4\x1d\x51\x65\x51\x08\xa9\x15\xc9\x41\x53\xa3\xf4\x8e\x0c\x86\x0d\x9a\x7f\xa2\x97\x6a\x40\xfe\x5e\xfd\x88\xae\x26\xf5\xd3\xfe\xfe\x9f\xbf\x3b\xfb\xeb\x7f\xee\xef\xff\xfc\xf7\xf0\x2a\xb2\x42\x1b\xfe\xd3\xbc\x45\x15\x90\x8c\xb8\x48\xe1\x02\xdf\x81\x7f\xaa\x86\x83\xc5\x5d\xd0\x54\x97\x6a\x34\x13\x4a\x9f\x5f\x56\x7f\x16\x22\x5d\xfe\x4b\x75\x90\x38\xc8\xf3\x64\x0c\xb8\x45\x97\x54\xcf\x9e\x09\x7b\xa8\x69\x49\xcf\x47\xd5\xcd\x1a\xb6\x00\xca\x29\xfe\xf3\x1b\x0f\x02\x23\x3d\xdd\x49\xa6\x35\x3a\xdd\x5c\x9a\xb9\x98\x0c\xcc\xa9\xad\xc5\xce\xf9\xdb\xbd\x67\xc5\x60\xaa\x1d\xec\x19\x60\x08\x11\x07\x2d\x7b\x90\x2b\x06\xbb\xea\x5c\x3e\xbe\x3c\x27\x73\x0b\xe1\x67\x03\x1c\x9f\x3a\xfc\xcd\x27\xa5\x71\x55\xcb\x28\x07\xaa\x4a\x43\x7c\x67\xa3\x81\xaa\x04\x66\x92\xb1\x9c\xb9\x20\x43\xd7\x5e\x4a\x91\x03\xfb\xe3\x28\x29\xca\x81\xbb\x61\x94\x43\x2e\xe4\xa2\xfa\x13\x8a\x19\xe4\x46\xd3\x1a\x2a\x2d\x24\x9d\xc2\xa0\x7a\xdc\x3e\x56\xfd\x65\x1f\x6c\xbc\x60\xf5\x69\xab\x0a\xd7\x4e\x52\x47\x91\x21\x7d\x7d\xb4\xcd\x83\xfe\x99\x90\xb6\x0a\x33\x2e\x3e\x81\x48\x58\x59\xe2\xac\xc0\x59\x41\x11\xf5\xc9\xb9\xc8\xca\x1c\xd4\xa0\x12\x83\xac\x35\x80\xcf\x8d\x66\xa9\x9e\x95\xa0\x96\xb2\x39\x53\x7d\xc4\x0f\xaf\x91\xd3\x98\x0b\xc5\x17\xa5\x2e\x4a\xed\x6a\xd9\x04\x6d\xe9\x84\x42\xbb\x45\x55\x70\xa0\x41\xf6\xdf\x76\x2d\xb8\x45\x48\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\xec\xbc\x74\xca\x17\x1f\x3b\x12\x50\x3b\x86\xbd\x95\x22\x5a\x9e\xb1\xa7\x00\xeb\xfb\x61\xad\x34\x0d\x19\xd7\x43\x21\x87\x76\xea\x77\x44\xcb\xb2\x1b\x31\xa9\x99\x52\xdf\xe7\xdf\xf7\x1e\x7b\x57\x33\xa4\x8a\x5d\x3f\x9b\x03\xae\x20\x91\xa0\x3f\x87\x25\xc7\xbe\xc9\xcb\x29\x4b\xc1\x8e\xaf\x8d\xcf\xfd\x16\x8c\x3b\x55\xb0\x20\xee\x6b\x2d\x89\x4e\xa4\xc8\x47\x24\x70\x6f\xcc\x31\xd3\xc3\xdd\x77\x0b\x1d\xac\xa0\x7e\x44\x63\x50\x34\x06\x6d\x18\x8f\x1a\x83\xae\x2d\x1e\x3e\x5b\x4b\x10\xf0\x79\x5b\x17\xc6\x5a\x0f\xba\xd7\x75\xb4\x20\x85\x28\xca\x8c\xea\x0d\x9e\xb1\x35\xee\x74\x77\xd4\xeb\x48\xe4\x3a\x92\xc6\x32\xb4\x7c\xbd\x0f\x93\x1c\x67\x19\x61\xdc\x1e\x7c\x9c\xc0\x3b\xcc\x24\x58\xd5\x86\x50\xeb\xcf\x9e\x9b\x25\xdc\xb9\x92\x75\x61\xb8\xa7\x22\x4a\x53\xa9\x31\xea\x18\x4b\xda\x59\x56\xe2\xbc\x4f\x8c\xd7\x85\xed\x2a\xe1\xb0\x4a\x02\x59\xdb\xd7\x33\xa3\x4a\xfb\x65\xe3\x6a\x34\xbd\x45\x6f\x63\x02\x29\xf0\x04\x30\x23\xad\x84\xfa\x5b\xc7\x46\x6f\x23\x67\x7c\x6e\xe7\xa0\x24\x2d\x6d\x30\x88\x25\x7f\xeb\xe7\x78\x5d\x01\x08\x06\x11\xaf\x7d\xfb\xe5\x2a\x0e\x01\xa9\x7e\xa5\x61\x57\x89\x7d\x95\x95\x55\x3d\x4d\xe4\x41\x77\x9e\x59\x79\xb6\x3a\x09\x43\x2b\xcc\xb2\x36\x3f\x37\x99\xe4\x6b\x70\x06\x76\x67\x9f\xbf\x39\xd6\xd9\x13\xdb\xec\x87\x65\xee\xe0\x3b\xe9\x93\x4d\xf6\xe1\x2c\x29\x24\x4c\xd8\x7d\x4f\xe7\xf4\x98\xd7\x96\x18\x96\x02\xd7\x6c\xc2\x6c\xc7\xfe\x42\x42\x01\x3c\xad\x8a\xa2\x62\x56\x38\x6f\xc2\xe6\x59\x06\xf3\x58\x81\xbb\x5f\x52\x76\xbd\x4e\xd8\x8f\x74\x8c\x44\x3a\xd6\x7a\x7c\x26\x3a\xe6\x30\xf7\xf9\x10\x31\x8c\x3c\xef\x1e\xfa\x7e\x1a\xc4\xb1\x23\x16\xef\x8c\x65\x75\x42\xd7\x11\xce\xa2\x96\xaa\x07\x55\x74\x51\x0b\x1b\xb9\x46\x66\x6c\x6a\xc0\x6a\x2b\x0a\x59\xa1\x89\xe4\x94\xd3\xa9\xcd\xea\xd6\xc2\xdb\x69\x8d\x96\x65\x90\x58\xb2\xb4\x21\xdc\xdb\xd7\x30\x4e\x0c\x62\x67\x82\xa6\x78\x51\x8a\x2c\x03\xa9\x48\xc6\x6e\x81\x9c\x42\x91\x89\x85\x4b\xd2\xe6\x29\xb9\xd6\x54\x1b\x94\xbe\x06\xdd\xce\xe7\xdb\x09\x5d\x71\xc5\x97\x65\x96\x5d\x8a\x8c\x25\xad\x2c\x2a\xcd\x6d\x3b\xc7\xfd\x2a\xca\x2c\x23\x05\x4e\x39\x22\x1f\x39\x52\x8c\xe3\xec\x8e\x2e\xd4\x80\x5c\xc0\x1c\xe4\x80\x9c\x4f\x2e\x84\xbe\xb4\xa2\x77\x33\xda\xce\xde\x48\xd8\x84\xbc\xc3\x9a\x36\x9a\x68\x3a\x45\xc5\xc9\xfb\x00\x07\x06\xfe\xe1\x04\x96\x38\xdc\x31\xb5\x56\x53\xe9\x8c\x38\x5f\xe0\x4c\x86\x50\xd9\xbf\x3f\xfb\x36\x65\x6c\x02\xc9\x22\xc9\xba\x9f\xab\xe3\x04\xa3\x17\xea\x3c\xf3\x00\xbf\x5d\x99\x76\x97\xda\x89\x2a\x20\xe3\xc4\xd6\x4f\xb7\x85\xe1\x6b\x54\xaf\x56\x64\x55\x5d\xd5\xab\x86\xd8\x9a\x73\x76\xe5\x99\x85\x50\xfa\xda\xa8\xe7\xbd\x54\x59\xdf\xbf\xf4\xd3\x11\xac\x25\x9d\x65\x90\x12\x96\xe7\x90\x1a\x15\x3e\x5b\x10\x3a\xd1\x98\x62\xdb\x30\x0f\x24\x12\x2c\xd6\xba\xda\x25\x33\xca\xd3\x0c\x24\x99\x50\x96\x39\x63\x40\xe3\x7e\x0d\x32\x67\x1c\x6d\x02\xd6\x1d\x8b\xf6\x05\xf3\x57\x92\x08\xe9\xeb\xde\x33\xad\xfc\xa5\xfa\x60\x22\x13\x09\x10\x60\xd9\xaf\x4c\xc6\x99\x48\x6e\x15\x29\xb9\x66\x99\x5d\x8c\x10\xb7\x24\x11\x79\x91\xe1\xd1\xe9\x70\xb2\xaa\x7f\x0e\x2b\x54\x1a\x9a\xd9\xd5\xd1\x17\xf5\x25\xfc\xa1\x2d\x37\xef\x41\x0a\xeb\x43\x06\x83\x7b\x48\x7a\x4b\xef\x37\xb4\xd4\xec\x32\xfa\xfb\x05\xaf\x44\xb1\x89\x30\x0c\xcc\xec\x75\x9d\x98\x5d\x91\xcb\x11\x39\xbb\x87\x24\xa8\x42\x81\xfd\x21\x90\x10\x60\x56\x28\xbd\x85\x57\x54\xf6\xae\x43\xf2\x5d\x38\x1a\x60\x3f\xb1\x73\xfa\xaa\x59\xee\x15\x24\x63\x1c\xc9\xa2\x4b\xc8\x23\x8c\x2b\x23\x10\x34\xce\x90\x3d\xb1\x4e\xd0\x25\x29\x93\x58\x33\x61\x51\x05\x5f\xfb\xb9\xb0\x1c\x81\x10\x9a\x1c\xec\x1f\xed\x1f\xae\xd8\x2c\xf7\x8d\xe0\x92\x81\x25\xd1\xd6\x80\x99\xd4\x8b\x52\x2c\x2f\xb2\x05\xae\x63\x3f\x1d\x10\xa6\x7d\x74\xb6\x2c\xb9\x5f\x95\xcb\x12\x1c\x10\x25\x88\x96\xd4\x97\x62\xb1\xbf\x9a\x9b\xb4\x2c\x1d\x73\x38\xd8\xff\x75\x7f\x40\x40\x27\x87\xe4\x4e\xf0\x7d\x8d\xcb\x1f\x91\x1b\x61\xc4\xef\x7a\xa2\x85\x28\x09\x07\x9b\x0c\x00\xf7\x45\xc6\x12\xa6\xb3\x05\x12\x3a\x22\x4a\x6d\x33\x8e\xa9\xf6\xd9\x89\x67\xf7\x4c\xbb\x18\x37\x83\xb6\x6f\x10\x9a\x96\xd8\x11\x6a\xa4\xa3\x39\x1c\xcd\x80\x66\x7a\x66\x03\x4b\xb8\xe0\xc3\x7f\x82\x14\x98\xb7\xc8\xdd\x95\x57\x57\x22\xb0\x17\x6d\xc3\xd0\xde\x6f\xa1\xbf\xa6\x42\x7f\xb9\xb9\xb9\xfc\x16\xf4\x12\xc9\x30\x6f\xf1\xe1\x3e\x68\x41\x00\x39\x11\x32\x7f\x06\xb4\xa3\x1f\x07\xe7\x90\x14\x42\x3e\x07\x12\x36\x13\xaa\xd3\x5e\x92\x95\xfd\x14\x4a\xa3\x12\xe5\x84\x38\x0e\x89\xd9\xc1\x66\xdc\x89\xef\xbb\x73\x7e\x39\x22\x7f\x15\xa5\xf9\x9a\x31\x1d\x67\x8b\xaa\x6e\x83\x02\x4d\xf6\xcc\x54\x7b\x86\x3c\x19\x6c\xf8\x0b\xd0\xd4\x68\x36\x86\x7a\x00\x7d\x1e\xfd\xb5\x88\x3b\x0f\x6e\x6d\xfd\xf2\x81\x52\x69\x91\x93\x99\xfb\xec\x66\xba\xa6\x3b\x19\x23\x3c\x3d\x3e\x17\x4a\x42\x61\x29\x9c\x7b\xe6\xd5\xd1\xaf\x15\xba\x61\xe1\xee\x7e\x1f\x63\xcd\xab\x24\x04\x9b\x6b\x30\x65\x93\x89\xb8\x05\x96\x41\x35\x68\xe7\x5e\x09\xc7\x33\x2e\x54\xda\x3a\xf9\x73\x79\x22\x74\x04\x76\x8f\x0f\xeb\xb5\x4c\x69\x3f\xb1\x06\x64\x9d\x61\xd6\xe1\x8c\x35\xda\xf4\x04\xc4\x4f\x53\x27\xf3\x73\x00\xa0\x9f\xcd\x27\x7d\x42\xa0\xe8\x21\x1c\x7c\x35\x18\x5c\x0b\xa3\xbe\x62\xba\xa6\x25\xae\x48\x26\x14\xc8\x79\xdb\x04\xf0\x7a\xf4\xf7\xe9\xa2\xbd\xa1\xc0\x8f\x35\xb9\xd5\x92\xf0\x32\x1f\x83\xac\xb3\x59\xa4\x5e\x05\x48\x10\xcd\x70\x61\x6f\xf7\x26\xe0\x66\x3b\x47\xf3\xe4\x9f\xfe\xed\xdf\xfe\xf0\x6f\x23\x3b\x7d\x15\xd9\xc0\xc9\xf9\xf1\xc5\xf1\x2f\xd7\x3f\x9c\x60\x42\x6d\x57\xa8\xf6\x14\xb6\xd9\x77\xd0\x66\xaf\x21\x9b\x9f\x34\x60\x13\xd3\x44\x3a\x53\x91\xa6\xbf\x00\xa7\x34\x18\x60\xf4\x36\xa3\x71\x3a\xd9\x2f\x28\x6d\x66\x64\xcd\xa6\xfd\xd5\x1c\xb5\x67\x71\xc6\x74\x52\x5c\x8b\xe4\xb6\x47\xbd\x66\xff\xe6\xe4\xd2\x4e\x19\xd6\xe4\xe4\xde\x18\xc2\xf8\x5c\x64\x73\x5b\xce\xf7\xe6\xe4\x12\x4f\xde\x08\xff\x85\x86\x28\xd4\xa8\x17\xe6\x59\x9f\xc8\xe0\xdc\x53\x46\xfb\xb6\x16\x34\x4a\x24\xd0\x8c\x29\xcd\x12\x7c\xae\x36\x93\x9a\x19\xba\xf8\xa5\xa2\xa6\xb4\x6e\xf4\xae\x29\xed\x7f\xf4\x6e\xbb\x9d\x95\xa6\xae\x81\x87\xcf\x98\x2f\x39\x7e\x64\x33\x3e\x22\x5f\xfa\x4d\xf0\xa5\x42\xc2\xb5\x16\x45\x4f\x9e\x10\x3b\xd9\x06\x3f\xc8\x18\x26\x42\xc2\xb2\x23\x24\x70\x6c\xf8\x06\xc3\x1c\xb3\xff\xbc\x09\x4a\x34\x9c\x17\x36\xe4\x52\x95\xc9\xcc\x5b\x13\x39\x28\x75\x84\x2e\x8f\xb2\xb0\x2a\x26\x3a\x51\x4a\x09\x03\xf3\x75\x90\xe3\xea\x06\x75\x1a\x83\x79\x3d\x70\xfb\x23\xe8\xc4\x9a\x59\xbd\xff\xc5\x59\x54\xfd\xf2\x97\x5d\x25\x89\xa4\x6a\x06\x58\x3f\x04\xee\x59\xdd\xe7\x84\x2a\xc1\xad\xb1\xd7\x7d\x0e\x32\x1a\x45\x0a\xaa\x54\x5d\xc1\xd9\xbd\xc4\x3e\x74\x29\xd2\xfd\x7d\xd5\x78\x60\x2a\x69\x02\xa4\x00\xc9\x44\x4a\x30\x9f\x38\x15\x77\x9c\x8c\x61\xca\xb8\xf2\xf0\x33\x13\x79\x40\x1b\x76\x63\x8b\xed\xfa\x6a\x71\x23\x72\xd5\x28\x82\xe2\xd2\x93\x12\x51\x9f\x68\xb7\x8a\x65\x27\x13\x46\x84\x06\x6d\x9a\xab\x8d\xf1\x61\xb3\xfa\xf1\x45\xf7\xe0\x6d\x32\xa0\xad\xaf\x6d\x84\x0e\x16\xe7\xa7\xc9\xac\x9b\xe3\x37\xba\xa7\xb6\x1c\xd1\x3d\xb5\xdb\x88\xee\xa9\xe8\x9e\xda\x3c\x9e\x9d\x79\x37\xba\xa7\xa2\xd2\xb5\x3c\xa2\x7b\x2a\xba\xa7\x36\x8c\x67\x47\xbf\xa2\x7b\x6a\x8b\x11\xdd\x53\x5b\x8e\xe8\x9e\x8a\xee\xa9\xe8\x9e\x8a\xee\xa9\xdf\x90\x19\xd0\x8f\xe8\x9e\x5a\x99\x24\xba\xa7\x02\x60\x44\x4d\x69\xcd\x88\xee\xa9\x35\x23\xba\xa7\x82\x11\xf9\x52\x0b\xbe\xe4\x9d\x3b\x97\x46\x2f\xeb\x9e\xb3\x76\x89\x8e\x03\x96\x38\x1f\x51\xd8\x0b\xae\x7a\x55\xd0\xfe\x2d\xa8\xf9\xe1\x53\x6d\x9c\x37\xa8\xf6\x31\xad\xcd\x87\xda\xd5\x1d\xe1\x93\x08\xd5\x51\x21\xec\xff\xd5\xce\x88\xc0\x0b\x61\xb5\xd3\xf6\x39\x69\x4f\x96\x6d\xd5\xc5\xf5\xf0\xac\xdd\x0e\xcf\xc4\xb5\xd3\x83\xab\x21\xba\x19\x5e\x9d\x9b\xe1\xf5\xf4\xd0\x75\xce\xfc\x9b\x99\x04\x35\x13\x59\x6b\x44\x6f\x20\xf9\x07\xc6\x59\x5e\xe6\x06\xe7\x94\xc1\x67\x36\xaf\xa2\x06\x54\x85\xae\x96\xd0\x5b\x4b\xa1\xb9\x91\xa5\x80\x05\x50\x29\xcb\xcc\x36\x62\x5a\xe7\x8c\xa2\xa8\xae\xca\x24\x01\xc0\xf6\x6a\xa1\x16\xf3\x87\x51\xf5\xa6\xaa\x9d\xc6\xdb\x6e\xf4\xa6\x1b\xef\xb7\x25\x4a\x71\x96\x3f\xfc\xbe\xd5\x1c\x1d\xbd\x3c\x9f\xdf\xc3\xd3\x03\x99\xee\xae\xaf\x74\xd2\x55\xfa\xe0\x12\x5d\x75\x94\x97\xe6\xc9\xe9\xcd\xa3\xd9\x83\x07\xe7\x19\x79\x6f\x9e\x0d\x5b\x78\x2e\x1e\x9b\x67\x58\x7d\xb5\x07\x07\x43\x1f\x1e\x9a\xfe\xbc\x33\x9f\xa0\x48\xe9\xa7\xf1\xca\xf4\xa8\x0d\xf7\xe4\x8d\xf9\x1c\x9e\x98\x5e\xbe\xba\xab\x07\xe6\xf3\x79\x5f\xfa\xf9\xdc\x8e\xd6\xad\x57\xe1\x71\xe9\xc1\xaa\xd5\xa7\x45\xab\x37\x6b\xd6\x27\xf3\xb0\x74\xf7\xae\x3c\x03\xcf\x4a\x67\x20\x33\xce\x34\xa3\xd9\x29\x64\x74\x71\x0d\x89\xe0\x69\x6b\x0e\xb3\x54\xb5\xae\x3a\x3f\xca\x4e\xeb\x74\xb4\x66\xfc\xf1\x8c\xba\xe2\xbc\x90\xfa\x90\x6a\x6f\xfe\x73\x02\x05\x36\x34\xb1\xab\x7c\x96\x06\x3d\xf2\x6c\x94\x41\x1b\x8c\xdd\xe7\x26\xfe\x45\xdc\x11\x31\xd1\xc0\xc9\x01\xe3\x7e\x1f\x0f\x03\x35\xb0\xd6\xcc\x2b\xb4\x36\x57\xdf\xbe\xf1\x37\xbf\x3e\x95\x1b\x8d\x0b\x4a\x7d\x7a\x0b\x88\x7b\xd1\xe3\x26\x10\x77\xe3\xa4\xcc\x9a\x66\x10\x6b\x1a\x69\xd2\x9b\xb7\x75\x79\xd1\xb7\x38\x6f\x75\xda\x28\x4f\x89\x4b\xdc\x78\x7d\x9b\xd6\xd9\x6f\xfc\x1a\x7c\xc6\xd1\xf6\x42\xfa\xb6\xbd\x3c\x91\x6f\xf8\x19\x4a\xcd\x2f\xd4\x1f\x1c\xa5\xe6\x1d\x46\x90\xff\xf5\xad\xa4\x09\x5c\xf6\x2e\x70\xf8\xe3\x44\xd2\x52\xba\xb4\xbd\x4a\xee\xa8\x0e\x0f\x07\x48\xed\x69\xaa\x92\xe2\x30\x1b\x6d\x52\x66\xd9\x82\x94\x85\xe0\xcd\xcc\x43\xeb\xb4\x5a\x4e\x58\x33\xb3\xad\x7b\x4b\x2d\xa5\x16\x52\x38\x06\x2c\x4b\xce\x0d\x3d\xaf\x1b\x0e\xa1\x54\xaa\x2c\xad\x0e\xd3\xe2\x14\x9b\x9a\xe5\x1b\x66\x8a\x19\x73\x2c\x87\xba\x25\x45\x3d\xa1\x79\x7a\x22\x64\xc2\xc6\xd9\x82\xcc\x68\x56\x75\x97\xa0\xe4\x96\x65\x99\x9b\x66\x44\xae\x41\x13\x3d\x63\xae\x31\x38\xc9\x04\x9f\xe2\xe2\x28\xf7\x5d\xcd\x20\x31\xcf\x26\x19\x50\x5e\x16\xf6\x7d\x86\xad\x2f\x44\x29\xfd\xfb\x5c\x59\xcb\x6a\x16\xa6\x08\x67\xd9\x20\xe8\x9d\xf4\xe0\xc6\xd6\x0d\xea\x15\xf8\x9c\xc2\x3b\xa6\x60\x10\xce\xe9\x2b\xf3\xaa\xa0\x73\x46\x21\xc5\x9c\xa5\xb6\xfb\x85\x07\x1b\x76\x69\xb5\xdd\x31\xaa\xf3\xcc\x05\x1f\x72\x98\x52\x94\x7a\xdc\x29\xb2\x7b\x66\xe7\xb1\xae\x38\x9e\x62\xbf\x0c\xa3\x2e\x88\xa2\x91\xca\x3a\x67\xb6\xd3\x67\x00\x39\x72\xc0\x05\x11\xc8\x5e\x4b\xce\xb4\xed\x1e\x3d\x2b\x35\x49\xc5\x1d\x3f\x1c\xd9\xaa\xc4\x4c\x11\x4a\xc6\xa0\x7d\x27\x5b\xdf\x59\x91\x49\x50\x04\x38\x1d\x67\x66\xcf\x31\xe0\xe1\x66\x2d\x80\xc8\x04\xa8\x2e\x25\x90\x29\xd5\xb0\x56\x68\xb2\xdf\xfb\x30\x78\x99\xaa\xba\xbc\x97\x5c\x41\xeb\xfe\xd6\x3d\x4b\x5a\x7f\xfa\x63\x3b\x1a\xc1\x72\x10\xa5\xfe\x2c\xaa\xe4\xdd\x8c\x25\xb3\x50\x32\x66\x39\x28\x22\xca\x25\x1d\xfb\xad\x7b\x6c\xfd\x0e\x45\x7d\x72\xdd\x68\x6b\x25\x5e\x63\x4a\x5b\x4e\x39\xae\xdb\xca\x52\x73\x00\x4f\x2f\xae\x7f\x79\x7f\xfc\x5f\x67\xef\x47\xe4\x8c\x26\xb3\x30\x1f\x9d\x13\x8a\x44\x03\x09\xc5\x8c\xce\x81\x50\x52\x72\xf6\x8f\xd2\x56\x27\x27\x07\xd5\xb3\x87\xbd\xd6\x42\x6e\xc9\x7d\xb1\xf5\x75\x6f\xbd\x96\x6c\x23\x6d\x1b\xe0\x20\x14\x60\x77\x84\x65\xf1\xe9\xcc\x5c\xb2\x8a\x06\x8a\x5a\x33\x30\xc4\x88\xcd\x1d\x19\x76\xc5\xa5\x69\x5a\x85\x5c\x18\x3c\x37\x68\x61\x58\x15\x1d\x63\xa8\xc4\x0c\x08\x07\x6d\xd0\xba\x32\x58\x09\xae\x1a\x85\x01\x4a\x05\x6a\x40\xc6\x25\x06\x77\x14\x92\xe5\x54\xb2\x6c\x11\x4e\x66\x78\xd5\x85\xf0\xea\xd0\x62\x79\x49\xa7\x1f\xcf\xae\xc9\xc5\xc7\x1b\x52\x48\x5b\x32\x00\xa3\x33\xf0\x3a\x7e\xd6\x18\xcc\x13\xae\x47\xe7\x88\x1c\xf3\x85\xbd\x68\x0f\x38\x53\xc4\xe8\x42\x80\x2c\xd8\xc9\x90\xbe\x28\xfc\xde\x9b\x11\xfe\x6f\xcf\x7c\xa5\x34\x42\x66\x15\x74\x92\xac\x04\x8f\x59\x31\x94\x8d\xb3\x00\x9a\xee\xdb\x5f\x55\xb7\xa5\x2a\x6c\xee\xd2\x00\x31\xe8\xb6\x44\xab\xad\x46\xf0\xda\xee\x5b\x8c\x4f\xb3\x10\xab\xda\x91\xfd\xae\xba\x65\x57\xcd\x72\x58\x7f\xc1\x65\x5b\x05\xb3\x97\xae\x4f\xf5\x1a\x7a\xea\x95\x52\x73\x3f\xaf\x4e\x39\x8a\x20\xc2\xf6\x97\xe7\x97\xfe\x04\x38\xe9\x26\x5f\xea\x99\x88\x0f\x5b\xa7\xc6\x80\xbc\x21\x7f\x26\xf7\xe4\xcf\xa8\x5e\xfd\xa9\x6b\x67\x99\xae\x8a\x4f\x77\xf3\x8e\xd5\xea\xcf\x2f\x7b\x82\xf8\x8f\x86\x3a\x99\x19\x0d\x54\xb5\x20\x63\xe6\xc4\x79\xb8\xd7\x20\x0d\x1d\x75\x3b\xf1\xa4\x3d\x79\xcc\x02\x3f\x23\x9a\x59\xdf\xc5\xf9\x24\x6c\x09\xa1\x77\x44\x34\xf3\xf8\x5f\x84\xd2\x17\x8e\x0a\x35\x1b\x4c\xd4\xb3\xe5\x54\x27\xb3\x26\x19\x33\x82\x9a\xd2\xf5\x01\x53\x24\x15\x68\x49\xb3\x71\x80\x33\xd6\x21\x12\xe3\xf9\xa0\x71\x37\xe7\x7c\x63\x3f\x1f\xda\xa9\x25\x03\x0a\x6a\x3e\x4e\xb0\x0a\xca\xcb\x14\x22\x75\x32\x99\x59\x56\x1a\xf0\x8c\x07\x84\x32\x67\xab\xa9\x4c\xd6\x88\x4b\xe6\x3c\x25\x94\xdb\x00\xee\x09\x48\x69\x43\x37\xc7\x0b\xf4\x20\xb3\x04\x3a\x6f\x5e\xa7\x93\x54\x48\xa1\x45\x22\x3a\xb4\x0d\x6a\x3a\xcc\xdd\x74\x08\x04\x6b\xfc\xf5\x36\xf7\xef\x4f\x2f\x07\xe4\xe6\xe4\x12\xbb\xa9\x5c\x9f\xdc\x5c\x36\x35\x95\xbd\x9b\x93\xcb\xbd\x27\x05\x05\xf1\x92\xd5\x3b\xb3\xcc\x16\x93\x34\x0c\x4f\x46\x6c\x1b\xe6\xb4\x18\xde\xc2\xa2\x25\x4f\xed\x83\xaf\x0f\xab\x1d\xee\xe5\x83\x2c\x98\x73\x5a\xec\x3c\x9b\x04\x9a\xb2\xcf\x94\x45\xe1\x4e\x56\xfd\xce\xf5\xe9\x14\xb9\x98\x43\x6a\xc5\x61\xff\x04\xf0\xb4\x10\xcc\xc8\x8b\x31\xc7\x62\xf7\xa7\x63\x8e\xc5\x43\x23\xe6\x58\xc4\x1c\x8b\x98\x63\xf1\xf0\x88\x39\x16\x6e\x3c\xbd\x19\x94\xc4\x1c\x8b\x96\xe3\x75\xf9\xf9\x63\x8e\xc5\x4e\x23\xe6\x58\xac\x8e\x98\x63\xb1\x61\xc4\x1c\x8b\x0d\x23\xe6\x58\xc4\x1c\x8b\x98\x63\x11\xa3\xc5\x1e\x9d\xeb\x79\x46\x8b\x91\x98\x63\xe1\x46\xcc\xb1\x78\x15\x31\x31\x24\xe6\x58\x6c\x35\x62\x8e\x45\xcc\xb1\x68\x33\x62\x8e\x05\x8e\x68\x7b\x89\x39\x16\x7e\xc4\x1c\x0b\x3b\x7e\x3b\x52\x73\xcc\xb1\x88\x39\x16\x31\xc7\x22\xe6\x58\x3c\xb8\x8a\x98\x63\xf1\x1a\xf4\x49\xdf\x03\xaf\x7b\xce\xc0\xfe\x89\xc8\x8b\x52\x03\xb9\xf2\x53\x56\x52\xa4\x25\x0c\x4c\x85\x12\x41\xf7\x10\x9e\x44\xf0\x09\x9b\x3a\xca\x7e\x64\x1b\xcc\x0d\xab\xef\x19\x06\x4d\xdd\x5e\x60\xfc\x4e\xc6\x72\xd6\x2e\x91\x83\xac\x6c\xcc\x7b\x9c\x2b\x70\xf2\x98\x93\x94\xd3\x7b\x3c\x22\x34\x17\xa5\x6d\xca\x97\xb8\xfd\xab\x40\x68\x5d\x61\xcf\x6e\x67\x48\x3f\x2a\x4e\x9d\x91\x72\xd9\x83\xb6\x51\x50\xad\x41\xf2\x77\xe4\xbf\x0f\xfe\xf6\xd5\xaf\xc3\xc3\xaf\x0f\x0e\x7e\x7a\x33\xfc\x8f\x9f\xbf\x3a\xf8\xdb\x08\xff\xf1\xaf\x87\x5f\x1f\xfe\xea\xff\xf8\xea\xf0\xf0\xe0\xe0\xa7\xef\x3e\x7c\x7b\x73\x79\xf6\x33\x3b\xfc\xf5\x27\x5e\xe6\xb7\xf6\xaf\x5f\x0f\x7e\x82\xb3\x9f\xb7\x9c\xe4\xf0\xf0\xeb\x2f\x5b\x2f\xb9\xb3\x48\xdc\x9f\x40\xdc\x93\x38\xfc\x49\x84\x61\xe7\x1d\xee\xe9\x2c\x5e\xb9\xd9\x96\x4f\xa3\x63\x58\x0f\x9d\x46\x4f\x4d\x51\xcc\xab\xe6\x61\x8a\x88\x9c\x69\x23\x1c\x1a\x79\x90\x86\x71\x61\x4c\x37\x94\x52\x47\x07\x30\xa0\x92\x6a\xdb\x23\xb4\x8a\xa9\x0a\xe2\xb4\x85\x97\xfc\x5c\xef\xd5\xca\x5e\x81\xe7\x79\x98\xc2\x84\x71\x70\x7e\xb0\x48\x1b\x1e\x1f\x91\x36\xbc\x46\xda\xa0\x20\x29\x25\xd3\x8b\x13\xc1\x35\xdc\xb7\xb2\xb0\x34\x49\xc3\x75\x73\x42\x62\xcf\x99\xcb\xa2\x74\xd7\x88\x28\x6c\x00\xe5\x52\x3a\x6b\x15\x82\x2b\x4b\x8e\x0a\xa6\xcd\x92\x01\x6d\xb5\x3f\xd4\x7b\x30\x26\x72\xf9\x25\x5e\x9f\xb3\x6a\xe6\x3f\x4a\x36\xa7\x99\xd1\x76\xeb\x27\x2e\x51\x83\x09\x1f\xda\xf6\xcc\x6b\xaa\x6e\xeb\x03\x0f\x43\x23\x43\x57\x6b\x3e\xf2\x9f\x84\x3f\xc1\xbd\x7e\x89\x52\x1a\x0a\x48\x97\x92\xcd\x59\x06\x53\x38\x53\x09\xcd\x90\xae\xf5\xc3\x2b\x8e\x37\xcc\x8e\x1b\x2f\x45\xa6\xc8\xdd\x0c\xb0\xbb\x32\xf5\x26\x00\xcc\x70\x99\x52\xc6\x49\x6e\xb6\xa8\xf0\x0f\x2b\x6b\x4b\x30\xe4\xbf\xa0\xd2\x6c\x70\x65\x33\x40\x15\x79\x2c\x44\xe6\x42\x87\xb3\x45\x3d\xbf\x8b\xbd\xe7\xe2\x17\x0e\x77\xbf\x98\xd9\x14\x99\x64\x74\x5a\x99\x0a\x14\xe8\x15\x6b\x5f\x3d\xf5\xc6\x0f\xc0\xb8\xdc\x12\x08\xcd\xee\xe8\x42\xd5\x86\x93\xb0\x0f\xf8\x3b\xf2\xf6\x10\xd1\x99\x2a\x52\xcd\x91\x92\xdf\x1f\xa2\x2f\xf1\xe4\xf8\xf2\x97\xeb\xbf\x5e\xff\x72\x7c\xfa\xe1\xfc\xa2\x1b\xa7\x30\xdf\x0e\x94\xb7\x9a\x23\xa1\x05\x1d\xb3\x8c\x75\x61\x10\x2b\xd1\x26\xe1\xa4\xc8\x82\xd3\xf4\x28\x95\xa2\xb0\x70\xf2\x36\xaa\x9a\x53\x36\xb5\xe0\x30\x33\x19\xb7\x67\xd2\x9c\x70\x2a\x29\xd7\xb5\xb1\xa6\x06\xb9\x2c\xb9\x51\xac\x5f\x78\x60\x3e\x4d\xfb\x0b\xca\x3f\x4e\x53\x48\x1b\xd0\x7b\x75\x41\x80\x27\xfe\xe3\x16\x75\x8e\x36\xb9\xfc\x78\x7d\xfe\xbf\x97\xd0\x70\x51\x74\x8b\x79\xea\x27\x2f\x4c\x8a\xa2\xb7\xdd\xbd\x72\x79\x47\x71\x7f\x9f\xc5\xfe\x56\xbc\xaa\x1f\x4f\xfb\x55\xc9\x9b\x65\x3c\xea\xf9\x49\x2e\x52\x18\x91\xcb\xca\x4a\xdf\xbc\x1a\xa4\xf7\x52\x09\xc4\xdc\xc2\x35\xa3\x59\xb6\x08\x05\x24\x2d\x6c\x32\x4d\x23\x33\x39\xa4\xc3\x13\x9a\xa9\x8e\xc4\xb4\x0b\x67\x32\x4c\xf8\x83\x51\x26\x7b\x81\x66\x35\x1b\x49\x81\x0b\xed\xa4\x52\xb3\x4a\x4c\xd6\x96\x22\x21\x56\x73\x0d\xc2\xa2\x1a\xdc\x45\x59\x43\xbf\x67\x4c\x4c\x79\x58\x5d\x56\x33\x5b\x2b\x6f\xa9\x60\x59\xba\x75\x8c\xa9\xd6\x65\xcd\xec\x12\x68\x8a\x39\x69\x05\xd5\x33\x1b\xd5\x90\x53\x75\x0b\xa9\xfd\xc1\xc9\x35\x95\x99\xdf\xcc\x58\xbd\xea\xc6\xac\xdb\xdb\xf4\x51\x9e\xb1\xb1\x16\xe8\x0b\x68\x57\x74\x83\xf4\x71\x04\xcc\x37\x7d\xe4\xd9\xe2\x4a\x08\xfd\x4d\x95\x8b\xd5\xcb\x06\xfe\xe8\x24\xc5\xa6\x19\x16\x45\x29\x0c\x42\x48\x87\x08\x4c\x44\xe9\x30\x0d\xec\xb4\xde\xb0\x27\x46\x68\x59\xf2\x63\xf5\xad\x14\x65\x6b\x0e\xb0\x22\x68\x7d\x7b\x7e\x8a\xe7\xb8\x74\x5e\x36\xae\xe5\x02\xb3\x4e\x57\x0b\x06\x55\x32\xed\xf7\xce\x4f\x18\x62\x64\xed\xd2\x21\x1f\xe8\x82\xd0\x4c\x09\x2f\x1c\x33\xbe\x56\x81\x72\xda\x99\xb9\x3c\x16\x7a\xb6\xa2\x96\x19\x74\x5e\x7d\x6e\x10\x38\xdd\xea\x0a\x46\x8c\xaf\x3c\xae\xe9\x2d\x28\x52\x48\x48\x20\x05\x9e\x74\xdc\xb5\xa7\x76\x35\xe1\xce\x5f\x08\x6e\x8e\x45\x2f\x7b\x7f\x5e\xf9\x18\xd1\x10\xd6\xdc\x69\xf4\x56\x3a\xbd\x83\xa2\xcf\x12\x0f\x45\xa9\x40\x5a\x07\xab\x2c\xc1\x6e\xc4\x77\xe5\x18\x32\xd0\x56\x19\xc2\xba\x13\x54\x5b\x45\x9a\xe5\x74\x0a\x84\xea\x0a\x51\xb4\x20\xc0\x95\x21\x37\xd6\xf4\xa6\x49\x2a\xa0\x4e\xa0\xa4\x8a\x7c\x7f\x7e\x4a\xde\x90\x03\xf3\xae\x43\xdc\xfe\x09\x65\x19\xba\x33\x35\x95\xcb\x6b\x64\x13\x3f\x05\x2e\x09\x71\x8f\x08\x69\x8f\xe8\x80\x70\x41\x54\x99\xcc\xfc\x9a\x8c\xc6\xe5\x15\x36\x17\xcf\x87\x46\xfd\x57\x88\xaa\x9d\x09\xcc\xf7\x0a\x64\x6f\xf4\xe5\xfb\x16\xf4\x25\x14\x21\x0c\xce\x35\xa1\x67\x11\x2b\x07\x4d\x53\xaa\xa9\xa3\x3b\x75\xd6\xf5\x6b\xdc\xd2\xa7\xa6\x3e\x0a\xde\x33\x5e\xde\xdb\x88\x95\xfe\x94\xfc\xeb\x33\x9c\x96\x24\x1e\x68\xb8\x69\xb4\x28\x32\x66\xf3\x9d\x97\x22\xa8\xce\x1b\x5b\x3d\xd8\x20\x22\xe1\x31\xa7\x59\x26\x0c\x79\x33\x9c\x9d\xf2\x54\xe4\x2b\x2f\x33\x02\x14\x34\x0a\xdd\x8d\xc8\xab\x44\x9e\x27\x37\x47\x64\x30\x87\x0e\x35\x5d\x96\xeb\xf2\x99\xd9\x8c\x2c\xe6\x37\x14\xa7\x27\x19\x1d\x43\x66\x39\x8b\x45\x20\xb5\x8a\x40\x4f\x1d\x85\x28\x45\xd6\x5f\x0e\xc6\x95\xc8\xc0\x86\xf5\x78\x40\x98\xe9\x5f\x04\x1c\x70\x92\xbe\xe0\x80\x8a\x4c\x03\x0e\xa8\x92\xbd\x04\x38\x94\x1d\x18\x2d\x59\x86\x83\xe1\xda\x4d\x38\x20\xeb\x7c\xee\x70\x50\x90\x24\x22\x2f\x2e\xa5\x30\x2a\x57\x6f\xac\xc5\x4d\x5b\xfb\x8a\xac\x4e\xbe\x26\x08\x07\x49\x79\xf3\x66\x2a\x83\x80\x3e\xaa\x2d\x8d\xf7\x51\x7d\xff\x2b\xec\x90\x6c\x48\xcf\x32\x1f\xf2\xb3\x34\xdc\x4a\xe6\x49\x77\xe1\x85\x97\x13\xe8\x60\x25\xeb\x85\x99\x88\x84\x66\x58\x72\xaf\x1b\xc6\x90\x65\xac\x59\x9e\x38\x88\xc2\x44\xd7\x12\xfe\xe6\xfd\xfe\x58\x7d\x0d\x7f\x71\xb6\x2f\x2e\x52\x08\x5c\x90\x36\x7c\xf4\xc6\x46\xeb\xe1\x7d\x3e\x00\xd4\x70\x75\xef\x0d\x4c\x1b\x4f\x6b\xe1\x2a\xc0\x7c\xa8\x0a\xf9\x99\x05\x02\x4f\x19\x9f\xa2\x45\x67\x40\x24\x64\x36\x74\xd4\x9d\xe1\x5b\xab\x7e\xed\x23\x46\xfb\x49\x3d\x3a\xfb\x57\xa3\x24\xc4\x04\x77\x33\xa3\x91\xc3\xcb\x37\x13\x4b\x2d\x99\x22\x7b\xef\x3d\x00\x3a\x54\x3e\x7b\x8e\x0c\x62\xcf\x7e\x61\xb5\x9b\xd6\xc6\x76\xcb\x78\xea\xa2\x2c\x1b\xc0\xaa\x6a\xd4\x5a\x29\x14\xe3\x77\x59\x1a\x92\x86\x77\xe4\x6f\x9c\x54\xc0\x22\xc3\xd6\xe8\x71\x65\x05\x56\x6f\x5e\x1a\x3e\x6c\xf2\xab\x5e\xb2\x3c\xcd\xf7\x1c\xf7\xde\xbc\x77\x68\xd4\xde\xd5\xfb\xfc\xb7\xec\x3d\xe5\xbe\xde\x31\x9e\x8a\x3b\xd5\xb7\x0e\xf1\xa3\x9d\xd6\x0b\xd4\x89\x41\x6b\xcd\xf8\x54\x85\x7a\x04\xcd\xb2\x86\x19\x76\x9d\x22\xe1\x77\xb8\xaa\x48\xbc\x2a\xc0\x2f\x45\x87\x47\x25\x60\x87\x31\xcd\x15\x3d\x91\xe6\x53\x34\xa3\xd9\x75\xd1\xbe\x34\x1b\x59\x46\x83\x6f\x3f\x5c\x1f\x37\xa7\x36\xf4\xec\x0e\x2b\x5e\x1b\x60\x9b\xeb\x84\xa6\x39\x53\x0a\xcd\x40\x30\x9e\x09\x71\x4b\x0e\x7c\xd8\xc6\x94\xe9\x59\x39\x1e\x25\x22\x0f\x22\x38\x86\x8a\x4d\xd5\x91\x43\xda\xa1\x59\xfd\x21\x61\x3c\xab\xa2\x51\x50\x8d\xe4\x5a\x79\x33\x06\xbe\x24\xa9\x56\x81\x7b\xeb\xea\x75\x3a\x2f\xf3\xea\x32\x6d\x85\x4e\x06\xd9\xd3\x17\x9c\x59\xdd\x9e\x8b\x8e\xb5\x33\x1e\xd9\x22\xfc\x76\x97\x9a\x12\xa6\x51\xad\x85\xa3\x95\xde\x9e\x1c\x48\x4e\x3a\x48\x40\xf5\x57\x95\xe7\x2f\xf5\x9c\x24\x05\x9b\x3d\x01\x18\x75\x42\x37\x06\x37\xa1\x55\x76\x1f\x93\xf0\xdc\xa3\xfb\xa1\x44\x8b\x5e\x1f\x9b\xe6\x61\xf4\x81\xac\x98\xd1\xa1\x55\x92\x0d\x49\x42\x1a\xe6\x65\x80\x99\xe0\xc2\x05\xa7\x1b\x2e\x28\x38\xa2\x34\x6a\x0b\xd6\x11\x84\x7b\xe2\x68\x6c\xb0\xd4\x93\xda\x3f\x18\xfa\x90\x30\x89\xc7\x16\x01\xa8\xd7\x70\xc7\xf4\xcc\x57\xb8\x6f\x38\x9c\x70\x25\x12\x14\x7a\x0f\x38\x01\x29\x85\x74\x81\x30\xde\x6a\x8b\x33\x21\x29\xc6\x48\x1a\x83\x24\xd4\xfc\xb5\xaf\x42\x17\x65\x5d\x02\x17\xe3\xc4\x0c\x36\xc1\x64\x02\x09\x4a\x4a\x21\x80\x2d\xd9\x3d\xa8\x2b\xf7\xb9\xe8\x6e\x83\x60\xae\x84\x6e\xce\xee\xcd\x5b\xc2\xa7\x42\x67\xa8\xab\x98\xb7\xfe\xf2\xe1\x88\x90\x73\x5e\x45\x4e\x0e\xcc\x2e\x86\x77\xfa\x90\x1f\x6d\x3e\x31\xac\xbf\x8c\x1f\x10\xda\x9d\x8c\x78\x27\xcb\x1e\x30\xbe\x8b\x31\x98\x84\x06\xe1\x5e\xc9\x01\x1a\x86\xdd\xa4\x66\xeb\x3d\x13\xef\x62\x28\x36\xb7\x7c\x2a\x63\xf1\xcb\xe0\xf4\xa4\x2b\x9d\x73\x29\xf1\x3d\x15\xc5\xbd\x0e\x66\x0b\xc4\xef\xca\xdd\x74\x29\x52\x5b\x12\xa3\x4a\xe9\xc7\x5e\x16\x58\xa2\x83\xfd\xd3\x0b\x58\xb5\x90\xc6\x85\x8d\xca\x0e\x6b\x65\xb8\x9a\xa0\x29\x31\xb2\x72\xe6\x75\xfb\xbc\xc8\x00\xb3\xe7\x82\x99\xeb\xc4\xc0\xa0\x8a\xee\xa0\x5a\x48\x5d\x88\xd7\x55\xe8\x18\x90\xff\xc1\x43\x59\x05\x00\xfa\xe2\x01\x97\xd5\xe3\x56\xc5\x63\xca\x97\xd4\xc6\xcc\x36\x2d\xbc\xe9\x80\xa4\x6c\x32\x01\x1f\x68\x68\x54\x3f\x2a\x69\x6e\x48\xbc\x22\x0e\x04\x63\x98\x32\x1b\xc9\x56\x11\xb6\x7d\x55\x67\xc0\x0f\x2c\x31\x64\x9a\xe4\x6c\x3a\xb3\x88\x42\x28\x66\x46\x12\xef\x52\xcb\x04\x4d\x09\xe2\xb6\x90\xe4\x8e\xca\xdc\xf0\x0d\x9a\xcc\xd0\x3f\x47\x39\x49\x4b\x89\x65\x22\x35\xd0\x74\x31\x54\x9a\x6a\x23\xea\x82\x74\x1a\xa1\x5f\x7f\x2c\x25\xfc\xe0\x88\xa5\x84\x37\x8f\x58\x4a\x38\x96\x12\x8e\xa5\x84\x1f\x1e\xb1\x94\xb0\x1b\x4f\x9f\xed\x4b\x62\x29\xe1\x96\xe3\x75\x95\xb3\x89\xa5\x84\x77\x1a\xb1\x94\xf0\xea\x88\xa5\x84\x37\x8c\x58\x4a\x78\xc3\x88\xa5\x84\x63\x29\xe1\x58\x4a\x38\x16\x45\x7b\x74\xae\xe7\x59\x14\x8d\xc4\x52\xc2\x6e\xc4\x52\xc2\xaf\xa2\xf4\x13\x89\xa5\x84\xb7\x1a\xb1\x94\x70\x2c\x25\xdc\x66\xc4\x52\xc2\x38\xa2\xed\x25\x96\x12\xf6\x23\x96\x12\xb6\xe3\xb7\x23\x35\xc7\x52\xc2\xb1\x94\x70\x2c\x25\x1c\x4b\x09\x3f\xb8\x8a\x58\x4a\xf8\x35\xe8\x93\x4a\xa7\xac\x55\xe5\xb3\x6d\x0a\x55\xb8\xc8\x90\x20\xb5\x75\x5c\x4e\x26\x20\x91\x72\xe1\x9b\x57\xa2\x10\xaa\x82\x56\x15\x2d\x73\x71\x06\x58\x16\x4f\x02\x4d\x5d\xc0\xfb\x86\xc7\x5d\x2e\x2d\x56\x28\xab\x23\x35\xcf\x3e\x7e\xd3\x4f\x55\x8c\x6e\x31\x8a\xb8\xe6\x8f\x3c\xe9\x1e\xab\x56\x03\x7c\x5d\x02\x86\x83\x7b\x92\x09\xe5\x22\x4c\x11\x58\xc9\x8c\x72\x0e\x5e\x79\x64\x1a\x8d\x32\x63\x00\x4e\x44\x01\xdc\xd2\x6f\x4a\x14\xe3\xd3\x0c\x08\xd5\x9a\x26\xb3\x91\x79\x13\xf7\xc0\xae\xa3\x41\xdd\x2f\x4a\x4b\xa0\xb9\x8f\x8b\xcd\x29\xb3\x53\x11\x9a\x48\xa1\x14\xc9\xcb\x4c\xb3\xa2\x9a\x8c\x28\xc0\x80\x76\xcb\xa8\x2a\x60\x60\x78\x49\x1d\x42\x3a\xa8\xdf\xe6\x96\x25\xc2\xa2\x40\xa8\xba\x0e\xb0\x0e\x6a\x5e\xe8\x45\x15\x47\x07\x64\xc2\xa4\xd2\x24\xc9\x18\x72\x6b\x7c\xa3\xcd\x1d\xc4\xf9\x06\x9e\x57\x73\xb7\x52\xe5\x96\xca\x53\x14\x5b\x0b\xad\x6c\x54\x5a\x3d\xa1\x9b\x2a\x65\xca\x89\xf9\x6a\x40\xa8\x2f\x79\x63\x01\xed\x57\x8a\xa0\xf6\x9c\xc5\xce\xee\x7e\x0a\xa6\x0b\xea\xe4\xd5\x61\x7b\x35\xa2\x63\x88\xb1\x47\xce\x41\x23\x9a\xba\x16\x28\x30\xdc\x65\xe5\x18\xe0\x06\x70\x98\x1b\x1c\x80\x04\x0c\x7f\xa5\x1b\xb0\xfe\xb3\x23\x7d\xc0\x14\x3f\x80\x52\x74\x0a\x97\x2d\xbd\x16\x9b\x34\x32\x74\x5c\xd4\x1b\x83\xa8\x90\xd9\xf4\xb4\xea\x97\x3a\xcc\xa9\x29\x06\x91\xdc\xae\xa9\x12\x7e\xee\x24\xd3\x1a\x70\x53\xb1\x38\x12\x3a\x3e\x97\x13\x50\xf7\x97\x82\xa5\x3e\xf8\x49\xea\x87\x0d\x51\xe7\xa9\x0d\x5d\x1a\x03\x19\x4b\x06\x13\x32\x61\x18\x0f\x85\x11\x4a\x03\x5b\xee\x83\x5a\x8b\x82\x52\x46\xdf\x15\xdc\xcb\xb2\x7e\x5d\x23\xf2\xa3\x5b\x98\x96\x25\x4f\x68\x50\x04\x10\x53\xb4\xd8\x84\x4c\x31\xc2\xc9\x49\x8b\x7f\x7c\xf3\x1f\x7f\x22\xe3\x85\x61\x69\x28\x59\x69\xa1\x69\x56\x7d\x64\x06\x7c\x6a\x60\x65\x8f\x67\x33\xc9\xa8\x82\x00\x56\x31\xb7\x0b\x7f\xfb\xfb\xdb\x71\x93\xc7\x1e\xa5\x30\x3f\x0a\xe0\x37\xcc\xc4\x74\x5d\x5d\xf8\xf6\x21\x93\x2d\x55\xa2\x35\x68\x26\x32\x96\x2c\x3a\x23\x9a\xaf\x3b\x43\x66\xe2\xce\xca\xfa\x6b\xb0\xa7\x8e\x81\x2c\x44\x51\x66\xd6\x82\xfd\x4d\x95\x9e\x57\x2a\x58\xcd\xc1\x59\x7b\x2e\xd0\xe6\xea\xa6\x58\xae\x17\x6b\x03\xdb\xfc\x2b\x85\x8b\xed\x76\x56\xc1\xaa\xfc\x0c\x2a\x42\xdf\xd0\x2c\x1b\xd3\xe4\xf6\x46\xbc\x17\x53\xf5\x91\x9f\x49\x29\x64\x73\x2d\x19\x35\xd4\x72\x56\xf2\x5b\x5b\xb9\xba\x4a\x11\x16\x53\x23\x5a\x15\xa5\xf6\x81\xc4\xeb\x3e\xd8\x26\x9c\x7a\x22\xec\xd5\xa0\x7a\x16\xb8\x67\xb5\xae\xe3\x52\x25\x2c\x46\x86\xf3\xab\x10\xd9\x7e\xff\xe6\x8f\xff\x6e\x51\x97\x08\x49\xfe\xfd\x0d\x06\x3f\xaa\x81\x3d\xc4\x48\xdb\x0c\xa3\xc8\x69\x96\x19\xb5\x21\x44\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x77\x47\xb7\xad\x45\xa9\x9b\x9b\xbf\xa2\x1c\xc5\xb4\x82\x6c\x32\xb0\x59\x01\x95\x5a\xb3\x8f\x8c\x61\xdf\x51\x1f\x4c\xcd\x78\x06\x02\xd0\x5c\x64\x65\x0e\xa7\x30\x67\x7d\x34\xaf\x68\xcc\xe6\x55\xfd\x8c\x29\x4c\xc0\x18\x67\x22\xb9\x25\xa9\xbb\x18\x84\xb1\x2c\x97\x50\x6d\x0f\x85\xb6\x01\x3d\x1d\x02\x79\x36\x7e\x7f\x23\x84\x27\xa7\x45\x51\xc5\xe8\x4b\x7a\xd7\x00\x06\x9e\x49\xcc\xf7\xed\x58\x4f\xa1\xb3\x99\xb9\xab\x91\x79\xe8\xbe\xc8\xd0\xcd\xd6\x53\xb4\x0e\x61\xe9\x6e\xa3\xae\x57\xdf\xde\x30\xd9\x40\x88\x7a\x42\x7f\x1a\x0a\xfc\xb7\x0d\xcf\x5e\xc9\x4a\xaa\x12\x5b\x2a\xc4\xb0\x02\x80\x41\x1f\x24\xc9\xed\x0d\xae\x3d\x58\x37\xbb\xc5\x2f\x35\xe0\xc2\x2b\xab\x72\x4e\xb5\x13\x08\xbd\xf9\x9a\x92\x02\xa4\x62\xca\xf0\xe5\x1f\xf0\x40\x9d\x64\x94\xe5\x81\x09\xf0\x69\x80\x60\x0f\x37\x56\xbe\xec\x4e\x29\x2f\x45\xea\x26\x44\x52\x68\xab\x7e\xae\x11\x6b\x9b\x52\x6d\x8f\x0c\xf5\xa9\x49\xe5\x0f\x35\x34\x9b\x94\xd2\xfc\x52\x91\x4a\x7b\xd7\x6b\x22\x90\xf8\x7d\x2f\x95\x3e\x56\x8b\xef\x89\x0c\x20\x61\x74\x9b\xdb\xa4\x84\x0d\xe5\xd1\x1e\x94\x40\xa4\x77\x7a\xe0\x88\x58\x97\xba\x39\x13\xee\x51\xb2\xff\x6e\xff\x49\x89\xa4\x05\x91\x14\x05\x9d\x76\xea\x61\xb0\x04\xa9\xe5\x69\xc3\x44\x6f\xa3\x06\xe1\xf5\xaa\xec\x10\xde\x05\x69\x5d\x88\x02\xcb\x8c\x58\xef\xa8\x07\xb0\x53\x10\x6c\x3e\xe4\x1d\x5d\x10\x2a\x45\xc9\x53\x67\x5f\xaa\x0c\x7c\x1f\x96\x5e\x7c\x21\x38\x78\xc3\xf9\x72\x9e\x38\x5a\xf4\x19\x27\x6f\x47\x6f\xdf\xbc\x16\x4e\x85\x5f\xb8\xc4\xa9\x2e\x2a\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x76\xdc\xd3\xf7\x7e\x70\x26\x96\xba\x98\x31\xf3\xc5\x5a\xf1\xa7\x3b\xc9\x34\x04\xbd\x8d\x0e\x50\x71\x31\xfa\x61\x90\x15\x7d\xd8\x63\x0d\xef\x7e\xd2\xd0\x55\x39\xfe\x84\x74\xcb\x11\x28\x3c\x6e\xeb\x2c\x5c\xea\x01\x12\x16\x02\x6a\x6f\x8f\x1c\xd8\x3b\xf7\x6d\x66\xe0\xe1\x93\xa2\x96\x03\xda\xd9\x7d\xd1\xa1\xc6\x5c\x03\x70\x67\xf7\x05\x45\x1b\x5c\xd1\x23\x04\xff\x0b\x66\x74\x0e\x98\x11\xc9\x32\x2a\x33\xf4\x39\x5e\xdb\xb5\x93\x71\xa9\x09\xf0\x39\x93\x82\x63\x80\xcf\x9c\x4a\x86\x55\x29\x24\x60\x66\xb5\xd1\x45\xbf\x3c\xf8\xe1\xf8\x0a\x03\x1a\x0e\x5d\x4a\xb8\x5b\x65\xa9\x7c\xf9\x88\x70\x25\xc1\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9e\xbc\xd4\xa5\x2d\x88\x7f\x9f\x64\xa5\x62\xf3\xa7\xa2\x24\x2e\x55\xf5\x94\xb5\xda\xe7\xa5\xb4\xd9\x1a\x50\x2b\x19\xb0\x68\x5a\x47\xd6\xf2\x48\x05\xd6\x7d\x55\xd5\xac\x0a\x7d\xe0\xce\xf4\xe4\x72\xd9\x6d\x2c\x9e\x2f\x59\xb6\x22\x42\x60\xdd\x86\xa7\x35\x42\xa5\x5c\x9d\xe0\x0a\x77\x03\x6b\x33\xba\xb9\x91\x14\x78\x7a\x71\x1d\x16\x01\xb0\xea\x92\x48\x47\xe4\xb2\xfe\xb1\xae\x14\x81\xf5\x8b\x2a\x25\x12\xe4\xb4\xae\x89\x3b\x05\x0e\x12\x85\x04\x33\x65\xa3\x9d\x1c\x19\x53\x65\x9d\x3c\xa7\x17\xd7\xd6\x66\xbb\x1b\xcc\x5a\x8b\xd9\xed\x25\x54\xc3\xf1\x6d\x4e\x44\x0b\xe1\xb6\xd9\xad\xa6\x32\x58\x19\xc0\xa0\x52\x6a\x27\x26\xe7\x97\x84\xa6\xa9\x44\xb7\x8f\x13\x7d\x82\x52\x6f\x95\x6f\x01\xab\x32\x50\x05\xe1\x9a\x02\x70\x23\x89\xab\x01\x4b\x4e\xcb\x22\x63\xd6\x8d\x10\x3e\x50\x57\x93\xc0\xf6\x2a\xbb\x23\x6d\x17\x35\xaf\xb5\x92\xd7\x81\x0a\x89\xb6\x55\xdd\x1e\xd8\x3d\x09\x4a\x64\xf3\xba\xa0\xe6\xd2\xae\xb9\x13\x81\x26\xf1\x6a\xd7\x7c\x11\xb7\xad\x76\x0c\xb8\x96\xe6\x68\x2e\xef\x16\x76\xef\xcd\x4a\x3c\x4d\xd5\x84\x6c\x0e\xe8\x1f\x77\xf5\xeb\x5c\x19\xa5\xba\xc4\xa7\xf5\x0d\xdb\x2a\xab\x40\xa5\xa7\x68\xb8\xaa\x96\x27\x91\x3c\x15\x22\x2c\x1b\x3b\x4e\x2f\xae\x2d\x25\xb4\x1f\x5f\x75\xe5\x5b\xb7\x4b\x35\x55\x6b\x8d\x81\x4f\x56\xe5\xa3\x8b\xe6\xb1\xd4\x56\xc9\xb5\x29\xed\x14\xc8\xd2\x41\xfc\xeb\x94\xb9\xd7\xe1\xed\x0a\xa8\x4c\x66\x6d\xe0\xff\x00\x21\xb0\x93\x92\x54\xd8\x48\x80\x89\x90\xa8\x12\x0f\x91\xbc\x67\x42\xdc\x96\xc5\x36\x14\xdd\x4d\x63\x7b\xe5\x6c\x45\x20\x1a\x4f\xfc\xa6\x68\x7a\xca\x55\x1b\x7f\x6f\x53\xf6\x01\x6d\x25\x1e\x9c\xa8\xce\xc6\x10\xcb\x7a\xd3\x49\x56\x2a\x0d\xf2\x1b\x26\x95\xde\xf3\x05\x57\x11\x83\xad\x4d\x64\x3f\xbc\xe1\x47\xa6\x67\xae\x74\xda\xfe\xa0\x79\xc9\xfc\xed\x26\xde\x37\x3a\xed\xfe\x85\xe0\xb0\x3f\x5a\x16\xbb\x2a\x52\x5e\x91\xb5\x8d\x3c\xc5\x2d\x5d\x41\x66\xe3\x45\xf1\x42\x80\x2b\x37\xae\x6c\x9c\x79\x83\xa7\x7f\x0a\x34\xa1\x58\xa2\x09\xef\x9e\xd5\x65\xde\x6c\x01\x16\x5b\xa7\x4e\x38\x41\x6f\x11\x82\x28\xa8\xc9\xa2\xc5\xe6\xcf\x6e\x23\xcf\xed\x8c\x01\xb6\xfc\xdf\x35\xc8\x39\x4b\xe0\x3d\xe3\xb7\x3b\xa2\x5f\x33\xba\xe4\x6c\x65\xb6\x46\x41\x5e\xeb\xa3\x65\xdc\x06\xdf\x19\x16\x43\xc7\xa2\xd4\x28\xbb\xa1\xc3\xb1\x56\x1c\x19\xff\x1f\xbb\x17\x68\x6f\x2f\x6c\xc5\xac\x75\x3a\xa2\x1a\x58\xa3\x8f\x57\x02\xd5\x82\x6b\x8a\xb5\xfd\x4e\x45\x72\x0b\x92\x64\x66\x19\x23\x52\x07\xbe\x34\xaa\xc9\xc9\x12\x76\x8c\xba\x68\x6b\xe9\x80\x62\x06\x39\x48\x9a\xd5\x45\x15\x3b\x80\xfa\xbd\x23\x9c\xd5\xac\x61\x4c\x8a\xad\x2e\xe4\xca\xa0\x99\x73\x78\xb6\xee\xae\x9c\x2e\x7c\xa5\x49\xc6\x31\xdc\xe0\x9e\x29\x34\xeb\x17\x22\x0d\xb3\xd8\x4a\x05\x72\x58\xe5\x18\xba\x3c\x1e\x55\x05\xe2\xa4\x30\x2e\xa7\x53\xc6\xa7\x8e\x3a\x23\x4d\xaf\x6b\x8d\xd5\x9a\x0e\x46\x7a\x27\x12\x6c\xc1\x47\x94\x1e\x6c\x7c\x19\x0b\xef\xcf\x45\x6a\x6f\x1f\x2f\xac\x36\xe8\x77\xb6\x0e\x90\x3e\xe7\x44\x48\x57\x67\x81\xa6\x29\xae\x7d\xf5\x0b\x5d\x4b\xef\xf0\xab\x06\x55\x1c\x87\x8d\xec\xae\x9e\x0a\xc0\xa2\xca\xb1\xef\xd1\xfd\x58\x8d\x4d\xa6\x6c\x81\xaf\xa0\xbc\xa6\x57\x0d\x96\x6b\x6b\x9e\xad\xee\xbe\x8f\x8f\x6e\x73\xce\x77\x67\x2f\xad\x58\x4b\x93\x5b\xf3\x35\x5f\x61\xc3\xc4\x97\xbc\xa3\x0e\xb3\x28\xf6\x14\xd5\x90\x17\x42\x52\xc9\x2c\xb9\x5b\xc6\x33\xc3\x2f\xd6\x20\xd8\xdc\xf6\x6a\x5c\x83\x63\x6b\x71\x19\xa9\x2d\x17\x55\x0b\x79\xc3\x17\x54\x32\x83\xb4\xc4\x28\xf5\x69\x49\xb1\x15\xac\xa1\x16\xce\xa8\xbe\x70\xe1\x7f\x16\xe9\xaa\xc0\xc2\x2a\x1d\x61\x81\xc1\x38\x58\x6d\xcf\xfc\x82\xd8\x6a\x43\x10\x6d\x2b\x4d\xec\xcb\x17\x46\x23\x6e\x40\xc2\x84\x62\x9b\x3f\xea\x0f\x15\xdc\x27\x60\xc8\x9a\x56\xf5\x62\x5d\x7c\x0a\xd6\x12\xf5\x98\xee\x60\x08\x73\x96\xe0\x1b\x36\x1e\x61\xf7\x05\x16\xd8\xe3\x45\xdd\xda\x78\xc3\xe1\xb9\x31\xdf\x56\x25\x0b\xe1\x53\x3e\x45\x60\xab\x43\xb1\x0c\xc1\xa6\x22\xe4\xdf\x43\x04\x4f\xdc\xf4\x41\x3e\x01\xb7\x47\xa8\xca\x0c\x70\x5d\x08\x7d\x74\xc9\x03\x87\xc4\xd6\x9d\xdd\x11\x7d\x3b\xe8\x19\xed\x9d\x88\xad\x9c\x7f\x5d\x54\x1a\x2a\xa7\xdd\xd5\xbf\xfd\x63\x39\x2d\x73\x5b\x16\x58\x2c\x55\x66\x75\xfd\x2c\x2d\x3b\x45\x8b\x9d\x61\xc6\x27\x1f\x4e\xc3\xe4\x8c\x30\xea\xdc\xa7\xb6\x18\x21\xaf\xa3\x25\x77\xd9\x94\x6b\x0e\x5a\x6d\x1f\xae\xb9\x86\xd3\x4f\x9d\xad\xb2\x7a\x9b\x47\x4b\xc6\x0b\x23\x67\xa0\x74\x54\x5b\x2b\x79\x32\xa3\x7c\x8a\x06\x7e\x51\x9a\xf9\xbe\xfc\x12\x57\x24\x21\x2d\x13\x57\x52\xde\x47\x76\x7f\xe9\xed\x9a\xae\xd2\x11\xf6\x95\x52\x09\x2d\xfc\x9a\xc3\xcf\xb2\x42\xc8\x3b\xc2\x46\x30\x22\x7b\x5f\x06\x97\xf6\xec\xdb\x0b\x29\xcc\x2b\x5c\x50\x38\xae\x2a\x63\x1a\x8f\xf7\x5e\x78\xf7\x88\x9c\x99\x77\xa0\xaf\xa7\x02\x60\x10\xb7\x3c\xae\xc1\x37\x20\x12\xa6\x54\xa6\x19\xe6\x12\x4e\x2a\x71\xcb\x66\x1c\x39\x80\x21\xe9\xc5\x48\x41\x2e\xf4\x3a\xbb\xeb\x4e\xfd\xee\xad\x90\x36\x4c\xa9\xa6\x43\x2c\xc3\x6f\x89\xd8\x91\x35\x1c\x0c\x5d\x21\xc4\x21\x75\xa8\x15\x74\xc4\xff\xc2\xe5\x8c\x0d\x69\x75\x17\xe3\x43\x3a\xc4\x92\x84\xed\xa3\x60\x9f\x20\x60\xa2\x93\x0e\xdf\xa1\x1e\xe6\xb2\xe0\x5d\x95\x51\x46\x18\x8c\xc8\x85\xd0\x75\xd9\xdc\x2a\x36\xc3\x95\x7c\x5c\x77\x9e\xcf\x2e\x6e\xae\xfe\x7a\xf9\xf1\xfc\xe2\x26\x1e\xeb\x78\xac\xe3\xb1\xee\x70\xac\x81\xcf\x3b\x1f\xe9\x4a\xc1\x5b\xa7\xf3\x2e\x95\xe2\x0b\x52\xc6\x5f\x51\xf4\xd9\x19\x9f\xff\x40\x65\xdd\xcb\x1d\xe5\xc7\xb5\x6e\x62\xdf\xec\x1d\x49\xdc\xc9\x8b\x0f\x3f\x7b\xc2\xe0\xb1\x1e\x83\x72\x2e\x82\x4a\x07\xeb\x76\x2d\x6c\x80\x75\xf2\xcb\xf9\xe9\xd9\xc5\xcd\xf9\x37\xe7\x67\x57\x4f\x1a\x4d\xd1\xb1\x14\x5e\x93\x29\xb7\xe4\x92\x85\x84\x39\x13\xa5\xca\x16\x55\xa3\xa9\xf5\x44\x60\x35\x20\x8f\xa7\x84\xf2\x85\xb7\xa7\xad\x7f\x2c\x32\xdb\x7e\x99\x6d\x33\xb8\xa4\x43\xe1\x92\xbe\xd0\xf7\x1b\x29\x5a\x37\xd2\x5f\xb6\xed\x5b\xfb\x84\xb7\xe9\xaf\xc3\xa7\x7d\x57\xe3\xa0\xc1\x7a\x9c\xf0\x58\x17\x54\x30\xc2\x68\x5e\xe8\x0e\x65\xc2\x7b\x29\x7e\xda\x4f\x9d\x50\x1b\x88\xf1\x81\x16\xdf\xc1\xe2\x0a\x3a\xd6\x47\x59\xf2\xa5\x64\x90\x18\x46\x47\x6e\x61\x61\x5d\xac\x27\xfe\x65\x5d\xea\xb8\x3c\xcb\xda\xb1\xb7\xd0\xa5\xae\x6f\x9f\x45\x5f\x6f\xa1\x43\x64\xa6\x1f\x2b\xe5\x4f\xcd\x16\xa2\x9c\x66\xf6\xb4\xdb\xee\x91\x7e\x0b\xbe\x7e\x82\x22\xb7\xfb\x21\xbb\x77\x74\x56\xef\x5c\x3e\x42\xcc\x0d\xe7\x82\xbb\x23\x17\x95\x36\x34\x8a\xeb\xd0\x62\xad\x3a\xc2\xd0\x9b\xa3\x2f\xf0\x3f\xae\x28\xd8\x71\x9a\xba\xe8\xe8\x52\xc1\xa4\xcc\xac\xad\x5e\x8d\x08\x2d\xd8\x0f\x20\x15\x9a\x54\x6f\x19\x4f\x07\xa4\x64\xe9\xd7\x5d\xaa\x4a\xd9\xd1\xe3\x2e\x08\xef\x91\xea\x77\x27\xae\x9d\xc3\x31\xe4\x5d\x15\x11\x21\x36\xf5\x11\x71\xd3\xdb\x80\x9d\x90\xd1\x13\x68\xba\x76\xa2\x22\x76\x0b\xfb\xa5\xab\xfb\x35\x61\xb5\xce\x9c\xaa\x02\x57\xfa\xce\x17\x9a\x53\x55\xfb\xa8\x91\xc1\xb0\x41\xf3\x4f\x55\xd0\x04\x06\xe4\xef\xd5\x8f\xd8\x70\x59\xfd\xb4\xbf\xff\xe7\xef\xce\xfe\xfa\x9f\xfb\xfb\x3f\xff\x3d\xbc\x8a\xac\x10\xb5\xe6\xa5\x5b\xd0\x06\xcf\x45\x0a\x17\xf8\x0e\xfc\xd3\x89\x6b\xc7\x49\x22\x4a\xae\xdd\x05\x4c\x5b\x1e\xcd\x84\xd2\xe7\x97\xd5\x9f\x85\x48\x97\xff\x52\x9d\x4a\xa5\x3d\x4b\xc6\x80\x5b\xd4\x21\xfd\xc6\x8e\xfe\xd8\x43\x4d\x4b\x7a\x3e\xaa\x6e\x56\x8f\x8d\x58\x72\xd7\x7a\x62\xbe\xf1\x20\xc0\x16\x97\xbe\x3e\x02\xc7\xa4\x72\x23\x99\x36\xeb\xe6\xed\xcd\xdf\x76\x6a\xe6\x6b\x47\x8f\xa4\xad\xda\xc1\x9e\x01\x86\x10\xf1\xad\x94\xf0\x20\x57\x0c\xd6\x6b\x29\xb5\xbb\xf9\xf8\xf2\x9c\xcc\x2d\x84\x9f\x0d\x70\xbc\x13\xed\x9b\x4f\x4a\xe3\x6a\x2f\xe8\x52\xf2\xea\x3b\xeb\xaf\xf6\xd7\x5d\x21\x01\x55\xd5\xf6\x02\xa3\xd8\x1c\xd8\x1f\x47\x49\x51\x0e\xdc\x0d\xa3\x1c\x72\x21\x17\xd5\x9f\x95\x8b\x70\xa8\xb4\x90\x74\x8a\x89\x27\xf6\x71\xfb\x58\xf5\x97\x7d\xb0\xf1\x82\xd5\xa7\xad\x2a\x9c\x94\xd2\x08\x0d\xd9\xa2\x2e\xfd\xf9\xfa\x68\x9b\x07\xfd\x33\x21\x6d\x15\x66\x74\xed\xfb\x68\x47\x13\x21\xeb\x20\x01\x14\x38\x2b\x28\xa2\x3e\xe9\x12\x6b\x07\x95\x18\x64\xad\x01\x7c\x6e\x34\xcb\xd6\xa5\xc1\xea\xd1\x23\x35\x4b\xd9\x9c\x29\xd1\x21\xbd\xa6\x9a\x68\x73\xce\x80\xab\xed\x61\x23\xa3\x2a\xb3\xd9\x7d\x81\xd5\x90\xaa\xf3\xba\x44\xf6\xdf\x76\xe9\xf4\x6d\x47\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\xec\xbc\xf4\x1e\x8a\x93\xda\xd1\x67\x89\xd2\xe6\x8c\xbd\xa0\xdf\x27\x2c\xf2\x6f\x87\x47\xaf\xbe\xcf\xbf\x0f\x8f\x7e\x57\x33\xa4\x8a\x5d\x3f\x9b\x03\xae\x20\x91\xa0\x3f\x87\x25\xc7\xbe\x29\x08\x94\xd9\x57\xa4\x52\x2d\x5e\x1b\x9f\xfb\x2d\x18\x77\xbc\xd8\x6e\xf7\xb5\x96\x44\x27\x52\xe4\x3e\xed\x1d\xdd\x1b\xd8\xe6\xda\xdf\x77\x0b\x9d\x9a\x25\xda\x11\x8d\x41\xd1\x18\xb4\x61\x3c\x6a\x0c\xba\xb6\x78\xf8\x6c\x2d\x41\xc0\xe7\x6d\x5d\x18\x6b\x3d\xe8\x5e\xd7\x09\x6b\xc4\x6d\xe7\x50\x1b\xf9\xa3\xae\x2a\x4f\x5c\x1d\x49\x63\x19\x5a\xbe\xde\x87\x89\x5d\xec\x19\xb7\x07\x1f\x27\xa8\xf3\x4a\x5c\x57\x03\x5b\xc2\x10\xe6\x66\x09\x55\x0d\xec\x46\xb5\x4b\x8c\x2e\xc5\x98\xd7\x1f\x6d\x08\xea\xad\x8d\x4a\x35\x4a\x1a\xe3\x75\x9d\xd0\x4a\x38\xac\x8b\x4b\x53\xa5\x44\x62\xa3\x69\xab\x2c\x07\x2c\x5d\xe7\x96\x8d\xab\xc1\x3e\xd3\x41\x3f\x72\x5b\x78\xba\xfe\xd6\xf1\x02\xeb\x61\xf2\xb9\x2f\xbe\x9d\xfa\x9c\x19\x5c\xc9\xfa\x39\x5e\x57\x00\x82\x41\x44\xe7\x04\x0b\xe2\x10\x90\xea\x57\x1a\x36\xc5\x50\x0c\x31\xa9\xad\xac\xed\xda\xfc\x75\xe6\xe2\xdd\x79\x66\xe5\xd9\xea\x24\x0c\xad\x30\xcb\xda\xfc\xdc\x64\x92\xaf\xc1\x19\xd8\x9d\x7d\xfe\xe6\x58\x67\x4f\x6c\xb3\x1f\x96\xb9\x83\xef\xa4\x4f\x36\xd9\x87\xb3\xa4\x90\x30\x61\xf7\x3d\x9d\xd3\x63\x5e\x5b\x62\x58\x0a\x5c\xb3\x09\xb3\x39\x34\x85\x84\x02\xb8\x4d\x5e\xa0\xc9\x0c\x69\xbf\xe3\x94\xb5\x73\xfa\x39\x06\xf3\x58\x81\xbb\x5f\x52\x76\xbd\x4e\xd8\x8f\x74\x8c\x44\x3a\xd6\x7a\x7c\x26\x3a\xe6\x30\xf7\xf9\x10\x31\x8c\x3c\xef\x1e\xfa\x7e\x1a\xc4\xb1\x23\x16\xef\x8c\x65\x75\x9e\xd3\x11\xce\xd2\xca\xfa\xdc\x09\x19\xf0\xb5\x97\x65\x96\xf5\x54\x7d\x7b\xff\x1c\xa1\x51\x94\x59\xe6\x92\x8e\x47\xe4\x23\xc7\xf3\x78\x8c\x5d\x1e\x06\xe4\x02\xe6\x20\x07\xe4\x7c\x72\x21\xf4\xa5\x15\x6c\x9b\xb1\x6c\xf6\x46\xc2\x26\xe4\x9d\x51\x99\x94\x26\xda\x56\xda\x0f\xea\x02\x09\xd9\x98\xa0\x2e\x39\xd6\x21\x06\x7d\xf3\xb6\x7c\xe1\x33\xda\x86\x4f\xb4\x4d\x55\x2b\x93\x1e\x74\x53\xdf\xb2\xce\x45\xc7\x61\x44\xa4\x73\x8d\xac\xcb\xe9\x7d\x81\x65\x36\x0a\xa1\xf4\xb5\x51\x61\xfb\x69\x73\x73\xe9\xa7\xc3\xce\x11\x34\xcb\x20\x6d\xf4\x39\xb2\xfd\x39\x68\x53\x85\xc6\x6c\xe3\xaa\x5d\x04\x90\x19\xe5\x69\x06\x12\x4b\xbe\xab\xe5\xba\x56\xac\xee\x71\x50\x75\xa5\xf0\x69\xa1\x34\x49\x84\x4c\x5d\xb3\x5a\x97\xbc\x89\x8b\xa9\x8e\x17\x12\xda\x9c\x72\x3a\xb5\x5d\x0a\x57\x0a\x07\x63\x39\x69\x15\xb4\xb6\x98\x09\x71\x4b\x12\x91\x17\x19\x1e\x80\x0e\xe7\xa3\xee\xac\x53\xa1\xe8\x10\xbb\x29\x1e\x05\x4d\x77\xf0\x87\x27\xec\x8e\xd8\x87\x9c\x02\xf7\x90\xf4\xd6\x95\xcf\x50\x44\xb3\xcb\xe8\x13\x17\xbc\x12\x57\x26\xc2\x1c\x46\xb3\xd7\x75\x3d\x82\x8a\xe8\x8d\xc8\xd9\x3d\x24\x41\x67\x4b\xf3\x84\x6b\x6d\xa9\x05\xda\x43\xba\x77\x2c\xee\x6c\xca\xef\xcb\x7c\xde\x21\x41\x2d\x1c\x4b\xd5\xe7\x70\x4e\x5f\x6c\xdb\xbd\x02\xfb\x16\xd8\x04\x69\x4c\x5a\xf3\xf5\xb7\x1b\x67\xc8\x9e\xd8\x95\x92\x75\x55\x80\xb2\x9f\x0b\x13\xb5\x85\xd0\xe4\x60\xff\x68\xff\x70\xc5\xae\xb7\x54\xb1\xf9\x26\x78\x92\x61\x89\xc2\x02\xeb\xfd\x41\xb2\x9f\x0e\x08\xd3\x9e\x46\xdb\x4a\x09\xb8\x2a\x97\x49\x37\x20\x4a\x10\x2d\x69\xca\x9c\xe6\x84\xbf\x9a\x9b\xb4\x2c\x5d\x99\x84\x83\xfd\x5f\xf7\x07\x04\x74\x72\x48\xee\x04\xdf\xd7\xb8\x7c\xac\x29\x52\xaa\x60\xa2\x85\x28\xb1\x75\x9f\x05\x41\x55\x20\xc4\x10\x3a\x22\x4a\xdb\xe7\x67\x46\xb5\xcf\xe0\x3b\xbb\x67\xda\xf7\xb6\x10\x13\xf2\xc6\xb6\x19\x02\xea\x2c\x8b\x19\x9b\xc3\xd1\x0c\x68\xa6\x67\x36\xf8\x82\x0b\x3e\xb4\x9d\xe2\x0c\x05\x72\x57\xba\xfa\x21\xba\x99\xe9\xc2\xd1\xc1\x64\xb7\xba\xa0\x8e\x12\xb9\xa1\xbd\xdf\xb6\xef\x85\x4b\x56\xda\x44\xdf\xdc\x5c\x7e\xdb\x68\x86\x8b\xc4\x5f\xeb\xc2\x87\xc4\x04\xc5\x36\x9e\x01\xed\xe8\xc7\x09\xd8\xa9\x93\x2d\xe9\x91\x84\x75\xed\x68\x4b\x56\xdb\x7e\xef\xd6\xca\x96\xfc\x55\x94\xd8\x82\x8f\x8e\xb3\x05\xb9\xa3\x5c\xfb\xf4\xbd\x3d\x33\xd5\x9e\x21\x4f\x06\x1b\xfe\x02\x34\x05\xa9\x90\x7a\x00\x6d\x5d\x54\xcc\x8f\xde\x9c\x53\xc1\xda\xfa\xe5\x03\xa5\xd2\x22\x27\x33\xf7\xd9\xcd\x94\x46\x77\x32\x46\x78\x7a\x7c\xbe\x90\x84\xc2\x52\x38\xf7\xcc\xab\xa3\x5f\x2b\x74\xc3\xc2\xbd\x51\x7c\x3f\x09\xc1\x16\xb6\x68\x61\xdc\x02\xcb\x36\x57\xec\x89\x96\xf6\x10\x54\x40\x7a\x0c\x2c\x20\xdd\x12\x24\x97\x27\x42\x67\x59\xf7\x18\xaa\xde\x62\x15\x48\x6f\xfe\x78\xb2\xce\x78\xe9\x70\xc6\x46\xce\xf6\x04\xc4\x5e\xbd\xe0\xa4\x7b\x0a\x66\x38\x1e\x06\x40\x3f\x9b\x4f\xfa\x84\x40\xd1\x43\xc8\xf4\x6a\xc0\xf4\x4a\x8b\x71\x24\x13\xb6\x52\xd5\xb3\xe1\x32\x5d\xfb\xad\x93\xf5\xf9\xc7\x92\xf0\xaa\x3d\xae\x7e\x11\x3d\xd7\x49\x7f\xa1\x8d\x7d\x07\x36\xf6\x1a\xd6\xf8\x49\x83\x1a\x31\x95\xa2\x33\x15\x69\xda\xd4\x71\x4a\x83\x01\x46\x6f\x33\x1a\xa7\x93\xfd\x9c\x51\xc8\xb7\xf0\x68\x5a\x51\xcd\x51\x7b\x16\x67\x4c\x27\xc5\xb5\x48\x6e\x7b\xd4\x6b\xf6\x6f\x4e\x2e\xed\x94\x81\x6a\x43\xb9\x37\x86\x30\x3e\x17\xd9\xdc\x56\xfa\xbb\x39\xb9\xc4\x93\x37\xc2\x7f\xa1\x21\x0a\x35\xea\x85\x79\xd6\x07\xfb\x3b\x17\x8e\xd1\xbe\xad\x05\x8d\x12\x09\x34\x63\x4a\xb3\x04\x9f\xab\x6c\x5b\x38\x43\x17\xdf\x4d\xd4\x94\xd6\x8d\xde\x35\xa5\xa0\xdb\xec\xae\x4a\x53\xd7\xe0\xbc\x67\xcc\x97\x1c\x3f\x92\x55\x33\xb5\xc8\x97\x7a\x9a\xef\xf9\xf2\xa5\x42\xc2\xb5\x16\x45\x4f\x9e\x10\x3b\xd9\x06\x3f\xc8\x18\x26\x42\xc2\xb2\x23\x24\x70\x6c\xa4\x25\xb8\x42\x9c\xc7\x97\xe7\x95\x09\x4a\x34\x9c\x17\x36\x2c\xd1\x57\xdf\xcc\xd8\x1c\x38\x28\x75\x84\x2e\x8f\xb2\xb0\x2a\xa6\xef\x9b\x3b\x30\x5f\x07\x79\x61\xeb\x57\x56\xa1\xfe\xae\x6b\x2f\xfe\x08\xda\x16\x9e\xac\xfc\x2f\xce\xa2\xea\x97\xbf\xec\x2a\x49\x24\x55\x33\xdb\xd1\x16\xee\x99\x76\x5d\x99\x25\x50\x25\xb8\x35\xf6\x06\xcd\x75\x99\x22\x05\x55\xaa\x2e\x03\xee\x5e\x62\x1f\xba\xb4\xa5\x83\xc3\x07\xa6\x92\x26\x40\x0a\x90\x4c\xa4\x04\x73\x6e\x53\x71\xc7\xc9\x18\xa6\x8c\x2b\x0f\x3f\x33\x91\x07\xb4\x61\x37\x80\xb6\x61\x5f\x51\x6d\x44\xae\x1a\x85\x42\x5c\x0a\x4f\x22\xea\x13\xed\x56\xb1\xec\x64\xc2\xa8\x49\x04\xaf\x6d\x2b\x53\x6d\x4c\xd8\x69\xe7\x91\x45\xf7\xe0\x6d\xb2\xcd\xa0\xfc\xb5\x8d\xd0\xc1\x82\xa7\x34\x99\x75\x73\xdf\x46\xf7\xd4\x96\x23\xba\xa7\x76\x1b\xd1\x3d\x15\xdd\x53\x9b\xc7\xb3\x33\xef\x46\xf7\x54\x54\xba\x96\x47\x74\x4f\x45\xf7\xd4\x86\xf1\xec\xe8\x57\x74\x4f\x6d\x31\xa2\x7b\x6a\xcb\x11\xdd\x53\xd1\x3d\x15\xdd\x53\xd1\x3d\xf5\x1b\x32\x03\xfa\x11\xdd\x53\x2b\x93\x44\xf7\x54\x00\x8c\xa8\x29\xad\x19\xd1\x3d\xb5\x66\x44\xf7\x54\x30\x22\x5f\x6a\xc1\x97\xbc\x73\xe7\xd2\xe8\x65\xdd\xdb\x08\xa3\x76\x87\xf5\xfc\x5e\x69\x5a\x53\x17\x1b\xff\xb3\xb6\xef\x3f\x13\x1f\x4a\x0f\x36\xfd\x68\xcf\x7f\x75\xf6\xfc\x7e\x6c\x61\x3d\xd8\xc1\x3a\x93\x72\xe7\x35\xbf\x99\x49\x50\x33\x91\xb5\x46\xf4\x06\x92\x7f\x60\x9c\xe5\x65\x6e\x70\x4e\x19\x7c\x66\xf3\xca\x3d\xaf\xea\x96\xcc\xe8\xb5\xb7\x26\x39\x73\x23\x4b\x01\xab\x71\x52\x96\x99\x6d\xc4\xfc\xc9\x19\x45\x99\x58\x95\x49\x02\x80\xbd\xbe\x42\x75\xe1\x0f\xa3\xea\x4d\x55\x6f\x87\xb7\xdd\xe8\x4d\x37\x26\x6b\xeb\x65\xe2\x2c\x7f\xf8\x7d\xab\x39\x3a\xba\x53\x3e\xbf\x2b\xa5\x07\x32\xdd\x5d\x31\xe8\xa4\x14\xf4\xc1\x25\xba\x2a\x03\x2f\xcd\x65\xd2\x9b\xeb\xb0\x07\x57\xc9\x33\x72\x93\x3c\x1b\xb6\xf0\x5c\x5c\x23\xcf\xb0\x14\x68\x0f\x96\xfc\x3e\x5c\x21\xfd\xb9\x41\x3e\x41\xc5\xcc\x4f\xe3\xfe\xe8\x51\xed\xec\xc9\xed\xf1\x39\x5c\x1e\xbd\x7c\x75\x57\x57\xc7\xe7\x73\x73\xf4\xf3\xb9\x1d\xcd\x48\xaf\xc2\xb5\xd1\x83\xf9\xa8\x4f\xd3\x51\x6f\x66\xa3\x4f\xe6\xca\xe8\xee\xc6\x78\x06\x2e\x8c\xce\x40\x66\x9c\x69\x46\xb3\x53\xc8\xe8\xe2\x1a\x12\xc1\xd3\xd6\x1c\x66\xa9\x84\x5a\x75\x7e\x94\x9d\xd6\xe9\x68\xcd\x40\xdf\x19\x75\x95\x62\x21\xf5\xb1\xcb\xde\xa4\xe7\x04\x0a\xb4\xc6\xd9\x55\xb6\xa9\xc3\x74\x27\xe4\x6d\x26\x68\xaa\x8e\x0a\x61\xff\xaf\x0e\xe3\x0d\xe2\x77\xed\xbb\xba\x05\xf0\x3e\xb5\x32\x68\xa3\x9e\xfb\xdc\xc4\xbf\x88\x3b\x22\x26\x1a\x38\x39\x60\xdc\xef\xe3\x61\xa0\x06\xd6\x9a\x79\x85\xd6\xe6\xea\xdb\x37\xfe\xe6\xd7\xa7\x72\xa3\x71\x41\xa9\x4f\x6f\x01\x71\x2f\x7a\xdc\x04\xe2\x6e\x9c\x94\x59\xd3\x0c\x62\x4d\x23\x4d\x7a\xf3\xb6\xae\x75\xf9\x16\xe7\xad\x4e\x1b\xe5\x29\x71\x19\x12\xaf\x6f\xd3\x3a\x3b\x68\x5f\x83\x73\x36\xda\x5e\x48\xdf\xb6\x97\x27\x72\xc2\x3e\x43\xa9\xf9\x85\x3a\x5e\xa3\xd4\xbc\xc3\x08\x12\xad\xbe\x95\x34\x81\xcb\xde\x05\x0e\x7f\x9c\x48\x5a\x4a\x97\x1f\x57\xc9\x1d\xd5\xe1\xe1\x00\xa9\x3d\x4d\x55\xf6\x19\xa6\x7d\x4d\xca\x2c\x5b\x90\xb2\x10\xbc\x99\xe2\x67\x9d\x56\xcb\x99\x61\x66\xb6\x75\x6f\xa9\xa5\xd4\x42\x0a\xc7\x80\x65\xc9\xb9\xa1\xe7\x75\xf7\x1b\x94\x4a\x95\xa5\xd5\x61\xfe\x99\x62\x53\xb3\x7c\xc3\x4c\x31\x35\x8d\xe5\x50\xf7\x47\xa8\x27\x34\x4f\x4f\x84\x4c\xd8\x38\x5b\x90\x19\xcd\xaa\x56\x07\x94\xdc\xb2\x2c\x73\xd3\x8c\xc8\x35\x68\xa2\x67\xcc\x75\xa9\x26\x99\xe0\x53\x5c\x1c\xe5\xbe\xc5\x16\x24\xe6\xd9\x24\x03\xca\xcb\xc2\xbe\xcf\xb0\xf5\x85\x28\xa5\x7f\x9f\xab\x1f\x59\xcd\xc2\x14\xe1\x2c\x1b\x04\x8d\x7c\x1e\xdc\xd8\xba\x5b\xba\x02\x9f\xbc\x77\xc7\x14\x0c\xc2\x39\xc5\x1c\xa4\x64\xa9\x73\x1a\xd8\xdf\x0a\x29\xe6\x2c\xb5\xad\x18\x3c\xd8\xb0\x65\xa8\x6d\xd5\x50\x9d\x67\x2e\xf8\x90\xc3\x94\xa2\xd4\xe3\x4e\x91\xdd\x33\x3b\x8f\x75\xc5\xf1\x14\x9b\x37\x18\x75\x41\x14\x8d\x9c\xd1\x39\xb3\x6d\x27\x03\xc8\x91\x03\x2e\x88\x40\xf6\x5a\x72\xa6\x6d\x2b\xe3\x59\xa9\x49\x2a\xee\xf8\xa1\x99\x9c\x29\x03\x07\x4a\xc6\xa0\x7d\x5b\x55\xdf\xe6\x8f\x49\x50\x04\x38\x1d\x67\x66\xcf\x31\x26\xe0\x66\x2d\x80\xc8\x04\xa8\x2e\x25\x90\x29\xd5\xb0\x56\x68\xb2\xdf\xfb\x30\x78\x99\xaa\x5a\x8e\x97\x5c\x41\xeb\x66\xcb\x3d\x4b\x5a\x7f\xfa\x63\x3b\x1a\xc1\x72\x10\xa5\xfe\x2c\xaa\xa4\x6d\xc7\x1f\x48\xc6\x2c\x07\x45\x44\xb9\xa4\x63\xbf\x75\x8f\xad\xdf\xa1\xa8\x4f\xae\x1b\x6d\xad\xc4\x6b\x4c\x69\xae\x1b\xe0\x6a\xfc\x4c\xd0\xed\x94\x9a\xa3\x78\x7a\x71\xfd\xcb\xfb\xe3\xff\x3a\x7b\xef\xce\x27\x0f\x99\x7e\xc9\xd9\x3f\x4a\x20\x34\x17\x46\xae\xce\xc2\x30\x9c\x01\x9a\x07\x82\x1f\xf0\x24\xf7\x1b\xb0\xd3\x92\x21\x63\x6b\xe6\xee\x61\x49\xd8\xe0\xf9\xd3\x47\x25\x3d\x75\xcb\x9a\xaa\xe5\xa6\xf9\xe0\xb0\x65\x0d\x25\x1c\xb4\x39\x79\x56\xa2\xb4\x2d\x8c\x18\x9f\x66\xa1\x30\xd9\x8e\x5c\x75\xd5\x89\xba\x6a\x44\xc3\xfa\x0b\x2e\xdb\x2a\x46\xbd\xb4\xce\xa9\xd7\xd0\x53\xc3\x89\x9a\x6a\x7b\x35\xc0\x76\x04\xf5\x6a\x80\x15\x3d\xce\x2f\x09\x4d\x53\x89\x62\x0a\x9e\xfa\x7c\xa9\xf1\x1c\x3e\x6c\x8d\xf1\x03\xf2\x86\xfc\x99\xdc\x93\x3f\xa3\x5a\xf0\xa7\xae\xed\x39\xba\x0a\xec\xdd\xcd\x12\x56\x1b\x3d\xbf\xec\x09\xe2\x3f\xce\xa8\xc6\x19\x0d\x54\xb5\x20\x63\xe6\xc4\x50\xb8\xd7\x20\x8d\x58\xe4\x76\xe2\x49\x1b\x9b\x98\x05\x7e\x46\x34\xb3\x36\xf7\xf3\x49\x58\xf9\x5f\xef\x88\x68\xe6\x71\xa3\xdf\x5f\x38\x2a\xd4\xec\x23\x50\xcf\x96\x53\x9d\xcc\x9a\x64\xcc\x08\x18\xaa\xc1\x9c\x52\x81\x64\xdc\xc6\xaf\xcd\x58\x87\x08\x82\xe7\x83\xc6\xdd\x9c\xca\x8d\xfd\x7c\x68\xa7\x96\x14\x7f\xe4\xf3\x4e\x30\x08\xea\x8f\x14\x22\x1d\x91\x33\x9a\xcc\x70\x59\x69\xc0\x33\x8c\x06\x82\x93\xcd\xe8\xdc\x6c\xbc\x7b\xd6\xf6\xdd\x40\x69\xa5\x32\xb5\x22\x2e\x99\xf3\x94\x50\x6e\x3b\xdf\x4d\x40\x4a\x1b\x72\x38\x5e\xa0\xe7\x93\x25\xd0\x79\xf3\x3a\x9d\xa4\x42\x0a\x2d\x12\xd1\xa1\xf7\xca\x72\xf4\x33\x4e\x87\x40\xb0\x46\x4b\x6f\x2b\xfe\xfe\xf4\x72\x40\x6e\x4e\x2e\xb1\x69\xc6\xf5\xc9\xcd\x65\x53\xc2\xde\xbb\x39\xb9\xec\xd0\xc3\xbf\x17\x9b\x87\x33\xb3\xbd\x33\xcb\xdc\x79\x12\x09\x34\x65\x31\x8e\x7c\xfb\x11\xe3\xc8\x37\x8f\x18\x47\x1e\xe3\xc8\x63\x1c\xf9\xc3\x23\xc6\x91\xbb\xf1\xf4\xa6\x1e\x12\xe3\xc8\x5b\x8e\xd7\xe5\xcb\x8c\x71\xe4\x3b\x8d\x18\x47\xbe\x3a\x62\x1c\xf9\x86\x11\xe3\xc8\x37\x8c\x18\x47\x1e\xe3\xc8\x63\x1c\x79\x8c\x88\x79\x74\xae\xe7\x19\x11\x43\x62\x1c\xb9\x1b\x31\x8e\xfc\x55\xf8\xfd\x49\x8c\x23\xdf\x6a\xc4\x38\xf2\x18\x47\xde\x66\xc4\x38\x72\x1c\xd1\xf6\x12\xe3\xc8\xfd\x88\x71\xe4\x76\xfc\x76\xa4\xe6\x18\x47\x1e\xe3\xc8\x63\x1c\x79\x8c\x23\x7f\x70\x15\x31\x8e\xfc\x35\xe8\x93\xbe\xa1\x56\xf7\x20\xe8\x2b\x3f\xd3\xf6\x61\x35\xe4\x6c\xcd\xaf\x68\x56\x51\x85\x99\x44\xd6\x53\x66\x12\x68\xba\xc0\x29\x13\x74\xcb\xd4\x42\xd6\x0b\x8c\xce\xc9\x58\xce\xda\xc5\x9d\x93\x95\x43\xf3\x1e\xe7\x0a\x5c\x38\x06\x2c\x39\xbd\xc7\x03\x40\x73\x51\xda\xfe\x5d\x89\xc8\x8b\x52\x37\x61\x8a\xdb\xd3\xa6\xf5\xd6\x84\x4d\x1d\x47\x3d\xb2\x5d\xc2\x86\xd5\xb4\xc3\xa0\x33\xd7\x13\x2a\x30\x34\xf5\xe1\x27\x97\x3d\xe8\x12\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf5\x92\x3b\x0b\xbc\xfd\x89\xbb\x3d\x09\xbb\x9f\x44\xd4\x75\xbe\xdf\x9e\xce\xe2\x95\x9b\x6d\xf9\x34\x3a\x76\xf4\xd0\x69\xf4\x1a\x37\x0a\x71\xd5\x3c\x4c\x11\x91\x33\xad\x1d\x15\xa5\x61\xd4\x17\xd3\x0d\x95\xd3\xd1\x01\xec\x76\x48\xb5\x6d\x27\x58\x45\x4c\x05\x11\xbb\xc2\xcb\x75\xae\x4d\x63\x65\x8d\xc0\xf3\x3c\x4c\x61\xc2\x38\x38\x2f\x57\xa4\x0d\x8f\x8f\x48\x1b\x5e\x23\x6d\x50\x90\x94\x92\xe9\xc5\x89\xe0\x1a\xee\x5b\xd9\x4f\x36\x19\x90\xae\x9b\x53\x13\x7b\xe2\x2c\xa5\xf0\xaf\x25\xa2\xb0\x81\x92\x1b\x53\xf3\xaa\xa0\x5b\x59\x72\x54\x29\x6d\x0e\x05\x68\xab\xef\xa1\xa6\x83\x51\x90\xcb\xaf\xf3\x1a\x9c\x9d\xfa\x1f\x25\x9b\xd3\xcc\xe8\xb7\xf5\x13\x97\xa8\xb3\x84\x0f\xb5\x32\x62\x3d\xb1\x8c\x85\xe2\xcd\xa5\x64\x73\x96\xc1\x14\xce\x54\x42\x33\xa4\x4a\xfd\x50\xfa\xe3\x0d\xb3\xe3\x16\x49\x91\x29\x72\x37\x03\x6c\xa3\x4a\xbd\x7a\x8e\x99\x0a\x53\xca\x38\xc9\x0d\x51\x2d\xfc\xc3\xca\xea\xf9\x86\x78\x1b\xa9\x97\xeb\x5a\x9f\x47\xf5\x75\x2c\x44\xe6\xc2\x7a\xb3\x45\x3d\xbf\x6b\x6b\xcb\xc5\x2f\x1c\xee\x7e\x31\xb3\x29\x32\xc9\xe8\xb4\x52\xe3\x15\xe8\x15\x4b\x5c\x3d\xf5\xc6\x0f\xc0\x98\xd9\x12\x08\xcd\xee\xe8\x42\xd5\x46\x8d\xb0\xe1\xef\x3b\xf2\xf6\x10\x11\x8f\x2a\x52\xcd\x91\x92\xdf\x1f\xa2\x9f\xef\xe4\xf8\xf2\x97\xeb\xbf\x5e\xff\x72\x7c\xfa\xe1\xfc\xa2\x1b\x9d\x37\xdf\x0e\x94\xb7\x9a\x23\xa1\x05\x1d\xb3\x8c\x75\x21\xef\x2b\x91\x20\xe1\xa4\xc8\x40\xd3\xf4\x28\x95\xa2\xb0\x70\xf2\xf6\xa3\x50\xc7\x39\x5d\x32\x0b\x3b\x9e\x6d\xb7\x67\xd2\x9c\x70\x2a\x29\xd7\xb5\x21\xa5\x06\xb9\x2c\xb9\x51\x7a\x5f\x78\xd0\x3c\x4d\xfb\x0b\x98\x3f\x4e\x53\x48\x1b\xd0\x7b\x75\x01\x7a\x27\xfe\xe3\x16\x75\xae\x2d\xb9\xfc\x78\x7d\xfe\xbf\x97\xd0\x70\x51\x74\x8b\x47\xea\x27\xbf\x47\xb6\xef\x40\x4e\x56\x8d\x09\xb9\x98\xc7\xfd\x7d\x2e\xfb\x5b\xf1\xaa\x7e\xbc\xe0\x57\x25\x0f\xd9\x09\x0f\xe6\x27\xb9\x48\x61\x44\x2e\x2b\x0b\x7a\xf3\x6a\x58\x43\x40\x02\x31\xb7\x70\xcd\xb0\xd5\x79\x20\xca\x68\x61\x13\x5d\x1a\x19\xa6\x21\x1d\x9e\xd0\x4c\x75\x24\xa6\x5d\x38\x93\x61\xc2\x1f\x8c\x2a\xd8\x0b\x34\xab\xd9\x48\x0a\x5c\x68\x27\x49\x9a\x55\x62\xd2\xad\x14\x09\xb1\x7a\x67\x10\xb2\xd4\xe0\x2e\xae\x01\xbe\x67\x4c\x4c\x79\x58\x5d\x56\x33\x5b\x0b\x6c\xa9\x40\xad\x67\x4c\xb5\x26\x6a\x66\x97\x40\x53\xcc\x17\x2b\xa8\x9e\xd9\x88\x83\x9c\xaa\x5b\x48\xed\x0f\x4e\xae\xa9\x4c\xf0\xb6\x19\xbe\x7b\xd5\x8d\x59\xb7\xb7\xb7\xa3\x3c\x63\xe3\x20\xd0\x4e\x0f\xad\xa3\xd3\x3b\x1f\x01\xf3\x4d\x1f\x79\xb6\xb8\x12\x42\x7f\x53\xe5\x49\xf5\xb2\x81\x3f\x3a\x49\x11\xdd\x2c\xcd\x90\x29\x0c\x10\x48\x87\x08\x4c\x44\xe9\x30\x45\xeb\xb4\xde\xb0\x27\x46\x68\x59\xf2\x63\xf5\xad\x14\x65\x6b\x0e\xb0\x22\x68\x7d\x7b\x7e\x8a\xe7\xb8\x74\x1e\x30\xae\xe5\xa2\x10\xcc\x9a\x4f\x36\xc8\xb4\xdf\x3b\x1f\x5e\x88\x91\xb5\xbb\x85\x7c\xa0\x0b\x42\x33\x25\xbc\x70\xcc\xf8\x3a\x55\x87\x38\x3d\xca\x5c\x1e\x0b\x3d\x5b\x51\xa0\x0c\x3a\xaf\x3e\x37\x08\x1c\x62\x75\xdd\x14\xc6\x57\x1e\xd7\xf4\x16\x14\x29\x24\x24\x90\x02\x4f\x3a\xee\xda\x53\xbb\x81\x70\xe7\x2f\x04\x37\xc7\xa2\x97\xbd\x3f\xaf\xfc\x7f\x68\xc6\x6a\xee\x34\x7a\x12\x9d\xde\x41\xd1\x9f\x88\x87\xa2\x54\x20\xad\xf3\x53\x96\x60\x37\xe2\xbb\x72\x0c\x19\x68\xab\x0c\x61\xfd\x00\xaa\xad\xca\xcb\x72\x3a\x05\x42\x75\x85\x28\x5a\x10\xe0\xca\x90\x1b\x6b\x38\xd3\x24\x15\x50\x27\x37\x52\x45\xbe\x3f\x3f\x25\x6f\xc8\x81\x79\xd7\x21\x6e\xff\x84\xb2\x0c\x5d\x8d\x9a\xca\xe5\x35\xb2\x89\x9f\x02\x97\x84\xb8\x47\x84\xb4\x47\x74\x40\xb8\x20\xaa\x4c\x66\x7e\x4d\x46\xe3\xf2\x0a\x9b\x8b\xb5\x43\x93\xfc\x2b\x44\xd5\xce\x04\xe6\x7b\x05\xb2\x37\xfa\xf2\x7d\x0b\xfa\x12\x8a\x10\x06\xe7\x9a\xd0\xb3\x88\x95\x83\xa6\x29\xd5\xd4\xd1\x9d\x3a\x23\xfa\x35\x6e\xe9\x53\x53\x1f\x05\xef\x19\x2f\xef\xad\x6d\xad\x3f\x25\xff\xfa\x0c\xa7\x45\x14\x40\xa0\xe1\xa6\xd1\xa2\xc8\x58\xed\x79\x0c\xa2\x9b\xce\x1b\x5b\x3d\xd8\x20\x22\xe1\x31\xf7\x0e\x4c\xc3\xd9\x29\x4f\x45\xbe\xf2\x32\xf4\x96\xd2\x64\x16\xbe\xe0\x55\x22\xcf\x93\x9b\x23\x32\x98\x43\x87\xda\x1c\x4b\x88\xf3\xde\xcc\x66\x64\x31\xbf\xa1\x38\x3d\xc9\xe8\x18\x32\xcb\x59\x2c\x02\xa9\x55\x04\x7a\xea\x08\x41\x29\xb2\xfe\xf2\x23\xae\x44\x06\x36\xe4\xc6\x03\xc2\x4c\xff\x22\xe0\x80\x93\xf4\x05\x07\x54\x64\x1a\x70\x40\x95\xec\x25\xc0\xa1\xec\xc0\x68\xc9\x32\x1c\x0c\xd7\x6e\xc2\x01\x59\xe7\x73\x87\x83\x82\x24\x11\x79\x71\x29\x85\x51\xb9\x7a\x63\x2d\x6e\xda\xda\xbf\x63\x75\x72\x34\xf8\x86\xda\x9f\xf3\xe6\x34\x6f\xa6\x32\x08\xb6\xa3\xda\xd2\x78\x1f\x71\xf7\xbf\x02\x96\x83\xa4\x67\x99\x0f\xf9\x59\x1a\x0e\x20\xf3\xa4\xbb\xf0\xc2\x53\xfd\x3b\x58\xc9\x7a\x61\x26\x22\xa1\x19\x96\x4e\xeb\x86\x31\x64\x19\x6b\x96\x27\x0e\x22\x24\xd1\xb5\x84\xbf\x79\xaf\x3d\x56\xd1\xc2\x5f\x9c\xed\x8b\x8b\x14\x02\x67\xa1\x0d\xed\xbc\xb1\x91\x74\x78\x9f\x0f\xce\x34\x5c\xdd\x39\xef\x21\x6d\x3c\xad\x85\xab\xce\xf2\xa1\x2a\xc8\x66\x16\x08\x3c\x65\x7c\x8a\x16\x9d\x01\x91\x90\xd9\xb0\x4e\x77\x86\x6f\xad\xfa\xb5\x8f\x18\xed\x27\xf5\xe8\xec\x5f\x8d\x92\x10\x13\xdc\xcd\x8c\x46\x0e\x2f\xdf\x4c\x2c\xb5\x64\x8a\xec\xbd\xf7\x00\xe8\x50\xc1\xea\x39\x32\x88\x3d\xfb\x85\xd5\x6e\x5a\x1b\xdb\x2d\xe3\xa9\x8b\x80\x6c\x00\xcb\x2b\x89\x4e\x0a\xc5\xd8\x5a\x96\x86\xa4\xe1\x1d\xf9\x1b\x27\x15\xb0\xc8\xb0\x35\x7a\x5c\x59\x81\xd5\x9b\x97\x86\x0f\x9b\xfc\xaa\x97\x2c\x4f\xf3\x3d\xc7\xbd\x37\xef\x1d\x1a\xb5\x77\xf5\x3e\xff\x2d\x7b\x4f\xb9\xaf\x77\x8c\xa7\xe2\x4e\xf5\xad\x43\xfc\x68\xa7\xf5\x02\x75\x62\xd0\x5a\x33\x3e\x55\xa1\x1e\xd1\xac\x93\xbb\x5e\x91\xf0\x3b\x3c\x91\xc2\xa6\xe1\xad\x0a\xf0\x4b\x91\xdb\x51\x09\xd8\x61\x4c\x73\x45\x4f\xa4\xf9\x14\xcd\x68\x76\x5d\xb4\x2f\x9b\x46\x96\xd1\xe0\xdb\x0f\xd7\xc7\xcd\xa9\x0d\x3d\xbb\x9b\x81\xb4\xbc\xd7\x5c\x27\x34\xcd\x99\x52\x68\x06\x82\xf1\x4c\x88\x5b\x72\xe0\x03\xad\xa6\x4c\xcf\xca\xf1\x28\x11\x79\x10\x73\x35\x54\x6c\xaa\x8e\x1c\xd2\x0e\xcd\xea\x0f\x09\xe3\x59\x15\x41\x82\x6a\x24\xd7\xca\x9b\x31\xf0\x25\x49\xb5\x0a\xdc\x5b\x57\x77\xd1\x79\x99\x57\x97\x69\x2b\x2d\x32\xc8\x9e\xbe\x18\xcc\xea\xf6\x5c\x74\xac\x6b\xf1\xc8\x16\xe1\xb7\xbb\xb4\x91\x30\xc5\x69\x2d\x1c\xad\xf4\xf6\xe4\x40\x72\xd2\x41\x02\xaa\xbf\x8a\x39\x7f\xa9\xe7\x24\x29\xd8\xcc\x06\xc0\xa8\x13\xba\x31\x0c\x09\xad\xb2\xfb\x98\x20\xe7\x1e\xdd\x0f\x25\x5a\xf4\xfa\xd8\x14\x0c\xa3\x0f\x64\xc5\x8c\x0e\xad\x92\x6c\x48\x12\xd2\x30\x2f\x03\xcc\x04\x17\xd2\xa2\xa8\xe1\x82\x82\x23\x4a\xa3\xb6\x60\x1d\x41\xb8\x27\x8e\xc6\x06\x4b\x3d\xa9\xfd\x83\xa1\x0f\x09\x13\x6c\x6c\x82\x7e\xbd\x86\x3b\xa6\x67\x58\x44\x6e\xb6\xe4\x70\xc2\x95\x48\x50\xe8\x3d\xe0\x04\xa4\x14\xd2\x05\xc2\x78\xab\x2d\xce\x84\xa4\x18\x23\x69\x0c\x92\x50\xf3\xd7\xbe\x0a\x5d\x94\x75\x29\x53\x8c\xed\x32\xd8\x04\x93\x09\x24\x28\x29\x85\x00\xb6\x64\xf7\xa0\xae\xaa\xe7\x43\xe7\xb5\xf0\xa5\x50\x73\x76\x6f\xde\x12\x3e\xb5\x54\x50\x9d\x0b\x3e\x5c\x7f\xf9\x70\x44\xc8\x39\xaf\xe2\x1e\x07\x66\x17\xc3\x3b\x7d\xc8\x8f\x36\x9f\x18\xd6\xd1\xc5\x0f\x08\xed\x4e\x46\xbc\x93\x65\x0f\x18\xdf\xc5\x18\x4c\x42\x83\x70\xaf\xe4\x00\x0d\xc3\x6e\x52\xb3\xf5\x9e\x89\x77\x31\x14\x9b\x5b\x3e\x95\xb1\xf8\x65\x70\x7a\xd2\x95\xce\xb9\x74\xf5\x58\xfb\x75\xbb\x11\x6b\xbf\x6e\x1e\xb1\xf6\x6b\xac\xfd\x1a\x6b\xbf\x3e\x3c\x62\xed\x57\x37\x9e\x3e\x3d\x93\xc4\xda\xaf\x2d\xc7\xeb\xaa\x3f\x12\x6b\xbf\xee\x34\x62\xed\xd7\xd5\x11\x6b\xbf\x6e\x18\xb1\xf6\xeb\x86\x11\x6b\xbf\xc6\xda\xaf\xb1\xf6\x6b\xac\x62\xf5\xe8\x5c\xcf\xb3\x8a\x15\x89\xb5\x5f\xdd\x88\xb5\x5f\x5f\x45\xad\x1e\x12\x6b\xbf\x6e\x35\x62\xed\xd7\x58\xfb\xb5\xcd\x88\xb5\x5f\x71\x44\xdb\x4b\xac\xfd\xea\x47\xac\xfd\x6a\xc7\x6f\x47\x6a\x8e\xb5\x5f\x63\xed\xd7\x58\xfb\x35\xd6\x7e\x7d\x70\x15\xb1\xf6\xeb\x6b\xd0\x27\x95\x4e\x59\xab\x72\x58\xdb\x54\x2f\x70\x91\x21\x41\xbe\xe3\xb8\x9c\x4c\x40\x22\xe5\xc2\x37\xaf\x44\x21\x54\x55\x8e\x2a\x5a\xe6\xe2\x0c\xb0\xaa\x99\x04\x9a\xba\x28\xe8\x0d\x8f\xbb\x04\x4b\x2c\x5b\x55\x87\xef\x9d\x7d\xfc\xa6\x9f\x52\x09\xdd\x02\xd7\x70\xcd\x1f\x79\xd2\x3d\x80\xa9\x06\xf8\xba\xa8\x7c\x07\xf7\x24\x13\xca\x85\x1d\x22\xb0\x92\x19\xe5\x1c\xbc\xf2\xc8\x34\x1a\x65\xc6\x00\x9c\x88\x02\xb8\xa5\xdf\x94\x28\xc6\xa7\x19\x10\xaa\x35\x4d\x66\x23\xf3\x26\xee\x81\x5d\x87\x08\xba\x5f\x94\x96\x40\x73\x1f\x2c\x99\x53\x66\xa7\x22\x34\x91\x42\x29\x92\x97\x99\x66\x45\x35\x19\x51\x80\x51\xce\x96\x51\x55\xc0\xc0\xf0\x92\x3a\xae\x70\x50\xbf\xcd\x2d\x4b\x84\x95\x62\x50\x75\x1d\x60\x69\xcb\xbc\xd0\x0b\x62\x3e\x39\x73\xe5\xee\xa4\xd2\x24\xc9\x18\x72\x6b\x7c\xa3\x4d\x28\xc3\xf9\x06\x9e\x57\x73\xb7\x52\xe5\x96\xca\x53\x14\x5b\x0b\xad\x08\x86\xe1\xd5\x13\xba\xa9\x52\xa6\x9c\x98\xaf\x06\x84\xfa\x3a\x28\x16\xd0\x7e\xa5\x08\x6a\xcf\x59\xec\xec\xee\xa7\x60\xba\xa0\x78\x9a\xc1\x4d\x6b\x0d\xab\x11\x1d\xe3\x4e\x3d\x72\x0e\x1a\x21\xb6\xb5\x40\x81\xe1\x2e\x2b\xc7\x00\x37\x80\xc3\xdc\xe0\x00\x24\x60\xf8\x2b\xdd\x80\xf5\x9f\x1d\xe9\x35\x95\x53\xd0\x55\x50\x6e\xdb\x58\xcd\x66\x81\x88\xa0\xca\x61\xa8\x87\xd4\x10\x43\xe0\x5c\x8a\x14\x23\xee\x5d\x15\x09\x83\x33\x6b\xca\x28\xda\x05\xba\x02\x38\xeb\x6e\xf0\x72\x91\x0d\x75\xaa\x5e\xaa\x0a\x9a\x80\x22\x07\xe7\x97\x27\x03\x72\x79\x7e\xea\xe2\x99\xc4\x64\x5d\x1a\x9f\x23\x61\x16\x01\x37\x15\x74\x64\xca\xbf\xe3\x6e\x46\x35\x6e\x67\xf0\x22\x94\x44\x67\x54\xba\x40\x45\x5f\xf9\x9a\x5c\x08\x0d\xeb\x0a\x65\x78\x6a\x80\xe2\x97\xb3\x41\x38\x4c\xb3\xe2\x4c\x7b\x02\xd8\x52\x6d\x09\xe4\xa3\x0f\xa0\x14\x9d\xc2\x65\x4b\x07\xd6\x26\xe5\x1c\x7d\x58\xf5\x19\x45\xaa\x90\xd9\xf4\xb5\xea\x97\x3a\xe2\xad\x29\x11\x93\xdc\xae\xa9\xda\xef\x3b\xc9\xb4\x06\x3c\xdf\x58\x3c\x09\x7d\xe0\xcb\x09\xaa\xfb\x4b\x71\x73\x1f\xfc\x24\xf5\xc3\x86\xbf\xf3\xd4\x46\xb1\x8d\x81\x8c\x25\x83\x09\x99\x30\x0c\x8d\xc3\x60\xb5\x81\x2d\x07\x42\xad\x71\x49\x29\x90\xb8\x1e\xa7\xd6\xf8\x75\x8d\xc8\x8f\x6e\x61\x5a\x96\xdc\x56\x40\x77\x12\x37\xa6\x70\xb1\x09\x99\x62\xb0\x9b\x53\x1c\xfe\xf8\xe6\x3f\xfe\x44\xc6\x0b\x23\xdd\x20\x6a\x6b\xa1\x69\x56\x7d\x64\x06\x7c\x6a\x60\x65\x29\x75\x33\x09\xa9\x82\x00\xd6\x28\xb7\x0b\x7f\xfb\xfb\xdb\x71\x53\xdc\x3a\x4a\x61\x7e\x14\xc0\x6f\x98\x89\xe9\x88\x9c\x50\x6e\x70\xdd\xa8\x11\x45\x8a\x96\xfc\xf6\x75\x43\xfb\x43\x33\x91\xb1\x64\xd1\x9d\xec\x38\xdd\x84\xcc\xc4\x9d\x55\xfb\xd6\x60\x4f\x1d\x0e\x5b\x88\xa2\xcc\xac\x33\xe3\x9b\x2a\x7d\xaf\x54\xb0\x9a\xa3\xb3\xf6\x5c\xa0\xf9\xdd\x4d\xb1\x74\xb4\x5d\x8c\xa3\x7f\xa5\x70\xb1\xdf\xce\x40\x5c\x95\xa7\x41\x9d\xf8\x1b\x9a\x65\x63\x9a\xdc\xde\x88\xf7\x62\xaa\x3e\xf2\x33\x29\x85\x6c\xae\x25\xa3\x86\x71\xce\x4a\x7e\x6b\xeb\x52\x57\x29\xc4\x62\x6a\xa4\xec\xa2\xd4\xbe\xd2\xe8\xba\x0f\xb6\x09\xa9\x9e\x1f\x7b\x8d\xb8\x9e\x05\xee\x59\xad\xf6\xba\x54\x0a\x8b\x91\xe1\xfc\x2a\x44\xb6\xdf\xbf\xf9\xe3\xbf\x5b\xd4\x25\x42\x92\x7f\x7f\x83\x71\xb0\x6a\x60\x0f\x31\xd2\x45\x23\x33\xe4\x34\xcb\x0c\x79\x0d\x91\xd2\x00\x7a\x1d\x12\x7e\x76\x1c\xd4\xdd\xd1\x6d\x6b\xa9\xfa\xe6\xe6\xaf\xc8\x12\x98\x56\x90\x4d\x06\x36\x6b\xa0\xd2\x70\xf7\x51\x46\xd8\x77\xd4\x07\x53\x37\x9e\x81\x2c\x3c\x17\x59\x99\xc3\x29\xcc\x59\x1f\x8d\x27\x1a\xb3\x79\xab\x4f\xc6\x14\x26\x68\x8c\x33\x91\xdc\x92\xd4\x5d\x0c\x22\x9a\x96\x4b\xac\xb6\x87\x42\xdb\xd8\xae\x0e\x31\x5d\x1b\xbf\xbf\x11\xcd\x95\xd3\xa2\x60\x7c\x6a\x93\x93\x24\xbd\x6b\x00\x03\xcf\x24\xe6\x03\x77\xac\xb7\xd0\xd9\xe3\xd0\xd5\xdf\x30\x74\x5f\x64\xe8\x66\xeb\x29\x5a\x47\x33\x75\x77\x57\xd4\xab\x6f\x6f\xa3\x6e\x20\x44\x3d\xa1\x3f\x0d\x05\xfe\xdb\x46\xea\xaf\x88\xcb\x95\xf8\x58\x21\x86\x15\x00\x0c\xfa\x20\x49\x6e\x6f\x7b\xef\xc1\xd0\xdd\x2d\x94\xad\x01\x17\x5e\x39\x18\x72\xaa\x9d\x40\xe8\x35\x08\x4a\x0a\x90\x8a\x29\xc3\x97\x7f\xc0\x03\x75\x92\x51\x96\x07\xd6\xe0\xa7\x01\x82\x3d\xdc\x58\x19\xb3\x3b\xa5\xbc\x14\xa9\x9b\x10\x49\xa1\xad\x0a\xba\x46\xac\x6d\x4a\xb5\x3d\x32\xd4\xa7\x26\x95\x3f\xd4\xd0\x6c\x52\x4a\xf3\x4b\x45\x2a\xed\x5d\xaf\x89\x40\xe2\xf7\xbd\x54\xfa\x58\x2d\xbe\x27\x32\x80\x84\xd1\x6d\x6e\x93\x12\x36\x94\x47\x7b\x50\x02\x91\xde\xe9\x81\x23\x62\xa3\x2b\xcc\x99\x70\x8f\x92\xfd\x77\xfb\x4f\x4a\x24\x2d\x88\xa4\x28\xe8\xb4\x53\x8f\x83\x25\x48\x2d\x4f\x1b\x26\x82\x1b\x35\x08\xaf\x57\x65\x89\xf0\x2e\x48\xeb\x42\x15\x58\x86\xc4\x3a\xca\x3d\x80\x9d\x82\x80\x3d\x68\xc8\x1d\x5d\x10\x2a\x45\xc9\x53\x67\x6a\xac\x6c\xbd\x1f\x96\x5e\x7c\x21\x38\x78\x1f\xca\x72\x1e\x39\x3a\x77\x18\x27\x6f\x47\x6f\xdf\xbc\x16\x4e\x85\x5f\xb8\xc4\xa9\x2e\x2a\x4e\x65\xe9\xd3\x93\x7e\xab\xaf\x86\xdc\xd3\xf7\x7e\x70\x26\x96\xba\xd8\x31\xf3\xc5\x5c\xf1\xa7\x3b\xc9\x34\x04\x9d\x8b\x0e\x50\x71\x31\xfa\x61\x90\x35\x7d\xd8\x63\x8d\xef\x7e\xd2\xd4\x55\x39\xfe\x84\x74\xcb\x11\x28\x3c\x6e\xeb\x2c\x5c\xea\x01\x12\x16\x02\x6a\x6f\x8f\x1c\xd8\x3b\xf7\x6d\x92\xe8\xe1\x93\xa2\x96\x03\xda\xd9\x7d\xd1\xa1\x06\x5d\x03\x70\x67\xf7\x05\x45\x1b\x5c\xd1\x23\x04\xff\x0b\x66\x74\x0e\x98\x1c\xcb\x32\x2a\x33\x74\x3f\x5f\xdb\xb5\x93\x71\xa9\x09\xf0\x39\x93\x82\x63\xac\xd7\x9c\x4a\x86\x55\x2b\x24\x4c\x40\x02\x37\xba\xe8\x97\x07\x3f\x1c\x5f\x61\x6c\xcb\xa1\xad\x65\xef\x57\x59\x2a\x5f\x5e\x22\x5c\x49\x30\xdd\xa3\xdb\xe7\xd7\x61\x60\x88\x34\xd7\xaf\xcb\xbc\x27\x2f\x75\x69\x0b\xe6\xdf\x27\x59\xa9\xd8\xfc\xa9\x28\x89\xcb\x5a\x3e\x65\xad\xf6\x79\x29\x83\xba\x06\xd4\x4a\x32\x74\x6d\x83\x7f\xa4\x42\xeb\xbe\xaa\x6a\x5a\x85\xe1\x10\xce\xf4\x44\x72\x36\x9d\x69\x17\x96\xe9\x4b\x9a\xad\x88\x10\x58\xd7\xe1\x69\x8d\x50\x86\xed\x1e\x67\x8c\xaa\x5d\x45\xae\x95\x8c\x43\x37\x0b\x06\x51\x70\x57\x88\x8a\x66\x95\x6d\xc5\xbc\xc8\x1a\x1c\xcf\x2f\x9d\x77\xca\xc3\x8d\xf1\xff\xb1\x41\x2b\x95\x76\x61\x83\x50\xec\x23\xd6\x6a\x38\x09\x6b\x06\xf8\x60\x0d\x24\xfe\x58\x65\x05\xad\x5a\x5c\xf0\xe1\x2c\x28\x48\x52\x88\x74\xc7\x6c\xbc\xb6\x8a\x47\x2b\x95\x63\x3d\x04\xc9\x4c\x64\xa9\xef\xcb\x69\x4d\x32\x63\xd0\x77\x00\x9c\x9c\x5f\x22\xfc\xcc\x27\xa2\xb7\x67\x03\x14\xad\x77\x00\x4b\x8f\x04\x1a\x69\x03\x9e\xbb\x22\x58\x07\xad\xa4\x8b\x48\x5f\x7d\x69\xe7\x33\xff\x97\x0a\x66\xde\x23\x46\xc7\x62\x0e\x08\xd2\x34\x95\xa0\x3a\x94\xee\x78\x02\x3d\xb5\x13\x29\x65\xad\xfa\x2e\x34\xfd\x1b\x15\xd8\xbc\x85\x08\xc5\x77\x3c\xaa\x88\x78\x9f\x99\x82\x9d\x5f\x9e\x74\xa0\x5e\xfb\xdf\x3b\xf7\x86\x99\x6a\x7f\x5f\x11\x56\x24\xb5\x3f\x75\x44\x6a\xaf\x61\x90\xd1\x60\x25\xc6\xdd\x5c\x56\x6d\xc5\xc4\x80\xa8\x75\x24\xd2\x84\xdb\x69\x0c\x59\x71\xd9\xcc\x95\x97\x98\x29\xeb\x26\x6e\x40\x43\xf9\x27\x42\x80\xf8\x40\x04\x4b\xe4\x5d\x58\xc6\xa0\x0a\xf0\x5d\x22\x4c\x68\x41\xf7\xa1\x7d\x01\x15\x5f\x01\xe6\x67\x83\xe5\xe5\xf9\x69\x9f\xe8\x52\xb0\xf4\xd9\xa1\xcb\xee\xfa\x65\x33\x77\xad\x59\xf2\xc1\x4d\xe8\x0f\xfb\xa5\x48\x37\x88\x49\x35\xa3\xc1\xfb\xc3\xee\x82\x5a\x10\x4a\xac\x99\x70\xa9\x6f\x6c\x0b\xa0\xec\x4c\x25\x50\xd4\xba\x2c\xb3\xec\x1a\x12\x09\xbb\x9a\x47\x9b\xfb\x7f\xbe\x34\xd7\x26\x91\x27\x90\xdf\xb1\x8e\x80\xbb\x99\xd7\x05\xde\x2a\xac\x09\xb3\x04\x8b\x32\xc3\x38\x53\xca\x17\x1e\xe0\xb8\x7a\x15\xf8\xa2\x98\xf2\x31\x2b\x36\x44\xaa\xb1\x0b\x0a\xaa\x97\x55\xdd\x42\xa8\x52\xd6\x63\xca\x78\xca\xe6\x2c\x2d\x69\x86\x2f\x42\x29\x34\xec\xe9\x5b\x71\xc8\xdc\x17\x2c\x24\xdf\x08\x49\xe0\x9e\x9a\xdb\x06\x95\x10\x4b\x15\xa2\x43\x2a\x92\x5b\x90\x03\x2b\x8a\x9d\xe2\x1f\x27\x28\xf1\xda\x92\xbc\x7e\x1d\x46\x97\x70\x65\xfa\xda\xb4\x09\xf6\x7d\x80\x2d\x1c\xbe\xb0\x9f\xbb\x60\x7c\x3a\xc4\x5f\xcc\x87\xb8\x37\x0d\x05\x1f\xd2\xa1\x41\xc3\x17\x22\xf8\x61\x0d\xde\x8f\x28\x59\x5d\x79\x7c\xf1\x2a\x82\x51\xe4\x44\x39\x9d\x21\xb0\x64\x4e\x7d\x59\xac\x0c\x34\x56\x3c\x72\x7e\x5d\x5b\x9a\xc2\x3d\x9b\x3a\x31\x2d\xac\x00\xd5\xc4\xb5\x17\x22\xfc\xb5\xb5\x90\x2d\x45\x0a\x07\x64\xcb\xc1\x48\xef\x8c\x81\x62\x0e\x72\xce\xe0\xee\xc8\xb1\xce\xe1\x1d\xd3\xb3\xa1\x85\x88\x3a\x42\xc0\x1e\x7d\x61\xc5\x4b\x9b\xb8\x75\x9c\xa6\xce\x6c\x59\x2a\x98\x94\x99\xeb\x97\x3b\x22\xb4\x60\x3f\x80\x54\x58\x57\xf1\x96\xf1\x74\x40\x4a\x96\x7e\xfd\x19\x03\x5f\x18\x67\x75\x88\x5d\x27\x2a\xf8\xde\x51\x39\x97\x2f\xcc\xfe\x59\xb7\xb4\x75\xc1\x41\x63\xc8\x04\x9f\x06\xd9\xce\x28\x5e\x9c\x73\xa6\x57\x5a\xf3\xd9\xaa\x65\xa8\x22\x0b\x99\x62\x20\x23\x13\xb2\x61\x0f\x36\xf3\x61\x2d\xa7\x20\x1c\xd2\x90\x48\xd6\x98\x0f\xc3\x59\x54\xc5\x8c\x88\x0d\x88\xf0\x89\x91\xbe\x42\xa6\xaf\x11\x65\x4b\x96\xcd\x28\x4f\xf1\xcf\x24\x11\x32\x75\xeb\x65\xba\x8a\xbd\xb4\x41\x41\x36\x12\x05\xd9\x1a\x76\x57\xe7\xcb\x6f\x46\x0d\x54\xe6\x8d\x40\x3d\x2f\xf6\x94\x9c\xfd\xa3\x04\x42\x73\x61\x08\xfb\x72\x21\xe7\x25\x88\xe4\x74\x81\xbc\x15\x97\xfa\xbe\xca\xf4\xb3\xc9\x84\x6a\x40\xae\x80\xa6\x2c\x48\x88\x1e\x90\xf7\xcd\x0c\xe9\x81\x59\xcb\xb5\x4d\xdd\x74\x3f\xd9\xd5\xfb\xe6\xea\x57\xd6\x49\x94\xfb\xb8\xa2\xd5\x8f\x31\xbb\xa2\xe9\x2d\x70\xab\x94\x1b\xd0\xa0\x1f\xac\x94\xb8\x07\xc9\x0c\xd2\x12\xb9\xd4\x78\x41\x26\xcc\x56\x77\x47\x51\x81\x4d\x67\xa0\xb4\x17\x2e\x8f\x30\x56\xa7\x6e\x53\xe3\x17\x80\xe8\x1b\x44\xda\xd6\x66\xac\x9c\x62\xe9\x52\xe1\x3a\xd3\xbb\x64\x12\xab\xb3\xa9\x32\xf7\x67\x79\x19\xd2\x6a\xe4\x7b\xda\x9b\x95\x07\x55\xb3\xd9\x12\x70\xd1\x49\xe7\xec\x70\x64\x42\xd5\x0c\x6b\xca\x2f\x6f\x41\x62\x4d\x32\x49\x29\x0d\xc1\xb0\x65\x66\x29\x36\x91\xc5\x8e\x85\xd8\x6f\x74\x9d\xe1\xa6\x63\xf2\x80\x59\x6c\xfb\xbe\xf7\x4f\xc7\xc4\x8e\xab\x60\x70\x03\xf8\x64\x89\x12\xd8\x9d\x34\x0c\xcb\xd7\x96\xf2\x6d\xc8\x71\x33\x0c\x55\xf8\x7c\x2c\xa9\xbd\x7f\xb4\x95\x5f\xb3\x0b\x07\xa4\x72\xda\xdd\xf2\xb1\x7f\x2c\xa7\xa5\x3d\xe8\x8e\x0a\xd7\x45\x69\x5d\x2b\x4f\x94\xda\xac\x8c\x69\xd4\x99\x93\x0f\xa7\x61\x0a\x52\x98\x5b\xe1\x13\xb8\x46\xe4\x87\xae\x46\xea\x65\x2b\xb5\xa1\xe6\xb5\xe9\x3b\xa9\x4e\x96\xa1\x18\xd9\xdc\xeb\x17\xd5\xdb\xbc\x1c\xca\x78\x51\x6a\xc7\x06\x6b\x8d\x93\x27\x33\xca\xa7\xa8\x64\x8a\xd2\xcc\xf7\xe5\x97\xb8\x22\x09\x69\x99\xb8\x6a\xfa\x1e\x65\xbf\xf4\x26\x5b\x57\xcf\x0b\x69\x95\x4a\x68\xe1\xd7\x1c\x7e\x96\x5a\x70\x4d\xef\xdf\x11\x36\x82\x11\xd9\xfb\x32\xb8\xb4\x67\xdf\x5e\x48\x61\x5e\xe1\x52\x1f\x70\x55\x19\xd3\x18\xbe\xbd\x17\xde\x3d\x22\x67\xe6\x1d\xe8\xc6\xaa\x00\x18\x44\xe7\x8f\x6b\xf0\x0d\x88\x84\x29\x95\x69\xe6\xcc\x2d\x77\x41\x4a\x47\x05\x30\xb8\x67\x4a\x2b\xcb\x83\x74\x07\xca\xa4\xa9\xba\x35\x74\xc8\x9c\xac\x61\x4a\x35\x1d\x06\x47\xfa\xc8\xea\x6d\x43\x57\xee\x73\x48\x1d\x6a\xd5\x24\xeb\xe8\x0b\x97\x19\x39\xa4\xd5\x5d\xcc\x48\xe4\x58\x78\xb3\xbd\x9c\xf3\xd2\x6c\x6c\x1d\xaa\xbe\x36\x4f\xef\x59\x5d\x41\x1a\x61\x80\x51\xfc\xb5\xbc\x54\x11\x51\x57\xd8\x74\xdd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\xbd\xde\xb4\xce\xe5\xbb\x5c\x70\x32\x48\x0d\x7a\x45\x81\x75\x67\x7c\xfe\x03\x95\x75\x1b\x7b\xe7\xaf\x5a\xe3\x01\xf7\x7d\xee\x91\xc4\x9d\xbc\xf8\xc8\xba\x27\x8c\x8b\xeb\x31\xde\x28\x34\xa9\xac\xdb\xb5\xb0\xf7\xd7\xc9\x2f\xe7\xa7\x67\x17\x37\xe7\xdf\x9c\x9f\x5d\x3d\x69\xa0\x48\xc7\x82\x8f\x4d\xa6\xdc\x92\x4b\x16\x12\xe6\x4c\x94\x2a\x5b\x54\x3d\xb6\xd6\x13\x81\xd5\x58\x43\x9e\xa2\xad\x43\x81\xc4\xa8\xeb\xb5\x8f\x45\x66\xdb\x2f\xb3\x6d\xc6\xcd\x74\x28\xcf\xd3\x17\xfa\x7e\x23\x45\xde\x13\x0a\x5f\x5b\x2b\x8c\x77\x86\xaf\xc3\xa7\x7d\x57\xc9\xa3\xc1\x7a\x9c\xf0\x58\x97\x0d\x31\xc2\x68\x5e\xe8\x0e\xc5\xf0\x7b\x29\xf1\xdb\x4f\x35\x5c\x1b\xab\xf3\x81\x16\xdf\xc1\xe2\x0a\x3a\x56\x01\x6a\xc2\x1b\x32\x48\x0c\xa3\x23\xb7\xb0\xb0\x81\x99\x27\xfe\x65\x5d\xaa\x15\xfd\x7f\xec\xfd\x0f\x77\xe3\x36\x92\x37\x0a\x7f\x15\x1c\xcf\x9e\xd7\x76\x22\xc9\xdd\x49\x66\x26\xdb\x4f\xde\xe4\x38\xb6\x3b\xe3\x27\xdd\x6e\xaf\xed\x4e\xee\xdc\x74\x76\x06\x22\x21\x09\x63\x12\x60\x00\x50\x6e\xcd\x66\xbf\xfb\x3d\xa8\x02\x40\x50\x92\x6d\x99\xa4\x5b\xb2\x23\xce\x39\xd3\xb1\x44\x81\x60\xa1\x50\xa8\xbf\xbf\xda\x48\x84\xe4\x6b\xd6\x06\xbd\xba\x4b\x68\xe3\x6b\xd6\x22\xe9\xd4\x5f\x0b\x20\xbf\x76\x09\x41\x4f\xb3\x6b\xda\x6e\xf5\x48\xb7\xb0\xc6\x8f\x00\xe5\xfc\x7c\x23\x28\xf5\xab\xc3\x55\xf0\x81\xe0\x8e\x57\x02\x63\xf2\xb3\xda\xd9\x15\x84\x08\xc1\xaa\x4e\xe0\x4d\x1f\x74\x70\x4a\x46\x47\xa4\x69\xdb\x84\x8b\xe0\x12\x76\x2b\x57\x77\x2b\xc1\x8a\x39\xfe\x01\x67\x2e\x7d\xe5\xa1\x0c\x74\xe8\x9c\x35\xb0\x1c\xd6\xab\xff\x09\x21\xd1\x1e\xf9\x67\xf8\x10\x7a\x4d\xeb\x5f\x76\x77\xbf\xf9\xf1\xe4\xef\xdf\xee\xee\xfe\xfa\xcf\xf8\x5b\x38\x0a\x31\x50\x5e\xbf\x05\x70\x9d\x84\x4c\xd9\x19\x3c\x03\xfe\x74\xea\xda\x21\x06\x4f\xdc\x17\x50\x91\x3d\xc0\xac\xa5\xf0\x67\x21\xd3\xf9\xbf\x74\x2b\x40\xc0\x8d\x3c\x18\x60\x89\x5a\x54\x16\xe1\xd5\xdd\xf1\x50\xc9\x92\x8e\xb7\xaa\x1b\xd5\x73\x23\x00\x4b\x23\x24\xd9\x6b\x4f\x02\xe8\xee\xe9\xa1\x1f\x04\xd4\xcb\x5b\xcd\xb4\x8e\x0e\xb9\x33\x7d\xd9\xaa\x8f\x31\x5e\x1d\x8a\xb6\xb0\x82\x1d\x13\x0c\x28\xe2\x1b\x86\xc1\x46\x0e\x07\x6c\x48\x98\x09\xdd\xe7\x0e\xcf\x4f\xc9\x14\x29\xbc\x31\xc4\xf1\x81\xcd\xd7\x8f\x2a\xe3\x42\xf8\x74\xbe\x2e\xf7\x15\x26\xe0\xf8\xef\x1d\x46\x82\x0e\x08\x76\xcc\x1a\x36\x7b\xf8\xe1\x20\x29\xca\x9e\xbb\x61\x90\xb3\x5c\xaa\x59\xf8\x33\x80\xcd\xf4\xb5\x91\x8a\x8e\xa1\xa6\x06\x7f\x8e\x3f\x0b\x7f\xe1\x0f\x6b\x0f\x58\xfc\x35\x9a\xc2\x55\x14\x35\x00\xdc\x3e\x3f\xd9\xe6\x49\xbf\x21\xa2\x2d\x69\x0b\xa3\x54\xbf\xea\x0c\x19\x3c\x71\xa8\x70\x06\x2a\x82\x3d\xe9\x6a\x86\x7b\x55\x3e\x1c\x78\x03\xc4\xd4\x5a\x96\x8d\x01\xf0\xaa\xab\x43\x69\x96\xf2\x29\xd7\xb2\x45\xe5\x50\x18\xe8\xf6\xdc\x49\x07\x5b\x82\xf9\x5b\xc1\x6d\xf6\xb1\x00\xcc\xaf\xb0\x5f\xe7\xc4\xfe\xcb\x36\x4d\xce\xf1\x2a\xa8\x31\x4c\x89\x57\xe4\xbf\xf7\x3e\x7c\xfe\x7b\x7f\xff\xbb\xbd\xbd\x5f\x5e\xf4\xff\xf3\xd7\xcf\xf7\x3e\x0c\xe0\x3f\x3e\xdb\xff\x6e\xff\x77\xff\xc7\xe7\xfb\xfb\x7b\x7b\xbf\xfc\xf8\xf6\x87\xab\xf3\x93\x5f\xf9\xfe\xef\xbf\x88\x32\xbf\xc6\xbf\x7e\xdf\xfb\x85\x9d\xfc\xba\xe2\x20\xfb\xfb\xdf\xfd\x47\xeb\xa9\x77\x00\xc1\x8b\x57\x97\x40\xbc\xf5\x11\x3b\x61\xbf\x47\x6c\x65\x81\x97\x67\xaf\xae\xf7\xff\x85\x97\x9a\x51\x3e\x8f\x3f\xae\x37\x66\x83\x63\x42\xe8\xa7\xf0\xe4\xe0\x93\xea\xb5\x36\xc1\xb4\x78\x6e\xe7\xdc\x1f\xc1\xb9\xe3\xd5\x76\x5c\xd7\x4a\x13\x1d\x29\x99\xfb\x8a\x7e\x08\x6f\x60\xed\x99\xbb\xef\x9a\xb5\x6a\x09\x8a\xd7\xd6\x19\xb4\x75\x06\xdd\x72\xdd\xeb\x0c\xc2\x72\x84\xcd\xf5\x04\x31\x31\x6d\x1a\xc2\x58\x1a\x41\xf7\xb6\x4e\x0c\x7f\xb7\x5a\x40\x6d\xe0\xb7\xba\x0e\x91\xb8\x2a\x93\x06\x0f\xb4\x7c\x79\x0c\x13\x1a\xf8\x73\x81\x1b\x1f\x06\x08\xa0\x9f\xcc\xf5\xee\x70\xf5\x97\x53\x3b\x85\x80\xf4\x5e\xc3\xee\x84\xac\x62\x2e\xc6\x0e\xc9\x02\x8f\x12\x17\x7d\xe2\xa2\x42\xc3\x0d\xca\x61\x05\xa1\x4e\xb5\x96\x09\x34\x3e\x42\x9c\xbc\x80\xca\xe7\xa6\x0d\xb3\x31\xf4\x9a\xc5\xad\xd8\x11\x5e\xbd\x7a\xd7\xe1\x0c\x50\x5f\xc5\xd4\x43\xcc\xa7\x25\x26\x83\xa0\xf8\x5b\x3e\xc6\xf3\x4a\x40\xb0\x8c\xe8\x82\x60\x51\x1e\x02\x48\xfd\x60\x61\x53\x48\xc5\x90\xa3\xca\xcb\xda\xac\x99\x65\xeb\x53\xbc\xfd\x99\x19\x22\x5b\xad\x94\xa1\x85\xc3\xb2\x72\x3f\xd7\x0f\xc9\xe7\x10\x0c\x6c\x7f\x7c\xfe\xe1\x8e\xce\x8e\x8e\xcd\x6e\x8e\xcc\x07\xc4\x4e\xba\x3c\x26\xbb\x08\x96\x14\x8a\x8d\xf8\xc7\x8e\xf6\xe9\x61\x54\x99\xc8\x53\x26\x0c\x1f\x71\xec\xd7\x5b\x28\x56\x30\x81\x3d\xf3\x69\x32\x01\xd9\xef\x4e\xca\x2a\x38\xbd\x89\xc9\x3c\xa8\x70\x77\x2b\xca\x2e\x97\x29\xfb\x5b\x39\x46\xb6\x72\xac\xf1\xf5\x89\xe4\x98\xe3\xdc\xcd\x11\x62\x90\x79\xde\x3e\xf5\xfd\x38\xca\x63\x07\x2e\x6e\x5f\x39\x3c\x87\x06\x17\xe4\xa2\x91\x98\xb9\x86\xe5\x6b\x8a\x64\x6c\xca\x32\xa7\x34\x91\x9c\x0a\x3a\xc6\x36\x7c\x46\x06\xd0\x1f\xa9\x42\x8b\xa3\x79\x44\x1f\x50\xe2\x7d\x65\x17\x7c\xa9\x64\x96\x31\xa5\x49\xc6\xaf\x19\x39\x66\x45\x26\x67\xb9\x4b\x7c\x4d\xc9\xa5\xa1\xc6\xb2\xf4\x25\x33\xcd\x62\xbe\xed\xd0\x40\x7c\x31\x7b\x47\xd0\xe7\x58\x1d\x0f\xb5\xe5\xa4\x70\x85\x93\xef\x04\x48\x8c\x43\xe8\xb6\xd2\x23\x67\x6c\xca\x54\x8f\x9c\x8e\xce\xa4\x39\x47\xd5\xbb\x9e\x6d\x87\x37\x12\x3e\x22\xaf\xac\x51\xa7\x0d\x31\xd8\xf1\x22\xaa\x73\x97\xaa\x36\x40\x85\xf7\xd6\x45\x59\xde\x62\xc9\x39\x8c\x14\x0a\xce\x1b\x85\x31\x5a\x2d\x53\x68\x29\xd4\x7a\x81\x0e\xb1\x8c\xb4\x42\xf2\x8d\xf8\x1b\xe1\x19\x3c\x82\x19\x98\x80\x5c\x10\xc5\x74\x21\x85\x66\x75\x78\xc6\xaa\x05\x25\x98\xba\xba\x53\x0b\xb1\xf1\xc9\xd9\xf6\xcc\x2c\xa4\x36\x50\x39\xdb\x4d\xa3\xaa\x73\x3f\x1c\x14\x22\xd3\x2c\x63\x69\xad\x53\x19\x76\xd8\xa1\x75\xf7\x40\x02\xcd\x19\x7c\xc3\x17\xe6\xea\x93\x6b\xa5\xcd\xb5\xfb\x43\xd7\x3b\xdf\x57\xc6\xf7\x4f\xbe\xad\xa0\xb9\xda\x98\x70\x88\x44\x0c\xb0\x80\xf7\x0c\x28\xe0\x3a\x6a\x4e\x33\x91\xf2\x9a\x24\x32\x2f\x32\xd8\x3a\x2d\x76\x56\xd5\x1b\x2b\xb0\x52\x1f\xfa\xa1\x1e\x44\x6d\xb3\xe0\x83\x35\xf6\x37\xed\x42\x07\x63\x1f\x59\xd2\x59\x5f\x4d\x2b\x4b\xed\x2a\x43\xbc\x5f\x8a\xa0\x8a\x8d\xa4\x3d\xc0\xa0\x38\x3b\xe0\x0f\x46\x60\x3b\x27\x1f\x59\x12\xf5\xa6\x05\x04\xac\xc4\xe3\x49\xd8\x8d\xde\xbe\xe7\x78\xeb\x30\x45\x57\xa1\x81\x16\xc5\x77\xf1\x35\x07\x1a\x08\x63\x7a\x8c\x74\xf7\x08\x68\x37\x01\xf6\x13\x16\xe4\xc5\xa0\x1b\x81\x87\x71\xc7\x2e\x20\x0d\x86\xe4\x6b\x3f\x16\x74\xf5\x91\xd2\x90\xbd\xdd\x83\xdd\xfd\x05\x9f\xe5\x1c\xd0\xf6\x55\xf4\x4b\x0e\xc8\x92\x05\xc0\x34\xb2\x64\x37\xed\x11\x6e\x7c\x76\x36\xf6\x09\x82\x59\xb9\x2a\xc1\x1e\xd1\x92\x18\x45\x53\xee\xb4\x1f\xf8\xd4\xde\x64\x54\xe9\x0e\x87\xbd\xdd\xdf\x77\x5d\x9b\xa2\x1b\x29\x76\x0d\x4c\x7f\x40\xae\x10\xa5\x26\x0c\x34\x93\x25\x34\xdf\x44\x12\x14\x19\x4f\xb8\xc9\x66\x20\xe8\x88\x2c\xb1\x53\x97\x3d\x66\x5c\x75\xe2\xc9\x47\x6e\x7c\x4b\x12\x39\x22\x2f\xb0\x51\x18\xa3\xce\x6b\x9a\xf1\x29\x3b\x98\x30\x9a\x99\x09\x26\x96\x08\x29\xfa\xd8\xeb\xd1\x4a\x20\xf7\x4d\xdb\x18\x4b\x3b\x17\x64\x7c\xb5\x70\x47\x2e\x4e\xa8\xa5\xb5\x61\x65\xef\x0f\xcd\xbb\x59\x93\x05\xb0\xb0\xab\xab\xf3\x1f\x6a\xed\xac\x41\xf8\x1b\x53\xf8\x74\x9f\xa8\xe9\xfb\x06\xc8\x8e\x6e\x02\x9c\xad\x7a\x51\x93\x0e\x45\x58\xdb\x9e\xd4\x64\x39\xf8\xdb\xea\xcd\xa8\xc9\xdf\x65\x09\xd0\x21\x74\x98\xcd\x02\x6e\x83\x66\x86\xec\xd8\xa1\x76\xac\x78\xb2\xdc\xf0\x37\x46\x53\x84\xd5\xd0\x86\xd1\x46\x1a\x5f\x7c\x75\x16\x78\x8b\xe6\xd6\xed\x39\x50\x6a\x23\x73\x32\x71\xaf\x5d\x2f\xd7\x74\x3b\x63\x00\xbb\xc7\xd7\x42\x29\x56\xa0\x84\x73\xbf\x79\x76\xf2\x6b\x41\x6e\x20\xdd\x6b\x3d\x13\x92\x98\x6c\x71\x67\x1d\x2e\x90\x58\x88\x52\xd3\x91\x2c\xed\x20\x61\x82\x74\x98\x34\x41\xda\x15\x7f\xce\x0f\x04\x81\xc0\xf6\xf9\x61\x9d\xe5\x61\x90\xce\x72\x0d\xc8\x32\xc7\xac\xe3\x19\x74\xda\x74\x44\xc4\x4e\x23\xfc\xa4\x7d\x79\x69\x7c\xdd\x4d\x80\x6e\x16\x9f\x74\x49\x81\xa2\x83\x74\xf0\xc5\x64\x70\x04\x9d\x82\x72\x4d\x14\xae\x20\x26\x34\x53\xd3\xa6\x05\xe0\xd5\xd5\xdd\xab\xcb\xe6\x8e\x02\x7f\x2d\xa9\xad\x56\x44\x84\x06\xd7\x1e\x54\x75\x91\x20\x51\x36\x83\xeb\x87\xed\x5d\xc0\xfe\x38\xa2\x62\xcc\xc8\x4b\xfb\xcb\xbf\xfc\xf9\xcf\x5f\xfe\x79\x80\xc3\x87\xcc\x06\x41\x4e\x0f\xcf\x0e\xff\x71\xf9\xd3\x11\x14\xd4\xb6\xa5\x6a\x47\x69\x9b\x5d\x27\x6d\x76\x9a\xb2\xf9\xa8\x09\x9b\x50\x26\xd2\x5a\x8a\xd4\xe3\x05\x30\x64\x8c\x2e\xea\x74\xbf\x08\x95\xcf\xea\x9a\x75\xff\xab\xdd\x6a\x1b\xb1\xc7\x4c\x52\x5c\xca\xe4\xba\x43\xbb\x66\xf7\xea\xe8\x1c\x87\x8c\x4c\x1b\x2a\xbc\x33\x84\x8b\xa9\xcc\xa6\x80\xbe\x4a\xae\x8e\xce\x61\xe7\x0d\xe0\xbf\xc0\x11\x05\x16\xf5\x8c\x99\xaa\x90\xc1\x85\xa7\x02\x86\x2a\x14\x69\xd0\x8c\x6b\xc3\x13\xf8\x5d\xe5\x26\xb5\x23\xb4\x89\x4b\x6d\x2d\xa5\x65\x57\xe7\x96\x52\xd4\x24\xf8\xa1\x46\x53\xdb\xc4\xc3\x0d\x3e\x97\xdc\x79\xa4\x6a\x5d\xb4\xb7\xe7\x52\x07\xe3\x6d\xee\xb9\x54\x28\x76\x69\x64\xa3\x6e\x01\x64\x31\x12\x82\x83\xdd\x12\x07\x19\xb2\x91\x54\x6c\x3e\x10\x12\x05\x36\xd2\x12\x36\x21\x15\x50\xfd\xe7\x5d\x50\xb2\x16\xbc\xc0\x94\x4b\xdf\x21\x3b\x73\x98\xa8\x07\x3a\x06\x42\xf5\xed\x8e\x7b\xf6\xed\x58\x0e\xb3\xeb\x55\x65\x0c\xae\xd9\x32\x7c\xc8\x4c\x82\x6e\x56\x1f\x7f\x71\x1e\x55\x3f\xfd\xf9\x50\x49\xa2\xa8\x9e\x60\x23\x62\xf6\x91\x9b\x00\xb9\x4a\xb5\x14\xe8\xec\x8d\x7a\x22\x73\x1d\x61\x72\x47\x41\x1e\xfc\xd1\xb9\x4c\xe7\x7b\x8e\x8f\x15\x4d\x18\x29\x98\xe2\x32\x25\x50\x4f\x9c\xca\x1b\x41\x86\x6c\xcc\x85\xf6\xf4\x03\x70\x76\x47\x68\x7b\xdc\x30\xf0\x0d\x7b\xb4\xb8\x01\xb9\xa8\x81\xa0\xb8\xf2\xa4\x44\x56\x3b\xda\xcd\x62\x3e\xc8\x04\x19\xa1\x40\x5e\xec\x06\x14\x16\x26\x6e\x90\x74\xcf\xa4\x3b\x88\x36\x61\x0f\x2f\xff\xdd\xad\xd4\xe1\xda\x52\x3d\x99\xb4\x0b\xfc\x6e\xc3\x53\x2b\x5e\xdb\xf0\xd4\xc3\xae\x6d\x78\x6a\x1b\x9e\xba\xfd\xda\x38\xf7\xee\x36\x3c\xb5\x35\xba\xe6\xaf\x6d\x78\x6a\x1b\x9e\xba\xe5\xda\x38\xf9\xb5\x0d\x4f\xad\x70\x6d\xc3\x53\x2b\x5e\xdb\xf0\xd4\x36\x3c\xb5\x0d\x4f\x6d\xc3\x53\x7f\x20\x37\xa0\xbf\xb6\xe1\xa9\x85\x41\xb6\xe1\xa9\x88\x18\x5b\x4b\x69\xc9\xb5\x0d\x4f\x2d\xb9\xb6\xe1\xa9\xe8\xda\x9e\x4b\x0d\xce\x25\x1f\xdc\x39\xb7\x76\x59\xfb\x9a\xb5\x73\x08\x1c\xf0\xc4\xc5\x88\xe4\xa8\x56\xe7\x84\x8f\x1a\x54\x0d\x28\x22\xcc\x0f\x5f\x6a\xe3\xa2\x41\x55\x8c\x69\x69\x3d\x54\xcb\xf6\x70\x85\x4c\xab\x60\x44\x14\x85\x40\xeb\xb4\x79\x4d\xda\xda\xaa\xad\xda\x84\x1e\x36\x3a\xec\xb0\x21\xa1\x9d\x0e\x42\x0d\xdb\x30\xc3\xb3\x0b\x33\x74\xe3\xa2\xeb\xc0\x3d\xd7\xfa\x84\x71\xc1\xfc\xab\x89\x62\x7a\x22\xb3\xc6\x8c\x5e\x63\xf2\xb7\x5c\xf0\xbc\xcc\xa1\x6f\xac\xe5\x67\x3e\x0d\x59\x03\xa1\x39\xb6\x13\xf4\xe8\x29\x8c\x1a\xcc\xfa\xc6\xb2\x50\xd6\x39\xa1\xa0\xaa\xeb\x32\x49\x18\x4b\xa3\x96\xf7\xa0\x98\x7d\x39\x08\x4f\x0a\xed\x34\x5e\xb6\x93\x37\xed\xce\x7e\x84\x28\x85\x51\xbe\xfc\xa2\xd1\x18\x2d\xa3\x3c\x9f\x3e\xc2\xd3\x81\x98\x6e\x6f\xaf\xb4\xb2\x55\xba\x38\x25\xda\xda\x28\x4f\x2d\x92\xd3\x59\x44\xb3\x83\x08\xce\x06\x45\x6f\x36\xe6\x58\xd8\x94\x88\xcd\x06\xa2\xaf\x76\x10\x60\xe8\x22\x42\xd3\x5d\x74\xe6\x11\x40\x4a\x1f\x27\x2a\xd3\xa1\x35\xdc\x51\x34\xe6\x53\x44\x62\x3a\x79\xeb\xb6\x11\x98\x4f\x17\x7d\xe9\xe6\x75\x5b\x7a\xb7\x9e\x45\xc4\xa5\x03\xaf\x56\x97\x1e\xad\xce\xbc\x59\x8f\x16\x61\x69\x1f\x5d\xd9\x80\xc8\x4a\x6b\x22\x73\xc1\x0d\xa7\xd9\x31\xcb\xe8\xec\x92\x25\x52\xa4\x8d\x4f\x98\x39\xd4\xba\xb0\x7f\x34\x0e\xeb\x6c\xb4\x7a\xfe\xf1\x84\x3a\x70\x5e\x96\xfa\x94\x6a\xef\xfe\x73\x0a\x05\x34\x34\xc1\x59\x6e\xa4\x43\x8f\x6c\x8c\x31\x88\xc9\xd8\x5d\x2e\xe2\xdf\xe4\x0d\x91\x23\xc3\x04\xd9\xe3\xc2\xaf\xe3\x7e\x64\x06\x56\x96\x79\x60\x6b\xfb\xed\xcb\x17\xfe\xe6\xe7\x67\x72\x83\x73\x41\xeb\xc7\xf7\x80\xb8\x07\xdd\xef\x02\x71\x37\x8e\xca\xac\xee\x06\x41\xd7\x48\x5d\xde\xbc\xac\xe0\x45\x5f\xc2\xb8\x61\xb7\x51\x91\x12\x57\xb8\xf1\xfc\x16\xad\x75\xdc\xf8\x39\xc4\x8c\xb7\xbe\x17\xd2\xb5\xef\x65\x4d\xb1\xe1\x0d\xd4\x9a\x9f\x68\x3c\x78\xab\x35\x3f\xe0\x8a\xea\xbf\x7e\x50\x34\x61\xe7\x9d\x2b\x1c\x7e\x3b\x91\xb4\x54\xae\x6c\x2f\xe8\x1d\x61\xf3\x08\xc6\x52\xdc\x4d\xa1\x28\x0e\xaa\xd1\x46\x65\x96\xcd\x48\x59\x48\x51\xaf\x3c\xc4\xa0\xd5\x7c\xc1\x9a\x1d\x6d\xd9\x53\x2a\x2d\xb5\x50\xd2\x1d\xc0\xaa\x14\xc2\xca\xf3\xaa\xe1\x10\x68\xa5\x1a\x65\x75\x5c\x16\xa7\xf9\xd8\x4e\xdf\x1e\xa6\x50\x31\xc7\x73\x56\xb5\xa4\xa8\x06\xb4\xbf\x1e\x49\x95\xf0\x61\x36\x23\x13\x9a\x85\xee\x12\x94\x5c\xf3\x2c\x73\xc3\x0c\xc8\x25\x33\xc4\x4c\xb8\x6b\x0c\x4e\x32\x29\xc6\x30\x39\x2a\x7c\x57\x33\x96\xd8\xdf\x26\x19\xa3\xa2\x2c\xf0\x79\xf6\x58\x9f\xc9\x52\xf9\xe7\x39\x58\xcb\x30\x0a\xd7\x44\xf0\xac\x17\xf5\x4e\xba\x73\x61\xab\x06\xf5\x9a\xf9\x9a\xc2\x1b\xae\x59\x2f\x1e\xd3\x23\xf3\xea\xa8\x73\x46\xa1\xe4\x94\xa7\xd8\xfd\xc2\x93\x0d\xba\xb4\x62\x77\x8c\xb0\x9f\x85\x14\x7d\xc1\xc6\x14\xb4\x1e\xb7\x8b\x70\xcd\x70\x1c\x0c\xc5\x89\x14\xfa\x65\x58\x73\x41\x16\xb5\x52\xd6\x29\xc7\x4e\x9f\x11\xe5\xc8\x9e\x90\x44\xc2\xf1\x5a\x0a\x6e\xb0\x7b\xf4\xa4\x34\x24\x95\x37\x62\x7f\x80\xa8\xc4\x5c\x13\x4a\x86\xcc\xf8\x4e\xb6\xbe\xb3\x22\x57\x4c\x13\x26\xe8\x30\xb3\x6b\x0e\x09\x0f\x57\x4b\x09\x44\x46\x8c\x9a\x52\x31\x32\xa6\x86\x2d\x55\x9a\xf0\x7d\xef\x26\x2f\xd7\xa1\xcb\x7b\x29\x34\x6b\xdc\xdf\xba\x63\x4d\xeb\x2f\x5f\x35\x93\x11\x3c\x67\xb2\x34\x9f\xc4\x94\xbc\x99\xf0\x64\x12\x6b\xc6\x3c\x67\x9a\xc8\x72\xce\xc6\x7e\xe9\x7e\xb6\x7c\x85\xb6\xf6\xe4\xb2\xab\xa9\x97\x78\x89\x2b\x6d\xbe\xe4\xb8\x6a\x2b\x4b\xed\x06\x3c\x3e\xbb\xfc\xc7\x9b\xc3\xef\x4f\xde\x0c\xc8\x09\x4d\x26\x71\x3d\xba\x20\x14\x84\x06\x08\x8a\x09\x9d\x32\x42\x49\x29\xf8\x6f\x25\xa2\x93\x93\xbd\xf0\xdb\xfd\x4e\xb1\x90\x1b\x9e\xbe\xd0\xfa\xba\xb3\x5e\x4b\xd8\x48\x1b\x13\x1c\xa4\x66\xd0\x1d\x61\x5e\x7d\x3a\xb1\x5f\xa1\xa1\x01\xaa\xd6\x84\x59\x61\xc4\xa7\x4e\x0c\x3b\x70\x69\x9a\x86\x94\x0b\xcb\xe7\x96\x2d\xec\x51\x45\x87\x90\x2a\x31\x61\x44\x30\x63\xd9\x3a\x38\xac\xa4\xd0\x35\x60\x80\x52\x33\xdd\x23\xc3\x12\x92\x3b\x0a\xc5\x73\xaa\x78\x36\x8b\x07\xb3\x67\xd5\x99\xf4\xe6\xd0\x6c\x7e\x4a\xc7\xef\x4e\x2e\xc9\xd9\xbb\x2b\x52\x28\x84\x0c\x80\xec\x0c\xf8\x1e\x5e\x6b\xc8\xec\x2f\x5c\x8f\xce\x01\x39\x14\x33\xfc\x12\x37\x38\xd7\xc4\xda\x42\x0c\x8e\x60\xa7\x43\x7a\x50\xf8\x9d\x17\x03\xf8\xdf\x8e\x7d\x4b\x65\x95\xcc\x90\x74\x92\x2c\x24\x8f\xa1\x1a\xca\x87\x59\x44\x4d\xf7\xee\xcf\xaa\xdb\x52\x48\x9b\x3b\xb7\x44\x8c\xba\x2d\xd1\xb0\xd4\x40\x5e\xec\xbe\xc5\xc5\x38\x8b\xb9\xaa\x99\xd8\x6f\x6b\x5b\xb6\xb5\x2c\xfb\xd5\x1b\x9c\x37\x35\x30\x3b\xe9\xfa\x54\xcd\xa1\xa3\x5e\x29\xd5\xe9\xe7\xcd\x29\x27\x11\x64\xdc\xfe\xf2\xf4\xdc\xef\x00\xa7\xdd\xe4\x73\x3d\x13\xe1\xc7\x18\xd4\xe8\x91\x17\xe4\x1b\xf2\x91\x7c\x03\xe6\xd5\x5f\xda\x76\x96\x69\x6b\xf8\xb4\x77\xef\xa0\x55\x7f\x7a\xde\x11\xc5\x7f\xb6\xd2\xc9\x8e\x68\xa9\x6a\x24\x19\x72\xa7\xce\xb3\x8f\x86\x29\x2b\x47\xdd\x4a\xac\xb5\x27\x8f\x9d\xe0\x27\x64\x33\x8c\x5d\x9c\x8e\xe2\x96\x10\xe6\x81\x8c\x66\x7f\xfe\x37\xa9\xcd\x99\x93\x42\xf5\x06\x13\xd5\x68\x39\x35\xc9\xa4\x2e\xc6\xac\xa2\xa6\x4d\xb5\xc1\x34\x49\x25\x78\xd2\x30\x0f\x70\xc2\x5b\x64\x62\x6c\x0e\x1b\xb7\x0b\xce\xd7\xd6\xf3\xae\x95\x9a\x73\xa0\x80\xe5\xe3\x14\xab\x08\x5e\xa6\x90\xa9\xd3\xc9\xec\xb4\xd2\xe8\xcc\xb8\x43\x29\x73\xbe\x9a\xe0\xb2\x06\x5e\xb2\xfb\x29\xa1\x02\x13\xb8\x47\x4c\x29\x4c\xdd\x1c\xce\x20\x82\xcc\x13\xd6\x7a\xf1\x5a\xed\xa4\x42\x49\x23\x13\xd9\xa2\x6d\x50\x3d\x60\xee\x86\x03\x22\xa0\xf3\xd7\xfb\xdc\xdf\x1f\x9f\xf7\xc8\xd5\xd1\x39\x74\x53\xb9\x3c\xba\x3a\xaf\x5b\x2a\x3b\x57\x47\xe7\x3b\x6b\x25\x05\xf1\x9a\xd5\x2b\x3b\xcd\x06\x83\xd4\x1c\x4f\x56\x6d\xeb\xe7\xb4\xe8\x5f\xb3\x59\xc3\x33\xb5\x8b\x73\xbd\x1f\x56\xb8\x93\x17\x42\x32\xe7\xb4\x78\xf0\x68\x8a\xd1\x94\x7f\xa2\x2a\x0a\xb7\xb3\xaa\x67\x2e\x2f\xa7\xc8\xe5\x94\xa5\xa8\x0e\xfb\x5f\x30\x91\x16\x92\x5b\x7d\x71\x5b\x63\xf1\xf0\x5f\x6f\x6b\x2c\xee\xba\xb6\x35\x16\xdb\x1a\x8b\x6d\x8d\xc5\xdd\xd7\xb6\xc6\xc2\x5d\xeb\x77\x83\x92\x6d\x8d\x45\xc3\xeb\x79\xc5\xf9\xb7\x35\x16\x0f\xba\xb6\x35\x16\x8b\xd7\xb6\xc6\xe2\x96\x6b\x5b\x63\x71\xcb\xb5\xad\xb1\xd8\xd6\x58\x6c\x6b\x2c\xb6\xd9\x62\xf7\x8e\xb5\x99\xd9\x62\x64\x5b\x63\xe1\xae\x6d\x8d\xc5\xb3\xc8\x89\x21\xdb\x1a\x8b\x95\xae\x6d\x8d\xc5\xb6\xc6\xa2\xc9\xb5\xad\xb1\x80\x6b\xeb\x7b\xd9\xd6\x58\xf8\x6b\x5b\x63\x81\xd7\x1f\x47\x6b\xde\xd6\x58\x6c\x6b\x2c\xb6\x35\x16\xdb\x1a\x8b\x3b\x67\xb1\xad\xb1\x78\x0e\xf6\xa4\xef\x81\xd7\xbe\x66\x60\xf7\x48\xe6\x45\x69\x18\xb9\xf0\x43\x06\x2d\x12\x05\x03\xd7\xb1\x46\xd0\x3e\x85\x27\x91\x62\xc4\xc7\x4e\xb2\x1f\x60\x83\xb9\x7e\x78\x9f\x7e\xd4\xd4\xed\x09\xe6\xef\x64\x3c\xe7\xcd\x0a\x39\xc8\xc2\xc2\xbc\x81\xb1\xa2\x20\x8f\xdd\x49\x39\xfd\x08\x5b\x84\xe6\xb2\xc4\xa6\x7c\x89\x5b\xbf\x40\x42\x0c\x85\x6d\xdc\xca\x90\x6e\x4c\x9c\xaa\x22\xe5\xbc\x03\x6b\xa3\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\x8d\xa7\xdc\x5a\x25\xee\x4e\x21\xee\x48\x1d\x7e\x14\x65\xd8\x45\x87\x3b\xda\x8b\x17\x6e\xb4\xf9\xdd\xe8\x0e\xac\xbb\x76\xa3\x97\xa6\xa0\xe6\x85\x71\xb8\x26\x32\xe7\xc6\x2a\x87\x56\x1f\xa4\x71\x5e\x18\x37\x35\xa3\xd4\xc9\x01\x48\xa8\xa4\x06\x7b\x84\x86\x9c\xaa\x28\x4f\x5b\x7a\xcd\xcf\xf5\x5e\x0d\xfe\x0a\xd8\xcf\xfd\x94\x8d\xb8\x60\x2e\x0e\xb6\x95\x0d\xf7\x5f\x5b\xd9\xf0\x1c\x65\x83\x66\x49\xa9\xb8\x99\x1d\x49\x61\xd8\xc7\x46\x1e\x96\xba\x68\xb8\xac\x0f\x48\x70\x9f\xb9\x2a\x4a\xf7\x1d\x91\x05\x26\x50\xce\x95\xb3\x86\x14\x5c\x55\x0a\x30\x30\xb1\x4a\x86\x19\xb4\xfe\xc0\xee\x81\x9c\xc8\xf9\x87\x78\x7b\x0e\xcd\xcc\xdf\x4a\x3e\xa5\x99\xb5\x76\xab\x5f\x9c\x83\x05\x13\xff\x68\xd5\x3d\x6f\xa8\xbe\xae\x36\x3c\xeb\x5b\x1d\x3a\xcc\xf9\xc0\xbf\x12\x7c\xc4\x3e\x9a\xa7\xa8\xa5\x81\x82\x74\xae\xf8\x94\x67\x6c\xcc\x4e\x74\x42\x33\x90\x6b\xdd\x9c\x15\x87\xb7\x8c\x0e\x0b\xaf\x64\xa6\xc9\xcd\x84\x41\x77\x65\xea\x5d\x00\x50\xe1\x32\xa6\x5c\x90\xdc\x2e\x51\xe1\x7f\xac\xd1\x97\x60\xc5\x7f\x41\x95\x5d\xe0\xe0\x33\x00\x13\x79\x28\x65\xe6\x52\x87\xb3\x59\x35\xbe\xcb\xbd\x17\xf2\x1f\x82\xdd\xfc\xc3\x8e\xa6\xc9\x28\xa3\xe3\xe0\x2a\xd0\xcc\x2c\x78\xfb\xaa\xa1\x6f\x7d\x01\xc8\xcb\x2d\x19\xa1\xd9\x0d\x9d\xe9\xca\x71\x12\xf7\x01\x7f\x45\x5e\xee\x03\x3b\x53\x4d\xc2\x18\x29\xf9\x62\x1f\x62\x89\x47\x87\xe7\xff\xb8\xfc\xfb\xe5\x3f\x0e\x8f\xdf\x9e\x9e\xb5\x3b\x29\xec\xbb\x33\x2a\x1a\x8d\x91\xd0\x82\x0e\x79\xc6\xdb\x1c\x10\x0b\xd9\x26\xf1\xa0\x70\x04\xa7\xe9\x41\xaa\x64\x81\x74\xf2\x3e\xaa\xea\xa4\xac\x5b\xc1\x71\x65\x32\x2c\xcf\xa8\x3e\xe0\x58\x51\x61\x2a\x67\x4d\x45\x72\x55\x0a\x6b\x58\x3f\xf1\xc4\x7c\x9a\x76\x97\x94\x7f\x98\xa6\x2c\xad\x51\xef\xd9\x25\x01\x1e\xf9\x97\x9b\x55\x35\xda\xe4\xfc\xdd\xe5\xe9\xff\x33\xc7\x86\xb3\xa2\x5d\xce\x53\x37\x75\x61\x4a\x16\x9d\xad\xee\x85\xab\x3b\xda\xae\xef\x46\xac\x6f\x38\xab\xba\x89\xb4\x5f\x94\xa2\x0e\xe3\x51\x8d\x4f\x72\x99\xb2\x01\x39\x0f\x5e\xfa\xfa\xb7\x51\x79\x2f\x55\x8c\xd8\x5b\x84\xe1\x34\xcb\x66\xb1\x82\x64\x24\x16\xd3\xd4\x2a\x93\x63\x39\x3c\xa2\x99\x6e\x29\x4c\xdb\x9c\x4c\xf6\x10\x7e\x6b\x8d\xc9\x4e\xa8\x19\x46\x23\x29\x13\xd2\x38\xad\xd4\xce\x12\x8a\xb5\x95\x4c\x08\x5a\xae\x51\x5a\x54\xed\x74\xd1\xe8\xe8\xf7\x07\x13\xd7\x9e\x56\xe7\x61\x64\xf4\xf2\x96\x9a\xcd\x6b\xb7\xee\x60\xaa\x6c\x59\x3b\xba\x62\x34\x85\x9a\xb4\x82\x9a\x09\x66\x35\xe4\x54\x5f\xb3\x14\x3f\x70\x7a\x4d\x70\xf3\xdb\x11\xc3\xa3\xae\xec\xbc\xbd\x4f\x1f\xf4\x19\xcc\xb5\x80\x58\x40\x33\xd0\x0d\xd2\xc5\x16\xb0\xef\xf4\x4e\x64\xb3\x0b\x29\xcd\xeb\x50\x8b\xd5\xc9\x02\xfe\xec\x34\xc5\xba\x1b\x16\x54\x29\x48\x42\x48\xfb\x40\x4c\x60\xe9\xb8\x0c\xec\xb8\x5a\xb0\x35\x33\xb4\x2a\xc5\xa1\xfe\x41\xc9\xb2\xf1\x09\xb0\xa0\x68\xfd\x70\x7a\x0c\xfb\xb8\x74\x51\x36\x61\xd4\x0c\xaa\x4e\x17\x01\x83\x82\x4e\xfb\xde\xc5\x09\x63\x8e\xac\x42\x3a\xe4\x2d\x9d\x11\x9a\x69\xe9\x95\x63\x2e\x96\x1a\x50\xce\x3a\xb3\x5f\x0f\xa5\x99\x2c\x98\x65\x96\x9d\x17\x7f\xd7\x8b\x82\x6e\x15\x82\x11\x17\x0b\x3f\x37\xf4\x9a\x69\x52\x28\x96\xb0\x94\x89\xa4\xe5\xaa\xad\x3b\xd4\x04\x2b\x7f\x26\x85\xdd\x16\x9d\xac\xfd\x69\x88\x31\x82\x23\xac\xbe\xd2\x10\xad\x74\x76\x07\x85\x98\x25\x6c\x8a\x52\x33\x85\x01\x56\x55\x32\x5c\x88\x1f\xcb\x21\xcb\x98\x41\x63\x08\x70\x27\xa8\x41\x43\x9a\xe7\x74\xcc\x08\x35\x81\x51\x8c\x24\x4c\x68\x2b\x6e\xd0\xf5\x66\x48\x2a\x59\x55\x40\x49\x35\x79\x7f\x7a\x4c\x5e\x90\x3d\xfb\xac\x7d\x58\xfe\x11\xe5\x19\x84\x33\x0d\x55\xf3\x73\xe4\x23\x3f\x04\x4c\x09\x78\x8f\x48\x85\x5b\xb4\x47\x84\x24\xba\x4c\x26\x7e\x4e\xd6\xe2\xf2\x06\x9b\xcb\xe7\x03\xa7\xfe\x33\x64\xd5\xd6\x02\xe6\xbd\x66\xaa\x33\xf9\xf2\xbe\x81\x7c\x89\x55\x08\xcb\x73\x75\xea\x21\x63\xe5\xcc\xd0\x94\x1a\xea\xe4\x4e\x55\x75\xfd\x1c\x97\x74\xdd\xd2\x47\xb3\x37\x5c\x94\x1f\x31\x63\xa5\x3b\x23\xff\xf2\x04\x86\x25\x89\x27\x1a\x2c\x1a\x2d\x8a\x8c\x63\xbd\xf3\x5c\x06\xd5\x69\x6d\xa9\x7b\xb7\xa8\x48\xb0\xcd\x69\x96\x49\x2b\xde\xec\xc9\x4e\x45\x2a\xf3\x85\x87\x59\x05\x8a\xd5\x80\xee\x06\xe4\x59\x32\xcf\xda\xdd\x11\x19\x9b\xb2\x16\x98\x2e\xf3\xb8\x7c\x76\x34\xab\x8b\xf9\x05\x85\xe1\x49\x46\x87\x2c\xc3\x93\x05\x19\x48\x2f\x32\xd0\xba\xb3\x10\x95\xcc\xba\xab\xc1\xb8\x90\x19\xc3\xb4\x1e\x4f\x08\x3b\xfc\x93\xa0\x03\x0c\xd2\x15\x1d\xc0\x90\xa9\xd1\x01\x4c\xb2\xa7\x40\x87\xb2\xc5\x41\x4b\xe6\xe9\x60\x4f\xed\x3a\x1d\xe0\xe8\xdc\x74\x3a\x68\x96\x24\x32\x2f\xce\x95\xb4\x26\x57\x67\x47\x8b\x1b\xb6\x8a\x15\xa1\x4d\xbe\x24\x09\x07\x44\x79\xfd\x66\xaa\xa2\x84\x3e\x6a\x50\xc6\xfb\xac\xbe\xff\x5f\xdc\x21\xd9\x8a\x9e\xf9\x73\xc8\x8f\x52\x0b\x2b\xd9\x5f\xba\x2f\x9e\x38\x9c\x40\x0b\x2f\x59\x27\x87\x89\x4c\x68\x06\x90\x7b\xed\x38\x86\xcc\x73\xcd\xfc\xc0\x51\x16\x26\x84\x96\xe0\x33\x1f\xf7\x07\xf4\x35\xf8\xc4\xf9\xbe\x84\x4c\x59\x14\x82\xc4\xf4\xd1\x2b\xcc\xd6\x83\xfb\x7c\x02\xa8\x3d\xd5\x7d\x34\x30\xad\xfd\xda\x48\x87\x00\xf3\x36\x00\xf9\xd9\x09\x32\x91\x72\x31\x06\x8f\x4e\x8f\x28\x96\x61\xea\xa8\xdb\xc3\xd7\x68\x7e\xed\x02\x47\xfb\x41\x3d\x3b\xfb\x47\x83\x26\xc4\xa5\x70\x23\x83\x93\xc3\xeb\x37\x23\x94\x96\x5c\x93\x9d\x37\x9e\x00\x2d\x90\xcf\x36\xf1\x80\xd8\xc1\x37\x0c\xab\x89\x3e\xb6\x6b\x2e\x52\x97\x65\x59\x23\x56\xc0\xa8\x45\x2d\x14\xf2\x77\x79\x1a\x8b\x86\x57\xe4\x83\x20\x81\x58\xa4\xdf\x98\x3d\x2e\x50\x61\xf5\xee\xa5\xfe\xdd\x2e\xbf\xf0\x90\xf9\x61\xde\x0b\x58\x7b\xfb\xdc\xbe\x35\x7b\x17\xef\xf3\xef\xb2\xb3\xce\x75\xbd\xe1\x22\x95\x37\xba\x6b\x1b\xe2\x67\x1c\xd6\x2b\xd4\x89\x65\x6b\xc3\xc5\x58\xc7\x76\x04\xcd\xb2\x9a\x1b\x76\x99\x21\xe1\x57\x38\x20\x12\x2f\x2a\xf0\x73\xd9\xe1\x5b\x23\xe0\x01\xd7\x38\xd7\xf4\x48\xd9\x57\x31\x9c\x66\x97\x45\x73\x68\x36\x32\xcf\x06\x3f\xbc\xbd\x3c\xac\x0f\x6d\xe5\xd9\x0d\x20\x5e\x5b\x62\xdb\xef\x09\x4d\x73\xae\x35\xb8\x81\xd8\x70\x22\xe5\x35\xd9\xf3\x69\x1b\x63\x6e\x26\xe5\x70\x90\xc8\x3c\xca\xe0\xe8\x6b\x3e\xd6\x07\x8e\x69\xfb\x76\xf6\xfb\x84\x8b\x2c\x64\xa3\x80\x19\x29\x8c\xf6\x6e\x0c\x78\x48\x12\x66\x01\x6b\xeb\xf0\x3a\x5d\x94\x79\x71\x9a\x88\xd0\xc9\x59\xb6\x7e\xc0\x99\xc5\xe5\x39\x6b\x89\x9d\x71\xcf\x12\xc1\xbb\xbb\xd2\x94\xb8\x8c\x6a\x29\x1d\x51\x7b\x5b\x3b\x91\x9c\x76\x90\x30\xdd\x1d\x2a\xcf\xdf\xaa\x31\x49\xca\xb0\x7a\x82\x41\xd6\x09\xbd\x35\xb9\x09\xbc\xb2\xbb\x50\x84\xe7\x7e\xba\x1b\x6b\xb4\x10\xf5\xc1\x32\x0f\x6b\x0f\x64\xc5\x84\xf6\xd1\x48\xb6\x22\x09\x64\x98\xd7\x01\x26\x52\x48\x97\x9c\x6e\x4f\x41\x29\x80\xa5\xc1\x5a\xc0\x40\x10\xac\x89\x93\xb1\xd1\x54\x8f\xaa\xf8\x60\x1c\x43\x82\x22\x1e\x04\x01\xa8\xe6\x70\xc3\xcd\xc4\x23\xdc\xd7\x02\x4e\x30\x13\xc5\x34\x44\x0f\x04\x61\x4a\x49\xe5\x12\x61\xbc\xd7\x16\x46\x02\x51\x0c\x99\x34\x96\x49\xa8\xfd\x6b\x57\xc7\x21\xca\x0a\x02\x17\xf2\xc4\x2c\x37\xb1\xd1\x88\x25\xa0\x29\xc5\x04\x46\xb1\xbb\x57\x21\xf7\xb9\xec\x6e\xcb\x60\x0e\x42\x37\xe7\x1f\xed\x53\xe2\x5f\xc5\xc1\x50\x87\x98\xb7\xfc\xeb\xfd\x01\x21\xa7\x22\x64\x4e\xf6\xec\x2a\xc6\x77\xfa\x94\x1f\x63\x5f\x31\xc6\x5f\x86\x17\x88\xfd\x4e\x56\xbd\x53\x65\x07\x1c\xdf\xc6\x19\x4c\x62\x87\x70\xa7\xe2\x00\x1c\xc3\x6e\x50\xbb\xf4\xfe\x10\x6f\xe3\x28\xb6\xb7\x3c\x96\xb3\xf8\x69\x9c\xf4\xa4\xad\x9c\x73\x25\xf1\x1d\x81\xe2\x5e\x46\xa3\x45\xea\x77\x08\x37\x9d\xcb\x14\x21\x31\x42\x49\x3f\xf4\xb2\x00\x88\x0e\xfe\x6f\xaf\x60\x55\x4a\x9a\x90\x98\x95\x1d\x63\x65\x38\x4c\xd0\x94\x58\x5d\x39\xf3\xb6\x7d\x5e\x64\x0c\xaa\xe7\xa2\x91\xab\xc2\xc0\x08\x45\xb7\x17\x26\x52\x01\xf1\x3a\x84\x8e\x1e\xf9\x17\x6c\xca\x90\x00\xe8\xc1\x03\xce\xc3\xcf\xd1\xc4\xe3\xda\x43\x6a\x43\x65\x9b\x91\xde\x75\x40\x52\x3e\x1a\x31\x9f\x68\x68\x4d\x3f\xaa\x68\x6e\x45\xbc\x26\x8e\x04\x43\x36\xe6\x98\xc9\x16\x04\xdb\xae\xae\x2a\xe0\x7b\x28\x0c\xb9\x21\x39\x1f\x4f\x90\x51\x08\x85\xca\x48\xe2\x43\x6a\x99\xa4\x29\x01\xde\x96\x8a\xdc\x50\x95\xdb\x73\x83\x26\x13\x88\xcf\x51\x41\xd2\x52\x01\x4c\xa4\x61\x34\x9d\xf5\xb5\xa1\xc6\xaa\xba\x4c\x39\x8b\xd0\xcf\x7f\x0b\x25\x7c\xe7\xb5\x85\x12\xbe\xfd\xda\x42\x09\x6f\xa1\x84\xb7\x50\xc2\x77\x5f\x5b\x28\x61\x77\xad\xbf\xda\x97\x6c\xa1\x84\x1b\x5e\xcf\x0b\xce\x66\x0b\x25\xfc\xa0\x6b\x0b\x25\xbc\x78\x6d\xa1\x84\x6f\xb9\xb6\x50\xc2\xb7\x5c\x5b\x28\xe1\x2d\x94\xf0\x16\x4a\x78\x0b\x8a\x76\xef\x58\x9b\x09\x8a\x46\xb6\x50\xc2\xee\xda\x42\x09\x3f\x0b\xe8\x27\xb2\x85\x12\x5e\xe9\xda\x42\x09\x6f\xa1\x84\x9b\x5c\x5b\x28\x61\xb8\xb6\xbe\x97\x2d\x94\xb0\xbf\xb6\x50\xc2\x78\xfd\x71\xb4\xe6\x2d\x94\xf0\x16\x4a\x78\x0b\x25\xbc\x85\x12\xbe\x73\x16\x5b\x28\xe1\xe7\x60\x4f\x6a\x93\xf2\x46\xc8\x67\xab\x00\x55\xb8\xcc\x90\xa8\xb4\x75\x58\x8e\x46\x4c\x81\xe4\x82\x27\x2f\x64\x21\x04\x40\xab\x20\xcb\x5c\x9e\x01\xc0\xe2\x29\x46\x53\x97\xf0\x7e\xcb\xcf\x5d\x2d\x2d\x20\x94\x55\x99\x9a\x27\xef\x5e\x77\x83\x8a\xd1\x2e\x47\x11\xe6\xfc\x4e\x24\xed\x73\xd5\x2a\x82\x2f\x2b\xc0\x70\x74\x4f\x32\xa9\x5d\x86\x29\x10\x2b\x99\x50\x21\x98\x37\x1e\xb9\x01\xa7\xcc\x90\x31\x41\x64\xc1\x04\xca\x6f\x4a\x34\x17\xe3\x8c\x11\x6a\x0c\x4d\x26\x03\xfb\x24\xe1\x89\x5d\x65\x83\xba\x4f\xb4\x51\x8c\xe6\x3e\x2f\x36\xa7\x1c\x87\x22\x34\x51\x52\x6b\x92\x97\x99\xe1\x45\x18\x8c\x68\x06\x09\xed\x78\x50\x05\x62\x40\x7a\x49\x95\x42\xda\xab\x9e\xe6\xa6\x25\x63\x50\x20\x30\x5d\x7b\x80\x83\x9a\x17\x66\x16\xf2\xe8\x18\x19\x71\xa5\x0d\x49\x32\x0e\xa7\x35\x3c\x11\x6b\x07\x61\xbc\x9e\x3f\xab\x85\x9b\xa9\x76\x53\x15\x29\xa8\xad\x85\xd1\x98\x95\x56\x0d\xe8\x86\x4a\xb9\x76\x6a\xbe\xee\x11\xea\x21\x6f\x90\xd0\x7e\xa6\x40\x6a\x7f\xb2\xe0\xe8\xee\xa3\x68\xb8\x08\x27\xaf\x4a\xdb\xab\x18\x1d\x52\x8c\x3d\x73\xf6\x6a\xd9\xd4\x95\x42\x01\xe9\x2e\x0b\xdb\x00\x16\x40\xb0\xa9\xe5\x01\x96\x30\x7b\xbe\xd2\x5b\xb8\xfe\x93\x33\x7d\x74\x28\xbe\x65\x5a\xd3\x31\x3b\x6f\x18\xb5\xb8\xcd\x22\x83\xc0\x45\xb5\x30\xc0\x0a\x19\x96\xa7\x85\x4f\xaa\x34\xa7\xba\x1a\x44\x72\x9c\x53\x50\x7e\x6e\x14\x37\x86\xc1\xa2\x02\x38\x12\x04\x3e\xe7\x0b\x50\x77\xe7\x92\xa5\xde\xfa\x41\xaa\x1f\x5b\xa1\x2e\x52\x4c\x5d\x1a\x32\x32\x54\x9c\x8d\xc8\x88\x43\x3e\x14\x64\x28\xf5\x10\xee\x83\xa2\x47\x41\x6b\x6b\xef\x4a\xe1\x75\x59\x3f\xaf\x01\xf9\xd9\x4d\xcc\xa8\x52\x24\x34\x02\x01\x84\x12\x2d\x3e\x22\x63\xc8\x70\x72\xda\xe2\x57\x2f\xfe\xf3\x2f\x64\x38\xb3\x47\x1a\x68\x56\x46\x1a\x9a\x85\x97\xcc\x98\x18\x5b\x5a\xe1\xf6\xac\x17\x19\x05\x0a\x00\x8a\x39\x4e\xfc\xe5\x17\xd7\xc3\xfa\x19\x7b\x90\xb2\xe9\x41\x44\xbf\x7e\x26\xc7\xcb\x70\xe1\x9b\xa7\x4c\x36\x34\x89\x96\xb0\x99\xcc\x78\x32\x6b\xcd\x68\x1e\x77\x86\x4c\xe4\x0d\xea\xfa\x4b\xb8\xa7\xca\x81\x2c\x64\x51\x66\xe8\xc1\x7e\x1d\xca\xf3\x4a\xcd\x16\x6b\x70\x96\xee\x0b\xf0\xb9\xba\x21\xe6\xf1\x62\x31\xb1\xcd\x3f\x52\xba\xdc\x6e\xe7\x15\x0c\xf0\x33\x60\x08\xbd\xa6\x59\x36\xa4\xc9\xf5\x95\x7c\x23\xc7\xfa\x9d\x38\x51\x4a\xaa\xfa\x5c\x32\x6a\xa5\xe5\xa4\x14\xd7\x88\x5c\x1d\x4a\x84\xe5\xd8\xaa\x56\x45\x69\x7c\x22\xf1\xb2\x17\xc6\x82\x53\x2f\x84\xbd\x19\x54\x8d\xc2\x3e\xf2\xca\xd6\x71\xa5\x12\xc8\x91\xf1\xf8\x3a\x66\xb6\x2f\x5e\x7c\xf5\x35\xb2\x2e\x91\x8a\x7c\xfd\x02\x92\x1f\x75\x0f\x37\x31\xc8\x36\x7b\x50\xe4\x34\xcb\xac\xd9\x10\x33\xa5\x25\xf4\x32\x26\xfc\xe4\x3c\x68\xda\xb3\xdb\xca\xaa\xd4\xd5\xd5\xdf\x41\x8f\xe2\x46\xb3\x6c\xd4\xc3\xaa\x80\x60\xd6\xec\xc2\xc1\xb0\xeb\xa4\x0f\x94\x66\x6c\x80\x02\x34\x95\x59\x99\xb3\x63\x36\xe5\x5d\x34\xaf\xa8\x8d\xe6\x4d\xfd\x8c\x6b\x28\xc0\x18\x66\x32\xb9\x26\xa9\xfb\x32\x4a\x63\x99\x87\x50\x6d\x4e\x85\xa6\x09\x3d\x2d\x12\x79\x6e\x7d\xff\x5a\x0a\x4f\x4e\x8b\x22\xe4\xe8\x2b\x7a\x53\x23\x06\xec\x49\xa8\xf7\x6d\x89\xa7\xd0\xda\xcd\xdc\xd6\xc9\xdc\x77\x6f\x64\xe5\x66\xe3\x21\x1a\xa7\xb0\xb4\xf7\x51\x57\xb3\x6f\xee\x98\xac\x31\x44\x35\xa0\xdf\x0d\x05\xfc\x37\xa6\x67\x2f\x54\x25\x85\xc2\x96\xc0\x18\xa8\x00\x58\xf6\x01\x91\xdc\xdc\xe1\xda\x81\x77\xb3\x5d\xfe\x52\x8d\x2e\x22\x78\x95\x73\x6a\x9c\x42\xe8\xdd\xd7\x94\x14\x4c\x69\xae\xed\xb9\xfc\x13\x6c\xa8\xa3\x8c\xf2\x3c\x72\x01\xae\x87\x08\xb8\xb9\x01\xf9\xb2\xbd\xa4\x3c\x97\xa9\x1b\x10\x44\x21\xa2\x7e\x2e\x51\x6b\xeb\x5a\x6d\x87\x07\xea\xba\x45\xe5\x4f\x15\x35\xeb\x92\xd2\x7e\x12\x44\x25\xde\xf5\x9c\x04\x24\xbc\xdf\x53\x95\x8f\x61\xf2\x1d\x89\x01\x10\x8c\x6e\x71\xeb\x92\xb0\x66\x3c\xe2\x46\x89\x54\x7a\x67\x07\x0e\x08\x86\xd4\xed\x9e\x70\x3f\x25\xbb\xaf\x76\xd7\x2a\x24\x91\x44\x4a\x16\x74\xdc\xaa\x87\xc1\x1c\xa5\xe6\x87\x8d\x0b\xbd\xad\x19\x04\xdf\x07\xd8\x21\xb8\x8b\xa5\x15\x10\x05\xc0\x8c\x60\x74\xd4\x13\xd8\x19\x08\x58\x0f\x79\x43\x67\x84\x2a\x59\x8a\xd4\xf9\x97\x82\x83\xef\xed\xdc\x83\xcf\xa4\x60\xde\x71\x3e\x5f\x27\x0e\x1e\x7d\x2e\xc8\xcb\xc1\xcb\x17\xcf\xe5\xa4\x82\x37\x9c\x3b\xa9\xce\xc2\x49\x85\xf2\x69\xad\xef\xea\xd1\x8e\x3b\x7a\xdf\xb7\xce\xc5\x52\x81\x19\x73\x0f\xd6\x0a\x1f\xdd\x28\x6e\x58\xd4\xdb\x68\x0f\x0c\x17\x6b\x1f\x46\x55\xd1\xfb\x1d\x62\x78\x77\x53\x86\xae\xcb\xe1\x23\xca\x2d\x27\xa0\x60\xbb\x2d\xf3\x70\xe9\x3b\x44\x58\x4c\xa8\x9d\x1d\xb2\x87\x77\xee\x62\x65\xe0\xfe\x5a\x59\xcb\x11\xed\xe4\x63\xd1\x02\x63\xae\x46\xb8\x93\x8f\x05\x05\x1f\x5c\xd1\x21\x05\xbf\x67\x13\x3a\x65\x50\x11\xc9\x33\xaa\x32\x88\x39\x5e\xe2\xdc\xc9\xb0\x34\x84\x89\x29\x57\x52\x40\x82\xcf\x94\x2a\x0e\xa8\x14\x8a\x41\x65\xb5\xb5\x45\xff\x63\xef\xa7\xc3\x0b\x48\x68\xd8\x77\x25\xe1\x6e\x96\xa5\xf6\xf0\x11\xf1\x4c\xa2\xe1\xee\x5d\x3e\x3f\x0f\x4b\x43\x90\xb9\x7e\x5e\xf6\x39\x79\x69\x4a\x04\xc4\xff\x98\x64\xa5\xe6\xd3\x75\x49\x12\x57\xaa\x7a\xcc\x1b\xad\xf3\x5c\xd9\x6c\x45\xa8\x85\x0a\x58\x70\xad\xc3\xd1\x72\x0f\x02\xeb\xae\x0e\x98\x55\x71\x0c\xdc\xb9\x9e\x5c\x2d\x3b\xe6\xe2\x79\xc8\xb2\x05\x15\x02\x70\x1b\xd6\xeb\x84\x12\x32\x65\x0f\x47\xbd\xa8\xa7\xf7\xb8\x21\x30\x66\x1e\x95\x03\xea\x64\xc2\xd2\x12\xe0\x55\xb8\x46\x70\x40\x6b\x3e\xd0\x0a\xc6\x4a\x40\x7f\x86\xd3\x51\xa8\x0d\x16\x7d\x70\x0e\x22\xcd\xfd\xef\x95\xaf\x24\xf6\x1f\xe8\xb9\x11\xc1\x28\xb5\x63\xf5\x08\xd5\xba\xcc\x71\x4b\x20\xfc\xf6\x88\x1b\x1d\x7a\xeb\x79\xed\xd8\x6e\x8c\x07\x56\x67\xb5\xa0\xef\x25\xcb\x80\xb9\x5a\xd0\x78\xf7\x2c\x1a\x07\x09\xad\xfd\x5f\x8e\xe1\x5c\xc2\x04\x44\xdb\x42\x52\xa8\x04\x2f\xe9\x88\x43\xfb\x0a\xea\xe8\x7d\xb9\xe4\x97\xa8\x3a\xe0\x1d\x00\xcf\x40\x87\x2c\xd3\xf3\x03\x0d\xab\x45\x71\xb0\x7e\x8e\xf0\x2d\xbb\x03\x52\xad\xf9\x58\x40\xdf\x30\x3b\xda\x03\x3b\x84\x35\xb6\x99\xba\xe8\xfe\xd7\x58\xaa\xd5\xb2\xb0\x72\x5a\xf4\x9d\xd5\x6b\x64\xce\x93\x07\x8c\x24\xa7\x4c\x4d\x18\x7d\xa0\xc1\x37\x17\x17\x73\x63\x54\xad\x63\xb4\xab\x72\x74\xfb\xc6\x3f\xc4\xee\x2f\x99\x40\xb6\x3d\xfa\xe9\x7d\xf6\x13\x05\x16\xc1\xc6\x94\x63\x3e\x65\xc2\x03\xff\x1d\x65\x34\x34\x1f\xf3\x50\x49\x0e\x7c\xb0\x34\x32\x44\x3e\xac\x39\x55\xa1\x97\x41\xa0\xd4\x39\x5d\xe3\x71\xa2\x5b\x5c\xeb\xb2\xcc\x83\xf5\xaf\x72\x27\x04\x1f\xb0\xf5\x47\xaf\x7a\xa5\xdc\x1b\x68\x35\x78\x1c\x92\x40\x88\x2c\x74\x05\xc5\x40\xc4\xfd\x8f\x70\x71\x6d\xcb\x8b\xcb\x86\x71\x7b\x2e\xe0\x38\x55\x84\xcd\xac\xf2\x3a\x23\xd0\x5c\xe2\x74\x54\x7f\x12\xaf\x41\x5f\x42\x36\x36\xec\xe1\xea\x50\x39\x97\xe9\x65\xc1\x92\x1e\x09\x4b\x19\x77\x6e\x73\x4e\x1b\x4c\x6d\x89\xf0\x1b\xf1\x38\x52\x8a\xe9\x42\x22\x02\x67\xfc\xd8\xb8\x41\x28\x37\xb5\x88\x3d\x36\x22\x00\x0b\xad\xc2\x4a\xf8\x37\x53\x72\xa9\x20\x18\x73\x33\xb8\xfe\x1a\xa4\x00\x13\x13\x2a\x12\x14\xc0\x07\xd7\xac\xd0\x07\x9a\x8f\x71\xd3\xff\xe5\xeb\xaf\x41\x02\x78\x92\x1c\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x12\x23\xce\x63\x7d\x41\x58\xec\xc7\xb0\x91\xc8\xf4\xe5\xe0\xe5\xd7\x18\xb7\xe7\x1a\x01\x48\x22\xf8\x2f\xac\x49\x5b\xc4\xfe\x3a\x97\x69\xa0\x9b\xcb\xdb\x7a\x60\x34\x72\xad\x32\xe8\xc9\xf4\x1d\x6d\x98\x51\xdb\x36\x8b\xb6\x55\xe6\x6c\x87\xd9\xb2\x85\x62\x56\xbd\xe1\x52\x34\x89\x33\xd7\xed\xbb\xb9\xa1\xbc\xf3\xde\xfd\x65\x05\xb1\x7f\x9a\x18\x5b\xd9\xac\x51\x5e\x67\xf2\x06\x72\x43\xb8\x54\xdc\xcc\x06\x00\xd5\x23\x47\xe4\x8c\x4d\x99\xea\xf9\x51\xdf\xd8\x9b\xce\xc3\x3d\xb1\x01\xb1\xec\x8e\xa8\x2b\xce\x6d\x1b\xb5\x47\xc6\x71\x1a\xc2\x99\x14\xe7\x61\x76\x61\x18\xb7\xf3\xfa\x90\x31\xf9\x29\x94\x33\x4f\x86\x16\xeb\x80\xe8\xc7\xee\x05\x5c\xa3\xe4\x9f\xa8\xe2\xb2\xd4\x04\x7d\xe2\x31\xe6\x20\xc6\xd1\x03\x89\x40\x35\x73\x5e\xae\x30\x48\x48\x8f\xf7\x8e\xae\x40\x9f\xc3\x70\xde\x1c\x2d\x3f\xd2\xb8\xb1\x8b\x3e\xf5\x8f\x52\x3e\xdf\x67\x01\xae\x10\x0f\xb3\xa5\xe7\x97\x3f\x91\x75\x3c\x51\x18\xc6\xcf\x03\xce\x06\xab\xf0\xe3\x28\x13\x3e\xf6\x59\x65\xf0\xfe\xa8\xbb\x47\x9f\x06\x66\x6b\xb0\xa4\x4d\x76\x7c\xd3\xe4\xc6\x62\xfe\xfd\x5a\xb0\x45\x1d\xd4\x2d\xc6\x85\xf3\x69\xd5\xd5\x16\xdc\x41\x3e\x81\x43\xb0\x9f\x28\x6e\x78\x42\xb3\x1d\x38\xc2\xfc\x57\xd6\xf6\x36\x4c\xc5\xdf\x2a\x46\xcc\x8d\xc4\xa7\xd0\x8c\x5c\xb3\xd9\x8d\x54\xa9\xd7\x2f\xfc\x13\xab\xb5\xd0\xc6\x3f\x92\x33\x27\x0b\x10\x92\x4b\xe5\x4c\x91\x21\xf3\x6e\x84\xb9\x9b\x67\x03\x72\x28\x66\xce\x07\x2b\xe2\x4a\x0b\xaf\x46\x0c\x67\xa8\xe3\xa0\x16\x58\x63\x12\x77\x1e\xfa\xa7\x51\xac\x81\xb9\xcd\xc4\xb6\x0a\x64\xd8\x05\x5e\x7b\xf1\x36\xb6\x54\x2e\xd5\x1b\x76\x87\xc2\x44\x75\xe9\xbf\xfe\x24\xd2\xc2\xea\x67\x5c\x30\xad\x7f\xb0\x4b\xd9\x46\xdd\xae\x73\x07\x05\xb5\xca\x8d\x0d\x72\xb2\xca\xab\x62\x76\x4b\x51\xdf\xf3\xdd\x52\x28\xdc\x39\x20\x87\xf0\x01\x24\x06\x5a\xcd\x11\x4a\x09\xec\x60\xd6\xe2\x9d\xeb\x6d\x88\x77\x1c\x9e\x1d\xfb\x04\x2e\x54\x3a\x74\x1d\xb3\x11\x55\xfe\xfa\x4c\x40\x53\x75\x69\x44\xec\xb7\x92\x42\xab\xaa\x9d\x2b\x55\xb2\x9d\x66\xaa\x1e\xa2\x81\x1e\xfc\xf9\xeb\x17\xa0\xed\x85\xe7\x81\xd8\x7f\x60\x56\x74\xd3\x40\x61\xa3\x10\xe1\x7c\x74\xf4\x22\xe6\x07\x4f\x70\x6f\x37\x39\xcf\x1d\x14\x38\xc1\x32\x05\x9a\x37\xb2\x2f\x1b\x05\x04\x9b\x87\x02\xfb\xd5\x74\xaf\x1e\xde\x09\xa1\x4d\x14\xaf\xf6\xdc\x2e\x5c\x7d\xd5\x68\xb8\x2a\xd8\x68\xb9\x7a\x4e\x14\xb4\x47\xbc\x5d\xf7\x31\xe4\x04\x81\xe0\x02\xd7\x08\x88\xc7\x59\xd1\x22\xff\xa9\x81\xbc\x81\x74\xdf\xd6\xaa\xe2\xee\x05\x0e\x44\x8a\x4a\x37\x5c\x48\xe3\x0c\x6e\x6e\xd0\x3b\x9c\x56\x78\x08\x39\xf1\x3d\xf2\x4e\xbc\xc6\x24\xc1\x1e\x2a\x8a\xb5\x7a\x6e\xbc\xa9\xd3\x5a\x89\x83\x3f\xb9\x77\xef\xe3\x94\x9b\x08\x85\x87\x93\x3b\xb2\x7c\x5b\x9e\xfe\xbb\x17\x73\x63\xd5\x58\xaf\x66\xd9\xbb\x13\x92\x57\x1d\x14\x9c\xf8\x24\x63\x25\xcb\xc2\xbb\x93\xeb\xed\x10\x2a\x08\x61\xf4\x82\x62\xaf\x2e\x21\xeb\x43\x07\xe7\x0d\x30\x30\xab\x50\xc8\x53\x92\xa0\x79\xef\x4f\x5d\x4c\x05\x47\x0f\x88\x2a\x45\xbd\xd5\x60\xe4\x90\xdd\xc9\xd8\x98\x26\xb3\x9d\xfa\x73\x96\xb9\xbf\x39\x64\x28\xf3\x1c\xe1\x17\xf1\x79\x55\x62\x27\xe4\x7f\x82\xfe\x80\x7b\x0d\x54\x83\xd0\x0f\xd6\x1f\xf9\xbe\x32\x61\x42\x45\x0a\x6e\x9e\xc6\x9e\x85\x3f\x7f\xfd\xe7\xbe\x1b\xad\x8f\x53\x99\xaf\xf1\x72\xb5\x5a\x4b\xdd\x09\x5f\x35\x72\x05\x3c\x98\xff\x82\xb7\xbb\x53\xd5\xb3\xb6\xc4\x56\x9f\xe2\xba\x00\x76\x40\x7f\x48\x38\xfd\xc3\xd3\xef\xd2\xce\x96\x0f\x12\x7a\xd0\x87\x21\x3e\x09\xb9\xea\xf8\xd2\x6d\x76\xeb\x3c\x54\xf5\x44\x66\x29\xec\x2b\xe7\x64\xf2\x8f\x22\xd4\x18\xc5\x87\x25\x74\xcb\x11\x29\x40\x9d\xd6\xeb\x4c\x5c\x57\x8e\x01\xa9\x0a\x0d\x62\xe3\x19\x18\x7f\x40\xc8\x25\x73\x2d\x95\xa3\x79\x80\x58\xf6\xa4\x04\x43\x0a\x78\x11\x9a\xf7\xa1\xcd\xf6\x89\x1c\x52\xcd\x4f\xef\x51\xd3\xae\xbd\xf5\x4e\x36\x87\xc1\xa8\xd1\x65\xe1\x50\x0f\x68\x86\xf2\x70\xa1\xc7\xd7\xdc\x41\x06\x29\x58\x20\x11\x2f\x65\x1e\x62\xb6\x96\x16\x1a\x41\xfa\x80\x97\x7d\x3f\x57\x23\xa1\xbe\x69\xec\x5c\xb1\x37\x76\x88\x09\x2f\xd0\x04\xa7\x26\xfc\x1c\x02\x1f\xf6\xeb\xb8\x5c\x15\x3a\xe4\xbc\x44\x1b\x58\xde\x80\x13\xfc\x87\xd3\xe3\xb0\x47\xec\x5d\xaf\x2f\x81\x20\xe4\x8b\x81\x6b\xd7\x65\xc6\x3c\x25\x43\x0c\x76\x59\xf1\xba\x27\xd8\x0d\xa6\xcf\x39\x3f\x71\x50\xc3\xa7\x3e\xad\x0c\x47\x0b\x0f\x77\x43\xee\x93\x2f\x5d\xe7\x25\xa6\xbc\x11\x3f\xe4\x2e\xbd\xe6\xdd\xc5\xae\xf7\xce\xdf\xf4\xd5\x4d\xbf\xdf\xef\xdb\xb9\x7a\xa1\xbe\xa4\xa7\xad\xdd\xef\xb9\x4c\xf9\x68\x36\x47\x09\xcb\xe6\xd5\x23\x80\x23\xa9\x98\xb9\xd9\x35\x68\xb5\xd3\xce\x8f\xd7\xa6\x02\xd5\x31\xe7\x11\xac\x77\xd3\x32\x8f\xba\xdc\x58\x32\xa4\xb3\x8a\x35\x19\xb2\x09\x9d\x72\x09\x85\xa9\xc0\x63\x90\x30\x78\x0b\x5d\xbd\xcf\xc7\x2d\xba\xc3\x3a\x42\x9b\x9c\x7d\x2c\x24\x22\x29\x42\x42\x2e\x34\x89\x98\x0f\xa6\x80\x9b\xdb\x6e\x0a\xc8\x2b\xa8\x31\xbd\x53\x1f\x10\x4d\xc4\x13\x81\x0c\xa9\x1d\x32\x4c\x67\x6f\x6e\x99\xf7\x07\xe4\xd4\x71\x06\x98\x7f\x42\xba\x56\x13\x44\x0a\xc2\x8a\x09\xcb\x99\xa2\x59\xfd\x41\xae\x30\xe9\x95\x95\x96\xca\x32\x19\x06\x2c\x72\x5a\xa0\xb0\x04\xd9\x97\x72\xe5\x7b\x4d\x39\x11\x67\xf9\x75\xe7\x1d\x74\x7c\x7e\xcb\x35\x68\x2a\xce\xf5\x81\x7a\xe5\xce\xb2\xf3\xc8\x7f\x17\xb2\xbc\x1e\x5e\x39\xd4\xc2\x21\xdc\xa6\x3f\xf9\x9a\x3a\x93\xaf\xbb\xb7\xab\x8b\x23\x53\xd3\x26\x3d\x76\x7d\xb2\xa3\x5d\x5f\xf2\x6d\x47\xf2\x55\x3a\x92\xaf\x9b\x45\x9b\xf2\x63\xb3\xa4\xbf\x16\x2d\xc8\x37\xb2\xf9\xf8\xba\x57\xef\x89\x0b\x98\xb6\xad\xc7\x1f\xde\x74\x7c\x95\x66\x81\x8f\xde\x75\xfc\x19\x71\x4d\xc3\x8a\x8d\x76\x05\x0f\x2d\x7a\x8e\xaf\xb5\xdb\x78\xcb\xc4\xdf\xe6\x1d\xc6\xd7\xda\x5b\xbc\xe5\x5b\x37\x6f\x17\xbb\xd6\x4e\xe2\x2d\xdf\xba\x79\xf7\xf0\xb5\xf6\x0d\x6f\xf1\xd6\x6d\x7b\x85\x3f\xa8\x4b\x38\x9b\x73\x9e\x04\x8f\xf2\xa7\x15\x83\x6d\x8a\xd6\x1a\x36\xeb\x6e\x29\x79\x3b\x69\xd0\xbd\x6d\xcd\xdd\x65\x6b\xee\xcd\x90\xaf\xdb\x46\xdc\xed\x1a\x71\xb7\x91\x9c\x91\xbb\x18\xfc\x33\x6d\x35\xe9\xc3\x80\x0c\x01\xce\xe7\x5a\xb7\xed\x0a\x3d\xca\x19\x55\xae\xab\xd9\x9c\xe2\xdb\x83\xd5\x71\x39\x9e\x0b\x87\x0b\xe6\x01\xe5\x54\xcd\xc8\x0f\xa7\xc7\xa8\xff\xd6\xd4\x70\x21\xfd\xa3\x03\xa7\xa4\x0e\x20\x88\x8a\x59\x7b\xb5\xb5\x59\x8d\x75\xe3\x0a\xeb\xb6\xd8\x75\xad\x6c\xac\x99\x4e\x4c\xd6\x96\x25\x2e\x71\x14\x88\x11\x11\x1a\xf8\x43\xd0\x9c\xe9\x82\x26\x56\xfa\xb9\x3b\x20\x50\x1b\xd5\x4f\x0c\xac\xe5\xe2\x82\xa0\xa5\xa8\xf0\x9d\xfd\xfd\x7b\xf3\x07\xb2\xdf\x92\xfb\xae\x98\xc8\x7b\x65\x32\x5a\x8a\x64\xf2\x44\x56\x7c\x09\xf1\x82\x8f\x9c\x92\x6b\xa6\x04\xcb\xaa\x9e\xa1\xbe\xc6\x84\x35\xa9\x7d\x6f\x59\x3a\xdf\xae\x70\xbe\x45\xd1\x7b\xf3\x16\x40\x6d\xcb\xe5\xdb\x14\x21\x2f\xe9\x8b\x32\xc2\xb3\xc9\x4e\x69\xe6\xda\x65\x35\x1c\xbc\x75\x65\x68\xab\xa6\x3e\x75\x14\x08\x84\xb0\xdd\x88\x77\x73\x8d\xfa\xbb\x73\x13\xf9\x96\xd4\xa1\x20\xcf\x47\xb0\x1f\xea\x2a\xf2\x0a\xcb\x22\x0c\xc6\xae\x5e\x70\xc3\xd4\x31\x83\x9f\x86\x9b\x77\x2d\xfe\x9d\x71\xae\xe9\x91\xb2\x13\x37\x9c\x66\x97\x45\xd3\xf6\xbc\xb5\x75\xff\xe1\xed\xe5\x61\x7d\x50\xab\x7d\xdf\x40\x52\xad\x25\xaa\xfd\x3e\x4a\x0d\xbf\x61\xc3\x89\x94\xd7\x64\x2f\x4a\xb9\x99\x94\xc3\x41\x22\xf3\x28\xbf\xab\xaf\xf9\x58\x1f\x38\xfe\xec\xdb\x79\xef\x13\x2e\x00\x8c\x6d\x11\xc4\xce\x3f\x24\x09\xb3\x80\x35\x74\xb9\x49\xee\x18\x5c\x9c\x26\x08\x19\x4c\x85\x58\x87\x7d\xb0\xb8\x18\xcd\xbb\xc5\xdf\xb3\x20\xbe\x9a\x36\xc6\x1c\xba\x95\x6a\x68\xce\xaf\x85\x24\x93\xaa\xed\x7f\x07\x74\xf8\x5b\x35\x5a\x8c\x1d\xc2\x47\x35\x58\xd3\xca\xce\x08\x81\xb2\x5d\x68\xaf\xe0\x7e\xba\x1b\x3b\x9d\xeb\xe5\x28\x34\x2b\x26\xa1\x70\x4c\xc4\xb1\xf3\x21\x8b\xab\xc4\xa2\x82\x8d\xf9\x42\x31\x27\x30\xa3\xa9\x1e\x55\xfe\x13\x9f\x45\x36\xca\xe8\x18\xe0\xd9\xe7\xaa\x2e\x40\x3a\x42\x0b\x62\x6b\x3b\x44\x37\xfb\xd2\x3a\x0f\x3d\x0c\xc8\x87\x1a\x13\xba\x7d\x20\xcd\xa5\xe7\x43\xfc\xff\xd0\xce\xdb\xf7\x52\xaf\xe5\x7a\x83\x95\x1f\x8a\x0b\xb5\xe5\x1d\x8c\xdc\x5b\x9b\x3d\x26\x30\x8a\xce\xbd\xaa\x27\x33\x64\xc7\xa0\xc0\x87\xdf\x53\x92\xf3\x8f\xf6\x29\xf1\xaf\xe2\xac\x72\xd7\x0b\x79\xf9\xd7\xfb\xd6\x96\xa9\x0c\x9f\x9e\x5d\xc5\xf8\xce\x08\x16\x58\xc0\x17\x67\x98\x16\x8e\x2f\x10\x87\x09\x1c\xc2\x6f\x1b\xfe\x6e\x8e\xcb\x11\xc2\x74\x1d\x6d\x75\x08\xd7\xb9\xe1\xec\x42\xfb\xf3\xb7\x4d\xf8\xce\xde\xd2\x45\x08\x6f\xf1\x90\xdd\xfc\xb3\x99\xb4\xc9\x1f\x54\x53\x9e\xb0\xc3\x24\x91\xa5\x68\x95\x3e\x78\xcc\xec\x2b\x50\xc3\xd2\xcb\xda\x98\xe8\x6f\x4e\xe1\x5b\xac\x98\xa6\x19\xa7\x58\x53\x5f\xbf\x13\x8b\xa9\xaa\x71\xc0\x5f\x3d\x37\x43\xc7\x32\xd8\x6e\xf7\xd3\x24\xa4\x2e\x3c\xbf\x5d\x92\xe5\xe2\xdb\x2c\x9e\x70\x73\x14\x74\xae\xea\x85\x74\xe7\xd5\x72\xcd\x0d\xd5\xd7\x15\xd2\x00\x83\x72\x93\xb0\x99\xa2\xcf\xdd\x8b\xf6\x29\x3e\xb5\x11\xfa\x40\x03\xea\x1a\x2b\xf7\xec\xcb\x1f\xea\xd7\xff\x75\x7c\xd6\x2e\xe5\x37\x80\xac\x63\x1d\xc3\xc4\x0d\x1d\x74\xed\xb8\x7c\x3c\x2e\x43\xb3\x4f\xee\x11\x45\x1d\x7e\xac\xeb\x1d\x92\x31\x8a\x3e\x0d\xb2\x17\x65\x64\xef\x0f\xac\x4c\xaf\x42\xbd\x28\xea\x5d\xab\x8f\x9c\x51\xa1\xa3\x52\x43\x06\x43\xfb\x74\xc6\x30\x1f\x3c\x08\xdd\x6a\x3b\xf3\x7f\xcf\xfb\x2c\xeb\x77\x60\xeb\x7f\x52\x1a\x6d\x3f\xc7\x87\x7b\x81\xb9\xc2\xe3\x15\x1b\x73\x6d\xd4\xcc\x37\x21\x19\x45\x93\x70\x5e\x99\x70\xcb\x35\x9b\x91\xbf\xfd\x78\xf2\xf7\x7f\xbc\x79\x77\x74\xf8\xe6\x1f\x6f\x0f\x8f\xfe\x76\x7a\x76\xf2\xe1\xc3\xe5\xdf\x2f\xaf\x4e\xde\x7e\xf8\x70\x54\x2a\xc5\x84\x71\x65\x97\x97\xcc\x7c\xf8\xe0\x38\x55\x7f\xf8\x70\x95\x14\xbc\xf8\xf0\xe1\xdc\x3b\x31\x10\x5e\xf8\xbf\x8e\xcf\x40\x7e\x62\xf5\x4f\x48\xb9\x81\xb3\x15\x89\x0e\xf3\x9e\x50\x5d\xa5\xd7\xd5\xea\x2a\x1a\x40\x52\x35\x3d\xee\xf4\x84\x2a\xe6\x8e\xe6\x33\xef\xc9\x6a\xb5\xd9\xed\x80\x55\x5f\x00\xef\x21\x0d\x5e\x32\x32\x64\xe6\x86\xb9\x72\xb5\xf9\x63\x2e\xce\xe2\xfd\x19\xdb\xe3\x60\xb2\xbe\x3d\x8a\x96\x60\x8f\xa3\x72\x26\xc9\x94\xb3\x1b\xc4\x46\xc0\x36\x2f\x15\x00\x3e\x94\xaf\x62\x09\xe3\x7c\xb8\xcb\x29\x49\x85\x4c\x03\xd8\xff\x9c\x5b\x77\xc1\xa5\x5b\x2b\x97\x40\xe4\x12\x96\x92\xf3\xd3\x63\xf2\x72\x80\x4a\xce\xe9\x31\x02\x29\x2d\x23\x2b\x49\x1c\xda\x8f\x3d\x50\xf1\xf4\x5d\x92\x2e\x5e\x31\x40\x13\x61\xd4\x80\x03\xca\x61\x2a\x73\xfa\xd0\xb6\x1e\xf7\x14\x1e\x60\xd3\xa5\xdf\x4a\x9a\xa1\x0e\x70\x2e\xd3\x45\xc9\xb4\xf3\x8d\xff\xe8\xdb\xc1\x37\x61\x1e\xdf\x0e\xbe\x81\x76\x4e\x9e\x6c\xdf\x0e\xf4\x34\x19\x7c\xe3\x0a\x61\x89\xbb\x69\x69\x76\xe8\x42\x55\x8b\xd3\x67\xf1\x37\xf0\x6c\x0a\xfa\xee\x27\xa9\x53\xe8\xb0\x2f\x56\xc7\xdd\xb0\x50\x0b\x84\x1a\xdb\x44\x31\xea\xda\xb5\xa7\x2c\x63\x26\xea\x6f\xbf\xf6\x76\x4c\xb7\xf7\xa7\xf2\xa1\xaa\x5a\xf7\xae\xd8\xb9\x14\xf4\xa5\x3f\x7c\x93\xaf\xd8\x60\xf8\xb2\x6a\xc0\xda\x60\x03\xb4\xac\xc8\x7f\x50\xd8\xc6\xc8\x8c\xe1\xfa\xb4\xd9\x29\x4b\x0b\xa2\x76\x75\x3c\x7a\x13\x42\xac\xa3\xea\xf8\xca\x43\x71\x59\x8e\xb8\x0a\xf3\x07\x4b\x03\x9b\xd7\x60\x6c\x12\xbf\x81\x32\xa5\x19\xb1\xa7\x96\x41\x4f\x46\x5c\x09\x68\x14\xb4\xd9\xf9\xe6\x9a\xcd\x7a\x08\xdc\x80\x4a\xc8\xb7\x11\xa6\x60\x28\x7d\x95\x85\x1d\x50\x2a\xf2\x8d\xff\xaf\x6f\x1f\x6a\xad\xb5\xf0\xa3\xb6\xf1\xa2\xe2\x4b\xb5\x0e\x5d\x9d\x60\xfd\x43\x1d\xc9\x01\x29\xeb\x4a\x23\x8c\x44\x72\x0d\xc8\x09\xd4\x37\xa2\x46\xea\x70\xd5\xb2\xac\x76\xb3\xf6\x3d\x92\x6a\x28\x00\xe0\x7f\x89\xea\x22\xce\xe4\xa5\x2b\xa9\x03\x64\x96\x11\x53\xd5\x27\x20\x60\xce\xe4\xc9\x47\x96\x94\x0f\x45\x4b\xc1\xab\x95\xef\xef\x9a\xb5\xef\x5a\xf1\x23\x0b\xa8\x35\x48\x1b\xab\x85\x87\xac\xf8\x6a\x77\x46\xa9\x59\x77\xd3\xf6\x9a\xcd\x74\x00\x03\xbb\xc6\xd1\x5d\xf5\x6a\xe0\x5f\x7f\x90\x9d\x7c\xe4\xda\xe8\xff\xe3\x5b\x66\xe4\xc3\xaa\x59\x09\xc5\x1c\xa9\x6a\x74\xbf\x24\x02\x7a\x69\xe0\x63\x3e\x35\xc1\xfd\x0b\xb4\xa6\xfa\x3b\x4f\x89\x08\xea\x8d\xda\x77\xda\xd5\x2e\xbb\x47\x0a\x28\x51\x8a\x31\xc3\xaa\xbc\x14\xfc\x31\xf2\x27\xd2\x10\xe8\x72\x62\x95\xbc\xfa\x31\xe3\x3e\x72\x37\x71\x40\x8f\xe0\x53\x9a\x31\xb4\xeb\x6f\x78\x96\x26\x54\x61\x88\xdc\x01\xc7\x68\x07\xe5\xe8\x10\x13\xec\x19\xe7\x24\x59\xb5\xca\xda\xc5\xe2\xa8\x32\x3c\x29\x33\xaa\x88\xdd\x8f\x63\xa9\x1e\x88\x2f\x83\x57\xbb\xd6\x2d\x81\x45\x5b\x74\x34\xac\xcb\xf7\xf9\x11\xe7\x01\xf9\x9c\xf6\x62\x4d\x26\xa8\xed\xa8\x6f\x94\xbd\x3a\x14\xa4\x1c\x79\xd9\x14\x04\x45\x0c\xe9\x66\x6a\xce\x71\x3e\x06\xff\xf7\x7e\x74\x78\x84\x9d\x39\x20\xdf\x87\x32\xdf\x1e\xa9\x7c\xc6\x50\x4c\xe8\x9e\xe9\xb6\x8d\x5b\xae\x6a\x53\x8f\xa4\x82\x3e\x3c\x7b\xa9\x84\xdf\xb0\x29\x4f\xcc\xfe\x80\xfc\xbf\x56\x53\x04\x27\xb2\x57\x27\xdd\x36\x0b\x05\x94\x15\xb0\xdc\x0b\xb2\x07\x3f\x8b\x55\xc9\x7d\x1f\x28\x72\x9d\x07\x9e\x58\x36\x4a\x8b\x10\xf5\x92\xf0\x74\x4d\x8c\xa2\xa6\x38\xc7\x1a\xe1\xe4\x97\x41\x42\x06\x99\xc8\xb5\xdb\xa5\x35\xcf\x6d\x88\xb3\x78\x11\x1a\x18\xe7\x5f\xe0\xa3\x27\x8a\x8d\x61\xff\xe1\xee\xf9\x84\xbb\xcf\xc8\x42\x66\x72\x3c\xbb\x2c\x14\xa3\xe9\x91\x14\xda\x28\x10\x0d\x6d\x70\xbc\x6e\x1b\x33\x6a\xfd\x30\x91\x37\x84\xba\x3a\x64\x39\x42\x50\x35\x59\x8e\x27\x08\x76\x0b\x3f\xf4\x6d\xd2\xfc\x14\x9d\xd1\xa9\x07\xe4\x32\x80\xd9\x02\x83\x07\x6c\x5c\x18\x05\x1c\x1e\x37\x74\xe6\x36\x13\x1d\x42\xb7\xdc\x2a\x21\xc8\x4f\x06\x43\x3f\xb7\xbe\x3f\x48\xe5\xc3\xb3\xe3\x87\x22\x08\xaf\x51\xa1\xbd\xe5\x55\xa2\xde\xf9\xd0\x42\x2d\xd0\x37\x68\xa4\x40\x37\x9a\x4b\xa7\xa9\x22\xe6\xa8\xa7\xcc\x27\xd4\x4d\xdb\x80\xec\xe4\xf4\xe3\xe5\x35\xbb\x69\xf0\x4b\xff\xa2\x3f\xb2\x87\xe7\x72\xf5\xc1\x1e\x7d\x2f\x34\x35\x5c\x8f\x00\x6a\xfc\x13\xea\xe3\x90\x72\xdf\x0c\x11\x19\xaf\x7a\xe5\x4a\x3c\x5a\xe8\x96\xec\x71\xf5\x6a\xcc\xe2\xf2\xef\x2a\x3b\x08\x0f\x40\x2c\x01\x08\x60\xca\x76\x07\x25\xae\xc1\x80\x91\x55\x1c\x1a\x23\x15\xa1\xd7\xb0\xdf\xb5\x66\xc2\xb8\x9a\x83\x50\x9d\xdb\xfb\xcd\x05\x63\xe3\x54\xb6\xb6\x79\x61\x40\x9e\x93\x8f\x56\xf3\xd0\xcd\x32\x8d\xf0\xaa\xf7\x07\x99\x1b\x14\xc3\x63\x3e\x81\x72\x6e\x19\x6a\x38\xdd\x60\xf6\xc6\x9f\x34\x95\x73\xd5\xd5\xae\xc3\x10\x69\xd7\x65\x88\x2c\xc9\x33\xbe\xf5\xf5\xe7\xc0\xbe\xe3\x6a\x35\xe7\x14\xd2\x3d\x54\xe0\xd1\x81\x4d\x45\x75\xb0\xbb\xc6\xaf\x59\xd0\xe6\xac\x51\x64\x6f\xc2\xdf\xb5\x85\xf2\x6f\xd1\xa5\x88\x74\xd0\xa9\x88\x80\x2c\xbb\x6e\x20\x01\xe3\xdf\x7b\x62\x35\x1e\xa4\x7d\xcf\x22\xd2\xdc\xa0\xae\xae\x1a\x43\x5d\x57\xa6\x35\x72\x56\xcd\xb4\xae\x84\x5d\x65\x58\xb7\x7a\x76\x07\x8d\x3c\x48\x4b\x1b\xb7\xba\x6a\x84\x90\x0f\xb0\x76\x29\x04\x98\xe4\xc8\xef\x8e\xa5\x36\xef\xa9\xe8\x91\x33\x69\xec\x3f\x91\xf9\x7b\x2c\x99\x3e\x93\x06\x3e\xd9\x08\x52\xe2\x2b\x74\x48\x48\x67\x9c\x21\xae\x17\xc8\x4d\x17\xa2\xb5\x27\x9e\x27\xd8\x12\xc3\xe2\x54\x10\xa9\x3c\xc5\x82\x75\xa1\xdd\x10\x71\x58\xc1\x81\x23\xdd\x6a\x9c\xd8\x71\x62\x3a\xdf\x31\x9c\x1b\x0a\xb2\xbf\xf0\x1b\x00\xc9\x2c\x32\x48\xd0\x4f\x4b\x85\x58\xa5\x56\xd7\x34\x6c\xcc\x13\x92\x33\x35\x86\xc6\x87\x4d\xf2\xea\xe3\xab\xfd\xb9\x82\x57\xcb\xd3\x25\x9e\x4c\x0b\x5e\x82\x23\x1b\x54\xac\x0e\x55\x00\x1c\x0f\x8f\xb5\x9c\x82\x25\xf5\x3f\xc1\x07\xfd\xbf\xa4\xa0\x5c\x01\xb6\xa9\x8b\x1d\xc7\xdf\xb9\xe8\x4b\x3c\x8c\x1d\x61\xc1\xb7\x44\x05\x61\x58\x08\x64\x47\x9f\x57\x3c\x7a\xe4\x66\x22\x35\x1e\x86\xc1\xfd\xb1\x73\xcd\x66\x3b\xbd\x05\xd6\xdb\x39\x15\x3b\x55\x60\xb8\xc6\x6c\xe1\x10\x86\x0c\xc2\x1d\xf8\x6e\xe7\xf1\x74\x95\x56\x87\x6d\x17\x20\xf3\xf3\x13\x6a\xc8\x57\xce\xe6\x69\xdf\xcb\xfd\x2d\x0e\x14\xd9\xe7\x18\x13\x1c\x2b\x16\xf5\x71\x07\x45\x3d\xc7\x38\x67\x29\xd8\x94\xd9\xc5\x4a\xb9\x76\x40\x6e\x3e\xc5\xe0\x9f\x0b\x26\xd1\xff\xff\x58\x9e\x49\xe3\xad\xf6\x7f\x7a\xb7\x17\xf2\xdf\x47\x9e\x97\x39\x22\x26\x19\x6b\x29\xa4\x7c\xe4\x01\x5f\x7d\x66\x43\xdd\x5e\xa8\x9b\xad\x8e\x8f\x0d\x55\x63\xc8\x70\x74\xf6\x82\x67\xb3\x71\x26\x87\x34\x23\x39\x17\xf6\x31\x03\xf2\x5a\x2a\xc2\x3e\xd2\xbc\xc8\x18\x96\x93\x91\x2f\xfb\xff\x96\x82\x11\x17\x0d\xef\x11\x4f\x0b\x97\x24\x61\x24\x79\x89\x5c\x5b\x01\xbf\x87\x54\x87\x9a\x01\x16\xdc\x16\x9a\xbc\x3c\x78\x79\xf0\xe2\x15\xf9\x9d\xd8\xa1\x5f\xba\x7f\xbf\x70\xff\x7e\x49\x7e\x27\xbf\x13\x42\xce\x09\xa9\xfd\x4b\xe0\xdf\x3e\xe1\xa3\x78\x0e\x2f\xed\x34\x13\x99\xbb\x17\x06\x4f\x6e\xa8\xfa\x0c\xfd\x63\x8c\x74\x43\x43\xd1\x4f\x22\x73\x06\x73\x78\xf9\x7f\xfc\x3d\x10\x70\x35\xd8\xe2\x07\x26\xb5\x07\x53\xda\x27\x37\xe0\x9a\xca\xe9\x35\x9a\x65\x87\x89\x29\x69\x66\x1f\xbe\xf7\x45\xff\xc5\x3e\x91\xa2\x7e\xfb\x94\x4b\x68\x8d\xee\x66\xb8\xf7\x72\x7f\xb0\x30\xe5\x2f\x96\x4c\x79\xae\xdb\x8d\xab\xb9\xb3\x83\xde\xce\x35\x9e\x61\x0e\xc5\xec\x86\xce\x02\xdb\x78\xb3\x74\xcc\xa7\x01\x1b\x3d\xc2\xa1\x80\x98\x1d\x70\x01\xf7\xc8\x40\x38\xe8\x8c\x70\x33\x20\xa7\x66\x77\xd7\xf7\x56\xb2\x1a\xb3\x07\x71\x3f\x8e\xe1\x02\x81\xf0\xb0\xe8\x2f\xe6\x72\x7a\x5b\x34\xd6\xef\xc4\x39\xfa\x20\x14\x76\xf7\xf4\xca\xbf\xd1\x81\x53\x3d\x8c\xe5\x77\xb0\x15\xfd\x72\x84\x75\xb2\xd8\xe9\x68\x00\x6d\xac\x1c\xed\x5d\xc2\x08\xaa\xce\x6e\xf7\x70\x1d\xac\x27\x0e\xf9\xf7\x09\xcd\xe2\x60\x5d\x22\x01\xa0\x4d\x31\xdf\x28\x29\x4e\x2f\x0a\x7e\x29\xf2\x73\x75\x27\xa6\x15\x41\xfc\x15\x07\xfa\x16\xd3\xd9\x77\x86\x65\x72\xcd\x8c\x3f\x77\x14\x64\x44\x14\xa5\x21\x43\x9a\x51\x61\x35\x98\x05\x3f\x84\x91\x38\x18\xfe\x12\x18\x66\x09\xbf\x7c\xea\xf8\xc8\xc2\xee\x68\x2f\xf4\x7f\x9e\x1f\x32\x8a\xc8\x3a\x47\x61\xca\x68\xe6\x53\x29\x00\x1f\x3d\x00\x56\x89\xdd\xdd\x6a\x5f\xc1\xda\xa0\xf0\xab\x1c\xac\x56\x2e\xd4\xe4\x3e\xd9\xf3\xb9\x8f\xc4\xb0\x2c\x43\xee\xa9\xfa\x92\xd9\x4d\x16\x37\x3a\xe3\x30\x42\x5d\x06\x2c\xfd\x61\xbd\x3b\x1a\x06\xf5\xad\x64\x17\xb3\x50\x2d\xdf\x23\x04\x5a\x03\x8e\xf9\xd4\x0a\xa5\x95\x84\x06\x0a\xc6\x09\xcb\x0a\xa2\x58\x5a\x26\x38\x38\x21\xfa\x9a\xdd\x58\x9d\xaa\x7a\x53\xd7\x52\xc8\xb3\xec\x4e\x8d\xa8\x3b\x88\x11\x2d\xea\x22\x91\x8f\x80\x21\x7d\xc7\x4d\x36\x65\x6a\x46\x0a\xa9\x35\xb7\xeb\x00\x7b\x09\xb2\xe1\x40\xef\x0a\xc8\x3a\x90\x89\x05\xd3\xf2\x62\x78\xc7\x89\xdd\x1d\x2b\xa8\xb5\xac\x6d\x8f\x4f\x73\xd4\x7d\x69\x8f\x99\xbb\x8f\xba\x73\xf8\xdf\xe2\x91\x77\x3a\x22\x4b\x78\x30\xcc\xa5\xc6\x3c\x0f\x39\x05\xbf\x80\xc3\xea\xcb\xfd\xe8\x30\xfc\xf2\xe0\x8b\x83\x97\x7b\x76\xae\x5f\xec\xdb\x59\xd7\x8e\xb9\x97\xe1\x98\x0b\xbf\x74\x33\x62\xba\x76\xd0\x59\x03\x0c\x1b\xe8\x4a\x95\xba\x08\x8f\xcf\xa2\xb3\x33\xd2\xc6\xc5\xdb\x78\xee\xe5\x4b\x0f\xf8\xae\x62\xd6\x1b\x09\x3b\x07\xce\x5b\x6e\xc8\x67\xb9\x54\xec\xb3\xe8\xfe\x5b\x0f\xa8\xe6\xe7\x4e\xdb\x7e\x6a\x19\xd7\x06\x9a\xaa\x5d\xb3\xd9\x83\x35\xdd\x36\xee\xf5\xb6\xce\xf5\xc5\xb7\x40\x82\xe4\xb4\x78\xc0\x38\xae\x6f\x7b\x9b\x14\xde\x37\xce\x31\x1b\x5a\xc0\x83\xe3\x11\xb5\x22\xd7\xd7\x14\x6b\xa5\x42\x3e\xed\x90\x65\x12\x71\x4e\x5d\xea\xc0\x03\x52\xf5\x03\x2c\xbc\x36\x52\xd1\x31\x3b\x70\x8f\x7d\x2a\xed\x20\x5c\x17\xf8\x9a\x97\x09\xcb\x19\x1d\x48\xaa\x4f\x69\xf6\xf1\x07\x90\x02\x34\x81\x6c\x40\x20\x64\x0d\xce\x21\xca\x33\x7c\x22\xa1\xac\x06\xd5\xef\x6d\x1c\xa7\xf4\x46\x9f\x64\x54\x1b\x9e\x7c\x9f\xc9\xe4\xfa\xd2\x48\xd5\x81\x76\x71\xf8\xf3\xe5\xc2\xa8\xb5\x35\x15\xe4\xf0\xe7\x4b\x72\xcc\xf5\x75\x85\xae\x8f\xa8\x9a\xf5\x04\x3c\x1a\x80\x71\x5c\x2d\x06\xc9\xa9\xb5\xff\x98\xb7\xf1\x44\xc0\xf5\xed\x6e\xaf\xfc\x89\xde\x68\x86\xd3\x1f\xda\xe9\xdb\xaf\x59\x73\x11\xbc\x36\x20\x05\x7c\x9d\xd3\xe3\x35\x04\xbe\x46\xba\x69\xdb\x11\xb2\xc0\x4c\xaf\x79\xc6\x5c\x07\x30\x80\x04\xaa\x63\x3c\x03\xd7\xcc\x64\x49\x6e\x28\xfa\xac\x40\xa6\x0e\xc8\x15\x2f\x5e\x91\x93\x08\xaf\x15\x0b\x12\xea\x43\x59\x7d\x23\xe0\x87\xb8\x2c\x01\xe0\x32\x74\x5d\x59\x11\xec\xb2\x62\xc8\x09\x2a\x53\xfa\x15\xd9\x61\x1f\xcd\x57\x3b\x3d\xb2\xf3\x71\xa4\xed\x3f\xc2\x8c\x00\x5d\xd9\xf5\x68\xb0\x4a\x9d\x18\x31\x55\x19\x30\xf8\x83\xc5\xd2\xc1\xee\x99\x94\x5c\xbd\x3b\x7e\xf7\x0a\x14\xf8\x54\x92\x1b\xe6\xbb\x98\xf9\x42\x58\x27\x0d\x23\x32\x40\x45\x47\x22\xf3\x42\xc9\x9c\x47\xe9\xaa\xb0\xc9\x9a\xf0\x3c\xe9\xc2\x5f\x0a\x49\x69\xb0\xfc\x9d\x70\x10\x64\xfb\xfa\x21\xe7\x80\xe1\x6f\xe3\x9f\xd3\x11\x91\xe8\x94\xaa\xe7\xc8\x73\x1d\x6e\xb2\x1c\xe3\x46\xc1\x76\x5c\x15\x8f\x58\xf5\xdb\x7d\x75\x90\xb2\xe9\x81\x4e\xe9\xcb\x1e\x3c\x06\x19\xc0\x81\xdf\x87\x39\x51\x4d\x76\x5e\xee\x0c\xc8\xa5\xef\x6b\xde\x8b\xe7\x58\xdd\x67\xad\x01\x3f\x20\xb8\x55\x5f\xec\x90\x3d\x4c\x52\x07\x9d\x22\x63\xbe\x64\x39\x60\x6c\x80\x0f\x7f\xbf\x91\x0a\x49\x3a\x70\x5f\x90\xd6\x2e\x0c\xe2\x5a\x86\xbd\x13\x59\xe3\xd0\xde\x5c\x55\x95\x5b\x83\x1d\x03\xdd\xb7\x8c\x84\x0a\x02\xe6\xfa\xc1\xa2\xa8\xb8\x70\x4f\xac\x08\xc9\x85\xd3\x4e\xde\xda\xc5\xc7\x2e\xf0\x30\xc0\x9d\xcc\xb2\x03\xd5\x47\x3b\x1b\x73\x26\x91\x0e\xaa\xb9\x49\x38\x5a\xba\x59\x8f\xf7\x82\xff\x56\x32\x72\x7a\x1c\x7a\x36\x32\xa5\xb9\x36\x56\x72\xa5\x35\x1d\x81\xa3\xe2\xb0\x77\x98\xd3\x7f\x4b\x41\x4e\xbe\xbf\x74\x53\xd9\xdf\x40\x02\x37\x14\x80\xf4\xdf\xa5\x62\x56\x35\x6a\xad\x87\x1d\xfa\x91\xe6\x75\x2f\xfb\x39\x39\xa6\x86\xa2\x0a\x86\xd2\x4c\x56\x15\xa6\xb0\x13\x86\x90\xf9\xe3\xcb\x87\x1b\x6a\xd1\x64\xfd\x6a\x90\xe5\xa0\xb3\xe6\x98\x52\xf6\xe7\xef\x2f\x4e\xd7\xa0\x44\x25\x70\x0a\x8f\xdf\xca\xb4\x23\x4d\x0a\xe0\x3d\x8e\x70\x54\x92\xdb\x61\xc9\x99\x14\xac\x07\xc2\x8e\x58\x69\xe7\xfe\xf3\x67\xc5\xcd\x43\x2b\x26\xab\xab\xf5\xf1\xef\x57\xac\x93\xb7\xb6\x87\xff\x59\x54\x19\x0f\x30\x0e\x20\x55\x9c\x22\x30\xcc\xe4\x90\x38\x69\xb0\xce\x37\x7e\x7f\x71\xda\xd9\x0b\xbf\xbf\x38\xdd\xdc\x97\xed\xd0\x38\x98\xb7\x0d\x2a\xfd\xad\xc2\x5e\x9d\x57\xfa\x57\xd7\xf8\x07\x5d\xe9\xfa\xeb\xa2\xf4\x35\x17\x8d\xb3\xc2\xea\xa2\xe3\xc4\xd7\x47\xba\x48\x0d\x94\x64\xa7\xaf\x48\x5e\x66\x06\xca\xdf\x80\xb1\x2c\xa7\x69\x7b\x7a\x7b\x16\x23\x0e\x0a\x82\x90\x63\x86\xe1\x85\xf4\x95\x4f\x48\x08\xbf\x58\xfe\x83\xb7\x54\xd0\xb1\xbd\x1d\xce\x43\x92\xe3\x9f\x11\x47\xef\xa1\x03\x5d\x84\xaf\xe8\x94\xf2\x8c\x0e\x79\xc6\x0d\xb4\xff\xdf\x1f\x78\x45\x4c\x63\x2d\xac\x9d\xf2\xda\x84\x5a\xa7\x2a\x6c\x5c\x1f\x04\x0a\x26\xd9\xb3\xe3\x1f\xdc\x58\xc1\xbd\x3f\xa8\xb4\x57\x40\x23\x83\x44\x79\x54\x71\x6b\xaa\xad\x47\x79\x98\xd3\x6c\xdb\xb1\x6b\x53\xb5\x12\x96\xf9\x75\x43\x08\xe8\x45\xb5\xc7\x8e\xb4\x54\xed\x81\x2f\x1c\xe8\xc4\x33\xd7\x7c\xb0\x83\x54\x0b\xdd\x07\xb6\x4c\xc3\xdf\xb7\xd5\x7e\xb6\xfb\xe5\xfe\xab\x5a\xe0\x4e\xa8\x14\x83\x08\xe1\xd0\x73\x69\xd2\xb8\x83\x2e\x9d\xa8\xf6\xe0\x42\xa0\x5d\xd9\x7d\xd3\xa4\x88\x02\xaf\xd6\xd2\x35\x70\x6a\x27\x84\x40\xd8\x95\xc6\x1b\xa7\xe5\xfb\x24\xac\x98\x8c\xda\xd7\x40\x1e\xb1\x62\xf2\xfa\xb2\x1e\x4a\xb1\x9f\x91\xd7\x97\x4b\xe4\x1e\xe6\xca\xd8\xf7\xd6\x18\x60\xd9\xd5\x24\xe3\x23\x66\x78\x23\x22\xac\x59\xf2\xe5\x52\x70\x23\x95\x5e\x47\xcd\x87\x7b\x74\x37\x7a\xd7\x85\x27\x04\x79\xeb\xc6\xc5\x84\xcf\x44\x66\x19\x4b\x8c\xeb\x79\x08\xcb\xea\x1f\xbc\xcc\x11\xe2\x52\x01\xb4\xef\xf1\xeb\x9c\x1e\x07\xc8\x6a\x07\x17\x27\x87\xc7\x6f\x4f\x06\x79\xfa\xa7\x89\xbc\xe9\x1b\xd9\x2f\x35\xeb\x73\xd3\x4e\x57\x5a\x63\x51\x48\x07\x0e\x68\x33\xe9\x66\x01\x2b\x44\xa2\xf7\xba\xc2\x0c\xf3\x81\x5f\x25\xa5\x59\x44\x0d\x1b\x95\x59\x86\x6b\x6a\x14\x63\xbd\xd8\x9d\xf8\x40\x4c\xb5\xea\xda\x2c\xfd\x75\x77\x79\x5f\xdf\xee\x8f\xe6\x4d\xd9\x0c\xed\x4f\xf9\xa6\xaa\x31\xb9\x83\xf6\x97\x61\x64\x9f\xd0\x67\x19\xdf\xae\xc4\x35\x9b\x11\xc8\xee\x1f\x49\x05\x48\x9b\x75\x2e\x64\x26\x01\x72\x1d\x40\x4b\x45\xa7\x2b\x6c\x08\xa9\xdb\x68\x11\xf0\x22\x17\x6c\xf4\x38\x84\xbe\x60\x23\x2c\xa0\xf0\x39\xce\xce\xba\xa0\xa5\x99\x60\x26\x24\x22\x1f\x21\x39\x97\x52\xde\x55\x64\x6c\x08\xa9\x5b\xe5\xd2\x77\x51\xef\xd5\x06\x78\x9f\x2c\xac\x57\xec\x26\x74\x8b\x64\x1e\x1c\x57\x90\x53\x6b\x5b\xb2\x9b\x83\x1b\xa9\xae\xb9\x18\xf7\x6f\xb8\x99\xf4\x91\x52\xfa\x00\x70\xd8\x0e\xfe\x04\xff\xb8\x68\xed\x61\x9a\xba\xcc\xb2\x52\xb3\x51\x99\x61\xce\x97\x1e\x10\x5a\xf0\x9f\x98\xd2\x90\xc2\x78\xcd\x45\xda\x23\x25\x4f\xbf\x6b\xba\x62\xa4\x8b\x0d\xd2\xbc\x8b\xd8\x9d\xe7\xa2\xf2\xe2\x47\xd1\x54\x6a\x44\xe1\xb5\x24\xaa\xb1\x3e\x4d\x73\x2e\x36\x85\xf3\x9b\xaa\xf6\x5c\xa4\xcd\x28\x58\xa7\xde\x11\x8c\x53\xd7\xed\x71\x6c\x1f\x33\x0e\x59\x34\xd4\xfb\x32\xb0\x4b\x95\xcb\xa7\xa9\x67\xd3\xac\x24\x50\xf2\x99\xfe\x2d\xeb\xe3\x53\xfa\x45\x5a\xd1\x75\x9b\x1a\xf3\x90\xeb\x31\x53\x63\xba\x75\x7f\x7f\x82\x84\x97\x47\xe5\x31\xb2\x55\x7b\xd7\x40\xeb\xf6\x9a\xee\x23\xe8\x5f\x80\x03\xaf\x7d\x71\x32\xa8\x57\x28\x7b\xbc\x6f\x0b\x3b\xf3\x05\xe0\x61\x5f\x66\x94\x48\x21\x1c\x26\xdd\xbb\x82\x89\x4b\x43\x93\xeb\x96\x71\xd1\xad\xce\xf4\x07\xd3\x99\xba\xcd\x95\xf1\x69\xd0\x69\xe0\x51\xac\xa2\x72\x29\x65\x55\x96\x34\x6e\xec\x27\x28\x75\x11\x61\xfd\x2d\x2d\xda\x7b\x40\xfd\x48\x73\x8a\x52\xf8\xd8\x39\x3d\xa1\xaa\xa6\x90\x45\x99\x21\xe4\x1a\xd7\x8e\x8e\x9f\x5e\xb1\x69\xbb\xc1\x9d\xbe\xdc\x5d\xce\x48\x25\x43\x73\x99\x32\x32\xe4\xa6\x92\x8e\x9a\x19\xac\xdd\x75\x40\x34\x52\x90\xc4\x81\xcd\x81\xd6\x61\x35\x0c\x37\xa1\x48\x23\x11\x44\x26\xc6\xd7\xfc\x85\x32\xdf\x17\x2f\x5e\xbc\xc0\xa2\xcb\xbf\xfe\xf5\xaf\x44\x2a\xe8\xf8\x90\xf0\x7c\xf1\x46\xb8\xeb\xcf\x2f\x5f\x0e\xc8\xdf\x0f\xdf\xbe\x81\xdc\xff\xc2\x68\xc4\x01\xc7\x91\xed\x0d\xb5\x1f\xeb\x1e\xf9\xbf\x97\xef\xce\xbc\xda\xa8\xe7\xbe\x05\x53\x3b\xbc\x5e\x1d\x7d\xf1\xc5\x5f\xbe\xfa\x6a\x40\x8e\xb9\x82\xda\x27\xce\x42\x6b\xae\xe0\x2d\xa1\x8a\x61\x91\x28\x40\x04\x7a\xbd\x8a\x07\x10\x7d\x87\x9f\x80\xbd\x07\xb1\x9e\xd1\x72\x60\xc6\x13\x83\x65\x56\x28\xc8\x42\x57\x61\x00\x6e\x74\x50\xa8\x2e\x59\x17\x26\xd7\x23\x19\xbf\x66\x64\xa4\xa1\x25\x67\x55\x4c\xef\xda\xdd\xb8\x92\x12\x1c\xac\x5a\x2b\xcd\xcc\x13\xcf\xfd\x6c\xe5\x0b\x9e\x07\x30\xae\x35\x5c\x83\x52\xcf\x6b\x36\xeb\x23\x87\x15\x94\x87\x82\x11\x48\x8e\xab\xf5\x58\x08\x5e\x9b\x34\x92\x2b\x1e\x63\xb1\x50\xf2\x5f\xb8\xf8\x50\x43\x1a\x49\x62\xa8\x44\xc5\x16\xb5\x00\x96\x20\xa2\x86\x1d\xbe\x0e\xd6\x35\xf5\xf2\x1f\x3b\xa4\xd0\x45\xb8\xe5\x8c\x6b\xfb\x88\x6b\x36\xd3\x77\x3d\xb9\xea\x15\x63\xf9\x53\x23\xa7\x94\x62\xe1\xd7\x0e\x79\xdf\x49\x46\xd7\x64\xc1\x21\xde\x54\x63\x60\xf9\xbf\x2b\x84\x76\xf7\x7a\x2a\x05\x42\xd4\xd2\x95\x35\x33\xa5\x23\x0d\xe4\x9d\xdb\x67\x43\x03\x00\x78\xc3\x9c\xaa\x6b\xe6\x3b\xf3\xd2\x6c\x40\xce\xed\x24\x03\xe4\x48\x68\x8c\x0c\x76\x2b\x9d\xc1\x63\x9d\x92\x06\x0f\xd9\x1d\x0c\x76\x71\xe3\x49\x45\xb4\xa1\xca\xed\x22\xfb\xf9\xf3\x40\xb1\x7a\x4b\x0b\x8d\xa8\x2a\x56\x2b\x05\xc4\x21\x09\x48\xad\x66\x52\xf5\x05\x44\x5a\x6f\x91\xa7\x48\x1f\x08\xd3\x78\x80\x4d\x44\x9d\xba\x72\xb2\xc1\x48\xbf\xbd\x37\x02\x0b\x29\x6f\xa1\x54\xe0\xd5\x4a\xb5\x70\x30\xbb\x19\x7b\x52\xba\xc4\xf2\xb6\x1a\x4e\x52\x46\xda\xda\x5c\x33\xcf\xa7\xaa\x32\xe0\xd5\x85\xe2\x80\x57\x7b\xf5\x01\xaf\x36\x01\x5d\xbc\x16\x76\x68\x38\xa9\xf0\x30\x1a\x55\xa4\x07\xd0\xf3\x22\x1c\xf1\x46\x62\x87\x10\xdf\xe9\x46\x10\x3a\xd4\x32\x2b\x0d\xfe\xb4\xfa\x32\x3e\xe6\x60\x50\x0f\xbe\x04\x67\x5b\xb8\x2d\x3a\xf4\xe0\xb8\xc7\x73\xa2\xcd\xf9\x87\x57\x6b\x31\xd1\x59\x1b\xe4\xe7\xed\x55\x68\x4d\x67\xaf\x3b\x75\x93\xeb\xe4\x8a\xa1\x6e\x26\xcc\x65\x21\x44\x7a\x9d\x15\x9e\x56\x24\x80\xd2\xe8\x55\x34\x6c\x3b\x9e\xae\xc5\x4b\x98\x68\xde\xde\x2d\x70\x79\x4a\xf6\x42\xbb\xd1\x90\xce\x76\x2a\x0c\x53\x23\x9a\xb0\xfd\xd8\x5d\xc0\x8a\x09\xcb\x99\xa2\x59\xc8\x50\xf6\x75\xca\x13\x2a\xd2\xcc\x15\xef\x33\x05\x1b\x97\x7d\x34\x4c\x09\x9a\xc1\x23\x52\xc5\xa7\x4c\x69\xb2\xf7\x3d\xb3\xb6\x04\xb6\x29\xdd\x7f\x82\x69\xa4\xf8\x22\xeb\x70\x66\xc0\x83\xbb\x49\x00\x85\xa1\x96\x75\x4a\xac\x96\xca\x63\x16\xd9\x65\xd5\xb1\x1b\x68\x60\x37\x04\x9c\x98\x20\x74\xa1\x23\x10\x46\x23\x7d\x03\x3c\x00\x2e\x4e\x0c\x0e\x4c\xb5\x6b\x88\x07\x88\x30\x4e\x9e\x3b\xa8\x90\xb5\x95\x02\x7c\x92\xa2\x8b\xbb\x4a\x26\x46\xce\x80\x94\x53\x9e\x7a\x35\x08\xb2\x19\x2a\xd4\xad\x82\xea\xa8\x92\x9f\x6a\x2d\x5d\xbf\xcf\x68\x8d\xd0\x1c\x05\x65\xa9\x8e\x29\xed\x23\xc5\x71\xbc\x4b\x02\x32\x6b\xa3\x86\x16\xa4\x93\x03\x51\xa6\xec\xbc\x1c\x66\x5c\x4f\x2e\x3b\x0d\x6d\x9c\x2d\x19\x18\x13\x03\x17\x92\x4b\x6e\x0d\x77\x68\x26\x34\x77\xfd\xc7\x50\xcd\xe2\x56\xcb\x96\xb0\x0c\xfe\xd7\xf1\xee\x90\x50\x28\x0e\x5d\xcd\xfc\x57\xd1\x3c\x1c\x72\x07\xb6\xd3\x49\xd9\x7b\x51\xd4\x3e\x4f\x68\x96\xe9\xf9\x46\xd2\xfe\x20\x43\xcd\xd4\xa3\x79\x20\x57\x70\xcb\x30\x7e\xf6\x90\x35\x83\x52\x2c\x20\x9b\x2e\x7d\x31\x4d\x72\x89\x15\xff\x82\x48\xe1\x6f\x82\xae\x40\xfe\x07\x81\x42\x88\x37\x86\x4c\xb7\x46\x4c\xc9\x6d\x4c\xe7\xe9\xc5\x74\x3a\x8d\x0a\x5f\x86\x16\x0d\x14\x06\xee\x43\x61\x93\x6f\x34\x4b\x43\xe1\x7f\x65\x38\x0e\xee\x0b\x1f\xaf\x2d\x82\x8b\xf3\x3b\x34\x0e\x16\xb4\x1b\xbf\xed\x4f\x73\x83\x82\x2a\x66\x2d\x6f\x10\x4c\x7d\x67\x5b\x27\xd1\x4e\x72\x26\x71\xd8\xde\x8b\xe2\xac\x3a\xd3\xe1\x38\xc7\x0f\x77\x35\x49\x65\x52\x5a\x9b\xab\x22\x7b\x95\x30\xd1\x0e\xed\xfd\x79\xc1\xcf\xa6\xf2\x46\xdc\x50\x95\x1e\x9e\x37\xaa\x5a\xad\x2b\x67\xd5\x58\xb1\xea\xed\x1f\x41\xec\xe7\x74\xe8\x1b\xfe\x07\xf0\xa7\x6d\xe0\x6e\x7e\x88\xfb\xbc\x6b\xae\x0d\xf8\x6a\x71\x3a\xb2\x0d\xfd\x6d\x43\x7f\xcf\x26\xf4\x67\x47\xaa\x77\x4a\xa9\x89\x17\xe7\x90\xb5\x14\x7f\x16\x31\xa4\x48\xa4\xe2\xe9\x39\x5f\x0f\x3b\xa7\xf3\xe3\xe6\xad\xb8\x2e\xb2\x13\xbc\xcc\x05\x75\xec\x39\xc4\x9b\x36\x20\x5e\x04\xb4\x6c\x61\x0c\xe2\x75\x5b\xa9\x18\x22\xb5\x62\xe0\x39\x8a\x60\x17\x32\x7d\x85\xc0\xa9\xd0\x39\x1d\x7b\x76\xf4\x1c\x6e\x73\xcf\xf9\x2e\x44\xd4\x2b\x1c\x5b\x33\x7b\xf5\xa7\x93\x98\x40\x4b\x06\x20\x1d\x31\x01\x01\x46\x00\xea\x9c\xb7\xe1\x06\xd2\x19\x47\xd8\xab\x32\x74\xda\x8e\x34\xaf\x40\xe3\xa8\x9e\x11\x74\x32\x61\x39\xf6\x0f\x7f\xed\x49\x60\x65\xa3\x35\x1e\x0c\x43\x84\x34\xa6\x72\x4d\xe4\xa8\x57\x83\x50\xd8\x99\xbe\xdc\x69\x17\x63\x20\xdd\x85\x23\x89\xdf\x47\xe7\xad\x63\x3b\x64\x9e\x60\xe7\xb5\x90\x8e\xdd\x43\xa0\xf3\x64\xd8\xba\x78\x2e\xcb\x02\xce\x0f\xa4\xf0\xc6\x10\x67\x53\x62\xb5\xbd\x10\x35\x78\x02\xca\xdf\x36\x56\xfb\x1c\x63\xb5\xd1\xc1\xe8\x05\x9d\x23\x6c\x1c\xbf\x8d\x43\x02\x3e\x88\x3b\x64\xde\xa8\x71\x36\x8c\x8f\xe0\xfa\xf0\xad\x54\xf5\xd4\xa4\xdd\xc1\x60\x77\xd7\x07\x75\x1d\xdf\x97\x66\xd4\xff\x9a\x30\x91\xc8\x14\x99\xc5\x8e\xaf\xb4\x01\x75\xaf\xf2\xb2\xc5\x73\xc9\xfd\xb3\xe2\xf4\x26\x18\xbb\x8b\xa5\x6e\x2d\x5b\x3c\x1a\xdf\xeb\x47\x50\x62\x2a\xd5\x25\x60\xfe\x39\x12\x05\x4c\x67\xa7\xc3\xf8\xef\x35\xc9\x78\xce\x5d\xff\x30\xbb\xd1\x99\x36\x9a\xec\xe1\x87\x83\xa4\x28\x7b\xee\x86\x41\xce\x72\xa9\x66\xbd\x70\x93\xfd\xb2\xf6\x2b\x77\xc7\x3e\xf6\xa1\x28\x95\x62\xc2\x64\xb3\xe7\xac\x01\x79\x22\x6e\x88\x02\x14\xd6\xb8\x0d\x92\x47\x75\xcd\xd5\xcc\x85\x88\x2f\x78\xcb\x23\x8c\xfd\x00\xd6\xaa\x7b\x21\x24\x01\x9f\x32\x31\x25\x53\xaa\x1e\x88\x9e\xbe\xec\xea\x50\xe7\x49\xf9\x94\xeb\xb6\xcd\xfd\xc8\xed\x4e\x68\x68\xdd\x55\x9a\xa2\x34\x4e\xa2\xfb\x1d\xe8\x91\xb6\xc3\xce\x9b\x53\x0e\x5f\xee\xb4\x9e\x52\x41\x8d\x61\x4a\xbc\x22\xff\xbd\xf7\xe1\xf3\xdf\xfb\xfb\xdf\xed\xed\xfd\xf2\xa2\xff\x9f\xbf\x7e\xbe\xf7\x61\x00\xff\xf1\xd9\xfe\x77\xfb\xbf\xfb\x3f\x3e\xdf\xdf\xdf\xdb\xfb\xe5\xc7\xb7\x3f\x5c\x9d\x9f\xfc\xca\xf7\x7f\xff\x45\x94\xf9\x35\xfe\xf5\xfb\xde\x2f\xec\xe4\xd7\x15\x07\xd9\xdf\xff\xee\x3f\x5a\x4f\x9d\x8a\xd9\xbb\x96\xa2\x10\xaf\x7e\x87\x47\x72\x7d\xc4\x4e\xd8\x6f\xae\xb5\x02\x17\xa6\x2f\x55\x1f\x87\x7e\x45\x8c\x2a\xdb\x09\x93\xea\x78\xe9\x7a\xff\x57\x6a\x40\x05\x39\xef\x95\xfa\x35\x6f\x70\x88\x78\x1e\xf3\x0e\x0a\x83\x4f\xdc\x48\xf5\x8a\x17\xc3\xf2\x42\x2a\xaa\x66\x24\x75\xde\xcc\xd9\x12\xc0\x9f\x08\xf1\xa7\x35\x9a\x2e\xbc\x51\xca\xd5\x1a\x6a\x83\x5b\x03\xf8\xb0\x94\x97\x79\x37\x4e\xf8\x9f\x01\x79\xde\xa1\xd6\xfb\x04\x22\x7c\x80\x0f\x5f\x0c\x69\x72\x8d\xf6\x52\x58\x1b\xd4\x12\x63\x10\xe9\x1d\x97\xf7\x90\x33\x2a\x82\x1b\x1f\x32\x59\x64\xca\xec\xc2\xf9\x9b\x71\xec\x9a\xcb\x1d\xc3\xe9\x2e\x4b\xb0\x6a\xc3\x24\x15\x79\x0b\xea\xce\x5a\xd7\x9a\x74\x02\xdb\xc1\xff\xcd\xde\x58\x1d\xaf\x23\xb8\x78\x09\xc6\xa4\xc3\xc8\x1a\x41\x23\xa9\x2a\xfd\xab\xa6\x36\xc0\xba\x85\x3d\xe7\x83\xb3\x76\xf5\xec\x9c\x50\xf1\x04\xaf\x73\xa6\x31\x17\x85\x27\xd0\xe8\x08\x0c\x4f\xa0\x7e\x58\xb1\xab\xa8\x21\x62\xa9\xed\x93\xa4\xa8\xdf\x53\x3d\x08\xfb\x40\x0d\x91\x05\x5c\x7b\xc3\x39\x73\xd9\x7e\x73\xe9\xe9\x12\x39\x2b\xa0\x9c\xd8\xdb\x96\xba\x04\x0b\xc4\x3d\xc5\xe9\xd1\x72\x04\xd9\x12\x51\x43\x1a\xdf\x73\x65\x81\x2f\x05\xcf\xea\x8c\xe9\x1b\x2d\x84\x17\x2f\x85\xcb\x16\x5c\xe0\xb2\xe5\x4c\x56\x6a\xa6\xfa\xe3\x92\xa7\xdd\xb1\xd7\x93\xd3\x29\x5a\x6a\x12\x5d\xe9\x0f\x9d\x68\x0d\x9d\xeb\x0a\x21\x1f\xb3\xf5\x59\xb9\x73\x12\x52\x3b\x6b\x87\x65\xdc\x18\xa2\x9e\xe6\x49\x43\xc3\x2f\x2f\x0c\x7c\x2e\xc1\x55\xf0\x13\xb9\x43\x34\x99\x25\x0e\x54\x89\xd7\x7a\xd3\xe0\xb0\xb8\x27\xa0\x22\xaa\x6f\xff\xcf\xfb\x93\x7c\x08\x75\xc8\x46\x98\xc5\x84\xbf\x01\x37\x80\xab\xe3\x4a\x59\xc6\x0c\x94\x65\x31\x51\x75\xbc\xd3\x44\xb1\x5c\x4e\xed\x36\xfb\x20\xc8\x7b\xed\x82\xe1\x7c\xf4\x8a\xd0\xfd\x5a\x61\xb0\x6b\xb3\x2b\x18\x4b\xb1\xb8\x2b\x6a\x9c\xa7\x4a\xa1\x7b\x64\xb8\xef\x93\x55\x35\xf6\x76\x54\xe0\x31\x73\xed\xab\xc0\x49\xa5\x98\x25\x00\xc0\x43\x29\x99\x13\x2d\x68\xa1\x27\xd2\x80\x3f\x84\x16\x34\xe1\x66\x66\xc9\x6d\x14\x4d\xae\xa1\x45\xb4\x62\xee\x89\x3d\x92\xec\xbb\xac\xf5\x98\x82\xf5\x92\x33\x33\x51\xb2\x1c\x4f\xa0\x06\x0a\xef\x4a\x32\xaa\x3d\x01\x96\xfe\xde\xd9\xe8\x9a\xa4\x33\x41\x73\x9e\x84\xd6\x19\x4a\x4e\xb9\xe6\xd2\x45\xb2\x70\x5c\xbb\xc7\xc8\x79\xe8\x31\x80\x01\xb2\xa3\x8c\xf2\x9c\xec\x69\xc6\x48\x60\x0c\xfc\xe6\x12\x95\x45\x74\x16\x2a\x66\x7f\x1e\x47\xcf\x1c\x8a\xa2\x83\x0a\xb0\x9f\x54\x32\x38\x24\x24\xa0\x12\x00\x9b\x3b\x5d\xfe\xe8\xfd\xb0\x74\xcb\x67\x26\x15\x24\xb4\xf9\xee\x37\x4c\xa4\x32\x4a\x7d\x39\x3c\x3f\xd5\xb1\x21\xeb\x7a\x06\xe2\x48\xf0\x45\x26\xc5\x38\x06\x99\xab\xb8\xd4\x0a\x7c\x01\xfd\x1f\xa7\x3c\x2d\x69\x86\xa2\xde\x4d\xe6\xe8\xf2\x14\x7f\xce\xc7\x13\xd3\xbf\x61\xe0\xe6\xc4\x13\xb1\x4a\x8d\xf6\x0f\xe5\x0b\x29\xb5\x5c\xc3\xd1\x60\x9c\x3b\x0d\x5d\xc6\xd0\x61\x91\xce\x00\xa1\xd6\x25\x6f\xd6\xb2\x6e\x3c\x52\x3b\x0e\x11\xe8\x1e\x11\x1d\xa6\x77\x18\xba\x01\x5a\x6d\x08\xfc\xc0\x96\xca\xc0\xb5\x8b\x73\x83\xd6\x86\x55\x5f\x89\xf0\xb1\x89\xba\x8b\x82\xe6\xfb\x41\xa0\x47\x17\x82\xc5\xc3\x28\x77\xbb\xea\xda\xe8\x90\xa6\xa1\xa8\xd3\x6d\xc3\x1f\x98\x60\x8a\x27\x73\xac\x13\x7e\x3a\xa6\x06\x36\x1f\x13\xf6\x67\xe9\xa0\x89\xa9\xbc\x66\xbd\x78\x5a\x31\xe3\x15\xcb\x8b\x8c\x9a\x6e\x32\x55\x76\x7e\x8e\xbc\xe9\x51\x2c\xda\xee\x7e\x2a\xd2\x3e\xcd\x2c\xdf\x9f\xff\x74\xe4\xea\xe1\x70\x3f\xd7\xb2\xe1\xae\xaa\xce\x9f\xa8\x8e\xa0\x5e\xb6\x74\x1b\x03\x88\xda\x90\xa5\x20\xfe\xdc\x93\xc1\xe5\x71\x23\xb0\x15\xac\xfd\xe3\xfc\xa7\xa3\x1e\xe1\x03\x36\xf0\x7f\x85\x5b\xbd\xfc\x35\x72\x8c\xf5\x12\xa1\x0e\x07\x76\x0d\x4c\x25\xf6\x25\xc7\xbf\xfd\xe7\x37\x76\x92\xf6\xdb\x6f\xfb\xdf\x44\x9d\x83\xbe\xfd\xa7\xe5\x23\x65\x6f\xa8\x7f\x1a\xa7\xab\x83\xa4\xb5\x7f\xfd\xf3\x5c\xa6\x97\x05\x4b\x06\xf8\x5a\xfa\x9f\xae\x8f\x3a\x13\xc6\x2a\xf3\xe7\x12\x12\xd5\x78\x8a\x7b\x09\x9e\xad\xd8\xbf\x7c\xbc\xc1\x35\x20\x75\x12\x2b\xa1\x86\x09\x38\x72\x7c\x5d\xb2\x90\x06\x7f\x8e\xad\x4b\x61\xfe\x7b\xa3\xb8\x9b\xa8\x91\x12\x84\x09\x0a\xac\x43\x41\xd8\x47\xae\x01\x85\x06\xdf\x15\xc8\x41\x5d\x2e\xbc\x3f\x45\xed\xb0\x96\xc2\x01\x75\x08\xda\x99\xda\xb9\x7d\x26\xa4\xf9\x2c\x2c\xbf\xcf\x73\x84\xa3\x52\x12\x3a\x95\x80\x74\x01\x87\x88\x20\xa5\x00\x47\x79\xd5\x0d\x70\x38\x23\x39\xd7\x86\x5e\xb3\x01\xb9\xb4\xa7\x64\x9c\xb0\x80\xd4\x13\x04\xfa\xb9\xb0\x94\x94\xc2\xf0\x0c\xbe\xad\xc6\xb1\x53\x8e\x4f\xcf\xd3\x11\xd1\x65\x02\x2d\x6f\x15\xeb\xfb\xf3\xd8\xdd\xb5\x20\xc9\xaa\x77\xe9\x85\xc5\x9e\x50\x34\xd0\x8a\x14\x7e\x8a\x0d\x74\x85\x63\xaf\x85\xec\x6c\x3b\x4f\x29\x92\xea\x0c\x06\x62\x42\x17\x65\x7b\xec\x66\x3e\x9f\x08\x6d\x45\x17\x7f\x10\x2c\x61\x5a\x53\x35\xc3\x06\xa3\x3c\xf4\x41\x74\x89\xb3\x20\x94\x72\x2a\x4a\x18\x40\x31\xec\x56\x5b\x26\x40\x1d\x4a\x86\x4a\x5e\x33\x11\x2a\x12\x82\xc0\x0b\x69\xd9\x55\x12\x2a\xa4\x03\x48\x92\x4c\xa8\x18\xb3\xaa\xe8\x3c\xa7\x29\xd0\xfe\xc7\xa0\xdb\xf9\xf7\xb1\x14\xa0\x23\xab\x22\x71\x03\xa4\x18\xda\x83\x30\x44\x51\x3e\x08\xe2\xdd\x30\xbd\x2a\xcc\x61\x5f\x89\x67\x8d\x64\x22\xe9\xc6\xaf\xde\xde\xa3\xde\x07\xfd\x65\x8d\x29\xe0\x39\x33\x34\xa5\x86\x76\x96\x06\xfe\x96\x86\x46\x9a\x2e\x47\x04\xd8\x21\xca\x1d\x71\x27\xb9\x57\x5e\x65\xc1\x63\x18\x02\x90\x06\x13\xbf\xfa\xd8\x83\xde\xf2\xb5\x8b\x61\x62\x76\x37\xa8\x86\xae\xbd\x3a\x0c\xef\x47\x43\x91\xc5\x52\x92\x96\xa0\x68\x56\x22\xad\x4d\x8c\xbd\x93\x10\x8c\x5d\xe8\xce\xa8\x7c\x55\xa5\x12\x24\xf5\x54\xef\xa5\x6a\x20\x9e\x75\x4c\x18\x8e\xad\xd2\x3d\x6e\x84\x23\x7e\x29\x70\xab\xce\x2d\x03\xac\xd3\x98\x19\x5d\x25\x69\xe2\x69\x62\x45\xa4\x3b\xcb\x9d\xdb\x02\x8e\x1a\xb7\x34\xce\xf2\x5f\xae\x8f\xe2\xc2\x69\xe9\x4e\x0b\x7b\x7e\xad\x7d\x65\xba\x8b\x45\x61\x47\xd9\xb7\x32\x6d\x1f\xd4\x9a\x6b\x8d\x5a\x0d\x5c\xd5\xac\x60\xfd\x92\x06\xb7\x12\x3e\x19\x42\xfc\xba\x86\xaa\x81\x47\xc0\x84\x4e\x9b\x7b\x67\x2b\xfd\xb7\x1f\xda\x9e\xc1\xe3\xfa\xf0\xb8\xfe\xcb\xb6\x7e\xf0\xf6\x49\x90\xfe\x6a\x99\x0c\x59\x9f\x50\x07\x81\x0f\x2b\x5a\x2f\x3b\x89\x4b\xcc\xf7\xa6\x0c\x27\xaf\x4b\xf1\x08\x69\x35\xae\x30\x97\x71\x2b\x2f\x5f\x91\xcf\x6a\xba\x96\xd3\x69\x83\xe5\x8d\x55\x50\x7b\xde\x14\x1f\xb8\x25\xf7\x10\x5f\xf5\xdb\xf7\xe7\x06\x03\x25\x6f\xb9\x55\xea\xab\xad\x82\xe2\x6d\x95\x64\xe8\x69\x1f\x8a\x5d\x2d\x1b\x2b\x99\x65\xbe\x11\x3a\x9a\xe2\x73\x49\x52\xd0\xb7\x07\xc3\x2e\xbd\xe0\xf2\x08\x9a\xbe\x60\x37\x41\xa5\xa3\x1a\x91\x4a\x7d\xd0\x1f\xdc\x32\x3e\x73\x6d\xd9\x78\xa1\x22\xec\x50\xcc\x70\xea\xc7\x61\xb1\x6e\x33\xc0\x7a\x3e\x45\xc9\x12\x1e\xe6\x42\xb3\x1b\x3a\xd3\xb0\xbf\x2a\x8b\x30\x3c\xdf\xe1\xb6\x57\x03\x5f\xb0\x51\x8b\xe6\xec\xf1\xd5\x59\x5a\x40\x77\x89\x01\x80\xca\xc2\x45\xf3\x6c\xdf\x6a\x98\x06\xfd\xac\xe7\xaf\xee\xf2\x0b\x20\xc5\x12\xf2\xab\xba\x08\xd4\xd6\x9b\x0e\x9d\x9f\xc2\xc0\xde\x66\x1b\xc3\x1f\xfe\x2c\x0f\x11\xc7\x21\xb3\xfb\xad\xc2\x92\x02\xde\x8d\x7f\xbb\x24\x01\xad\x62\xfa\x1f\xa1\x31\x91\x0b\xed\xf8\xc2\x62\x7b\x14\x1c\x9e\x9f\xe2\x13\x07\xd0\x7a\x96\x8a\x99\xd3\xb2\xcc\x84\xab\xb4\x5f\x50\x65\x66\xe8\x1c\xe9\xd5\x9e\x16\x8a\x2a\x3b\x20\x47\xa7\x31\xe6\x36\x9d\xcb\xe2\xab\xb6\x46\x40\x3e\xb7\x3e\x3e\x28\x77\xeb\xca\x6c\x1a\x45\xda\x96\x78\xfa\xab\x5e\x47\x1c\xa1\x91\x79\xaf\xc5\x93\xa0\x48\x1a\x0b\xe2\x6e\x4f\xe4\xb9\x4c\x18\x3c\x58\x41\x5f\x76\xbe\x25\x19\x97\x9c\x05\xfd\x0c\x0c\x7d\x3b\xad\x1e\xe1\x23\x7b\xa4\x49\xd1\x77\xf5\xed\xc1\xf5\xee\x74\x3c\x9f\x32\x8a\x46\xbb\xdd\xac\xe8\x50\x8d\x9f\x15\x0f\x10\x76\x37\xd9\x13\x52\xe0\x8e\xc7\x7b\xf7\x31\x63\xf6\x16\x8f\x31\xdc\x32\x20\x3f\x4f\x98\x88\x8f\xbb\xd8\xd7\xde\x0b\xc7\x2e\x17\xa9\x5d\x6e\x38\x0b\xc1\xf6\xd7\x65\x92\x30\x16\xbc\x45\x71\xef\xf5\x4a\x22\xb9\x29\xe7\xd4\x24\x13\xa6\x89\x96\x00\x3e\xaa\x0d\xcd\xb2\xca\x4b\xe3\xc8\x25\x41\x73\xf0\x0e\xfa\x48\xa1\xa8\x95\x85\x3b\x87\x55\x91\x51\xe7\x15\x19\x95\x22\xc1\x9c\x2c\x6e\x66\x7e\x06\xf1\x09\x0f\x3f\x03\xd3\x54\xa3\xf3\x86\x8f\xd0\x1b\x1c\x99\x98\x81\x98\x20\x52\x67\x28\x44\xeb\x67\xbd\x83\xdd\xb3\xf2\x73\x48\x93\xeb\x1b\xaa\x52\x0d\x15\xef\xd4\x70\x6c\x2a\xd8\xab\x0d\xbb\x17\xcd\xc1\x3e\xbd\xa6\x1b\xec\x07\x43\x16\x1a\x4a\xcb\xb9\xc7\x10\x5a\x1a\x99\x53\xc3\x13\x70\xd1\xf0\x51\xe4\xdb\xcf\x43\x9f\x87\x10\xa7\x45\x59\x0e\xa7\x83\x7b\x0d\xb0\xd6\x14\x56\x68\x98\x1b\x49\x78\x6e\x75\x2e\x0a\x0d\x93\x47\xa1\xbe\xdd\x07\x22\xee\x9a\xa9\x55\x2c\x7f\x86\x30\x50\x74\x17\x3a\x7f\xac\x59\xae\x61\xf8\x10\x67\x08\x0e\x76\x57\xc8\xdd\x9b\x53\x89\x88\xff\x95\xe5\x6a\x3b\xdb\x88\x59\x7b\x76\x81\x6e\x98\xd5\xb5\xf4\x9d\x2c\xab\x07\xcb\xe6\xc4\xc7\x02\xab\x7e\xb9\xf6\x0e\x03\x97\xc6\xbd\x97\x2a\x59\x14\xce\xf5\x97\xef\x2f\xce\x09\xa2\x7b\x6a\xca\x34\x44\xb6\x7d\x6a\xb8\x25\xc5\x98\x09\xa6\xa8\x81\xf8\x80\x43\x2b\x84\xdd\x3b\xff\x10\xc8\x1a\x26\x11\x98\xf9\xde\x61\x56\x4c\xe8\x3e\x79\xef\x9a\xe6\x07\xfe\x0d\xb9\xe6\x2b\x69\xa4\xe8\x4c\xf4\x51\x81\xad\x2a\x79\xd7\x30\x5b\x55\x72\xab\x4a\x36\xb8\xb6\xaa\xe4\xfc\xb5\x55\x25\xe3\x2b\xa4\x33\x77\xab\x46\x5e\x84\xfa\x84\x28\xbb\x24\xce\xd7\xaa\x0a\x18\x1e\xdf\xcb\x17\x9e\xb5\x41\x27\x4c\x97\xb2\x18\x53\xd7\x3a\xe7\xe9\xdd\x37\x98\x12\x87\x1f\x0e\xdd\x52\xf9\x2c\xbd\x2a\x43\xd0\x6a\x89\xa5\x61\xd1\x92\x3a\xe5\xe1\xc1\x6b\x58\x43\x7d\x39\xc0\xce\xd6\xfd\x30\x6c\xbf\x4a\xca\x6b\xdc\x08\x30\xbe\x3a\x5c\x4d\xd2\x39\x3c\x49\x7c\x3d\xb9\x1c\xbe\xfa\xd5\x59\x6d\x00\x79\x94\xfa\x00\xd2\x7d\x8d\x00\x79\xfc\x3a\x01\x12\xea\xb6\xba\xdf\xf7\x17\xbe\x8e\x6c\x6e\xe7\x3b\xd1\x7d\xd7\xce\xaf\xe1\x94\x85\x71\xb8\x26\x32\xe7\xc6\x30\x9f\x57\x11\x76\x32\x78\xc3\xe3\x3a\x1a\x27\x73\xc0\xec\xc6\xe4\x09\xf6\x31\x74\x5a\x8a\xf4\x39\xd0\xca\x6e\xb8\x06\x23\x82\x0a\x6b\x02\x22\x5c\x2c\xc8\x8e\xbe\xcb\xbb\xf5\x66\xed\x56\x0e\xb5\x1f\x77\x2b\x87\xe2\x6b\x2b\x87\x08\xb4\xac\xca\xa0\x68\xa3\x53\xe5\xf1\x10\x13\x2e\xc8\x6f\x25\x53\x33\x22\xa7\x2c\xca\xeb\x84\xa6\x54\x9a\xa7\x2e\x33\xd2\xf9\xed\xda\x5a\x5d\x1b\xaa\xd7\x81\x5f\xf1\xe4\xa3\xd5\x9f\x01\x5b\xa0\x73\x49\x3f\xff\x80\x3a\x44\x10\xae\x82\x5f\x62\x2f\xda\xad\x8c\xd5\x03\x87\x01\x5e\x7d\x02\xbe\xb8\xc3\xb3\xe3\x2e\x4d\xe0\x2e\x22\xe9\xa4\xbb\x68\x3a\xb9\x8d\x51\x97\x91\x08\x49\x19\xbe\x81\xc3\x2c\x64\x3c\x04\x1f\x1c\xb9\x66\xb3\x9e\x4b\x2c\x72\x5d\x08\xfd\xcd\x98\xa3\x57\x6f\x95\xd2\x0e\x82\xaf\x7e\x75\x7c\xea\x74\xe9\x33\xc3\xab\x6d\x6b\x8c\xfa\x58\x9e\xb8\xdd\x1c\x84\x1d\x1f\xac\x1d\xb4\xd0\x88\xaf\x1a\x93\xba\x96\x36\x90\xf4\x0e\xdc\x0a\xa0\xfc\xbe\x54\x29\x30\x28\x94\x67\x81\x84\xed\x86\xbd\x48\xd7\x6e\x1b\xbc\xfc\x32\x3e\x12\xb1\xc2\x16\xac\xd5\xc4\x5c\xb3\xd9\xae\x76\x28\x15\x52\xe8\x09\x2f\x7c\x2f\x45\x90\x93\x6e\x57\x92\x9f\x20\x15\xcc\x0f\x81\x12\xf1\x54\xf4\xc8\x99\x34\xf6\x9f\x13\xc8\x6d\xc5\x10\x84\x64\xfa\x4c\x1a\xf8\x64\xa3\xc9\x8d\xaf\xf6\x48\xc4\x76\xf1\x0b\x0e\xd1\x07\xcc\xe2\x86\x3a\x51\x9f\xf1\x08\x44\x75\xc9\x2d\x61\x61\xb8\x26\xa7\x82\x48\xe5\xa9\x6a\x7c\xcb\x28\xed\x86\xf0\x5e\xdd\x28\x58\xb4\x64\x0c\xb7\x18\x52\xd5\xd6\xe2\x8e\xe1\x42\xdc\x89\xfb\x6f\xc0\xeb\x0b\x81\xba\x90\xa6\x09\x6d\x8b\xa8\x61\x63\x9e\x90\x9c\xa9\x31\x20\x9a\x24\x93\xae\x97\xb8\xab\x73\x11\xaf\x0e\x4f\x47\xbc\x3a\xe5\x43\x50\x51\xde\x40\x02\xee\xe3\xa8\x3f\x38\x36\x1e\xd7\x39\x2d\x2c\x0b\xfe\x8f\x3d\x95\x81\x0b\xfe\x17\xda\xa2\xe9\x01\x39\x24\x9a\x8b\x71\xc6\x6a\xdf\xb9\xc0\x41\x3c\x8c\x1d\xc1\xda\xac\xbf\x95\x7c\x4a\x33\x86\x09\xf3\x54\x84\x5e\x26\x72\xb4\xa0\x74\xf5\x5c\x6f\x34\x2b\x97\x43\x88\x7a\xe7\x9a\xcd\x76\x7a\x0b\x6c\xbb\x73\x2a\x76\x2a\x70\xa4\x1a\xa3\x06\xe5\x02\xa2\x97\x3b\xf0\xdd\xce\xa7\xd1\xd3\x9e\x80\xe9\xda\x19\x4f\x3a\x37\xf3\x51\x46\xb5\xee\x02\xa7\xe5\x76\xec\xf1\xcb\xe8\x49\x55\xdd\xb5\x2b\xba\x48\x30\x1d\xba\x3b\x1f\x39\xd4\x18\x76\x95\x02\xdb\x01\x9d\xa7\xae\xa1\x73\x5b\x20\xb7\xf9\x33\x27\x0c\x1b\xca\x50\x6f\x62\x94\x82\x2a\x5b\xe5\x16\x8a\xff\x04\xf1\x70\x39\x8a\xfb\x40\x70\x0d\xee\x27\xee\x0b\x53\x85\x34\x84\x8b\x24\x2b\x53\xec\x80\x01\x3f\x05\xe7\x55\x37\x86\x6a\x67\xe4\xed\x9c\x81\x7f\x0a\xc3\x7a\x9d\xd3\x67\xd6\x2c\xd4\xfe\xcc\xa7\x40\x40\xda\x49\xc8\x26\x40\x6a\xaf\x93\x5a\xa3\x46\x55\x0e\xf5\x56\x21\x47\x75\x3d\xf2\x35\x1f\x2a\x46\x8e\x26\x54\x08\x96\x45\x38\x2c\xce\xd1\x49\x8d\xa1\xc9\x04\xd3\x9f\x29\xb1\xfb\x38\x63\x66\x57\x63\x8b\xfa\x9c\x26\x13\x2e\x02\x78\x81\x08\x78\x44\x55\x29\xd5\x1a\x9a\xeb\xb4\x35\x84\x3a\xec\xcb\xb2\x7b\x7b\x63\x96\x0a\xd4\x7b\x34\x77\x4f\x85\x6e\xef\x76\x39\xd0\x1a\x4f\x5c\xe8\x12\x02\xf7\xde\xdd\xda\x25\x0f\xee\x69\x2e\x46\x4c\x29\x5c\x93\x21\x73\x3f\x20\xbc\xd6\x77\x75\xe0\xfa\x3d\x4c\xe4\x0d\x49\x25\xb9\x81\x0e\xa4\x53\xab\x1a\x40\xfe\x8d\xf6\x4a\x45\x34\x53\xc8\x88\x4b\x64\x5e\x28\x99\x73\xed\x6b\xfc\x1c\x43\xac\x0d\x76\x24\x2b\x1b\xe3\xb4\xde\x06\xae\xf9\xfa\x88\x18\xaa\xc6\xcc\xd8\xc1\x89\x28\xf3\x21\x6b\x09\xab\xb2\x6e\x08\xef\x4e\x3b\x65\x44\x94\xba\xa7\x01\x06\xb9\x70\xcf\x45\xc0\x13\x48\xc6\x1b\x49\xe5\x52\x0a\xc3\x97\x0e\xa7\xdd\xb2\xdc\x4f\xee\x5c\x2c\x85\xd1\x2d\x61\xd3\xdb\x34\xd0\xc0\xe5\xff\xf9\xe7\xb3\x6e\x70\xcf\x97\xf2\xd6\x8d\x54\x59\x7a\xc3\x53\x4c\xd4\xd0\x64\xcf\x3e\x6e\xbf\xdd\x3b\xaf\x11\xf8\xbc\xf5\x46\xbe\xb9\xe1\xe9\x63\x90\xdb\x67\x06\x5b\x72\x13\xa0\xb7\xeb\xd5\xcf\xa1\x2f\x1c\x3c\x76\x9f\x9c\x70\xac\x23\xb7\x7f\x21\xa2\x68\x3e\xe4\xa2\x42\x42\x08\x0c\x01\x27\x9f\x95\x0b\xde\x22\xd7\xcc\x60\x05\x30\x14\xd1\x4a\x33\x21\x9a\xe7\x65\x66\xa8\x60\xb2\xd4\xd9\xac\x25\x1b\x3f\xd5\x25\x1d\x65\xec\x23\xee\xe6\xf6\xfa\x4b\x18\xaa\xae\xc7\x8c\x11\xed\xc1\xaf\xf0\x82\x22\x53\x25\x37\xa7\x07\x41\xa9\x09\x65\xec\xec\x23\x4b\x5c\x9d\x53\x91\x95\x63\xde\xa8\xa4\x75\xdb\x14\xb0\xd1\xaf\x57\x6b\x0a\x58\xb5\x3c\x2b\x35\xab\x90\xbe\xda\x35\xdd\x7e\x1a\x3d\xfc\x1e\x55\x55\xbc\x5a\xde\xa8\x2f\x65\x05\x13\x29\x20\x87\x47\x3b\x0e\xa7\xbb\x36\x6a\x3b\xc4\xee\xae\xcf\x85\x93\x8f\x46\x51\x2b\xe4\x73\x80\x93\x71\xb0\xe0\x7c\x44\xa8\x68\x2b\xb0\x9f\x4b\x6f\x29\xb2\xd5\x1b\x1f\x7c\xe9\x4e\xfb\x4b\x46\x04\xab\xf5\x97\xec\xb8\xbb\x24\x9e\x7e\x6e\xa3\xeb\x7a\x59\xd4\x92\x2e\x90\xee\x29\x71\xfd\x52\xdb\x6e\x90\x7a\x49\x93\xb8\xb9\x59\xad\x71\x4f\x6e\x5b\x43\x3e\xad\xd6\x90\x23\x40\x1a\x6a\x0f\xe3\xfb\x1a\xc7\x99\xf3\x9d\xb9\x0f\x9d\xce\xb9\x8a\xaf\xcc\xed\xa8\xe8\x78\x85\x9e\x2f\x6e\x20\x57\xb7\x4f\xb4\x5d\x8d\x2a\x49\xbf\x14\xa2\x99\xd0\x5e\x77\x07\x3d\x6a\xa8\x66\xa6\x8d\x47\x77\xb1\xa0\xc1\xeb\x83\x38\x36\x36\x9e\x84\x42\x43\x0f\xb7\x43\xfa\xdf\x3a\xcd\x51\xd4\xee\xb4\x3a\xa3\x27\xb4\x47\xfa\x65\x21\x75\x0b\xc7\x48\xed\xf2\x26\xd4\xb4\xec\xa5\xde\xe2\x94\x75\xb3\x7d\xff\xfe\xf4\xb8\x13\x9a\xd9\x81\xe6\x68\x36\x08\x68\x7a\xa5\xe0\xbf\x95\xb1\x0d\x0c\xc8\x83\x81\x4a\xee\xfe\x75\x90\x62\x9c\xb0\xca\x19\x7f\xcc\xf5\x75\x7b\x20\xee\x1f\x8e\x4e\xea\x43\xd6\x37\xf3\x0f\x47\x27\xc4\x7d\xba\x92\x0f\xfc\x21\x4e\xf0\xb6\x78\xce\xe3\x84\x55\xe1\xb1\x94\xeb\xeb\x35\x80\x78\xb7\x35\x4f\x8b\xf4\xac\x59\xb5\xe0\x26\xfb\xf3\x3d\xf6\x67\x04\x50\x3b\x93\x25\xb9\x71\xa8\x74\xce\x80\xbb\xe2\xc5\x2b\x72\x22\x74\xa9\x58\x95\xe5\x34\x6f\xcb\x59\x1d\x6a\x65\x73\x0e\x80\xff\xf4\xab\xce\xfc\xff\x5d\xf3\xe7\x73\x09\x28\x14\x54\x19\xb0\xc1\x3a\xc2\x31\x87\x36\xa5\x6e\x48\x4f\x84\x7b\x98\xe7\x74\xe4\xeb\x14\x7a\x0e\x95\x2a\x80\x7d\xfb\x9b\x2c\xbb\x44\x30\x95\x31\x83\xbc\x0e\x00\xb4\xe4\x20\x65\xd3\x03\x9d\xd2\x97\x3d\x78\x8c\x07\x33\x32\xb5\x39\x51\x4d\x76\x5e\xee\x0c\xc8\x25\xcf\x79\x46\x55\x36\xab\x75\xdc\xaa\xee\xb3\x87\xa9\x1f\x10\x92\x40\x5e\xec\x90\x3d\xa9\x60\xe4\x84\x0a\x92\x31\x5f\xc9\xef\xb6\xef\x0c\xcd\x87\xfd\xcd\x90\x85\x64\x63\xa2\x31\x28\x16\xbb\x61\xaf\xf7\x78\x9c\xd7\xc0\x4e\x8f\xab\xf3\x8c\x0b\x7b\xc8\x0d\xc8\x7b\x77\x3a\xb9\x63\x1f\x59\x00\x76\xad\xbf\x63\xb3\x96\x68\x63\x7c\x16\xed\x3c\x11\x8b\x8e\x8e\x4d\x23\x74\x53\x6f\xc7\x98\x9b\x0b\x56\xc8\x0e\x54\x34\x1c\x68\xce\xb3\xcf\x8d\xfd\x40\x6a\x0e\x5d\x52\xa8\x21\x14\x05\x51\x52\x66\xd4\x5a\x64\xe8\xd7\x1f\x90\xe3\x93\xf3\x8b\x93\xa3\xc3\xab\x93\xe3\x57\xc4\x8f\xc4\x63\x9d\x7e\x40\xae\x62\xbc\xe2\xa8\xe4\xcb\x81\xc2\x86\x67\xf5\x9c\x60\xa5\xa2\x6a\xf1\x00\xf8\x8d\x54\x90\x53\xc1\x4d\xd5\xb9\x0a\x93\xe8\x33\x29\x5c\x5a\xbc\xfd\xb5\x8b\x2b\x8c\x39\x26\x6f\x0a\x37\x98\xfd\xba\x3e\x1a\xec\x50\xec\xf3\x12\xa6\xd2\xc8\xbb\xb1\x66\xdd\xae\x5a\x9e\x75\x58\x99\xbe\x49\x4b\x27\x9b\xfc\x0a\x03\xb2\x55\x57\x1e\x3c\x51\x43\xb3\x41\x8f\xbf\x2a\x55\xad\x17\xe0\x60\xb0\x3b\x20\xf6\xac\xde\x1d\xec\x7a\x55\x2e\x5b\x68\x58\x19\x06\x8d\x61\xae\xeb\xfc\x3d\x20\xe4\x9d\x2f\x23\x04\xdc\xa2\xe5\xbd\x2f\x11\xac\x2f\xea\x74\x38\xb7\x4b\x7c\x4b\xd4\x72\x18\x3f\xd4\xe1\x62\x8f\xf9\x94\x09\x7c\xb1\xf5\x09\x66\x3f\xd5\x4e\x56\xed\xa2\x7a\xf3\xf7\x17\x6f\xd6\xf7\x52\x28\x59\x3a\x79\xa5\x23\x99\xe7\x88\xd8\x3c\x09\x48\x23\x15\x58\x48\x90\x7a\x6b\x31\xce\x11\xa7\x7a\xd4\x68\xc3\xce\x49\x7c\x3f\xd4\x9c\x31\x1e\x3e\x76\x75\xbd\xa2\xb2\x87\x1e\xde\x26\xcb\x01\xa5\x6b\x0f\xbd\xe9\x8e\xcf\x83\xf0\x1e\x07\x17\x27\x87\xc7\x6f\x4f\x06\x79\xfa\x04\x85\x2f\x13\x69\x21\xb9\x30\xba\xa9\x61\xde\xac\xdd\x76\x5b\xb1\x1d\xa6\xdd\x8d\x6e\x76\xe2\x87\x8b\x13\x3d\xfd\x33\x22\xe4\xfb\x94\x19\xca\x33\x1d\x71\x98\x91\x85\xcc\xe4\x78\x79\xd7\xad\x07\xb0\xce\x9f\x10\x3b\xb5\x4f\xfb\x96\x27\xd7\x67\xb1\x36\x6f\xd5\x5b\xa7\xa8\x6f\xcd\x0b\xbd\x34\x02\xb5\x82\x25\x08\x1d\x75\x9f\x01\xc1\x3e\xa1\x89\xb0\x40\x45\xf4\xc9\x80\x88\xf3\x8d\x09\x2a\xa4\xff\xa8\x81\xf7\xaa\xb6\xc3\x7a\x88\xdf\xd4\x6c\xb0\xd2\xbc\x69\xa7\xf8\x3a\xd5\xff\xe6\x46\xaa\x1f\x22\x85\x62\xfd\x00\xa8\x0c\x1d\xa4\xa5\x8a\x74\xb0\xf8\x4c\xf1\x4e\x5c\xef\xf2\xc5\xbb\xb2\xd9\xbc\x33\xb7\xd2\xd2\x83\x0f\x1d\xf1\xea\xb2\x6c\x56\xb5\xcb\x70\x2e\x2d\x3a\x46\xa0\x64\xe5\x22\x65\x85\xe2\x53\x9e\xb1\x31\x34\xdc\xe1\x62\xec\x5b\x8f\x47\x78\xfb\xd0\xfe\x92\x2d\xcc\xcb\x2e\xb6\x36\x71\x03\x38\xe0\xac\xb3\x77\x57\xd0\xc4\x09\x52\x61\x5a\x1b\x93\xf6\x81\xd0\xec\xba\xdf\xef\x83\xff\x6e\xef\x5f\xd6\xaa\x49\xb3\x7d\xf2\x33\x73\xcf\x91\xd0\x68\x4a\x41\x27\xf5\x89\x0c\x9d\x7e\x60\xae\x15\x65\x81\xa1\x31\x39\xce\xdd\x75\x60\xef\xb4\xea\x33\x1e\xe7\xb5\xfb\x39\x03\x30\xe7\x2a\xe6\xff\x14\x2d\xa0\x35\x1d\xa2\x1d\x4b\x7b\x1f\x27\x5a\xb6\x47\x42\x5c\xbf\x70\xe7\x02\x25\x7a\x96\x67\x5c\x5c\x57\xe8\xe1\x23\x69\xf9\x18\xeb\x7a\xb9\xb8\xf6\xbb\x46\x31\x9a\xdd\x7e\x62\x34\xe1\xd1\xb5\x9d\x16\xa6\xb3\x50\xc2\xd5\xac\xc0\x3c\xb6\x20\xbc\x5c\x92\x55\x2c\xea\x77\x76\x9e\x34\xc5\xb8\x4e\x34\x6f\x2f\xde\x4f\x2f\x8f\x2e\x4f\x6b\xb2\x5d\x10\xfc\xec\x53\x06\xec\x6e\x3b\x5c\xe1\x25\x9f\xb4\x05\xc1\x7f\x6b\x96\xe1\xd4\x27\x59\xd9\xf4\x97\x98\x44\x7d\x2e\x95\xa1\xd9\x1a\x04\x67\x32\xa1\xc5\x61\x69\x26\xc7\x5c\x27\x72\xca\x3a\x72\x43\xdc\x4c\xb0\x03\x99\x6f\xb8\xc0\x3d\x93\xe2\x33\xc8\xd1\xdf\x0e\xcf\x09\x2d\x2d\xd7\x19\xd7\x5c\x66\x6d\xe9\x69\x9e\x02\x97\x58\xf2\xfb\x88\xef\xef\x9e\xb0\x51\x6f\xbf\x0d\x0a\x3f\x7a\x50\x18\xe4\xe2\x73\x09\x04\x73\xc1\x0d\xa7\x46\xaa\xce\xa2\x75\x47\xa5\x36\x32\x77\x5b\xe4\xd4\x0f\x0f\x39\x4e\xa0\x6a\xd5\x9e\x58\xef\xc6\x0a\x86\x22\x90\xf7\x54\x58\xb3\x8e\x26\x6c\xae\xce\xa4\x07\xfd\x5b\x70\x6c\x1e\xee\xf9\xc6\x55\x1b\x01\x30\x79\xf6\xed\xab\x5a\x6f\xc3\x85\x96\xb7\xde\xe9\x58\xb5\x51\x5d\x9b\xb7\x98\xff\xd6\x8d\x7c\x72\xce\x7d\xa4\xcb\x7f\x95\x34\x43\x7a\x9e\xad\xd3\x13\x5e\x5f\xc7\x4e\x5e\xd3\xf3\x94\x5f\xf7\xb3\xe0\xfd\x2a\x35\xe2\xaa\xe3\x1d\x46\x51\xa1\x2d\x33\xd4\xfd\x0b\xbb\x2e\xc5\x60\x97\xec\x99\xa4\xd8\x5f\x1b\x65\xba\xaa\xe6\xc4\x97\x75\x6b\xff\x26\x54\x71\xb6\x7b\xaf\xb5\xe7\x0d\xc0\x1e\xee\xc6\x79\x5a\x23\x10\xaa\x64\xe4\x0d\xd7\xc6\xb7\x71\x85\x0f\xb8\x76\x7d\xaf\x40\xfb\x3e\x27\x52\x11\x5e\xfc\x83\xa6\xa9\x7a\x85\x67\xbd\xb3\x0e\xe1\xbf\x75\x40\x28\xa7\x22\x64\xac\xec\x99\x59\xe1\xda\x2b\x5c\x1d\x9d\x13\xec\x0e\xfd\xf5\x5f\x5e\x80\x26\xfe\xe5\x17\x7f\x79\xd1\x92\xd5\x9e\x6a\x75\x1c\xe9\xda\x0b\xd9\x79\x9e\xc2\x33\xa9\xa1\x00\x05\x14\xab\x27\xe0\x74\x73\x52\x10\xf9\xde\x32\x61\x38\x73\xbb\x54\x53\xb7\xf5\x06\x7f\xa0\x7a\x03\x12\x0a\xc6\x51\x8e\x3e\x96\x7c\x46\xd1\x7c\xfe\x54\x44\x73\x43\x6a\x36\xe5\xdc\x3a\xc7\xa2\x74\xdb\xdd\xd5\x71\x2e\x07\xd4\x53\x1e\x9f\x5d\xfe\xe3\xcd\xe1\xf7\x27\x6f\xe0\x3d\x5d\x36\xbc\x65\x45\x67\x96\x34\xc9\xdd\x5e\x9d\xb5\x9b\x7b\x8a\x9a\x92\xb3\x8b\x88\xfd\xd9\xeb\xcb\x39\x57\x9c\xfd\xe4\x81\x61\xfa\xb6\xb6\xa5\x18\xb5\xa0\xde\x53\x0b\x12\x40\x2b\x6b\xa6\xd6\x53\xdc\xdd\x71\x84\x21\x02\x50\xaf\x39\x35\x2c\x0f\xe1\x3b\xb6\xf6\x3b\x34\xe4\x0d\xb2\x71\x6a\xdc\xdd\xc1\x64\x4b\x31\xa4\x62\xe7\x61\xe4\x4f\x4a\xed\x76\xea\xa1\xea\x0a\x79\x60\xf7\x12\xc6\xf2\x09\x0f\x56\x84\x61\x1e\xb5\xb2\x27\xaa\x3d\x4b\x99\x0e\x4d\x6f\x9f\x01\xb7\x16\xcb\xba\xbd\xb5\x3f\x1d\x96\x36\x91\x73\xad\x8e\x31\x48\x53\x0b\xd1\xd7\xaa\x97\x6f\xeb\x9a\xe8\x73\x19\xa9\x73\x55\xe9\x82\x26\x9d\xf6\xe2\xa9\x3e\xc2\x4f\x00\xe8\xed\x29\x1e\x30\x30\xf1\x35\x95\x59\x85\x67\x77\xb3\x1d\x8f\xfc\x70\xf3\x60\x20\x0f\xe2\x12\xdf\x25\xba\x90\x1e\xec\x25\x46\x0d\xd9\x48\x16\x22\x1b\x77\x0e\xfd\xdc\xd0\x81\xb0\x4e\xe7\x41\x31\x91\x46\x8a\x8e\x4b\x48\xcf\x97\x0c\x5a\x97\x67\x78\xc7\x51\xd5\x7e\xbd\xe2\x0b\xac\xb0\x09\xa1\x69\x6b\x70\xf8\x13\x5b\x0a\x1f\xa4\xae\x87\xa8\x9f\x9e\x00\x2a\xd2\xd3\xe3\x35\xc8\x9e\xa7\x0f\xc3\xf3\xd0\xe0\xdc\xda\xd2\x4b\xd3\x8e\xea\xd2\x4f\x8f\x9d\x2d\xe0\x6b\xcf\xb5\xdb\x3c\xe4\xf6\xdd\xb3\x16\x3d\x49\x2a\x73\x23\x55\x57\xf0\x65\xe7\xb5\xe1\xe6\xf2\x15\xdd\x77\x0b\x78\x12\xcf\x53\x56\xe0\x5b\x3e\x79\x79\x71\x09\x89\x5c\x73\x1d\x25\xe7\x25\x44\xa8\xd4\x7d\x04\x21\xf2\x74\x84\x47\xa7\x5a\xc9\xe3\xc2\x46\xad\xcd\xa4\xf5\xbb\xa2\x13\x1a\xfd\xe4\x06\x73\xae\x4d\xcb\x1f\x95\xb8\xa5\x41\x18\xb9\x87\xae\x45\xbc\x2a\x69\xc5\x4f\x33\x29\x52\x3f\x50\x0c\xcb\x35\xb6\xf2\xcb\x32\xbb\x9e\x52\xc4\x4d\x00\x1d\xb8\x54\x8f\x60\x1f\xbd\x9c\x16\xae\xdf\x78\x2a\x6f\xc4\x0d\x55\x29\x39\x3c\x3f\xfd\xf4\x42\xb4\x75\xf1\x23\xee\x82\x36\x98\xf4\x35\x2a\x02\x0a\xfd\x90\x1b\x8d\xd9\xec\x90\x8f\x6e\x62\x1f\x92\x3d\x80\x42\x86\x88\x15\x61\x56\x5c\xb9\x59\x44\x3a\x92\x20\x32\x31\xd4\x75\x76\x0f\x5d\xef\x5f\xbc\x78\x81\x21\x85\x17\x7f\xfd\xeb\x5f\x09\x74\x5d\x4c\x59\xc2\xf3\xc5\x1b\xe1\xae\x3f\xbf\x7c\x39\x20\x7f\x3f\x7c\xfb\x86\xd0\x04\x2c\x30\x84\x54\xc5\x91\x61\xed\xe2\x1f\xeb\x1e\xf9\xbf\x97\xef\xce\xaa\x76\xef\xf5\x6f\x81\x35\x72\xff\x7a\x03\x72\x1c\xa5\x9f\xc7\x2e\x7f\x6a\x26\x90\x92\x2f\xa4\x21\x74\x34\x02\xe6\x44\x91\xcc\xb5\x17\x17\x1e\x17\x8d\x8f\x27\xbe\x5b\xb7\x65\xab\x0c\xf2\xe2\xb9\x9d\x22\x84\x58\x3c\x94\x20\xa6\xf9\xc3\x58\xe1\x74\x80\xa9\xf4\x48\xc6\xaf\x19\x19\x69\xe8\xd9\x5d\x35\xd1\x50\x4c\x5b\xfb\x29\xa1\xc2\x8e\x8e\x83\x85\xa9\xdb\x49\x3c\xed\xdc\x85\x96\xdd\x9d\x6b\x0c\xeb\x1b\xc3\xf9\xba\x24\x94\x27\x96\xec\x4f\x35\x97\xa0\xae\x2f\x86\xf7\x41\x2e\x72\x50\x7c\x41\x6c\x12\x9a\x49\x31\x8e\x99\xae\xd2\x23\x7c\x02\xe2\xac\x60\x4d\x89\xd1\x51\x37\x95\x6e\x7a\x93\xa1\xe4\x7e\x4b\x5b\xf6\xf7\xaf\x87\x56\x23\x28\x44\x3a\x94\xa5\xf1\x29\x6f\xf8\x24\x80\xc0\x02\x8c\x44\x24\x78\xab\x07\x77\xd6\x98\xa6\xbb\x56\x6f\x1d\xf5\x59\xaa\x1f\xc4\x35\x65\xb3\x47\x18\x4d\x26\xe4\x9a\xcd\xfa\x28\xe2\x0b\x0a\xe8\x07\x40\xe7\x63\x4b\x5d\xec\x2f\x54\xcf\x28\x48\x58\x6a\xed\x40\xb7\x08\x3e\x33\xb1\xe2\xfa\x80\x9e\xe0\x4d\x25\xed\x34\x6a\xd7\xb7\x48\x44\x8e\x43\xdf\xa8\x30\x91\xc2\xb8\x26\x88\xa1\x51\x11\x64\x5a\xce\x55\xd8\x5b\x89\xc2\x52\xfb\x33\x7d\xd7\x93\xab\x74\x4c\x7b\x64\x38\x65\xa2\x14\x0b\xbf\x06\x24\x70\xc8\x7b\xd5\xcc\xe1\xf9\x50\xdf\x00\x2f\x4a\xe9\x9c\xf0\x04\xaa\x6a\xec\xed\xee\x5e\x4f\xa5\x40\x88\x1a\x02\x80\x66\xa6\x74\xa4\x81\x5c\x5a\xfb\x6c\xa6\x35\xe1\xf0\x86\x39\x55\xd7\xcc\x83\xd9\xd2\x6c\x40\xce\xed\x24\x03\x4e\x39\xf6\x8d\x9b\x62\x11\x84\x95\x29\x31\xb4\x81\x7d\xc8\xee\x60\xb0\x8b\x67\xe1\x12\xa0\x83\xd6\xfc\xd2\x65\xcb\xb0\xce\x5a\x85\xd5\xf5\x20\x5a\x68\x6c\x9d\x66\xad\x03\x68\x4f\x28\x01\x77\xc4\x4c\xbc\xb6\x40\x5b\x82\x4f\xc7\x57\xc7\x3d\xab\xba\x6d\x7b\xd9\x5d\xd3\xcb\x16\x21\xf0\xfa\xd5\x75\xb3\xcb\x0e\x5b\x5d\xd6\x13\x8e\x9d\xfc\xa9\x4e\x90\xae\xfa\xee\x75\xde\x58\x31\xef\xa0\xad\x95\xbf\x6e\x43\x2e\xce\x57\xb1\x2e\x40\xd1\xb6\xb2\xfc\x49\x99\x13\xa7\x23\x90\xa1\xcb\xd1\x5a\x22\x2b\x2d\x1c\x29\x96\x02\xeb\xb7\x23\xba\xe8\x15\x4f\x3a\x32\x2c\xe6\xaf\xf6\x86\xc6\xfc\xd5\x26\x99\x65\xfe\x5a\xd8\xe7\xe1\x4c\x2d\xa2\x52\x5a\x58\x22\x23\xa1\x07\xa3\x09\xc2\x60\x40\xde\xba\x33\x17\x99\x9b\x0e\xb5\xcc\x4a\x13\x60\x15\x96\x1c\xc8\x30\xa8\xef\xd8\x88\x70\x43\xfe\xb6\xe8\x78\x06\xc5\x04\xcf\xac\x6e\x4e\x6a\xbc\x3a\x14\x36\x6d\x93\x51\xf1\xfa\x83\xa5\xa4\xe2\xd5\xe1\x2a\x78\xbd\xb0\xe3\x95\xb8\x74\x98\x92\xbe\x0e\xb0\xa6\xbd\x42\x5a\xaa\xd1\xa8\x1a\x7b\x45\x14\x1b\x1e\x36\x45\x5b\xae\xae\xf6\x8e\x57\xf7\x3a\xce\x1b\x78\x78\x7e\xfa\xe8\x56\x66\xf4\xac\xad\x9d\xb9\xd2\xb5\xc4\xe1\x0b\x40\x04\xde\x09\x74\x5c\x51\xd4\x05\xd8\xac\xfc\xfd\x03\x98\x2b\x0b\x2f\xfe\xda\x9e\x3b\x51\x50\x6a\xae\xe5\x03\x7a\x70\xab\x13\x2a\x6a\x13\xe1\xd3\x65\x40\x9a\x3d\x7f\xd3\x66\x43\x0d\x12\xa0\x7e\x8b\xba\x97\xf9\x6b\x3e\xb1\xd4\x11\x91\x5c\x42\xaf\x7d\xf4\x9e\x44\x6e\x98\x42\xa6\xaf\xb0\x69\x33\x15\x42\x1a\xec\x31\xdf\xc3\x66\xfd\xba\x87\xee\x15\xab\x64\x46\x89\x56\x2a\x0a\x61\x76\xac\x56\x76\xc6\x3c\xa4\x73\x06\x22\xc0\x44\x40\xbb\xf3\x6e\x38\x89\x3c\x02\x37\xd9\xab\xd2\x4a\xba\xec\xab\x5e\x0f\x37\xe2\xf8\x9e\x89\x74\x32\x61\x39\xc5\x06\x17\x9e\x40\x56\x5e\xdf\x28\x6e\x0c\x43\xfc\x6b\xa6\x72\x4d\xe4\xa8\xe7\x4d\x24\x44\x3d\x99\xbe\xdc\xe9\xae\x3f\xfd\x23\xd8\xca\xc4\xef\xd0\xa6\xf0\x55\xb7\x5d\x75\xdf\x7f\xcd\x8e\xb0\xbb\x13\x0c\xe6\x0c\x3a\xee\x88\x39\x27\xa4\x55\x22\xa6\x48\xff\x8d\x26\xdd\xe6\xb9\x19\x7a\x41\x19\xdd\xba\x19\xb6\x6e\x86\x2e\x46\x7c\x34\x37\x43\x74\x70\x7b\x61\xea\x16\x20\x76\x3d\xc4\xf8\xef\xde\xff\x50\xe1\x3a\x44\x58\xc6\x96\xe5\xbd\xe7\x41\xaa\xba\xff\x7f\x77\x30\xd8\xdd\xf5\xfe\x08\xb7\x3f\x4a\x33\xea\x7f\x4d\x98\x48\x64\x8a\x4c\x65\xc7\x57\xda\x80\x52\x5b\x19\xe0\xf1\x5c\x72\xff\xac\x38\x86\x00\x63\x77\xcb\x12\x1d\x4a\x28\x9f\x33\xf2\xfa\x51\x55\xb0\x4a\xf1\x0a\xf0\x55\x8e\x80\x01\xe5\xcf\x69\x60\x55\x0e\x4b\xc6\x73\xee\x70\xf5\xac\xb8\x60\xda\x68\xb2\x87\x1f\x0e\x92\xa2\xec\xb9\x1b\x06\x39\xcb\xa5\x9a\xf5\xc2\x4d\xf6\xcb\xda\xaf\xdc\x1d\xfb\xa0\xb5\x25\xa5\x52\x4c\x98\x6c\xf6\xc7\xd5\xdf\x3c\x89\x37\x58\x7d\x0b\x5c\xd1\xa6\xc4\x62\xd9\x35\x57\x76\x11\x80\xed\xc1\x51\x17\xa8\x0d\xe7\x90\x2b\x76\xe8\x05\xf7\x11\x7c\xca\xc4\x94\x4c\xa9\x6a\x5c\xec\xb0\xec\x7a\x14\x8d\x2d\xe5\x53\xae\x65\xe3\x72\xb1\xa5\x43\x2e\x7a\xbf\xb8\x6b\x04\x20\x4b\x53\x94\xc6\x9d\x2e\x7e\x6f\x7b\xa8\xb9\xb0\xa7\xe7\x14\xdf\x97\x3b\x1d\x4e\xae\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\x1d\xbe\x04\x15\xb3\x77\x9d\x89\x60\xbc\xfa\x8f\xa2\x46\xd4\xc7\xee\x98\x75\x09\xf9\xd8\xaf\x9c\xd7\x7d\x2e\x4c\x5f\xaa\x3e\x3e\xe4\x15\x31\xaa\xec\x4a\x74\x55\xc7\xdf\xe3\xc9\x98\x4a\x89\xa9\x90\x1b\xbd\x61\xb3\x81\x42\x04\x33\x47\x1f\xdd\x1b\xec\xda\xa5\x6e\x1d\xc1\xab\x5c\x8f\x92\x70\xe4\x90\x61\xfe\xe0\xd9\x46\x97\xae\x23\xef\x36\xd5\x68\xe1\xda\xa6\x1a\x2d\x5e\xdb\x54\xa3\x07\x5e\xdb\x54\xa3\x0d\xf4\x01\x6e\x53\x8d\xb6\x3e\xc0\x27\xe2\x03\xdc\xa6\x1a\xad\x7a\x6d\x53\x8d\x1a\x5f\x4f\x33\xd5\xc8\x29\xf0\x55\x9e\xd1\xc6\xa6\x19\xb9\x06\xff\x87\x49\x22\x4b\x61\xae\xe4\x35\x6b\x19\x95\x5d\xc9\xc0\x5c\x78\xe6\x66\x5a\x9b\x5d\xa9\x94\x1d\xa8\x80\xdd\x29\x7f\xb4\x4c\xb9\x35\x33\x3b\xde\x06\x87\x6e\x58\x6f\x67\xda\x63\x51\xa4\x2c\x0d\xcf\xf3\xc2\xca\xd8\xf5\x1e\x90\x43\xa2\x58\xc2\x0b\x6e\x45\x3b\x80\xe9\xc0\xe7\xb8\x4f\x42\x3f\x60\x6e\x34\xcb\x46\xae\x27\xaa\xa8\x6a\x86\x55\x64\x42\xba\xb3\x62\xe9\x63\x50\x2b\x90\xbe\x8d\x25\xd1\x13\x59\x66\x29\x51\xec\x5f\x5e\x9d\x70\xb3\xb9\x8a\x47\x88\x1d\xa1\xf0\x2a\xd5\x63\xdd\xe0\xb4\xe0\x0e\x75\x6b\x93\x04\x1c\xfb\x58\x70\x05\x9b\xed\x92\x25\x52\xa4\x5d\xbb\x37\x4e\xe6\xc7\xf7\x6b\xed\xa2\x39\x2c\x25\x69\x89\x37\x40\x21\x24\xcd\x78\xca\xcd\x2c\x64\x61\xe0\xb6\xb7\x8a\x28\x76\xa1\x75\x8c\xa0\xab\x85\x20\xb4\x28\x94\xa4\xc9\x84\xe9\xe8\x6d\x50\xad\x74\x60\x13\xa1\xbe\x32\x2b\xc7\x5c\xa0\x66\x09\xbf\xb1\x6a\x48\x36\x23\x4a\x1a\x9f\x50\x76\xcb\x03\xaf\xa2\xc1\xe0\xe7\xa8\x4b\x18\x35\x83\xac\x33\x19\x0f\x81\xb3\xe2\xa3\xf8\x0f\x4d\x64\x96\x7a\xdc\xd2\xaf\x5f\x58\x55\x3e\x71\x5c\x6c\xa5\x3d\xa0\x4a\x1a\x49\x32\xab\x16\xd9\x13\xe0\xf6\x1f\x7f\xf1\x15\x99\xc8\x52\xe9\x41\x0c\x21\xf0\x12\x3e\x43\x27\x85\x37\x05\x0c\xc9\x18\xd5\x86\xbc\x7c\x41\x72\x2e\x4a\x7b\x96\x77\xc4\x78\x5d\x69\xaf\x91\xde\xfa\x97\xaf\x5a\x8e\xd6\x8d\xc6\xba\x98\xc1\xe2\xb8\xb5\xc0\xfe\x6c\x4e\x71\x75\x7b\x1c\x41\x31\xb0\x47\xe3\x9c\x1a\xeb\x8e\xa4\x78\x15\x85\x91\x6b\xde\xf9\xbf\x95\x72\x38\x33\xed\x61\x60\xfe\x0b\xc7\xa9\xe3\xbf\xf8\x0f\x57\xc1\x52\xad\xa0\x54\x1b\x4c\x65\xed\xdd\xa2\xc7\x5c\x9b\x46\xbd\xa2\x2b\xdc\x98\x06\x3f\x6e\x7b\x98\x8f\xad\xc5\xdb\x49\xd1\x3a\xd8\xce\xde\x56\xf3\x4e\xe5\x24\x61\x1a\x44\x91\x87\x4f\x03\xff\x2c\x3e\xb5\xe1\x43\x37\x0b\xb1\xe5\x4e\x44\x16\xcf\xfc\x1d\x74\xc6\x6c\x45\xac\x36\xba\xbd\x67\xec\x8e\xa8\x85\x83\xd5\x65\x84\xe6\x62\x8c\x8d\x2c\xf3\x32\x33\xbc\xc8\x2a\xca\x85\x1f\xb8\x03\x38\x76\xf8\xd3\xc8\xc3\x4c\x11\x38\x0a\xa1\xc1\x21\x38\xb2\x17\xc6\x62\xc2\x60\x3f\x46\x65\xcf\xf1\x82\x2a\x1a\xc8\x9f\xc8\x3c\xa7\x7a\xdf\xc5\x0e\x28\xe4\xae\xa0\x64\xb7\xc7\xb0\xa2\x59\x78\xfd\x38\x57\x60\x5d\x8c\x6b\x98\xa0\xa2\x71\xd0\xae\xee\x70\x81\xa1\x88\xbc\x09\xe9\xf1\xd8\x3f\x7d\x8e\x63\x9d\x42\xfc\x3d\x4d\xae\x99\x48\xc9\x7b\xed\x09\x97\xce\x04\xcd\x1d\xb8\x7a\xa1\x24\xf6\xed\x66\xe9\xdc\xef\x75\xcf\x39\x12\x11\x65\xc4\x83\x40\xa1\xbe\xb5\x2e\x2a\x96\xba\x23\x74\xdd\xf7\xda\x2a\x5f\x77\xcb\x3b\x8d\x4e\x5a\xc5\xa7\x09\xf3\xba\xa3\x9d\xc0\xba\x5e\x7e\xda\x18\xf1\x8d\x2c\xc7\x61\x72\x4d\x33\x71\x17\xc2\x91\x1e\x82\x8f\x80\xa3\x4e\x33\x2b\xe2\x66\x01\x5e\x67\x8e\xc1\x86\xb3\xf5\xb5\xec\x57\xc3\xf6\x00\x4d\xbb\x17\xdf\x1f\xd7\x85\xd9\x05\x4d\xa5\x26\xdf\x67\x32\xb9\x26\xc7\x0c\x8c\x86\xc7\x6c\xf7\xae\x86\xe9\xd3\x6e\xd3\x98\xd3\x71\xb3\x3c\x8f\x3e\xc9\xa5\xe0\x46\xaa\x26\xf2\x78\x83\xc0\xf6\xb6\xad\xf6\x96\x83\x88\xab\x61\xfa\x6c\x1a\xed\x59\x26\xef\xa8\xc3\xee\x84\x11\x05\x22\x06\x06\xf5\xdd\x3f\x1a\x0a\x8c\x3f\x4d\xe4\x4d\xdf\xc8\x7e\xa9\x59\x9f\x37\xce\x53\x6a\x4d\x9f\x6b\x36\x83\xa4\xaf\x4e\x28\xf4\x23\x0e\x56\x33\xd1\x8d\x04\xcf\x39\x7c\x6e\x15\xb9\x8b\xef\x8f\xed\xe9\x3d\x88\xcd\x92\x03\x66\x92\x83\x84\x15\x93\x03\x37\x9d\x27\x4f\x56\x2f\x1f\xbb\xa1\xeb\x21\x49\x64\x96\x39\xdc\x2e\x39\x22\x47\xac\x98\x84\x47\x6c\x06\xad\x9e\x72\xb3\xb4\x42\xca\x6e\x1a\x2b\x45\x22\xc2\x8e\xe9\x24\x44\xc4\xe8\x6a\xf8\xb0\x5e\xd0\x9b\xc8\xda\x9f\xb0\x27\x49\x93\xde\x72\x1b\x41\xde\xcd\xe9\x51\xb7\x7b\xe9\x87\x03\xff\x4f\x14\x6e\xae\xb7\xa4\xf3\xf9\xa2\x35\x11\x7d\x3a\x42\x0b\x33\x65\x29\x91\x53\xa6\x14\x4f\x99\x26\x41\x46\xc7\x8e\x25\x9e\x6d\x06\xe5\xb7\xdd\xf1\x9e\x56\x7e\xc0\xe6\xf8\x14\x22\xe1\x6d\xc7\x5c\x14\xde\x34\xcd\xb9\xd8\x0c\x2e\x6f\x48\x2f\x9d\xd0\x8c\x9d\xbe\x6b\x6d\x7a\x5f\xe2\x38\x75\xeb\xdb\x7f\x18\x81\xec\xdf\x03\x3c\xff\x63\xe0\x59\x22\x64\xda\x2c\x1a\xb6\x66\x1b\x7a\x4c\x0d\xbb\x69\xa8\xf8\xf4\x2b\x51\xdf\xf4\xf7\x60\x79\x3d\x6d\x1b\x7c\x4d\x0d\x32\xa2\x7d\x8d\xa8\xf7\xeb\x52\xa7\x1c\x07\x75\xe3\x5a\xf6\xa4\x98\xeb\x2f\xe6\xb7\xe6\xe1\xf9\x29\xf9\x01\x9f\xb7\xbe\x8e\x1f\x4a\x1a\xb4\x64\x8e\x65\x4e\x79\x47\x8d\xd8\xa3\x86\x4e\xf1\x0b\x9f\x87\x87\x11\x7c\x5a\xdc\x85\x7e\xc4\xc7\xa5\x62\x29\x71\xde\x8f\x6d\x1b\x83\x0d\x6e\x63\xd0\xad\x52\x5c\xe9\xc4\x91\xc7\xdc\x57\xc6\x54\x7a\xb0\xe7\x22\x50\x07\x42\x0a\x12\xd1\x4c\x68\x0e\x59\x07\x51\x62\x1c\x28\xcb\x90\xff\x1d\xca\x60\x50\x71\xee\x91\x37\x72\xcc\x85\x97\x4e\xd2\x25\xbb\x8c\x28\xcf\xda\x91\x73\xab\xe9\xfe\xc1\x34\x5d\xad\xb3\x13\x41\x87\x59\xf3\x4c\xc6\xfa\xc1\x9b\x51\xc8\x93\x62\x30\xe6\x41\xca\xb5\xfd\x97\x5c\x5e\xbe\x81\xd8\x6c\x29\xbc\x65\x08\x51\x47\x77\x6c\x84\xfa\x62\x14\x2e\xeb\x93\x07\x28\xb3\x3b\xeb\x53\x71\x2a\x52\xfb\xba\x4c\xd7\x12\x80\xdd\x53\xb0\x0b\x48\xa8\x5e\xc3\xec\xc3\x21\x23\x57\x13\x9e\x5c\x9f\x47\x21\x58\xa9\xec\x67\x22\xfa\xa8\xa6\x68\xcc\x7f\xb7\xae\x03\xc7\xbd\xd6\x79\x57\x6e\xaf\xab\xe8\xc4\xbd\x74\x24\xb3\x83\x13\xaa\xb5\x4c\x78\x15\xf3\x07\xa7\x70\x75\x24\xa7\x70\x24\xaf\x8f\x0c\xa0\x25\x3e\x8a\xfe\xe1\x19\xc7\x29\xad\x54\xc7\xfa\x06\x17\x9e\x5a\x6b\x7b\x75\x64\xe5\xce\xba\x6b\x5e\xd5\xfa\x69\x7a\xab\x6f\x2e\xfc\xec\xeb\x41\x1d\xa3\x78\x7d\xde\x35\x70\x5e\x64\x95\xd0\x57\xd3\xf5\xf7\x58\x0b\xb1\x9a\x17\x6b\x2f\xf3\xc2\xcd\xe5\xde\xe0\x67\x2e\x20\x0d\x42\xa5\x90\x45\x99\x61\xd6\x6a\xfb\xb6\xa2\x3e\x9a\x87\xcf\x59\x43\x80\x7a\xd3\x9a\x11\x3d\xb4\x9c\xef\x79\xf4\x25\x8a\x0c\x82\x17\x7f\xf9\xea\xab\xa7\xde\xa9\xa8\x9d\xe3\x6c\xdd\xad\x8a\x5a\x85\xba\xb6\x28\x05\x5b\x94\x82\xbb\xae\xb5\x47\x62\x3f\x3d\x0e\x41\x27\x45\x62\x5d\x14\x88\xb5\x45\x1a\x68\x59\x5c\xd6\x4d\x61\x59\x6b\x2c\x81\x47\x45\x10\xe8\xa8\xc6\xaa\x3d\x5a\xc0\x16\x23\xe0\x8f\x81\x11\xd0\x5d\x6d\x55\x57\x78\x00\xed\x6b\xaa\x9e\x7f\xed\x7f\x6b\x31\xd1\xb6\xc2\xfc\xe1\x75\xe5\x5d\xf5\xaf\xe8\xca\xcf\xde\x99\x63\xa0\xe6\xd5\x75\xf6\xae\xe7\x0c\xcc\xbc\xae\x10\xdf\x8d\xb4\x42\x63\x8d\xd6\x2e\x69\xed\x2c\xc0\xa9\xc8\x46\x67\x70\x9d\x6b\x70\xa4\x77\x97\x73\x21\xf6\xf0\xf1\xe6\x47\xd6\xb7\x21\xe6\x6d\x1b\xf5\x6d\xfc\x31\x5c\xb7\xc4\x1f\x75\x0d\xe3\xd5\x7b\x04\x41\x12\x82\x0a\x26\x87\x71\x1f\x95\x6a\xff\x1f\x9e\x9f\x92\x44\x31\x80\x34\xa0\x99\x1e\x90\x25\x1a\x9a\x8f\xd4\x38\x8d\xce\x6b\x66\xd4\x18\x96\x17\xa6\x2d\xc3\x6d\xc3\x8f\x7f\xb0\xf0\x63\xc7\x31\x83\x9f\xc2\x70\xde\x5b\x34\x29\x73\x2a\xfa\x56\x5a\x40\x20\xb2\x96\xcf\x31\x77\xf0\x0d\x88\xaf\x81\x43\x6a\x52\xc5\x10\xdc\xbc\x14\xfc\xb7\x92\x55\xfe\x85\xa0\x5e\x6c\x40\xa8\x05\xe6\xd1\x31\xed\x50\x75\x9a\x93\x22\x89\x5c\x28\x65\x72\x04\x09\x74\xf4\x02\x23\xd2\xbf\x6a\xbe\x32\x33\x61\xa8\xa6\x9d\x03\x38\x40\x75\x57\xdd\xbe\x43\x03\x8f\x66\x99\xbc\xc1\x67\xc7\x8a\x87\x5d\x3f\x3b\x17\x87\xc7\x31\x64\x24\xe7\x4a\x49\xe5\x42\x3c\xf1\x74\x30\x2d\xc7\xda\x89\x4c\xa1\xc1\xa5\x5c\x56\xc5\x25\x33\x31\xab\x18\x49\xa8\xc0\xc2\x45\xfb\xdf\x3e\x29\x19\xfb\x9f\x39\x79\x37\x64\x13\x3a\xe5\xb2\x54\xf8\x6b\x23\xc9\x8e\xfb\x0a\x8e\xdc\x99\x2c\x83\x9b\xbb\x84\x3a\xa5\xf0\x76\x7a\x09\x9d\xce\xaa\x2f\xc1\x40\x4d\xa5\xf7\x1f\xf6\xd9\x47\xae\xcd\xe2\xbb\x78\x12\xf9\x06\x09\xeb\xe0\xbc\xa9\x2e\xec\x01\xfb\x53\xe3\x9a\xd3\x3a\xbf\xc5\xa3\xd5\x55\xd2\xe9\x25\x7c\x75\x9f\x42\xea\x90\x5a\xb0\x54\xdc\x17\x85\x3d\xbd\x74\x4f\x7c\xcb\x86\x9d\x99\xb6\x1a\xf1\x53\xd1\x88\x43\x82\x44\xc6\x93\xd9\xe9\x71\x37\x3a\x5f\x48\x8c\xb0\x83\x92\xef\xa9\x66\x29\x79\x4b\x05\x1d\xa3\x73\x64\xef\xf2\xfc\xfb\xb7\xfb\x96\x49\xc0\xf9\x72\x7a\xbc\x34\x7b\xe2\x32\x9e\xd9\xd9\xba\xca\xb7\xc9\x3c\x8d\x3a\xd3\x0a\x1e\x48\xa5\xb5\x15\xb0\x93\x70\xb2\xb7\x69\xd9\xb5\x08\x6e\x84\xe9\x10\x1e\xa9\x4c\xcf\x8b\xd7\x69\x9e\x5e\x3f\xe6\xeb\x46\xbe\xea\xbb\xde\x69\xb5\x40\xd3\x0a\xc1\xa4\xb9\xb5\x57\xd4\xb0\xf1\xec\x98\x15\x99\x9c\xd9\xe5\x3e\x8f\x5c\xe7\x78\xeb\x10\x8f\x7a\x35\xa4\x09\x51\x65\xc6\xb0\x7b\xcd\x3c\x44\x98\x60\x2c\xad\xe4\x14\x17\xda\x50\x00\x08\xc3\xf1\xef\x9c\xd1\xca\x07\xcc\xaa\x47\x49\x1f\xe7\x79\xef\x5d\x75\x38\x45\xbb\xa1\xee\xfc\xc9\xea\x87\x09\x3c\xfe\x7e\x0e\x7d\x48\xf0\x70\xe5\x30\x61\x9d\xc1\x61\x4f\x5f\x94\x99\x3d\x3a\xb2\x74\xae\x89\x28\xe8\x56\x6e\x8d\x11\x99\x01\x24\x80\x9d\x7d\x8f\x0c\x4b\xab\x78\x31\x5d\xf3\x2f\x2f\xc2\x52\xde\x4c\x30\x6e\x6c\x7f\x44\x68\x51\x64\x1c\xf3\x7a\xa5\x72\xc1\xdf\xc8\xdb\xb8\x78\xdb\x2a\x82\xe4\x81\xfa\xc7\xc3\xf4\x8d\x3e\x99\x32\x35\x5c\x05\x53\xe1\xa1\xaa\x04\x2d\x38\xc4\x4e\x56\xd6\x3c\xea\xa0\x90\xe7\xa7\xf8\x6b\x6f\xa9\xc5\xa6\x99\xff\x12\x57\xd0\xad\x8d\x07\x14\x74\x5d\x69\xd0\xda\x08\xa8\x40\x87\xe7\xa7\x08\x43\xe5\x80\x81\x2a\x97\x85\xd5\xed\x29\x26\x07\x56\x68\x84\x74\x6c\x47\x34\x44\x8a\xf0\x50\x26\xca\x9c\x21\x98\x50\xd5\xce\xca\x1a\x7c\x62\x56\x8d\x5e\x79\x3c\xac\x7d\xb2\xba\x3a\xf1\xf0\x30\xfa\x03\xc3\xe6\x0f\x3e\x79\x84\x14\x17\xee\x35\xdf\x5f\xbc\x69\xb6\x88\x67\xf5\x31\x1c\x78\x0c\x03\x9c\xbc\x82\x2a\xc3\x69\x46\x4a\x95\xf9\x30\x1c\x26\xbd\xbb\xb4\xb4\x09\x9d\x46\x00\x3b\x03\x42\x3e\xc3\x95\x73\x84\xc5\xfd\x89\xed\x5d\x71\xe5\x47\x65\x96\xf5\xc8\x88\x0b\x6a\xc5\x2e\x2b\x48\x1c\x0e\xba\xe4\x22\xb1\xe6\x97\xb5\xf5\x5d\xbf\x16\x98\x91\x37\xca\xc2\x26\x85\x28\x23\x44\x4b\x59\x96\x02\xe8\x22\x3c\xc2\x6e\xd8\x04\x5c\x04\xd6\x6a\x3c\xca\x4a\x6d\x98\xba\x90\xf6\x30\x88\xf2\x5a\x00\x8e\x82\xc6\x5f\x7f\xcf\x45\x0a\x29\x4c\x17\x70\x70\x24\x54\x10\xc6\xc1\xf9\x62\x87\x84\x38\xb5\xe5\x9d\x8a\xa1\xf6\x74\x99\x4c\xec\x2b\xed\x14\x32\xd5\x3b\x56\x8c\xec\xa0\x8b\x4e\xef\xec\xdb\xbf\xe6\xdf\x01\xd3\x54\xa2\xdf\x1d\xd0\x82\xef\xec\xf7\x08\x10\x08\x02\x67\xd2\x4c\x9e\x2e\x1f\xfa\x77\x05\x9b\xb8\x11\x17\x5e\xc4\x23\x00\x0f\x8a\xaa\xfb\xd7\xcd\x84\x1b\x16\x9a\x6f\xa3\x67\x27\xe0\xab\xcc\x0b\x6b\x42\x0e\x05\x61\x79\x61\xc0\x5b\x4c\x72\x46\x7d\x08\x99\x4d\x99\x9a\x59\x9b\x1c\x80\x28\x9e\xfc\xe6\x0f\xfc\xd8\x8a\xe0\x73\x9d\xcd\x2b\x26\x87\x1d\xb6\x40\xdc\xdd\xcf\x76\x6b\x76\x7e\x96\x45\xd2\xfc\xc9\x92\x12\x8e\xd7\x46\x64\xfc\xc9\xfe\xb2\x4e\x42\xfc\x08\xa5\x65\x90\x1f\x6f\xde\xb8\x40\x06\xd2\xea\x47\x2e\x52\x54\x51\x0f\x8d\x51\x7c\x58\x1a\x76\xc1\xec\x84\x13\x4c\x79\xf0\x5d\xf8\x5c\x76\xb4\x5b\x89\xa5\xe4\x87\xb9\x3f\x45\xd2\x2f\x2a\xb6\xab\x2a\xa3\x77\x0c\xef\x75\xf9\xdb\x86\xba\x73\x00\x67\x10\xbc\x95\xe9\xf2\x4d\x35\x57\x19\x52\xdd\xec\x54\x95\xa8\xb3\xa5\x1f\xcb\x29\xb1\xb3\x62\xa9\xa6\x7f\xf7\x72\xdc\x41\xfa\xdb\x66\x52\xf9\x06\x40\x82\x46\xdf\x5c\xcd\x0a\xe6\x90\xb6\xc9\x28\xa3\xe3\x8a\x8d\x40\x1e\xa2\xfa\x74\x74\xf9\x93\x7f\x05\x4d\xf8\x72\x45\xf6\x5e\x4d\xf7\x3e\xdd\xb6\x5f\x51\xe9\xd6\x3b\xec\x43\x96\x7e\x79\xbf\x82\x1b\x06\xbf\x9d\x9b\x56\x09\xfb\x99\x3b\x5d\x6a\xb7\xd1\xff\xca\x21\x7c\xd1\x88\x13\x3c\x80\x98\x37\x37\x21\x13\x09\x34\x94\xcb\x9f\x6a\x6c\x72\xcf\x7c\x6f\x61\xda\x6b\x36\xbb\x91\x6a\x39\x1a\x78\x63\xfe\xba\xf3\x89\xd8\x9d\xff\xde\x0d\xf2\x96\x16\xf6\xb5\xab\x3c\x4f\x14\x78\x2e\xea\x88\x56\x01\x66\x68\xf9\xac\x38\xa9\xc6\x54\xf0\x7f\x63\x72\x6c\x62\xf7\xb1\x54\xf6\xcf\x3d\x8c\x5c\xa0\x45\x9f\xb1\xc4\xec\x3b\xfe\x5b\x2a\xf7\xee\x61\x50\x9a\xa6\x1c\xf5\x8a\xf3\x7b\x78\xe9\x6e\x22\x70\x71\xfd\x18\x34\xbf\x63\x63\xdd\xcf\xfb\x77\x87\x3e\x57\x90\xcd\xa5\xba\x23\xbb\xe9\xce\xdf\xe7\x94\xbb\x8e\xae\x1b\x47\x15\x96\x53\xde\xf4\xb5\xf0\x6a\x41\xd7\x9c\x9a\x52\x71\xb3\xf4\x40\xba\xfb\x87\x5c\xfc\x58\x0e\x99\x8b\xf6\x3e\xf8\xe7\x02\x92\xf7\x0e\xcf\x4f\xbb\x5d\x8e\x45\x78\x69\x37\x41\xab\xd1\x90\x52\xd0\x7c\xc8\xc7\xa5\x2c\x75\x36\x8b\xdd\x95\x14\x82\xd5\xd6\xdc\x47\x7f\x8d\xd8\x35\x84\x0a\x29\x66\xb9\xbb\x55\x24\x59\x99\xb2\xda\x88\x10\xd3\x9b\x4a\x9e\x12\x5a\x1a\x99\x53\xc3\x13\x92\x48\xfc\xae\x3e\x52\xa9\x19\xa1\xb7\xfc\x36\x29\xb5\x91\x39\xc9\xa9\xd2\x13\x9a\x65\xb7\xad\x71\x07\xa7\xda\x5d\x00\xda\x7d\x78\xff\x5b\xbf\x9c\xe2\xac\x1b\xf2\xf7\x3d\x78\xe1\x2b\xf0\xb7\x9d\x5c\xab\x01\xa6\xb7\x73\xe9\x0a\x63\xb8\x92\xf8\xa5\x70\x3d\xf7\x2c\xcc\x7d\xd4\xb9\x6b\xe7\xde\xfb\x5e\x77\x48\xc3\x3b\x7f\x0b\xa9\xb3\x2c\x3d\xcd\xe9\x78\x05\x45\xf2\x8d\xb5\x1b\xa8\x98\xf9\x9f\x21\x8a\xa4\xee\x11\xa9\x5c\x0e\x48\xe8\xc9\xed\xbe\x0a\x00\xa4\x8a\xbc\x83\x30\x9b\x54\x2e\x99\xda\x71\x29\xa4\xd6\x33\x35\x92\x2a\xb7\x7a\x1d\x57\x64\x54\x0a\x34\x2d\x5c\xee\x35\x18\x2b\xce\x8b\x43\x33\x2d\xc3\x0e\x84\xb8\x9d\xf0\x93\x20\x54\x93\x1b\x96\x65\x03\x72\x98\x65\x0e\xde\x32\x82\x46\xa8\x4a\x9e\xab\x0c\x81\xe1\x8c\xa4\x7c\xcc\xb4\x21\x7b\x97\x7f\x3b\xdc\x87\x53\x1b\x3c\x1c\x33\x62\xa8\xaf\x13\xab\x7b\x6e\xe0\xfc\x4f\x4b\xd0\x13\x12\x6a\x68\x26\xc7\x18\x24\x07\x0f\xae\x48\x49\x91\xd1\x19\x80\xd4\x17\x54\x41\xa2\x68\x82\xde\x1b\xa2\x4a\x01\xf0\xbc\x9f\xf4\xc4\xb9\x5f\x14\xdc\x85\xa0\xdb\x07\x9e\x6c\xb8\xd5\xef\x41\x2d\x7d\xdc\xa3\x4c\xb1\x22\xa3\xb7\xf8\x1b\xee\x28\xfb\xb5\x6a\x2e\x98\xb0\x52\xb0\x30\xc6\x80\x5c\x22\xef\xe4\xd4\x24\x18\xc2\xfc\x67\xce\x0c\x4d\xa9\xa1\x03\x6b\x0b\xfe\xb3\x5e\x98\x26\xb3\xd4\x0e\x74\xfb\x42\xdf\x32\x67\xd4\x17\x97\x37\x63\xaf\xef\x42\xab\xd4\x86\xdb\x41\x3f\xf7\xfb\xf1\x4e\x07\x47\x4b\xf9\x04\xaf\x7f\xf2\xd1\x9a\x62\x77\x46\xd7\x6a\x73\x9d\xff\x51\xdd\xff\x90\xd5\xdf\xc4\x71\x6b\xce\x00\x17\xf1\xca\xf5\xf3\xf1\x9f\x80\x73\xf5\xf0\xec\xf8\x76\x47\xd8\xfd\x2e\x83\x7b\x5c\x04\xf5\x90\xc1\x1d\xd3\xf3\xae\x67\xf7\x4d\x3d\x6e\xe0\x8b\x53\xa0\x7e\x0f\x4b\x3d\xa8\x07\x4f\xf1\x37\xe3\x82\xd5\x2b\x0f\xf1\x77\xb7\xfb\x47\x56\x0a\xdc\xac\x12\xae\xb9\xaf\xd0\xab\x1f\x26\x7b\xeb\x4d\xab\x45\x6f\xee\x2d\xc6\xaa\x11\xdc\x55\x3b\x42\x71\x25\x50\x1e\x4a\x36\xbc\xf3\x34\x10\x7b\xd5\x68\xd7\x8a\xfe\x1d\xff\xaa\x0f\x98\x68\x58\xca\x5a\x1a\xd1\x35\x9b\xed\x6a\x57\x8b\x22\x85\x9e\xf0\x02\xab\x05\x5d\x80\xc2\xad\x2e\xf9\x89\x66\x3c\x0d\x43\x20\x57\x9f\x8a\x1e\x39\x93\xc6\xfe\x73\xf2\x91\x6b\x83\xe6\xe7\xb1\x64\xfa\x4c\x1a\xf8\xa4\x93\x57\xc5\x29\x3c\xe0\x45\x9d\x01\x8c\x3e\x6e\xd8\x57\x91\x99\xec\x5f\xe8\xd4\x89\x3d\x4f\x14\xae\xc9\xa9\xb0\x1a\x81\x7b\xa3\x50\x45\xab\xdd\x10\xbe\x50\x44\x48\xd1\x07\xef\xf7\xd2\x31\x1c\x21\xa4\xaa\xd1\xe1\x8e\xe1\xdc\x50\x98\xce\x07\xdf\x70\xed\x85\x78\x38\xb3\xa9\x77\xbb\xf1\x84\xe4\x4c\x8d\x21\x9e\x93\xdc\x13\xcf\x58\xd5\x15\xb9\x92\x03\xf2\xde\xb5\x02\x91\xf9\xe6\x56\xc7\xc5\xc2\x22\x45\xf7\xa3\x58\xca\xd1\x9b\xf1\x3f\x56\xfa\x00\xa5\xfe\x17\x4a\xa9\xf5\x80\x1c\xfa\x66\x29\xf1\x77\x2e\xae\x15\x0f\x63\x47\xe0\x9a\x58\x51\x32\xa5\x19\x43\xe4\x78\x2a\x42\x15\x94\x1c\x2d\x08\xf6\x9e\x2b\xa9\xb6\x7b\x36\xa8\x4c\x3b\xd7\x6c\xb6\xd3\x5b\x58\xda\x9d\x53\xb1\x53\x95\xc0\xd5\x16\x33\x08\x51\xd0\xb6\x76\xe0\xbb\x9d\xe6\x67\xc1\x9d\xc2\x72\x75\xf7\xca\xbd\xeb\xa6\xaf\xf9\xf2\xc0\xf4\x52\x65\x63\x4f\xef\x5b\x12\x42\x30\x58\x91\x5c\x2a\x70\x67\xda\x4f\x63\x20\x0d\xab\xaa\x5e\xf3\xa2\xa8\x70\x47\xca\x62\xac\x68\xca\xc8\x58\xd1\x62\xf2\x50\xb5\x04\x75\x9b\x65\xc3\x3f\x19\x45\xf7\x16\xe2\xdf\x61\xd1\xd5\xc8\xef\x0d\x10\x6f\x78\xc3\x66\xb9\x51\xb4\x28\x98\x22\x54\xc9\x12\x9c\x76\xf9\x94\xa9\x81\xbf\x05\x53\x2e\x82\x9f\x39\x91\x4a\xb1\xc4\x78\x13\xdd\x65\x05\x63\xc1\xaa\x48\xa1\x1a\xf5\xc1\x6a\xdf\x0d\x1b\x4e\xa4\xbc\x86\xaa\x39\x60\xc7\x47\xf4\x82\xfc\x8c\xcf\x3a\xae\x3e\xf3\x06\xad\x26\x29\x33\x94\x67\x90\x6b\xf2\xee\xcd\x5b\x97\x8d\xe2\xb5\x09\x3f\xcb\xe5\x89\x1d\x1d\x98\x21\x34\x75\x59\x52\x17\x6c\xca\xd9\x8d\xa3\xff\x6d\x79\x24\x7d\x32\x66\x02\x92\x27\xee\x48\x32\xea\x13\xcd\x53\x76\x02\xc5\xb8\xb7\x0f\xd4\xc2\x7d\x7f\xcb\x9c\xef\x13\x21\x77\x9f\x23\xf7\x9e\x21\x2b\x9c\xf5\xc1\x08\x3f\x97\xea\x0e\xe0\x9f\xd5\x6a\x83\x57\xab\xfb\x75\xd9\xe9\xaf\xc8\x57\x5f\x7d\x79\xeb\x4d\x39\xfd\xc8\xf3\x32\x7f\x45\xfe\xf2\xe7\x3f\x7f\xf9\xe7\xdb\x6f\xe3\x02\x6f\x7b\x79\xfb\xfb\xb9\x3d\x7f\x74\x71\xbc\x01\xf4\x4e\x43\xb6\xdf\xdd\xa1\xc1\x15\x86\x1a\x51\x9e\x95\xca\xa5\xa4\xae\x68\xa8\xbc\x8e\x7f\x03\x61\x9d\xaa\x98\x82\xfa\x11\x7d\x32\x9a\x4b\x52\x1b\x71\xc1\x34\xb4\x46\x29\x85\x62\x89\x1c\x0b\xfe\x6f\x96\xfa\xce\x28\x90\x78\x02\x00\xeb\x9e\xc5\x09\x13\x29\xf6\xa4\xb4\x27\xef\x84\x8a\x34\xbb\x2b\x21\x61\x85\x37\x8d\x77\x70\x2b\x92\xc1\xf9\xf7\x20\x82\xbd\xad\x7e\x31\x47\x2e\xe8\xac\xe9\x82\x60\x78\xae\x22\xd9\x5a\xbd\x29\x0a\xc6\xcb\x3b\xcc\xfb\x25\x73\x5c\xb0\x3e\xd1\x70\x86\xcf\x7e\x2b\x99\x9a\x41\xe1\x48\x65\x5e\x44\x89\x6a\x57\x15\xae\x80\x7f\x0d\xa7\xd7\x21\x92\xcb\x9c\x45\x5e\xa9\x52\x55\x3a\xca\xdc\xb3\xe1\x37\x0c\x83\xf8\x3e\x9c\x45\x0e\x89\x28\xb3\xec\xb6\x5b\x85\xbc\x2b\xf0\x15\xd3\xee\x1e\x83\x76\x35\x4b\x73\x55\xe7\xc4\x12\x4a\x7f\x52\x17\x45\xfc\xe2\x1d\x19\x14\x9b\xed\xb4\x88\x5f\x78\xa5\x9c\xd3\xd5\xf3\x4d\x57\xc3\xab\x59\xc1\x99\x81\xd7\x43\x12\x52\x57\x44\x99\x79\x4c\xf7\x06\x5e\x0f\xca\x1f\x5a\xcd\xd5\xb1\x64\xea\x1b\xe7\xf0\x68\xf0\xf2\xab\x38\x3f\x96\xbc\xfa\xd6\x05\xb2\x40\xf0\x55\x73\xb2\x1e\x90\x8f\xb5\xe2\x4a\xae\xe0\x1a\xc1\x6b\xeb\x20\x79\xd0\x49\xb4\x82\x60\x7e\x98\xb3\x64\xe5\x55\x55\x8c\x8b\xa9\x44\x94\xe6\x07\xe9\x70\x17\x0b\x3f\x9c\x53\xe5\x6e\x40\xb2\x3a\x5d\x2e\x28\xbf\xb1\x4a\x6b\x0d\x5a\x52\xea\xfb\x5d\xee\x77\xbf\xc1\xdd\xb5\x29\x9d\xd8\x20\xf5\x37\x2f\x33\xf6\x33\x37\x93\x77\x1e\x8d\xdd\x71\xb5\x29\x8b\x0c\x5e\x36\xfa\xc2\xb2\xd0\x45\xa5\x19\x9e\x62\x07\x2f\x96\xc8\x3c\x67\x22\xc5\x54\xa6\x9c\x5e\x33\x52\x35\x82\xb4\x3a\x1e\xa8\xc1\x30\x1c\xfb\x58\x50\x51\xe9\x89\x53\x2b\xcb\xef\xe2\xa8\x15\xf9\x69\xd5\xb3\x76\xe5\xa2\x8f\xbb\x8b\x3d\xa2\x6a\x8d\x5a\x51\x07\x19\xb2\x4c\x82\x13\x07\xf3\x55\x31\xd7\xda\xdd\x0a\x22\xd9\x7d\xea\x4e\x3d\x87\xfc\xc8\xc4\xb8\xc2\x99\xd2\x19\x34\x69\x75\x12\x58\x0a\x36\x20\x17\x4e\x85\x59\x4d\x2b\x5a\x45\x9c\xae\x28\x4a\x57\x3e\x10\x2b\x6c\x86\x07\x53\xd6\xff\x2e\xa6\xed\xd4\x7f\xb6\x0a\x75\xfd\xcd\xcf\x99\xbe\xa1\x53\xc2\xc3\xc8\x5b\xdf\xd2\xd5\xa9\x10\x68\x3b\x27\xbc\x12\x6c\x01\x0c\xae\xba\x3e\x39\xba\x38\x39\xbc\x3a\xe9\x91\xf7\xe7\xc7\xf0\xef\xf1\xc9\x9b\x13\xfb\xef\xd1\xbb\xb3\xb3\x93\xa3\x2b\xab\x47\x7c\x86\x38\xf0\xd6\x8c\xb3\xd4\xb5\xe7\x91\xac\x4b\x0b\x2a\x66\x64\x54\x1a\x2b\x0e\xaa\x87\xd5\x66\x41\xd1\x07\x40\xd3\xd4\x9a\x8c\x4f\x6e\x0d\x97\x13\x7c\xde\x6d\x12\x37\xbb\x40\xe8\x7c\x57\xcc\x75\xbf\x9a\xb4\x32\x93\xac\x5c\x15\x51\x9b\xf2\x4e\xc3\x72\x88\x0f\x82\xbc\x96\x8a\xb8\x3e\x5f\xaf\xc8\x6e\x21\x53\xbd\xeb\x8a\x4e\xec\x7f\x0f\xf0\xa3\x83\x4c\x8e\x77\x43\x2d\x0a\x23\x99\x1c\x13\x5d\x0e\x43\x8d\x10\x9c\xa6\x70\xf7\x67\xfe\xb6\x5a\x69\x45\x2f\x14\x0a\x45\xbf\x0a\x83\xd7\x7e\x13\xdf\x10\x8f\x7b\x00\x4d\xbe\x6a\x77\xda\x0f\xe6\x07\xfc\xec\x60\xf9\x0c\xbc\xe2\xc4\xd5\xdc\x2f\x3e\x08\xcb\xae\x37\x3c\x4b\x13\xaa\xd2\x05\x9e\x85\xc3\x0d\x97\x1c\xa8\x87\xb8\xb9\xd8\x23\xb9\x1a\xdc\x81\x67\xc8\x29\x53\x19\x2d\x30\x4f\x1d\x80\x8b\x21\x01\x0a\x1e\x72\xcc\x0a\x06\x75\x5a\xbe\x6b\x37\x13\x49\x26\x01\xa7\x03\x4f\xc6\x5e\xfd\xd5\x31\x21\xca\x83\x12\xba\x62\x9f\x6a\x87\xec\x6c\xac\x98\x83\x64\xe7\x07\x71\x2f\xa6\x47\xdf\x0a\xf6\x12\xaa\x47\xd0\x68\x0c\x9a\x2f\x23\x3b\xae\x0a\x6e\xa7\x47\x76\x02\x9e\x49\xea\xb4\xe4\x9d\xcf\x76\xaa\x1b\xe2\x3a\x2a\x50\x92\x5d\x60\xaa\x0f\xcf\x89\xab\x2d\x61\x81\x7d\xf8\x2c\x3c\xba\xc2\xa4\xb1\x47\x9b\x73\x62\xc1\x1c\xea\x03\x0d\x6a\x13\x59\x78\x6a\x55\x02\x78\xef\x13\xed\xf4\xa3\x9f\x1b\x28\x97\xc7\x52\x42\x47\x1c\x15\x55\xdc\x0c\xc8\x65\x8d\x79\x42\xf8\x2f\x06\xcd\xe1\x8a\x14\x54\x59\x53\xc4\xdf\x59\xef\x17\xf6\xd9\xbd\xdd\xc2\x56\x60\x82\x28\xbe\xb2\xa2\xd6\x7e\x19\x7e\x71\x94\x51\xad\x97\x78\x5e\x41\x10\xd8\x81\x09\xc3\x91\x09\xf5\xc1\x27\x00\xa1\x9e\xd0\xe9\x1d\x70\x09\x2b\x4c\xda\x50\x35\x66\xe6\xee\xc8\x08\x15\xb3\x77\x77\xc2\xa4\xf5\x57\x06\x56\xed\xaf\xb6\x9b\x3e\xf6\x2b\x50\xae\x3e\x17\xa6\x2f\x55\x1f\x7f\xf2\x8a\x18\x55\xde\x16\xe3\x32\x3c\x67\xb2\x34\x97\x2c\x91\x62\x79\x5d\x85\xbb\xaf\xb3\x50\xcf\x03\x8a\x4d\x5c\xb4\xf1\xd0\xab\x11\xbe\xe2\x24\x76\xb2\x57\x3a\x86\x8f\x30\xd6\x41\x5a\xde\xbd\x79\xdb\x66\xb1\x09\x94\x59\xdf\xbd\x92\x3f\x39\xb1\x2f\xc6\x61\xa6\x6e\xe6\x77\xfe\xec\x6d\x69\x1e\xfe\xa3\xff\x8f\xb9\x2b\xcb\x6d\x9b\x07\xc2\xef\x39\x05\xdf\xfe\xbf\x40\xe3\x9e\xa1\x70\xde\xba\xa0\xb0\xd3\x03\x30\x12\x1d\x0b\xb5\x25\x83\x94\xe2\x2e\xe8\xdd\x0b\xce\x0c\x29\x53\xe6\xa6\x48\x76\xac\x47\x9b\x1c\x2e\xe2\x50\xb3\x7e\xb3\xb4\x9e\xab\x78\x6b\xda\x8c\x38\x30\x47\x70\xfd\xaa\xe5\x6d\x77\x76\x1a\x9c\x77\x43\x97\xe5\x1a\x13\xdb\x48\xa6\x5f\x43\xbf\x53\x23\xdf\x39\x3e\x01\xe2\xdc\x42\x3b\x13\x32\xb9\x60\xd4\x51\xf3\x67\x2b\x79\x85\x0a\x24\x2f\xda\x0e\x72\xa7\x79\x4b\xe1\x95\x04\xaf\x73\xe7\x5b\x86\x57\x65\x8c\xa9\x89\x85\x90\xad\xfa\xcc\x55\xfb\xfd\x50\xf2\x40\x0e\xd5\x20\x6c\x52\xb5\xc0\x30\x28\x58\x1f\x6b\x51\xea\x1b\x9e\xb6\x00\xe9\xb1\xa3\xbe\x7a\x3b\xa4\x38\xd6\x93\xdf\x33\x90\xee\x7e\xaf\x87\xf2\xcf\x7a\xd5\xe8\x3d\xf9\xe8\xbd\x80\xdc\x80\x91\xd4\x6c\xf5\xe7\x44\x02\x35\x56\x8b\x9f\x3e\x8d\x7b\xfa\x8c\x77\x82\xd7\xfe\xa0\xfd\xc1\x89\x82\x76\xe3\xcf\x10\x0d\xc0\x8e\xdb\x4a\x8b\xac\x98\x6b\xa6\x98\x11\xa1\x4a\xb1\x13\x81\x94\xb3\x89\x01\xad\x34\xc2\x03\x0d\x90\x15\x6c\xf5\xcd\xed\x63\x0d\xfa\x24\x84\x53\x0a\x47\x2f\x2c\x93\xf4\x60\xb5\xa6\xe1\xaa\x40\x7c\x79\xda\x35\xc5\x0f\x04\x19\x03\xbc\x81\xea\xb7\x90\x26\xfa\xbd\xb2\x55\xbd\xa8\xf2\xd4\xb3\xa9\x8a\x69\xf6\xcd\x94\x1f\x02\x2a\x9a\xb6\xde\x40\x4b\xbf\x91\xbd\x65\xb1\xab\x29\x87\xef\x3a\x01\xb4\x46\x51\x81\xac\x01\xc7\x73\x70\xae\xb3\x60\xa0\x0d\x60\x20\x92\xca\xc8\xf7\x94\x63\xf3\xe1\x53\x38\x1f\x65\xd6\xa0\xd8\x58\x56\x0c\xb6\x80\xed\xab\x8b\x28\x14\x4e\x34\x7f\x26\xd7\xf2\x95\xc8\x93\x61\xf9\x42\xba\x9d\x72\x0e\xb5\x59\x43\x1c\x67\xf7\xf6\x05\x93\x11\xfa\x67\x8c\x0f\x2f\x17\x7c\x75\x94\x97\xa9\x1e\x03\x92\xe9\x82\x9b\x58\xb5\x83\x52\x4d\xd1\x13\xbf\x69\x64\x50\x81\x99\x6f\xf2\xf1\xac\xaa\x24\x21\x2d\x7d\x86\x63\xd7\xce\x53\x88\xf4\xed\x65\xbb\xbc\x67\x9c\x6d\x2b\xd5\x36\x92\x5c\x6b\x50\x3c\x4c\x72\xa8\x50\xea\x8f\x01\x9b\x27\x1a\x6e\x69\xa7\xc0\xf8\xe1\x20\xb8\x2d\x36\x44\xdf\x26\xa8\x16\x24\x45\xd1\xc8\xd2\x3b\x31\xa3\xdd\x7b\x65\x29\xef\xf0\x33\x64\x88\xee\xb8\x6a\x1f\xed\x1c\xb4\x80\x90\x79\x1b\xbb\xe2\x0f\x2d\xb1\x5f\x8d\x81\x9b\x69\xea\xfe\xcf\x86\xf1\x1a\xad\x1a\xd3\x64\xf0\xb4\x90\xd1\xaf\x0d\xa5\xb9\x57\xad\xeb\x68\x25\xb7\x93\x25\x5e\x67\xe6\x7b\xa1\x54\x34\xdd\x69\x10\xa4\x01\x38\xc1\xcc\xe2\x04\x53\x77\xf3\xb1\x47\x01\x01\xc3\x31\x0d\x2a\xd8\xaf\xf0\x51\x63\x20\x26\xa0\x41\xc1\xb2\xd5\xa4\x57\x76\xd8\x72\x95\xbb\x18\xcb\x45\x36\xd0\x38\x9b\x1d\x32\x67\x23\x05\x57\xb1\x84\xcd\xc1\xde\x3e\xc9\x4a\x6c\xd8\x92\xef\xc5\x6e\xc9\xd5\x9c\x9b\x0b\x37\xc0\x82\x89\xc5\xf3\x82\xfd\xb7\x3a\xf1\xb6\x7e\x6d\xda\x2f\xb1\x82\x0d\x09\x8c\x82\x1c\x8e\xbe\x28\x2f\x4f\x56\x12\xd2\x9c\x3b\x91\x67\x27\xcf\x30\xc2\xa1\x37\xc1\x9b\xf1\xac\xe3\x10\x3f\xba\x9c\xd8\x49\xb0\xf8\x15\xaf\xe5\xc8\x44\x4a\x65\x88\x0b\x6f\x99\xff\x12\x4b\xb2\x24\xd6\x5e\x93\xc9\xd9\xea\x1e\x1d\xcd\x15\xcc\xfe\xa7\x01\x76\x58\x99\xbf\x52\x5a\x05\x9b\x53\x6c\x79\xdb\x94\x7f\x7a\x81\xc1\xff\x23\x72\xf9\x7d\xfc\x2b\x3c\x15\x4e\xa0\x04\x47\x8b\x3e\x01\xd7\x0c\xc0\x78\x30\xa3\x92\xad\x83\x6c\x00\x74\x2e\x36\x54\xe5\x8c\xda\x38\xe7\xe3\x7f\xa8\x23\x27\x5e\xb0\x6a\x23\x24\x7c\x08\x56\x0b\xa5\x99\xe2\x5d\x64\xf8\x4c\x85\x2a\x4f\x99\x4a\x2b\xba\x49\x25\x96\xa5\x5f\xad\x69\x14\x7b\xc1\xf8\xe4\xea\x6c\x19\x3a\xf1\x08\x65\x2d\xad\xf1\x8c\x20\x96\x14\xff\x46\xd2\xf3\x1b\x70\x87\xcf\x00\x79\x58\x77\x59\xc1\x25\x8d\x8e\xe1\x42\xdf\xc0\x05\xa0\x4f\xe3\xdd\x4d\xd7\x93\x6b\xbf\x5d\x0d\xef\x40\x08\x37\x74\x4f\xf8\x5c\xcb\xea\xba\x6a\xbe\x3d\x4f\xe2\x78\x64\xd3\xbb\x01\x50\x92\xe4\x01\xba\x2c\x5c\x02\x3e\xa9\x53\xf7\xf6\xe7\x2d\x07\x16\x2a\x7a\xc6\x2e\x84\x0f\xa3\x84\x7c\x11\xa5\xe3\xa9\x23\x6c\x79\xf7\xb7\x13\xbf\x6d\x4f\x9f\xb6\x9d\xfd\xf9\x7b\xf7\x2f\x00\x00\xff\xff\x66\xd5\x65\xa6\x7e\x88\x07\x00") +var _operatorsCoreosCom_clusterserviceversionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x73\xe4\xb6\x95\x30\x8c\xff\x9f\x4f\x81\x92\xbd\x8f\xa4\x75\x77\x6b\x26\xc9\xe6\xb7\x3b\xbf\xbc\xeb\xd2\x4a\xb2\xa3\xd7\x33\x1a\x95\x24\xdb\x4f\xca\xf1\x3a\x68\xf2\x74\x37\x56\x24\xc0\x00\x60\x4b\x9d\xc7\xcf\x77\x7f\x0b\x07\x00\x09\xf6\x45\xea\x26\x39\xa3\x8b\x81\x54\xc5\xa3\x26\x09\x82\x07\x07\xe7\x7e\xa1\x05\xfb\x01\xa4\x62\x82\xbf\x23\xb4\x60\x70\xaf\x81\x9b\xbf\xd4\xe8\xf6\xdf\xd5\x88\x89\xa3\xf9\xdb\xdf\xdd\x32\x9e\xbe\x23\x27\xa5\xd2\x22\xbf\x02\x25\x4a\x99\xc0\x29\x4c\x18\x67\x9a\x09\xfe\xbb\x1c\x34\x4d\xa9\xa6\xef\x7e\x47\x08\xe5\x5c\x68\x6a\x7e\x56\xe6\x4f\x42\x12\xc1\xb5\x14\x59\x06\x72\x38\x05\x3e\xba\x2d\xc7\x30\x2e\x59\x96\x82\xc4\xc9\xfd\xab\xe7\x6f\x46\x7f\x1a\xfd\xfe\x77\x84\x24\x12\xf0\xf1\x1b\x96\x83\xd2\x34\x2f\xde\x11\x5e\x66\xd9\xef\x08\xe1\x34\x87\x77\x24\xc9\x4a\xa5\x41\x2a\x90\x73\x96\x80\x7b\x5e\x8d\x44\x01\x92\x6a\x21\xd5\x28\x11\x12\x84\xf9\x4f\xfe\x3b\x55\x40\x62\x56\x31\x95\xa2\x2c\xde\x91\xb5\xf7\xd8\x79\xfd\x62\xa9\x86\xa9\x90\xcc\xff\x4d\xc8\x90\x88\x2c\xc7\x7f\x3b\x20\xd8\xd7\x5f\xdb\xd7\x3b\xc8\xe1\xf5\x8c\x29\xfd\xdd\xe6\x7b\xde\x33\xa5\xf1\xbe\x22\x2b\x25\xcd\x36\x7d\x08\xde\xa2\x66\x42\xea\x8b\x7a\x59\x66\x19\x89\x9a\x87\xff\x76\x37\x32\x3e\x2d\x33\x2a\x37\xcc\xf6\x3b\x42\x54\x22\x0a\x78\x47\x70\xb2\x82\x26\x90\xfe\x8e\x10\xff\x2e\x3b\xf9\x90\xd0\x34\xc5\x8d\xa4\xd9\xa5\x64\x5c\x83\x3c\x11\x59\x99\xf3\xea\xe5\xe6\x9e\x14\x54\x22\x59\xa1\x71\xb3\x6e\x66\x80\x50\x23\x62\x42\xf4\x0c\xc8\xc9\xf5\x0f\xd5\xad\x84\xfc\x8f\x12\xfc\x92\xea\xd9\x3b\x32\x32\x1b\x30\x4a\x99\x2a\x32\xba\x30\x4b\x08\xee\xb2\xbb\x79\x6a\xaf\x05\xbf\xeb\x85\x59\xaf\xd2\x92\xf1\xe9\x43\xef\x77\x1f\xb1\xdd\x12\xe6\xc1\x3e\x85\xaf\xff\x61\xe5\xf7\x6d\x5f\xef\x3f\x9f\x9a\x37\x13\x3d\xa3\x9a\xe8\x19\x53\x44\x70\x20\x12\x8a\x8c\x26\xa0\x1e\x58\xd0\x9a\x5b\xec\x8a\xae\x56\x2f\x6c\x58\x52\x38\xa5\xa6\xba\x54\xa3\x62\x46\xd5\x2a\x88\x2f\x97\x7e\x5d\x33\x9d\xbd\x71\xfe\x96\x66\xc5\x8c\xbe\x75\x3f\xaa\x64\x06\x39\xad\x71\x40\x14\xc0\x8f\x2f\xcf\x7f\xf8\xc3\xf5\xd2\x05\xd2\x84\xce\x5a\xec\x27\x4c\x19\x50\x21\x05\x21\x9e\x84\xe0\xde\x2d\x0a\x20\x7f\x5f\xfb\xcc\x75\x01\xc9\xdf\x47\x2b\x2b\x17\xe3\xff\x81\x44\x07\x3f\x4b\xf8\x47\xc9\x24\xa4\xe1\x8a\x0c\x80\x3c\x59\x5a\xfa\xd9\xc0\x3f\xf8\xa9\x90\x86\x2c\xe8\xe0\xc8\xdb\x11\xd0\xc5\xc6\xef\x4b\x5f\xbb\x6f\x40\xe2\xbe\x31\x35\x24\x11\x14\xe2\xa3\xc3\x38\x48\x1d\x1c\x2d\x9e\x32\x65\x90\x43\x82\x02\x6e\x89\x24\xa2\x10\x77\xdf\x34\x22\x06\x00\x20\x95\x21\x00\x65\x96\x1a\xda\x39\x07\xa9\x89\x84\x44\x4c\x39\xfb\x67\x35\x9b\x22\x5a\xe0\x6b\x32\xaa\x41\x69\x82\xa7\x96\xd3\x8c\xcc\x69\x56\xc2\x80\x50\x9e\x92\x9c\x2e\x88\x04\x33\x2f\x29\x79\x30\x03\xde\xa2\x46\xe4\x83\x90\x40\x18\x9f\x88\x77\x64\xa6\x75\xa1\xde\x1d\x1d\x4d\x99\xf6\x54\x3f\x11\x79\x5e\x72\xa6\x17\x47\x48\xc0\xd9\xb8\x34\x84\xf3\x28\x85\x39\x64\x47\x8a\x4d\x87\x54\x26\x33\xa6\x21\xd1\xa5\x84\x23\x5a\xb0\x21\x2e\x96\x23\xe5\x1f\xe5\xe9\x17\xd2\x6d\xb2\xda\x5f\x02\xdf\x5a\x74\x26\x9e\xc0\x3e\x08\x6b\x43\x5e\x2d\x26\xd9\xc7\xed\xb7\xd4\x20\x35\x3f\x19\xa8\x5c\x9d\x5d\xdf\x10\xbf\x00\x77\x2e\x11\xc2\xf5\xad\xaa\x06\xb6\x01\x14\xe3\x13\x90\xf6\xce\x89\x14\x39\xce\x02\x3c\x2d\x04\xe3\x1a\xff\x48\x32\x06\x5c\x13\x55\x8e\x73\xa6\x15\xe2\x1c\x28\x6d\xf6\x61\x44\x4e\x90\xe9\x91\x31\x90\xb2\x48\xa9\x86\x74\x44\xce\x39\x39\xa1\x39\x64\x27\x54\xc1\x27\x07\xb5\x81\xa8\x1a\x1a\xf0\x6d\x0f\xec\x90\x67\xaf\x3e\xb0\x72\xc6\x08\xf1\xbc\x74\xe3\xee\x6c\x3c\xc3\x24\x85\x24\xa3\xd2\x0a\x05\x44\x43\x96\x91\x8f\xef\x3f\x90\x99\xb8\x33\x58\xcc\xb8\xd2\x34\xcb\xf0\x14\x38\xfe\x6c\xc9\x69\x42\x39\xc9\x29\xa7\x53\x20\xb4\x28\x14\x99\x08\x49\x28\x99\xb2\x39\x70\x7f\xba\x46\xdb\x2e\x7e\x13\x91\x20\x96\xb8\xaf\x65\x50\xfe\xaa\x5b\xe0\xd2\x95\x4d\x64\xc3\x8c\x15\x19\xe8\x01\xa8\x1d\xd7\xf7\x22\x66\x73\x52\x72\xa5\x65\x89\x9b\x9d\x92\x5b\x58\x38\x24\xcf\x69\x41\x94\x16\xe6\xc7\x3b\xa6\x67\x84\x86\x08\x4e\x35\x62\xf1\x18\x88\x02\x4d\xc6\x0b\x62\xc4\x38\x24\x08\x5a\x88\x0c\xa9\x05\x3e\x8b\x84\x41\x82\x96\x0c\xe6\x40\xa8\x1c\x33\x2d\xa9\x5c\x54\xd8\xb0\x0c\xd0\x47\x80\x8a\x1f\x1b\x08\x0f\x9b\x41\x42\x1e\xc2\x45\x62\xc9\xad\x93\x5d\xd2\x4a\xb0\xdc\x02\x7a\x97\xe7\x0e\xdf\x6a\x71\x54\x39\x7c\x03\x45\x0c\x5e\x39\xf9\xa0\x92\x6b\xf1\x4d\x0e\xb1\x52\x22\x64\x85\x19\x06\x6c\x21\x12\x8e\xc1\x90\x13\x49\xb9\xb9\xb0\x16\xb9\x5b\x40\xeb\x21\xb4\x31\x43\xdc\xf1\x75\x38\x1a\xce\x4d\xa5\x6c\x08\x4c\xe1\x60\x1a\xf2\x0d\x33\x3f\x08\xbb\xea\x67\xb3\xc0\x39\x4b\xc1\x00\x51\x53\x66\x51\xc7\x9c\x56\x3a\x16\xa5\xb6\xb0\x73\xb7\xa4\x64\xce\x28\xa1\xd3\xa9\x84\x29\x22\xf0\xc6\xd7\x3e\x02\x13\x3b\x36\x1f\xd0\x7a\x0c\xad\x24\xff\xe0\x1d\x86\x0c\x3e\x78\x03\x5f\x77\xcc\xc3\x1b\x56\x85\xc5\xe6\x78\x6c\x0f\xed\xa0\x89\x81\x89\x07\xad\x90\x0f\xde\xbc\xcd\xde\xda\xf1\xc8\x0e\xdb\xd1\xdc\xe7\xa5\x85\xb8\xab\x63\x73\x3e\x6a\xd2\x6c\xc8\x01\xde\x58\x13\xdf\x31\x90\x02\xe4\x44\xc8\xdc\x1c\x14\x4e\x28\x49\xac\xfc\x56\x11\x1e\x24\x8d\x3c\x79\x08\x9c\x64\xdb\xfd\xb7\x63\x1b\x2c\xb0\x63\x48\x0a\xaa\x67\x8f\xdc\xb6\xdd\x56\xd9\x11\x02\xed\xd1\x9b\x1f\xa1\x66\x2b\x73\xd7\x1c\xa6\xf7\xb9\x0d\x18\x7a\x9f\x14\x79\xce\x36\xb3\x36\x50\xed\x8a\xde\x7d\x00\xa5\x0c\xcb\x46\x29\x4d\xd2\x3b\x02\x3c\x11\x86\x58\xfc\xbf\xd7\x1f\x2f\xec\xb4\x23\x72\xae\x09\xcb\x8b\x0c\x72\x23\x88\x91\x0f\x54\xaa\x19\xcd\x40\x22\x77\xfa\x9e\xe7\x8d\xbf\x1d\x26\x96\x0a\x52\x43\x8b\x52\xc8\xe8\xc2\x4e\x96\x42\x22\x52\x43\xa3\x85\x24\x85\x11\x70\xf3\xa2\xd4\x40\xa8\xbd\x8a\xef\x65\x7c\xba\x8e\x48\x77\x02\x0d\x31\x92\x48\x4e\xf5\x3b\x32\x5e\xe8\xc7\x50\x9f\x90\xfb\x61\xba\x2d\x0d\x08\x17\xf3\x38\x25\xb0\x63\x2b\x7a\x10\x4e\xfc\xe8\x57\x1a\x21\x94\x32\x0e\xf2\x52\x48\xbd\x0d\xd1\x32\xca\xc7\x14\xe4\x83\x77\x7a\x90\x31\xae\xff\xf0\xfb\x07\xee\x4c\xa1\xc8\xc4\xc2\xe0\xc5\xe3\x67\x65\xcb\xef\xd9\xfa\x5c\x6f\x3b\xdf\xb6\x67\x79\xcb\xf9\xac\x71\xaa\x8f\x99\xd6\x29\x50\xad\x26\xe2\x7d\x7d\x5b\xa5\x04\x3e\x19\xf3\xbb\x3c\xf7\xd6\x86\x2b\x98\x80\x04\x9e\x38\xda\xf4\x5d\x39\x06\xc9\x41\x83\x0a\x04\xe9\x45\xe1\x28\x8d\x91\x05\x97\xd9\xdd\xd3\x70\xb9\x47\xe4\x19\x7f\xdb\x23\x52\x8d\xbf\xed\x31\xd9\xc6\x8e\x5d\xd8\xe6\xe3\x48\x67\xc7\x4e\x34\xf6\x71\x04\x6c\x31\xe9\x7c\xbd\x39\xa7\xc3\xbc\x46\x27\x7e\x06\x12\xde\x75\x63\x19\x0d\xf9\x6e\xc2\x20\x4b\x09\x33\xc2\x9b\x59\x2c\x19\x67\x22\xb9\x75\x76\xcb\xab\x53\xa2\x84\x15\xf7\x8c\x84\x6f\x18\x6d\x22\xb8\x2a\x73\x20\xec\x31\x0c\x8e\x22\x5d\x14\xe9\xa2\x48\xf7\x52\x44\x3a\xeb\x1f\x78\x0e\x94\x6a\x69\x21\x1b\x69\x15\xde\x17\xa9\xd5\x43\x23\x52\x2b\x1c\x91\x5a\x3d\x32\x5e\x1c\xb5\xda\x4a\x4e\x7b\x74\xae\xc7\x0e\x72\x34\xa6\x46\x63\x6a\x34\xa6\xba\x11\x79\x99\x1b\x91\x97\x45\x5e\x16\x8d\xa9\x0f\x4d\x19\x8d\xa9\x3b\x4e\x14\x8d\xa9\xd1\x98\x1a\x8d\xa9\xd1\x98\xfa\xd8\xc7\x44\x91\x2e\x8a\x74\x51\xa4\xdb\x76\x31\xd1\x98\x1a\x8d\xa9\x0f\x8d\x48\xad\x82\x11\xa9\xd5\x03\xe3\x75\x53\xab\xee\xc6\xd4\x24\x03\xca\xd7\x2b\x55\x4b\xf1\xdf\x78\x1f\x8a\x46\x6c\xc2\x5c\x1e\x84\x7b\x9a\x8c\x61\x46\xe7\x4c\x94\x92\xdc\xcd\x80\xfb\x94\x1d\x32\x05\xad\x0c\x16\x80\x86\x75\x82\xf9\x23\xb4\xe6\x61\xfa\x32\x24\xc0\xe9\x38\x5b\x3b\xf1\x63\xa4\xc4\x3d\xf9\xb0\xf1\x78\x2c\x84\xf9\xba\x55\x88\xa1\xaa\xe3\x35\x9d\x5d\xe2\x99\xf7\x36\xe5\xd8\xad\x0f\x6a\x3e\xb9\x3a\xed\x2b\x94\x99\xfc\x8d\x93\xf3\x6a\x56\x82\x96\x69\x4c\x94\x30\x3c\xc4\xfc\xfa\xf1\x8e\x43\x8a\x49\x6e\x03\xc2\xb4\xb9\xc1\x1c\x7a\x96\x30\x9d\x2d\xaa\x17\x8f\xf6\x76\xdf\xc4\x67\x14\x12\x7d\x72\x75\xba\xbd\xf9\xde\x6f\xc0\xe7\xb0\xd4\x47\x3b\x7c\xb4\xc3\x57\x23\x8a\x41\x2d\x27\x8d\x62\xd0\x03\xe3\x75\x8b\x41\xcf\xdd\x6e\x1d\xad\xcd\x24\x5a\x9b\x1f\xbe\x2d\x5a\x9b\xa3\xb5\x39\xda\x6f\x36\x8c\x28\xb8\xe0\x88\x82\xcb\x23\xe3\xc5\x09\x2e\xd1\xda\x1c\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xf5\x12\x43\x77\xa3\xd1\x2f\x1a\xfd\xa2\xd1\x2f\x72\xa3\xc8\x8d\x1e\x19\x2f\x8e\x1b\x45\xa3\xdf\xae\x13\x45\xa3\xdf\xda\x11\x8d\x7e\x8f\x8c\x68\xf4\x8b\x46\xbf\x0d\x23\x0a\x2e\x2d\x27\x8d\x82\xcb\x03\xe3\x75\x0b\x2e\xd1\xe8\x17\xa9\x55\xa4\x56\x91\x5a\xbd\x0c\x6a\xd5\xdd\xe8\xf7\xc8\x49\x7a\xf8\xd9\x87\x4f\xca\x83\xcf\xb2\xe4\xa1\x17\x6e\x82\xe8\x03\x10\x7c\x94\x70\x3d\x46\xae\x86\x64\x4c\x15\xfc\xe9\x8f\x2b\x75\xcb\xc3\x5b\x72\x48\x19\x35\xaf\x5a\x7b\xc7\xe3\x24\xac\x7e\xc5\xe6\x3d\xdb\x62\xef\xab\x65\xb4\x9c\xc5\x15\x56\x7e\x34\x28\xd6\x6c\x6d\x7a\x6e\x6f\xbe\xd6\x92\x6a\x98\x2e\x82\x42\xde\x68\x93\xad\x39\x0f\xdf\x50\x80\xbe\x52\x1a\xef\x66\x20\x01\x1f\xf2\xa5\xa7\x95\x9f\x94\xa9\x2a\x7a\x39\x6d\x51\xdc\xf7\xb1\x70\x64\xff\x9e\x35\x97\x1f\xdb\xb4\x75\xd5\xb7\xd7\x02\xcb\x03\xe8\xd4\x5a\xaf\x4f\xab\x14\xe0\x65\x88\x15\x54\x1a\x0a\xe9\xad\xdc\xc8\xb4\x83\xbb\x97\xe0\xbd\x89\x28\x6e\xc1\xa9\x1f\xe7\xd0\xc3\x20\x53\x79\x93\x65\x7d\x1b\xc6\xec\x7a\x60\x5c\x82\xcc\x99\x52\x9b\x02\xae\x9b\x4b\x7f\x8c\x6c\x6e\x41\x2e\x37\xc0\xdf\x7f\x51\xb0\x9c\x4a\x7c\xc2\x1d\x90\x63\x9a\x10\x59\x66\x46\x98\xe2\x29\x71\xe5\xaf\x09\x4d\x12\x51\x72\x4d\x38\x40\x6a\x2d\x1b\xeb\x70\x75\x0b\x62\xbb\x85\xfc\xb4\xad\xf4\x34\xb4\xeb\x7c\xf4\x2e\xf7\x0d\xc7\xf6\x13\xd6\x16\x54\x0f\xc7\xf6\xd2\x16\xbe\xfe\x71\xae\xb5\x0b\x2b\xdc\x9a\x11\x36\xf6\xf7\x52\x64\x2c\x59\x5c\x95\x19\x90\x99\xc8\x52\x85\x65\xfd\x0d\x77\xaf\x1c\x0e\xa1\x88\x5c\xe0\xdd\xb8\xfa\x01\x19\x97\x9a\xa4\x02\x14\xe1\x42\xfb\xc2\x00\x8d\xc7\xad\x8b\xe9\x6e\x66\x5b\x3b\x98\x87\x08\x2d\x8a\x0c\x53\x29\x84\x11\x5a\xee\x66\x2c\x99\xd9\x7e\x35\x05\x4d\x60\xdd\x6d\xdb\x4b\x2f\x5b\x89\xd7\x64\x27\x11\x9b\x78\x9b\xd5\xf8\x31\x54\x21\x3b\xca\xda\xc4\x96\x88\xff\x56\x8a\xb2\xd8\xf2\xf6\x55\xcb\xa2\x7d\xda\x50\x79\xbd\xd4\xc0\xc6\x5f\x74\x2e\x23\xbb\x37\xf6\xb6\xca\x24\x3a\x22\xe4\x7c\x42\xf2\x32\xd3\xac\xc8\xf0\x11\x5b\x6d\x40\x11\x2a\xa1\xe6\x1b\x03\x42\xf9\xc2\x7b\xa0\x5c\x9b\x08\x48\x09\x9d\x9a\x19\x35\xf6\x87\xf1\x25\xe9\x79\x99\x83\x39\xcd\x69\xfd\x12\x54\xa7\xf8\xa2\x9e\x9d\xdc\xb1\x2c\x33\xf2\x2c\xcd\x32\x71\xb7\x9e\x2d\xad\x1b\xbb\x09\x85\x64\x37\xc1\x90\xec\x2e\x02\x13\xc2\x05\xf7\xa6\xdd\xef\xaf\xde\xb7\xdb\xc4\x8b\xe6\x1c\xae\x17\x08\x68\x03\xd2\x82\x4a\xcd\x68\x46\x4a\x99\x29\xbb\x8f\xd4\x28\x01\xd2\x37\x53\x99\x51\xf4\x0c\x26\xa0\x6c\xd7\x0e\xf2\xaf\x76\xe7\x1c\x60\xed\xf9\x14\x3c\x5b\x10\x6a\x77\x7e\x52\x66\xd9\x80\x4c\x18\xa7\x86\xec\x42\xe1\x33\x61\x8c\xfe\x44\xae\x19\x4f\xc0\x7c\xd3\xb0\x12\x2c\x70\x45\x66\x46\x73\xbe\xab\x43\x9a\x0e\x5c\x5b\x11\xab\x2d\x2b\xf7\x0a\x73\x60\x13\x3a\xce\x00\xfb\x5a\x38\x91\xe5\x4a\x64\x68\xde\x76\x86\xef\xd4\xf6\x22\xa1\xe1\xe5\xff\x62\x1c\x95\x14\x72\x85\x8c\xc3\x28\x3b\xc0\xf4\xcc\xe8\x3e\x45\x91\x2d\x0c\xa1\x30\xb8\x53\x23\xd4\x81\x2a\x93\x99\xf9\xa4\xbd\x42\xa4\x6a\xcf\x90\x91\x3d\x05\x89\x04\xad\xf6\x0e\xcd\x5f\xcb\xdf\x80\xdf\x17\x3e\x77\x44\x0b\xb6\x77\x38\x20\x08\x20\x6c\x74\x22\xf4\xec\xe5\xe2\xa1\xff\xd6\x46\x7f\xad\xc7\x46\x53\x6b\x0d\x67\x70\x5d\x3b\x44\x61\x9b\x60\x18\x1a\xad\x01\xf3\xa4\x0c\x52\x22\x1a\xf8\xf6\x50\xab\xc4\x9a\x90\x63\x4e\x20\x2f\xf4\x02\xb1\x38\x07\xca\xdd\xdd\x30\x07\xb9\xd0\x33\xa3\xad\x32\xf5\xf2\x0f\xff\x96\x8e\xa5\x7a\xac\x05\xb8\x3b\xf0\x1e\xb8\x35\x92\xdb\xce\x4a\xcb\xc0\xdd\xff\xd7\xfd\x50\xea\x35\xe2\x53\x4d\xcd\x5f\x2c\x28\x91\xbd\xb6\x02\xe3\x0f\xe6\xc9\x26\x08\xed\x4f\x96\x5a\x56\xf4\xe3\xfd\x7b\xdb\x45\xc9\xc1\xea\x3b\xc6\x53\x2b\xa2\x1e\x6b\xdb\x9e\x08\xae\xc0\x2c\x38\xb1\x99\x89\xbe\xc6\x51\x6a\x09\xa4\xdb\x89\xb5\xe0\xc7\xb5\xbf\x44\xd0\xaf\x0a\xb6\xdb\x0a\xa3\x8f\x4c\x1f\x68\x3e\xcf\x41\x59\xc1\x7e\x4d\x0d\xf9\xc7\x50\xb0\x81\x75\x46\x19\x14\xc8\xe8\x18\x32\xdb\x8c\xc9\x5c\xad\x97\x4f\x8e\xdf\x7f\xa8\xfa\x96\x49\xa0\x8f\x58\xba\x3e\x81\x8a\xb2\x85\x4b\x75\xa5\xfb\xdb\xea\xd8\x5e\x2a\x45\x50\xec\x66\x26\x26\xd7\xa0\xed\x01\xcc\x69\x61\xce\x9f\x9d\x63\xad\x95\xf3\x3d\x42\xfa\xf1\xc3\xb2\x93\x34\xbf\x7d\xb7\xa6\x75\x2f\xd9\xea\xa8\x6c\xe7\x0b\xde\xe5\xec\x3d\x60\xfb\xa8\x47\x03\xcc\x4b\x08\xed\x24\x7e\x27\xa3\x27\x55\xe7\x3d\x8b\xc1\xca\xa6\x4c\xdb\x04\x75\xe9\x7f\xaf\xa7\xe8\x79\x0b\x76\x51\xa7\x8c\x46\x9d\x41\xa2\xc5\xc3\x05\xe1\xfc\xcd\x1a\xf2\x22\x7b\xec\xe4\x91\x9d\x55\xaf\x9c\xf1\x2b\xa0\xe9\xe2\x1a\x12\xc1\xd3\x2d\x09\x6c\x63\x3f\x3e\x30\xce\xf2\x32\x27\xbc\xcc\xc7\x80\x20\x56\x76\x2e\x24\x24\x56\xad\xa5\x84\xc3\x5d\xb6\x70\xc4\x23\x25\x85\x48\x3d\x3d\x19\x1b\x35\x8c\xa6\x0b\xec\x7c\x86\xa5\x53\xf9\xc2\x4c\xc2\x74\xcd\x7d\x24\x49\x24\x55\x46\x60\x1a\xe0\xa4\x4c\x1b\x5e\x36\x06\xf4\x3a\xb1\x14\xcc\x1e\xd3\x39\x65\x99\x11\xba\x47\xe4\x14\x26\xb4\xcc\xb0\x81\x1f\x79\x43\x0e\xcc\xcb\xbc\xa6\xb5\xee\x01\x23\x08\x2b\x61\x74\x74\xe5\xb2\xdf\x71\x41\x87\x3b\xd8\xd1\xb7\xa9\xec\xe7\xc7\xb6\x15\xfe\xfc\x28\x68\xa9\xb6\x55\xd0\x1b\x1b\x73\xce\x53\x73\x1e\x42\x19\x35\x20\xe9\x4c\xb9\x99\xb7\x63\xd9\x0f\x57\x45\x58\xb3\x6a\x29\xa6\x12\x94\x3a\x05\x9a\x66\x8c\x43\x7b\xfc\xba\x99\x01\xc9\xe9\x3d\xe2\x98\x66\x39\x18\x49\x24\xc4\x30\x1a\x7e\x95\x16\x24\xa7\xb7\x50\xbd\x9e\x8c\x61\x82\x0d\x1a\xf1\x83\x83\xdd\xb7\xf8\x33\xa1\x2c\x83\x74\x84\xef\x08\x66\xa9\xfb\x1a\x5b\xc4\x31\x7f\x33\x5e\x82\x79\xaa\x90\x02\xd5\x4c\xfb\x68\xc8\xe3\x91\x87\x52\x73\xb3\xa5\xc3\xbe\x97\xdf\xe5\x12\x28\xce\xee\x13\x6b\xfe\x93\x40\x15\xde\x66\x71\x53\x95\x72\x62\x94\x4a\xaf\x8b\x06\x0b\x72\x4d\x60\xc9\x85\xd0\xae\x25\x60\xf5\x81\xf8\xb4\x6b\x51\x09\x4a\xb3\x1c\x0f\x58\x5a\x4a\xdf\x30\x13\x61\x46\xd7\x6f\x7d\xe3\xa8\xfc\xe9\xcd\x9b\x2d\xe5\xb7\x4f\x8f\xf4\x12\x50\x87\x6e\x83\x2f\x17\x15\x1d\xf2\xe4\xdf\x28\xc7\x66\x8f\x99\x13\x90\xb1\xf3\x27\x48\xf4\x20\x32\xa5\x19\x9f\x96\x4c\xcd\xc8\x18\xf4\x1d\x00\x27\x70\x6f\x6b\x5f\x90\x7f\x82\x14\xb8\xa9\x06\xbc\xb5\xf3\xa0\x01\xb4\xb7\xcf\x07\x62\x73\xa6\x98\xe0\x7f\x61\x4a\x0b\xb9\x78\xcf\x72\xf6\x48\x51\x52\x3f\x56\xfb\x1f\x57\x10\x14\x59\x8a\x5d\x8b\x59\x42\xaf\xc1\x7e\xb0\x04\xb4\x6d\x6a\x61\x15\x57\x62\xce\xc9\x98\x26\xb7\x9f\x0c\xc0\x6f\x9e\x0b\x84\x3d\xbb\x6e\x01\x55\x94\xf7\xaa\x09\x90\x6c\x59\xa4\x3c\xbb\xb7\xf0\x69\x40\xf9\x6e\x26\x14\xe0\x0d\xd6\xfc\x88\x8f\x79\x77\x01\x53\x15\xc1\x30\xa7\x5b\x70\x50\x84\x4e\x26\xcd\x3b\xea\xc3\x8e\x92\x67\x5e\x2a\x4d\x72\xaa\x93\x99\x35\x72\x89\xb4\x12\x27\xf6\x95\x13\xfb\x77\x81\xf2\xd6\xe6\xe5\xdd\x0d\xc1\xc4\xae\xf3\xec\xde\xe8\x96\x8f\xfa\x79\x9a\xa3\x01\xf2\xe5\x69\x9a\xba\x71\xd6\xdc\x10\x27\xb7\xe5\xb6\x79\xf0\x0d\x9a\x86\xeb\x5f\x70\x17\x8e\x2f\x4e\xb7\x37\xd2\xb4\x51\x70\x77\x56\x71\x97\x8d\xe0\x0f\x7c\x94\x37\xa6\xba\x2b\x4d\x4b\xb8\x6d\x1a\x3d\x20\x94\xdc\xc2\xc2\xf6\x97\x5e\x69\xd8\x2b\x21\x73\x92\x04\x60\xdf\x5a\x73\x93\x6b\x36\xbd\xc3\x7a\x77\xc6\x1e\x3b\x76\x73\x52\xf8\x31\x34\x0b\xdd\xf1\x09\xff\xd1\x3b\x3c\xb6\x3b\x82\xdb\x71\x0b\x8b\xdd\x1e\x58\xda\x6e\xb3\x0b\x4e\xf7\xb1\xfb\x6e\x7e\xa8\x04\xbd\x6a\xab\x77\xf3\x1e\x85\x63\x67\xe3\x95\x1f\x1e\x88\x9d\x3e\xaf\x42\xbf\xd0\xca\x64\xbe\x71\x5f\x59\x64\x34\x67\x7a\xc6\x0a\x64\x44\xde\x4d\xe0\xdb\x9f\xff\x40\x33\x96\x56\x53\xd8\xf3\x7b\xce\x07\x46\x7c\x32\xff\x41\xa2\x6b\xc5\xb5\x53\x01\xea\x42\x68\xfc\xe5\xb3\x01\xc8\x2e\xb3\x13\x78\xec\x14\xce\x3e\x8d\x54\x06\x15\xaf\xa0\x73\xba\x1a\xf9\x9a\x5f\x15\x28\x99\x22\xe7\x9c\x08\xe9\xe1\x80\xbd\xec\xed\x44\x76\x0a\xe4\x13\x63\xeb\xfa\x40\xcb\xf5\xda\x39\x1c\xf8\x84\x6c\x40\xef\x81\xe9\xdc\x54\x28\x1f\xd8\x2b\xb6\x57\x7e\x86\xd2\xae\x13\x55\xa9\x77\x7f\xb3\x84\xe4\x20\xa7\xe8\x8b\x49\xb6\xf6\x45\x34\x37\x65\x37\xba\x6b\xc7\xce\xd4\x37\x7c\xe1\x4e\x58\x80\xac\xc9\x9a\x80\xba\x30\x37\x3b\x43\xc3\xe4\xf4\x7f\x0c\x05\xc7\x3d\xf8\xbf\xa4\xa0\x4c\xaa\x11\x39\x26\x8a\xf1\x69\x06\x8d\x6b\x4e\xc3\x08\xa7\x31\x33\x30\x45\x0c\xa9\x9d\xd3\xcc\xe9\x52\x94\x13\xb0\x36\x2b\x33\xfb\x32\x4b\x1d\x38\x49\xc5\x50\x9e\xca\x05\xb6\x77\x0b\x8b\xbd\xc1\x0a\xd2\xec\x9d\xf3\x3d\xcb\x5b\x56\xd0\xa4\x62\x44\xe8\x3d\xdb\xc3\x6b\x7b\x7d\x72\xe1\x1d\x19\x4e\x5b\x3b\x5a\xf3\xa5\x5b\x63\x84\x8f\xfa\x68\x29\xac\x37\xb4\x44\x17\xeb\xa4\x05\x29\x15\x58\x69\x1d\x4f\x19\x01\x2f\x67\xa2\x54\x89\x8a\x29\x87\x3b\x94\x1e\x9f\x8d\xe0\x67\x34\x09\xc6\xa7\xdf\x17\x29\xd5\x5b\x85\x9b\xda\xd1\x80\xc8\xfe\x95\x9d\x84\x94\x38\x8b\xc1\xad\x09\x9b\x92\x82\x4a\x9a\xab\x11\xb9\x74\x75\x0f\x11\xd3\xd8\x24\xb4\x25\x3a\xd8\xdd\x2c\x0a\x20\xff\x0f\xb9\x0a\xd7\x32\x22\xc3\xe1\x90\xdc\x7c\x3c\xfd\xf8\x8e\xd8\x5f\xac\x94\xad\x05\x99\x08\x54\x82\x44\x29\xcd\xab\xe6\xc0\x51\xf1\x37\xf2\xbd\xe0\xf0\x71\x62\x4e\x08\xd5\x30\x07\x49\xee\xcc\x56\x25\x2c\x85\xca\x7a\x35\xda\xff\xb4\x78\xdc\x4e\x32\xc9\xe9\xfd\x75\x29\xa7\x3b\x6c\x00\x59\xd9\x84\xd0\x64\x53\x2b\x93\x88\x7a\x61\xde\xae\x4a\x66\x90\x96\x19\xa4\x84\x8e\xc5\x1c\x1a\x26\xdb\xe6\x63\xc8\xd2\x4b\xf0\x0f\x1a\x9e\x37\x56\x22\x2b\x75\xa5\xac\x1e\xc0\xfd\x3b\xf2\x6f\xe8\xf4\xa6\xa4\x00\x99\x00\xd7\x74\x0a\xcb\x66\x00\x7b\xdf\xdb\x37\xff\x72\xe8\xf8\x91\x99\xd1\x59\x4f\xde\x18\x8c\xf8\x40\xef\xbf\xe7\xb5\x69\x90\x29\xf2\x66\x44\x8e\x97\x5e\x86\xcf\x65\x49\x99\xa1\xad\x05\x1d\xf9\xc1\x2b\xc7\x0b\x22\x45\x89\xae\x7c\x52\x16\x4d\x6d\xf6\xf7\xff\xf6\x2f\x46\xe9\xa3\x79\x91\xc1\x3b\x5f\x2e\xd5\xaa\xcd\x46\x86\xd1\x82\xfc\xe1\xcd\xbf\x58\xea\x69\xce\x67\xad\x15\xd6\x30\xa3\x06\x60\x65\x41\x58\x6e\x83\x34\x21\x5b\xd4\x75\x57\x65\x13\xfd\x95\xa6\x52\xab\x01\x41\x7f\x7f\x25\x1c\x6a\xa1\x69\xb6\xa4\xe5\xa3\x16\x0e\x77\x16\x48\xa9\x40\x98\x00\x1a\xaa\xc8\xdb\x3f\xbc\xf9\x97\x55\x73\xca\x47\x9e\x00\x3e\x89\x4f\x60\x00\xc6\xd8\x28\xf7\xb7\x2c\xcb\x20\x1d\x3c\xba\xfc\x49\x29\xf5\x0c\xe4\x80\x00\x57\xde\x58\x65\xd6\xb7\xb4\x36\x9c\x5d\x96\x9c\xa3\x8c\x60\xad\xc3\x68\xd1\x0a\x2c\x5c\xee\x63\x0d\x23\xd4\x24\x17\x4a\xaf\x5f\xf2\xf6\xc7\xcd\x0c\xca\x17\x1f\x27\xbb\x8a\x03\xc3\x16\x66\x88\xd5\xa7\x5b\x88\x94\xf7\xc3\xdb\x2a\x87\x72\xc8\xb8\x1e\x0a\x39\xb4\xd3\xbc\x23\x5a\x96\x8f\x7b\x0d\xea\x91\x37\x4e\xc0\x67\x20\x03\x65\x70\xde\x56\x76\xf5\x93\x9c\xfc\xf6\xe7\x39\x15\x77\x7c\x33\xe5\x40\xc2\xe9\x68\x46\xcb\x53\xdf\xb4\xb8\x2d\x1d\x1b\xf3\x76\x73\xf7\xff\x6f\x15\xbb\x77\x20\x07\xee\xec\x56\xa7\xdd\xc8\x55\xe8\xf1\x18\x6c\xf1\xf6\xea\xd8\x5a\xce\x67\x6d\x4e\xe6\x06\xfb\x9a\x35\x94\x6b\xe5\x84\xaf\xa1\x40\x76\x1d\xb5\x43\x46\x63\x44\x81\x39\xe7\x6a\xe3\x41\xcf\x80\x2a\xbd\x0e\x14\xf1\xa0\x3f\x3e\x1e\x0e\xed\x5f\x1e\x4d\xa1\xd3\x48\x48\x08\xf2\xda\xc6\x78\x62\x11\x65\xef\x0a\xac\x87\xcf\x86\xa2\x35\x84\xa8\xbd\xea\x48\x98\xfd\x6b\xca\x57\x9f\x2a\xa0\xc6\x1b\x39\xdb\x88\xd6\xee\xd1\x20\xe4\xd7\x99\x4e\x1d\xf1\xaa\x3c\x8a\xd6\xa5\xf9\x6c\xa4\xe8\x1c\x34\x7d\x38\xfd\x63\x79\x34\x89\xf6\xb5\xa6\x3c\xa5\x32\x75\xab\xdc\xdf\x57\xd5\x94\x23\xf2\x01\x7d\x69\x7c\x22\xde\x91\x99\xd6\x85\x7a\x77\x74\x34\x65\x7a\x74\xfb\xef\x6a\xc4\xc4\x51\x22\xf2\xbc\xe4\x4c\x2f\x8e\xd0\x81\xc6\xc6\xa5\x16\x52\x1d\xa5\x30\x87\xec\x48\xb1\xe9\x90\xca\x64\xc6\x34\x24\xba\x94\x70\x44\x0b\x36\xac\x65\x66\x35\xca\xd3\x2f\xfc\x8b\x3e\xb1\x60\xdc\x38\x43\x68\x5d\x92\x73\x18\x96\xfc\x96\x8b\x3b\x3e\x44\x4d\x56\xed\x74\x9a\xb6\x8b\x62\xf0\x63\x09\xde\xbb\x04\x2e\x14\x22\xfd\xe4\x9b\x60\x3e\x66\x48\x79\x3a\xb4\x4e\xc7\x4f\xbc\x17\x6d\x6c\xbb\xc3\x3a\x30\x60\x9b\x58\x74\x3b\xda\x69\x43\x34\xd1\x6c\x0e\xad\x9c\xd8\x7e\x34\xb6\xfb\xa3\x0f\x25\x4d\x4b\x69\x77\x3c\xf0\x66\x7b\xdf\x4c\x4e\x17\x28\xeb\xe0\xbb\x89\xb0\xac\x9c\x8b\x14\x9c\xe5\x73\x8e\xaa\xfd\xb5\x61\xe6\x37\x46\x14\x76\x3e\x6e\xb4\xfb\x2e\x94\x86\xdc\x12\x27\xfb\x7c\xb6\x20\x5a\x2e\xac\x63\x5c\xde\x1a\xe5\xd3\x79\xae\x8d\xc4\x7f\x8b\xf7\x29\x25\x12\x86\xa2\x4f\x0d\x57\x2f\x77\x79\x1b\x1e\x25\x85\x50\x0c\xdf\xed\x78\xde\x6e\x96\xb9\xf6\xec\x32\x70\xd3\xfd\xe9\x8f\xbb\x6c\xdd\x04\x1b\x2c\xec\x68\x65\x6f\x46\x50\x4c\xc2\xd8\x7f\xb7\x3d\xfb\xca\x2b\xae\x46\x2c\x49\x04\x57\x5a\x52\xb6\x39\xbb\x69\xfd\x68\xe9\x0a\x69\xef\x6f\x20\x88\x41\xc7\xad\x80\x42\x56\x63\xb0\x3c\x53\x44\xb4\xf4\xa0\x0e\x01\x63\x93\x9f\x7c\x2c\xa1\x21\x5c\x2d\x4d\xab\x2d\x60\x44\x3a\xc1\xc9\x3e\x0d\x13\x90\x12\xd2\x53\x94\x3e\xaf\xab\xef\x3a\x9f\x72\x51\xfd\x7c\x76\x0f\x49\xb9\x6d\x8e\xf8\xea\x58\xb1\xe5\x79\x83\x88\x0b\x3b\xb1\x8b\x30\x47\xd7\x5f\x70\xf2\x87\x40\xb0\x3b\x41\x44\x51\xcd\xd4\xc4\x66\x92\x55\x1b\x01\x81\xe3\xb3\x42\xe1\xca\x3d\x8c\x2c\xce\x26\x45\x30\x8d\xe4\x26\x99\x09\xa1\xcc\x29\xc7\xfd\xc4\x79\xe7\x4c\x58\x9f\x1f\xa6\xb5\x48\x92\x1b\x1a\xe3\xd3\x5b\xea\xe9\xad\xa1\xb6\x7e\x8c\x29\xab\x82\x57\x10\xf4\x5e\x2a\x33\x0d\x1a\x1e\xcd\x1f\x53\x94\x9a\x94\x26\xaa\xcc\xcd\xa4\x77\xc0\xa6\x33\xad\x06\x84\x8d\x60\x84\x58\x03\x34\x99\x05\xd3\xe6\x00\xba\xd1\x1f\x25\x44\xb5\xd0\x4a\x7c\x50\xe5\x3b\xb8\x04\x9d\x41\xc5\x63\x96\xf7\x72\x2d\xb8\x06\x04\x74\x32\x3a\x1c\x90\x3a\x85\xdc\xac\x71\xbc\x20\x4c\x83\xa1\xd9\xa8\x8b\x48\x51\x4e\xed\x97\x80\x8f\xe9\xc4\x75\x55\xc9\x20\xe8\x45\x4d\x51\x67\xdc\xb3\x1f\xb7\x67\xf6\x0d\x57\x5e\xe6\x46\x5f\xac\x88\x3a\x9a\xd5\x7d\x4b\x1d\x21\x25\xa8\x42\x58\x6d\x73\xd9\xe0\xfe\xff\xaf\x1e\x3a\x50\x87\x35\x30\x67\x6c\x3a\xf3\xb0\xa4\x8e\x11\x34\xf7\x60\xf7\xb3\x47\x3a\xf9\x52\xec\x68\xe9\x51\xb1\xa3\xe9\xdb\xf6\x99\x14\x35\x56\x05\xfb\xaf\x41\xe6\x15\x14\x11\x45\x90\x64\x38\x3b\xb7\x6f\x65\xe3\x70\x8c\xbc\x21\x07\x88\x64\x4c\xef\x2b\x44\xf8\xa1\x28\x0e\x47\xe4\x98\xf0\xb2\x3a\x73\x0f\xbd\x80\x8b\x6a\x7e\x37\x91\x79\xa9\x12\xf5\x5c\x2d\xbf\xb8\x13\xb9\xb3\xa3\x9d\xa7\x3c\x1c\x43\x07\x01\x78\xbc\x60\xe2\x43\x93\x58\x58\xb7\x9c\xa0\x1b\xe9\xf6\x73\xf8\xaf\x68\x3f\xc7\x4a\x80\x05\x1e\xd7\x3a\x8a\x02\x64\x3e\x08\xa5\xa7\xea\x40\x36\x4f\xb1\x85\x45\x5b\xac\x20\xfd\x60\x06\xe9\x09\xae\xa4\x53\x84\xce\xfa\xb1\x1c\xc6\xe2\xf3\xab\x1a\xd0\x6e\x10\xf9\xf1\x02\xaf\xee\x18\xbc\xb4\x79\x74\xa5\x74\xf5\xe8\x44\xf3\xea\xf1\x20\xe2\x3d\xbf\xc0\x9e\xf5\xa3\x27\xb4\xb5\xa3\x3b\x69\xab\xc7\xee\xa1\x41\x9b\xe6\x69\x11\x30\xb4\x7e\xf4\x75\x36\xed\x68\x11\x5c\xb4\x7e\xac\x88\xa8\x9f\x26\xd6\x68\xfd\x68\x6d\x24\x5d\x3f\xda\xc6\x25\xad\x1f\x4b\x49\x8c\x9f\x28\x48\x69\xd0\x8c\x50\x22\xdf\x6a\x7b\x8e\xdf\x77\xe2\x27\xf5\xe8\x19\xc4\xed\x22\x9b\xd6\x8f\x65\x01\xf0\x85\x44\x39\xad\x99\xea\x5b\x6d\xa6\x79\xbf\xf1\x61\x9b\xbd\xee\xe3\x74\x9c\x42\x31\x70\xa9\x33\xde\xce\x8c\x11\xd5\x85\x04\x2c\x38\x80\x61\x5f\xde\x0e\xf3\x79\x02\xab\xd6\x8f\xfe\x18\xa7\x1d\x3d\xb1\x4f\x3b\x7a\x43\x6e\x14\x78\xbe\xb1\x76\xe1\x27\x94\x75\xac\x65\x3a\xca\x3a\x51\xd6\xd9\x61\x44\x59\x67\xdb\x11\x65\x9d\x4d\x23\xca\x3a\x6b\x46\x94\x75\xa2\xac\xd3\x69\x3c\x3f\x59\xc7\x5a\xaa\x7a\x33\x98\xfd\x68\x0d\xae\xcb\x16\x32\x94\xa6\x7c\x48\x4f\xd3\x54\x66\x78\xff\xb5\x23\xb1\x37\x68\x5e\x73\x91\xea\x92\xf2\x29\x90\xb7\xc3\xb7\x6f\xb6\x4c\x07\x5c\x3f\xba\x04\xed\x84\x63\xd7\xd4\xc1\xe5\xb1\xc9\x23\xf1\xc9\xbc\x4b\xee\xa4\x56\x0e\x8f\x86\x84\xb9\xc1\x41\x54\xd5\xbb\xca\x41\x13\xaa\x1b\x06\x71\x96\x43\xe5\x10\x6d\xa4\x20\xd7\x31\xbd\x82\x3b\x7f\x87\xd9\xd4\x51\xbb\x15\x24\x40\x6d\x1c\xfb\x18\xaa\x55\x88\x1c\x6c\x82\xa9\x3f\xf4\x66\x09\xe0\x61\x45\x0e\x60\x34\x1d\x91\xd4\x26\x6b\x53\xee\x62\xc6\x0e\x07\xa1\x7b\x3c\x37\xc4\x55\xe2\x7f\xcc\xb2\x9d\x7f\x1c\xe6\xc0\x75\x49\xb3\x6c\x41\x60\xce\x12\x5d\x7d\x1f\x06\x04\x32\x6d\x9d\x9d\x5d\x5c\x29\x1d\xc4\xc3\xae\x22\xe1\x70\xe5\x6c\xed\xe6\xaf\xf6\xa3\xbb\xec\xb6\xb2\x8e\xf6\xf4\x66\x49\x2e\xb1\x10\x1a\x6d\x54\xab\xb4\x79\x9b\xf5\x57\xe2\x3f\x11\xc1\x3f\x5e\xb5\x75\x8f\x91\x9e\x78\x42\x67\x3e\xb0\xac\x40\x95\x59\x66\xd0\xdb\x7a\xcc\x56\x41\xb0\xc6\x93\xb5\x26\xdb\xc6\xba\x59\xf3\x20\xeb\x06\xef\xb9\x11\x85\xc8\xc4\x74\x11\xee\xa0\xed\xd5\x12\x94\xb7\xa1\x44\x95\x63\x27\x02\x9a\x43\x74\xb1\xb4\xe5\xd1\x17\xb2\x71\x44\x5f\xc8\xca\x88\xf6\x81\xe5\x11\xed\x03\x3b\x8c\x68\x1f\x58\x33\xa2\x7d\x60\x75\x44\xfb\x40\xb4\x0f\x74\x19\xaf\xdf\x3e\x40\xa2\x2f\x64\xd3\x88\xb2\x4e\x3d\xa2\xac\xb3\xfd\x88\xb2\xce\xea\x88\xb2\x4e\x94\x75\xa2\xac\x13\x65\x9d\xb6\xa3\x03\x72\x17\x22\xed\x3d\x45\xa6\x10\xe9\x03\x19\x32\xd6\x5e\x9d\x88\x61\x26\x92\xaa\xb2\x88\x79\xc4\x79\x3e\x14\xcd\xad\x09\x7d\x40\xfe\x29\x38\xd8\xf4\x04\x5b\xb2\x36\x07\x22\xb0\x3d\x44\x21\xd2\x03\x75\xd8\x22\xf0\x3c\x66\xd8\xc4\x0c\x9b\xdf\x40\x86\xcd\x8c\x2a\x57\xf8\x08\x49\xeb\xe6\x84\x9b\xe0\xf8\xdf\x80\xcc\x7f\xb3\xf9\x36\x06\xe1\x1c\xc2\x60\xf7\xb8\x1a\x29\x2c\xec\x52\xe7\xdb\x85\xf4\xb2\x09\x31\xa7\x97\xd9\xe6\x3b\x69\x0a\x29\x29\x40\x0e\x2d\x92\x09\x32\x61\xae\xfe\xd7\x12\xfe\x3a\x08\xbf\xf0\xbc\x99\x26\x24\x5e\x74\xf2\x4c\xf3\x53\x7a\xf3\x4d\x85\x2e\xba\x06\x57\x7c\x71\xa9\x34\xfd\x68\xa5\x43\xa2\x9d\x3b\xed\xbb\x4e\x7a\x69\x5f\x4a\x24\x2a\x79\xd7\x3b\x95\x39\xde\x3c\xd6\x16\xa7\xfd\x47\x09\x72\x41\xc4\x1c\x64\xad\x18\x55\x7d\x7b\x06\x55\x93\x99\x84\xba\x02\xc8\xfd\x18\x78\x7a\x31\x45\xf4\xa9\xa9\xf7\xed\x35\x24\xcf\xac\xfa\xf1\xe6\xd1\xaf\xe2\xd0\xa3\xda\xf0\xd2\x6a\x29\x6f\x1e\xbd\x9a\xdf\x48\xcf\x26\x38\xd2\xa3\x19\x8e\xf4\x6b\x8a\x23\xbd\x9b\xe3\x48\x9f\x26\x39\xf2\xd9\x2b\x40\x6f\x1e\x3d\x9b\x8f\x48\xef\x56\x3a\xf2\x02\xeb\x49\x6f\x1e\x9f\x00\xdc\x7d\x5a\xec\x48\xac\x4e\xdd\x79\xf4\x6d\x50\x23\x7d\x1b\xd5\x48\xdf\x78\xd8\xaa\x0a\xf6\xe6\x11\xeb\x63\x7f\x02\x39\xad\x37\x21\xa2\x6b\x4d\xed\xc7\x16\xda\x03\x4e\x56\x5d\x7d\x3f\x97\x02\x64\xb9\x74\xdd\x4a\xd6\xbc\x3b\xe8\xd5\x85\xa1\x9a\x61\xcb\x53\x1f\xb7\x8a\x18\x8d\xbf\xa7\xde\xe0\x55\xf2\xa0\x78\x5c\x30\xd9\x4a\xeb\x98\xda\x74\x56\x35\x8f\x31\x4a\x41\xdd\x74\x2a\x78\x18\xef\x1d\xd9\x70\xd2\x5a\x9a\xe0\xe9\x72\x80\x69\xfd\x04\xea\x17\xb6\xd1\xed\x9e\xb7\x63\xef\xab\xfa\x8e\xbd\x51\xd8\x13\xd7\xcd\x78\xf0\x7f\xfe\xef\x61\xa3\x7a\x4b\x3d\xa1\xa3\xca\xd5\xd9\x19\x83\xa6\xc3\x0c\xe6\x90\xe1\x3a\x7c\xc3\xe5\x99\x40\x8b\xb1\x2d\x7b\x1a\x18\xa4\x2e\x96\x77\x94\x4c\x80\xea\x52\x62\x05\x51\xe0\x74\x9c\x75\x3f\x2b\x51\xc1\x8c\x0a\xe6\x76\x23\x2a\x98\x1b\x47\x54\x30\x3b\x8c\xa8\x60\x6e\x37\xa2\x82\xb9\x79\x44\x05\x33\x2a\x98\x2d\x46\x54\x30\xa3\x82\xd9\x76\xfc\x86\x15\xcc\x7e\x03\xa7\x43\x75\xcf\xc5\xa1\xa0\xfc\xa8\xa9\x66\x49\x1d\x54\xed\xef\xb2\xff\xea\x57\xcd\x0c\x55\xc8\xf5\x4a\x66\xa8\x88\xae\x28\xda\xa3\x47\x34\xca\x4a\xe7\x5c\x79\xf2\x41\x65\xf3\xb5\xc5\x86\xf7\x86\x88\x81\xd3\xb9\x57\x4c\xbc\xf1\xa1\x6b\x75\x6b\xf7\x2a\xae\x2d\x25\x07\xde\xdb\x8f\xad\x5a\xb8\xd0\xcd\x8b\x5c\xb3\x61\x7d\x47\xe5\xff\xc7\xb0\x9d\x46\xc5\x80\x86\x93\xba\x8a\x92\xab\x22\xb0\x6a\xe4\x31\xd4\x11\x64\x63\x0d\xd8\x1a\x77\xc2\xb8\x8d\xa5\xf4\x6d\x85\x04\xf7\x61\x59\x96\x9c\x22\x01\xf4\x68\x6e\x25\x5f\x5c\x0f\x8a\xbf\x35\xec\x82\x38\x22\x8a\x67\x8c\x72\x97\x6e\x2b\xb8\xef\x7b\x6f\x7b\xd9\xd7\xe2\x72\xd5\xad\xa5\x7a\xfb\x88\x9c\x21\xd2\x87\x13\x33\x85\xf0\xa1\xb6\xc3\x4a\x3f\x26\x8a\xe7\x55\x1a\xe2\x6e\xe7\xd2\x10\x4b\x31\x29\xb1\x32\x44\xac\x0c\xd1\xa9\x32\x04\x5e\xb4\x87\xbb\xf7\x12\x11\xe4\x47\xd7\x80\x49\x02\x82\x2a\x2f\x33\xcd\x8a\x3a\xc6\x5b\xd9\x57\x65\x56\x91\x98\xb8\x58\xd3\x26\xbe\x9b\xb7\xd1\x64\xb6\x8c\xf7\x38\x1f\xc6\x84\x2b\x24\x27\x2e\x9e\x13\xdb\x25\x61\x4d\x03\xaf\x75\xd8\xa0\x55\xf6\xf2\x63\x11\x4f\x91\x60\xab\x5a\x69\xb6\xdd\xbc\x0c\x9d\xcf\x0c\x4a\x18\x8a\xfd\x00\x83\x08\x5b\x66\x60\x5c\x2c\x9b\x03\xaf\xb9\xc4\x81\x3a\x3c\xf4\xc2\x50\xaf\xdc\xeb\x93\x70\x9f\x3f\x07\x5c\xe2\x3f\xb7\xe1\x3f\xf8\x41\x15\x07\xaa\xc1\x57\xf3\x9f\x97\x1d\x74\xd9\x3d\x7e\xae\x0f\x83\x5c\x6f\x71\x73\x4f\x1e\x33\xf7\x5b\xaa\xae\xf1\x2c\x5d\x18\xcf\x4e\xeb\x78\x1d\x6e\x8b\x98\x92\xba\xfd\x78\x09\x29\xa9\x4f\xe4\x9a\x78\x39\x99\xa9\x2f\xd6\x1d\xf1\x52\x32\x53\xa3\x0b\x62\xa7\xf1\x5a\x13\x46\x9b\xa3\x47\x97\x43\x74\x37\xf4\x2c\x53\xf5\xc2\xfc\x3f\x8d\x9b\xa1\x17\xfc\xeb\x35\x7e\x2d\xc6\xae\xbd\xf2\xd8\xb5\xa8\xe8\x45\x45\xaf\x39\xa2\xa2\xb7\x32\xa2\xa2\xb7\xc3\x88\x8a\xde\xe6\x11\x15\xbd\xd5\x11\x15\xbd\xa8\xe8\x6d\x31\xa2\xa2\x17\x15\xbd\x6d\xc7\x6f\x4c\xd1\xeb\xaf\x68\x7c\x8c\x21\xeb\x3f\x86\xac\x1f\x42\xd8\x03\xf9\xeb\x05\xe9\x7a\x8a\x19\x8b\xf1\x62\xcf\x3b\x5e\xac\x63\xe9\x3c\xae\xd9\xa7\x29\x9f\x17\xee\xf6\xa6\x1a\x7a\x74\x2e\x58\x4a\x8a\x52\xbb\x0a\x62\xb1\x8e\xde\x73\xae\xa3\xd7\xd8\xd1\x58\x4c\x6f\xab\x62\x7a\x9b\x60\x16\x2b\xea\x6d\x18\xcf\x27\x8a\x2d\x56\xd4\xdb\x75\xc4\x8a\x7a\xeb\x47\xac\xa8\xf7\xc0\x88\x15\xf5\x62\x45\xbd\x58\xf0\xa0\xc3\x88\x05\x0f\xd6\x8c\x58\xf0\xa0\xfd\x88\x05\x0f\xb6\x1a\xb1\xe0\x41\x2c\x78\xd0\x1c\xd1\x09\xd5\x6d\xc4\x82\x07\x1d\x47\x74\x4c\xc5\x82\x07\x9d\x26\x8c\x15\xf5\x62\x54\xe2\xee\x23\x2a\x98\x51\xc1\xdc\x6e\x44\x05\x73\xe3\x88\x0a\x66\x87\x11\x15\xcc\xed\x46\x54\x30\x37\x8f\xa8\x60\x46\x05\xb3\xc5\x88\x0a\x66\x54\x30\xdb\x8e\xdf\xb0\x82\x19\x2b\xea\x3d\xf7\x68\x48\xf2\x1c\x53\x9e\x62\x45\xbd\x18\x21\xd9\x6a\xbb\x63\x45\xbd\xc7\xc7\x6f\xbe\xa2\x5e\x23\x5a\xef\xe9\xca\xea\xed\xbe\x8c\x58\x5b\x2f\xd6\xd6\x8b\xb5\xf5\x62\x6d\xbd\x58\x5b\x2f\xd6\xd6\xdb\x7e\x3c\x7f\x67\xc6\xb3\xd3\x3f\x5e\x87\x03\x23\x96\x5c\xd8\x7e\xc4\x92\x0b\x1b\x47\x2c\xb9\x10\x4b\x2e\x44\x67\x44\x9b\x11\x4b\x2e\xec\x38\xa2\xe3\x21\x96\x5c\xd8\x69\xc4\xda\x7a\x31\x8a\x6d\xfb\x11\x15\xbd\xa8\xe8\x35\x47\x54\xf4\x56\x46\x54\xf4\x76\x18\x51\xd1\xdb\x3c\xa2\xa2\xb7\x3a\xa2\xa2\x17\x15\xbd\x2d\x46\x54\xf4\xa2\xa2\xb7\xed\xf8\x8d\x29\x7a\xb1\xb6\xde\x73\x8e\x26\x8b\xb5\xf5\xd6\x8c\x18\x39\xf6\xbc\x23\xc7\x5a\xe2\x0a\x2d\xb5\xc8\x45\xc9\xf5\x35\xc8\x39\x4b\xe0\x38\x49\xcc\x5f\x37\xe2\x16\x76\x8c\x56\x6a\x6a\xa1\x0f\x4c\x4b\x18\x4f\x59\x82\x7a\xe4\xdd\x0c\xb0\x34\x9e\x11\x6f\xf1\x3e\x42\xed\x8d\x44\xe3\x9d\x35\x7a\xe1\x3a\x0d\x4d\xc3\x10\x1e\x9c\x7a\x57\x78\x59\x08\x8d\x85\xc8\x80\xf2\x1d\x9e\x74\xcc\x10\xe4\x8e\xa7\xb9\x01\x90\xf7\x8e\x12\xd7\x93\x91\x31\x64\x82\x4f\x5d\xc4\x90\x3b\x01\x23\x72\x52\xdf\x90\x50\x8e\x87\xa7\x94\x12\xb8\xce\x16\x08\x07\x2c\xd2\x85\x4a\x43\x2e\xe6\x90\x22\xc5\xc6\x40\x25\x2b\x46\x52\x4d\x32\xa0\xe6\x5d\x1c\xea\x97\x99\xc3\x43\xc9\x25\xce\x6f\x27\x1d\x83\x0b\x9e\x6a\x05\xc4\xdd\x69\x63\x2b\x6a\xb8\x64\xd8\x70\x52\x13\xb2\xa5\x04\xd5\xa3\xe0\x0b\xf1\x68\x2e\x44\x49\xee\xa8\x15\x94\x64\xc9\xf1\x30\xe3\xa7\x1b\xd0\xee\xf8\xf2\x0e\x22\x49\x7b\xeb\xc3\x10\xa9\xda\x8e\x8f\x75\xb1\x06\x50\x39\x6d\xc5\xa4\x1a\x5b\xb3\x7f\x2c\xa7\xa5\x95\x08\x1d\x2a\x03\xd7\x72\x81\x11\x7d\x56\xa4\x48\x45\x72\x6b\xd0\x30\xa7\x53\xd8\xdf\x57\xe4\xe4\xc3\xa9\xa1\x7d\xa5\x32\xa4\xda\x95\x09\x74\xb4\xb0\x90\x62\xce\x52\x83\xd9\x3f\x50\xc9\xe8\x38\x33\x32\xe7\x04\x24\x70\x23\x12\x7c\x79\xf0\xc3\xf1\xd5\x2f\x17\xc7\x1f\xce\x0e\x51\xfa\x84\xfb\x82\x72\x73\x24\x4a\x55\xc7\xa1\x3a\x9c\x30\x2f\x02\x3e\x67\x52\x70\xb3\x38\xd4\xd3\x28\x99\xfb\x59\x93\xea\x24\x48\x50\x22\x9b\x43\x6a\x65\xe4\xea\x6d\x9e\xe5\x30\x5e\x94\xda\xeb\x8d\x18\x1d\x69\x4e\x0f\x4f\x66\x94\x4f\xcd\x3a\x4f\x45\x69\xe6\xfb\xf2\x4b\x5c\x91\x84\xb4\x4c\xac\xd4\x44\x3d\xca\x7e\x39\xf0\x6c\xc2\x10\x7a\x65\x6b\x3a\xaa\x84\x16\x7e\xcd\xe1\x67\xa9\x05\xd7\xf4\xfe\x9d\x0d\x0f\xdc\xfb\x32\xb8\xb4\xe7\xeb\x61\x0a\xf3\x0a\xcb\x6c\xec\xaa\x32\x2c\xc5\x98\x91\xbd\xf0\xee\x11\x39\x33\xef\x80\x34\x04\xa0\x8d\xee\x84\x39\x48\xd4\x3a\x1d\xf8\x06\x44\xc2\x94\xca\x34\x03\x85\x71\x8d\x9e\x30\x5b\xcd\xc0\x01\x0c\x2a\x9d\x96\x0b\xbd\x8e\x92\x90\x0f\x02\x63\x1c\x27\xe2\x1d\x99\x69\x5d\xa8\x77\x47\x47\xb7\xe5\x18\x24\x07\x0d\x6a\xc4\xc4\x51\x2a\x12\x75\xa4\xa9\xba\x55\x47\x8c\x9b\x93\x35\x4c\xa9\xa6\xc3\xe0\x48\x1f\x59\xb6\x3d\x4c\x44\x9e\x53\x9e\x0e\xa9\x43\xad\x61\xb5\xad\x47\x5f\x38\x86\x3a\xa4\xd5\x5d\x8c\x0f\xe9\x50\xcd\x20\xcb\xf6\x5b\x20\x73\x37\x81\xaf\x83\xa0\xd7\x49\xc0\x73\xdf\xde\xfd\xf4\x9e\x55\x87\xd5\xc2\x60\x44\x2e\x84\x76\xe1\xb7\x2e\xd2\x1b\x89\x28\xc2\x77\xfd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\xbd\xb4\x19\x1c\x93\x6a\xbf\x91\x47\x2b\xd0\xfe\x18\x54\x1b\xd0\x59\x36\xb4\xe3\xc9\xa0\xde\x80\xc0\x19\x9f\xff\x40\x9b\xa6\x75\xbe\x16\x1c\xc4\xdd\x60\x45\xe4\x4a\xfa\xee\x12\x7b\xdf\xc1\x8c\xd5\xd5\x6f\xd5\x4a\x7e\xb4\xa3\xbb\x4f\xc9\xbc\xba\xbd\x89\xa1\xb1\x7d\x17\x34\xaf\xeb\x6b\xaf\xd9\xb5\x11\xf9\xe0\x15\x1e\x72\xf2\xcb\xf9\xe9\xd9\xc5\xcd\xf9\x37\xe7\x67\x57\xed\x35\xe8\x1e\x6c\x2d\x68\x4d\xe8\x09\x00\xfb\x2d\xb9\x64\x21\x61\xce\x44\xa9\xb2\x45\x65\xff\x58\x4f\x04\x96\x4f\xbf\x73\xf8\x2e\x2a\x4d\x7c\xed\x63\x91\xd9\xf6\xcb\x6c\x4f\x61\x42\xcb\xcc\xea\x4d\x7b\x7b\xa3\x36\x5c\xce\x8e\xbe\xd0\xf7\x1b\x29\x3a\xd4\x8f\x6e\xa0\xf0\xb5\xad\x3c\x3f\x11\x72\xe3\x31\xde\x77\x61\x07\x0d\xd6\xe3\x84\x47\x6b\x9b\x73\xd2\xa3\xf5\x8e\x75\x84\x4e\x47\xf7\x42\x3f\x4e\xf7\x44\xf0\x09\x9b\x7e\xa0\xc5\x77\xb0\xb8\x82\x49\x37\x03\x71\x13\xde\x68\x77\x74\x3e\x64\xb4\x52\x1a\x76\x66\x5f\xd6\xcd\x3f\xd3\x9b\x77\xa6\xaf\xb0\x8c\xee\x21\x19\xfd\x45\x50\xf4\x12\x3d\xb1\x52\xcd\xdf\x5a\xa0\x9d\x2d\xb9\xaf\xe0\x9a\x5e\x5c\xf6\xdd\xb8\xbc\x1f\x4d\x66\x17\xb2\x7b\x47\x67\xf5\xb6\x6a\x47\x22\x78\x02\x85\x56\x47\x62\x6e\x38\x17\xdc\x1d\xdd\x09\x79\x6b\xf4\x08\xa3\xb8\x0e\x2d\xd6\xaa\x23\xf4\x16\x1c\x7d\x61\xfd\x5f\x37\x1f\x4f\x3f\xbe\x23\xc7\x69\xea\x5a\xb3\x94\x0a\x26\x65\xe6\x9a\x21\x8c\x08\x2d\xd8\x0f\x20\x15\x13\x7c\x40\x6e\x19\x4f\x07\xa4\x64\xe9\xd7\xed\x89\xb3\x1f\x3d\xee\x82\x28\xac\x8f\xb3\xe7\x9d\xb8\x46\xef\xca\xa2\xc1\xbb\x2a\x22\x62\xb8\x16\xd3\x0a\x71\xd3\xdb\x9b\x9d\x90\xd1\x13\x68\x76\x37\xce\x2f\x0f\xdc\xc2\x7e\xe9\xea\x7e\x4d\x58\xad\x6f\xd3\x21\x6a\x21\xd2\x77\x44\x95\x45\x21\xa4\x56\x24\x07\x4d\x8d\xd2\x3b\x32\x18\x36\x68\xfe\x89\x5e\xaa\x01\xf9\x7b\xf5\x23\xba\x9a\xd4\x4f\xfb\xfb\x7f\xfe\xee\xec\xaf\xff\xb9\xbf\xff\xf3\xdf\xc3\xab\xc8\x0a\x6d\xf8\x4f\xf3\x16\x55\x40\x32\xe2\x22\x85\x0b\x7c\x07\xfe\xa9\x1a\x0e\x16\x77\x41\x53\x5d\xaa\xd1\x4c\x28\x7d\x7e\x59\xfd\x59\x88\x74\xf9\x2f\xd5\x41\xe2\x20\xcf\x93\x31\xe0\x16\x5d\x52\x3d\x7b\x26\xec\xa1\xa6\x25\x3d\x1f\x55\x37\x6b\xd8\x02\x28\xa7\xf8\xcf\x6f\x3c\x08\x8c\xf4\x74\x27\x99\xd6\xe8\x74\x73\x69\xe6\x62\x32\x30\xa7\xb6\x16\x3b\xe7\x6f\xf7\x9e\x15\x83\xa9\x76\xb0\x67\x80\x21\x44\x1c\xb4\xec\x41\xae\x18\xec\xaa\x73\xf9\xf8\xf2\x9c\xcc\x2d\x84\x9f\x0d\x70\x7c\xea\xf0\x37\x9f\x94\xc6\x55\x2d\xa3\x1c\xa8\x2a\x0d\xf1\x9d\x8d\x06\xaa\x12\x98\x49\xc6\x72\xe6\x82\x0c\x5d\x7b\x29\x45\x0e\xec\x8f\xa3\xa4\x28\x07\xee\x86\x51\x0e\xb9\x90\x8b\xea\x4f\x28\x66\x90\x1b\x4d\x6b\xa8\xb4\x90\x74\x0a\x83\xea\x71\xfb\x58\xf5\x97\x7d\xb0\xf1\x82\xd5\xa7\xad\x2a\x5c\x3b\x49\x1d\x45\x86\xf4\xf5\xd1\x36\x0f\xfa\x67\x42\xda\x2a\xcc\xb8\xf8\x04\x22\x61\x65\x89\xb3\x02\x67\x05\x45\xd4\x27\xe7\x22\x2b\x73\x50\x83\x4a\x0c\xb2\xd6\x00\x3e\x37\x9a\xa5\x7a\x56\x82\x5a\xca\xe6\x4c\xf5\x11\x3f\xbc\x46\x4e\x63\x2e\x14\x5f\x94\xba\x28\xb5\xab\x65\x13\xb4\xa5\x13\x0a\xed\x16\x55\xc1\x81\x06\xd9\x7f\xdb\xb5\xe0\x16\x21\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf3\xd2\x29\x5f\x7c\xec\x48\x40\xed\x18\xf6\x56\x8a\x68\x79\xc6\x9e\x02\xac\xef\x87\xb5\xd2\x34\x64\x5c\x0f\x85\x1c\xda\xa9\xdf\x11\x2d\xcb\x6e\xc4\xa4\x66\x4a\x7d\x9f\x7f\xdf\x7b\xec\x5d\xcd\x90\x2a\x76\xfd\x6c\x0e\xb8\x82\x44\x82\xfe\x1c\x96\x1c\xfb\x26\x2f\xa7\x2c\x05\x3b\xbe\x36\x3e\xf7\x5b\x30\xee\x54\xc1\x82\xb8\xaf\xb5\x24\x3a\x91\x22\x1f\x91\xc0\xbd\x31\xc7\x4c\x0f\x77\xdf\x2d\x74\xb0\x82\xfa\x11\x8d\x41\xd1\x18\xb4\x61\x3c\x6a\x0c\xba\xb6\x78\xf8\x6c\x2d\x41\xc0\xe7\x6d\x5d\x18\x6b\x3d\xe8\x5e\xd7\xd1\x82\x14\xa2\x28\x33\xaa\x37\x78\xc6\xd6\xb8\xd3\xdd\x51\xaf\x23\x91\xeb\x48\x1a\xcb\xd0\xf2\xf5\x3e\x4c\x72\x9c\x65\x84\x71\x7b\xf0\x71\x02\xef\x30\x93\x60\x55\x1b\x42\xad\x3f\x7b\x6e\x96\x70\xe7\x4a\xd6\x85\xe1\x9e\x8a\x28\x4d\xa5\xc6\xa8\x63\x2c\x69\x67\x59\x89\xf3\x3e\x31\x5e\x17\xb6\xab\x84\xc3\x2a\x09\x64\x6d\x5f\xcf\x8c\x2a\xed\x97\x8d\xab\xd1\xf4\x16\xbd\x8d\x09\xa4\xc0\x13\xc0\x8c\xb4\x12\xea\x6f\x1d\x1b\xbd\x8d\x9c\xf1\xb9\x9d\x83\x92\xb4\xb4\xc1\x20\x96\xfc\xad\x9f\xe3\x75\x05\x20\x18\x44\xbc\xf6\xed\x97\xab\x38\x04\xa4\xfa\x95\x86\x5d\x25\xf6\x55\x56\x56\xf5\x34\x91\x07\xdd\x79\x66\xe5\xd9\xea\x24\x0c\xad\x30\xcb\xda\xfc\xdc\x64\x92\xaf\xc1\x19\xd8\x9d\x7d\xfe\xe6\x58\x67\x4f\x6c\xb3\x1f\x96\xb9\x83\xef\xa4\x4f\x36\xd9\x87\xb3\xa4\x90\x30\x61\xf7\x3d\x9d\xd3\x63\x5e\x5b\x62\x58\x0a\x5c\xb3\x09\xb3\x1d\xfb\x0b\x09\x05\xf0\xb4\x2a\x8a\x8a\x59\xe1\xbc\x09\x9b\x67\x19\xcc\x63\x05\xee\x7e\x49\xd9\xf5\x3a\x61\x3f\xd2\x31\x12\xe9\x58\xeb\xf1\x99\xe8\x98\xc3\xdc\xe7\x43\xc4\x30\xf2\xbc\x7b\xe8\xfb\x69\x10\xc7\x8e\x58\xbc\x33\x96\xd5\x09\x5d\x47\x38\x8b\x5a\xaa\x1e\x54\xd1\x45\x2d\x6c\xe4\x1a\x99\xb1\xa9\x01\xab\xad\x28\x64\x85\x26\x92\x53\x4e\xa7\x36\xab\x5b\x0b\x6f\xa7\x35\x5a\x96\x41\x62\xc9\xd2\x86\x70\x6f\x5f\xc3\x38\x31\x88\x9d\x09\x9a\xe2\x45\x29\xb2\x0c\xa4\x22\x19\xbb\x05\x72\x0a\x45\x26\x16\x2e\x49\x9b\xa7\xe4\x5a\x53\x6d\x50\xfa\x1a\x74\x3b\x9f\x6f\x27\x74\xc5\x15\x5f\x96\x59\x76\x29\x32\x96\xb4\xb2\xa8\x34\xb7\xed\x1c\xf7\xab\x28\xb3\x8c\x14\x38\xe5\x88\x7c\xe4\x48\x31\x8e\xb3\x3b\xba\x50\x03\x72\x01\x73\x90\x03\x72\x3e\xb9\x10\xfa\xd2\x8a\xde\xcd\x68\x3b\x7b\x23\x61\x13\xf2\x0e\x6b\xda\x68\xa2\xe9\x14\x15\x27\xef\x03\x1c\x18\xf8\x87\x13\x58\xe2\x70\xc7\xd4\x5a\x4d\xa5\x33\xe2\x7c\x81\x33\x19\x42\x65\xff\xfe\xec\xdb\x94\xb1\x09\x24\x8b\x24\xeb\x7e\xae\x8e\x13\x8c\x5e\xa8\xf3\xcc\x03\xfc\x76\x65\xda\x5d\x6a\x27\xaa\x80\x8c\x13\x5b\x3f\xdd\x16\x86\xaf\x51\xbd\x5a\x91\x55\x75\x55\xaf\x1a\x62\x6b\xce\xd9\x95\x67\x16\x42\xe9\x6b\xa3\x9e\xf7\x52\x65\x7d\xff\xd2\x4f\x47\xb0\x96\x74\x96\x41\x4a\x58\x9e\x43\x6a\x54\xf8\x6c\x41\xe8\x44\x63\x8a\x6d\xc3\x3c\x90\x48\xb0\x58\xeb\x6a\x97\xcc\x28\x4f\x33\x90\x64\x42\x59\xe6\x8c\x01\x8d\xfb\x35\xc8\x9c\x71\xb4\x09\x58\x77\x2c\xda\x17\xcc\x5f\x49\x22\xa4\xaf\x7b\xcf\xb4\xf2\x97\xea\x83\x89\x4c\x24\x40\x80\x65\xbf\x32\x19\x67\x22\xb9\x55\xa4\xe4\x9a\x65\x76\x31\x42\xdc\x92\x44\xe4\x45\x86\x47\xa7\xc3\xc9\xaa\xfe\x39\xac\x50\x69\x68\x66\x57\x47\x5f\xd4\x97\xf0\x87\xb6\xdc\xbc\x07\x29\xac\x0f\x19\x0c\xee\x21\xe9\x2d\xbd\xdf\xd0\x52\xb3\xcb\xe8\xef\x17\xbc\x12\xc5\x26\xc2\x30\x30\xb3\xd7\x75\x62\x76\x45\x2e\x47\xe4\xec\x1e\x92\xa0\x0a\x05\xf6\x87\x40\x42\x80\x59\xa1\xf4\x16\x5e\x51\xd9\xbb\x0e\xc9\x77\xe1\x68\x80\xfd\xc4\xce\xe9\xab\x66\xb9\x57\x90\x8c\x71\x24\x8b\x2e\x21\x8f\x30\xae\x8c\x40\xd0\x38\x43\xf6\xc4\x3a\x41\x97\xa4\x4c\x62\xcd\x84\x45\x15\x7c\xed\xe7\xc2\x72\x04\x42\x68\x72\xb0\x7f\xb4\x7f\xb8\x62\xb3\xdc\x37\x82\x4b\x06\x96\x44\x5b\x03\x66\x52\x2f\x4a\xb1\xbc\xc8\x16\xb8\x8e\xfd\x74\x40\x98\xf6\xd1\xd9\xb2\xe4\x7e\x55\x2e\x4b\x70\x40\x94\x20\x5a\x52\x5f\x8a\xc5\xfe\x6a\x6e\xd2\xb2\x74\xcc\xe1\x60\xff\xd7\xfd\x01\x01\x9d\x1c\x92\x3b\xc1\xf7\x35\x2e\x7f\x44\x6e\x84\x11\xbf\xeb\x89\x16\xa2\x24\x1c\x6c\x32\x00\xdc\x17\x19\x4b\x98\xce\x16\x48\xe8\x88\x28\xb5\xcd\x38\xa6\xda\x67\x27\x9e\xdd\x33\xed\x62\xdc\x0c\xda\xbe\x41\x68\x5a\x62\x47\xa8\x91\x8e\xe6\x70\x34\x03\x9a\xe9\x99\x0d\x2c\xe1\x82\x0f\xff\x09\x52\x60\xde\x22\x77\x57\x5e\x5d\x89\xc0\x5e\xb4\x0d\x43\x7b\xbf\x85\xfe\x9a\x0a\xfd\xe5\xe6\xe6\xf2\x5b\xd0\x4b\x24\xc3\xbc\xc5\x87\xfb\xa0\x05\x01\xe4\x44\xc8\xfc\x19\xd0\x8e\x7e\x1c\x9c\x43\x52\x08\xf9\x1c\x48\xd8\x4c\xa8\x4e\x7b\x49\x56\xf6\x53\x28\x8d\x4a\x94\x13\xe2\x38\x24\x66\x07\x9b\x71\x27\xbe\xef\xce\xf9\xe5\x88\xfc\x55\x94\xe6\x6b\xc6\x74\x9c\x2d\xaa\xba\x0d\x0a\x34\xd9\x33\x53\xed\x19\xf2\x64\xb0\xe1\x2f\x40\x53\xa3\xd9\x18\xea\x01\xf4\x79\xf4\xd7\x22\xee\x3c\xb8\xb5\xf5\xcb\x07\x4a\xa5\x45\x4e\x66\xee\xb3\x9b\xe9\x9a\xee\x64\x8c\xf0\xf4\xf8\x5c\x28\x09\x85\xa5\x70\xee\x99\x57\x47\xbf\x56\xe8\x86\x85\xbb\xfb\x7d\x8c\x35\xaf\x92\x10\x6c\xae\xc1\x94\x4d\x26\xe2\x16\x58\x06\xd5\xa0\x9d\x7b\x25\x1c\xcf\xb8\x50\x69\xeb\xe4\xcf\xe5\x89\xd0\x11\xd8\x3d\x3e\xac\xd7\x32\xa5\xfd\xc4\x1a\x90\x75\x86\x59\x87\x33\xd6\x68\xd3\x13\x10\x3f\x4d\x9d\xcc\xcf\x01\x80\x7e\x36\x9f\xf4\x09\x81\xa2\x87\x70\xf0\xd5\x60\x70\x2d\x8c\xfa\x8a\xe9\x9a\x96\xb8\x22\x99\x50\x20\xe7\x6d\x13\xc0\xeb\xd1\xdf\xa7\x8b\xf6\x86\x02\x3f\xd6\xe4\x56\x4b\xc2\xcb\x7c\x0c\xb2\xce\x66\x91\x7a\x15\x20\x41\x34\xc3\x85\xbd\xdd\x9b\x80\x9b\xed\x1c\xcd\x93\x7f\xfa\xb7\x7f\xfb\xc3\xbf\x8d\xec\xf4\x55\x64\x03\x27\xe7\xc7\x17\xc7\xbf\x5c\xff\x70\x82\x09\xb5\x5d\xa1\xda\x53\xd8\x66\xdf\x41\x9b\xbd\x86\x6c\x7e\xd2\x80\x4d\x4c\x13\xe9\x4c\x45\x9a\xfe\x02\x9c\xd2\x60\x80\xd1\xdb\x8c\xc6\xe9\x64\xbf\xa0\xb4\x99\x91\x35\x9b\xf6\x57\x73\xd4\x9e\xc5\x19\xd3\x49\x71\x2d\x92\xdb\x1e\xf5\x9a\xfd\x9b\x93\x4b\x3b\x65\x58\x93\x93\x7b\x63\x08\xe3\x73\x91\xcd\x6d\x39\xdf\x9b\x93\x4b\x3c\x79\x23\xfc\x17\x1a\xa2\x50\xa3\x5e\x98\x67\x7d\x22\x83\x73\x4f\x19\xed\xdb\x5a\xd0\x28\x91\x40\x33\xa6\x34\x4b\xf0\xb9\xda\x4c\x6a\x66\xe8\xe2\x97\x8a\x9a\xd2\xba\xd1\xbb\xa6\xb4\xff\xd1\xbb\xed\x76\x56\x9a\xba\x06\x1e\x3e\x63\xbe\xe4\xf8\x91\xcd\xf8\x88\x7c\xe9\x37\xc1\x97\x0a\x09\xd7\x5a\x14\x3d\x79\x42\xec\x64\x1b\xfc\x20\x63\x98\x08\x09\xcb\x8e\x90\xc0\xb1\xe1\x1b\x0c\x73\xcc\xfe\xf3\x26\x28\xd1\x70\x5e\xd8\x90\x4b\x55\x26\x33\x6f\x4d\xe4\xa0\xd4\x11\xba\x3c\xca\xc2\xaa\x98\xe8\x44\x29\x25\x0c\xcc\xd7\x41\x8e\xab\x1b\xd4\x69\x0c\xe6\xf5\xc0\xed\x8f\xa0\x13\x6b\x66\xf5\xfe\x17\x67\x51\xf5\xcb\x5f\x76\x95\x24\x92\xaa\x19\x60\xfd\x10\xb8\x67\x75\x9f\x13\xaa\x04\xb7\xc6\x5e\xf7\x39\xc8\x68\x14\x29\xa8\x52\x75\x05\x67\xf7\x12\xfb\xd0\xa5\x48\xf7\xf7\x55\xe3\x81\xa9\xa4\x09\x90\x02\x24\x13\x29\xc1\x7c\xe2\x54\xdc\x71\x32\x86\x29\xe3\xca\xc3\xcf\x4c\xe4\x01\x6d\xd8\x8d\x2d\xb6\xeb\xab\xc5\x8d\xc8\x55\xa3\x08\x8a\x4b\x4f\x4a\x44\x7d\xa2\xdd\x2a\x96\x9d\x4c\x18\x11\x1a\xb4\x69\xae\x36\xc6\x87\xcd\xea\xc7\x17\xdd\x83\xb7\xc9\x80\xb6\xbe\xb6\x11\x3a\x58\x9c\x9f\x26\xb3\x6e\x8e\xdf\xe8\x9e\xda\x72\x44\xf7\xd4\x6e\x23\xba\xa7\xa2\x7b\x6a\xf3\x78\x76\xe6\xdd\xe8\x9e\x8a\x4a\xd7\xf2\x88\xee\xa9\xe8\x9e\xda\x30\x9e\x1d\xfd\x8a\xee\xa9\x2d\x46\x74\x4f\x6d\x39\xa2\x7b\x2a\xba\xa7\xa2\x7b\x2a\xba\xa7\x7e\x43\x66\x40\x3f\xa2\x7b\x6a\x65\x92\xe8\x9e\x0a\x80\x11\x35\xa5\x35\x23\xba\xa7\xd6\x8c\xe8\x9e\x0a\x46\xe4\x4b\x2d\xf8\x92\x77\xee\x5c\x1a\xbd\xac\x7b\xce\xda\x25\x3a\x0e\x58\xe2\x7c\x44\x61\x2f\xb8\xea\x55\x41\xfb\xb7\xa0\xe6\x87\x4f\xb5\x71\xde\xa0\xda\xc7\xb4\x36\x1f\x6a\x57\x77\x84\x4f\x22\x54\x47\x85\xb0\xff\x57\x3b\x23\x02\x2f\x84\xd5\x4e\xdb\xe7\xa4\x3d\x59\xb6\x55\x17\xd7\xc3\xb3\x76\x3b\x3c\x13\xd7\x4e\x0f\xae\x86\xe8\x66\x78\x75\x6e\x86\xd7\xd3\x43\xd7\x39\xf3\x6f\x66\x12\xd4\x4c\x64\xad\x11\xbd\x81\xe4\x1f\x18\x67\x79\x99\x1b\x9c\x53\x06\x9f\xd9\xbc\x8a\x1a\x50\x15\xba\x5a\x42\x6f\x2d\x85\xe6\x46\x96\x02\x16\x40\xa5\x2c\x33\xdb\x88\x69\x9d\x33\x8a\xa2\xba\x2a\x93\x04\x00\xdb\xab\x85\x5a\xcc\x1f\x46\xd5\x9b\xaa\x76\x1a\x6f\xbb\xd1\x9b\x6e\xbc\xdf\x96\x28\xc5\x59\xfe\xf0\xfb\x56\x73\x74\xf4\xf2\x7c\x7e\x0f\x4f\x0f\x64\xba\xbb\xbe\xd2\x49\x57\xe9\x83\x4b\x74\xd5\x51\x5e\x9a\x27\xa7\x37\x8f\x66\x0f\x1e\x9c\x67\xe4\xbd\x79\x36\x6c\xe1\xb9\x78\x6c\x9e\x61\xf5\xd5\x1e\x1c\x0c\x7d\x78\x68\xfa\xf3\xce\x7c\x82\x22\xa5\x9f\xc6\x2b\xd3\xa3\x36\xdc\x93\x37\xe6\x73\x78\x62\x7a\xf9\xea\xae\x1e\x98\xcf\xe7\x7d\xe9\xe7\x73\x3b\x5a\xb7\x5e\x85\xc7\xa5\x07\xab\x56\x9f\x16\xad\xde\xac\x59\x9f\xcc\xc3\xd2\xdd\xbb\xf2\x0c\x3c\x2b\x9d\x81\xcc\x38\xd3\x8c\x66\xa7\x90\xd1\xc5\x35\x24\x82\xa7\xad\x39\xcc\x52\xd5\xba\xea\xfc\x28\x3b\xad\xd3\xd1\x9a\xf1\xc7\x33\xea\x8a\xf3\x42\xea\x43\xaa\xbd\xf9\xcf\x09\x14\xd8\xd0\xc4\xae\xf2\x59\x1a\xf4\xc8\xb3\x51\x06\x6d\x30\x76\x9f\x9b\xf8\x17\x71\x47\xc4\x44\x03\x27\x07\x8c\xfb\x7d\x3c\x0c\xd4\xc0\x5a\x33\xaf\xd0\xda\x5c\x7d\xfb\xc6\xdf\xfc\xfa\x54\x6e\x34\x2e\x28\xf5\xe9\x2d\x20\xee\x45\x8f\x9b\x40\xdc\x8d\x93\x32\x6b\x9a\x41\xac\x69\xa4\x49\x6f\xde\xd6\xe5\x45\xdf\xe2\xbc\xd5\x69\xa3\x3c\x25\x2e\x71\xe3\xf5\x6d\x5a\x67\xbf\xf1\x6b\xf0\x19\x47\xdb\x0b\xe9\xdb\xf6\xf2\x44\xbe\xe1\x67\x28\x35\xbf\x50\x7f\x70\x94\x9a\x77\x18\x41\xfe\xd7\xb7\x92\x26\x70\xd9\xbb\xc0\xe1\x8f\x13\x49\x4b\xe9\xd2\xf6\x2a\xb9\xa3\x3a\x3c\x1c\x20\xb5\xa7\xa9\x4a\x8a\xc3\x6c\xb4\x49\x99\x65\x0b\x52\x16\x82\x37\x33\x0f\xad\xd3\x6a\x39\x61\xcd\xcc\xb6\xee\x2d\xb5\x94\x5a\x48\xe1\x18\xb0\x2c\x39\x37\xf4\xbc\x6e\x38\x84\x52\xa9\xb2\xb4\x3a\x4c\x8b\x53\x6c\x6a\x96\x6f\x98\x29\x66\xcc\xb1\x1c\xea\x96\x14\xf5\x84\xe6\xe9\x89\x90\x09\x1b\x67\x0b\x32\xa3\x59\xd5\x5d\x82\x92\x5b\x96\x65\x6e\x9a\x11\xb9\x06\x4d\xf4\x8c\xb9\xc6\xe0\x24\x13\x7c\x8a\x8b\xa3\xdc\x77\x35\x83\xc4\x3c\x9b\x64\x40\x79\x59\xd8\xf7\x19\xb6\xbe\x10\xa5\xf4\xef\x73\x65\x2d\xab\x59\x98\x22\x9c\x65\x83\xa0\x77\xd2\x83\x1b\x5b\x37\xa8\x57\xe0\x73\x0a\xef\x98\x82\x41\x38\xa7\xaf\xcc\xab\x82\xce\x19\x85\x14\x73\x96\xda\xee\x17\x1e\x6c\xd8\xa5\xd5\x76\xc7\xa8\xce\x33\x17\x7c\xc8\x61\x4a\x51\xea\x71\xa7\xc8\xee\x99\x9d\xc7\xba\xe2\x78\x8a\xfd\x32\x8c\xba\x20\x8a\x46\x2a\xeb\x9c\xd9\x4e\x9f\x01\xe4\xc8\x01\x17\x44\x20\x7b\x2d\x39\xd3\xb6\x7b\xf4\xac\xd4\x24\x15\x77\xfc\x70\x64\xab\x12\x33\x45\x28\x19\x83\xf6\x9d\x6c\x7d\x67\x45\x26\x41\x11\xe0\x74\x9c\x99\x3d\xc7\x80\x87\x9b\xb5\x00\x22\x13\xa0\xba\x94\x40\xa6\x54\xc3\x5a\xa1\xc9\x7e\xef\xc3\xe0\x65\xaa\xea\xf2\x5e\x72\x05\xad\xfb\x5b\xf7\x2c\x69\xfd\xe9\x8f\xed\x68\x04\xcb\x41\x94\xfa\xb3\xa8\x92\x77\x33\x96\xcc\x42\xc9\x98\xe5\xa0\x88\x28\x97\x74\xec\xb7\xee\xb1\xf5\x3b\x14\xf5\xc9\x75\xa3\xad\x95\x78\x8d\x29\x6d\x39\xe5\xb8\x6e\x2b\x4b\xcd\x01\x3c\xbd\xb8\xfe\xe5\xfd\xf1\x7f\x9d\xbd\x1f\x91\x33\x9a\xcc\xc2\x7c\x74\x4e\x28\x12\x0d\x24\x14\x33\x3a\x07\x42\x49\xc9\xd9\x3f\x4a\x5b\x9d\x9c\x1c\x54\xcf\x1e\xf6\x5a\x0b\xb9\x25\xf7\xc5\xd6\xd7\xbd\xf5\x5a\xb2\x8d\xb4\x6d\x80\x83\x50\x80\xdd\x11\x96\xc5\xa7\x33\x73\xc9\x2a\x1a\x28\x6a\xcd\xc0\x10\x23\x36\x77\x64\xd8\x15\x97\xa6\x69\x15\x72\x61\xf0\xdc\xa0\x85\x61\x55\x74\x8c\xa1\x12\x33\x20\x1c\xb4\x41\xeb\xca\x60\x25\xb8\x6a\x14\x06\x28\x15\xa8\x01\x19\x97\x18\xdc\x51\x48\x96\x53\xc9\xb2\x45\x38\x99\xe1\x55\x17\xc2\xab\x43\x8b\xe5\x25\x9d\x7e\x3c\xbb\x26\x17\x1f\x6f\x48\x21\x6d\xc9\x00\x8c\xce\xc0\xeb\xf8\x59\x63\x30\x4f\xb8\x1e\x9d\x23\x72\xcc\x17\xf6\xa2\x3d\xe0\x4c\x11\xa3\x0b\x01\xb2\x60\x27\x43\xfa\xa2\xf0\x7b\x6f\x46\xf8\xbf\x3d\xf3\x95\xd2\x08\x99\x55\xd0\x49\xb2\x12\x3c\x66\xc5\x50\x36\xce\x02\x68\xba\x6f\x7f\x55\xdd\x96\xaa\xb0\xb9\x4b\x03\xc4\xa0\xdb\x12\xad\xb6\x1a\xc1\x6b\xbb\x6f\x31\x3e\xcd\x42\xac\x6a\x47\xf6\xbb\xea\x96\x5d\x35\xcb\x61\xfd\x05\x97\x6d\x15\xcc\x5e\xba\x3e\xd5\x6b\xe8\xa9\x57\x4a\xcd\xfd\xbc\x3a\xe5\x28\x82\x08\xdb\x5f\x9e\x5f\xfa\x13\xe0\xa4\x9b\x7c\xa9\x67\x22\x3e\x6c\x9d\x1a\x03\xf2\x86\xfc\x99\xdc\x93\x3f\xa3\x7a\xf5\xa7\xae\x9d\x65\xba\x2a\x3e\xdd\xcd\x3b\x56\xab\x3f\xbf\xec\x09\xe2\x3f\x1a\xea\x64\x66\x34\x50\xd5\x82\x8c\x99\x13\xe7\xe1\x5e\x83\x34\x74\xd4\xed\xc4\x93\xf6\xe4\x31\x0b\xfc\x8c\x68\x66\x7d\x17\xe7\x93\xb0\x25\x84\xde\x11\xd1\xcc\xe3\x7f\x11\x4a\x5f\x38\x2a\xd4\x6c\x30\x51\xcf\x96\x53\x9d\xcc\x9a\x64\xcc\x08\x6a\x4a\xd7\x07\x4c\x91\x54\xa0\x25\xcd\xc6\x01\xce\x58\x87\x48\x8c\xe7\x83\xc6\xdd\x9c\xf3\x8d\xfd\x7c\x68\xa7\x96\x0c\x28\xa8\xf9\x38\xc1\x2a\x28\x2f\x53\x88\xd4\xc9\x64\x66\x59\x69\xc0\x33\x1e\x10\xca\x9c\xad\xa6\x32\x59\x23\x2e\x99\xf3\x94\x50\x6e\x03\xb8\x27\x20\xa5\x0d\xdd\x1c\x2f\xd0\x83\xcc\x12\xe8\xbc\x79\x9d\x4e\x52\x21\x85\x16\x89\xe8\xd0\x36\xa8\xe9\x30\x77\xd3\x21\x10\xac\xf1\xd7\xdb\xdc\xbf\x3f\xbd\x1c\x90\x9b\x93\x4b\xec\xa6\x72\x7d\x72\x73\xd9\xd4\x54\xf6\x6e\x4e\x2e\xf7\x9e\x14\x14\xc4\x4b\x56\xef\xcc\x32\x5b\x4c\xd2\x30\x3c\x19\xb1\x6d\x98\xd3\x62\x78\x0b\x8b\x96\x3c\xb5\x0f\xbe\x3e\xac\x76\xb8\x97\x0f\xb2\x60\xce\x69\xb1\xf3\x6c\x12\x68\xca\x3e\x53\x16\x85\x3b\x59\xf5\x3b\xd7\xa7\x53\xe4\x62\x0e\xa9\x15\x87\xfd\x13\xc0\xd3\x42\x30\x23\x2f\xc6\x1c\x8b\xdd\x9f\x8e\x39\x16\x0f\x8d\x98\x63\x11\x73\x2c\x62\x8e\xc5\xc3\x23\xe6\x58\xb8\xf1\xf4\x66\x50\x12\x73\x2c\x5a\x8e\xd7\xe5\xe7\x8f\x39\x16\x3b\x8d\x98\x63\xb1\x3a\x62\x8e\xc5\x86\x11\x73\x2c\x36\x8c\x98\x63\x11\x73\x2c\x62\x8e\x45\x8c\x16\x7b\x74\xae\xe7\x19\x2d\x46\x62\x8e\x85\x1b\x31\xc7\xe2\x55\xc4\xc4\x90\x98\x63\xb1\xd5\x88\x39\x16\x31\xc7\xa2\xcd\x88\x39\x16\x38\xa2\xed\x25\xe6\x58\xf8\x11\x73\x2c\xec\xf8\xed\x48\xcd\x31\xc7\x22\xe6\x58\xc4\x1c\x8b\x98\x63\xf1\xe0\x2a\x62\x8e\xc5\x6b\xd0\x27\x7d\x0f\xbc\xee\x39\x03\xfb\x27\x22\x2f\x4a\x0d\xe4\xca\x4f\x59\x49\x91\x96\x30\x30\x15\x4a\x04\xdd\x43\x78\x12\xc1\x27\x6c\xea\x28\xfb\x91\x6d\x30\x37\xac\xbe\x67\x18\x34\x75\x7b\x81\xf1\x3b\x19\xcb\x59\xbb\x44\x0e\xb2\xb2\x31\xef\x71\xae\xc0\xc9\x63\x4e\x52\x4e\xef\xf1\x88\xd0\x5c\x94\xb6\x29\x5f\xe2\xf6\xaf\x02\xa1\x75\x85\x3d\xbb\x9d\x21\xfd\xa8\x38\x75\x46\xca\x65\x0f\xda\x46\x41\xb5\x06\xc9\xdf\x91\xff\x3e\xf8\xdb\x57\xbf\x0e\x0f\xbf\x3e\x38\xf8\xe9\xcd\xf0\x3f\x7e\xfe\xea\xe0\x6f\x23\xfc\xc7\xbf\x1e\x7e\x7d\xf8\xab\xff\xe3\xab\xc3\xc3\x83\x83\x9f\xbe\xfb\xf0\xed\xcd\xe5\xd9\xcf\xec\xf0\xd7\x9f\x78\x99\xdf\xda\xbf\x7e\x3d\xf8\x09\xce\x7e\xde\x72\x92\xc3\xc3\xaf\xbf\x6c\xbd\xe4\xce\x22\x71\x7f\x02\x71\x4f\xe2\xf0\x27\x11\x86\x9d\x77\xb8\xa7\xb3\x78\xe5\x66\x5b\x3e\x8d\x8e\x61\x3d\x74\x1a\x3d\x35\x45\x31\xaf\x9a\x87\x29\x22\x72\xa6\x8d\x70\x68\xe4\x41\x1a\xc6\x85\x31\xdd\x50\x4a\x1d\x1d\xc0\x80\x4a\xaa\x6d\x8f\xd0\x2a\xa6\x2a\x88\xd3\x16\x5e\xf2\x73\xbd\x57\x2b\x7b\x05\x9e\xe7\x61\x0a\x13\xc6\xc1\xf9\xc1\x22\x6d\x78\x7c\x44\xda\xf0\x1a\x69\x83\x82\xa4\x94\x4c\x2f\x4e\x04\xd7\x70\xdf\xca\xc2\xd2\x24\x0d\xd7\xcd\x09\x89\x3d\x67\x2e\x8b\xd2\x5d\x23\xa2\xb0\x01\x94\x4b\xe9\xac\x55\x08\xae\x2c\x39\x2a\x98\x36\x4b\x06\xb4\xd5\xfe\x50\xef\xc1\x98\xc8\xe5\x97\x78\x7d\xce\xaa\x99\xff\x28\xd9\x9c\x66\x46\xdb\xad\x9f\xb8\x44\x0d\x26\x7c\x68\xdb\x33\xaf\xa9\xba\xad\x0f\x3c\x0c\x8d\x0c\x5d\xad\xf9\xc8\x7f\x12\xfe\x04\xf7\xfa\x25\x4a\x69\x28\x20\x5d\x4a\x36\x67\x19\x4c\xe1\x4c\x25\x34\x43\xba\xd6\x0f\xaf\x38\xde\x30\x3b\x6e\xbc\x14\x99\x22\x77\x33\xc0\xee\xca\xd4\x9b\x00\x30\xc3\x65\x4a\x19\x27\xb9\xd9\xa2\xc2\x3f\xac\xac\x2d\xc1\x90\xff\x82\x4a\xb3\xc1\x95\xcd\x00\x55\xe4\xb1\x10\x99\x0b\x1d\xce\x16\xf5\xfc\x2e\xf6\x9e\x8b\x5f\x38\xdc\xfd\x62\x66\x53\x64\x92\xd1\x69\x65\x2a\x50\xa0\x57\xac\x7d\xf5\xd4\x1b\x3f\x00\xe3\x72\x4b\x20\x34\xbb\xa3\x0b\x55\x1b\x4e\xc2\x3e\xe0\xef\xc8\xdb\x43\x44\x67\xaa\x48\x35\x47\x4a\x7e\x7f\x88\xbe\xc4\x93\xe3\xcb\x5f\xae\xff\x7a\xfd\xcb\xf1\xe9\x87\xf3\x8b\x6e\x9c\xc2\x7c\x3b\x50\xde\x6a\x8e\x84\x16\x74\xcc\x32\xd6\x85\x41\xac\x44\x9b\x84\x93\x22\x0b\x4e\xd3\xa3\x54\x8a\xc2\xc2\xc9\xdb\xa8\x6a\x4e\xd9\xd4\x82\xc3\xcc\x64\xdc\x9e\x49\x73\xc2\xa9\xa4\x5c\xd7\xc6\x9a\x1a\xe4\xb2\xe4\x46\xb1\x7e\xe1\x81\xf9\x34\xed\x2f\x28\xff\x38\x4d\x21\x6d\x40\xef\xd5\x05\x01\x9e\xf8\x8f\x5b\xd4\x39\xda\xe4\xf2\xe3\xf5\xf9\xff\x5e\x42\xc3\x45\xd1\x2d\xe6\xa9\x9f\xbc\x30\x29\x8a\xde\x76\xf7\xca\xe5\x1d\xc5\xfd\x7d\x16\xfb\x5b\xf1\xaa\x7e\x3c\xed\x57\x25\x6f\x96\xf1\xa8\xe7\x27\xb9\x48\x61\x44\x2e\x2b\x2b\x7d\xf3\x6a\x90\xde\x4b\x25\x10\x73\x0b\xd7\x8c\x66\xd9\x22\x14\x90\xb4\xb0\xc9\x34\x8d\xcc\xe4\x90\x0e\x4f\x68\xa6\x3a\x12\xd3\x2e\x9c\xc9\x30\xe1\x0f\x46\x99\xec\x05\x9a\xd5\x6c\x24\x05\x2e\xb4\x93\x4a\xcd\x2a\x31\x59\x5b\x8a\x84\x58\xcd\x35\x08\x8b\x6a\x70\x17\x65\x0d\xfd\x9e\x31\x31\xe5\x61\x75\x59\xcd\x6c\xad\xbc\xa5\x82\x65\xe9\xd6\x31\xa6\x5a\x97\x35\xb3\x4b\xa0\x29\xe6\xa4\x15\x54\xcf\x6c\x54\x43\x4e\xd5\x2d\xa4\xf6\x07\x27\xd7\x54\x66\x7e\x33\x63\xf5\xaa\x1b\xb3\x6e\x6f\xd3\x47\x79\xc6\xc6\x5a\xa0\x2f\xa0\x5d\xd1\x0d\xd2\xc7\x11\x30\xdf\xf4\x91\x67\x8b\x2b\x21\xf4\x37\x55\x2e\x56\x2f\x1b\xf8\xa3\x93\x14\x9b\x66\x58\x14\xa5\x30\x08\x21\x1d\x22\x30\x11\xa5\xc3\x34\xb0\xd3\x7a\xc3\x9e\x18\xa1\x65\xc9\x8f\xd5\xb7\x52\x94\xad\x39\xc0\x8a\xa0\xf5\xed\xf9\x29\x9e\xe3\xd2\x79\xd9\xb8\x96\x0b\xcc\x3a\x5d\x2d\x18\x54\xc9\xb4\xdf\x3b\x3f\x61\x88\x91\xb5\x4b\x87\x7c\xa0\x0b\x42\x33\x25\xbc\x70\xcc\xf8\x5a\x05\xca\x69\x67\xe6\xf2\x58\xe8\xd9\x8a\x5a\x66\xd0\x79\xf5\xb9\x41\xe0\x74\xab\x2b\x18\x31\xbe\xf2\xb8\xa6\xb7\xa0\x48\x21\x21\x81\x14\x78\xd2\x71\xd7\x9e\xda\xd5\x84\x3b\x7f\x21\xb8\x39\x16\xbd\xec\xfd\x79\xe5\x63\x44\x43\x58\x73\xa7\xd1\x5b\xe9\xf4\x0e\x8a\x3e\x4b\x3c\x14\xa5\x02\x69\x1d\xac\xb2\x04\xbb\x11\xdf\x95\x63\xc8\x40\x5b\x65\x08\xeb\x4e\x50\x6d\x15\x69\x96\xd3\x29\x10\xaa\x2b\x44\xd1\x82\x00\x57\x86\xdc\x58\xd3\x9b\x26\xa9\x80\x3a\x81\x92\x2a\xf2\xfd\xf9\x29\x79\x43\x0e\xcc\xbb\x0e\x71\xfb\x27\x94\x65\xe8\xce\xd4\x54\x2e\xaf\x91\x4d\xfc\x14\xb8\x24\xc4\x3d\x22\xa4\x3d\xa2\x03\xc2\x05\x51\x65\x32\xf3\x6b\x32\x1a\x97\x57\xd8\x5c\x3c\x1f\x1a\xf5\x5f\x21\xaa\x76\x26\x30\xdf\x2b\x90\xbd\xd1\x97\xef\x5b\xd0\x97\x50\x84\x30\x38\xd7\x84\x9e\x45\xac\x1c\x34\x4d\xa9\xa6\x8e\xee\xd4\x59\xd7\xaf\x71\x4b\x9f\x9a\xfa\x28\x78\xcf\x78\x79\x6f\x23\x56\xfa\x53\xf2\xaf\xcf\x70\x5a\x92\x78\xa0\xe1\xa6\xd1\xa2\xc8\x98\xcd\x77\x5e\x8a\xa0\x3a\x6f\x6c\xf5\x60\x83\x88\x84\xc7\x9c\x66\x99\x30\xe4\xcd\x70\x76\xca\x53\x91\xaf\xbc\xcc\x08\x50\xd0\x28\x74\x37\x22\xaf\x12\x79\x9e\xdc\x1c\x91\xc1\x1c\x3a\xd4\x74\x59\xae\xcb\x67\x66\x33\xb2\x98\xdf\x50\x9c\x9e\x64\x74\x0c\x99\xe5\x2c\x16\x81\xd4\x2a\x02\x3d\x75\x14\xa2\x14\x59\x7f\x39\x18\x57\x22\x03\x1b\xd6\xe3\x01\x61\xa6\x7f\x11\x70\xc0\x49\xfa\x82\x03\x2a\x32\x0d\x38\xa0\x4a\xf6\x12\xe0\x50\x76\x60\xb4\x64\x19\x0e\x86\x6b\x37\xe1\x80\xac\xf3\xb9\xc3\x41\x41\x92\x88\xbc\xb8\x94\xc2\xa8\x5c\xbd\xb1\x16\x37\x6d\xed\x2b\xb2\x3a\xf9\x9a\x20\x1c\x24\xe5\xcd\x9b\xa9\x0c\x02\xfa\xa8\xb6\x34\xde\x47\xf5\xfd\xaf\xb0\x43\xb2\x21\x3d\xcb\x7c\xc8\xcf\xd2\x70\x2b\x99\x27\xdd\x85\x17\x5e\x4e\xa0\x83\x95\xac\x17\x66\x22\x12\x9a\x61\xc9\xbd\x6e\x18\x43\x96\xb1\x66\x79\xe2\x20\x0a\x13\x5d\x4b\xf8\x9b\xf7\xfb\x63\xf5\x35\xfc\xc5\xd9\xbe\xb8\x48\x21\x70\x41\xda\xf0\xd1\x1b\x1b\xad\x87\xf7\xf9\x00\x50\xc3\xd5\xbd\x37\x30\x6d\x3c\xad\x85\xab\x00\xf3\xa1\x2a\xe4\x67\x16\x08\x3c\x65\x7c\x8a\x16\x9d\x01\x91\x90\xd9\xd0\x51\x77\x86\x6f\xad\xfa\xb5\x8f\x18\xed\x27\xf5\xe8\xec\x5f\x8d\x92\x10\x13\xdc\xcd\x8c\x46\x0e\x2f\xdf\x4c\x2c\xb5\x64\x8a\xec\xbd\xf7\x00\xe8\x50\xf9\xec\x39\x32\x88\x3d\xfb\x85\xd5\x6e\x5a\x1b\xdb\x2d\xe3\xa9\x8b\xb2\x6c\x00\xab\xaa\x51\x6b\xa5\x50\x8c\xdf\x65\x69\x48\x1a\xde\x91\xbf\x71\x52\x01\x8b\x0c\x5b\xa3\xc7\x95\x15\x58\xbd\x79\x69\xf8\xb0\xc9\xaf\x7a\xc9\xf2\x34\xdf\x73\xdc\x7b\xf3\xde\xa1\x51\x7b\x57\xef\xf3\xdf\xb2\xf7\x94\xfb\x7a\xc7\x78\x2a\xee\x54\xdf\x3a\xc4\x8f\x76\x5a\x2f\x50\x27\x06\xad\x35\xe3\x53\x15\xea\x11\x34\xcb\x1a\x66\xd8\x75\x8a\x84\xdf\xe1\xaa\x22\xf1\xaa\x00\xbf\x14\x1d\x1e\x95\x80\x1d\xc6\x34\x57\xf4\x44\x9a\x4f\xd1\x8c\x66\xd7\x45\xfb\xd2\x6c\x64\x19\x0d\xbe\xfd\x70\x7d\xdc\x9c\xda\xd0\xb3\x3b\xac\x78\x6d\x80\x6d\xae\x13\x9a\xe6\x4c\x29\x34\x03\xc1\x78\x26\xc4\x2d\x39\xf0\x61\x1b\x53\xa6\x67\xe5\x78\x94\x88\x3c\x88\xe0\x18\x2a\x36\x55\x47\x0e\x69\x87\x66\xf5\x87\x84\xf1\xac\x8a\x46\x41\x35\x92\x6b\xe5\xcd\x18\xf8\x92\xa4\x5a\x05\xee\xad\xab\xd7\xe9\xbc\xcc\xab\xcb\xb4\x15\x3a\x19\x64\x4f\x5f\x70\x66\x75\x7b\x2e\x3a\xd6\xce\x78\x64\x8b\xf0\xdb\x5d\x6a\x4a\x98\x46\xb5\x16\x8e\x56\x7a\x7b\x72\x20\x39\xe9\x20\x01\xd5\x5f\x55\x9e\xbf\xd4\x73\x92\x14\x6c\xf6\x04\x60\xd4\x09\xdd\x18\xdc\x84\x56\xd9\x7d\x4c\xc2\x73\x8f\xee\x87\x12\x2d\x7a\x7d\x6c\x9a\x87\xd1\x07\xb2\x62\x46\x87\x56\x49\x36\x24\x09\x69\x98\x97\x01\x66\x82\x0b\x17\x9c\x6e\xb8\xa0\xe0\x88\xd2\xa8\x2d\x58\x47\x10\xee\x89\xa3\xb1\xc1\x52\x4f\x6a\xff\x60\xe8\x43\xc2\x24\x1e\x5b\x04\xa0\x5e\xc3\x1d\xd3\x33\x5f\xe1\xbe\xe1\x70\xc2\x95\x48\x50\xe8\x3d\xe0\x04\xa4\x14\xd2\x05\xc2\x78\xab\x2d\xce\x84\xa4\x18\x23\x69\x0c\x92\x50\xf3\xd7\xbe\x0a\x5d\x94\x75\x09\x5c\x8c\x13\x33\xd8\x04\x93\x09\x24\x28\x29\x85\x00\xb6\x64\xf7\xa0\xae\xdc\xe7\xa2\xbb\x0d\x82\xb9\x12\xba\x39\xbb\x37\x6f\x09\x9f\x0a\x9d\xa1\xae\x62\xde\xfa\xcb\x87\x23\x42\xce\x79\x15\x39\x39\x30\xbb\x18\xde\xe9\x43\x7e\xb4\xf9\xc4\xb0\xfe\x32\x7e\x40\x68\x77\x32\xe2\x9d\x2c\x7b\xc0\xf8\x2e\xc6\x60\x12\x1a\x84\x7b\x25\x07\x68\x18\x76\x93\x9a\xad\xf7\x4c\xbc\x8b\xa1\xd8\xdc\xf2\xa9\x8c\xc5\x2f\x83\xd3\x93\xae\x74\xce\xa5\xc4\xf7\x54\x14\xf7\x3a\x98\x2d\x10\xbf\x2b\x77\xd3\xa5\x48\x6d\x49\x8c\x2a\xa5\x1f\x7b\x59\x60\x89\x0e\xf6\x4f\x2f\x60\xd5\x42\x1a\x17\x36\x2a\x3b\xac\x95\xe1\x6a\x82\xa6\xc4\xc8\xca\x99\xd7\xed\xf3\x22\x03\xcc\x9e\x0b\x66\xae\x13\x03\x83\x2a\xba\x83\x6a\x21\x75\x21\x5e\x57\xa1\x63\x40\xfe\x07\x0f\x65\x15\x00\xe8\x8b\x07\x5c\x56\x8f\x5b\x15\x8f\x29\x5f\x52\x1b\x33\xdb\xb4\xf0\xa6\x03\x92\xb2\xc9\x04\x7c\xa0\xa1\x51\xfd\xa8\xa4\xb9\x21\xf1\x8a\x38\x10\x8c\x61\xca\x6c\x24\x5b\x45\xd8\xf6\x55\x9d\x01\x3f\xb0\xc4\x90\x69\x92\xb3\xe9\xcc\x22\x0a\xa1\x98\x19\x49\xbc\x4b\x2d\x13\x34\x25\x88\xdb\x42\x92\x3b\x2a\x73\xc3\x37\x68\x32\x43\xff\x1c\xe5\x24\x2d\x25\x96\x89\xd4\x40\xd3\xc5\x50\x69\xaa\x8d\xa8\x0b\xd2\x69\x84\x7e\xfd\xb1\x94\xf0\x83\x23\x96\x12\xde\x3c\x62\x29\xe1\x58\x4a\x38\x96\x12\x7e\x78\xc4\x52\xc2\x6e\x3c\x7d\xb6\x2f\x89\xa5\x84\x5b\x8e\xd7\x55\xce\x26\x96\x12\xde\x69\xc4\x52\xc2\xab\x23\x96\x12\xde\x30\x62\x29\xe1\x0d\x23\x96\x12\x8e\xa5\x84\x63\x29\xe1\x58\x14\xed\xd1\xb9\x9e\x67\x51\x34\x12\x4b\x09\xbb\x11\x4b\x09\xbf\x8a\xd2\x4f\x24\x96\x12\xde\x6a\xc4\x52\xc2\xb1\x94\x70\x9b\x11\x4b\x09\xe3\x88\xb6\x97\x58\x4a\xd8\x8f\x58\x4a\xd8\x8e\xdf\x8e\xd4\x1c\x4b\x09\xc7\x52\xc2\xb1\x94\x70\x2c\x25\xfc\xe0\x2a\x62\x29\xe1\xd7\xa0\x4f\x2a\x9d\xb2\x56\x95\xcf\xb6\x29\x54\xe1\x22\x43\x82\xd4\xd6\x71\x39\x99\x80\x44\xca\x85\x6f\x5e\x89\x42\xa8\x0a\x5a\x55\xb4\xcc\xc5\x19\x60\x59\x3c\x09\x34\x75\x01\xef\x1b\x1e\x77\xb9\xb4\x58\xa1\xac\x8e\xd4\x3c\xfb\xf8\x4d\x3f\x55\x31\xba\xc5\x28\xe2\x9a\x3f\xf2\xa4\x7b\xac\x5a\x0d\xf0\x75\x09\x18\x0e\xee\x49\x26\x94\x8b\x30\x45\x60\x25\x33\xca\x39\x78\xe5\x91\x69\x34\xca\x8c\x01\x38\x11\x05\x70\x4b\xbf\x29\x51\x8c\x4f\x33\x20\x54\x6b\x9a\xcc\x46\xe6\x4d\xdc\x03\xbb\x8e\x06\x75\xbf\x28\x2d\x81\xe6\x3e\x2e\x36\xa7\xcc\x4e\x45\x68\x22\x85\x52\x24\x2f\x33\xcd\x8a\x6a\x32\xa2\x00\x03\xda\x2d\xa3\xaa\x80\x81\xe1\x25\x75\x08\xe9\xa0\x7e\x9b\x5b\x96\x08\x8b\x02\xa1\xea\x3a\xc0\x3a\xa8\x79\xa1\x17\x55\x1c\x1d\x90\x09\x93\x4a\x93\x24\x63\xc8\xad\xf1\x8d\x36\x77\x10\xe7\x1b\x78\x5e\xcd\xdd\x4a\x95\x5b\x2a\x4f\x51\x6c\x2d\xb4\xb2\x51\x69\xf5\x84\x6e\xaa\x94\x29\x27\xe6\xab\x01\xa1\xbe\xe4\x8d\x05\xb4\x5f\x29\x82\xda\x73\x16\x3b\xbb\xfb\x29\x98\x2e\xa8\x93\x57\x87\xed\xd5\x88\x8e\x21\xc6\x1e\x39\x07\x8d\x68\xea\x5a\xa0\xc0\x70\x97\x95\x63\x80\x1b\xc0\x61\x6e\x70\x00\x12\x30\xfc\x95\x6e\xc0\xfa\xcf\x8e\xf4\x01\x53\xfc\x00\x4a\xd1\x29\x5c\xb6\xf4\x5a\x6c\xd2\xc8\xd0\x71\x51\x6f\x0c\xa2\x42\x66\xd3\xd3\xaa\x5f\xea\x30\xa7\xa6\x18\x44\x72\xbb\xa6\x4a\xf8\xb9\x93\x4c\x6b\xc0\x4d\xc5\xe2\x48\xe8\xf8\x5c\x4e\x40\xdd\x5f\x0a\x96\xfa\xe0\x27\xa9\x1f\x36\x44\x9d\xa7\x36\x74\x69\x0c\x64\x2c\x19\x4c\xc8\x84\x61\x3c\x14\x46\x28\x0d\x6c\xb9\x0f\x6a\x2d\x0a\x4a\x19\x7d\x57\x70\x2f\xcb\xfa\x75\x8d\xc8\x8f\x6e\x61\x5a\x96\x3c\xa1\x41\x11\x40\x4c\xd1\x62\x13\x32\xc5\x08\x27\x27\x2d\xfe\xf1\xcd\x7f\xfc\x89\x8c\x17\x86\xa5\xa1\x64\xa5\x85\xa6\x59\xf5\x91\x19\xf0\xa9\x81\x95\x3d\x9e\xcd\x24\xa3\x0a\x02\x58\xc5\xdc\x2e\xfc\xed\xef\x6f\xc7\x4d\x1e\x7b\x94\xc2\xfc\x28\x80\xdf\x30\x13\xd3\x75\x75\xe1\xdb\x87\x4c\xb6\x54\x89\xd6\xa0\x99\xc8\x58\xb2\xe8\x8c\x68\xbe\xee\x0c\x99\x89\x3b\x2b\xeb\xaf\xc1\x9e\x3a\x06\xb2\x10\x45\x99\x59\x0b\xf6\x37\x55\x7a\x5e\xa9\x60\x35\x07\x67\xed\xb9\x40\x9b\xab\x9b\x62\xb9\x5e\xac\x0d\x6c\xf3\xaf\x14\x2e\xb6\xdb\x59\x05\xab\xf2\x33\xa8\x08\x7d\x43\xb3\x6c\x4c\x93\xdb\x1b\xf1\x5e\x4c\xd5\x47\x7e\x26\xa5\x90\xcd\xb5\x64\xd4\x50\xcb\x59\xc9\x6f\x6d\xe5\xea\x2a\x45\x58\x4c\x8d\x68\x55\x94\xda\x07\x12\xaf\xfb\x60\x9b\x70\xea\x89\xb0\x57\x83\xea\x59\xe0\x9e\xd5\xba\x8e\x4b\x95\xb0\x18\x19\xce\xaf\x42\x64\xfb\xfd\x9b\x3f\xfe\xbb\x45\x5d\x22\x24\xf9\xf7\x37\x18\xfc\xa8\x06\xf6\x10\x23\x6d\x33\x8c\x22\xa7\x59\x66\xd4\x86\x10\x29\x0d\xa0\xd7\x21\xe1\x67\xc7\x41\xdd\x1d\xdd\xb6\x16\xa5\x6e\x6e\xfe\x8a\x72\x14\xd3\x0a\xb2\xc9\xc0\x66\x05\x54\x6a\xcd\x3e\x32\x86\x7d\x47\x7d\x30\x35\xe3\x19\x08\x40\x73\x91\x95\x39\x9c\xc2\x9c\xf5\xd1\xbc\xa2\x31\x9b\x57\xf5\x33\xa6\x30\x01\x63\x9c\x89\xe4\x96\xa4\xee\x62\x10\xc6\xb2\x5c\x42\xb5\x3d\x14\xda\x06\xf4\x74\x08\xe4\xd9\xf8\xfd\x8d\x10\x9e\x9c\x16\x45\x15\xa3\x2f\xe9\x5d\x03\x18\x78\x26\x31\xdf\xb7\x63\x3d\x85\xce\x66\xe6\xae\x46\xe6\xa1\xfb\x22\x43\x37\x5b\x4f\xd1\x3a\x84\xa5\xbb\x8d\xba\x5e\x7d\x7b\xc3\x64\x03\x21\xea\x09\xfd\x69\x28\xf0\xdf\x36\x3c\x7b\x25\x2b\xa9\x4a\x6c\xa9\x10\xc3\x0a\x00\x06\x7d\x90\x24\xb7\x37\xb8\xf6\x60\xdd\xec\x16\xbf\xd4\x80\x0b\xaf\xac\xca\x39\xd5\x4e\x20\xf4\xe6\x6b\x4a\x0a\x90\x8a\x29\xc3\x97\x7f\xc0\x03\x75\x92\x51\x96\x07\x26\xc0\xa7\x01\x82\x3d\xdc\x58\xf9\xb2\x3b\xa5\xbc\x14\xa9\x9b\x10\x49\xa1\xad\xfa\xb9\x46\xac\x6d\x4a\xb5\x3d\x32\xd4\xa7\x26\x95\x3f\xd4\xd0\x6c\x52\x4a\xf3\x4b\x45\x2a\xed\x5d\xaf\x89\x40\xe2\xf7\xbd\x54\xfa\x58\x2d\xbe\x27\x32\x80\x84\xd1\x6d\x6e\x93\x12\x36\x94\x47\x7b\x50\x02\x91\xde\xe9\x81\x23\x62\x5d\xea\xe6\x4c\xb8\x47\xc9\xfe\xbb\xfd\x27\x25\x92\x16\x44\x52\x14\x74\xda\xa9\x87\xc1\x12\xa4\x96\xa7\x0d\x13\xbd\x8d\x1a\x84\xd7\xab\xb2\x43\x78\x17\xa4\x75\x21\x0a\x2c\x33\x62\xbd\xa3\x1e\xc0\x4e\x41\xb0\xf9\x90\x77\x74\x41\xa8\x14\x25\x4f\x9d\x7d\xa9\x32\xf0\x7d\x58\x7a\xf1\x85\xe0\xe0\x0d\xe7\xcb\x79\xe2\x68\xd1\x67\x9c\xbc\x1d\xbd\x7d\xf3\x5a\x38\x15\x7e\xe1\x12\xa7\xba\xa8\x38\x95\xa5\x4f\x4f\xfa\xad\xbe\xda\x71\x4f\xdf\xfb\xc1\x99\x58\xea\x62\xc6\xcc\x17\x6b\xc5\x9f\xee\x24\xd3\x10\xf4\x36\x3a\x40\xc5\xc5\xe8\x87\x41\x56\xf4\x61\x8f\x35\xbc\xfb\x49\x43\x57\xe5\xf8\x13\xd2\x2d\x47\xa0\xf0\xb8\xad\xb3\x70\xa9\x07\x48\x58\x08\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x99\x81\x87\x4f\x8a\x5a\x0e\x68\x67\xf7\x45\x87\x1a\x73\x0d\xc0\x9d\xdd\x17\x14\x6d\x70\x45\x8f\x10\xfc\x2f\x98\xd1\x39\x60\x46\x24\xcb\xa8\xcc\xd0\xe7\x78\x6d\xd7\x4e\xc6\xa5\x26\xc0\xe7\x4c\x0a\x8e\x01\x3e\x73\x2a\x19\x56\xa5\x90\x80\x99\xd5\x46\x17\xfd\xf2\xe0\x87\xe3\x2b\x0c\x68\x38\x74\x29\xe1\x6e\x95\xa5\xf2\xe5\x23\xc2\x95\x04\xd3\x3d\xba\x7d\x7e\x1d\x06\x86\x48\x73\xfd\xba\xcc\x7b\xf2\x52\x97\xb6\x20\xfe\x7d\x92\x95\x8a\xcd\x9f\x8a\x92\xb8\x54\xd5\x53\xd6\x6a\x9f\x97\xd2\x66\x6b\x40\xad\x64\xc0\xa2\x69\x1d\x59\xcb\x23\x15\x58\xf7\x55\x55\xb3\x2a\xf4\x81\x3b\xd3\x93\xcb\x65\xb7\xb1\x78\xbe\x64\xd9\x8a\x08\x81\x75\x1b\x9e\xd6\x08\x95\x72\x75\x82\x2b\xdc\x0d\xac\xcd\xe8\xe6\x46\x52\xe0\xe9\xc5\x75\x58\x04\xc0\xaa\x4b\x22\x1d\x91\xcb\xfa\xc7\xba\x52\x04\xd6\x2f\xaa\x94\x48\x90\xd3\xba\x26\xee\x14\x38\x48\x14\x12\xcc\x94\x8d\x76\x72\x64\x4c\x95\x75\xf2\x9c\x5e\x5c\x5b\x9b\xed\x6e\x30\x6b\x2d\x66\xb7\x97\x50\x0d\xc7\xb7\x39\x11\x2d\x84\xdb\x66\xb7\x9a\xca\x60\x65\x00\x83\x4a\xa9\x9d\x98\x9c\x5f\x12\x9a\xa6\x12\xdd\x3e\x4e\xf4\x09\x4a\xbd\x55\xbe\x05\xac\xca\x40\x15\x84\x6b\x0a\xc0\x8d\x24\xae\x06\x2c\x39\x2d\x8b\x8c\x59\x37\x42\xf8\x40\x5d\x4d\x02\xdb\xab\xec\x8e\xb4\x5d\xd4\xbc\xd6\x4a\x5e\x07\x2a\x24\xda\x56\x75\x7b\x60\xf7\x24\x28\x91\xcd\xeb\x82\x9a\x4b\xbb\xe6\x4e\x04\x9a\xc4\xab\x5d\xf3\x45\xdc\xb6\xda\x31\xe0\x5a\x9a\xa3\xb9\xbc\x5b\xd8\xbd\x37\x2b\xf1\x34\x55\x13\xb2\x39\xa0\x7f\xdc\xd5\xaf\x73\x65\x94\xea\x12\x9f\xd6\x37\x6c\xab\xac\x02\x95\x9e\xa2\xe1\xaa\x5a\x9e\x44\xf2\x54\x88\xb0\x6c\xec\x38\xbd\xb8\xb6\x94\xd0\x7e\x7c\xd5\x95\x6f\xdd\x2e\xd5\x54\xad\x35\x06\x3e\x59\x95\x8f\x2e\x9a\xc7\x52\x5b\x25\xd7\xa6\xb4\x53\x20\x4b\x07\xf1\xaf\x53\xe6\x5e\x87\xb7\x2b\xa0\x32\x99\xb5\x81\xff\x03\x84\xc0\x4e\x4a\x52\x61\x23\x01\x26\x42\xa2\x4a\x3c\x44\xf2\x9e\x09\x71\x5b\x16\xdb\x50\x74\x37\x8d\xed\x95\xb3\x15\x81\x68\x3c\xf1\x9b\xa2\xe9\x29\x57\x6d\xfc\xbd\x4d\xd9\x07\xb4\x95\x78\x70\xa2\x3a\x1b\x43\x2c\xeb\x4d\x27\x59\xa9\x34\xc8\x6f\x98\x54\x7a\xcf\x17\x5c\x45\x0c\xb6\x36\x91\xfd\xf0\x86\x1f\x99\x9e\xb9\xd2\x69\xfb\x83\xe6\x25\xf3\xb7\x9b\x78\xdf\xe8\xb4\xfb\x17\x82\xc3\xfe\x68\x59\xec\xaa\x48\x79\x45\xd6\x36\xf2\x14\xb7\x74\x05\x99\x8d\x17\xc5\x0b\x01\xae\xdc\xb8\xb2\x71\xe6\x0d\x9e\xfe\x29\xd0\x84\x62\x89\x26\xbc\x7b\x56\x97\x79\xb3\x05\x58\x6c\x9d\x3a\xe1\x04\xbd\x45\x08\xa2\xa0\x26\x8b\x16\x9b\x3f\xbb\x8d\x3c\xb7\x33\x06\xd8\xf2\x7f\xd7\x20\xe7\x2c\x81\xf7\x8c\xdf\xee\x88\x7e\xcd\xe8\x92\xb3\x95\xd9\x1a\x05\x79\xad\x8f\x96\x71\x1b\x7c\x67\x58\x0c\x1d\x8b\x52\xa3\xec\x86\x0e\xc7\x5a\x71\x64\xfc\x7f\xec\x5e\xa0\xbd\xbd\xb0\x15\xb3\xd6\xe9\x88\x6a\x60\x8d\x3e\x5e\x09\x54\x0b\xae\x29\xd6\xf6\x3b\x15\xc9\x2d\x48\x92\x99\x65\x8c\x48\x1d\xf8\xd2\xa8\x26\x27\x4b\xd8\x31\xea\xa2\xad\xa5\x03\x8a\x19\xe4\x20\x69\x56\x17\x55\xec\x00\xea\xf7\x8e\x70\x56\xb3\x86\x31\x29\xb6\xba\x90\x2b\x83\x66\xce\xe1\xd9\xba\xbb\x72\xba\xf0\x95\x26\x19\xc7\x70\x83\x7b\xa6\xd0\xac\x5f\x88\x34\xcc\x62\x2b\x15\xc8\x61\x95\x63\xe8\xf2\x78\x54\x15\x88\x93\xc2\xb8\x9c\x4e\x19\x9f\x3a\xea\x8c\x34\xbd\xae\x35\x56\x6b\x3a\x18\xe9\x9d\x48\xb0\x05\x1f\x51\x7a\xb0\xf1\x65\x2c\xbc\x3f\x17\xa9\xbd\x7d\xbc\xb0\xda\xa0\xdf\xd9\x3a\x40\xfa\x9c\x13\x21\x5d\x9d\x05\x9a\xa6\xb8\xf6\xd5\x2f\x74\x2d\xbd\xc3\xaf\x1a\x54\x71\x1c\x36\xb2\xbb\x7a\x2a\x00\x8b\x2a\xc7\xbe\x47\xf7\x63\x35\x36\x99\xb2\x05\xbe\x82\xf2\x9a\x5e\x35\x58\xae\xad\x79\xb6\xba\xfb\x3e\x3e\xba\xcd\x39\xdf\x9d\xbd\xb4\x62\x2d\x4d\x6e\xcd\xd7\x7c\x85\x0d\x13\x5f\xf2\x8e\x3a\xcc\xa2\xd8\x53\x54\x43\x5e\x08\x49\x25\xb3\xe4\x6e\x19\xcf\x0c\xbf\x58\x83\x60\x73\xdb\xab\x71\x0d\x8e\xad\xc5\x65\xa4\xb6\x5c\x54\x2d\xe4\x0d\x5f\x50\xc9\x0c\xd2\x12\xa3\xd4\xa7\x25\xc5\x56\xb0\x86\x5a\x38\xa3\xfa\xc2\x85\xff\x59\xa4\xab\x02\x0b\xab\x74\x84\x05\x06\xe3\x60\xb5\x3d\xf3\x0b\x62\xab\x0d\x41\xb4\xad\x34\xb1\x2f\x5f\x18\x8d\xb8\x01\x09\x13\x8a\x6d\xfe\xa8\x3f\x54\x70\x9f\x80\x21\x6b\x5a\xd5\x8b\x75\xf1\x29\x58\x4b\xd4\x63\xba\x83\x21\xcc\x59\x82\x6f\xd8\x78\x84\xdd\x17\x58\x60\x8f\x17\x75\x6b\xe3\x0d\x87\xe7\xc6\x7c\x5b\x95\x2c\x84\x4f\xf9\x14\x81\xad\x0e\xc5\x32\x04\x9b\x8a\x90\x7f\x0f\x11\x3c\x71\xd3\x07\xf9\x04\xdc\x1e\xa1\x2a\x33\xc0\x75\x21\xf4\xd1\x25\x0f\x1c\x12\x5b\x77\x76\x47\xf4\xed\xa0\x67\xb4\x77\x22\xb6\x72\xfe\x75\x51\x69\xa8\x9c\x76\x57\xff\xf6\x8f\xe5\xb4\xcc\x6d\x59\x60\xb1\x54\x99\xd5\xf5\xb3\xb4\xec\x14\x2d\x76\x86\x19\x9f\x7c\x38\x0d\x93\x33\xc2\xa8\x73\x9f\xda\x62\x84\xbc\x8e\x96\xdc\x65\x53\xae\x39\x68\xb5\x7d\xb8\xe6\x1a\x4e\x3f\x75\xb6\xca\xea\x6d\x1e\x2d\x19\x2f\x8c\x9c\x81\xd2\x51\x6d\xad\xe4\xc9\x8c\xf2\x29\x1a\xf8\x45\x69\xe6\xfb\xf2\x4b\x5c\x91\x84\xb4\x4c\x5c\x49\x79\x1f\xd9\xfd\xa5\xb7\x6b\xba\x4a\x47\xd8\x57\x4a\x25\xb4\xf0\x6b\x0e\x3f\xcb\x0a\x21\xef\x08\x1b\xc1\x88\xec\x7d\x19\x5c\xda\xb3\x6f\x2f\xa4\x30\xaf\x70\x41\xe1\xb8\xaa\x8c\x69\x3c\xde\x7b\xe1\xdd\x23\x72\x66\xde\x81\xbe\x9e\x0a\x80\x41\xdc\xf2\xb8\x06\xdf\x80\x48\x98\x52\x99\x66\x98\x4b\x38\xa9\xc4\x2d\x9b\x71\xe4\x00\x86\xa4\x17\x23\x05\xb9\xd0\xeb\xec\xae\x3b\xf5\xbb\xb7\x42\xda\x30\xa5\x9a\x0e\xb1\x0c\xbf\x25\x62\x47\xd6\x70\x30\x74\x85\x10\x87\xd4\xa1\x56\xd0\x11\xff\x0b\x97\x33\x36\xa4\xd5\x5d\x8c\x0f\xe9\x10\x4b\x12\xb6\x8f\x82\x7d\x82\x80\x89\x4e\x3a\x7c\x87\x7a\x98\xcb\x82\x77\x55\x46\x19\x61\x30\x22\x17\x42\xd7\x65\x73\xab\xd8\x0c\x57\xf2\x71\xdd\x79\x3e\xbb\xb8\xb9\xfa\xeb\xe5\xc7\xf3\x8b\x9b\x78\xac\xe3\xb1\x8e\xc7\xba\xc3\xb1\x06\x3e\xef\x7c\xa4\x2b\x05\x6f\x9d\xce\xbb\x54\x8a\x2f\x48\x19\x7f\x45\xd1\x67\x67\x7c\xfe\x03\x95\x75\x2f\x77\x94\x1f\xd7\xba\x89\x7d\xb3\x77\x24\x71\x27\x2f\x3e\xfc\xec\x09\x83\xc7\x7a\x0c\xca\xb9\x08\x2a\x1d\xac\xdb\xb5\xb0\x01\xd6\xc9\x2f\xe7\xa7\x67\x17\x37\xe7\xdf\x9c\x9f\x5d\x3d\x69\x34\x45\xc7\x52\x78\x4d\xa6\xdc\x92\x4b\x16\x12\xe6\x4c\x94\x2a\x5b\x54\x8d\xa6\xd6\x13\x81\xd5\x80\x3c\x9e\x12\xca\x17\xde\x9e\xb6\xfe\xb1\xc8\x6c\xfb\x65\xb6\xcd\xe0\x92\x0e\x85\x4b\xfa\x42\xdf\x6f\xa4\x68\xdd\x48\x7f\xd9\xb6\x6f\xed\x13\xde\xa6\xbf\x0e\x9f\xf6\x5d\x8d\x83\x06\xeb\x71\xc2\x63\x5d\x50\xc1\x08\xa3\x79\xa1\x3b\x94\x09\xef\xa5\xf8\x69\x3f\x75\x42\x6d\x20\xc6\x07\x5a\x7c\x07\x8b\x2b\xe8\x58\x1f\x65\xc9\x97\x92\x41\x62\x18\x1d\xb9\x85\x85\x75\xb1\x9e\xf8\x97\x75\xa9\xe3\xf2\x2c\x6b\xc7\xde\x42\x97\xba\xbe\x7d\x16\x7d\xbd\x85\x0e\x91\x99\x7e\xac\x94\x3f\x35\x5b\x88\x72\x9a\xd9\xd3\x6e\xbb\x47\xfa\x2d\xf8\xfa\x09\x8a\xdc\xee\x87\xec\xde\xd1\x59\xbd\x73\xf9\x08\x31\x37\x9c\x0b\xee\x8e\x5c\x54\xda\xd0\x28\xae\x43\x8b\xb5\xea\x08\x43\x6f\x8e\xbe\xc0\xff\xb8\xa2\x60\xc7\x69\xea\xa2\xa3\x4b\x05\x93\x32\xb3\xb6\x7a\x35\x22\xb4\x60\x3f\x80\x54\x68\x52\xbd\x65\x3c\x1d\x90\x92\xa5\x5f\x77\xa9\x2a\x65\x47\x8f\xbb\x20\xbc\x47\xaa\xdf\x9d\xb8\x76\x0e\xc7\x90\x77\x55\x44\x84\xd8\xd4\x47\xc4\x4d\x6f\x03\x76\x42\x46\x4f\xa0\xe9\xda\x89\x8a\xd8\x2d\xec\x97\xae\xee\xd7\x84\xd5\x3a\x73\xaa\x0a\x5c\xe9\x3b\x5f\x68\x4e\x55\xed\xa3\x46\x06\xc3\x06\xcd\x3f\x55\x41\x13\x18\x90\xbf\x57\x3f\x62\xc3\x65\xf5\xd3\xfe\xfe\x9f\xbf\x3b\xfb\xeb\x7f\xee\xef\xff\xfc\xf7\xf0\x2a\xb2\x42\xd4\x9a\x97\x6e\x41\x1b\x3c\x17\x29\x5c\xe0\x3b\xf0\x4f\x27\xae\x1d\x27\x89\x28\xb9\x76\x17\x30\x6d\x79\x34\x13\x4a\x9f\x5f\x56\x7f\x16\x22\x5d\xfe\x4b\x75\x2a\x95\xf6\x2c\x19\x03\x6e\x51\x87\xf4\x1b\x3b\xfa\x63\x0f\x35\x2d\xe9\xf9\xa8\xba\x59\x3d\x36\x62\xc9\x5d\xeb\x89\xf9\xc6\x83\x00\x5b\x5c\xfa\xfa\x08\x1c\x93\xca\x8d\x64\xda\xac\x9b\xb7\x37\x7f\xdb\xa9\x99\xaf\x1d\x3d\x92\xb6\x6a\x07\x7b\x06\x18\x42\xc4\xb7\x52\xc2\x83\x5c\x31\x58\xaf\xa5\xd4\xee\xe6\xe3\xcb\x73\x32\xb7\x10\x7e\x36\xc0\xf1\x4e\xb4\x6f\x3e\x29\x8d\xab\xbd\xa0\x4b\xc9\xab\xef\xac\xbf\xda\x5f\x77\x85\x04\x54\x55\xdb\x0b\x8c\x62\x73\x60\x7f\x1c\x25\x45\x39\x70\x37\x8c\x72\xc8\x85\x5c\x54\x7f\x56\x2e\xc2\xa1\xd2\x42\xd2\x29\x26\x9e\xd8\xc7\xed\x63\xd5\x5f\xf6\xc1\xc6\x0b\x56\x9f\xb6\xaa\x70\x52\x4a\x23\x34\x64\x8b\xba\xf4\xe7\xeb\xa3\x6d\x1e\xf4\xcf\x84\xb4\x55\x98\xd1\xb5\xef\xa3\x1d\x4d\x84\xac\x83\x04\x50\xe0\xac\xa0\x88\xfa\xa4\x4b\xac\x1d\x54\x62\x90\xb5\x06\xf0\xb9\xd1\x2c\x5b\x97\x06\xab\x47\x8f\xd4\x2c\x65\x73\xa6\x44\x87\xf4\x9a\x6a\xa2\xcd\x39\x03\xae\xb6\x87\x8d\x8c\xaa\xcc\x66\xf7\x05\x56\x43\xaa\xce\xeb\x12\xd9\x7f\xdb\xa5\xd3\xb7\x1d\x05\xd5\x1a\x24\x7f\x47\xfe\xfb\xe0\x6f\x5f\xfd\x3a\x3c\xfc\xfa\xe0\xe0\xa7\x37\xc3\xff\xf8\xf9\xab\x83\xbf\x8d\xf0\x1f\xff\x7a\xf8\xf5\xe1\xaf\xfe\x8f\xaf\x0e\x0f\x0f\x0e\x7e\xfa\xee\xc3\xb7\x37\x97\x67\x3f\xb3\xc3\x5f\x7f\xe2\x65\x7e\x6b\xff\xfa\xf5\xe0\x27\x38\xfb\x79\xcb\x49\x0e\x0f\xbf\xfe\xb2\xf3\xd2\x7b\x28\x4e\x6a\x47\x9f\x25\x4a\x9b\x33\xf6\x82\x7e\x9f\xb0\xc8\xbf\x1d\x1e\xbd\xfa\x3e\xff\x3e\x3c\xfa\x5d\xcd\x90\x2a\x76\xfd\x6c\x0e\xb8\x82\x44\x82\xfe\x1c\x96\x1c\xfb\xa6\x20\x50\x66\x5f\x91\x4a\xb5\x78\x6d\x7c\xee\xb7\x60\xdc\xf1\x62\xbb\xdd\xd7\x5a\x12\x9d\x48\x91\xfb\xb4\x77\x74\x6f\x60\x9b\x6b\x7f\xdf\x2d\x74\x6a\x96\x68\x47\x34\x06\x45\x63\xd0\x86\xf1\xa8\x31\xe8\xda\xe2\xe1\xb3\xb5\x04\x01\x9f\xb7\x75\x61\xac\xf5\xa0\x7b\x5d\x27\xac\x11\xb7\x9d\x43\x6d\xe4\x8f\xba\xaa\x3c\x71\x75\x24\x8d\x65\x68\xf9\x7a\x1f\x26\x76\xb1\x67\xdc\x1e\x7c\x9c\xa0\xce\x2b\x71\x5d\x0d\x6c\x09\x43\x98\x9b\x25\x54\x35\xb0\x1b\xd5\x2e\x31\xba\x14\x63\x5e\x7f\xb4\x21\xa8\xb7\x36\x2a\xd5\x28\x69\x8c\xd7\x75\x42\x2b\xe1\xb0\x2e\x2e\x4d\x95\x12\x89\x8d\xa6\xad\xb2\x1c\xb0\x74\x9d\x5b\x36\xae\x06\xfb\x4c\x07\xfd\xc8\x6d\xe1\xe9\xfa\x5b\xc7\x0b\xac\x87\xc9\xe7\xbe\xf8\x76\xea\x73\x66\x70\x25\xeb\xe7\x78\x5d\x01\x08\x06\x11\x9d\x13\x2c\x88\x43\x40\xaa\x5f\x69\xd8\x14\x43\x31\xc4\xa4\xb6\xb2\xb6\x6b\xf3\xd7\x99\x8b\x77\xe7\x99\x95\x67\xab\x93\x30\xb4\xc2\x2c\x6b\xf3\x73\x93\x49\xbe\x06\x67\x60\x77\xf6\xf9\x9b\x63\x9d\x3d\xb1\xcd\x7e\x58\xe6\x0e\xbe\x93\x3e\xd9\x64\x1f\xce\x92\x42\xc2\x84\xdd\xf7\x74\x4e\x8f\x79\x6d\x89\x61\x29\x70\xcd\x26\xcc\xe6\xd0\x14\x12\x0a\xe0\x36\x79\x81\x26\x33\xa4\xfd\x8e\x53\xd6\xce\xe9\xe7\x18\xcc\x63\x05\xee\x7e\x49\xd9\xf5\x3a\x61\x3f\xd2\x31\x12\xe9\x58\xeb\xf1\x99\xe8\x98\xc3\xdc\xe7\x43\xc4\x30\xf2\xbc\x7b\xe8\xfb\x69\x10\xc7\x8e\x58\xbc\x33\x96\xd5\x79\x4e\x47\x38\x4b\x2b\xeb\x73\x27\x64\xc0\xd7\x5e\x96\x59\xd6\x53\xf5\xed\xfd\x73\x84\x46\x51\x66\x99\x4b\x3a\x1e\x91\x8f\x1c\xcf\xe3\x31\x76\x79\x18\x90\x0b\x98\x83\x1c\x90\xf3\xc9\x85\xd0\x97\x56\xb0\x6d\xc6\xb2\xd9\x1b\x09\x9b\x90\x77\x46\x65\x52\x9a\x68\x5b\x69\x3f\xa8\x0b\x24\x64\x63\x82\xba\xe4\x58\x87\x18\xf4\xcd\xdb\xf2\x85\xcf\x68\x1b\x3e\xd1\x36\x55\xad\x4c\x7a\xd0\x4d\x7d\xcb\x3a\x17\x1d\x87\x11\x91\xce\x35\xb2\x2e\xa7\xf7\x05\x96\xd9\x28\x84\xd2\xd7\x46\x85\xed\xa7\xcd\xcd\xa5\x9f\x0e\x3b\x47\xd0\x2c\x83\xb4\xd1\xe7\xc8\xf6\xe7\xa0\x4d\x15\x1a\xb3\x8d\xab\x76\x11\x40\x66\x94\xa7\x19\x48\x2c\xf9\xae\x96\xeb\x5a\xb1\xba\xc7\x41\xd5\x95\xc2\xa7\x85\xd2\x24\x11\x32\x75\xcd\x6a\x5d\xf2\x26\x2e\xa6\x3a\x5e\x48\x68\x73\xca\xe9\xd4\x76\x29\x5c\x29\x1c\x8c\xe5\xa4\x55\xd0\xda\x62\x26\xc4\x2d\x49\x44\x5e\x64\x78\x00\x3a\x9c\x8f\xba\xb3\x4e\x85\xa2\x43\xec\xa6\x78\x14\x34\xdd\xc1\x1f\x9e\xb0\x3b\x62\x1f\x72\x0a\xdc\x43\xd2\x5b\x57\x3e\x43\x11\xcd\x2e\xa3\x4f\x5c\xf0\x4a\x5c\x99\x08\x73\x18\xcd\x5e\xd7\xf5\x08\x2a\xa2\x37\x22\x67\xf7\x90\x04\x9d\x2d\xcd\x13\xae\xb5\xa5\x16\x68\x0f\xe9\xde\xb1\xb8\xb3\x29\xbf\x2f\xf3\x79\x87\x04\xb5\x70\x2c\x55\x9f\xc3\x39\x7d\xb1\x6d\xf7\x0a\xec\x5b\x60\x13\xa4\x31\x69\xcd\xd7\xdf\x6e\x9c\x21\x7b\x62\x57\x4a\xd6\x55\x01\xca\x7e\x2e\x4c\xd4\x16\x42\x93\x83\xfd\xa3\xfd\xc3\x15\xbb\xde\x52\xc5\xe6\x9b\xe0\x49\x86\x25\x0a\x0b\xac\xf7\x07\xc9\x7e\x3a\x20\x4c\x7b\x1a\x6d\x2b\x25\xe0\xaa\x5c\x26\xdd\x80\x28\x41\xb4\xa4\x29\x73\x9a\x13\xfe\x6a\x6e\xd2\xb2\x74\x65\x12\x0e\xf6\x7f\xdd\x1f\x10\xd0\xc9\x21\xb9\x13\x7c\x5f\xe3\xf2\xb1\xa6\x48\xa9\x82\x89\x16\xa2\xc4\xd6\x7d\x16\x04\x55\x81\x10\x43\xe8\x88\x28\x6d\x9f\x9f\x19\xd5\x3e\x83\xef\xec\x9e\x69\xdf\xdb\x42\x4c\xc8\x1b\xdb\x66\x08\xa8\xb3\x2c\x66\x6c\x0e\x47\x33\xa0\x99\x9e\xd9\xe0\x0b\x2e\xf8\xd0\x76\x8a\x33\x14\xc8\x5d\xe9\xea\x87\xe8\x66\xa6\x0b\x47\x07\x93\xdd\xea\x82\x3a\x4a\xe4\x86\xf6\x7e\xdb\xbe\x17\x2e\x59\x69\x13\x7d\x73\x73\xf9\x6d\xa3\x19\x2e\x12\x7f\xad\x0b\x1f\x12\x13\x14\xdb\x78\x06\xb4\xa3\x1f\x27\x60\xa7\x4e\xb6\xa4\x47\x12\xd6\xb5\xa3\x2d\x59\x6d\xfb\xbd\x5b\x2b\x5b\xf2\x57\x51\x62\x0b\x3e\x3a\xce\x16\xe4\x8e\x72\xed\xd3\xf7\xf6\xcc\x54\x7b\x86\x3c\x19\x6c\xf8\x0b\xd0\x14\xa4\x42\xea\x01\xb4\x75\x51\x31\x3f\x7a\x73\x4e\x05\x6b\xeb\x97\x0f\x94\x4a\x8b\x9c\xcc\xdc\x67\x37\x53\x1a\xdd\xc9\x18\xe1\xe9\xf1\xf9\x42\x12\x0a\x4b\xe1\xdc\x33\xaf\x8e\x7e\xad\xd0\x0d\x0b\xf7\x46\xf1\xfd\x24\x04\x5b\xd8\xa2\x85\x71\x0b\x2c\xdb\x5c\xb1\x27\x5a\xda\x43\x50\x01\xe9\x31\xb0\x80\x74\x4b\x90\x5c\x9e\x08\x9d\x65\xdd\x63\xa8\x7a\x8b\x55\x20\xbd\xf9\xe3\xc9\x3a\xe3\xa5\xc3\x19\x1b\x39\xdb\x13\x10\x7b\xf5\x82\x93\xee\x29\x98\xe1\x78\x18\x00\xfd\x6c\x3e\xe9\x13\x02\x45\x0f\x21\xd3\xab\x01\xd3\x2b\x2d\xc6\x91\x4c\xd8\x4a\x55\xcf\x86\xcb\x74\xed\xb7\x4e\xd6\xe7\x1f\x4b\xc2\xab\xf6\xb8\xfa\x45\xf4\x5c\x27\xfd\x85\x36\xf6\x1d\xd8\xd8\x6b\x58\xe3\x27\x0d\x6a\xc4\x54\x8a\xce\x54\xa4\x69\x53\xc7\x29\x0d\x06\x18\xbd\xcd\x68\x9c\x4e\xf6\x73\x46\x21\xdf\xc2\xa3\x69\x45\x35\x47\xed\x59\x9c\x31\x9d\x14\xd7\x22\xb9\xed\x51\xaf\xd9\xbf\x39\xb9\xb4\x53\x06\xaa\x0d\xe5\xde\x18\xc2\xf8\x5c\x64\x73\x5b\xe9\xef\xe6\xe4\x12\x4f\xde\x08\xff\x85\x86\x28\xd4\xa8\x17\xe6\x59\x1f\xec\xef\x5c\x38\x46\xfb\xb6\x16\x34\x4a\x24\xd0\x8c\x29\xcd\x12\x7c\xae\xb2\x6d\xe1\x0c\x5d\x7c\x37\x51\x53\x5a\x37\x7a\xd7\x94\x82\x6e\xb3\xbb\x2a\x4d\x5d\x83\xf3\x9e\x31\x5f\x72\xfc\x48\x56\xcd\xd4\x22\x5f\xea\x69\xbe\xe7\xcb\x97\x0a\x09\xd7\x5a\x14\x3d\x79\x42\xec\x64\x1b\xfc\x20\x63\x98\x08\x09\xcb\x8e\x90\xc0\xb1\x91\x96\xe0\x0a\x71\x1e\x5f\x9e\x57\x26\x28\xd1\x70\x5e\xd8\xb0\x44\x5f\x7d\x33\x63\x73\xe0\xa0\xd4\x11\xba\x3c\xca\xc2\xaa\x98\xbe\x6f\xee\xc0\x7c\x1d\xe4\x85\xad\x5f\x59\x85\xfa\xbb\xae\xbd\xf8\x23\x68\x5b\x78\xb2\xf2\xbf\x38\x8b\xaa\x5f\xfe\xb2\xab\x24\x91\x54\xcd\x6c\x47\x5b\xb8\x67\xda\x75\x65\x96\x40\x95\xe0\xd6\xd8\x1b\x34\xd7\x65\x8a\x14\x54\xa9\xba\x0c\xb8\x7b\x89\x7d\xe8\xd2\x96\x0e\x0e\x1f\x98\x4a\x9a\x00\x29\x40\x32\x91\x12\xcc\xb9\x4d\xc5\x1d\x27\x63\x98\x32\xae\x3c\xfc\xcc\x44\x1e\xd0\x86\xdd\x00\xda\x86\x7d\x45\xb5\x11\xb9\x6a\x14\x0a\x71\x29\x3c\x89\xa8\x4f\xb4\x5b\xc5\xb2\x93\x09\xa3\x26\x11\xbc\xb6\xad\x4c\xb5\x31\x61\xa7\x9d\x47\x16\xdd\x83\xb7\xc9\x36\x83\xf2\xd7\x36\x42\x07\x0b\x9e\xd2\x64\xd6\xcd\x7d\x1b\xdd\x53\x5b\x8e\xe8\x9e\xda\x6d\x44\xf7\x54\x74\x4f\x6d\x1e\xcf\xce\xbc\x1b\xdd\x53\x51\xe9\x5a\x1e\xd1\x3d\x15\xdd\x53\x1b\xc6\xb3\xa3\x5f\xd1\x3d\xb5\xc5\x88\xee\xa9\x2d\x47\x74\x4f\x45\xf7\x54\x74\x4f\x45\xf7\xd4\x6f\xc8\x0c\xe8\x47\x74\x4f\xad\x4c\x12\xdd\x53\x01\x30\xa2\xa6\xb4\x66\x44\xf7\xd4\x9a\x11\xdd\x53\xc1\x88\x7c\xa9\x05\x5f\xf2\xce\x9d\x4b\xa3\x97\x75\x6f\x23\x8c\xda\x1d\xd6\xf3\x7b\xa5\x69\x4d\x5d\x6c\xfc\xcf\xda\xbe\xff\x4c\x7c\x28\x3d\xd8\xf4\xa3\x3d\xff\xd5\xd9\xf3\xfb\xb1\x85\xf5\x60\x07\xeb\x4c\xca\x9d\xd7\xfc\x66\x26\x41\xcd\x44\xd6\x1a\xd1\x1b\x48\xfe\x81\x71\x96\x97\xb9\xc1\x39\x65\xf0\x99\xcd\x2b\xf7\xbc\xaa\x5b\x32\xa3\xd7\xde\x9a\xe4\xcc\x8d\x2c\x05\xac\xc6\x49\x59\x66\xb6\x11\xf3\x27\x67\x14\x65\x62\x55\x26\x09\x00\xf6\xfa\x0a\xd5\x85\x3f\x8c\xaa\x37\x55\xbd\x1d\xde\x76\xa3\x37\xdd\x98\xac\xad\x97\x89\xb3\xfc\xe1\xf7\xad\xe6\xe8\xe8\x4e\xf9\xfc\xae\x94\x1e\xc8\x74\x77\xc5\xa0\x93\x52\xd0\x07\x97\xe8\xaa\x0c\xbc\x34\x97\x49\x6f\xae\xc3\x1e\x5c\x25\xcf\xc8\x4d\xf2\x6c\xd8\xc2\x73\x71\x8d\x3c\xc3\x52\xa0\x3d\x58\xf2\xfb\x70\x85\xf4\xe7\x06\xf9\x04\x15\x33\x3f\x8d\xfb\xa3\x47\xb5\xb3\x27\xb7\xc7\xe7\x70\x79\xf4\xf2\xd5\x5d\x5d\x1d\x9f\xcf\xcd\xd1\xcf\xe7\x76\x34\x23\xbd\x0a\xd7\x46\x0f\xe6\xa3\x3e\x4d\x47\xbd\x99\x8d\x3e\x99\x2b\xa3\xbb\x1b\xe3\x19\xb8\x30\x3a\x03\x99\x71\xa6\x19\xcd\x4e\x21\xa3\x8b\x6b\x48\x04\x4f\x5b\x73\x98\xa5\x12\x6a\xd5\xf9\x51\x76\x5a\xa7\xa3\x35\x03\x7d\x67\xd4\x55\x8a\x85\xd4\xc7\x2e\x7b\x93\x9e\x13\x28\xd0\x1a\x67\x57\xd9\xa6\x0e\xd3\x9d\x90\xb7\x99\xa0\xa9\x3a\x2a\x84\xfd\xbf\x3a\x8c\x37\x88\xdf\xb5\xef\xea\x16\xc0\xfb\xd4\xca\xa0\x8d\x7a\xee\x73\x13\xff\x22\xee\x88\x98\x68\xe0\xe4\x80\x71\xbf\x8f\x87\x81\x1a\x58\x6b\xe6\x15\x5a\x9b\xab\x6f\xdf\xf8\x9b\x5f\x9f\xca\x8d\xc6\x05\xa5\x3e\xbd\x05\xc4\xbd\xe8\x71\x13\x88\xbb\x71\x52\x66\x4d\x33\x88\x35\x8d\x34\xe9\xcd\xdb\xba\xd6\xe5\x5b\x9c\xb7\x3a\x6d\x94\xa7\xc4\x65\x48\xbc\xbe\x4d\xeb\xec\xa0\x7d\x0d\xce\xd9\x68\x7b\x21\x7d\xdb\x5e\x9e\xc8\x09\xfb\x0c\xa5\xe6\x17\xea\x78\x8d\x52\xf3\x0e\x23\x48\xb4\xfa\x56\xd2\x04\x2e\x7b\x17\x38\xfc\x71\x22\x69\x29\x5d\x7e\x5c\x25\x77\x54\x87\x87\x03\xa4\xf6\x34\x55\xd9\x67\x98\xf6\x35\x29\xb3\x6c\x41\xca\x42\xf0\x66\x8a\x9f\x75\x5a\x2d\x67\x86\x99\xd9\xd6\xbd\xa5\x96\x52\x0b\x29\x1c\x03\x96\x25\xe7\x86\x9e\xd7\xdd\x6f\x50\x2a\x55\x96\x56\x87\xf9\x67\x8a\x4d\xcd\xf2\x0d\x33\xc5\xd4\x34\x96\x43\xdd\x1f\xa1\x9e\xd0\x3c\x3d\x11\x32\x61\xe3\x6c\x41\x66\x34\xab\x5a\x1d\x50\x72\xcb\xb2\xcc\x4d\x33\x22\xd7\xa0\x89\x9e\x31\xd7\xa5\x9a\x64\x82\x4f\x71\x71\x94\xfb\x16\x5b\x90\x98\x67\x93\x0c\x28\x2f\x0b\xfb\x3e\xc3\xd6\x17\xa2\x94\xfe\x7d\xae\x7e\x64\x35\x0b\x53\x84\xb3\x6c\x10\x34\xf2\x79\x70\x63\xeb\x6e\xe9\x0a\x7c\xf2\xde\x1d\x53\x30\x08\xe7\x14\x73\x90\x92\xa5\xce\x69\x60\x7f\x2b\xa4\x98\xb3\xd4\xb6\x62\xf0\x60\xc3\x96\xa1\xb6\x55\x43\x75\x9e\xb9\xe0\x43\x0e\x53\x8a\x52\x8f\x3b\x45\x76\xcf\xec\x3c\xd6\x15\xc7\x53\x6c\xde\x60\xd4\x05\x51\x34\x72\x46\xe7\xcc\xb6\x9d\x0c\x20\x47\x0e\xb8\x20\x02\xd9\x6b\xc9\x99\xb6\xad\x8c\x67\xa5\x26\xa9\xb8\xe3\x87\x66\x72\xa6\x0c\x1c\x28\x19\x83\xf6\x6d\x55\x7d\x9b\x3f\x26\x41\x11\xe0\x74\x9c\x99\x3d\xc7\x98\x80\x9b\xb5\x00\x22\x13\xa0\xba\x94\x40\xa6\x54\xc3\x5a\xa1\xc9\x7e\xef\xc3\xe0\x65\xaa\x6a\x39\x5e\x72\x05\xad\x9b\x2d\xf7\x2c\x69\xfd\xe9\x8f\xed\x68\x04\xcb\x41\x94\xfa\xb3\xa8\x92\xb6\x1d\x7f\x20\x19\xb3\x1c\x14\x11\xe5\x92\x8e\xfd\xd6\x3d\xb6\x7e\x87\xa2\x3e\xb9\x6e\xb4\xb5\x12\xaf\x31\xa5\xb9\x6e\x80\xab\xf1\x33\x41\xb7\x53\x6a\x8e\xe2\xe9\xc5\xf5\x2f\xef\x8f\xff\xeb\xec\xbd\x3b\x9f\x3c\x64\xfa\x25\x67\xff\x28\x81\xd0\x5c\x18\xb9\x3a\x0b\xc3\x70\x06\x68\x1e\x08\x7e\xc0\x93\xdc\x6f\xc0\x4e\x4b\x86\x8c\xad\x99\xbb\x87\x25\x61\x83\xe7\x4f\x1f\x95\xf4\xd4\x2d\x6b\xaa\x96\x9b\xe6\x83\xc3\x96\x35\x94\x70\xd0\xe6\xe4\x59\x89\xd2\xb6\x30\x62\x7c\x9a\x85\xc2\x64\x3b\x72\xd5\x55\x27\xea\xaa\x11\x0d\xeb\x2f\xb8\x6c\xab\x18\xf5\xd2\x3a\xa7\x5e\x43\x4f\x0d\x27\x6a\xaa\xed\xd5\x00\xdb\x11\xd4\xab\x01\x56\xf4\x38\xbf\x24\x34\x4d\x25\x8a\x29\x78\xea\xf3\xa5\xc6\x73\xf8\xb0\x35\xc6\x0f\xc8\x1b\xf2\x67\x72\x4f\xfe\x8c\x6a\xc1\x9f\xba\xb6\xe7\xe8\x2a\xb0\x77\x37\x4b\x58\x6d\xf4\xfc\xb2\x27\x88\xff\x38\xa3\x1a\x67\x34\x50\xd5\x82\x8c\x99\x13\x43\xe1\x5e\x83\x34\x62\x91\xdb\x89\x27\x6d\x6c\x62\x16\xf8\x19\xd1\xcc\xda\xdc\xcf\x27\x61\xe5\x7f\xbd\x23\xa2\x99\xc7\x8d\x7e\x7f\xe1\xa8\x50\xb3\x8f\x40\x3d\x5b\x4e\x75\x32\x6b\x92\x31\x23\x60\xa8\x06\x73\x4a\x05\x92\x71\x1b\xbf\x36\x63\x1d\x22\x08\x9e\x0f\x1a\x77\x73\x2a\x37\xf6\xf3\xa1\x9d\x5a\x52\xfc\x91\xcf\x3b\xc1\x20\xa8\x3f\x52\x88\x74\x44\xce\x68\x32\xc3\x65\xa5\x01\xcf\x30\x1a\x08\x4e\x36\xa3\x73\xb3\xf1\xee\x59\xdb\x77\x03\xa5\x95\xca\xd4\x8a\xb8\x64\xce\x53\x42\xb9\xed\x7c\x37\x01\x29\x6d\xc8\xe1\x78\x81\x9e\x4f\x96\x40\xe7\xcd\xeb\x74\x92\x0a\x29\xb4\x48\x44\x87\xde\x2b\xcb\xd1\xcf\x38\x1d\x02\xc1\x1a\x2d\xbd\xad\xf8\xfb\xd3\xcb\x01\xb9\x39\xb9\xc4\xa6\x19\xd7\x27\x37\x97\x4d\x09\x7b\xef\xe6\xe4\xb2\x43\x0f\xff\x5e\x6c\x1e\xce\xcc\xf6\xce\x2c\x73\xe7\x49\x24\xd0\x94\xc5\x38\xf2\xed\x47\x8c\x23\xdf\x3c\x62\x1c\x79\x8c\x23\x8f\x71\xe4\x0f\x8f\x18\x47\xee\xc6\xd3\x9b\x7a\x48\x8c\x23\x6f\x39\x5e\x97\x2f\x33\xc6\x91\xef\x34\x62\x1c\xf9\xea\x88\x71\xe4\x1b\x46\x8c\x23\xdf\x30\x62\x1c\x79\x8c\x23\x8f\x71\xe4\x31\x22\xe6\xd1\xb9\x9e\x67\x44\x0c\x89\x71\xe4\x6e\xc4\x38\xf2\x57\xe1\xf7\x27\x31\x8e\x7c\xab\x11\xe3\xc8\x63\x1c\x79\x9b\x11\xe3\xc8\x71\x44\xdb\x4b\x8c\x23\xf7\x23\xc6\x91\xdb\xf1\xdb\x91\x9a\x63\x1c\x79\x8c\x23\x8f\x71\xe4\x31\x8e\xfc\xc1\x55\xc4\x38\xf2\xd7\xa0\x4f\xfa\x86\x5a\xdd\x83\xa0\xaf\xfc\x4c\xdb\x87\xd5\x90\xb3\x35\xbf\xa2\x59\x45\x15\x66\x12\x59\x4f\x99\x49\xa0\xe9\x02\xa7\x4c\xd0\x2d\x53\x0b\x59\x2f\x30\x3a\x27\x63\x39\x6b\x17\x77\x4e\x56\x0e\xcd\x7b\x9c\x2b\x70\xe1\x18\xb0\xe4\xf4\x1e\x0f\x00\xcd\x45\x69\xfb\x77\x25\x22\x2f\x4a\xdd\x84\x29\x6e\x4f\x9b\xd6\x5b\x13\x36\x75\x1c\xf5\xc8\x76\x09\x1b\x56\xd3\x0e\x83\xce\x5c\x4f\xa8\xc0\xd0\xd4\x87\x9f\x5c\xf6\xa0\x4b\x14\x54\x6b\x90\xfc\x1d\xf9\xef\x83\xbf\x7d\xf5\xeb\xf0\xf0\xeb\x83\x83\x9f\xde\x0c\xff\xe3\xe7\xaf\x0e\xfe\x36\xc2\x7f\xfc\xeb\xe1\xd7\x87\xbf\xfa\x3f\xbe\x3a\x3c\x3c\x38\xf8\xe9\xbb\x0f\xdf\xde\x5c\x9e\xfd\xcc\x0e\x7f\xfd\x89\x97\xf9\xad\xfd\xeb\xd7\x83\x9f\xe0\xec\xe7\x2d\x27\x39\x3c\xfc\xfa\xcb\xd6\x4b\xee\x2c\xf0\xf6\x27\xee\xf6\x24\xec\x7e\x12\x51\xd7\xf9\x7e\x7b\x3a\x8b\x57\x6e\xb6\xe5\xd3\xe8\xd8\xd1\x43\xa7\xd1\x6b\xdc\x28\xc4\x55\xf3\x30\x45\x44\xce\xb4\x76\x54\x94\x86\x51\x5f\x4c\x37\x54\x4e\x47\x07\xb0\xdb\x21\xd5\xb6\x9d\x60\x15\x31\x15\x44\xec\x0a\x2f\xd7\xb9\x36\x8d\x95\x35\x02\xcf\xf3\x30\x85\x09\xe3\xe0\xbc\x5c\x91\x36\x3c\x3e\x22\x6d\x78\x8d\xb4\x41\x41\x52\x4a\xa6\x17\x27\x82\x6b\xb8\x6f\x65\x3f\xd9\x64\x40\xba\x6e\x4e\x4d\xec\x89\xb3\x94\xc2\xbf\x96\x88\xc2\x06\x4a\x6e\x4c\xcd\xab\x82\x6e\x65\xc9\x51\xa5\xb4\x39\x14\xa0\xad\xbe\x87\x9a\x0e\x46\x41\x2e\xbf\xce\x6b\x70\x76\xea\x7f\x94\x6c\x4e\x33\xa3\xdf\xd6\x4f\x5c\xa2\xce\x12\x3e\xd4\xca\x88\xf5\xc4\x32\x16\x8a\x37\x97\x92\xcd\x59\x06\x53\x38\x53\x09\xcd\x90\x2a\xf5\x43\xe9\x8f\x37\xcc\x8e\x5b\x24\x45\xa6\xc8\xdd\x0c\xb0\x8d\x2a\xf5\xea\x39\x66\x2a\x4c\x29\xe3\x24\x37\x44\xb5\xf0\x0f\x2b\xab\xe7\x1b\xe2\x6d\xa4\x5e\xae\x6b\x7d\x1e\xd5\xd7\xb1\x10\x99\x0b\xeb\xcd\x16\xf5\xfc\xae\xad\x2d\x17\xbf\x70\xb8\xfb\xc5\xcc\xa6\xc8\x24\xa3\xd3\x4a\x8d\x57\xa0\x57\x2c\x71\xf5\xd4\x1b\x3f\x00\x63\x66\x4b\x20\x34\xbb\xa3\x0b\x55\x1b\x35\xc2\x86\xbf\xef\xc8\xdb\x43\x44\x3c\xaa\x48\x35\x47\x4a\x7e\x7f\x88\x7e\xbe\x93\xe3\xcb\x5f\xae\xff\x7a\xfd\xcb\xf1\xe9\x87\xf3\x8b\x6e\x74\xde\x7c\x3b\x50\xde\x6a\x8e\x84\x16\x74\xcc\x32\xd6\x85\xbc\xaf\x44\x82\x84\x93\x22\x03\x4d\xd3\xa3\x54\x8a\xc2\xc2\xc9\xdb\x8f\x42\x1d\xe7\x74\xc9\x2c\xec\x78\xb6\xdd\x9e\x49\x73\xc2\xa9\xa4\x5c\xd7\x86\x94\x1a\xe4\xb2\xe4\x46\xe9\x7d\xe1\x41\xf3\x34\xed\x2f\x60\xfe\x38\x4d\x21\x6d\x40\xef\xd5\x05\xe8\x9d\xf8\x8f\x5b\xd4\xb9\xb6\xe4\xf2\xe3\xf5\xf9\xff\x5e\x42\xc3\x45\xd1\x2d\x1e\xa9\x9f\xfc\x1e\xd9\xbe\x03\x39\x59\x35\x26\xe4\x62\x1e\xf7\xf7\xb9\xec\x6f\xc5\xab\xfa\xf1\x82\x5f\x95\x3c\x64\x27\x3c\x98\x9f\xe4\x22\x85\x11\xb9\xac\x2c\xe8\xcd\xab\x61\x0d\x01\x09\xc4\xdc\xc2\x35\xc3\x56\xe7\x81\x28\xa3\x85\x4d\x74\x69\x64\x98\x86\x74\x78\x42\x33\xd5\x91\x98\x76\xe1\x4c\x86\x09\x7f\x30\xaa\x60\x2f\xd0\xac\x66\x23\x29\x70\xa1\x9d\x24\x69\x56\x89\x49\xb7\x52\x24\xc4\xea\x9d\x41\xc8\x52\x83\xbb\xb8\x06\xf8\x9e\x31\x31\xe5\x61\x75\x59\xcd\x6c\x2d\xb0\xa5\x02\xb5\x9e\x31\xd5\x9a\xa8\x99\x5d\x02\x4d\x31\x5f\xac\xa0\x7a\x66\x23\x0e\x72\xaa\x6e\x21\xb5\x3f\x38\xb9\xa6\x32\xc1\xdb\x66\xf8\xee\x55\x37\x66\xdd\xde\xde\x8e\xf2\x8c\x8d\x83\x40\x3b\x3d\xb4\x8e\x4e\xef\x7c\x04\xcc\x37\x7d\xe4\xd9\xe2\x4a\x08\xfd\x4d\x95\x27\xd5\xcb\x06\xfe\xe8\x24\x45\x74\xb3\x34\x43\xa6\x30\x40\x20\x1d\x22\x30\x11\xa5\xc3\x14\xad\xd3\x7a\xc3\x9e\x18\xa1\x65\xc9\x8f\xd5\xb7\x52\x94\xad\x39\xc0\x8a\xa0\xf5\xed\xf9\x29\x9e\xe3\xd2\x79\xc0\xb8\x96\x8b\x42\x30\x6b\x3e\xd9\x20\xd3\x7e\xef\x7c\x78\x21\x46\xd6\xee\x16\xf2\x81\x2e\x08\xcd\x94\xf0\xc2\x31\xe3\xeb\x54\x1d\xe2\xf4\x28\x73\x79\x2c\xf4\x6c\x45\x81\x32\xe8\xbc\xfa\xdc\x20\x70\x88\xd5\x75\x53\x18\x5f\x79\x5c\xd3\x5b\x50\xa4\x90\x90\x40\x0a\x3c\xe9\xb8\x6b\x4f\xed\x06\xc2\x9d\xbf\x10\xdc\x1c\x8b\x5e\xf6\xfe\xbc\xf2\xff\xa1\x19\xab\xb9\xd3\xe8\x49\x74\x7a\x07\x45\x7f\x22\x1e\x8a\x52\x81\xb4\xce\x4f\x59\x82\xdd\x88\xef\xca\x31\x64\xa0\xad\x32\x84\xf5\x03\xa8\xb6\x2a\x2f\xcb\xe9\x14\x08\xd5\x15\xa2\x68\x41\x80\x2b\x43\x6e\xac\xe1\x4c\x93\x54\x40\x9d\xdc\x48\x15\xf9\xfe\xfc\x94\xbc\x21\x07\xe6\x5d\x87\xb8\xfd\x13\xca\x32\x74\x35\x6a\x2a\x97\xd7\xc8\x26\x7e\x0a\x5c\x12\xe2\x1e\x11\xd2\x1e\xd1\x01\xe1\x82\xa8\x32\x99\xf9\x35\x19\x8d\xcb\x2b\x6c\x2e\xd6\x0e\x4d\xf2\xaf\x10\x55\x3b\x13\x98\xef\x15\xc8\xde\xe8\xcb\xf7\x2d\xe8\x4b\x28\x42\x18\x9c\x6b\x42\xcf\x22\x56\x0e\x9a\xa6\x54\x53\x47\x77\xea\x8c\xe8\xd7\xb8\xa5\x4f\x4d\x7d\x14\xbc\x67\xbc\xbc\xb7\xb6\xb5\xfe\x94\xfc\xeb\x33\x9c\x16\x51\x00\x81\x86\x9b\x46\x8b\x22\x63\xb5\xe7\x31\x88\x6e\x3a\x6f\x6c\xf5\x60\x83\x88\x84\xc7\xdc\x3b\x30\x0d\x67\xa7\x3c\x15\xf9\xca\xcb\xd0\x5b\x4a\x93\x59\xf8\x82\x57\x89\x3c\x4f\x6e\x8e\xc8\x60\x0e\x1d\x6a\x73\x2c\x21\xce\x7b\x33\x9b\x91\xc5\xfc\x86\xe2\xf4\x24\xa3\x63\xc8\x2c\x67\xb1\x08\xa4\x56\x11\xe8\xa9\x23\x04\xa5\xc8\xfa\xcb\x8f\xb8\x12\x19\xd8\x90\x1b\x0f\x08\x33\xfd\x8b\x80\x03\x4e\xd2\x17\x1c\x50\x91\x69\xc0\x01\x55\xb2\x97\x00\x87\xb2\x03\xa3\x25\xcb\x70\x30\x5c\xbb\x09\x07\x64\x9d\xcf\x1d\x0e\x0a\x92\x44\xe4\xc5\xa5\x14\x46\xe5\xea\x8d\xb5\xb8\x69\x6b\xff\x8e\xd5\xc9\xd1\xe0\x1b\x6a\x7f\xce\x9b\xd3\xbc\x99\xca\x20\xd8\x8e\x6a\x4b\xe3\x7d\xc4\xdd\xff\x0a\x58\x0e\x92\x9e\x65\x3e\xe4\x67\x69\x38\x80\xcc\x93\xee\xc2\x0b\x4f\xf5\xef\x60\x25\xeb\x85\x99\x88\x84\x66\x58\x3a\xad\x1b\xc6\x90\x65\xac\x59\x9e\x38\x88\x90\x44\xd7\x12\xfe\xe6\xbd\xf6\x58\x45\x0b\x7f\x71\xb6\x2f\x2e\x52\x08\x9c\x85\x36\xb4\xf3\xc6\x46\xd2\xe1\x7d\x3e\x38\xd3\x70\x75\xe7\xbc\x87\xb4\xf1\xb4\x16\xae\x3a\xcb\x87\xaa\x20\x9b\x59\x20\xf0\x94\xf1\x29\x5a\x74\x06\x44\x42\x66\xc3\x3a\xdd\x19\xbe\xb5\xea\xd7\x3e\x62\xb4\x9f\xd4\xa3\xb3\x7f\x35\x4a\x42\x4c\x70\x37\x33\x1a\x39\xbc\x7c\x33\xb1\xd4\x92\x29\xb2\xf7\xde\x03\xa0\x43\x05\xab\xe7\xc8\x20\xf6\xec\x17\x56\xbb\x69\x6d\x6c\xb7\x8c\xa7\x2e\x02\xb2\x01\x2c\xaf\x24\x3a\x29\x14\x63\x6b\x59\x1a\x92\x86\x77\xe4\x6f\x9c\x54\xc0\x22\xc3\xd6\xe8\x71\x65\x05\x56\x6f\x5e\x1a\x3e\x6c\xf2\xab\x5e\xb2\x3c\xcd\xf7\x1c\xf7\xde\xbc\x77\x68\xd4\xde\xd5\xfb\xfc\xb7\xec\x3d\xe5\xbe\xde\x31\x9e\x8a\x3b\xd5\xb7\x0e\xf1\xa3\x9d\xd6\x0b\xd4\x89\x41\x6b\xcd\xf8\x54\x85\x7a\x44\xb3\x4e\xee\x7a\x45\xc2\xef\xf0\x44\x0a\x9b\x86\xb7\x2a\xc0\x2f\x45\x6e\x47\x25\x60\x87\x31\xcd\x15\x3d\x91\xe6\x53\x34\xa3\xd9\x75\xd1\xbe\x6c\x1a\x59\x46\x83\x6f\x3f\x5c\x1f\x37\xa7\x36\xf4\xec\x6e\x06\xd2\xf2\x5e\x73\x9d\xd0\x34\x67\x4a\xa1\x19\x08\xc6\x33\x21\x6e\xc9\x81\x0f\xb4\x9a\x32\x3d\x2b\xc7\xa3\x44\xe4\x41\xcc\xd5\x50\xb1\xa9\x3a\x72\x48\x3b\x34\xab\x3f\x24\x8c\x67\x55\x04\x09\xaa\x91\x5c\x2b\x6f\xc6\xc0\x97\x24\xd5\x2a\x70\x6f\x5d\xdd\x45\xe7\x65\x5e\x5d\xa6\xad\xb4\xc8\x20\x7b\xfa\x62\x30\xab\xdb\x73\xd1\xb1\xae\xc5\x23\x5b\x84\xdf\xee\xd2\x46\xc2\x14\xa7\xb5\x70\xb4\xd2\xdb\x93\x03\xc9\x49\x07\x09\xa8\xfe\x2a\xe6\xfc\xa5\x9e\x93\xa4\x60\x33\x1b\x00\xa3\x4e\xe8\xc6\x30\x24\xb4\xca\xee\x63\x82\x9c\x7b\x74\x3f\x94\x68\xd1\xeb\x63\x53\x30\x8c\x3e\x90\x15\x33\x3a\xb4\x4a\xb2\x21\x49\x48\xc3\xbc\x0c\x30\x13\x5c\x48\x8b\xa2\x86\x0b\x0a\x8e\x28\x8d\xda\x82\x75\x04\xe1\x9e\x38\x1a\x1b\x2c\xf5\xa4\xf6\x0f\x86\x3e\x24\x4c\xb0\xb1\x09\xfa\xf5\x1a\xee\x98\x9e\x61\x11\xb9\xd9\x92\xc3\x09\x57\x22\x41\xa1\xf7\x80\x13\x90\x52\x48\x17\x08\xe3\xad\xb6\x38\x13\x92\x62\x8c\xa4\x31\x48\x42\xcd\x5f\xfb\x2a\x74\x51\xd6\xa5\x4c\x31\xb6\xcb\x60\x13\x4c\x26\x90\xa0\xa4\x14\x02\xd8\x92\xdd\x83\xba\xaa\x9e\x0f\x9d\xd7\xc2\x97\x42\xcd\xd9\xbd\x79\x4b\xf8\xd4\x52\x41\x75\x2e\xf8\x70\xfd\xe5\xc3\x11\x21\xe7\xbc\x8a\x7b\x1c\x98\x5d\x0c\xef\xf4\x21\x3f\xda\x7c\x62\x58\x47\x17\x3f\x20\xb4\x3b\x19\xf1\x4e\x96\x3d\x60\x7c\x17\x63\x30\x09\x0d\xc2\xbd\x92\x03\x34\x0c\xbb\x49\xcd\xd6\x7b\x26\xde\xc5\x50\x6c\x6e\xf9\x54\xc6\xe2\x97\xc1\xe9\x49\x57\x3a\xe7\xd2\xd5\x63\xed\xd7\xed\x46\xac\xfd\xba\x79\xc4\xda\xaf\xb1\xf6\x6b\xac\xfd\xfa\xf0\x88\xb5\x5f\xdd\x78\xfa\xf4\x4c\x12\x6b\xbf\xb6\x1c\xaf\xab\xfe\x48\xac\xfd\xba\xd3\x88\xb5\x5f\x57\x47\xac\xfd\xba\x61\xc4\xda\xaf\x1b\x46\xac\xfd\x1a\x6b\xbf\xc6\xda\xaf\xb1\x8a\xd5\xa3\x73\x3d\xcf\x2a\x56\x24\xd6\x7e\x75\x23\xd6\x7e\x7d\x15\xb5\x7a\x48\xac\xfd\xba\xd5\x88\xb5\x5f\x63\xed\xd7\x36\x23\xd6\x7e\xc5\x11\x6d\x2f\xb1\xf6\xab\x1f\xb1\xf6\xab\x1d\xbf\x1d\xa9\x39\xd6\x7e\x8d\xb5\x5f\x63\xed\xd7\x58\xfb\xf5\xc1\x55\xc4\xda\xaf\xaf\x41\x9f\x54\x3a\x65\xad\xca\x61\x6d\x53\xbd\xc0\x45\x86\x04\xf9\x8e\xe3\x72\x32\x01\x89\x94\x0b\xdf\xbc\x12\x85\x50\x55\x39\xaa\x68\x99\x8b\x33\xc0\xaa\x66\x12\x68\xea\xa2\xa0\x37\x3c\xee\x12\x2c\xb1\x6c\x55\x1d\xbe\x77\xf6\xf1\x9b\x7e\x4a\x25\x74\x0b\x5c\xc3\x35\x7f\xe4\x49\xf7\x00\xa6\x1a\xe0\xeb\xa2\xf2\x1d\xdc\x93\x4c\x28\x17\x76\x88\xc0\x4a\x66\x94\x73\xf0\xca\x23\xd3\x68\x94\x19\x03\x70\x22\x0a\xe0\x96\x7e\x53\xa2\x18\x9f\x66\x40\xa8\xd6\x34\x99\x8d\xcc\x9b\xb8\x07\x76\x1d\x22\xe8\x7e\x51\x5a\x02\xcd\x7d\xb0\x64\x4e\x99\x9d\x8a\xd0\x44\x0a\xa5\x48\x5e\x66\x9a\x15\xd5\x64\x44\x01\x46\x39\x5b\x46\x55\x01\x03\xc3\x4b\xea\xb8\xc2\x41\xfd\x36\xb7\x2c\x11\x56\x8a\x41\xd5\x75\x80\xa5\x2d\xf3\x42\x2f\x88\xf9\xe4\xcc\x95\xbb\x93\x4a\x93\x24\x63\xc8\xad\xf1\x8d\x36\xa1\x0c\xe7\x1b\x78\x5e\xcd\xdd\x4a\x95\x5b\x2a\x4f\x51\x6c\x2d\xb4\x22\x18\x86\x57\x4f\xe8\xa6\x4a\x99\x72\x62\xbe\x1a\x10\xea\xeb\xa0\x58\x40\xfb\x95\x22\xa8\x3d\x67\xb1\xb3\xbb\x9f\x82\xe9\x82\xe2\x69\x06\x37\xad\x35\xac\x46\x74\x8c\x3b\xf5\xc8\x39\x68\x84\xd8\xd6\x02\x05\x86\xbb\xac\x1c\x03\xdc\x00\x0e\x73\x83\x03\x90\x80\xe1\xaf\x74\x03\xd6\x7f\x76\xa4\xd7\x54\x4e\x41\x57\x41\xb9\x6d\x63\x35\x9b\x05\x22\x82\x2a\x87\xa1\x1e\x52\x43\x0c\x81\x73\x29\x52\x8c\xb8\x77\x55\x24\x0c\xce\xac\x29\xa3\x68\x17\xe8\x0a\xe0\xac\xbb\xc1\xcb\x45\x36\xd4\xa9\x7a\xa9\x2a\x68\x02\x8a\x1c\x9c\x5f\x9e\x0c\xc8\xe5\xf9\xa9\x8b\x67\x12\x93\x75\x69\x7c\x8e\x84\x59\x04\xdc\x54\xd0\x91\x29\xff\x8e\xbb\x19\xd5\xb8\x9d\xc1\x8b\x50\x12\x9d\x51\xe9\x02\x15\x7d\xe5\x6b\x72\x21\x34\xac\x2b\x94\xe1\xa9\x01\x8a\x5f\xce\x06\xe1\x30\xcd\x8a\x33\xed\x09\x60\x4b\xb5\x25\x90\x8f\x3e\x80\x52\x74\x0a\x97\x2d\x1d\x58\x9b\x94\x73\xf4\x61\xd5\x67\x14\xa9\x42\x66\xd3\xd7\xaa\x5f\xea\x88\xb7\xa6\x44\x4c\x72\xbb\xa6\x6a\xbf\xef\x24\xd3\x1a\xf0\x7c\x63\xf1\x24\xf4\x81\x2f\x27\xa8\xee\x2f\xc5\xcd\x7d\xf0\x93\xd4\x0f\x1b\xfe\xce\x53\x1b\xc5\x36\x06\x32\x96\x0c\x26\x64\xc2\x30\x34\x0e\x83\xd5\x06\xb6\x1c\x08\xb5\xc6\x25\xa5\x40\xe2\x7a\x9c\x5a\xe3\xd7\x35\x22\x3f\xba\x85\x69\x59\x72\x5b\x01\xdd\x49\xdc\x98\xc2\xc5\x26\x64\x8a\xc1\x6e\x4e\x71\xf8\xe3\x9b\xff\xf8\x13\x19\x2f\x8c\x74\x83\xa8\xad\x85\xa6\x59\xf5\x91\x19\xf0\xa9\x81\x95\xa5\xd4\xcd\x24\xa4\x0a\x02\x58\xa3\xdc\x2e\xfc\xed\xef\x6f\xc7\x4d\x71\xeb\x28\x85\xf9\x51\x00\xbf\x61\x26\xa6\x23\x72\x42\xb9\xc1\x75\xa3\x46\x14\x29\x5a\xf2\xdb\xd7\x0d\xed\x0f\xcd\x44\xc6\x92\x45\x77\xb2\xe3\x74\x13\x32\x13\x77\x56\xed\x5b\x83\x3d\x75\x38\x6c\x21\x8a\x32\xb3\xce\x8c\x6f\xaa\xf4\xbd\x52\xc1\x6a\x8e\xce\xda\x73\x81\xe6\x77\x37\xc5\xd2\xd1\x76\x31\x8e\xfe\x95\xc2\xc5\x7e\x3b\x03\x71\x55\x9e\x06\x75\xe2\x6f\x68\x96\x8d\x69\x72\x7b\x23\xde\x8b\xa9\xfa\xc8\xcf\xa4\x14\xb2\xb9\x96\x8c\x1a\xc6\x39\x2b\xf9\xad\xad\x4b\x5d\xa5\x10\x8b\xa9\x91\xb2\x8b\x52\xfb\x4a\xa3\xeb\x3e\xd8\x26\xa4\x7a\x7e\xec\x35\xe2\x7a\x16\xb8\x67\xb5\xda\xeb\x52\x29\x2c\x46\x86\xf3\xab\x10\xd9\x7e\xff\xe6\x8f\xff\x6e\x51\x97\x08\x49\xfe\xfd\x0d\xc6\xc1\xaa\x81\x3d\xc4\x48\x17\x8d\xcc\x90\xd3\x2c\x33\xe4\x35\x44\x4a\x03\xe8\x75\x48\xf8\xd9\x71\x50\x77\x47\xb7\xad\xa5\xea\x9b\x9b\xbf\x22\x4b\x60\x5a\x41\x36\x19\xd8\xac\x81\x4a\xc3\xdd\x47\x19\x61\xdf\x51\x1f\x4c\xdd\x78\x06\xb2\xf0\x5c\x64\x65\x0e\xa7\x30\x67\x7d\x34\x9e\x68\xcc\xe6\xad\x3e\x19\x53\x98\xa0\x31\xce\x44\x72\x4b\x52\x77\x31\x88\x68\x5a\x2e\xb1\xda\x1e\x0a\x6d\x63\xbb\x3a\xc4\x74\x6d\xfc\xfe\x46\x34\x57\x4e\x8b\x82\xf1\xa9\x4d\x4e\x92\xf4\xae\x01\x0c\x3c\x93\x98\x0f\xdc\xb1\xde\x42\x67\x8f\x43\x57\x7f\xc3\xd0\x7d\x91\xa1\x9b\xad\xa7\x68\x1d\xcd\xd4\xdd\x5d\x51\xaf\xbe\xbd\x8d\xba\x81\x10\xf5\x84\xfe\x34\x14\xf8\x6f\x1b\xa9\xbf\x22\x2e\x57\xe2\x63\x85\x18\x56\x00\x30\xe8\x83\x24\xb9\xbd\xed\xbd\x07\x43\x77\xb7\x50\xb6\x06\x5c\x78\xe5\x60\xc8\xa9\x76\x02\xa1\xd7\x20\x28\x29\x40\x2a\xa6\x0c\x5f\xfe\x01\x0f\xd4\x49\x46\x59\x1e\x58\x83\x9f\x06\x08\xf6\x70\x63\x65\xcc\xee\x94\xf2\x52\xa4\x6e\x42\x24\x85\xb6\x2a\xe8\x1a\xb1\xb6\x29\xd5\xf6\xc8\x50\x9f\x9a\x54\xfe\x50\x43\xb3\x49\x29\xcd\x2f\x15\xa9\xb4\x77\xbd\x26\x02\x89\xdf\xf7\x52\xe9\x63\xb5\xf8\x9e\xc8\x00\x12\x46\xb7\xb9\x4d\x4a\xd8\x50\x1e\xed\x41\x09\x44\x7a\xa7\x07\x8e\x88\x8d\xae\x30\x67\xc2\x3d\x4a\xf6\xdf\xed\x3f\x29\x91\xb4\x20\x92\xa2\xa0\xd3\x4e\x3d\x0e\x96\x20\xb5\x3c\x6d\x98\x08\x6e\xd4\x20\xbc\x5e\x95\x25\xc2\xbb\x20\xad\x0b\x55\x60\x19\x12\xeb\x28\xf7\x00\x76\x0a\x02\xf6\xa0\x21\x77\x74\x41\xa8\x14\x25\x4f\x9d\xa9\xb1\xb2\xf5\x7e\x58\x7a\xf1\x85\xe0\xe0\x7d\x28\xcb\x79\xe4\xe8\xdc\x61\x9c\xbc\x1d\xbd\x7d\xf3\x5a\x38\x15\x7e\xe1\x12\xa7\xba\xa8\x38\x95\xa5\x4f\x4f\xfa\xad\xbe\x1a\x72\x4f\xdf\xfb\xc1\x99\x58\xea\x62\xc7\xcc\x17\x73\xc5\x9f\xee\x24\xd3\x10\x74\x2e\x3a\x40\xc5\xc5\xe8\x87\x41\xd6\xf4\x61\x8f\x35\xbe\xfb\x49\x53\x57\xe5\xf8\x13\xd2\x2d\x47\xa0\xf0\xb8\xad\xb3\x70\xa9\x07\x48\x58\x08\xa8\xbd\x3d\x72\x60\xef\xdc\xb7\x49\xa2\x87\x4f\x8a\x5a\x0e\x68\x67\xf7\x45\x87\x1a\x74\x0d\xc0\x9d\xdd\x17\x14\x6d\x70\x45\x8f\x10\xfc\x2f\x98\xd1\x39\x60\x72\x2c\xcb\xa8\xcc\xd0\xfd\x7c\x6d\xd7\x4e\xc6\xa5\x26\xc0\xe7\x4c\x0a\x8e\xb1\x5e\x73\x2a\x19\x56\xad\x90\x30\x01\x09\xdc\xe8\xa2\x5f\x1e\xfc\x70\x7c\x85\xb1\x2d\x87\xb6\x96\xbd\x5f\x65\xa9\x7c\x79\x89\x70\x25\xc1\x74\x8f\x6e\x9f\x5f\x87\x81\x21\xd2\x5c\xbf\x2e\xf3\x9e\xbc\xd4\xa5\x2d\x98\x7f\x9f\x64\xa5\x62\xf3\xa7\xa2\x24\x2e\x6b\xf9\x94\xb5\xda\xe7\xa5\x0c\xea\x1a\x50\x2b\xc9\xd0\xb5\x0d\xfe\x91\x0a\xad\xfb\xaa\xaa\x69\x15\x86\x43\x38\xd3\x13\xc9\xd9\x74\xa6\x5d\x58\xa6\x2f\x69\xb6\x22\x42\x60\x5d\x87\xa7\x35\x42\x19\xb6\x7b\x9c\x31\xaa\x76\x15\xb9\x56\x32\x0e\xdd\x2c\x18\x44\xc1\x5d\x21\x2a\x9a\x55\xb6\x15\xf3\x22\x6b\x70\x3c\xbf\x74\xde\x29\x0f\x37\xc6\xff\xc7\x06\xad\x54\xda\x85\x0d\x42\xb1\x8f\x58\xab\xe1\x24\xac\x19\xe0\x83\x35\x90\xf8\x63\x95\x15\xb4\x6a\x71\xc1\x87\xb3\xa0\x20\x49\x21\xd2\x1d\xb3\xf1\xda\x2a\x1e\xad\x54\x8e\xf5\x10\x24\x33\x91\xa5\xbe\x2f\xa7\x35\xc9\x8c\x41\xdf\x01\x70\x72\x7e\x89\xf0\x33\x9f\x88\xde\x9e\x0d\x50\xb4\xde\x01\x2c\x3d\x12\x68\xa4\x0d\x78\xee\x8a\x60\x1d\xb4\x92\x2e\x22\x7d\xf5\xa5\x9d\xcf\xfc\x5f\x2a\x98\x79\x8f\x18\x1d\x8b\x39\x20\x48\xd3\x54\x82\xea\x50\xba\xe3\x09\xf4\xd4\x4e\xa4\x94\xb5\xea\xbb\xd0\xf4\x6f\x54\x60\xf3\x16\x22\x14\xdf\xf1\xa8\x22\xe2\x7d\x66\x0a\x76\x7e\x79\xd2\x81\x7a\xed\x7f\xef\xdc\x1b\x66\xaa\xfd\x7d\x45\x58\x91\xd4\xfe\xd4\x11\xa9\xbd\x86\x41\x46\x83\x95\x18\x77\x73\x59\xb5\x15\x13\x03\xa2\xd6\x91\x48\x13\x6e\xa7\x31\x64\xc5\x65\x33\x57\x5e\x62\xa6\xac\x9b\xb8\x01\x0d\xe5\x9f\x08\x01\xe2\x03\x11\x2c\x91\x77\x61\x19\x83\x2a\xc0\x77\x89\x30\xa1\x05\xdd\x87\xf6\x05\x54\x7c\x05\x98\x9f\x0d\x96\x97\xe7\xa7\x7d\xa2\x4b\xc1\xd2\x67\x87\x2e\xbb\xeb\x97\xcd\xdc\xb5\x66\xc9\x07\x37\xa1\x3f\xec\x97\x22\xdd\x20\x26\xd5\x8c\x06\xef\x0f\xbb\x0b\x6a\x41\x28\xb1\x66\xc2\xa5\xbe\xb1\x2d\x80\xb2\x33\x95\x40\x51\xeb\xb2\xcc\xb2\x6b\x48\x24\xec\x6a\x1e\x6d\xee\xff\xf9\xd2\x5c\x9b\x44\x9e\x40\x7e\xc7\x3a\x02\xee\x66\x5e\x17\x78\xab\xb0\x26\xcc\x12\x2c\xca\x0c\xe3\x4c\x29\x5f\x78\x80\xe3\xea\x55\xe0\x8b\x62\xca\xc7\xac\xd8\x10\xa9\xc6\x2e\x28\xa8\x5e\x56\x75\x0b\xa1\x4a\x59\x8f\x29\xe3\x29\x9b\xb3\xb4\xa4\x19\xbe\x08\xa5\xd0\xb0\xa7\x6f\xc5\x21\x73\x5f\xb0\x90\x7c\x23\x24\x81\x7b\x6a\x6e\x1b\x54\x42\x2c\x55\x88\x0e\xa9\x48\x6e\x41\x0e\xac\x28\x76\x8a\x7f\x9c\xa0\xc4\x6b\x4b\xf2\xfa\x75\x18\x5d\xc2\x95\xe9\x6b\xd3\x26\xd8\xf7\x01\xb6\x70\xf8\xc2\x7e\xee\x82\xf1\xe9\x10\x7f\x31\x1f\xe2\xde\x34\x14\x7c\x48\x87\x06\x0d\x5f\x88\xe0\x87\x35\x78\x3f\xa2\x64\x75\xe5\xf1\xc5\xab\x08\x46\x91\x13\xe5\x74\x86\xc0\x92\x39\xf5\x65\xb1\x32\xd0\x58\xf1\xc8\xf9\x75\x6d\x69\x0a\xf7\x6c\xea\xc4\xb4\xb0\x02\x54\x13\xd7\x5e\x88\xf0\xd7\xd6\x42\xb6\x14\x29\x1c\x90\x2d\x07\x23\xbd\x33\x06\x8a\x39\xc8\x39\x83\xbb\x23\xc7\x3a\x87\x77\x4c\xcf\x86\x16\x22\xea\x08\x01\x7b\xf4\x85\x15\x2f\x6d\xe2\xd6\x71\x9a\x3a\xb3\x65\xa9\x60\x52\x66\xae\x5f\xee\x88\xd0\x82\xfd\x00\x52\x61\x5d\xc5\x5b\xc6\xd3\x01\x29\x59\xfa\xf5\x67\x0c\x7c\x61\x9c\xd5\x21\x76\x9d\xa8\xe0\x7b\x47\xe5\x5c\xbe\x30\xfb\x67\xdd\xd2\xd6\x05\x07\x8d\x21\x13\x7c\x1a\x64\x3b\xa3\x78\x71\xce\x99\x5e\x69\xcd\x67\xab\x96\xa1\x8a\x2c\x64\x8a\x81\x8c\x4c\xc8\x86\x3d\xd8\xcc\x87\xb5\x9c\x82\x70\x48\x43\x22\x59\x63\x3e\x0c\x67\x51\x15\x33\x22\x36\x20\xc2\x27\x46\xfa\x0a\x99\xbe\x46\x94\x2d\x59\x36\xa3\x3c\xc5\x3f\x93\x44\xc8\xd4\xad\x97\xe9\x2a\xf6\xd2\x06\x05\xd9\x48\x14\x64\x6b\xd8\x5d\x9d\x2f\xbf\x19\x35\x50\x99\x37\x02\xf5\xbc\xd8\x53\x72\xf6\x8f\x12\x08\xcd\x85\x21\xec\xcb\x85\x9c\x97\x20\x92\xd3\x05\xf2\x56\x5c\xea\xfb\x2a\xd3\xcf\x26\x13\xaa\x01\xb9\x02\x9a\xb2\x20\x21\x7a\x40\xde\x37\x33\xa4\x07\x66\x2d\xd7\x36\x75\xd3\xfd\x64\x57\xef\x9b\xab\x5f\x59\x27\x51\xee\xe3\x8a\x56\x3f\xc6\xec\x8a\xa6\xb7\xc0\xad\x52\x6e\x40\x83\x7e\xb0\x52\xe2\x1e\x24\x33\x48\x4b\xe4\x52\xe3\x05\x99\x30\x5b\xdd\x1d\x45\x05\x36\x9d\x81\xd2\x5e\xb8\x3c\xc2\x58\x9d\xba\x4d\x8d\x5f\x00\xa2\x6f\x10\x69\x5b\x9b\xb1\x72\x8a\xa5\x4b\x85\xeb\x4c\xef\x92\x49\xac\xce\xa6\xca\xdc\x9f\xe5\x65\x48\xab\x91\xef\x69\x6f\x56\x1e\x54\xcd\x66\x4b\xc0\x45\x27\x9d\xb3\xc3\x91\x09\x55\x33\xac\x29\xbf\xbc\x05\x89\x35\xc9\x24\xa5\x34\x04\xc3\x96\x99\xa5\xd8\x44\x16\x3b\x16\x62\xbf\xd1\x75\x86\x9b\x8e\xc9\x03\x66\xb1\xed\xfb\xde\x3f\x1d\x13\x3b\xae\x82\xc1\x0d\xe0\x93\x25\x4a\x60\x77\xd2\x30\x2c\x5f\x5b\xca\xb7\x21\xc7\xcd\x30\x54\xe1\xf3\xb1\xa4\xf6\xfe\xd1\x56\x7e\xcd\x2e\x1c\x90\xca\x69\x77\xcb\xc7\xfe\xb1\x9c\x96\xf6\xa0\x3b\x2a\x5c\x17\xa5\x75\xad\x3c\x51\x6a\xb3\x32\xa6\x51\x67\x4e\x3e\x9c\x86\x29\x48\x61\x6e\x85\x4f\xe0\x1a\x91\x1f\xba\x1a\xa9\x97\xad\xd4\x86\x9a\xd7\xa6\xef\xa4\x3a\x59\x86\x62\x64\x73\xaf\x5f\x54\x6f\xf3\x72\x28\xe3\x45\xa9\x1d\x1b\xac\x35\x4e\x9e\xcc\x28\x9f\xa2\x92\x29\x4a\x33\xdf\x97\x5f\xe2\x8a\x24\xa4\x65\xe2\xaa\xe9\x7b\x94\xfd\xd2\x9b\x6c\x5d\x3d\x2f\xa4\x55\x2a\xa1\x85\x5f\x73\xf8\x59\x6a\xc1\x35\xbd\x7f\x47\xd8\x08\x46\x64\xef\xcb\xe0\xd2\x9e\x7d\x7b\x21\x85\x79\x85\x4b\x7d\xc0\x55\x65\x4c\x63\xf8\xf6\x5e\x78\xf7\x88\x9c\x99\x77\xa0\x1b\xab\x02\x60\x10\x9d\x3f\xae\xc1\x37\x20\x12\xa6\x54\xa6\x99\x33\xb7\xdc\x05\x29\x1d\x15\xc0\xe0\x9e\x29\xad\x2c\x0f\xd2\x1d\x28\x93\xa6\xea\xd6\xd0\x21\x73\xb2\x86\x29\xd5\x74\x18\x1c\xe9\x23\xab\xb7\x0d\x5d\xb9\xcf\x21\x75\xa8\x55\x93\xac\xa3\x2f\x5c\x66\xe4\x90\x56\x77\x31\x23\x91\x63\xe1\xcd\xf6\x72\xce\x4b\xb3\xb1\x75\xa8\xfa\xda\x3c\xbd\x67\x75\x05\x69\x84\x01\x46\xf1\xd7\xf2\x52\x45\x44\x5d\x61\xd3\x75\xe7\xf9\xec\xe2\xe6\xea\xaf\x97\x1f\xcf\x2f\x6e\xe2\xb1\x8e\xc7\x3a\x1e\xeb\x0e\xc7\x1a\xf8\xbc\xf3\x91\xf6\x7a\xd3\x3a\x97\xef\x72\xc1\xc9\x20\x35\xe8\x15\x05\xd6\x9d\xf1\xf9\x0f\x54\xd6\x6d\xec\x9d\xbf\x6a\x8d\x07\xdc\xf7\xb9\x47\x12\x77\xf2\xe2\x23\xeb\x9e\x30\x2e\xae\xc7\x78\xa3\xd0\xa4\xb2\x6e\xd7\xc2\xde\x5f\x27\xbf\x9c\x9f\x9e\x5d\xdc\x9c\x7f\x73\x7e\x76\xf5\xa4\x81\x22\x1d\x0b\x3e\x36\x99\x72\x4b\x2e\x59\x48\x98\x33\x51\xaa\x6c\x51\xf5\xd8\x5a\x4f\x04\x56\x63\x0d\x79\x8a\xb6\x0e\x05\x12\xa3\xae\xd7\x3e\x16\x99\x6d\xbf\xcc\xb6\x19\x37\xd3\xa1\x3c\x4f\x5f\xe8\xfb\x8d\x14\x79\x4f\x28\x7c\x6d\xad\x30\xde\x19\xbe\x0e\x9f\xf6\x5d\x25\x8f\x06\xeb\x71\xc2\x63\x5d\x36\xc4\x08\xa3\x79\xa1\x3b\x14\xc3\xef\xa5\xc4\x6f\x3f\xd5\x70\x6d\xac\xce\x07\x5a\x7c\x07\x8b\x2b\xe8\x58\x05\xa8\x09\x6f\xc8\x20\x31\x8c\x8e\xdc\xc2\xc2\x06\x66\x9e\xf8\x97\x75\xa9\x56\xf4\xff\xb1\xf7\x3f\xdc\x8d\xdb\x48\xde\x28\xfc\x55\x70\x3c\x7b\x5e\xdb\x89\x24\x77\x27\x99\x99\x6c\x3f\x79\x93\xe3\xd8\xee\x8c\x9f\x74\xbb\xbd\xb6\x3b\xb9\x73\xd3\xd9\x19\x88\x84\x24\x8c\x49\x80\x01\x40\xb9\x35\x9b\xfd\xee\xf7\xa0\x0a\x00\x41\x49\xb6\x65\x92\x6e\xc9\x8e\x38\xe7\x4c\xc7\x12\x05\x82\x85\x42\xa1\xfe\xfe\x6a\x23\x11\x92\xaf\x59\x1b\xf4\xea\x2e\xa1\x8d\xaf\x59\x8b\xa4\x53\x7f\x2d\x80\xfc\xda\x25\x04\x3d\xcd\xae\x69\xbb\xd5\x23\xdd\xc2\x1a\x3f\x02\x94\xf3\xf3\x8d\xa0\xd4\xaf\x0e\x57\xc1\x07\x82\x3b\x5e\x09\x8c\xc9\xcf\x6a\x67\x57\x10\x22\x04\xab\x3a\x81\x37\x7d\xd0\xc1\x29\x19\x1d\x91\xa6\x6d\x13\x2e\x82\x4b\xd8\xad\x5c\xdd\xad\x04\x2b\xe6\xf8\x07\x9c\xb9\xf4\x95\x87\x32\xd0\xa1\x73\xd6\xc0\x72\x58\xaf\xfe\x27\x84\x44\x7b\xe4\x9f\xe1\x43\xe8\x35\xad\x7f\xd9\xdd\xfd\xe6\xc7\x93\xbf\x7f\xbb\xbb\xfb\xeb\x3f\xe3\x6f\xe1\x28\xc4\x40\x79\xfd\x16\xc0\x75\x12\x32\x65\x67\xf0\x0c\xf8\xd3\xa9\x6b\x87\x18\x3c\x71\x5f\x40\x45\xf6\x00\xb3\x96\xc2\x9f\x85\x4c\xe7\xff\xd2\xad\x00\x01\x37\xf2\x60\x80\x25\x6a\x51\x59\x84\x57\x77\xc7\x43\x25\x4b\x3a\xde\xaa\x6e\x54\xcf\x8d\x00\x2c\x8d\x90\x64\xaf\x3d\x09\xa0\xbb\xa7\x87\x7e\x10\x50\x2f\x6f\x35\xd3\x3a\x3a\xe4\xce\xf4\x65\xab\x3e\xc6\x78\x75\x28\xda\xc2\x0a\x76\x4c\x30\xa0\x88\x6f\x18\x06\x1b\x39\x1c\xb0\x21\x61\x26\x74\x9f\x3b\x3c\x3f\x25\x53\xa4\xf0\xc6\x10\xc7\x07\x36\x5f\x3f\xaa\x8c\x0b\xe1\xd3\xf9\xba\xdc\x57\x98\x80\xe3\xbf\x77\x18\x09\x3a\x20\xd8\x31\x6b\xd8\xec\xe1\x87\x83\xa4\x28\x7b\xee\x86\x41\xce\x72\xa9\x66\xe1\xcf\x00\x36\xd3\xd7\x46\x2a\x3a\x86\x9a\x1a\xfc\x39\xfe\x2c\xfc\x85\x3f\xac\x3d\x60\xf1\xd7\x68\x0a\x57\x51\xd4\x00\x70\xfb\xfc\x64\x9b\x27\xfd\x86\x88\xb6\xa4\x2d\x8c\x52\xfd\xaa\x33\x64\xf0\xc4\xa1\xc2\x19\xa8\x08\xf6\xa4\xab\x19\xee\x55\xf9\x70\xe0\x0d\x10\x53\x6b\x59\x36\x06\xc0\xab\xae\x0e\xa5\x59\xca\xa7\x5c\xcb\x16\x95\x43\x61\xa0\xdb\x73\x27\x1d\x6c\x09\xe6\x6f\x05\xb7\xd9\xc7\x02\x30\xbf\xc2\x7e\x9d\x13\xfb\x2f\xdb\x34\x39\xc7\xab\xa0\xc6\x30\x25\x5e\x91\xff\xde\xfb\xf0\xf9\xef\xfd\xfd\xef\xf6\xf6\x7e\x79\xd1\xff\xcf\x5f\x3f\xdf\xfb\x30\x80\xff\xf8\x6c\xff\xbb\xfd\xdf\xfd\x1f\x9f\xef\xef\xef\xed\xfd\xf2\xe3\xdb\x1f\xae\xce\x4f\x7e\xe5\xfb\xbf\xff\x22\xca\xfc\x1a\xff\xfa\x7d\xef\x17\x76\xf2\xeb\x8a\x83\xec\xef\x7f\xf7\x1f\xad\xa7\xde\x01\x04\x2f\x5e\x5d\x02\xf1\xd6\x47\xec\x84\xfd\x1e\xb1\x95\x05\x5e\x9e\xbd\xba\xde\xff\x17\x5e\x6a\x46\xf9\x3c\xfe\xb8\xde\x98\x0d\x8e\x09\xa1\x9f\xc2\x93\x83\x4f\xaa\xd7\xda\x04\xd3\xe2\xb9\x9d\x73\x7f\x04\xe7\x8e\x57\xdb\x71\x5d\x2b\x4d\x74\xa4\x64\xee\x2b\xfa\x21\xbc\x81\xb5\x67\xee\xbe\x6b\xd6\xaa\x25\x28\x5e\x5b\x67\xd0\xd6\x19\x74\xcb\x75\xaf\x33\x08\xcb\x11\x36\xd7\x13\xc4\xc4\xb4\x69\x08\x63\x69\x04\xdd\xdb\x3a\x31\xfc\xdd\x6a\x01\xb5\x81\xdf\xea\x3a\x44\xe2\xaa\x4c\x1a\x3c\xd0\xf2\xe5\x31\x4c\x68\xe0\xcf\x05\x6e\x7c\x18\x20\x80\x7e\x32\xd7\xbb\xc3\xd5\x5f\x4e\xed\x14\x02\xd2\x7b\x0d\xbb\x13\xb2\x8a\xb9\x18\x3b\x24\x0b\x3c\x4a\x5c\xf4\x89\x8b\x0a\x0d\x37\x28\x87\x15\x84\x3a\xd5\x5a\x26\xd0\xf8\x08\x71\xf2\x02\x2a\x9f\x9b\x36\xcc\xc6\xd0\x6b\x16\xb7\x62\x47\x78\xf5\xea\x5d\x87\x33\x40\x7d\x15\x53\x0f\x31\x9f\x96\x98\x0c\x82\xe2\x6f\xf9\x18\xcf\x2b\x01\xc1\x32\xa2\x0b\x82\x45\x79\x08\x20\xf5\x83\x85\x4d\x21\x15\x43\x8e\x2a\x2f\x6b\xb3\x66\x96\xad\x4f\xf1\xf6\x67\x66\x88\x6c\xb5\x52\x86\x16\x0e\xcb\xca\xfd\x5c\x3f\x24\x9f\x43\x30\xb0\xfd\xf1\xf9\x87\x3b\x3a\x3b\x3a\x36\xbb\x39\x32\x1f\x10\x3b\xe9\xf2\x98\xec\x22\x58\x52\x28\x36\xe2\x1f\x3b\xda\xa7\x87\x51\x65\x22\x4f\x99\x30\x7c\xc4\xb1\x5f\x6f\xa1\x58\xc1\x04\xf6\xcc\xa7\xc9\x04\x64\xbf\x3b\x29\xab\xe0\xf4\x26\x26\xf3\xa0\xc2\xdd\xad\x28\xbb\x5c\xa6\xec\x6f\xe5\x18\xd9\xca\xb1\xc6\xd7\x27\x92\x63\x8e\x73\x37\x47\x88\x41\xe6\x79\xfb\xd4\xf7\xe3\x28\x8f\x1d\xb8\xb8\x7d\xe5\xf0\x1c\x1a\x5c\x90\x8b\x46\x62\xe6\x1a\x96\xaf\x29\x92\xb1\x29\xcb\x9c\xd2\x44\x72\x2a\xe8\x18\xdb\xf0\x19\x19\x40\x7f\xa4\x0a\x2d\x8e\xe6\x11\x7d\x40\x89\xf7\x95\x5d\xf0\xa5\x92\x59\xc6\x94\x26\x19\xbf\x66\xe4\x98\x15\x99\x9c\xe5\x2e\xf1\x35\x25\x97\x86\x1a\xcb\xd2\x97\xcc\x34\x8b\xf9\xb6\x43\x03\xf1\xc5\xec\x1d\x41\x9f\x63\x75\x3c\xd4\x96\x93\xc2\x15\x4e\xbe\x13\x20\x31\x0e\xa1\xdb\x4a\x8f\x9c\xb1\x29\x53\x3d\x72\x3a\x3a\x93\xe6\x1c\x55\xef\x7a\xb6\x1d\xde\x48\xf8\x88\xbc\xb2\x46\x9d\x36\xc4\x60\xc7\x8b\xa8\xce\x5d\xaa\xda\x00\x15\xde\x5b\x17\x65\x79\x8b\x25\xe7\x30\x52\x28\x38\x6f\x14\xc6\x68\xb5\x4c\xa1\xa5\x50\xeb\x05\x3a\xc4\x32\xd2\x0a\xc9\x37\xe2\x6f\x84\x67\xf0\x08\x66\x60\x02\x72\x41\x14\xd3\x85\x14\x9a\xd5\xe1\x19\xab\x16\x94\x60\xea\xea\x4e\x2d\xc4\xc6\x27\x67\xdb\x33\xb3\x90\xda\x40\xe5\x6c\x37\x8d\xaa\xce\xfd\x70\x50\x88\x4c\xb3\x8c\xa5\xb5\x4e\x65\xd8\x61\x87\xd6\xdd\x03\x09\x34\x67\xf0\x0d\x5f\x98\xab\x4f\xae\x95\x36\xd7\xee\x0f\x5d\xef\x7c\x5f\x19\xdf\x3f\xf9\xb6\x82\xe6\x6a\x63\xc2\x21\x12\x31\xc0\x02\xde\x33\xa0\x80\xeb\xa8\x39\xcd\x44\xca\x6b\x92\xc8\xbc\xc8\x60\xeb\xb4\xd8\x59\x55\x6f\xac\xc0\x4a\x7d\xe8\x87\x7a\x10\xb5\xcd\x82\x0f\xd6\xd8\xdf\xb4\x0b\x1d\x8c\x7d\x64\x49\x67\x7d\x35\xad\x2c\xb5\xab\x0c\xf1\x7e\x29\x82\x2a\x36\x92\xf6\x00\x83\xe2\xec\x80\x3f\x18\x81\xed\x9c\x7c\x64\x49\xd4\x9b\x16\x10\xb0\x12\x8f\x27\x61\x37\x7a\xfb\x9e\xe3\xad\xc3\x14\x5d\x85\x06\x5a\x14\xdf\xc5\xd7\x1c\x68\x20\x8c\xe9\x31\xd2\xdd\x23\xa0\xdd\x04\xd8\x4f\x58\x90\x17\x83\x6e\x04\x1e\xc6\x1d\xbb\x80\x34\x18\x92\xaf\xfd\x58\xd0\xd5\x47\x4a\x43\xf6\x76\x0f\x76\xf7\x17\x7c\x96\x73\x40\xdb\x57\xd1\x2f\x39\x20\x4b\x16\x00\xd3\xc8\x92\xdd\xb4\x47\xb8\xf1\xd9\xd9\xd8\x27\x08\x66\xe5\xaa\x04\x7b\x44\x4b\x62\x14\x4d\xb9\xd3\x7e\xe0\x53\x7b\x93\x51\xa5\x3b\x1c\xf6\x76\x7f\xdf\x75\x6d\x8a\x6e\xa4\xd8\x35\x30\xfd\x01\xb9\x42\x94\x9a\x30\xd0\x4c\x96\xd0\x7c\x13\x49\x50\x64\x3c\xe1\x26\x9b\x81\xa0\x23\xb2\xc4\x4e\x5d\xf6\x98\x71\xd5\x89\x27\x1f\xb9\xf1\x2d\x49\xe4\x88\xbc\xc0\x46\x61\x8c\x3a\xaf\x69\xc6\xa7\xec\x60\xc2\x68\x66\x26\x98\x58\x22\xa4\xe8\x63\xaf\x47\x2b\x81\xdc\x37\x6d\x63\x2c\xed\x5c\x90\xf1\xd5\xc2\x1d\xb9\x38\xa1\x96\xd6\x86\x95\xbd\x3f\x34\xef\x66\x4d\x16\xc0\xc2\xae\xae\xce\x7f\xa8\xb5\xb3\x06\xe1\x6f\x4c\xe1\xd3\x7d\xa2\xa6\xef\x1b\x20\x3b\xba\x09\x70\xb6\xea\x45\x4d\x3a\x14\x61\x6d\x7b\x52\x93\xe5\xe0\x6f\xab\x37\xa3\x26\x7f\x97\x25\x40\x87\xd0\x61\x36\x0b\xb8\x0d\x9a\x19\xb2\x63\x87\xda\xb1\xe2\xc9\x72\xc3\xdf\x18\x4d\x11\x56\x43\x1b\x46\x1b\x69\x7c\xf1\xd5\x59\xe0\x2d\x9a\x5b\xb7\xe7\x40\xa9\x8d\xcc\xc9\xc4\xbd\x76\xbd\x5c\xd3\xed\x8c\x01\xec\x1e\x5f\x0b\xa5\x58\x81\x12\xce\xfd\xe6\xd9\xc9\xaf\x05\xb9\x81\x74\xaf\xf5\x4c\x48\x62\xb2\xc5\x9d\x75\xb8\x40\x62\x21\x4a\x4d\x47\xb2\xb4\x83\x84\x09\xd2\x61\xd2\x04\x69\x57\xfc\x39\x3f\x10\x04\x02\xdb\xe7\x87\x75\x96\x87\x41\x3a\xcb\x35\x20\xcb\x1c\xb3\x8e\x67\xd0\x69\xd3\x11\x11\x3b\x8d\xf0\x93\xf6\xe5\xa5\xf1\x75\x37\x01\xba\x59\x7c\xd2\x25\x05\x8a\x0e\xd2\xc1\x17\x93\xc1\x11\x74\x0a\xca\x35\x51\xb8\x82\x98\xd0\x4c\x4d\x9b\x16\x80\x57\x57\x77\xaf\x2e\x9b\x3b\x0a\xfc\xb5\xa4\xb6\x5a\x11\x11\x1a\x5c\x7b\x50\xd5\x45\x82\x44\xd9\x0c\xae\x1f\xb6\x77\x01\xfb\xe3\x88\x8a\x31\x23\x2f\xed\x2f\xff\xf2\xe7\x3f\x7f\xf9\xe7\x01\x0e\x1f\x32\x1b\x04\x39\x3d\x3c\x3b\xfc\xc7\xe5\x4f\x47\x50\x50\xdb\x96\xaa\x1d\xa5\x6d\x76\x9d\xb4\xd9\x69\xca\xe6\xa3\x26\x6c\x42\x99\x48\x6b\x29\x52\x8f\x17\xc0\x90\x31\xba\xa8\xd3\xfd\x22\x54\x3e\xab\x6b\xd6\xfd\xaf\x76\xab\x6d\xc4\x1e\x33\x49\x71\x29\x93\xeb\x0e\xed\x9a\xdd\xab\xa3\x73\x1c\x32\x32\x6d\xa8\xf0\xce\x10\x2e\xa6\x32\x9b\x02\xfa\x2a\xb9\x3a\x3a\x87\x9d\x37\x80\xff\x02\x47\x14\x58\xd4\x33\x66\xaa\x42\x06\x17\x9e\x0a\x18\xaa\x50\xa4\x41\x33\xae\x0d\x4f\xe0\x77\x95\x9b\xd4\x8e\xd0\x26\x2e\xb5\xb5\x94\x96\x5d\x9d\x5b\x4a\x51\x93\xe0\x87\x1a\x4d\x6d\x13\x0f\x37\xf8\x5c\x72\xe7\x91\xaa\x75\xd1\xde\x9e\x4b\x1d\x8c\xb7\xb9\xe7\x52\xa1\xd8\xa5\x91\x8d\xba\x05\x90\xc5\x48\x08\x0e\x76\x4b\x1c\x64\xc8\x46\x52\xb1\xf9\x40\x48\x14\xd8\x48\x4b\xd8\x84\x54\x40\xf5\x9f\x77\x41\xc9\x5a\xf0\x02\x53\x2e\x7d\x87\xec\xcc\x61\xa2\x1e\xe8\x18\x08\xd5\xb7\x3b\xee\xd9\xb7\x63\x39\xcc\xae\x57\x95\x31\xb8\x66\xcb\xf0\x21\x33\x09\xba\x59\x7d\xfc\xc5\x79\x54\xfd\xf4\xe7\x43\x25\x89\xa2\x7a\x82\x8d\x88\xd9\x47\x6e\x02\xe4\x2a\xd5\x52\xa0\xb3\x37\xea\x89\xcc\x75\x84\xc9\x1d\x05\x79\xf0\x47\xe7\x32\x9d\xef\x39\x3e\x56\x34\x61\xa4\x60\x8a\xcb\x94\x40\x3d\x71\x2a\x6f\x04\x19\xb2\x31\x17\xda\xd3\x0f\xc0\xd9\x1d\xa1\xed\x71\xc3\xc0\x37\xec\xd1\xe2\x06\xe4\xa2\x06\x82\xe2\xca\x93\x12\x59\xed\x68\x37\x8b\xf9\x20\x13\x64\x84\x02\x79\xb1\x1b\x50\x58\x98\xb8\x41\xd2\x3d\x93\xee\x20\xda\x84\x3d\xbc\xfc\x77\xb7\x52\x87\x6b\x4b\xf5\x64\xd2\x2e\xf0\xbb\x0d\x4f\xad\x78\x6d\xc3\x53\x0f\xbb\xb6\xe1\xa9\x6d\x78\xea\xf6\x6b\xe3\xdc\xbb\xdb\xf0\xd4\xd6\xe8\x9a\xbf\xb6\xe1\xa9\x6d\x78\xea\x96\x6b\xe3\xe4\xd7\x36\x3c\xb5\xc2\xb5\x0d\x4f\xad\x78\x6d\xc3\x53\xdb\xf0\xd4\x36\x3c\xb5\x0d\x4f\xfd\x81\xdc\x80\xfe\xda\x86\xa7\x16\x06\xd9\x86\xa7\x22\x62\x6c\x2d\xa5\x25\xd7\x36\x3c\xb5\xe4\xda\x86\xa7\xa2\x6b\x7b\x2e\x35\x38\x97\x7c\x70\xe7\xdc\xda\x65\xed\x6b\xd6\xce\x21\x70\xc0\x13\x17\x23\x92\xa3\x5a\x9d\x13\x3e\x6a\x50\x35\xa0\x88\x30\x3f\x7c\xa9\x8d\x8b\x06\x55\x31\xa6\xa5\xf5\x50\x2d\xdb\xc3\x15\x32\xad\x82\x11\x51\x14\x02\xad\xd3\xe6\x35\x69\x6b\xab\xb6\x6a\x13\x7a\xd8\xe8\xb0\xc3\x86\x84\x76\x3a\x08\x35\x6c\xc3\x0c\xcf\x2e\xcc\xd0\x8d\x8b\xae\x03\xf7\x5c\xeb\x13\xc6\x05\xf3\xaf\x26\x8a\xe9\x89\xcc\x1a\x33\x7a\x8d\xc9\xdf\x72\xc1\xf3\x32\x87\xbe\xb1\x96\x9f\xf9\x34\x64\x0d\x84\xe6\xd8\x4e\xd0\xa3\xa7\x30\x6a\x30\xeb\x1b\xcb\x42\x59\xe7\x84\x82\xaa\xae\xcb\x24\x61\x2c\x8d\x5a\xde\x83\x62\xf6\xe5\x20\x3c\x29\xb4\xd3\x78\xd9\x4e\xde\xb4\x3b\xfb\x11\xa2\x14\x46\xf9\xf2\x8b\x46\x63\xb4\x8c\xf2\x7c\xfa\x08\x4f\x07\x62\xba\xbd\xbd\xd2\xca\x56\xe9\xe2\x94\x68\x6b\xa3\x3c\xb5\x48\x4e\x67\x11\xcd\x0e\x22\x38\x1b\x14\xbd\xd9\x98\x63\x61\x53\x22\x36\x1b\x88\xbe\xda\x41\x80\xa1\x8b\x08\x4d\x77\xd1\x99\x47\x00\x29\x7d\x9c\xa8\x4c\x87\xd6\x70\x47\xd1\x98\x4f\x11\x89\xe9\xe4\xad\xdb\x46\x60\x3e\x5d\xf4\xa5\x9b\xd7\x6d\xe9\xdd\x7a\x16\x11\x97\x0e\xbc\x5a\x5d\x7a\xb4\x3a\xf3\x66\x3d\x5a\x84\xa5\x7d\x74\x65\x03\x22\x2b\xad\x89\xcc\x05\x37\x9c\x66\xc7\x2c\xa3\xb3\x4b\x96\x48\x91\x36\x3e\x61\xe6\x50\xeb\xc2\xfe\xd1\x38\xac\xb3\xd1\xea\xf9\xc7\x13\xea\xc0\x79\x59\xea\x53\xaa\xbd\xfb\xcf\x29\x14\xd0\xd0\x04\x67\xb9\x91\x0e\x3d\xb2\x31\xc6\x20\x26\x63\x77\xb9\x88\x7f\x93\x37\x44\x8e\x0c\x13\x64\x8f\x0b\xbf\x8e\xfb\x91\x19\x58\x59\xe6\x81\xad\xed\xb7\x2f\x5f\xf8\x9b\x9f\x9f\xc9\x0d\xce\x05\xad\x1f\xdf\x03\xe2\x1e\x74\xbf\x0b\xc4\xdd\x38\x2a\xb3\xba\x1b\x04\x5d\x23\x75\x79\xf3\xb2\x82\x17\x7d\x09\xe3\x86\xdd\x46\x45\x4a\x5c\xe1\xc6\xf3\x5b\xb4\xd6\x71\xe3\xe7\x10\x33\xde\xfa\x5e\x48\xd7\xbe\x97\x35\xc5\x86\x37\x50\x6b\x7e\xa2\xf1\xe0\xad\xd6\xfc\x80\x2b\xaa\xff\xfa\x41\xd1\x84\x9d\x77\xae\x70\xf8\xed\x44\xd2\x52\xb9\xb2\xbd\xa0\x77\x84\xcd\x23\x18\x4b\x71\x37\x85\xa2\x38\xa8\x46\x1b\x95\x59\x36\x23\x65\x21\x45\xbd\xf2\x10\x83\x56\xf3\x05\x6b\x76\xb4\x65\x4f\xa9\xb4\xd4\x42\x49\x77\x00\xab\x52\x08\x2b\xcf\xab\x86\x43\xa0\x95\x6a\x94\xd5\x71\x59\x9c\xe6\x63\x3b\x7d\x7b\x98\x42\xc5\x1c\xcf\x59\xd5\x92\xa2\x1a\xd0\xfe\x7a\x24\x55\xc2\x87\xd9\x8c\x4c\x68\x16\xba\x4b\x50\x72\xcd\xb3\xcc\x0d\x33\x20\x97\xcc\x10\x33\xe1\xae\x31\x38\xc9\xa4\x18\xc3\xe4\xa8\xf0\x5d\xcd\x58\x62\x7f\x9b\x64\x8c\x8a\xb2\xc0\xe7\xd9\x63\x7d\x26\x4b\xe5\x9f\xe7\x60\x2d\xc3\x28\x5c\x13\xc1\xb3\x5e\xd4\x3b\xe9\xce\x85\xad\x1a\xd4\x6b\xe6\x6b\x0a\x6f\xb8\x66\xbd\x78\x4c\x8f\xcc\xab\xa3\xce\x19\x85\x92\x53\x9e\x62\xf7\x0b\x4f\x36\xe8\xd2\x8a\xdd\x31\xc2\x7e\x16\x52\xf4\x05\x1b\x53\xd0\x7a\xdc\x2e\xc2\x35\xc3\x71\x30\x14\x27\x52\xe8\x97\x61\xcd\x05\x59\xd4\x4a\x59\xa7\x1c\x3b\x7d\x46\x94\x23\x7b\x42\x12\x09\xc7\x6b\x29\xb8\xc1\xee\xd1\x93\xd2\x90\x54\xde\x88\xfd\x01\xa2\x12\x73\x4d\x28\x19\x32\xe3\x3b\xd9\xfa\xce\x8a\x5c\x31\x4d\x98\xa0\xc3\xcc\xae\x39\x24\x3c\x5c\x2d\x25\x10\x19\x31\x6a\x4a\xc5\xc8\x98\x1a\xb6\x54\x69\xc2\xf7\xbd\x9b\xbc\x5c\x87\x2e\xef\xa5\xd0\xac\x71\x7f\xeb\x8e\x35\xad\xbf\x7c\xd5\x4c\x46\xf0\x9c\xc9\xd2\x7c\x12\x53\xf2\x66\xc2\x93\x49\xac\x19\xf3\x9c\x69\x22\xcb\x39\x1b\xfb\xa5\xfb\xd9\xf2\x15\xda\xda\x93\xcb\xae\xa6\x5e\xe2\x25\xae\xb4\xf9\x92\xe3\xaa\xad\x2c\xb5\x1b\xf0\xf8\xec\xf2\x1f\x6f\x0e\xbf\x3f\x79\x33\x20\x27\x34\x99\xc4\xf5\xe8\x82\x50\x10\x1a\x20\x28\x26\x74\xca\x08\x25\xa5\xe0\xbf\x95\x88\x4e\x4e\xf6\xc2\x6f\xf7\x3b\xc5\x42\x6e\x78\xfa\x42\xeb\xeb\xce\x7a\x2d\x61\x23\x6d\x4c\x70\x90\x9a\x41\x77\x84\x79\xf5\xe9\xc4\x7e\x85\x86\x06\xa8\x5a\x13\x66\x85\x11\x9f\x3a\x31\xec\xc0\xa5\x69\x1a\x52\x2e\x2c\x9f\x5b\xb6\xb0\x47\x15\x1d\x42\xaa\xc4\x84\x11\xc1\x8c\x65\xeb\xe0\xb0\x92\x42\xd7\x80\x01\x4a\xcd\x74\x8f\x0c\x4b\x48\xee\x28\x14\xcf\xa9\xe2\xd9\x2c\x1e\xcc\x9e\x55\x67\xd2\x9b\x43\xb3\xf9\x29\x1d\xbf\x3b\xb9\x24\x67\xef\xae\x48\xa1\x10\x32\x00\xb2\x33\xe0\x7b\x78\xad\x21\xb3\xbf\x70\x3d\x3a\x07\xe4\x50\xcc\xf0\x4b\xdc\xe0\x5c\x13\x6b\x0b\x31\x38\x82\x9d\x0e\xe9\x41\xe1\x77\x5e\x0c\xe0\x7f\x3b\xf6\x2d\x95\x55\x32\x43\xd2\x49\xb2\x90\x3c\x86\x6a\x28\x1f\x66\x11\x35\xdd\xbb\x3f\xab\x6e\x4b\x21\x6d\xee\xdc\x12\x31\xea\xb6\x44\xc3\x52\x03\x79\xb1\xfb\x16\x17\xe3\x2c\xe6\xaa\x66\x62\xbf\xad\x6d\xd9\xd6\xb2\xec\x57\x6f\x70\xde\xd4\xc0\xec\xa4\xeb\x53\x35\x87\x8e\x7a\xa5\x54\xa7\x9f\x37\xa7\x9c\x44\x90\x71\xfb\xcb\xd3\x73\xbf\x03\x9c\x76\x93\xcf\xf5\x4c\x84\x1f\x63\x50\xa3\x47\x5e\x90\x6f\xc8\x47\xf2\x0d\x98\x57\x7f\x69\xdb\x59\xa6\xad\xe1\xd3\xde\xbd\x83\x56\xfd\xe9\x79\x47\x14\xff\xd9\x4a\x27\x3b\xa2\xa5\xaa\x91\x64\xc8\x9d\x3a\xcf\x3e\x1a\xa6\xac\x1c\x75\x2b\xb1\xd6\x9e\x3c\x76\x82\x9f\x90\xcd\x30\x76\x71\x3a\x8a\x5b\x42\x98\x07\x32\x9a\xfd\xf9\xdf\xa4\x36\x67\x4e\x0a\xd5\x1b\x4c\x54\xa3\xe5\xd4\x24\x93\xba\x18\xb3\x8a\x9a\x36\xd5\x06\xd3\x24\x95\xe0\x49\xc3\x3c\xc0\x09\x6f\x91\x89\xb1\x39\x6c\xdc\x2e\x38\x5f\x5b\xcf\xbb\x56\x6a\xce\x81\x02\x96\x8f\x53\xac\x22\x78\x99\x42\xa6\x4e\x27\xb3\xd3\x4a\xa3\x33\xe3\x0e\xa5\xcc\xf9\x6a\x82\xcb\x1a\x78\xc9\xee\xa7\x84\x0a\x4c\xe0\x1e\x31\xa5\x30\x75\x73\x38\x83\x08\x32\x4f\x58\xeb\xc5\x6b\xb5\x93\x0a\x25\x8d\x4c\x64\x8b\xb6\x41\xf5\x80\xb9\x1b\x0e\x88\x80\xce\x5f\xef\x73\x7f\x7f\x7c\xde\x23\x57\x47\xe7\xd0\x4d\xe5\xf2\xe8\xea\xbc\x6e\xa9\xec\x5c\x1d\x9d\xef\xac\x95\x14\xc4\x6b\x56\xaf\xec\x34\x1b\x0c\x52\x73\x3c\x59\xb5\xad\x9f\xd3\xa2\x7f\xcd\x66\x0d\xcf\xd4\x2e\xce\xf5\x7e\x58\xe1\x4e\x5e\x08\xc9\x9c\xd3\xe2\xc1\xa3\x29\x46\x53\xfe\x89\xaa\x28\xdc\xce\xaa\x9e\xb9\xbc\x9c\x22\x97\x53\x96\xa2\x3a\xec\x7f\xc1\x44\x5a\x48\x6e\xf5\xc5\x6d\x8d\xc5\xc3\x7f\xbd\xad\xb1\xb8\xeb\xda\xd6\x58\x6c\x6b\x2c\xb6\x35\x16\x77\x5f\xdb\x1a\x0b\x77\xad\xdf\x0d\x4a\xb6\x35\x16\x0d\xaf\xe7\x15\xe7\xdf\xd6\x58\x3c\xe8\xda\xd6\x58\x2c\x5e\xdb\x1a\x8b\x5b\xae\x6d\x8d\xc5\x2d\xd7\xb6\xc6\x62\x5b\x63\xb1\xad\xb1\xd8\x66\x8b\xdd\x3b\xd6\x66\x66\x8b\x91\x6d\x8d\x85\xbb\xb6\x35\x16\xcf\x22\x27\x86\x6c\x6b\x2c\x56\xba\xb6\x35\x16\xdb\x1a\x8b\x26\xd7\xb6\xc6\x02\xae\xad\xef\x65\x5b\x63\xe1\xaf\x6d\x8d\x05\x5e\x7f\x1c\xad\x79\x5b\x63\xb1\xad\xb1\xd8\xd6\x58\x6c\x6b\x2c\xee\x9c\xc5\xb6\xc6\xe2\x39\xd8\x93\xbe\x07\x5e\xfb\x9a\x81\xdd\x23\x99\x17\xa5\x61\xe4\xc2\x0f\x19\xb4\x48\x14\x0c\x5c\xc7\x1a\x41\xfb\x14\x9e\x44\x8a\x11\x1f\x3b\xc9\x7e\x80\x0d\xe6\xfa\xe1\x7d\xfa\x51\x53\xb7\x27\x98\xbf\x93\xf1\x9c\x37\x2b\xe4\x20\x0b\x0b\xf3\x06\xc6\x8a\x82\x3c\x76\x27\xe5\xf4\x23\x6c\x11\x9a\xcb\x12\x9b\xf2\x25\x6e\xfd\x02\x09\x31\x14\xb6\x71\x2b\x43\xba\x31\x71\xaa\x8a\x94\xf3\x0e\xac\x8d\x82\x1a\xc3\x94\x78\x45\xfe\x7b\xef\xc3\xe7\xbf\xf7\xf7\xbf\xdb\xdb\xfb\xe5\x45\xff\x3f\x7f\xfd\x7c\xef\xc3\x00\xfe\xe3\xb3\xfd\xef\xf6\x7f\xf7\x7f\x7c\xbe\xbf\xbf\xb7\xf7\xcb\x8f\x6f\x7f\xb8\x3a\x3f\xf9\x95\xef\xff\xfe\x8b\x28\xf3\x6b\xfc\xeb\xf7\xbd\x5f\xd8\xc9\xaf\x2b\x0e\xb2\xbf\xff\xdd\x7f\x34\x9e\x72\x6b\x95\xb8\x3b\x85\xb8\x23\x75\xf8\x51\x94\x61\x17\x1d\xee\x68\x2f\x5e\xb8\xd1\xe6\x77\xa3\x3b\xb0\xee\xda\x8d\x5e\x9a\x82\x9a\x17\xc6\xe1\x9a\xc8\x9c\x1b\xab\x1c\x5a\x7d\x90\xc6\x79\x61\xdc\xd4\x8c\x52\x27\x07\x20\xa1\x92\x1a\xec\x11\x1a\x72\xaa\xa2\x3c\x6d\xe9\x35\x3f\xd7\x7b\x35\xf8\x2b\x60\x3f\xf7\x53\x36\xe2\x82\xb9\x38\xd8\x56\x36\xdc\x7f\x6d\x65\xc3\x73\x94\x0d\x9a\x25\xa5\xe2\x66\x76\x24\x85\x61\x1f\x1b\x79\x58\xea\xa2\xe1\xb2\x3e\x20\xc1\x7d\xe6\xaa\x28\xdd\x77\x44\x16\x98\x40\x39\x57\xce\x1a\x52\x70\x55\x29\xc0\xc0\xc4\x2a\x19\x66\xd0\xfa\x03\xbb\x07\x72\x22\xe7\x1f\xe2\xed\x39\x34\x33\x7f\x2b\xf9\x94\x66\xd6\xda\xad\x7e\x71\x0e\x16\x4c\xfc\xa3\x55\xf7\xbc\xa1\xfa\xba\xda\xf0\xac\x6f\x75\xe8\x30\xe7\x03\xff\x4a\xf0\x11\xfb\x68\x9e\xa2\x96\x06\x0a\xd2\xb9\xe2\x53\x9e\xb1\x31\x3b\xd1\x09\xcd\x40\xae\x75\x73\x56\x1c\xde\x32\x3a\x2c\xbc\x92\x99\x26\x37\x13\x06\xdd\x95\xa9\x77\x01\x40\x85\xcb\x98\x72\x41\x72\xbb\x44\x85\xff\xb1\x46\x5f\x82\x15\xff\x05\x55\x76\x81\x83\xcf\x00\x4c\xe4\xa1\x94\x99\x4b\x1d\xce\x66\xd5\xf8\x2e\xf7\x5e\xc8\x7f\x08\x76\xf3\x0f\x3b\x9a\x26\xa3\x8c\x8e\x83\xab\x40\x33\xb3\xe0\xed\xab\x86\xbe\xf5\x05\x20\x2f\xb7\x64\x84\x66\x37\x74\xa6\x2b\xc7\x49\xdc\x07\xfc\x15\x79\xb9\x0f\xec\x4c\x35\x09\x63\xa4\xe4\x8b\x7d\x88\x25\x1e\x1d\x9e\xff\xe3\xf2\xef\x97\xff\x38\x3c\x7e\x7b\x7a\xd6\xee\xa4\xb0\xef\xce\xa8\x68\x34\x46\x42\x0b\x3a\xe4\x19\x6f\x73\x40\x2c\x64\x9b\xc4\x83\xc2\x11\x9c\xa6\x07\xa9\x92\x05\xd2\xc9\xfb\xa8\xaa\x93\xb2\x6e\x05\xc7\x95\xc9\xb0\x3c\xa3\xfa\x80\x63\x45\x85\xa9\x9c\x35\x15\xc9\x55\x29\xac\x61\xfd\xc4\x13\xf3\x69\xda\x5d\x52\xfe\x61\x9a\xb2\xb4\x46\xbd\x67\x97\x04\x78\xe4\x5f\x6e\x56\xd5\x68\x93\xf3\x77\x97\xa7\xff\xcf\x1c\x1b\xce\x8a\x76\x39\x4f\xdd\xd4\x85\x29\x59\x74\xb6\xba\x17\xae\xee\x68\xbb\xbe\x1b\xb1\xbe\xe1\xac\xea\x26\xd2\x7e\x51\x8a\x3a\x8c\x47\x35\x3e\xc9\x65\xca\x06\xe4\x3c\x78\xe9\xeb\xdf\x46\xe5\xbd\x54\x31\x62\x6f\x11\x86\xd3\x2c\x9b\xc5\x0a\x92\x91\x58\x4c\x53\xab\x4c\x8e\xe5\xf0\x88\x66\xba\xa5\x30\x6d\x73\x32\xd9\x43\xf8\xad\x35\x26\x3b\xa1\x66\x18\x8d\xa4\x4c\x48\xe3\xb4\x52\x3b\x4b\x28\xd6\x56\x32\x21\x68\xb9\x46\x69\x51\xb5\xd3\x45\xa3\xa3\xdf\x1f\x4c\x5c\x7b\x5a\x9d\x87\x91\xd1\xcb\x5b\x6a\x36\xaf\xdd\xba\x83\xa9\xb2\x65\xed\xe8\x8a\xd1\x14\x6a\xd2\x0a\x6a\x26\x98\xd5\x90\x53\x7d\xcd\x52\xfc\xc0\xe9\x35\xc1\xcd\x6f\x47\x0c\x8f\xba\xb2\xf3\xf6\x3e\x7d\xd0\x67\x30\xd7\x02\x62\x01\xcd\x40\x37\x48\x17\x5b\xc0\xbe\xd3\x3b\x91\xcd\x2e\xa4\x34\xaf\x43\x2d\x56\x27\x0b\xf8\xb3\xd3\x14\xeb\x6e\x58\x50\xa5\x20\x09\x21\xed\x03\x31\x81\xa5\xe3\x32\xb0\xe3\x6a\xc1\xd6\xcc\xd0\xaa\x14\x87\xfa\x07\x25\xcb\xc6\x27\xc0\x82\xa2\xf5\xc3\xe9\x31\xec\xe3\xd2\x45\xd9\x84\x51\x33\xa8\x3a\x5d\x04\x0c\x0a\x3a\xed\x7b\x17\x27\x8c\x39\xb2\x0a\xe9\x90\xb7\x74\x46\x68\xa6\xa5\x57\x8e\xb9\x58\x6a\x40\x39\xeb\xcc\x7e\x3d\x94\x66\xb2\x60\x96\x59\x76\x5e\xfc\x5d\x2f\x0a\xba\x55\x08\x46\x5c\x2c\xfc\xdc\xd0\x6b\xa6\x49\xa1\x58\xc2\x52\x26\x92\x96\xab\xb6\xee\x50\x13\xac\xfc\x99\x14\x76\x5b\x74\xb2\xf6\xa7\x21\xc6\x08\x8e\xb0\xfa\x4a\x43\xb4\xd2\xd9\x1d\x14\x62\x96\xb0\x29\x4a\xcd\x14\x06\x58\x55\xc9\x70\x21\x7e\x2c\x87\x2c\x63\x06\x8d\x21\xc0\x9d\xa0\x06\x0d\x69\x9e\xd3\x31\x23\xd4\x04\x46\x31\x92\x30\xa1\xad\xb8\x41\xd7\x9b\x21\xa9\x64\x55\x01\x25\xd5\xe4\xfd\xe9\x31\x79\x41\xf6\xec\xb3\xf6\x61\xf9\x47\x94\x67\x10\xce\x34\x54\xcd\xcf\x91\x8f\xfc\x10\x30\x25\xe0\x3d\x22\x15\x6e\xd1\x1e\x11\x92\xe8\x32\x99\xf8\x39\x59\x8b\xcb\x1b\x6c\x2e\x9f\x0f\x9c\xfa\xcf\x90\x55\x5b\x0b\x98\xf7\x9a\xa9\xce\xe4\xcb\xfb\x06\xf2\x25\x56\x21\x2c\xcf\xd5\xa9\x87\x8c\x95\x33\x43\x53\x6a\xa8\x93\x3b\x55\xd5\xf5\x73\x5c\xd2\x75\x4b\x1f\xcd\xde\x70\x51\x7e\xc4\x8c\x95\xee\x8c\xfc\xcb\x13\x18\x96\x24\x9e\x68\xb0\x68\xb4\x28\x32\x8e\xf5\xce\x73\x19\x54\xa7\xb5\xa5\xee\xdd\xa2\x22\xc1\x36\xa7\x59\x26\xad\x78\xb3\x27\x3b\x15\xa9\xcc\x17\x1e\x66\x15\x28\x56\x03\xba\x1b\x90\x67\xc9\x3c\x6b\x77\x47\x64\x6c\xca\x5a\x60\xba\xcc\xe3\xf2\xd9\xd1\xac\x2e\xe6\x17\x14\x86\x27\x19\x1d\xb2\x0c\x4f\x16\x64\x20\xbd\xc8\x40\xeb\xce\x42\x54\x32\xeb\xae\x06\xe3\x42\x66\x0c\xd3\x7a\x3c\x21\xec\xf0\x4f\x82\x0e\x30\x48\x57\x74\x00\x43\xa6\x46\x07\x30\xc9\x9e\x02\x1d\xca\x16\x07\x2d\x99\xa7\x83\x3d\xb5\xeb\x74\x80\xa3\x73\xd3\xe9\xa0\x59\x92\xc8\xbc\x38\x57\xd2\x9a\x5c\x9d\x1d\x2d\x6e\xd8\x2a\x56\x84\x36\xf9\x92\x24\x1c\x10\xe5\xf5\x9b\xa9\x8a\x12\xfa\xa8\x41\x19\xef\xb3\xfa\xfe\x7f\x71\x87\x64\x2b\x7a\xe6\xcf\x21\x3f\x4a\x2d\xac\x64\x7f\xe9\xbe\x78\xe2\x70\x02\x2d\xbc\x64\x9d\x1c\x26\x32\xa1\x19\x40\xee\xb5\xe3\x18\x32\xcf\x35\xf3\x03\x47\x59\x98\x10\x5a\x82\xcf\x7c\xdc\x1f\xd0\xd7\xe0\x13\xe7\xfb\x12\x32\x65\x51\x08\x12\xd3\x47\xaf\x30\x5b\x0f\xee\xf3\x09\xa0\xf6\x54\xf7\xd1\xc0\xb4\xf6\x6b\x23\x1d\x02\xcc\xdb\x00\xe4\x67\x27\xc8\x44\xca\xc5\x18\x3c\x3a\x3d\xa2\x58\x86\xa9\xa3\x6e\x0f\x5f\xa3\xf9\xb5\x0b\x1c\xed\x07\xf5\xec\xec\x1f\x0d\x9a\x10\x97\xc2\x8d\x0c\x4e\x0e\xaf\xdf\x8c\x50\x5a\x72\x4d\x76\xde\x78\x02\xb4\x40\x3e\xdb\xc4\x03\x62\x07\xdf\x30\xac\x26\xfa\xd8\xae\xb9\x48\x5d\x96\x65\x8d\x58\x01\xa3\x16\xb5\x50\xc8\xdf\xe5\x69\x2c\x1a\x5e\x91\x0f\x82\x04\x62\x91\x7e\x63\xf6\xb8\x40\x85\xd5\xbb\x97\xfa\x77\xbb\xfc\xc2\x43\xe6\x87\x79\x2f\x60\xed\xed\x73\xfb\xd6\xec\x5d\xbc\xcf\xbf\xcb\xce\x3a\xd7\xf5\x86\x8b\x54\xde\xe8\xae\x6d\x88\x9f\x71\x58\xaf\x50\x27\x96\xad\x0d\x17\x63\x1d\xdb\x11\x34\xcb\x6a\x6e\xd8\x65\x86\x84\x5f\xe1\x80\x48\xbc\xa8\xc0\xcf\x65\x87\x6f\x8d\x80\x07\x5c\xe3\x5c\xd3\x23\x65\x5f\xc5\x70\x9a\x5d\x16\xcd\xa1\xd9\xc8\x3c\x1b\xfc\xf0\xf6\xf2\xb0\x3e\xb4\x95\x67\x37\x80\x78\x6d\x89\x6d\xbf\x27\x34\xcd\xb9\xd6\xe0\x06\x62\xc3\x89\x94\xd7\x64\xcf\xa7\x6d\x8c\xb9\x99\x94\xc3\x41\x22\xf3\x28\x83\xa3\xaf\xf9\x58\x1f\x38\xa6\xed\xdb\xd9\xef\x13\x2e\xb2\x90\x8d\x02\x66\xa4\x30\xda\xbb\x31\xe0\x21\x49\x98\x05\xac\xad\xc3\xeb\x74\x51\xe6\xc5\x69\x22\x42\x27\x67\xd9\xfa\x01\x67\x16\x97\xe7\xac\x25\x76\xc6\x3d\x4b\x04\xef\xee\x4a\x53\xe2\x32\xaa\xa5\x74\x44\xed\x6d\xed\x44\x72\xda\x41\xc2\x74\x77\xa8\x3c\x7f\xab\xc6\x24\x29\xc3\xea\x09\x06\x59\x27\xf4\xd6\xe4\x26\xf0\xca\xee\x42\x11\x9e\xfb\xe9\x6e\xac\xd1\x42\xd4\x07\xcb\x3c\xac\x3d\x90\x15\x13\xda\x47\x23\xd9\x8a\x24\x90\x61\x5e\x07\x98\x48\x21\x5d\x72\xba\x3d\x05\xa5\x00\x96\x06\x6b\x01\x03\x41\xb0\x26\x4e\xc6\x46\x53\x3d\xaa\xe2\x83\x71\x0c\x09\x8a\x78\x10\x04\xa0\x9a\xc3\x0d\x37\x13\x8f\x70\x5f\x0b\x38\xc1\x4c\x14\xd3\x10\x3d\x10\x84\x29\x25\x95\x4b\x84\xf1\x5e\x5b\x18\x09\x44\x31\x64\xd2\x58\x26\xa1\xf6\xaf\x5d\x1d\x87\x28\x2b\x08\x5c\xc8\x13\xb3\xdc\xc4\x46\x23\x96\x80\xa6\x14\x13\x18\xc5\xee\x5e\x85\xdc\xe7\xb2\xbb\x2d\x83\x39\x08\xdd\x9c\x7f\xb4\x4f\x89\x7f\x15\x07\x43\x1d\x62\xde\xf2\xaf\xf7\x07\x84\x9c\x8a\x90\x39\xd9\xb3\xab\x18\xdf\xe9\x53\x7e\x8c\x7d\xc5\x18\x7f\x19\x5e\x20\xf6\x3b\x59\xf5\x4e\x95\x1d\x70\x7c\x1b\x67\x30\x89\x1d\xc2\x9d\x8a\x03\x70\x0c\xbb\x41\xed\xd2\xfb\x43\xbc\x8d\xa3\xd8\xde\xf2\x58\xce\xe2\xa7\x71\xd2\x93\xb6\x72\xce\x95\xc4\x77\x04\x8a\x7b\x19\x8d\x16\xa9\xdf\x21\xdc\x74\x2e\x53\x84\xc4\x08\x25\xfd\xd0\xcb\x02\x20\x3a\xf8\xbf\xbd\x82\x55\x29\x69\x42\x62\x56\x76\x8c\x95\xe1\x30\x41\x53\x62\x75\xe5\xcc\xdb\xf6\x79\x91\x31\xa8\x9e\x8b\x46\xae\x0a\x03\x23\x14\xdd\x5e\x98\x48\x05\xc4\xeb\x10\x3a\x7a\xe4\x5f\xb0\x29\x43\x02\xa0\x07\x0f\x38\x0f\x3f\x47\x13\x8f\x6b\x0f\xa9\x0d\x95\x6d\x46\x7a\xd7\x01\x49\xf9\x68\xc4\x7c\xa2\xa1\x35\xfd\xa8\xa2\xb9\x15\xf1\x9a\x38\x12\x0c\xd9\x98\x63\x26\x5b\x10\x6c\xbb\xba\xaa\x80\xef\xa1\x30\xe4\x86\xe4\x7c\x3c\x41\x46\x21\x14\x2a\x23\x89\x0f\xa9\x65\x92\xa6\x04\x78\x5b\x2a\x72\x43\x55\x6e\xcf\x0d\x9a\x4c\x20\x3e\x47\x05\x49\x4b\x05\x30\x91\x86\xd1\x74\xd6\xd7\x86\x1a\xab\xea\x32\xe5\x2c\x42\x3f\xff\x2d\x94\xf0\x9d\xd7\x16\x4a\xf8\xf6\x6b\x0b\x25\xbc\x85\x12\xde\x42\x09\xdf\x7d\x6d\xa1\x84\xdd\xb5\xfe\x6a\x5f\xb2\x85\x12\x6e\x78\x3d\x2f\x38\x9b\x2d\x94\xf0\x83\xae\x2d\x94\xf0\xe2\xb5\x85\x12\xbe\xe5\xda\x42\x09\xdf\x72\x6d\xa1\x84\xb7\x50\xc2\x5b\x28\xe1\x2d\x28\xda\xbd\x63\x6d\x26\x28\x1a\xd9\x42\x09\xbb\x6b\x0b\x25\xfc\x2c\xa0\x9f\xc8\x16\x4a\x78\xa5\x6b\x0b\x25\xbc\x85\x12\x6e\x72\x6d\xa1\x84\xe1\xda\xfa\x5e\xb6\x50\xc2\xfe\xda\x42\x09\xe3\xf5\xc7\xd1\x9a\xb7\x50\xc2\x5b\x28\xe1\x2d\x94\xf0\x16\x4a\xf8\xce\x59\x6c\xa1\x84\x9f\x83\x3d\xa9\x4d\xca\x1b\x21\x9f\xad\x02\x54\xe1\x32\x43\xa2\xd2\xd6\x61\x39\x1a\x31\x05\x92\x0b\x9e\xbc\x90\x85\x10\x00\xad\x82\x2c\x73\x79\x06\x00\x8b\xa7\x18\x4d\x5d\xc2\xfb\x2d\x3f\x77\xb5\xb4\x80\x50\x56\x65\x6a\x9e\xbc\x7b\xdd\x0d\x2a\x46\xbb\x1c\x45\x98\xf3\x3b\x91\xb4\xcf\x55\xab\x08\xbe\xac\x00\xc3\xd1\x3d\xc9\xa4\x76\x19\xa6\x40\xac\x64\x42\x85\x60\xde\x78\xe4\x06\x9c\x32\x43\xc6\x04\x91\x05\x13\x28\xbf\x29\xd1\x5c\x8c\x33\x46\xa8\x31\x34\x99\x0c\xec\x93\x84\x27\x76\x95\x0d\xea\x3e\xd1\x46\x31\x9a\xfb\xbc\xd8\x9c\x72\x1c\x8a\xd0\x44\x49\xad\x49\x5e\x66\x86\x17\x61\x30\xa2\x19\x24\xb4\xe3\x41\x15\x88\x01\xe9\x25\x55\x0a\x69\xaf\x7a\x9a\x9b\x96\x8c\x41\x81\xc0\x74\xed\x01\x0e\x6a\x5e\x98\x59\xc8\xa3\x63\x64\xc4\x95\x36\x24\xc9\x38\x9c\xd6\xf0\x44\xac\x1d\x84\xf1\x7a\xfe\xac\x16\x6e\xa6\xda\x4d\x55\xa4\xa0\xb6\x16\x46\x63\x56\x5a\x35\xa0\x1b\x2a\xe5\xda\xa9\xf9\xba\x47\xa8\x87\xbc\x41\x42\xfb\x99\x02\xa9\xfd\xc9\x82\xa3\xbb\x8f\xa2\xe1\x22\x9c\xbc\x2a\x6d\xaf\x62\x74\x48\x31\xf6\xcc\xd9\xab\x65\x53\x57\x0a\x05\xa4\xbb\x2c\x6c\x03\x58\x00\xc1\xa6\x96\x07\x58\xc2\xec\xf9\x4a\x6f\xe1\xfa\x4f\xce\xf4\xd1\xa1\xf8\x96\x69\x4d\xc7\xec\xbc\x61\xd4\xe2\x36\x8b\x0c\x02\x17\xd5\xc2\x00\x2b\x64\x58\x9e\x16\x3e\xa9\xd2\x9c\xea\x6a\x10\xc9\x71\x4e\x41\xf9\xb9\x51\xdc\x18\x06\x8b\x0a\xe0\x48\x10\xf8\x9c\x2f\x40\xdd\x9d\x4b\x96\x7a\xeb\x07\xa9\x7e\x6c\x85\xba\x48\x31\x75\x69\xc8\xc8\x50\x71\x36\x22\x23\x0e\xf9\x50\x90\xa1\xd4\x43\xb8\x0f\x8a\x1e\x05\xad\xad\xbd\x2b\x85\xd7\x65\xfd\xbc\x06\xe4\x67\x37\x31\xa3\x4a\x91\xd0\x08\x04\x10\x4a\xb4\xf8\x88\x8c\x21\xc3\xc9\x69\x8b\x5f\xbd\xf8\xcf\xbf\x90\xe1\xcc\x1e\x69\xa0\x59\x19\x69\x68\x16\x5e\x32\x63\x62\x6c\x69\x85\xdb\xb3\x5e\x64\x14\x28\x00\x28\xe6\x38\xf1\x97\x5f\x5c\x0f\xeb\x67\xec\x41\xca\xa6\x07\x11\xfd\xfa\x99\x1c\x2f\xc3\x85\x6f\x9e\x32\xd9\xd0\x24\x5a\xc2\x66\x32\xe3\xc9\xac\x35\xa3\x79\xdc\x19\x32\x91\x37\xa8\xeb\x2f\xe1\x9e\x2a\x07\xb2\x90\x45\x99\xa1\x07\xfb\x75\x28\xcf\x2b\x35\x5b\xac\xc1\x59\xba\x2f\xc0\xe7\xea\x86\x98\xc7\x8b\xc5\xc4\x36\xff\x48\xe9\x72\xbb\x9d\x57\x30\xc0\xcf\x80\x21\xf4\x9a\x66\xd9\x90\x26\xd7\x57\xf2\x8d\x1c\xeb\x77\xe2\x44\x29\xa9\xea\x73\xc9\xa8\x95\x96\x93\x52\x5c\x23\x72\x75\x28\x11\x96\x63\xab\x5a\x15\xa5\xf1\x89\xc4\xcb\x5e\x18\x0b\x4e\xbd\x10\xf6\x66\x50\x35\x0a\xfb\xc8\x2b\x5b\xc7\x95\x4a\x20\x47\xc6\xe3\xeb\x98\xd9\xbe\x78\xf1\xd5\xd7\xc8\xba\x44\x2a\xf2\xf5\x0b\x48\x7e\xd4\x3d\xdc\xc4\x20\xdb\xec\x41\x91\xd3\x2c\xb3\x66\x43\xcc\x94\x96\xd0\xcb\x98\xf0\x93\xf3\xa0\x69\xcf\x6e\x2b\xab\x52\x57\x57\x7f\x07\x3d\x8a\x1b\xcd\xb2\x51\x0f\xab\x02\x82\x59\xb3\x0b\x07\xc3\xae\x93\x3e\x50\x9a\xb1\x01\x0a\xd0\x54\x66\x65\xce\x8e\xd9\x94\x77\xd1\xbc\xa2\x36\x9a\x37\xf5\x33\xae\xa1\x00\x63\x98\xc9\xe4\x9a\xa4\xee\xcb\x28\x8d\x65\x1e\x42\xb5\x39\x15\x9a\x26\xf4\xb4\x48\xe4\xb9\xf5\xfd\x6b\x29\x3c\x39\x2d\x8a\x90\xa3\xaf\xe8\x4d\x8d\x18\xb0\x27\xa1\xde\xb7\x25\x9e\x42\x6b\x37\x73\x5b\x27\x73\xdf\xbd\x91\x95\x9b\x8d\x87\x68\x9c\xc2\xd2\xde\x47\x5d\xcd\xbe\xb9\x63\xb2\xc6\x10\xd5\x80\x7e\x37\x14\xf0\xdf\x98\x9e\xbd\x50\x95\x14\x0a\x5b\x02\x63\xa0\x02\x60\xd9\x07\x44\x72\x73\x87\x6b\x07\xde\xcd\x76\xf9\x4b\x35\xba\x88\xe0\x55\xce\xa9\x71\x0a\xa1\x77\x5f\x53\x52\x30\xa5\xb9\xb6\xe7\xf2\x4f\xb0\xa1\x8e\x32\xca\xf3\xc8\x05\xb8\x1e\x22\xe0\xe6\x06\xe4\xcb\xf6\x92\xf2\x5c\xa6\x6e\x40\x10\x85\x88\xfa\xb9\x44\xad\xad\x6b\xb5\x1d\x1e\xa8\xeb\x16\x95\x3f\x55\xd4\xac\x4b\x4a\xfb\x49\x10\x95\x78\xd7\x73\x12\x90\xf0\x7e\x4f\x55\x3e\x86\xc9\x77\x24\x06\x40\x30\xba\xc5\xad\x4b\xc2\x9a\xf1\x88\x1b\x25\x52\xe9\x9d\x1d\x38\x20\x18\x52\xb7\x7b\xc2\xfd\x94\xec\xbe\xda\x5d\xab\x90\x44\x12\x29\x59\xd0\x71\xab\x1e\x06\x73\x94\x9a\x1f\x36\x2e\xf4\xb6\x66\x10\x7c\x1f\x60\x87\xe0\x2e\x96\x56\x40\x14\x00\x33\x82\xd1\x51\x4f\x60\x67\x20\x60\x3d\xe4\x0d\x9d\x11\xaa\x64\x29\x52\xe7\x5f\x0a\x0e\xbe\xb7\x73\x0f\x3e\x93\x82\x79\xc7\xf9\x7c\x9d\x38\x78\xf4\xb9\x20\x2f\x07\x2f\x5f\x3c\x97\x93\x0a\xde\x70\xee\xa4\x3a\x0b\x27\x15\xca\xa7\xb5\xbe\xab\x47\x3b\xee\xe8\x7d\xdf\x3a\x17\x4b\x05\x66\xcc\x3d\x58\x2b\x7c\x74\xa3\xb8\x61\x51\x6f\xa3\x3d\x30\x5c\xac\x7d\x18\x55\x45\xef\x77\x88\xe1\xdd\x4d\x19\xba\x2e\x87\x8f\x28\xb7\x9c\x80\x82\xed\xb6\xcc\xc3\xa5\xef\x10\x61\x31\xa1\x76\x76\xc8\x1e\xde\xb9\x8b\x95\x81\xfb\x6b\x65\x2d\x47\xb4\x93\x8f\x45\x0b\x8c\xb9\x1a\xe1\x4e\x3e\x16\x14\x7c\x70\x45\x87\x14\xfc\x9e\x4d\xe8\x94\x41\x45\x24\xcf\xa8\xca\x20\xe6\x78\x89\x73\x27\xc3\xd2\x10\x26\xa6\x5c\x49\x01\x09\x3e\x53\xaa\x38\xa0\x52\x28\x06\x95\xd5\xd6\x16\xfd\x8f\xbd\x9f\x0e\x2f\x20\xa1\x61\xdf\x95\x84\xbb\x59\x96\xda\xc3\x47\xc4\x33\x89\x86\xbb\x77\xf9\xfc\x3c\x2c\x0d\x41\xe6\xfa\x79\xd9\xe7\xe4\xa5\x29\x11\x10\xff\x63\x92\x95\x9a\x4f\xd7\x25\x49\x5c\xa9\xea\x31\x6f\xb4\xce\x73\x65\xb3\x15\xa1\x16\x2a\x60\xc1\xb5\x0e\x47\xcb\x3d\x08\xac\xbb\x3a\x60\x56\xc5\x31\x70\xe7\x7a\x72\xb5\xec\x98\x8b\xe7\x21\xcb\x16\x54\x08\xc0\x6d\x58\xaf\x13\x4a\xc8\x94\x3d\x1c\xf5\xa2\x9e\xde\xe3\x86\xc0\x98\x79\x54\x0e\xa8\x93\x09\x4b\x4b\x80\x57\xe1\x1a\xc1\x01\xad\xf9\x40\x2b\x18\x2b\x01\xfd\x19\x4e\x47\xa1\x36\x58\xf4\xc1\x39\x88\x34\xf7\xbf\x57\xbe\x92\xd8\x7f\xa0\xe7\x46\x04\xa3\xd4\x8e\xd5\x23\x54\xeb\x32\xc7\x2d\x81\xf0\xdb\x23\x6e\x74\xe8\xad\xe7\xb5\x63\xbb\x31\x1e\x58\x9d\xd5\x82\xbe\x97\x2c\x03\xe6\x6a\x41\xe3\xdd\xb3\x68\x1c\x24\xb4\xf6\x7f\x39\x86\x73\x09\x13\x10\x6d\x0b\x49\xa1\x12\xbc\xa4\x23\x0e\xed\x2b\xa8\xa3\xf7\xe5\x92\x5f\xa2\xea\x80\x77\x00\x3c\x03\x1d\xb2\x4c\xcf\x0f\x34\xac\x16\xc5\xc1\xfa\x39\xc2\xb7\xec\x0e\x48\xb5\xe6\x63\x01\x7d\xc3\xec\x68\x0f\xec\x10\xd6\xd8\x66\xea\xa2\xfb\x5f\x63\xa9\x56\xcb\xc2\xca\x69\xd1\x77\x56\xaf\x91\x39\x4f\x1e\x30\x92\x9c\x32\x35\x61\xf4\x81\x06\xdf\x5c\x5c\xcc\x8d\x51\xb5\x8e\xd1\xae\xca\xd1\xed\x1b\xff\x10\xbb\xbf\x64\x02\xd9\xf6\xe8\xa7\xf7\xd9\x4f\x14\x58\x04\x1b\x53\x8e\xf9\x94\x09\x0f\xfc\x77\x94\xd1\xd0\x7c\xcc\x43\x25\x39\xf0\xc1\xd2\xc8\x10\xf9\xb0\xe6\x54\x85\x5e\x06\x81\x52\xe7\x74\x8d\xc7\x89\x6e\x71\xad\xcb\x32\x0f\xd6\xbf\xca\x9d\x10\x7c\xc0\xd6\x1f\xbd\xea\x95\x72\x6f\xa0\xd5\xe0\x71\x48\x02\x21\xb2\xd0\x15\x14\x03\x11\xf7\x3f\xc2\xc5\xb5\x2d\x2f\x2e\x1b\xc6\xed\xb9\x80\xe3\x54\x11\x36\xb3\xca\xeb\x8c\x40\x73\x89\xd3\x51\xfd\x49\xbc\x06\x7d\x09\xd9\xd8\xb0\x87\xab\x43\xe5\x5c\xa6\x97\x05\x4b\x7a\x24\x2c\x65\xdc\xb9\xcd\x39\x6d\x30\xb5\x25\xc2\x6f\xc4\xe3\x48\x29\xa6\x0b\x89\x08\x9c\xf1\x63\xe3\x06\xa1\xdc\xd4\x22\xf6\xd8\x88\x00\x2c\xb4\x0a\x2b\xe1\xdf\x4c\xc9\xa5\x82\x60\xcc\xcd\xe0\xfa\x6b\x90\x02\x4c\x4c\xa8\x48\x50\x00\x1f\x5c\xb3\x42\x1f\x68\x3e\xc6\x4d\xff\x97\xaf\xbf\x06\x09\xe0\x49\x72\x70\x71\x72\x78\xfc\xf6\x64\x90\xa7\x4b\x8c\x38\x8f\xf5\x05\x61\xb1\x1f\xc3\x46\x22\xd3\x97\x83\x97\x5f\x63\xdc\x9e\x6b\x04\x20\x89\xe0\xbf\xb0\x26\x6d\x11\xfb\xeb\x5c\xa6\x81\x6e\x2e\x6f\xeb\x81\xd1\xc8\xb5\xca\xa0\x27\xd3\x77\xb4\x61\x46\x6d\xdb\x2c\xda\x56\x99\xb3\x1d\x66\xcb\x16\x8a\x59\xf5\x86\x4b\xd1\x24\xce\x5c\xb7\xef\xe6\x86\xf2\xce\x7b\xf7\x97\x15\xc4\xfe\x69\x62\x6c\x65\xb3\x46\x79\x9d\xc9\x1b\xc8\x0d\xe1\x52\x71\x33\x1b\x00\x54\x8f\x1c\x91\x33\x36\x65\xaa\xe7\x47\x7d\x63\x6f\x3a\x0f\xf7\xc4\x06\xc4\xb2\x3b\xa2\xae\x38\xb7\x6d\xd4\x1e\x19\xc7\x69\x08\x67\x52\x9c\x87\xd9\x85\x61\xdc\xce\xeb\x43\xc6\xe4\xa7\x50\xce\x3c\x19\x5a\xac\x03\xa2\x1f\xbb\x17\x70\x8d\x92\x7f\xa2\x8a\xcb\x52\x13\xf4\x89\xc7\x98\x83\x18\x47\x0f\x24\x02\xd5\xcc\x79\xb9\xc2\x20\x21\x3d\xde\x3b\xba\x02\x7d\x0e\xc3\x79\x73\xb4\xfc\x48\xe3\xc6\x2e\xfa\xd4\x3f\x4a\xf9\x7c\x9f\x05\xb8\x42\x3c\xcc\x96\x9e\x5f\xfe\x44\xd6\xf1\x44\x61\x18\x3f\x0f\x38\x1b\xac\xc2\x8f\xa3\x4c\xf8\xd8\x67\x95\xc1\xfb\xa3\xee\x1e\x7d\x1a\x98\xad\xc1\x92\x36\xd9\xf1\x4d\x93\x1b\x8b\xf9\xf7\x6b\xc1\x16\x75\x50\xb7\x18\x17\xce\xa7\x55\x57\x5b\x70\x07\xf9\x04\x0e\xc1\x7e\xa2\xb8\xe1\x09\xcd\x76\xe0\x08\xf3\x5f\x59\xdb\xdb\x30\x15\x7f\xab\x18\x31\x37\x12\x9f\x42\x33\x72\xcd\x66\x37\x52\xa5\x5e\xbf\xf0\x4f\xac\xd6\x42\x1b\xff\x48\xce\x9c\x2c\x40\x48\x2e\x95\x33\x45\x86\xcc\xbb\x11\xe6\x6e\x9e\x0d\xc8\xa1\x98\x39\x1f\xac\x88\x2b\x2d\xbc\x1a\x31\x9c\xa1\x8e\x83\x5a\x60\x8d\x49\xdc\x79\xe8\x9f\x46\xb1\x06\xe6\x36\x13\xdb\x2a\x90\x61\x17\x78\xed\xc5\xdb\xd8\x52\xb9\x54\x6f\xd8\x1d\x0a\x13\xd5\xa5\xff\xfa\x93\x48\x0b\xab\x9f\x71\xc1\xb4\xfe\xc1\x2e\x65\x1b\x75\xbb\xce\x1d\x14\xd4\x2a\x37\x36\xc8\xc9\x2a\xaf\x8a\xd9\x2d\x45\x7d\xcf\x77\x4b\xa1\x70\xe7\x80\x1c\xc2\x07\x90\x18\x68\x35\x47\x28\x25\xb0\x83\x59\x8b\x77\xae\xb7\x21\xde\x71\x78\x76\xec\x13\xb8\x50\xe9\xd0\x75\xcc\x46\x54\xf9\xeb\x33\x01\x4d\xd5\xa5\x11\xb1\xdf\x4a\x0a\xad\xaa\x76\xae\x54\xc9\x76\x9a\xa9\x7a\x88\x06\x7a\xf0\xe7\xaf\x5f\x80\xb6\x17\x9e\x07\x62\xff\x81\x59\xd1\x4d\x03\x85\x8d\x42\x84\xf3\xd1\xd1\x8b\x98\x1f\x3c\xc1\xbd\xdd\xe4\x3c\x77\x50\xe0\x04\xcb\x14\x68\xde\xc8\xbe\x6c\x14\x10\x6c\x1e\x0a\xec\x57\xd3\xbd\x7a\x78\x27\x84\x36\x51\xbc\xda\x73\xbb\x70\xf5\x55\xa3\xe1\xaa\x60\xa3\xe5\xea\x39\x51\xd0\x1e\xf1\x76\xdd\xc7\x90\x13\x04\x82\x0b\x5c\x23\x20\x1e\x67\x45\x8b\xfc\xa7\x06\xf2\x06\xd2\x7d\x5b\xab\x8a\xbb\x17\x38\x10\x29\x2a\xdd\x70\x21\x8d\x33\xb8\xb9\x41\xef\x70\x5a\xe1\x21\xe4\xc4\xf7\xc8\x3b\xf1\x1a\x93\x04\x7b\xa8\x28\xd6\xea\xb9\xf1\xa6\x4e\x6b\x25\x0e\xfe\xe4\xde\xbd\x8f\x53\x6e\x22\x14\x1e\x4e\xee\xc8\xf2\x6d\x79\xfa\xef\x5e\xcc\x8d\x55\x63\xbd\x9a\x65\xef\x4e\x48\x5e\x75\x50\x70\xe2\x93\x8c\x95\x2c\x0b\xef\x4e\xae\xb7\x43\xa8\x20\x84\xd1\x0b\x8a\xbd\xba\x84\xac\x0f\x1d\x9c\x37\xc0\xc0\xac\x42\x21\x4f\x49\x82\xe6\xbd\x3f\x75\x31\x15\x1c\x3d\x20\xaa\x14\xf5\x56\x83\x91\x43\x76\x27\x63\x63\x9a\xcc\x76\xea\xcf\x59\xe6\xfe\xe6\x90\xa1\xcc\x73\x84\x5f\xc4\xe7\x55\x89\x9d\x90\xff\x09\xfa\x03\xee\x35\x50\x0d\x42\x3f\x58\x7f\xe4\xfb\xca\x84\x09\x15\x29\xb8\x79\x1a\x7b\x16\xfe\xfc\xf5\x9f\xfb\x6e\xb4\x3e\x4e\x65\xbe\xc6\xcb\xd5\x6a\x2d\x75\x27\x7c\xd5\xc8\x15\xf0\x60\xfe\x0b\xde\xee\x4e\x55\xcf\xda\x12\x5b\x7d\x8a\xeb\x02\xd8\x01\xfd\x21\xe1\xf4\x0f\x4f\xbf\x4b\x3b\x5b\x3e\x48\xe8\x41\x1f\x86\xf8\x24\xe4\xaa\xe3\x4b\xb7\xd9\xad\xf3\x50\xd5\x13\x99\xa5\xb0\xaf\x9c\x93\xc9\x3f\x8a\x50\x63\x14\x1f\x96\xd0\x2d\x47\xa4\x00\x75\x5a\xaf\x33\x71\x5d\x39\x06\xa4\x2a\x34\x88\x8d\x67\x60\xfc\x01\x21\x97\xcc\xb5\x54\x8e\xe6\x01\x62\xd9\x93\x12\x0c\x29\xe0\x45\x68\xde\x87\x36\xdb\x27\x72\x48\x35\x3f\xbd\x47\x4d\xbb\xf6\xd6\x3b\xd9\x1c\x06\xa3\x46\x97\x85\x43\x3d\xa0\x19\xca\xc3\x85\x1e\x5f\x73\x07\x19\xa4\x60\x81\x44\xbc\x94\x79\x88\xd9\x5a\x5a\x68\x04\xe9\x03\x5e\xf6\xfd\x5c\x8d\x84\xfa\xa6\xb1\x73\xc5\xde\xd8\x21\x26\xbc\x40\x13\x9c\x9a\xf0\x73\x08\x7c\xd8\xaf\xe3\x72\x55\xe8\x90\xf3\x12\x6d\x60\x79\x03\x4e\xf0\x1f\x4e\x8f\xc3\x1e\xb1\x77\xbd\xbe\x04\x82\x90\x2f\x06\xae\x5d\x97\x19\xf3\x94\x0c\x31\xd8\x65\xc5\xeb\x9e\x60\x37\x98\x3e\xe7\xfc\xc4\x41\x0d\x9f\xfa\xb4\x32\x1c\x2d\x3c\xdc\x0d\xb9\x4f\xbe\x74\x9d\x97\x98\xf2\x46\xfc\x90\xbb\xf4\x9a\x77\x17\xbb\xde\x3b\x7f\xd3\x57\x37\xfd\x7e\xbf\x6f\xe7\xea\x85\xfa\x92\x9e\xb6\x76\xbf\xe7\x32\xe5\xa3\xd9\x1c\x25\x2c\x9b\x57\x8f\x00\x8e\xa4\x62\xe6\x66\xd7\xa0\xd5\x4e\x3b\x3f\x5e\x9b\x0a\x54\xc7\x9c\x47\xb0\xde\x4d\xcb\x3c\xea\x72\x63\xc9\x90\xce\x2a\xd6\x64\xc8\x26\x74\xca\x25\x14\xa6\x02\x8f\x41\xc2\xe0\x2d\x74\xf5\x3e\x1f\xb7\xe8\x0e\xeb\x08\x6d\x72\xf6\xb1\x90\x88\xa4\x08\x09\xb9\xd0\x24\x62\x3e\x98\x02\x6e\x6e\xbb\x29\x20\xaf\xa0\xc6\xf4\x4e\x7d\x40\x34\x11\x4f\x04\x32\xa4\x76\xc8\x30\x9d\xbd\xb9\x65\xde\x1f\x90\x53\xc7\x19\x60\xfe\x09\xe9\x5a\x4d\x10\x29\x08\x2b\x26\x2c\x67\x8a\x66\xf5\x07\xb9\xc2\xa4\x57\x56\x5a\x2a\xcb\x64\x18\xb0\xc8\x69\x81\xc2\x12\x64\x5f\xca\x95\xef\x35\xe5\x44\x9c\xe5\xd7\x9d\x77\xd0\xf1\xf9\x2d\xd7\xa0\xa9\x38\xd7\x07\xea\x95\x3b\xcb\xce\x23\xff\x5d\xc8\xf2\x7a\x78\xe5\x50\x0b\x87\x70\x9b\xfe\xe4\x6b\xea\x4c\xbe\xee\xde\xae\x2e\x8e\x4c\x4d\x9b\xf4\xd8\xf5\xc9\x8e\x76\x7d\xc9\xb7\x1d\xc9\x57\xe9\x48\xbe\x6e\x16\x6d\xca\x8f\xcd\x92\xfe\x5a\xb4\x20\xdf\xc8\xe6\xe3\xeb\x5e\xbd\x27\x2e\x60\xda\xb6\x1e\x7f\x78\xd3\xf1\x55\x9a\x05\x3e\x7a\xd7\xf1\x67\xc4\x35\x0d\x2b\x36\xda\x15\x3c\xb4\xe8\x39\xbe\xd6\x6e\xe3\x2d\x13\x7f\x9b\x77\x18\x5f\x6b\x6f\xf1\x96\x6f\xdd\xbc\x5d\xec\x5a\x3b\x89\xb7\x7c\xeb\xe6\xdd\xc3\xd7\xda\x37\xbc\xc5\x5b\xb7\xed\x15\xfe\xa0\x2e\xe1\x6c\xce\x79\x12\x3c\xca\x9f\x56\x0c\xb6\x29\x5a\x6b\xd8\xac\xbb\xa5\xe4\xed\xa4\x41\xf7\xb6\x35\x77\x97\xad\xb9\x37\x43\xbe\x6e\x1b\x71\xb7\x6b\xc4\xdd\x46\x72\x46\xee\x62\xf0\xcf\xb4\xd5\xa4\x0f\x03\x32\x04\x38\x9f\x6b\xdd\xb6\x2b\xf4\x28\x67\x54\xb9\xae\x66\x73\x8a\x6f\x0f\x56\xc7\xe5\x78\x2e\x1c\x2e\x98\x07\x94\x53\x35\x23\x3f\x9c\x1e\xa3\xfe\x5b\x53\xc3\x85\xf4\x8f\x0e\x9c\x92\x3a\x80\x20\x2a\x66\xed\xd5\xd6\x66\x35\xd6\x8d\x2b\xac\xdb\x62\xd7\xb5\xb2\xb1\x66\x3a\x31\x59\x5b\x96\xb8\xc4\x51\x20\x46\x44\x68\xe0\x0f\x41\x73\xa6\x0b\x9a\x58\xe9\xe7\xee\x80\x40\x6d\x54\x3f\x31\xb0\x96\x8b\x0b\x82\x96\xa2\xc2\x77\xf6\xf7\xef\xcd\x1f\xc8\x7e\x4b\xee\xbb\x62\x22\xef\x95\xc9\x68\x29\x92\xc9\x13\x59\xf1\x25\xc4\x0b\x3e\x72\x4a\xae\x99\x12\x2c\xab\x7a\x86\xfa\x1a\x13\xd6\xa4\xf6\xbd\x65\xe9\x7c\xbb\xc2\xf9\x16\x45\xef\xcd\x5b\x00\xb5\x2d\x97\x6f\x53\x84\xbc\xa4\x2f\xca\x08\xcf\x26\x3b\xa5\x99\x6b\x97\xd5\x70\xf0\xd6\x95\xa1\xad\x9a\xfa\xd4\x51\x20\x10\xc2\x76\x23\xde\xcd\x35\xea\xef\xce\x4d\xe4\x5b\x52\x87\x82\x3c\x1f\xc1\x7e\xa8\xab\xc8\x2b\x2c\x8b\x30\x18\xbb\x7a\xc1\x0d\x53\xc7\x0c\x7e\x1a\x6e\xde\xb5\xf8\x77\xc6\xb9\xa6\x47\xca\x4e\xdc\x70\x9a\x5d\x16\x4d\xdb\xf3\xd6\xd6\xfd\x87\xb7\x97\x87\xf5\x41\xad\xf6\x7d\x03\x49\xb5\x96\xa8\xf6\xfb\x28\x35\xfc\x86\x0d\x27\x52\x5e\x93\xbd\x28\xe5\x66\x52\x0e\x07\x89\xcc\xa3\xfc\xae\xbe\xe6\x63\x7d\xe0\xf8\xb3\x6f\xe7\xbd\x4f\xb8\x00\x30\xb6\x45\x10\x3b\xff\x90\x24\xcc\x02\xd6\xd0\xe5\x26\xb9\x63\x70\x71\x9a\x20\x64\x30\x15\x62\x1d\xf6\xc1\xe2\x62\x34\xef\x16\x7f\xcf\x82\xf8\x6a\xda\x18\x73\xe8\x56\xaa\xa1\x39\xbf\x16\x92\x4c\xaa\xb6\xff\x1d\xd0\xe1\x6f\xd5\x68\x31\x76\x08\x1f\xd5\x60\x4d\x2b\x3b\x23\x04\xca\x76\xa1\xbd\x82\xfb\xe9\x6e\xec\x74\xae\x97\xa3\xd0\xac\x98\x84\xc2\x31\x11\xc7\xce\x87\x2c\xae\x12\x8b\x0a\x36\xe6\x0b\xc5\x9c\xc0\x8c\xa6\x7a\x54\xf9\x4f\x7c\x16\xd9\x28\xa3\x63\x80\x67\x9f\xab\xba\x00\xe9\x08\x2d\x88\xad\xed\x10\xdd\xec\x4b\xeb\x3c\xf4\x30\x20\x1f\x6a\x4c\xe8\xf6\x81\x34\x97\x9e\x0f\xf1\xff\x43\x3b\x6f\xdf\x4b\xbd\x96\xeb\x0d\x56\x7e\x28\x2e\xd4\x96\x77\x30\x72\x6f\x6d\xf6\x98\xc0\x28\x3a\xf7\xaa\x9e\xcc\x90\x1d\x83\x02\x1f\x7e\x4f\x49\xce\x3f\xda\xa7\xc4\xbf\x8a\xb3\xca\x5d\x2f\xe4\xe5\x5f\xef\x5b\x5b\xa6\x32\x7c\x7a\x76\x15\xe3\x3b\x23\x58\x60\x01\x5f\x9c\x61\x5a\x38\xbe\x40\x1c\x26\x70\x08\xbf\x6d\xf8\xbb\x39\x2e\x47\x08\xd3\x75\xb4\xd5\x21\x5c\xe7\x86\xb3\x0b\xed\xcf\xdf\x36\xe1\x3b\x7b\x4b\x17\x21\xbc\xc5\x43\x76\xf3\xcf\x66\xd2\x26\x7f\x50\x4d\x79\xc2\x0e\x93\x44\x96\xa2\x55\xfa\xe0\x31\xb3\xaf\x40\x0d\x4b\x2f\x6b\x63\xa2\xbf\x39\x85\x6f\xb1\x62\x9a\x66\x9c\x62\x4d\x7d\xfd\x4e\x2c\xa6\xaa\xc6\x01\x7f\xf5\xdc\x0c\x1d\xcb\x60\xbb\xdd\x4f\x93\x90\xba\xf0\xfc\x76\x49\x96\x8b\x6f\xb3\x78\xc2\xcd\x51\xd0\xb9\xaa\x17\xd2\x9d\x57\xcb\x35\x37\x54\x5f\x57\x48\x03\x0c\xca\x4d\xc2\x66\x8a\x3e\x77\x2f\xda\xa7\xf8\xd4\x46\xe8\x03\x0d\xa8\x6b\xac\xdc\xb3\x2f\x7f\xa8\x5f\xff\xd7\xf1\x59\xbb\x94\xdf\x00\xb2\x8e\x75\x0c\x13\x37\x74\xd0\xb5\xe3\xf2\xf1\xb8\x0c\xcd\x3e\xb9\x47\x14\x75\xf8\xb1\xae\x77\x48\xc6\x28\xfa\x34\xc8\x5e\x94\x91\xbd\x3f\xb0\x32\xbd\x0a\xf5\xa2\xa8\x77\xad\x3e\x72\x46\x85\x8e\x4a\x0d\x19\x0c\xed\xd3\x19\xc3\x7c\xf0\x20\x74\xab\xed\xcc\xff\x3d\xef\xb3\xac\xdf\x81\xad\xff\x49\x69\xb4\xfd\x1c\x1f\xee\x05\xe6\x0a\x8f\x57\x6c\xcc\xb5\x51\x33\xdf\x84\x64\x14\x4d\xc2\x79\x65\xc2\x2d\xd7\x6c\x46\xfe\xf6\xe3\xc9\xdf\xff\xf1\xe6\xdd\xd1\xe1\x9b\x7f\xbc\x3d\x3c\xfa\xdb\xe9\xd9\xc9\x87\x0f\x97\x7f\xbf\xbc\x3a\x79\xfb\xe1\xc3\x51\xa9\x14\x13\xc6\x95\x5d\x5e\x32\xf3\xe1\x83\xe3\x54\xfd\xe1\xc3\x55\x52\xf0\xe2\xc3\x87\x73\xef\xc4\x40\x78\xe1\xff\x3a\x3e\x03\xf9\x89\xd5\x3f\x21\xe5\x06\xce\x56\x24\x3a\xcc\x7b\x42\x75\x95\x5e\x57\xab\xab\x68\x00\x49\xd5\xf4\xb8\xd3\x13\xaa\x98\x3b\x9a\xcf\xbc\x27\xab\xd5\x66\xb7\x03\x56\x7d\x01\xbc\x87\x34\x78\xc9\xc8\x90\x99\x1b\xe6\xca\xd5\xe6\x8f\xb9\x38\x8b\xf7\x67\x6c\x8f\x83\xc9\xfa\xf6\x28\x5a\x82\x3d\x8e\xca\x99\x24\x53\xce\x6e\x10\x1b\x01\xdb\xbc\x54\x00\xf8\x50\xbe\x8a\x25\x8c\xf3\xe1\x2e\xa7\x24\x15\x32\x0d\x60\xff\x73\x6e\xdd\x05\x97\x6e\xad\x5c\x02\x91\x4b\x58\x4a\xce\x4f\x8f\xc9\xcb\x01\x2a\x39\xa7\xc7\x08\xa4\xb4\x8c\xac\x24\x71\x68\x3f\xf6\x40\xc5\xd3\x77\x49\xba\x78\xc5\x00\x4d\x84\x51\x03\x0e\x28\x87\xa9\xcc\xe9\x43\xdb\x7a\xdc\x53\x78\x80\x4d\x97\x7e\x2b\x69\x86\x3a\xc0\xb9\x4c\x17\x25\xd3\xce\x37\xfe\xa3\x6f\x07\xdf\x84\x79\x7c\x3b\xf8\x06\xda\x39\x79\xb2\x7d\x3b\xd0\xd3\x64\xf0\x8d\x2b\x84\x25\xee\xa6\xa5\xd9\xa1\x0b\x55\x2d\x4e\x9f\xc5\xdf\xc0\xb3\x29\xe8\xbb\x9f\xa4\x4e\xa1\xc3\xbe\x58\x1d\x77\xc3\x42\x2d\x10\x6a\x6c\x13\xc5\xa8\x6b\xd7\x9e\xb2\x8c\x99\xa8\xbf\xfd\xda\xdb\x31\xdd\xde\x9f\xca\x87\xaa\x6a\xdd\xbb\x62\xe7\x52\xd0\x97\xfe\xf0\x4d\xbe\x62\x83\xe1\xcb\xaa\x01\x6b\x83\x0d\xd0\xb2\x22\xff\x41\x61\x1b\x23\x33\x86\xeb\xd3\x66\xa7\x2c\x2d\x88\xda\xd5\xf1\xe8\x4d\x08\xb1\x8e\xaa\xe3\x2b\x0f\xc5\x65\x39\xe2\x2a\xcc\x1f\x2c\x0d\x6c\x5e\x83\xb1\x49\xfc\x06\xca\x94\x66\xc4\x9e\x5a\x06\x3d\x19\x71\x25\xa0\x51\xd0\x66\xe7\x9b\x6b\x36\xeb\x21\x70\x03\x2a\x21\xdf\x46\x98\x82\xa1\xf4\x55\x16\x76\x40\xa9\xc8\x37\xfe\xbf\xbe\x7d\xa8\xb5\xd6\xc2\x8f\xda\xc6\x8b\x8a\x2f\xd5\x3a\x74\x75\x82\xf5\x0f\x75\x24\x07\xa4\xac\x2b\x8d\x30\x12\xc9\x35\x20\x27\x50\xdf\x88\x1a\xa9\xc3\x55\xcb\xb2\xda\xcd\xda\xf7\x48\xaa\xa1\x00\x80\xff\x25\xaa\x8b\x38\x93\x97\xae\xa4\x0e\x90\x59\x46\x4c\x55\x9f\x80\x80\x39\x93\x27\x1f\x59\x52\x3e\x14\x2d\x05\xaf\x56\xbe\xbf\x6b\xd6\xbe\x6b\xc5\x8f\x2c\xa0\xd6\x20\x6d\xac\x16\x1e\xb2\xe2\xab\xdd\x19\xa5\x66\xdd\x4d\xdb\x6b\x36\xd3\x01\x0c\xec\x1a\x47\x77\xd5\xab\x81\x7f\xfd\x41\x76\xf2\x91\x6b\xa3\xff\x8f\x6f\x99\x91\x0f\xab\x66\x25\x14\x73\xa4\xaa\xd1\xfd\x92\x08\xe8\xa5\x81\x8f\xf9\xd4\x04\xf7\x2f\xd0\x9a\xea\xef\x3c\x25\x22\xa8\x37\x6a\xdf\x69\x57\xbb\xec\x1e\x29\xa0\x44\x29\xc6\x0c\xab\xf2\x52\xf0\xc7\xc8\x9f\x48\x43\xa0\xcb\x89\x55\xf2\xea\xc7\x8c\xfb\xc8\xdd\xc4\x01\x3d\x82\x4f\x69\xc6\xd0\xae\xbf\xe1\x59\x9a\x50\x85\x21\x72\x07\x1c\xa3\x1d\x94\xa3\x43\x4c\xb0\x67\x9c\x93\x64\xd5\x2a\x6b\x17\x8b\xa3\xca\xf0\xa4\xcc\xa8\x22\x76\x3f\x8e\xa5\x7a\x20\xbe\x0c\x5e\xed\x5a\xb7\x04\x16\x6d\xd1\xd1\xb0\x2e\xdf\xe7\x47\x9c\x07\xe4\x73\xda\x8b\x35\x99\xa0\xb6\xa3\xbe\x51\xf6\xea\x50\x90\x72\xe4\x65\x53\x10\x14\x31\xa4\x9b\xa9\x39\xc7\xf9\x18\xfc\xdf\xfb\xd1\xe1\x11\x76\xe6\x80\x7c\x1f\xca\x7c\x7b\xa4\xf2\x19\x43\x31\xa1\x7b\xa6\xdb\x36\x6e\xb9\xaa\x4d\x3d\x92\x0a\xfa\xf0\xec\xa5\x12\x7e\xc3\xa6\x3c\x31\xfb\x03\xf2\xff\x5a\x4d\x11\x9c\xc8\x5e\x9d\x74\xdb\x2c\x14\x50\x56\xc0\x72\x2f\xc8\x1e\xfc\x2c\x56\x25\xf7\x7d\xa0\xc8\x75\x1e\x78\x62\xd9\x28\x2d\x42\xd4\x4b\xc2\xd3\x35\x31\x8a\x9a\xe2\x1c\x6b\x84\x93\x5f\x06\x09\x19\x64\x22\xd7\x6e\x97\xd6\x3c\xb7\x21\xce\xe2\x45\x68\x60\x9c\x7f\x81\x8f\x9e\x28\x36\x86\xfd\x87\xbb\xe7\x13\xee\x3e\x23\x0b\x99\xc9\xf1\xec\xb2\x50\x8c\xa6\x47\x52\x68\xa3\x40\x34\xb4\xc1\xf1\xba\x6d\xcc\xa8\xf5\xc3\x44\xde\x10\xea\xea\x90\xe5\x08\x41\xd5\x64\x39\x9e\x20\xd8\x2d\xfc\xd0\xb7\x49\xf3\x53\x74\x46\xa7\x1e\x90\xcb\x00\x66\x0b\x0c\x1e\xb0\x71\x61\x14\x70\x78\xdc\xd0\x99\xdb\x4c\x74\x08\xdd\x72\xab\x84\x20\x3f\x19\x0c\xfd\xdc\xfa\xfe\x20\x95\x0f\xcf\x8e\x1f\x8a\x20\xbc\x46\x85\xf6\x96\x57\x89\x7a\xe7\x43\x0b\xb5\x40\xdf\xa0\x91\x02\xdd\x68\x2e\x9d\xa6\x8a\x98\xa3\x9e\x32\x9f\x50\x37\x6d\x03\xb2\x93\xd3\x8f\x97\xd7\xec\xa6\xc1\x2f\xfd\x8b\xfe\xc8\x1e\x9e\xcb\xd5\x07\x7b\xf4\xbd\xd0\xd4\x70\x3d\x02\xa8\xf1\x4f\xa8\x8f\x43\xca\x7d\x33\x44\x64\xbc\xea\x95\x2b\xf1\x68\xa1\x5b\xb2\xc7\xd5\xab\x31\x8b\xcb\xbf\xab\xec\x20\x3c\x00\xb1\x04\x20\x80\x29\xdb\x1d\x94\xb8\x06\x03\x46\x56\x71\x68\x8c\x54\x84\x5e\xc3\x7e\xd7\x9a\x09\xe3\x6a\x0e\x42\x75\x6e\xef\x37\x17\x8c\x8d\x53\xd9\xda\xe6\x85\x01\x79\x4e\x3e\x5a\xcd\x43\x37\xcb\x34\xc2\xab\xde\x1f\x64\x6e\x50\x0c\x8f\xf9\x04\xca\xb9\x65\xa8\xe1\x74\x83\xd9\x1b\x7f\xd2\x54\xce\x55\x57\xbb\x0e\x43\xa4\x5d\x97\x21\xb2\x24\xcf\xf8\xd6\xd7\x9f\x03\xfb\x8e\xab\xd5\x9c\x53\x48\xf7\x50\x81\x47\x07\x36\x15\xd5\xc1\xee\x1a\xbf\x66\x41\x9b\xb3\x46\x91\xbd\x09\x7f\xd7\x16\xca\xbf\x45\x97\x22\xd2\x41\xa7\x22\x02\xb2\xec\xba\x81\x04\x8c\x7f\xef\x89\xd5\x78\x90\xf6\x3d\x8b\x48\x73\x83\xba\xba\x6a\x0c\x75\x5d\x99\xd6\xc8\x59\x35\xd3\xba\x12\x76\x95\x61\xdd\xea\xd9\x1d\x34\xf2\x20\x2d\x6d\xdc\xea\xaa\x11\x42\x3e\xc0\xda\xa5\x10\x60\x92\x23\xbf\x3b\x96\xda\xbc\xa7\xa2\x47\xce\xa4\xb1\xff\x44\xe6\xef\xb1\x64\xfa\x4c\x1a\xf8\x64\x23\x48\x89\xaf\xd0\x21\x21\x9d\x71\x86\xb8\x5e\x20\x37\x5d\x88\xd6\x9e\x78\x9e\x60\x4b\x0c\x8b\x53\x41\xa4\xf2\x14\x0b\xd6\x85\x76\x43\xc4\x61\x05\x07\x8e\x74\xab\x71\x62\xc7\x89\xe9\x7c\xc7\x70\x6e\x28\xc8\xfe\xc2\x6f\x00\x24\xb3\xc8\x20\x41\x3f\x2d\x15\x62\x95\x5a\x5d\xd3\xb0\x31\x4f\x48\xce\xd4\x18\x1a\x1f\x36\xc9\xab\x8f\xaf\xf6\xe7\x0a\x5e\x2d\x4f\x97\x78\x32\x2d\x78\x09\x8e\x6c\x50\xb1\x3a\x54\x01\x70\x3c\x3c\xd6\x72\x0a\x96\xd4\xff\x04\x1f\xf4\xff\x92\x82\x72\x05\xd8\xa6\x2e\x76\x1c\x7f\xe7\xa2\x2f\xf1\x30\x76\x84\x05\xdf\x12\x15\x84\x61\x21\x90\x1d\x7d\x5e\xf1\xe8\x91\x9b\x89\xd4\x78\x18\x06\xf7\xc7\xce\x35\x9b\xed\xf4\x16\x58\x6f\xe7\x54\xec\x54\x81\xe1\x1a\xb3\x85\x43\x18\x32\x08\x77\xe0\xbb\x9d\xc7\xd3\x55\x5a\x1d\xb6\x5d\x80\xcc\xcf\x4f\xa8\x21\x5f\x39\x9b\xa7\x7d\x2f\xf7\xb7\x38\x50\x64\x9f\x63\x4c\x70\xac\x58\xd4\xc7\x1d\x14\xf5\x1c\xe3\x9c\xa5\x60\x53\x66\x17\x2b\xe5\xda\x01\xb9\xf9\x14\x83\x7f\x2e\x98\x44\xff\xff\x63\x79\x26\x8d\xb7\xda\xff\xe9\xdd\x5e\xc8\x7f\x1f\x79\x5e\xe6\x88\x98\x64\xac\xa5\x90\xf2\x91\x07\x7c\xf5\x99\x0d\x75\x7b\xa1\x6e\xb6\x3a\x3e\x36\x54\x8d\x21\xc3\xd1\xd9\x0b\x9e\xcd\xc6\x99\x1c\xd2\x8c\xe4\x5c\xd8\xc7\x0c\xc8\x6b\xa9\x08\xfb\x48\xf3\x22\x63\x58\x4e\x46\xbe\xec\xff\x5b\x0a\x46\x5c\x34\xbc\x47\x3c\x2d\x5c\x92\x84\x91\xe4\x25\x72\x6d\x05\xfc\x1e\x52\x1d\x6a\x06\x58\x70\x5b\x68\xf2\xf2\xe0\xe5\xc1\x8b\x57\xe4\x77\x62\x87\x7e\xe9\xfe\xfd\xc2\xfd\xfb\x25\xf9\x9d\xfc\x4e\x08\x39\x27\xa4\xf6\x2f\x81\x7f\xfb\x84\x8f\xe2\x39\xbc\xb4\xd3\x4c\x64\xee\x5e\x18\x3c\xb9\xa1\xea\x33\xf4\x8f\x31\xd2\x0d\x0d\x45\x3f\x89\xcc\x19\xcc\xe1\xe5\xff\xf1\xf7\x40\xc0\xd5\x60\x8b\x1f\x98\xd4\x1e\x4c\x69\x9f\xdc\x80\x6b\x2a\xa7\xd7\x68\x96\x1d\x26\xa6\xa4\x99\x7d\xf8\xde\x17\xfd\x17\xfb\x44\x8a\xfa\xed\x53\x2e\xa1\x35\xba\x9b\xe1\xde\xcb\xfd\xc1\xc2\x94\xbf\x58\x32\xe5\xb9\x6e\x37\xae\xe6\xce\x0e\x7a\x3b\xd7\x78\x86\x39\x14\xb3\x1b\x3a\x0b\x6c\xe3\xcd\xd2\x31\x9f\x06\x6c\xf4\x08\x87\x02\x62\x76\xc0\x05\xdc\x23\x03\xe1\xa0\x33\xc2\xcd\x80\x9c\x9a\xdd\x5d\xdf\x5b\xc9\x6a\xcc\x1e\xc4\xfd\x38\x86\x0b\x04\xc2\xc3\xa2\xbf\x98\xcb\xe9\x6d\xd1\x58\xbf\x13\xe7\xe8\x83\x50\xd8\xdd\xd3\x2b\xff\x46\x07\x4e\xf5\x30\x96\xdf\xc1\x56\xf4\xcb\x11\xd6\xc9\x62\xa7\xa3\x01\xb4\xb1\x72\xb4\x77\x09\x23\xa8\x3a\xbb\xdd\xc3\x75\xb0\x9e\x38\xe4\xdf\x27\x34\x8b\x83\x75\x89\x04\x80\x36\xc5\x7c\xa3\xa4\x38\xbd\x28\xf8\xa5\xc8\xcf\xd5\x9d\x98\x56\x04\xf1\x57\x1c\xe8\x5b\x4c\x67\xdf\x19\x96\xc9\x35\x33\xfe\xdc\x51\x90\x11\x51\x94\x86\x0c\x69\x46\x85\xd5\x60\x16\xfc\x10\x46\xe2\x60\xf8\x4b\x60\x98\x25\xfc\xf2\xa9\xe3\x23\x0b\xbb\xa3\xbd\xd0\xff\x79\x7e\xc8\x28\x22\xeb\x1c\x85\x29\xa3\x99\x4f\xa5\x00\x7c\xf4\x00\x58\x25\x76\x77\xab\x7d\x05\x6b\x83\xc2\xaf\x72\xb0\x5a\xb9\x50\x93\xfb\x64\xcf\xe7\x3e\x12\xc3\xb2\x0c\xb9\xa7\xea\x4b\x66\x37\x59\xdc\xe8\x8c\xc3\x08\x75\x19\xb0\xf4\x87\xf5\xee\x68\x18\xd4\xb7\x92\x5d\xcc\x42\xb5\x7c\x8f\x10\x68\x0d\x38\xe6\x53\x2b\x94\x56\x12\x1a\x28\x18\x27\x2c\x2b\x88\x62\x69\x99\xe0\xe0\x84\xe8\x6b\x76\x63\x75\xaa\xea\x4d\x5d\x4b\x21\xcf\xb2\x3b\x35\xa2\xee\x20\x46\xb4\xa8\x8b\x44\x3e\x02\x86\xf4\x1d\x37\xd9\x94\xa9\x19\x29\xa4\xd6\xdc\xae\x03\xec\x25\xc8\x86\x03\xbd\x2b\x20\xeb\x40\x26\x16\x4c\xcb\x8b\xe1\x1d\x27\x76\x77\xac\xa0\xd6\xb2\xb6\x3d\x3e\xcd\x51\xf7\xa5\x3d\x66\xee\x3e\xea\xce\xe1\x7f\x8b\x47\xde\xe9\x88\x2c\xe1\xc1\x30\x97\x1a\xf3\x3c\xe4\x14\xfc\x02\x0e\xab\x2f\xf7\xa3\xc3\xf0\xcb\x83\x2f\x0e\x5e\xee\xd9\xb9\x7e\xb1\x6f\x67\x5d\x3b\xe6\x5e\x86\x63\x2e\xfc\xd2\xcd\x88\xe9\xda\x41\x67\x0d\x30\x6c\xa0\x2b\x55\xea\x22\x3c\x3e\x8b\xce\xce\x48\x1b\x17\x6f\xe3\xb9\x97\x2f\x3d\xe0\xbb\x8a\x59\x6f\x24\xec\x1c\x38\x6f\xb9\x21\x9f\xe5\x52\xb1\xcf\xa2\xfb\x6f\x3d\xa0\x9a\x9f\x3b\x6d\xfb\xa9\x65\x5c\x1b\x68\xaa\x76\xcd\x66\x0f\xd6\x74\xdb\xb8\xd7\xdb\x3a\xd7\x17\xdf\x02\x09\x92\xd3\xe2\x01\xe3\xb8\xbe\xed\x6d\x52\x78\xdf\x38\xc7\x6c\x68\x01\x0f\x8e\x47\xd4\x8a\x5c\x5f\x53\xac\x95\x0a\xf9\xb4\x43\x96\x49\xc4\x39\x75\xa9\x03\x0f\x48\xd5\x0f\xb0\xf0\xda\x48\x45\xc7\xec\xc0\x3d\xf6\xa9\xb4\x83\x70\x5d\xe0\x6b\x5e\x26\x2c\x67\x74\x20\xa9\x3e\xa5\xd9\xc7\x1f\x40\x0a\xd0\x04\xb2\x01\x81\x90\x35\x38\x87\x28\xcf\xf0\x89\x84\xb2\x1a\x54\xbf\xb7\x71\x9c\xd2\x1b\x7d\x92\x51\x6d\x78\xf2\x7d\x26\x93\xeb\x4b\x23\x55\x07\xda\xc5\xe1\xcf\x97\x0b\xa3\xd6\xd6\x54\x90\xc3\x9f\x2f\xc9\x31\xd7\xd7\x15\xba\x3e\xa2\x6a\xd6\x13\xf0\x68\x00\xc6\x71\xb5\x18\x24\xa7\xd6\xfe\x63\xde\xc6\x13\x01\xd7\xb7\xbb\xbd\xf2\x27\x7a\xa3\x19\x4e\x7f\x68\xa7\x6f\xbf\x66\xcd\x45\xf0\xda\x80\x14\xf0\x75\x4e\x8f\xd7\x10\xf8\x1a\xe9\xa6\x6d\x47\xc8\x02\x33\xbd\xe6\x19\x73\x1d\xc0\x00\x12\xa8\x8e\xf1\x0c\x5c\x33\x93\x25\xb9\xa1\xe8\xb3\x02\x99\x3a\x20\x57\xbc\x78\x45\x4e\x22\xbc\x56\x2c\x48\xa8\x0f\x65\xf5\x8d\x80\x1f\xe2\xb2\x04\x80\xcb\xd0\x75\x65\x45\xb0\xcb\x8a\x21\x27\xa8\x4c\xe9\x57\x64\x87\x7d\x34\x5f\xed\xf4\xc8\xce\xc7\x91\xb6\xff\x08\x33\x02\x74\x65\xd7\xa3\xc1\x2a\x75\x62\xc4\x54\x65\xc0\xe0\x0f\x16\x4b\x07\xbb\x67\x52\x72\xf5\xee\xf8\xdd\x2b\x50\xe0\x53\x49\x6e\x98\xef\x62\xe6\x0b\x61\x9d\x34\x8c\xc8\x00\x15\x1d\x89\xcc\x0b\x25\x73\x1e\xa5\xab\xc2\x26\x6b\xc2\xf3\xa4\x0b\x7f\x29\x24\xa5\xc1\xf2\x77\xc2\x41\x90\xed\xeb\x87\x9c\x03\x86\xbf\x8d\x7f\x4e\x47\x44\xa2\x53\xaa\x9e\x23\xcf\x75\xb8\xc9\x72\x8c\x1b\x05\xdb\x71\x55\x3c\x62\xd5\x6f\xf7\xd5\x41\xca\xa6\x07\x3a\xa5\x2f\x7b\xf0\x18\x64\x00\x07\x7e\x1f\xe6\x44\x35\xd9\x79\xb9\x33\x20\x97\xbe\xaf\x79\x2f\x9e\x63\x75\x9f\xb5\x06\xfc\x80\xe0\x56\x7d\xb1\x43\xf6\x30\x49\x1d\x74\x8a\x8c\xf9\x92\xe5\x80\xb1\x01\x3e\xfc\xfd\x46\x2a\x24\xe9\xc0\x7d\x41\x5a\xbb\x30\x88\x6b\x19\xf6\x4e\x64\x8d\x43\x7b\x73\x55\x55\x6e\x0d\x76\x0c\x74\xdf\x32\x12\x2a\x08\x98\xeb\x07\x8b\xa2\xe2\xc2\x3d\xb1\x22\x24\x17\x4e\x3b\x79\x6b\x17\x1f\xbb\xc0\xc3\x00\x77\x32\xcb\x0e\x54\x1f\xed\x6c\xcc\x99\x44\x3a\xa8\xe6\x26\xe1\x68\xe9\x66\x3d\xde\x0b\xfe\x5b\xc9\xc8\xe9\x71\xe8\xd9\xc8\x94\xe6\xda\x58\xc9\x95\xd6\x74\x04\x8e\x8a\xc3\xde\x61\x4e\xff\x2d\x05\x39\xf9\xfe\xd2\x4d\x65\x7f\x03\x09\xdc\x50\x00\xd2\x7f\x97\x8a\x59\xd5\xa8\xb5\x1e\x76\xe8\x47\x9a\xd7\xbd\xec\xe7\xe4\x98\x1a\x8a\x2a\x18\x4a\x33\x59\x55\x98\xc2\x4e\x18\x42\xe6\x8f\x2f\x1f\x6e\xa8\x45\x93\xf5\xab\x41\x96\x83\xce\x9a\x63\x4a\xd9\x9f\xbf\xbf\x38\x5d\x83\x12\x95\xc0\x29\x3c\x7e\x2b\xd3\x8e\x34\x29\x80\xf7\x38\xc2\x51\x49\x6e\x87\x25\x67\x52\xb0\x1e\x08\x3b\x62\xa5\x9d\xfb\xcf\x9f\x15\x37\x0f\xad\x98\xac\xae\xd6\xc7\xbf\x5f\xb1\x4e\xde\xda\x1e\xfe\x67\x51\x65\x3c\xc0\x38\x80\x54\x71\x8a\xc0\x30\x93\x43\xe2\xa4\xc1\x3a\xdf\xf8\xfd\xc5\x69\x67\x2f\xfc\xfe\xe2\x74\x73\x5f\xb6\x43\xe3\x60\xde\x36\xa8\xf4\xb7\x0a\x7b\x75\x5e\xe9\x5f\x5d\xe3\x1f\x74\xa5\xeb\xaf\x8b\xd2\xd7\x5c\x34\xce\x0a\xab\x8b\x8e\x13\x5f\x1f\xe9\x22\x35\x50\x92\x9d\xbe\x22\x79\x99\x19\x28\x7f\x03\xc6\xb2\x9c\xa6\xed\xe9\xed\x59\x8c\x38\x28\x08\x42\x8e\x19\x86\x17\xd2\x57\x3e\x21\x21\xfc\x62\xf9\x0f\xde\x52\x41\xc7\xf6\x76\x38\x0f\x49\x8e\x7f\x46\x1c\xbd\x87\x0e\x74\x11\xbe\xa2\x53\xca\x33\x3a\xe4\x19\x37\xd0\xfe\x7f\x7f\xe0\x15\x31\x8d\xb5\xb0\x76\xca\x6b\x13\x6a\x9d\xaa\xb0\x71\x7d\x10\x28\x98\x64\xcf\x8e\x7f\x70\x63\x05\xf7\xfe\xa0\xd2\x5e\x01\x8d\x0c\x12\xe5\x51\xc5\xad\xa9\xb6\x1e\xe5\x61\x4e\xb3\x6d\xc7\xae\x4d\xd5\x4a\x58\xe6\xd7\x0d\x21\xa0\x17\xd5\x1e\x3b\xd2\x52\xb5\x07\xbe\x70\xa0\x13\xcf\x5c\xf3\xc1\x0e\x52\x2d\x74\x1f\xd8\x32\x0d\x7f\xdf\x56\xfb\xd9\xee\x97\xfb\xaf\x6a\x81\x3b\xa1\x52\x0c\x22\x84\x43\xcf\xa5\x49\xe3\x0e\xba\x74\xa2\xda\x83\x0b\x81\x76\x65\xf7\x4d\x93\x22\x0a\xbc\x5a\x4b\xd7\xc0\xa9\x9d\x10\x02\x61\x57\x1a\x6f\x9c\x96\xef\x93\xb0\x62\x32\x6a\x5f\x03\x79\xc4\x8a\xc9\xeb\xcb\x7a\x28\xc5\x7e\x46\x5e\x5f\x2e\x91\x7b\x98\x2b\x63\xdf\x5b\x63\x80\x65\x57\x93\x8c\x8f\x98\xe1\x8d\x88\xb0\x66\xc9\x97\x4b\xc1\x8d\x54\x7a\x1d\x35\x1f\xee\xd1\xdd\xe8\x5d\x17\x9e\x10\xe4\xad\x1b\x17\x13\x3e\x13\x99\x65\x2c\x31\xae\xe7\x21\x2c\xab\x7f\xf0\x32\x47\x88\x4b\x05\xd0\xbe\xc7\xaf\x73\x7a\x1c\x20\xab\x1d\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x9f\x26\xf2\xa6\x6f\x64\xbf\xd4\xac\xcf\x4d\x3b\x5d\x69\x8d\x45\x21\x1d\x38\xa0\xcd\xa4\x9b\x05\xac\x10\x89\xde\xeb\x0a\x33\xcc\x07\x7e\x95\x94\x66\x11\x35\x6c\x54\x66\x19\xae\xa9\x51\x8c\xf5\x62\x77\xe2\x03\x31\xd5\xaa\x6b\xb3\xf4\xd7\xdd\xe5\x7d\x7d\xbb\x3f\x9a\x37\x65\x33\xb4\x3f\xe5\x9b\xaa\xc6\xe4\x0e\xda\x5f\x86\x91\x7d\x42\x9f\x65\x7c\xbb\x12\xd7\x6c\x46\x20\xbb\x7f\x24\x15\x20\x6d\xd6\xb9\x90\x99\x04\xc8\x75\x00\x2d\x15\x9d\xae\xb0\x21\xa4\x6e\xa3\x45\xc0\x8b\x5c\xb0\xd1\xe3\x10\xfa\x82\x8d\xb0\x80\xc2\xe7\x38\x3b\xeb\x82\x96\x66\x82\x99\x90\x88\x7c\x84\xe4\x5c\x4a\x79\x57\x91\xb1\x21\xa4\x6e\x95\x4b\xdf\x45\xbd\x57\x1b\xe0\x7d\xb2\xb0\x5e\xb1\x9b\xd0\x2d\x92\x79\x70\x5c\x41\x4e\xad\x6d\xc9\x6e\x0e\x6e\xa4\xba\xe6\x62\xdc\xbf\xe1\x66\xd2\x47\x4a\xe9\x03\xc0\x61\x3b\xf8\x13\xfc\xe3\xa2\xb5\x87\x69\xea\x32\xcb\x4a\xcd\x46\x65\x86\x39\x5f\x7a\x40\x68\xc1\x7f\x62\x4a\x43\x0a\xe3\x35\x17\x69\x8f\x94\x3c\xfd\xae\xe9\x8a\x91\x2e\x36\x48\xf3\x2e\x62\x77\x9e\x8b\xca\x8b\x1f\x45\x53\xa9\x11\x85\xd7\x92\xa8\xc6\xfa\x34\xcd\xb9\xd8\x14\xce\x6f\xaa\xda\x73\x91\x36\xa3\x60\x9d\x7a\x47\x30\x4e\x5d\xb7\xc7\xb1\x7d\xcc\x38\x64\xd1\x50\xef\xcb\xc0\x2e\x55\x2e\x9f\xa6\x9e\x4d\xb3\x92\x40\xc9\x67\xfa\xb7\xac\x8f\x4f\xe9\x17\x69\x45\xd7\x6d\x6a\xcc\x43\xae\xc7\x4c\x8d\xe9\xd6\xfd\xfd\x09\x12\x5e\x1e\x95\xc7\xc8\x56\xed\x5d\x03\xad\xdb\x6b\xba\x8f\xa0\x7f\x01\x0e\xbc\xf6\xc5\xc9\xa0\x5e\xa1\xec\xf1\xbe\x2d\xec\xcc\x17\x80\x87\x7d\x99\x51\x22\x85\x70\x98\x74\xef\x0a\x26\x2e\x0d\x4d\xae\x5b\xc6\x45\xb7\x3a\xd3\x1f\x4c\x67\xea\x36\x57\xc6\xa7\x41\xa7\x81\x47\xb1\x8a\xca\xa5\x94\x55\x59\xd2\xb8\xb1\x9f\xa0\xd4\x45\x84\xf5\xb7\xb4\x68\xef\x01\xf5\x23\xcd\x29\x4a\xe1\x63\xe7\xf4\x84\xaa\x9a\x42\x16\x65\x86\x90\x6b\x5c\x3b\x3a\x7e\x7a\xc5\xa6\xed\x06\x77\xfa\x72\x77\x39\x23\x95\x0c\xcd\x65\xca\xc8\x90\x9b\x4a\x3a\x6a\x66\xb0\x76\xd7\x01\xd1\x48\x41\x12\x07\x36\x07\x5a\x87\xd5\x30\xdc\x84\x22\x8d\x44\x10\x99\x18\x5f\xf3\x17\xca\x7c\x5f\xbc\x78\xf1\x02\x8b\x2e\xff\xfa\xd7\xbf\x12\xa9\xa0\xe3\x43\xc2\xf3\xc5\x1b\xe1\xae\x3f\xbf\x7c\x39\x20\x7f\x3f\x7c\xfb\x06\x72\xff\x0b\xa3\x11\x07\x1c\x47\xb6\x37\xd4\x7e\xac\x7b\xe4\xff\x5e\xbe\x3b\xf3\x6a\xa3\x9e\xfb\x16\x4c\xed\xf0\x7a\x75\xf4\xc5\x17\x7f\xf9\xea\xab\x01\x39\xe6\x0a\x6a\x9f\x38\x0b\xad\xb9\x82\xb7\x84\x2a\x86\x45\xa2\x00\x11\xe8\xf5\x2a\x1e\x40\xf4\x1d\x7e\x02\xf6\x1e\xc4\x7a\x46\xcb\x81\x19\x4f\x0c\x96\x59\xa1\x20\x0b\x5d\x85\x01\xb8\xd1\x41\xa1\xba\x64\x5d\x98\x5c\x8f\x64\xfc\x9a\x91\x91\x86\x96\x9c\x55\x31\xbd\x6b\x77\xe3\x4a\x4a\x70\xb0\x6a\xad\x34\x33\x4f\x3c\xf7\xb3\x95\x2f\x78\x1e\xc0\xb8\xd6\x70\x0d\x4a\x3d\xaf\xd9\xac\x8f\x1c\x56\x50\x1e\x0a\x46\x20\x39\xae\xd6\x63\x21\x78\x6d\xd2\x48\xae\x78\x8c\xc5\x42\xc9\x7f\xe1\xe2\x43\x0d\x69\x24\x89\xa1\x12\x15\x5b\xd4\x02\x58\x82\x88\x1a\x76\xf8\x3a\x58\xd7\xd4\xcb\x7f\xec\x90\x42\x17\xe1\x96\x33\xae\xed\x23\xae\xd9\x4c\xdf\xf5\xe4\xaa\x57\x8c\xe5\x4f\x8d\x9c\x52\x8a\x85\x5f\x3b\xe4\x7d\x27\x19\x5d\x93\x05\x87\x78\x53\x8d\x81\xe5\xff\xae\x10\xda\xdd\xeb\xa9\x14\x08\x51\x4b\x57\xd6\xcc\x94\x8e\x34\x90\x77\x6e\x9f\x0d\x0d\x00\xe0\x0d\x73\xaa\xae\x99\xef\xcc\x4b\xb3\x01\x39\xb7\x93\x0c\x90\x23\xa1\x31\x32\xd8\xad\x74\x06\x8f\x75\x4a\x1a\x3c\x64\x77\x30\xd8\xc5\x8d\x27\x15\xd1\x86\x2a\xb7\x8b\xec\xe7\xcf\x03\xc5\xea\x2d\x2d\x34\xa2\xaa\x58\xad\x14\x10\x87\x24\x20\xb5\x9a\x49\xd5\x17\x10\x69\xbd\x45\x9e\x22\x7d\x20\x4c\xe3\x01\x36\x11\x75\xea\xca\xc9\x06\x23\xfd\xf6\xde\x08\x2c\xa4\xbc\x85\x52\x81\x57\x2b\xd5\xc2\xc1\xec\x66\xec\x49\xe9\x12\xcb\xdb\x6a\x38\x49\x19\x69\x6b\x73\xcd\x3c\x9f\xaa\xca\x80\x57\x17\x8a\x03\x5e\xed\xd5\x07\xbc\xda\x04\x74\xf1\x5a\xd8\xa1\xe1\xa4\xc2\xc3\x68\x54\x91\x1e\x40\xcf\x8b\x70\xc4\x1b\x89\x1d\x42\x7c\xa7\x1b\x41\xe8\x50\xcb\xac\x34\xf8\xd3\xea\xcb\xf8\x98\x83\x41\x3d\xf8\x12\x9c\x6d\xe1\xb6\xe8\xd0\x83\xe3\x1e\xcf\x89\x36\xe7\x1f\x5e\xad\xc5\x44\x67\x6d\x90\x9f\xb7\x57\xa1\x35\x9d\xbd\xee\xd4\x4d\xae\x93\x2b\x86\xba\x99\x30\x97\x85\x10\xe9\x75\x56\x78\x5a\x91\x00\x4a\xa3\x57\xd1\xb0\xed\x78\xba\x16\x2f\x61\xa2\x79\x7b\xb7\xc0\xe5\x29\xd9\x0b\xed\x46\x43\x3a\xdb\xa9\x30\x4c\x8d\x68\xc2\xf6\x63\x77\x01\x2b\x26\x2c\x67\x8a\x66\x21\x43\xd9\xd7\x29\x4f\xa8\x48\x33\x57\xbc\xcf\x14\x6c\x5c\xf6\xd1\x30\x25\x68\x06\x8f\x48\x15\x9f\x32\xa5\xc9\xde\xf7\xcc\xda\x12\xd8\xa6\x74\xff\x09\xa6\x91\xe2\x8b\xac\xc3\x99\x01\x0f\xee\x26\x01\x14\x86\x5a\xd6\x29\xb1\x5a\x2a\x8f\x59\x64\x97\x55\xc7\x6e\xa0\x81\xdd\x10\x70\x62\x82\xd0\x85\x8e\x40\x18\x8d\xf4\x0d\xf0\x00\xb8\x38\x31\x38\x30\xd5\xae\x21\x1e\x20\xc2\x38\x79\xee\xa0\x42\xd6\x56\x0a\xf0\x49\x8a\x2e\xee\x2a\x99\x18\x39\x03\x52\x4e\x79\xea\xd5\x20\xc8\x66\xa8\x50\xb7\x0a\xaa\xa3\x4a\x7e\xaa\xb5\x74\xfd\x3e\xa3\x35\x42\x73\x14\x94\xa5\x3a\xa6\xb4\x8f\x14\xc7\xf1\x2e\x09\xc8\xac\x8d\x1a\x5a\x90\x4e\x0e\x44\x99\xb2\xf3\x72\x98\x71\x3d\xb9\xec\x34\xb4\x71\xb6\x64\x60\x4c\x0c\x5c\x48\x2e\xb9\x35\xdc\xa1\x99\xd0\xdc\xf5\x1f\x43\x35\x8b\x5b\x2d\x5b\xc2\x32\xf8\x5f\xc7\xbb\x43\x42\xa1\x38\x74\x35\xf3\x5f\x45\xf3\x70\xc8\x1d\xd8\x4e\x27\x65\xef\x45\x51\xfb\x3c\xa1\x59\xa6\xe7\x1b\x49\xfb\x83\x0c\x35\x53\x8f\xe6\x81\x5c\xc1\x2d\xc3\xf8\xd9\x43\xd6\x0c\x4a\xb1\x80\x6c\xba\xf4\xc5\x34\xc9\x25\x56\xfc\x0b\x22\x85\xbf\x09\xba\x02\xf9\x1f\x04\x0a\x21\xde\x18\x32\xdd\x1a\x31\x25\xb7\x31\x9d\xa7\x17\xd3\xe9\x34\x2a\x7c\x19\x5a\x34\x50\x18\xb8\x0f\x85\x4d\xbe\xd1\x2c\x0d\x85\xff\x95\xe1\x38\xb8\x2f\x7c\xbc\xb6\x08\x2e\xce\xef\xd0\x38\x58\xd0\x6e\xfc\xb6\x3f\xcd\x0d\x0a\xaa\x98\xb5\xbc\x41\x30\xf5\x9d\x6d\x9d\x44\x3b\xc9\x99\xc4\x61\x7b\x2f\x8a\xb3\xea\x4c\x87\xe3\x1c\x3f\xdc\xd5\x24\x95\x49\x69\x6d\xae\x8a\xec\x55\xc2\x44\x3b\xb4\xf7\xe7\x05\x3f\x9b\xca\x1b\x71\x43\x55\x7a\x78\xde\xa8\x6a\xb5\xae\x9c\x55\x63\xc5\xaa\xb7\x7f\x04\xb1\x9f\xd3\xa1\x6f\xf8\x1f\xc0\x9f\xb6\x81\xbb\xf9\x21\xee\xf3\xae\xb9\x36\xe0\xab\xc5\xe9\xc8\x36\xf4\xb7\x0d\xfd\x3d\x9b\xd0\x9f\x1d\xa9\xde\x29\xa5\x26\x5e\x9c\x43\xd6\x52\xfc\x59\xc4\x90\x22\x91\x8a\xa7\xe7\x7c\x3d\xec\x9c\xce\x8f\x9b\xb7\xe2\xba\xc8\x4e\xf0\x32\x17\xd4\xb1\xe7\x10\x6f\xda\x80\x78\x11\xd0\xb2\x85\x31\x88\xd7\x6d\xa5\x62\x88\xd4\x8a\x81\xe7\x28\x82\x5d\xc8\xf4\x15\x02\xa7\x42\xe7\x74\xec\xd9\xd1\x73\xb8\xcd\x3d\xe7\xbb\x10\x51\xaf\x70\x6c\xcd\xec\xd5\x9f\x4e\x62\x02\x2d\x19\x80\x74\xc4\x04\x04\x18\x01\xa8\x73\xde\x86\x1b\x48\x67\x1c\x61\xaf\xca\xd0\x69\x3b\xd2\xbc\x02\x8d\xa3\x7a\x46\xd0\xc9\x84\xe5\xd8\x3f\xfc\xb5\x27\x81\x95\x8d\xd6\x78\x30\x0c\x11\xd2\x98\xca\x35\x91\xa3\x5e\x0d\x42\x61\x67\xfa\x72\xa7\x5d\x8c\x81\x74\x17\x8e\x24\x7e\x1f\x9d\xb7\x8e\xed\x90\x79\x82\x9d\xd7\x42\x3a\x76\x0f\x81\xce\x93\x61\xeb\xe2\xb9\x2c\x0b\x38\x3f\x90\xc2\x1b\x43\x9c\x4d\x89\xd5\xf6\x42\xd4\xe0\x09\x28\x7f\xdb\x58\xed\x73\x8c\xd5\x46\x07\xa3\x17\x74\x8e\xb0\x71\xfc\x36\x0e\x09\xf8\x20\xee\x90\x79\xa3\xc6\xd9\x30\x3e\x82\xeb\xc3\xb7\x52\xd5\x53\x93\x76\x07\x83\xdd\x5d\x1f\xd4\x75\x7c\x5f\x9a\x51\xff\x6b\xc2\x44\x22\x53\x64\x16\x3b\xbe\xd2\x06\xd4\xbd\xca\xcb\x16\xcf\x25\xf7\xcf\x8a\xd3\x9b\x60\xec\x2e\x96\xba\xb5\x6c\xf1\x68\x7c\xaf\x1f\x41\x89\xa9\x54\x97\x80\xf9\xe7\x48\x14\x30\x9d\x9d\x0e\xe3\xbf\xd7\x24\xe3\x39\x77\xfd\xc3\xec\x46\x67\xda\x68\xb2\x87\x1f\x0e\x92\xa2\xec\xb9\x1b\x06\x39\xcb\xa5\x9a\xf5\xc2\x4d\xf6\xcb\xda\xaf\xdc\x1d\xfb\xd8\x87\xa2\x54\x8a\x09\x93\xcd\x9e\xb3\x06\xe4\x89\xb8\x21\x0a\x50\x58\xe3\x36\x48\x1e\xd5\x35\x57\x33\x17\x22\xbe\xe0\x2d\x8f\x30\xf6\x03\x58\xab\xee\x85\x90\x04\x7c\xca\xc4\x94\x4c\xa9\x7a\x20\x7a\xfa\xb2\xab\x43\x9d\x27\xe5\x53\xae\xdb\x36\xf7\x23\xb7\x3b\xa1\xa1\x75\x57\x69\x8a\xd2\x38\x89\xee\x77\xa0\x47\xda\x0e\x3b\x6f\x4e\x39\x7c\xb9\xd3\x7a\x4a\x05\x35\x86\x29\xf1\x8a\xfc\xf7\xde\x87\xcf\x7f\xef\xef\x7f\xb7\xb7\xf7\xcb\x8b\xfe\x7f\xfe\xfa\xf9\xde\x87\x01\xfc\xc7\x67\xfb\xdf\xed\xff\xee\xff\xf8\x7c\x7f\x7f\x6f\xef\x97\x1f\xdf\xfe\x70\x75\x7e\xf2\x2b\xdf\xff\xfd\x17\x51\xe6\xd7\xf8\xd7\xef\x7b\xbf\xb0\x93\x5f\x57\x1c\x64\x7f\xff\xbb\xff\x68\x3d\x75\x2a\x66\xef\x5a\x8a\x42\xbc\xfa\x1d\x1e\xc9\xf5\x11\x3b\x61\xbf\xb9\xd6\x0a\x5c\x98\xbe\x54\x7d\x1c\xfa\x15\x31\xaa\x6c\x27\x4c\xaa\xe3\xa5\xeb\xfd\x5f\xa9\x01\x15\xe4\xbc\x57\xea\xd7\xbc\xc1\x21\xe2\x79\xcc\x3b\x28\x0c\x3e\x71\x23\xd5\x2b\x5e\x0c\xcb\x0b\xa9\xa8\x9a\x91\xd4\x79\x33\x67\x4b\x00\x7f\x22\xc4\x9f\xd6\x68\xba\xf0\x46\x29\x57\x6b\xa8\x0d\x6e\x0d\xe0\xc3\x52\x5e\xe6\xdd\x38\xe1\x7f\x06\xe4\x79\x87\x5a\xef\x13\x88\xf0\x01\x3e\x7c\x31\xa4\xc9\x35\xda\x4b\x61\x6d\x50\x4b\x8c\x41\xa4\x77\x5c\xde\x43\xce\xa8\x08\x6e\x7c\xc8\x64\x91\x29\xb3\x0b\xe7\x6f\xc6\xb1\x6b\x2e\x77\x0c\xa7\xbb\x2c\xc1\xaa\x0d\x93\x54\xe4\x2d\xa8\x3b\x6b\x5d\x6b\xd2\x09\x6c\x07\xff\x37\x7b\x63\x75\xbc\x8e\xe0\xe2\x25\x18\x93\x0e\x23\x6b\x04\x8d\xa4\xaa\xf4\xaf\x9a\xda\x00\xeb\x16\xf6\x9c\x0f\xce\xda\xd5\xb3\x73\x42\xc5\x13\xbc\xce\x99\xc6\x5c\x14\x9e\x40\xa3\x23\x30\x3c\x81\xfa\x61\xc5\xae\xa2\x86\x88\xa5\xb6\x4f\x92\xa2\x7e\x4f\xf5\x20\xec\x03\x35\x44\x16\x70\xed\x0d\xe7\xcc\x65\xfb\xcd\xa5\xa7\x4b\xe4\xac\x80\x72\x62\x6f\x5b\xea\x12\x2c\x10\xf7\x14\xa7\x47\xcb\x11\x64\x4b\x44\x0d\x69\x7c\xcf\x95\x05\xbe\x14\x3c\xab\x33\xa6\x6f\xb4\x10\x5e\xbc\x14\x2e\x5b\x70\x81\xcb\x96\x33\x59\xa9\x99\xea\x8f\x4b\x9e\x76\xc7\x5e\x4f\x4e\xa7\x68\xa9\x49\x74\xa5\x3f\x74\xa2\x35\x74\xae\x2b\x84\x7c\xcc\xd6\x67\xe5\xce\x49\x48\xed\xac\x1d\x96\x71\x63\x88\x7a\x9a\x27\x0d\x0d\xbf\xbc\x30\xf0\xb9\x04\x57\xc1\x4f\xe4\x0e\xd1\x64\x96\x38\x50\x25\x5e\xeb\x4d\x83\xc3\xe2\x9e\x80\x8a\xa8\xbe\xfd\x3f\xef\x4f\xf2\x21\xd4\x21\x1b\x61\x16\x13\xfe\x06\xdc\x00\xae\x8e\x2b\x65\x19\x33\x50\x96\xc5\x44\xd5\xf1\x4e\x13\xc5\x72\x39\xb5\xdb\xec\x83\x20\xef\xb5\x0b\x86\xf3\xd1\x2b\x42\xf7\x6b\x85\xc1\xae\xcd\xae\x60\x2c\xc5\xe2\xae\xa8\x71\x9e\x2a\x85\xee\x91\xe1\xbe\x4f\x56\xd5\xd8\xdb\x51\x81\xc7\xcc\xb5\xaf\x02\x27\x95\x62\x96\x00\x00\x0f\xa5\x64\x4e\xb4\xa0\x85\x9e\x48\x03\xfe\x10\x5a\xd0\x84\x9b\x99\x25\xb7\x51\x34\xb9\x86\x16\xd1\x8a\xb9\x27\xf6\x48\xb2\xef\xb2\xd6\x63\x0a\xd6\x4b\xce\xcc\x44\xc9\x72\x3c\x81\x1a\x28\xbc\x2b\xc9\xa8\xf6\x04\x58\xfa\x7b\x67\xa3\x6b\x92\xce\x04\xcd\x79\x12\x5a\x67\x28\x39\xe5\x9a\x4b\x17\xc9\xc2\x71\xed\x1e\x23\xe7\xa1\xc7\x00\x06\xc8\x8e\x32\xca\x73\xb2\xa7\x19\x23\x81\x31\xf0\x9b\x4b\x54\x16\xd1\x59\xa8\x98\xfd\x79\x1c\x3d\x73\x28\x8a\x0e\x2a\xc0\x7e\x52\xc9\xe0\x90\x90\x80\x4a\x00\x6c\xee\x74\xf9\xa3\xf7\xc3\xd2\x2d\x9f\x99\x54\x90\xd0\xe6\xbb\xdf\x30\x91\xca\x28\xf5\xe5\xf0\xfc\x54\xc7\x86\xac\xeb\x19\x88\x23\xc1\x17\x99\x14\xe3\x18\x64\xae\xe2\x52\x2b\xf0\x05\xf4\x7f\x9c\xf2\xb4\xa4\x19\x8a\x7a\x37\x99\xa3\xcb\x53\xfc\x39\x1f\x4f\x4c\xff\x86\x81\x9b\x13\x4f\xc4\x2a\x35\xda\x3f\x94\x2f\xa4\xd4\x72\x0d\x47\x83\x71\xee\x34\x74\x19\x43\x87\x45\x3a\x03\x84\x5a\x97\xbc\x59\xcb\xba\xf1\x48\xed\x38\x44\xa0\x7b\x44\x74\x98\xde\x61\xe8\x06\x68\xb5\x21\xf0\x03\x5b\x2a\x03\xd7\x2e\xce\x0d\x5a\x1b\x56\x7d\x25\xc2\xc7\x26\xea\x2e\x0a\x9a\xef\x07\x81\x1e\x5d\x08\x16\x0f\xa3\xdc\xed\xaa\x6b\xa3\x43\x9a\x86\xa2\x4e\xb7\x0d\x7f\x60\x82\x29\x9e\xcc\xb1\x4e\xf8\xe9\x98\x1a\xd8\x7c\x4c\xd8\x9f\xa5\x83\x26\xa6\xf2\x9a\xf5\xe2\x69\xc5\x8c\x57\x2c\x2f\x32\x6a\xba\xc9\x54\xd9\xf9\x39\xf2\xa6\x47\xb1\x68\xbb\xfb\xa9\x48\xfb\x34\xb3\x7c\x7f\xfe\xd3\x91\xab\x87\xc3\xfd\x5c\xcb\x86\xbb\xaa\x3a\x7f\xa2\x3a\x82\x7a\xd9\xd2\x6d\x0c\x20\x6a\x43\x96\x82\xf8\x73\x4f\x06\x97\xc7\x8d\xc0\x56\xb0\xf6\x8f\xf3\x9f\x8e\x7a\x84\x0f\xd8\xc0\xff\x15\x6e\xf5\xf2\xd7\xc8\x31\xd6\x4b\x84\x3a\x1c\xd8\x35\x30\x95\xd8\x97\x1c\xff\xf6\x9f\xdf\xd8\x49\xda\x6f\xbf\xed\x7f\x13\x75\x0e\xfa\xf6\x9f\x96\x8f\x94\xbd\xa1\xfe\x69\x9c\xae\x0e\x92\xd6\xfe\xf5\xcf\x73\x99\x5e\x16\x2c\x19\xe0\x6b\xe9\x7f\xba\x3e\xea\x4c\x18\xab\xcc\x9f\x4b\x48\x54\xe3\x29\xee\x25\x78\xb6\x62\xff\xf2\xf1\x06\xd7\x80\xd4\x49\xac\x84\x1a\x26\xe0\xc8\xf1\x75\xc9\x42\x1a\xfc\x39\xb6\x2e\x85\xf9\xef\x8d\xe2\x6e\xa2\x46\x4a\x10\x26\x28\xb0\x0e\x05\x61\x1f\xb9\x06\x14\x1a\x7c\x57\x20\x07\x75\xb9\xf0\xfe\x14\xb5\xc3\x5a\x0a\x07\xd4\x21\x68\x67\x6a\xe7\xf6\x99\x90\xe6\xb3\xb0\xfc\x3e\xcf\x11\x8e\x4a\x49\xe8\x54\x02\xd2\x05\x1c\x22\x82\x94\x02\x1c\xe5\x55\x37\xc0\xe1\x8c\xe4\x5c\x1b\x7a\xcd\x06\xe4\xd2\x9e\x92\x71\xc2\x02\x52\x4f\x10\xe8\xe7\xc2\x52\x52\x0a\xc3\x33\xf8\xb6\x1a\xc7\x4e\x39\x3e\x3d\x4f\x47\x44\x97\x09\xb4\xbc\x55\xac\xef\xcf\x63\x77\xd7\x82\x24\xab\xde\xa5\x17\x16\x7b\x42\xd1\x40\x2b\x52\xf8\x29\x36\xd0\x15\x8e\xbd\x16\xb2\xb3\xed\x3c\xa5\x48\xaa\x33\x18\x88\x09\x5d\x94\xed\xb1\x9b\xf9\x7c\x22\xb4\x15\x5d\xfc\x41\xb0\x84\x69\x4d\xd5\x0c\x1b\x8c\xf2\xd0\x07\xd1\x25\xce\x82\x50\xca\xa9\x28\x61\x00\xc5\xb0\x5b\x6d\x99\x00\x75\x28\x19\x2a\x79\xcd\x44\xa8\x48\x08\x02\x2f\xa4\x65\x57\x49\xa8\x90\x0e\x20\x49\x32\xa1\x62\xcc\xaa\xa2\xf3\x9c\xa6\x40\xfb\x1f\x83\x6e\xe7\xdf\xc7\x52\x80\x8e\xac\x8a\xc4\x0d\x90\x62\x68\x0f\xc2\x10\x45\xf9\x20\x88\x77\xc3\xf4\xaa\x30\x87\x7d\x25\x9e\x35\x92\x89\xa4\x1b\xbf\x7a\x7b\x8f\x7a\x1f\xf4\x97\x35\xa6\x80\xe7\xcc\xd0\x94\x1a\xda\x59\x1a\xf8\x5b\x1a\x1a\x69\xba\x1c\x11\x60\x87\x28\x77\xc4\x9d\xe4\x5e\x79\x95\x05\x8f\x61\x08\x40\x1a\x4c\xfc\xea\x63\x0f\x7a\xcb\xd7\x2e\x86\x89\xd9\xdd\xa0\x1a\xba\xf6\xea\x30\xbc\x1f\x0d\x45\x16\x4b\x49\x5a\x82\xa2\x59\x89\xb4\x36\x31\xf6\x4e\x42\x30\x76\xa1\x3b\xa3\xf2\x55\x95\x4a\x90\xd4\x53\xbd\x97\xaa\x81\x78\xd6\x31\x61\x38\xb6\x4a\xf7\xb8\x11\x8e\xf8\xa5\xc0\xad\x3a\xb7\x0c\xb0\x4e\x63\x66\x74\x95\xa4\x89\xa7\x89\x15\x91\xee\x2c\x77\x6e\x0b\x38\x6a\xdc\xd2\x38\xcb\x7f\xb9\x3e\x8a\x0b\xa7\xa5\x3b\x2d\xec\xf9\xb5\xf6\x95\xe9\x2e\x16\x85\x1d\x65\xdf\xca\xb4\x7d\x50\x6b\xae\x35\x6a\x35\x70\x55\xb3\x82\xf5\x4b\x1a\xdc\x4a\xf8\x64\x08\xf1\xeb\x1a\xaa\x06\x1e\x01\x13\x3a\x6d\xee\x9d\xad\xf4\xdf\x7e\x68\x7b\x06\x8f\xeb\xc3\xe3\xfa\x2f\xdb\xfa\xc1\xdb\x27\x41\xfa\xab\x65\x32\x64\x7d\x42\x1d\x04\x3e\xac\x68\xbd\xec\x24\x2e\x31\xdf\x9b\x32\x9c\xbc\x2e\xc5\x23\xa4\xd5\xb8\xc2\x5c\xc6\xad\xbc\x7c\x45\x3e\xab\xe9\x5a\x4e\xa7\x0d\x96\x37\x56\x41\xed\x79\x53\x7c\xe0\x96\xdc\x43\x7c\xd5\x6f\xdf\x9f\x1b\x0c\x94\xbc\xe5\x56\xa9\xaf\xb6\x0a\x8a\xb7\x55\x92\xa1\xa7\x7d\x28\x76\xb5\x6c\xac\x64\x96\xf9\x46\xe8\x68\x8a\xcf\x25\x49\x41\xdf\x1e\x0c\xbb\xf4\x82\xcb\x23\x68\xfa\x82\xdd\x04\x95\x8e\x6a\x44\x2a\xf5\x41\x7f\x70\xcb\xf8\xcc\xb5\x65\xe3\x85\x8a\xb0\x43\x31\xc3\xa9\x1f\x87\xc5\xba\xcd\x00\xeb\xf9\x14\x25\x4b\x78\x98\x0b\xcd\x6e\xe8\x4c\xc3\xfe\xaa\x2c\xc2\xf0\x7c\x87\xdb\x5e\x0d\x7c\xc1\x46\x2d\x9a\xb3\xc7\x57\x67\x69\x01\xdd\x25\x06\x00\x2a\x0b\x17\xcd\xb3\x7d\xab\x61\x1a\xf4\xb3\x9e\xbf\xba\xcb\x2f\x80\x14\x4b\xc8\xaf\xea\x22\x50\x5b\x6f\x3a\x74\x7e\x0a\x03\x7b\x9b\x6d\x0c\x7f\xf8\xb3\x3c\x44\x1c\x87\xcc\xee\xb7\x0a\x4b\x0a\x78\x37\xfe\xed\x92\x04\xb4\x8a\xe9\x7f\x84\xc6\x44\x2e\xb4\xe3\x0b\x8b\xed\x51\x70\x78\x7e\x8a\x4f\x1c\x40\xeb\x59\x2a\x66\x4e\xcb\x32\x13\xae\xd2\x7e\x41\x95\x99\xa1\x73\xa4\x57\x7b\x5a\x28\xaa\xec\x80\x1c\x9d\xc6\x98\xdb\x74\x2e\x8b\xaf\xda\x1a\x01\xf9\xdc\xfa\xf8\xa0\xdc\xad\x2b\xb3\x69\x14\x69\x5b\xe2\xe9\xaf\x7a\x1d\x71\x84\x46\xe6\xbd\x16\x4f\x82\x22\x69\x2c\x88\xbb\x3d\x91\xe7\x32\x61\xf0\x60\x05\x7d\xd9\xf9\x96\x64\x5c\x72\x16\xf4\x33\x30\xf4\xed\xb4\x7a\x84\x8f\xec\x91\x26\x45\xdf\xd5\xb7\x07\xd7\xbb\xd3\xf1\x7c\xca\x28\x1a\xed\x76\xb3\xa2\x43\x35\x7e\x56\x3c\x40\xd8\xdd\x64\x4f\x48\x81\x3b\x1e\xef\xdd\xc7\x8c\xd9\x5b\x3c\xc6\x70\xcb\x80\xfc\x3c\x61\x22\x3e\xee\x62\x5f\x7b\x2f\x1c\xbb\x5c\xa4\x76\xb9\xe1\x2c\x04\xdb\x5f\x97\x49\xc2\x58\xf0\x16\xc5\xbd\xd7\x2b\x89\xe4\xa6\x9c\x53\x93\x4c\x98\x26\x5a\x02\xf8\xa8\x36\x34\xcb\x2a\x2f\x8d\x23\x97\x04\xcd\xc1\x3b\xe8\x23\x85\xa2\x56\x16\xee\x1c\x56\x45\x46\x9d\x57\x64\x54\x8a\x04\x73\xb2\xb8\x99\xf9\x19\xc4\x27\x3c\xfc\x0c\x4c\x53\x8d\xce\x1b\x3e\x42\x6f\x70\x64\x62\x06\x62\x82\x48\x9d\xa1\x10\xad\x9f\xf5\x0e\x76\xcf\xca\xcf\x21\x4d\xae\x6f\xa8\x4a\x35\x54\xbc\x53\xc3\xb1\xa9\x60\xaf\x36\xec\x5e\x34\x07\xfb\xf4\x9a\x6e\xb0\x1f\x0c\x59\x68\x28\x2d\xe7\x1e\x43\x68\x69\x64\x4e\x0d\x4f\xc0\x45\xc3\x47\x91\x6f\x3f\x0f\x7d\x1e\x42\x9c\x16\x65\x39\x9c\x0e\xee\x35\xc0\x5a\x53\x58\xa1\x61\x6e\x24\xe1\xb9\xd5\xb9\x28\x34\x4c\x1e\x85\xfa\x76\x1f\x88\xb8\x6b\xa6\x56\xb1\xfc\x19\xc2\x40\xd1\x5d\xe8\xfc\xb1\x66\xb9\x86\xe1\x43\x9c\x21\x38\xd8\x5d\x21\x77\x6f\x4e\x25\x22\xfe\x57\x96\xab\xed\x6c\x23\x66\xed\xd9\x05\xba\x61\x56\xd7\xd2\x77\xb2\xac\x1e\x2c\x9b\x13\x1f\x0b\xac\xfa\xe5\xda\x3b\x0c\x5c\x1a\xf7\x5e\xaa\x64\x51\x38\xd7\x5f\xbe\xbf\x38\x27\x88\xee\xa9\x29\xd3\x10\xd9\xf6\xa9\xe1\x96\x14\x63\x26\x98\xa2\x06\xe2\x03\x0e\xad\x10\x76\xef\xfc\x43\x20\x6b\x98\x44\x60\xe6\x7b\x87\x59\x31\xa1\xfb\xe4\xbd\x6b\x9a\x1f\xf8\x37\xe4\x9a\xaf\xa4\x91\xa2\x33\xd1\x47\x05\xb6\xaa\xe4\x5d\xc3\x6c\x55\xc9\xad\x2a\xd9\xe0\xda\xaa\x92\xf3\xd7\x56\x95\x8c\xaf\x90\xce\xdc\xad\x1a\x79\x11\xea\x13\xa2\xec\x92\x38\x5f\xab\x2a\x60\x78\x7c\x2f\x5f\x78\xd6\x06\x9d\x30\x5d\xca\x62\x4c\x5d\xeb\x9c\xa7\x77\xdf\x60\x4a\x1c\x7e\x38\x74\x4b\xe5\xb3\xf4\xaa\x0c\x41\xab\x25\x96\x86\x45\x4b\xea\x94\x87\x07\xaf\x61\x0d\xf5\xe5\x00\x3b\x5b\xf7\xc3\xb0\xfd\x2a\x29\xaf\x71\x23\xc0\xf8\xea\x70\x35\x49\xe7\xf0\x24\xf1\xf5\xe4\x72\xf8\xea\x57\x67\xb5\x01\xe4\x51\xea\x03\x48\xf7\x35\x02\xe4\xf1\xeb\x04\x48\xa8\xdb\xea\x7e\xdf\x5f\xf8\x3a\xb2\xb9\x9d\xef\x44\xf7\x5d\x3b\xbf\x86\x53\x16\xc6\xe1\x9a\xc8\x9c\x1b\xc3\x7c\x5e\x45\xd8\xc9\xe0\x0d\x8f\xeb\x68\x9c\xcc\x01\xb3\x1b\x93\x27\xd8\xc7\xd0\x69\x29\xd2\xe7\x40\x2b\xbb\xe1\x1a\x8c\x08\x2a\xac\x09\x88\x70\xb1\x20\x3b\xfa\x2e\xef\xd6\x9b\xb5\x5b\x39\xd4\x7e\xdc\xad\x1c\x8a\xaf\xad\x1c\x22\xd0\xb2\x2a\x83\xa2\x8d\x4e\x95\xc7\x43\x4c\xb8\x20\xbf\x95\x4c\xcd\x88\x9c\xb2\x28\xaf\x13\x9a\x52\x69\x9e\xba\xcc\x48\xe7\xb7\x6b\x6b\x75\x6d\xa8\x5e\x07\x7e\xc5\x93\x8f\x56\x7f\x06\x6c\x81\xce\x25\xfd\xfc\x03\xea\x10\x41\xb8\x0a\x7e\x89\xbd\x68\xb7\x32\x56\x0f\x1c\x06\x78\xf5\x09\xf8\xe2\x0e\xcf\x8e\xbb\x34\x81\xbb\x88\xa4\x93\xee\xa2\xe9\xe4\x36\x46\x5d\x46\x22\x24\x65\xf8\x06\x0e\xb3\x90\xf1\x10\x7c\x70\xe4\x9a\xcd\x7a\x2e\xb1\xc8\x75\x21\xf4\x37\x63\x8e\x5e\xbd\x55\x4a\x3b\x08\xbe\xfa\xd5\xf1\xa9\xd3\xa5\xcf\x0c\xaf\xb6\xad\x31\xea\x63\x79\xe2\x76\x73\x10\x76\x7c\xb0\x76\xd0\x42\x23\xbe\x6a\x4c\xea\x5a\xda\x40\xd2\x3b\x70\x2b\x80\xf2\xfb\x52\xa5\xc0\xa0\x50\x9e\x05\x12\xb6\x1b\xf6\x22\x5d\xbb\x6d\xf0\xf2\xcb\xf8\x48\xc4\x0a\x5b\xb0\x56\x13\x73\xcd\x66\xbb\xda\xa1\x54\x48\xa1\x27\xbc\xf0\xbd\x14\x41\x4e\xba\x5d\x49\x7e\x82\x54\x30\x3f\x04\x4a\xc4\x53\xd1\x23\x67\xd2\xd8\x7f\x4e\x20\xb7\x15\x43\x10\x92\xe9\x33\x69\xe0\x93\x8d\x26\x37\xbe\xda\x23\x11\xdb\xc5\x2f\x38\x44\x1f\x30\x8b\x1b\xea\x44\x7d\xc6\x23\x10\xd5\x25\xb7\x84\x85\xe1\x9a\x9c\x0a\x22\x95\xa7\xaa\xf1\x2d\xa3\xb4\x1b\xc2\x7b\x75\xa3\x60\xd1\x92\x31\xdc\x62\x48\x55\x5b\x8b\x3b\x86\x0b\x71\x27\xee\xbf\x01\xaf\x2f\x04\xea\x42\x9a\x26\xb4\x2d\xa2\x86\x8d\x79\x42\x72\xa6\xc6\x80\x68\x92\x4c\xba\x5e\xe2\xae\xce\x45\xbc\x3a\x3c\x1d\xf1\xea\x94\x0f\x41\x45\x79\x03\x09\xb8\x8f\xa3\xfe\xe0\xd8\x78\x5c\xe7\xb4\xb0\x2c\xf8\x3f\xf6\x54\x06\x2e\xf8\x5f\x68\x8b\xa6\x07\xe4\x90\x68\x2e\xc6\x19\xab\x7d\xe7\x02\x07\xf1\x30\x76\x04\x6b\xb3\xfe\x56\xf2\x29\xcd\x18\x26\xcc\x53\x11\x7a\x99\xc8\xd1\x82\xd2\xd5\x73\xbd\xd1\xac\x5c\x0e\x21\xea\x9d\x6b\x36\xdb\xe9\x2d\xb0\xed\xce\xa9\xd8\xa9\xc0\x91\x6a\x8c\x1a\x94\x0b\x88\x5e\xee\xc0\x77\x3b\x9f\x46\x4f\x7b\x02\xa6\x6b\x67\x3c\xe9\xdc\xcc\x47\x19\xd5\xba\x0b\x9c\x96\xdb\xb1\xc7\x2f\xa3\x27\x55\x75\xd7\xae\xe8\x22\xc1\x74\xe8\xee\x7c\xe4\x50\x63\xd8\x55\x0a\x6c\x07\x74\x9e\xba\x86\xce\x6d\x81\xdc\xe6\xcf\x9c\x30\x6c\x28\x43\xbd\x89\x51\x0a\xaa\x6c\x95\x5b\x28\xfe\x13\xc4\xc3\xe5\x28\xee\x03\xc1\x35\xb8\x9f\xb8\x2f\x4c\x15\xd2\x10\x2e\x92\xac\x4c\xb1\x03\x06\xfc\x14\x9c\x57\xdd\x18\xaa\x9d\x91\xb7\x73\x06\xfe\x29\x0c\xeb\x75\x4e\x9f\x59\xb3\x50\xfb\x33\x9f\x02\x01\x69\x27\x21\x9b\x00\xa9\xbd\x4e\x6a\x8d\x1a\x55\x39\xd4\x5b\x85\x1c\xd5\xf5\xc8\xd7\x7c\xa8\x18\x39\x9a\x50\x21\x58\x16\xe1\xb0\x38\x47\x27\x35\x86\x26\x13\x4c\x7f\xa6\xc4\xee\xe3\x8c\x99\x5d\x8d\x2d\xea\x73\x9a\x4c\xb8\x08\xe0\x05\x22\xe0\x11\x55\xa5\x54\x6b\x68\xae\xd3\xd6\x10\xea\xb0\x2f\xcb\xee\xed\x8d\x59\x2a\x50\xef\xd1\xdc\x3d\x15\xba\xbd\xdb\xe5\x40\x6b\x3c\x71\xa1\x4b\x08\xdc\x7b\x77\x6b\x97\x3c\xb8\xa7\xb9\x18\x31\xa5\x70\x4d\x86\xcc\xfd\x80\xf0\x5a\xdf\xd5\x81\xeb\xf7\x30\x91\x37\x24\x95\xe4\x06\x3a\x90\x4e\xad\x6a\x00\xf9\x37\xda\x2b\x15\xd1\x4c\x21\x23\x2e\x91\x79\xa1\x64\xce\xb5\xaf\xf1\x73\x0c\xb1\x36\xd8\x91\xac\x6c\x8c\xd3\x7a\x1b\xb8\xe6\xeb\x23\x62\xa8\x1a\x33\x63\x07\x27\xa2\xcc\x87\xac\x25\xac\xca\xba\x21\xbc\x3b\xed\x94\x11\x51\xea\x9e\x06\x18\xe4\xc2\x3d\x17\x01\x4f\x20\x19\x6f\x24\x95\x4b\x29\x0c\x5f\x3a\x9c\x76\xcb\x72\x3f\xb9\x73\xb1\x14\x46\xb7\x84\x4d\x6f\xd3\x40\x03\x97\xff\xe7\x9f\xcf\xba\xc1\x3d\x5f\xca\x5b\x37\x52\x65\xe9\x0d\x4f\x31\x51\x43\x93\x3d\xfb\xb8\xfd\x76\xef\xbc\x46\xe0\xf3\xd6\x1b\xf9\xe6\x86\xa7\x8f\x41\x6e\x9f\x19\x6c\xc9\x4d\x80\xde\xae\x57\x3f\x87\xbe\x70\xf0\xd8\x7d\x72\xc2\xb1\x8e\xdc\xfe\x85\x88\xa2\xf9\x90\x8b\x0a\x09\x21\x30\x04\x9c\x7c\x56\x2e\x78\x8b\x5c\x33\x83\x15\xc0\x50\x44\x2b\xcd\x84\x68\x9e\x97\x99\xa1\x82\xc9\x52\x67\xb3\x96\x6c\xfc\x54\x97\x74\x94\xb1\x8f\xb8\x9b\xdb\xeb\x2f\x61\xa8\xba\x1e\x33\x46\xb4\x07\xbf\xc2\x0b\x8a\x4c\x95\xdc\x9c\x1e\x04\xa5\x26\x94\xb1\xb3\x8f\x2c\x71\x75\x4e\x45\x56\x8e\x79\xa3\x92\xd6\x6d\x53\xc0\x46\xbf\x5e\xad\x29\x60\xd5\xf2\xac\xd4\xac\x42\xfa\x6a\xd7\x74\xfb\x69\xf4\xf0\x7b\x54\x55\xf1\x6a\x79\xa3\xbe\x94\x15\x4c\xa4\x80\x1c\x1e\xed\x38\x9c\xee\xda\xa8\xed\x10\xbb\xbb\x3e\x17\x4e\x3e\x1a\x45\xad\x90\xcf\x01\x4e\xc6\xc1\x82\xf3\x11\xa1\xa2\xad\xc0\x7e\x2e\xbd\xa5\xc8\x56\x6f\x7c\xf0\xa5\x3b\xed\x2f\x19\x11\xac\xd6\x5f\xb2\xe3\xee\x92\x78\xfa\xb9\x8d\xae\xeb\x65\x51\x4b\xba\x40\xba\xa7\xc4\xf5\x4b\x6d\xbb\x41\xea\x25\x4d\xe2\xe6\x66\xb5\xc6\x3d\xb9\x6d\x0d\xf9\xb4\x5a\x43\x8e\x00\x69\xa8\x3d\x8c\xef\x6b\x1c\x67\xce\x77\xe6\x3e\x74\x3a\xe7\x2a\xbe\x32\xb7\xa3\xa2\xe3\x15\x7a\xbe\xb8\x81\x5c\xdd\x3e\xd1\x76\x35\xaa\x24\xfd\x52\x88\x66\x42\x7b\xdd\x1d\xf4\xa8\xa1\x9a\x99\x36\x1e\xdd\xc5\x82\x06\xaf\x0f\xe2\xd8\xd8\x78\x12\x0a\x0d\x3d\xdc\x0e\xe9\x7f\xeb\x34\x47\x51\xbb\xd3\xea\x8c\x9e\xd0\x1e\xe9\x97\x85\xd4\x2d\x1c\x23\xb5\xcb\x9b\x50\xd3\xb2\x97\x7a\x8b\x53\xd6\xcd\xf6\xfd\xfb\xd3\xe3\x4e\x68\x66\x07\x9a\xa3\xd9\x20\xa0\xe9\x95\x82\xff\x56\xc6\x36\x30\x20\x0f\x06\x2a\xb9\xfb\xd7\x41\x8a\x71\xc2\x2a\x67\xfc\x31\xd7\xd7\xed\x81\xb8\x7f\x38\x3a\xa9\x0f\x59\xdf\xcc\x3f\x1c\x9d\x10\xf7\xe9\x4a\x3e\xf0\x87\x38\xc1\xdb\xe2\x39\x8f\x13\x56\x85\xc7\x52\xae\xaf\xd7\x00\xe2\xdd\xd6\x3c\x2d\xd2\xb3\x66\xd5\x82\x9b\xec\xcf\xf7\xd8\x9f\x11\x40\xed\x4c\x96\xe4\xc6\xa1\xd2\x39\x03\xee\x8a\x17\xaf\xc8\x89\xd0\xa5\x62\x55\x96\xd3\xbc\x2d\x67\x75\xa8\x95\xcd\x39\x00\xfe\xd3\xaf\x3a\xf3\xff\x77\xcd\x9f\xcf\x25\xa0\x50\x50\x65\xc0\x06\xeb\x08\xc7\x1c\xda\x94\xba\x21\x3d\x11\xee\x61\x9e\xd3\x91\xaf\x53\xe8\x39\x54\xaa\x00\xf6\xed\x6f\xb2\xec\x12\xc1\x54\xc6\x0c\xf2\x3a\x00\xd0\x92\x83\x94\x4d\x0f\x74\x4a\x5f\xf6\xe0\x31\x1e\xcc\xc8\xd4\xe6\x44\x35\xd9\x79\xb9\x33\x20\x97\x3c\xe7\x19\x55\xd9\xac\xd6\x71\xab\xba\xcf\x1e\xa6\x7e\x40\x48\x02\x79\xb1\x43\xf6\xa4\x82\x91\x13\x2a\x48\xc6\x7c\x25\xbf\xdb\xbe\x33\x34\x1f\xf6\x37\x43\x16\x92\x8d\x89\xc6\xa0\x58\xec\x86\xbd\xde\xe3\x71\x5e\x03\x3b\x3d\xae\xce\x33\x2e\xec\x21\x37\x20\xef\xdd\xe9\xe4\x8e\x7d\x64\x01\xd8\xb5\xfe\x8e\xcd\x5a\xa2\x8d\xf1\x59\xb4\xf3\x44\x2c\x3a\x3a\x36\x8d\xd0\x4d\xbd\x1d\x63\x6e\x2e\x58\x21\x3b\x50\xd1\x70\xa0\x39\xcf\x3e\x37\xf6\x03\xa9\x39\x74\x49\xa1\x86\x50\x14\x44\x49\x99\x51\x6b\x91\xa1\x5f\x7f\x40\x8e\x4f\xce\x2f\x4e\x8e\x0e\xaf\x4e\x8e\x5f\x11\x3f\x12\x8f\x75\xfa\x01\xb9\x8a\xf1\x8a\xa3\x92\x2f\x07\x0a\x1b\x9e\xd5\x73\x82\x95\x8a\xaa\xc5\x03\xe0\x37\x52\x41\x4e\x05\x37\x55\xe7\x2a\x4c\xa2\xcf\xa4\x70\x69\xf1\xf6\xd7\x2e\xae\x30\xe6\x98\xbc\x29\xdc\x60\xf6\xeb\xfa\x68\xb0\x43\xb1\xcf\x4b\x98\x4a\x23\xef\xc6\x9a\x75\xbb\x6a\x79\xd6\x61\x65\xfa\x26\x2d\x9d\x6c\xf2\x2b\x0c\xc8\x56\x5d\x79\xf0\x44\x0d\xcd\x06\x3d\xfe\xaa\x54\xb5\x5e\x80\x83\xc1\xee\x80\xd8\xb3\x7a\x77\xb0\xeb\x55\xb9\x6c\xa1\x61\x65\x18\x34\x86\xb9\xae\xf3\xf7\x80\x90\x77\xbe\x8c\x10\x70\x8b\x96\xf7\xbe\x44\xb0\xbe\xa8\xd3\xe1\xdc\x2e\xf1\x2d\x51\xcb\x61\xfc\x50\x87\x8b\x3d\xe6\x53\x26\xf0\xc5\xd6\x27\x98\xfd\x54\x3b\x59\xb5\x8b\xea\xcd\xdf\x5f\xbc\x59\xdf\x4b\xa1\x64\xe9\xe4\x95\x8e\x64\x9e\x23\x62\xf3\x24\x20\x8d\x54\x60\x21\x41\xea\xad\xc5\x38\x47\x9c\xea\x51\xa3\x0d\x3b\x27\xf1\xfd\x50\x73\xc6\x78\xf8\xd8\xd5\xf5\x8a\xca\x1e\x7a\x78\x9b\x2c\x07\x94\xae\x3d\xf4\xa6\x3b\x3e\x0f\xc2\x7b\x1c\x5c\x9c\x1c\x1e\xbf\x3d\x19\xe4\xe9\x13\x14\xbe\x4c\xa4\x85\xe4\xc2\xe8\xa6\x86\x79\xb3\x76\xdb\x6d\xc5\x76\x98\x76\x37\xba\xd9\x89\x1f\x2e\x4e\xf4\xf4\xcf\x88\x90\xef\x53\x66\x28\xcf\x74\xc4\x61\x46\x16\x32\x93\xe3\xe5\x5d\xb7\x1e\xc0\x3a\x7f\x42\xec\xd4\x3e\xed\x5b\x9e\x5c\x9f\xc5\xda\xbc\x55\x6f\x9d\xa2\xbe\x35\x2f\xf4\xd2\x08\xd4\x0a\x96\x20\x74\xd4\x7d\x06\x04\xfb\x84\x26\xc2\x02\x15\xd1\x27\x03\x22\xce\x37\x26\xa8\x90\xfe\xa3\x06\xde\xab\xda\x0e\xeb\x21\x7e\x53\xb3\xc1\x4a\xf3\xa6\x9d\xe2\xeb\x54\xff\x9b\x1b\xa9\x7e\x88\x14\x8a\xf5\x03\xa0\x32\x74\x90\x96\x2a\xd2\xc1\xe2\x33\xc5\x3b\x71\xbd\xcb\x17\xef\xca\x66\xf3\xce\xdc\x4a\x4b\x0f\x3e\x74\xc4\xab\xcb\xb2\x59\xd5\x2e\xc3\xb9\xb4\xe8\x18\x81\x92\x95\x8b\x94\x15\x8a\x4f\x79\xc6\xc6\xd0\x70\x87\x8b\xb1\x6f\x3d\x1e\xe1\xed\x43\xfb\x4b\xb6\x30\x2f\xbb\xd8\xda\xc4\x0d\xe0\x80\xb3\xce\xde\x5d\x41\x13\x27\x48\x85\x69\x6d\x4c\xda\x07\x42\xb3\xeb\x7e\xbf\x0f\xfe\xbb\xbd\x7f\x59\xab\x26\xcd\xf6\xc9\xcf\xcc\x3d\x47\x42\xa3\x29\x05\x9d\xd4\x27\x32\x74\xfa\x81\xb9\x56\x94\x05\x86\xc6\xe4\x38\x77\xd7\x81\xbd\xd3\xaa\xcf\x78\x9c\xd7\xee\xe7\x0c\xc0\x9c\xab\x98\xff\x53\xb4\x80\xd6\x74\x88\x76\x2c\xed\x7d\x9c\x68\xd9\x1e\x09\x71\xfd\xc2\x9d\x0b\x94\xe8\x59\x9e\x71\x71\x5d\xa1\x87\x8f\xa4\xe5\x63\xac\xeb\xe5\xe2\xda\xef\x1a\xc5\x68\x76\xfb\x89\xd1\x84\x47\xd7\x76\x5a\x98\xce\x42\x09\x57\xb3\x02\xf3\xd8\x82\xf0\x72\x49\x56\xb1\xa8\xdf\xd9\x79\xd2\x14\xe3\x3a\xd1\xbc\xbd\x78\x3f\xbd\x3c\xba\x3c\xad\xc9\x76\x41\xf0\xb3\x4f\x19\xb0\xbb\xed\x70\x85\x97\x7c\xd2\x16\x04\xff\xad\x59\x86\x53\x9f\x64\x65\xd3\x5f\x62\x12\xf5\xb9\x54\x86\x66\x6b\x10\x9c\xc9\x84\x16\x87\xa5\x99\x1c\x73\x9d\xc8\x29\xeb\xc8\x0d\x71\x33\xc1\x0e\x64\xbe\xe1\x02\xf7\x4c\x8a\xcf\x20\x47\x7f\x3b\x3c\x27\xb4\xb4\x5c\x67\x5c\x73\x99\xb5\xa5\xa7\x79\x0a\x5c\x62\xc9\xef\x23\xbe\xbf\x7b\xc2\x46\xbd\xfd\x36\x28\xfc\xe8\x41\x61\x90\x8b\xcf\x25\x10\xcc\x05\x37\x9c\x1a\xa9\x3a\x8b\xd6\x1d\x95\xda\xc8\xdc\x6d\x91\x53\x3f\x3c\xe4\x38\x81\xaa\x55\x7b\x62\xbd\x1b\x2b\x18\x8a\x40\xde\x53\x61\xcd\x3a\x9a\xb0\xb9\x3a\x93\x1e\xf4\x6f\xc1\xb1\x79\xb8\xe7\x1b\x57\x6d\x04\xc0\xe4\xd9\xb7\xaf\x6a\xbd\x0d\x17\x5a\xde\x7a\xa7\x63\xd5\x46\x75\x6d\xde\x62\xfe\x5b\x37\xf2\xc9\x39\xf7\x91\x2e\xff\x55\xd2\x0c\xe9\x79\xb6\x4e\x4f\x78\x7d\x1d\x3b\x79\x4d\xcf\x53\x7e\xdd\xcf\x82\xf7\xab\xd4\x88\xab\x8e\x77\x18\x45\x85\xb6\xcc\x50\xf7\x2f\xec\xba\x14\x83\x5d\xb2\x67\x92\x62\x7f\x6d\x94\xe9\xaa\x9a\x13\x5f\xd6\xad\xfd\x9b\x50\xc5\xd9\xee\xbd\xd6\x9e\x37\x00\x7b\xb8\x1b\xe7\x69\x8d\x40\xa8\x92\x91\x37\x5c\x1b\xdf\xc6\x15\x3e\xe0\xda\xf5\xbd\x02\xed\xfb\x9c\x48\x45\x78\xf1\x0f\x9a\xa6\xea\x15\x9e\xf5\xce\x3a\x84\xff\xd6\x01\xa1\x9c\x8a\x90\xb1\xb2\x67\x66\x85\x6b\xaf\x70\x75\x74\x4e\xb0\x3b\xf4\xd7\x7f\x79\x01\x9a\xf8\x97\x5f\xfc\xe5\x45\x4b\x56\x7b\xaa\xd5\x71\xa4\x6b\x2f\x64\xe7\x79\x0a\xcf\xa4\x86\x02\x14\x50\xac\x9e\x80\xd3\xcd\x49\x41\xe4\x7b\xcb\x84\xe1\xcc\xed\x52\x4d\xdd\xd6\x1b\xfc\x81\xea\x0d\x48\x28\x18\x47\x39\xfa\x58\xf2\x19\x45\xf3\xf9\x53\x11\xcd\x0d\xa9\xd9\x94\x73\xeb\x1c\x8b\xd2\x6d\x77\x57\xc7\xb9\x1c\x50\x4f\x79\x7c\x76\xf9\x8f\x37\x87\xdf\x9f\xbc\x81\xf7\x74\xd9\xf0\x96\x15\x9d\x59\xd2\x24\x77\x7b\x75\xd6\x6e\xee\x29\x6a\x4a\xce\x2e\x22\xf6\x67\xaf\x2f\xe7\x5c\x71\xf6\x93\x07\x86\xe9\xdb\xda\x96\x62\xd4\x82\x7a\x4f\x2d\x48\x00\xad\xac\x99\x5a\x4f\x71\x77\xc7\x11\x86\x08\x40\xbd\xe6\xd4\xb0\x3c\x84\xef\xd8\xda\xef\xd0\x90\x37\xc8\xc6\xa9\x71\x77\x07\x93\x2d\xc5\x90\x8a\x9d\x87\x91\x3f\x29\xb5\xdb\xa9\x87\xaa\x2b\xe4\x81\xdd\x4b\x18\xcb\x27\x3c\x58\x11\x86\x79\xd4\xca\x9e\xa8\xf6\x2c\x65\x3a\x34\xbd\x7d\x06\xdc\x5a\x2c\xeb\xf6\xd6\xfe\x74\x58\xda\x44\xce\xb5\x3a\xc6\x20\x4d\x2d\x44\x5f\xab\x5e\xbe\xad\x6b\xa2\xcf\x65\xa4\xce\x55\xa5\x0b\x9a\x74\xda\x8b\xa7\xfa\x08\x3f\x01\xa0\xb7\xa7\x78\xc0\xc0\xc4\xd7\x54\x66\x15\x9e\xdd\xcd\x76\x3c\xf2\xc3\xcd\x83\x81\x3c\x88\x4b\x7c\x97\xe8\x42\x7a\xb0\x97\x18\x35\x64\x23\x59\x88\x6c\xdc\x39\xf4\x73\x43\x07\xc2\x3a\x9d\x07\xc5\x44\x1a\x29\x3a\x2e\x21\x3d\x5f\x32\x68\x5d\x9e\xe1\x1d\x47\x55\xfb\xf5\x8a\x2f\xb0\xc2\x26\x84\xa6\xad\xc1\xe1\x4f\x6c\x29\x7c\x90\xba\x1e\xa2\x7e\x7a\x02\xa8\x48\x4f\x8f\xd7\x20\x7b\x9e\x3e\x0c\xcf\x43\x83\x73\x6b\x4b\x2f\x4d\x3b\xaa\x4b\x3f\x3d\x76\xb6\x80\xaf\x3d\xd7\x6e\xf3\x90\xdb\x77\xcf\x5a\xf4\x24\xa9\xcc\x8d\x54\x5d\xc1\x97\x9d\xd7\x86\x9b\xcb\x57\x74\xdf\x2d\xe0\x49\x3c\x4f\x59\x81\x6f\xf9\xe4\xe5\xc5\x25\x24\x72\xcd\x75\x94\x9c\x97\x10\xa1\x52\xf7\x11\x84\xc8\xd3\x11\x1e\x9d\x6a\x25\x8f\x0b\x1b\xb5\x36\x93\xd6\xef\x8a\x4e\x68\xf4\x93\x1b\xcc\xb9\x36\x2d\x7f\x54\xe2\x96\x06\x61\xe4\x1e\xba\x16\xf1\xaa\xa4\x15\x3f\xcd\xa4\x48\xfd\x40\x31\x2c\xd7\xd8\xca\x2f\xcb\xec\x7a\x4a\x11\x37\x01\x74\xe0\x52\x3d\x82\x7d\xf4\x72\x5a\xb8\x7e\xe3\xa9\xbc\x11\x37\x54\xa5\xe4\xf0\xfc\xf4\xd3\x0b\xd1\xd6\xc5\x8f\xb8\x0b\xda\x60\xd2\xd7\xa8\x08\x28\xf4\x43\x6e\x34\x66\xb3\x43\x3e\xba\x89\x7d\x48\xf6\x00\x0a\x19\x22\x56\x84\x59\x71\xe5\x66\x11\xe9\x48\x82\xc8\xc4\x50\xd7\xd9\x3d\x74\xbd\x7f\xf1\xe2\x05\x86\x14\x5e\xfc\xf5\xaf\x7f\x25\xd0\x75\x31\x65\x09\xcf\x17\x6f\x84\xbb\xfe\xfc\xf2\xe5\x80\xfc\xfd\xf0\xed\x1b\x42\x13\xb0\xc0\x10\x52\x15\x47\x86\xb5\x8b\x7f\xac\x7b\xe4\xff\x5e\xbe\x3b\xab\xda\xbd\xd7\xbf\x05\xd6\xc8\xfd\xeb\x0d\xc8\x71\x94\x7e\x1e\xbb\xfc\xa9\x99\x40\x4a\xbe\x90\x86\xd0\xd1\x08\x98\x13\x45\x32\xd7\x5e\x5c\x78\x5c\x34\x3e\x9e\xf8\x6e\xdd\x96\xad\x32\xc8\x8b\xe7\x76\x8a\x10\x62\xf1\x50\x82\x98\xe6\x0f\x63\x85\xd3\x01\xa6\xd2\x23\x19\xbf\x66\x64\xa4\xa1\x67\x77\xd5\x44\x43\x31\x6d\xed\xa7\x84\x0a\x3b\x3a\x0e\x16\xa6\x6e\x27\xf1\xb4\x73\x17\x5a\x76\x77\xae\x31\xac\x6f\x0c\xe7\xeb\x92\x50\x9e\x58\xb2\x3f\xd5\x5c\x82\xba\xbe\x18\xde\x07\xb9\xc8\x41\xf1\x05\xb1\x49\x68\x26\xc5\x38\x66\xba\x4a\x8f\xf0\x09\x88\xb3\x82\x35\x25\x46\x47\xdd\x54\xba\xe9\x4d\x86\x92\xfb\x2d\x6d\xd9\xdf\xbf\x1e\x5a\x8d\xa0\x10\xe9\x50\x96\xc6\xa7\xbc\xe1\x93\x00\x02\x0b\x30\x12\x91\xe0\xad\x1e\xdc\x59\x63\x9a\xee\x5a\xbd\x75\xd4\x67\xa9\x7e\x10\xd7\x94\xcd\x1e\x61\x34\x99\x90\x6b\x36\xeb\xa3\x88\x2f\x28\xa0\x1f\x00\x9d\x8f\x2d\x75\xb1\xbf\x50\x3d\xa3\x20\x61\xa9\xb5\x03\xdd\x22\xf8\xcc\xc4\x8a\xeb\x03\x7a\x82\x37\x95\xb4\xd3\xa8\x5d\xdf\x22\x11\x39\x0e\x7d\xa3\xc2\x44\x0a\xe3\x9a\x20\x86\x46\x45\x90\x69\x39\x57\x61\x6f\x25\x0a\x4b\xed\xcf\xf4\x5d\x4f\xae\xd2\x31\xed\x91\xe1\x94\x89\x52\x2c\xfc\x1a\x90\xc0\x21\xef\x55\x33\x87\xe7\x43\x7d\x03\xbc\x28\xa5\x73\xc2\x13\xa8\xaa\xb1\xb7\xbb\x7b\x3d\x95\x02\x21\x6a\x08\x00\x9a\x99\xd2\x91\x06\x72\x69\xed\xb3\x99\xd6\x84\xc3\x1b\xe6\x54\x5d\x33\x0f\x66\x4b\xb3\x01\x39\xb7\x93\x0c\x38\xe5\xd8\x37\x6e\x8a\x45\x10\x56\xa6\xc4\xd0\x06\xf6\x21\xbb\x83\xc1\x2e\x9e\x85\x4b\x80\x0e\x5a\xf3\x4b\x97\x2d\xc3\x3a\x6b\x15\x56\xd7\x83\x68\xa1\xb1\x75\x9a\xb5\x0e\xa0\x3d\xa1\x04\xdc\x11\x33\xf1\xda\x02\x6d\x09\x3e\x1d\x5f\x1d\xf7\xac\xea\xb6\xed\x65\x77\x4d\x2f\x5b\x84\xc0\xeb\x57\xd7\xcd\x2e\x3b\x6c\x75\x59\x4f\x38\x76\xf2\xa7\x3a\x41\xba\xea\xbb\xd7\x79\x63\xc5\xbc\x83\xb6\x56\xfe\xba\x0d\xb9\x38\x5f\xc5\xba\x00\x45\xdb\xca\xf2\x27\x65\x4e\x9c\x8e\x40\x86\x2e\x47\x6b\x89\xac\xb4\x70\xa4\x58\x0a\xac\xdf\x8e\xe8\xa2\x57\x3c\xe9\xc8\xb0\x98\xbf\xda\x1b\x1a\xf3\x57\x9b\x64\x96\xf9\x6b\x61\x9f\x87\x33\xb5\x88\x4a\x69\x61\x89\x8c\x84\x1e\x8c\x26\x08\x83\x01\x79\xeb\xce\x5c\x64\x6e\x3a\xd4\x32\x2b\x4d\x80\x55\x58\x72\x20\xc3\xa0\xbe\x63\x23\xc2\x0d\xf9\xdb\xa2\xe3\x19\x14\x13\x3c\xb3\xba\x39\xa9\xf1\xea\x50\xd8\xb4\x4d\x46\xc5\xeb\x0f\x96\x92\x8a\x57\x87\xab\xe0\xf5\xc2\x8e\x57\xe2\xd2\x61\x4a\xfa\x3a\xc0\x9a\xf6\x0a\x69\xa9\x46\xa3\x6a\xec\x15\x51\x6c\x78\xd8\x14\x6d\xb9\xba\xda\x3b\x5e\xdd\xeb\x38\x6f\xe0\xe1\xf9\xe9\xa3\x5b\x99\xd1\xb3\xb6\x76\xe6\x4a\xd7\x12\x87\x2f\x00\x11\x78\x27\xd0\x71\x45\x51\x17\x60\xb3\xf2\xf7\x0f\x60\xae\x2c\xbc\xf8\x6b\x7b\xee\x44\x41\xa9\xb9\x96\x0f\xe8\xc1\xad\x4e\xa8\xa8\x4d\x84\x4f\x97\x01\x69\xf6\xfc\x4d\x9b\x0d\x35\x48\x80\xfa\x2d\xea\x5e\xe6\xaf\xf9\xc4\x52\x47\x44\x72\x09\xbd\xf6\xd1\x7b\x12\xb9\x61\x0a\x99\xbe\xc2\xa6\xcd\x54\x08\x69\xb0\xc7\x7c\x0f\x9b\xf5\xeb\x1e\xba\x57\xac\x92\x19\x25\x5a\xa9\x28\x84\xd9\xb1\x5a\xd9\x19\xf3\x90\xce\x19\x88\x00\x13\x01\xed\xce\xbb\xe1\x24\xf2\x08\xdc\x64\xaf\x4a\x2b\xe9\xb2\xaf\x7a\x3d\xdc\x88\xe3\x7b\x26\xd2\xc9\x84\xe5\x14\x1b\x5c\x78\x02\x59\x79\x7d\xa3\xb8\x31\x0c\xf1\xaf\x99\xca\x35\x91\xa3\x9e\x37\x91\x10\xf5\x64\xfa\x72\xa7\xbb\xfe\xf4\x8f\x60\x2b\x13\xbf\x43\x9b\xc2\x57\xdd\x76\xd5\x7d\xff\x35\x3b\xc2\xee\x4e\x30\x98\x33\xe8\xb8\x23\xe6\x9c\x90\x56\x89\x98\x22\xfd\x37\x9a\x74\x9b\xe7\x66\xe8\x05\x65\x74\xeb\x66\xd8\xba\x19\xba\x18\xf1\xd1\xdc\x0c\xd1\xc1\xed\x85\xa9\x5b\x80\xd8\xf5\x10\xe3\xbf\x7b\xff\x43\x85\xeb\x10\x61\x19\x5b\x96\xf7\x9e\x07\xa9\xea\xfe\xff\xdd\xc1\x60\x77\xd7\xfb\x23\xdc\xfe\x28\xcd\xa8\xff\x35\x61\x22\x91\x29\x32\x95\x1d\x5f\x69\x03\x4a\x6d\x65\x80\xc7\x73\xc9\xfd\xb3\xe2\x18\x02\x8c\xdd\x2d\x4b\x74\x28\xa1\x7c\xce\xc8\xeb\x47\x55\xc1\x2a\xc5\x2b\xc0\x57\x39\x02\x06\x94\x3f\xa7\x81\x55\x39\x2c\x19\xcf\xb9\xc3\xd5\xb3\xe2\x82\x69\xa3\xc9\x1e\x7e\x38\x48\x8a\xb2\xe7\x6e\x18\xe4\x2c\x97\x6a\xd6\x0b\x37\xd9\x2f\x6b\xbf\x72\x77\xec\x83\xd6\x96\x94\x4a\x31\x61\xb2\xd9\x1f\x57\x7f\xf3\x24\xde\x60\xf5\x2d\x70\x45\x9b\x12\x8b\x65\xd7\x5c\xd9\x45\x00\xb6\x07\x47\x5d\xa0\x36\x9c\x43\xae\xd8\xa1\x17\xdc\x47\xf0\x29\x13\x53\x32\xa5\xaa\x71\xb1\xc3\xb2\xeb\x51\x34\xb6\x94\x4f\xb9\x96\x8d\xcb\xc5\x96\x0e\xb9\xe8\xfd\xe2\xae\x11\x80\x2c\x4d\x51\x1a\x77\xba\xf8\xbd\xed\xa1\xe6\xc2\x9e\x9e\x53\x7c\x5f\xee\x74\x38\xb9\x82\x1a\xc3\x94\x78\x45\xfe\x7b\xef\xc3\xe7\xbf\xf7\xf7\xbf\xdb\xdb\xfb\xe5\x45\xff\x3f\x7f\xfd\x7c\xef\xc3\x00\xfe\xe3\xb3\xfd\xef\xf6\x7f\xf7\x7f\x7c\xbe\xbf\xbf\xb7\xf7\xcb\x8f\x6f\x7f\xb8\x3a\x3f\xf9\x95\xef\xff\xfe\x8b\x28\xf3\x6b\xfc\xeb\xf7\xbd\x5f\xd8\xc9\xaf\x2b\x0e\xb2\xbf\xff\xdd\x7f\x74\xf8\x12\x54\xcc\xde\x75\x26\x82\xf1\xea\x3f\x8a\x1a\x51\x1f\xbb\x63\xd6\x25\xe4\x63\xbf\x72\x5e\xf7\xb9\x30\x7d\xa9\xfa\xf8\x90\x57\xc4\xa8\xb2\x2b\xd1\x55\x1d\x7f\x8f\x27\x63\x2a\x25\xa6\x42\x6e\xf4\x86\xcd\x06\x0a\x11\xcc\x1c\x7d\x74\x6f\xb0\x6b\x97\xba\x75\x04\xaf\x72\x3d\x4a\xc2\x91\x43\x86\xf9\x83\x67\x1b\x5d\xba\x8e\xbc\xdb\x54\xa3\x85\x6b\x9b\x6a\xb4\x78\x6d\x53\x8d\x1e\x78\x6d\x53\x8d\x36\xd0\x07\xb8\x4d\x35\xda\xfa\x00\x9f\x88\x0f\x70\x9b\x6a\xb4\xea\xb5\x4d\x35\x6a\x7c\x3d\xcd\x54\x23\xa7\xc0\x57\x79\x46\x1b\x9b\x66\xe4\x1a\xfc\x1f\x26\x89\x2c\x85\xb9\x92\xd7\xac\x65\x54\x76\x25\x03\x73\xe1\x99\x9b\x69\x6d\x76\xa5\x52\x76\xa0\x02\x76\xa7\xfc\xd1\x32\xe5\xd6\xcc\xec\x78\x1b\x1c\xba\x61\xbd\x9d\x69\x8f\x45\x91\xb2\x34\x3c\xcf\x0b\x2b\x63\xd7\x7b\x40\x0e\x89\x62\x09\x2f\xb8\x15\xed\x00\xa6\x03\x9f\xe3\x3e\x09\xfd\x80\xb9\xd1\x2c\x1b\xb9\x9e\xa8\xa2\xaa\x19\x56\x91\x09\xe9\xce\x8a\xa5\x8f\x41\xad\x40\xfa\x36\x96\x44\x4f\x64\x99\xa5\x44\xb1\x7f\x79\x75\xc2\xcd\xe6\x2a\x1e\x21\x76\x84\xc2\xab\x54\x8f\x75\x83\xd3\x82\x3b\xd4\xad\x4d\x12\x70\xec\x63\xc1\x15\x6c\xb6\x4b\x96\x48\x91\x76\xed\xde\x38\x99\x1f\xdf\xaf\xb5\x8b\xe6\xb0\x94\xa4\x25\xde\x00\x85\x90\x34\xe3\x29\x37\xb3\x90\x85\x81\xdb\xde\x2a\xa2\xd8\x85\xd6\x31\x82\xae\x16\x82\xd0\xa2\x50\x92\x26\x13\xa6\xa3\xb7\x41\xb5\xd2\x81\x4d\x84\xfa\xca\xac\x1c\x73\x81\x9a\x25\xfc\xc6\xaa\x21\xd9\x8c\x28\x69\x7c\x42\xd9\x2d\x0f\xbc\x8a\x06\x83\x9f\xa3\x2e\x61\xd4\x0c\xb2\xce\x64\x3c\x04\xce\x8a\x8f\xe2\x3f\x34\x91\x59\xea\x71\x4b\xbf\x7e\x61\x55\xf9\xc4\x71\xb1\x95\xf6\x80\x2a\x69\x24\xc9\xac\x5a\x64\x4f\x80\xdb\x7f\xfc\xc5\x57\x64\x22\x4b\xa5\x07\x31\x84\xc0\x4b\xf8\x0c\x9d\x14\xde\x14\x30\x24\x63\x54\x1b\xf2\xf2\x05\xc9\xb9\x28\xed\x59\xde\x11\xe3\x75\xa5\xbd\x46\x7a\xeb\x5f\xbe\x6a\x39\x5a\x37\x1a\xeb\x62\x06\x8b\xe3\xd6\x02\xfb\xb3\x39\xc5\xd5\xed\x71\x04\xc5\xc0\x1e\x8d\x73\x6a\xac\x3b\x92\xe2\x55\x14\x46\xae\x79\xe7\xff\x56\xca\xe1\xcc\xb4\x87\x81\xf9\x2f\x1c\xa7\x8e\xff\xe2\x3f\x5c\x05\x4b\xb5\x82\x52\x6d\x30\x95\xb5\x77\x8b\x1e\x73\x6d\x1a\xf5\x8a\xae\x70\x63\x1a\xfc\xb8\xed\x61\x3e\xb6\x16\x6f\x27\x45\xeb\x60\x3b\x7b\x5b\xcd\x3b\x95\x93\x84\x69\x10\x45\x1e\x3e\x0d\xfc\xb3\xf8\xd4\x86\x0f\xdd\x2c\xc4\x96\x3b\x11\x59\x3c\xf3\x77\xd0\x19\xb3\x15\xb1\xda\xe8\xf6\x9e\xb1\x3b\xa2\x16\x0e\x56\x97\x11\x9a\x8b\x31\x36\xb2\xcc\xcb\xcc\xf0\x22\xab\x28\x17\x7e\xe0\x0e\xe0\xd8\xe1\x4f\x23\x0f\x33\x45\xe0\x28\x84\x06\x87\xe0\xc8\x5e\x18\x8b\x09\x83\xfd\x18\x95\x3d\xc7\x0b\xaa\x68\x20\x7f\x22\xf3\x9c\xea\x7d\x17\x3b\xa0\x90\xbb\x82\x92\xdd\x1e\xc3\x8a\x66\xe1\xf5\xe3\x5c\x81\x75\x31\xae\x61\x82\x8a\xc6\x41\xbb\xba\xc3\x05\x86\x22\xf2\x26\xa4\xc7\x63\xff\xf4\x39\x8e\x75\x0a\xf1\xf7\x34\xb9\x66\x22\x25\xef\xb5\x27\x5c\x3a\x13\x34\x77\xe0\xea\x85\x92\xd8\xb7\x9b\xa5\x73\xbf\xd7\x3d\xe7\x48\x44\x94\x11\x0f\x02\x85\xfa\xd6\xba\xa8\x58\xea\x8e\xd0\x75\xdf\x6b\xab\x7c\xdd\x2d\xef\x34\x3a\x69\x15\x9f\x26\xcc\xeb\x8e\x76\x02\xeb\x7a\xf9\x69\x63\xc4\x37\xb2\x1c\x87\xc9\x35\xcd\xc4\x5d\x08\x47\x7a\x08\x3e\x02\x8e\x3a\xcd\xac\x88\x9b\x05\x78\x9d\x39\x06\x1b\xce\xd6\xd7\xb2\x5f\x0d\xdb\x03\x34\xed\x5e\x7c\x7f\x5c\x17\x66\x17\x34\x95\x9a\x7c\x9f\xc9\xe4\x9a\x1c\x33\x30\x1a\x1e\xb3\xdd\xbb\x1a\xa6\x4f\xbb\x4d\x63\x4e\xc7\xcd\xf2\x3c\xfa\x24\x97\x82\x1b\xa9\x9a\xc8\xe3\x0d\x02\xdb\xdb\xb6\xda\x5b\x0e\x22\xae\x86\xe9\xb3\x69\xb4\x67\x99\xbc\xa3\x0e\xbb\x13\x46\x14\x88\x18\x18\xd4\x77\xff\x68\x28\x30\xfe\x34\x91\x37\x7d\x23\xfb\xa5\x66\x7d\xde\x38\x4f\xa9\x35\x7d\xae\xd9\x0c\x92\xbe\x3a\xa1\xd0\x8f\x38\x58\xcd\x44\x37\x12\x3c\xe7\xf0\xb9\x55\xe4\x2e\xbe\x3f\xb6\xa7\xf7\x20\x36\x4b\x0e\x98\x49\x0e\x12\x56\x4c\x0e\xdc\x74\x9e\x3c\x59\xbd\x7c\xec\x86\xae\x87\x24\x91\x59\xe6\x70\xbb\xe4\x88\x1c\xb1\x62\x12\x1e\xb1\x19\xb4\x7a\xca\xcd\xd2\x0a\x29\xbb\x69\xac\x14\x89\x08\x3b\xa6\x93\x10\x11\xa3\xab\xe1\xc3\x7a\x41\x6f\x22\x6b\x7f\xc2\x9e\x24\x4d\x7a\xcb\x6d\x04\x79\x37\xa7\x47\xdd\xee\xa5\x1f\x0e\xfc\x3f\x51\xb8\xb9\xde\x92\xce\xe7\x8b\xd6\x44\xf4\xe9\x08\x2d\xcc\x94\xa5\x44\x4e\x99\x52\x3c\x65\x9a\x04\x19\x1d\x3b\x96\x78\xb6\x19\x94\xdf\x76\xc7\x7b\x5a\xf9\x01\x9b\xe3\x53\x88\x84\xb7\x1d\x73\x51\x78\xd3\x34\xe7\x62\x33\xb8\xbc\x21\xbd\x74\x42\x33\x76\xfa\xae\xb5\xe9\x7d\x89\xe3\xd4\xad\x6f\xff\x61\x04\xb2\x7f\x0f\xf0\xfc\x8f\x81\x67\x89\x90\x69\xb3\x68\xd8\x9a\x6d\xe8\x31\x35\xec\xa6\xa1\xe2\xd3\xaf\x44\x7d\xd3\xdf\x83\xe5\xf5\xb4\x6d\xf0\x35\x35\xc8\x88\xf6\x35\xa2\xde\xaf\x4b\x9d\x72\x1c\xd4\x8d\x6b\xd9\x93\x62\xae\xbf\x98\xdf\x9a\x87\xe7\xa7\xe4\x07\x7c\xde\xfa\x3a\x7e\x28\x69\xd0\x92\x39\x96\x39\xe5\x1d\x35\x62\x8f\x1a\x3a\xc5\x2f\x7c\x1e\x1e\x46\xf0\x69\x71\x17\xfa\x11\x1f\x97\x8a\xa5\xc4\x79\x3f\xb6\x6d\x0c\x36\xb8\x8d\x41\xb7\x4a\x71\xa5\x13\x47\x1e\x73\x5f\x19\x53\xe9\xc1\x9e\x8b\x40\x1d\x08\x29\x48\x44\x33\xa1\x39\x64\x1d\x44\x89\x71\xa0\x2c\x43\xfe\x77\x28\x83\x41\xc5\xb9\x47\xde\xc8\x31\x17\x5e\x3a\x49\x97\xec\x32\xa2\x3c\x6b\x47\xce\xad\xa6\xfb\x07\xd3\x74\xb5\xce\x4e\x04\x1d\x66\xcd\x33\x19\xeb\x07\x6f\x46\x21\x4f\x8a\xc1\x98\x07\x29\xd7\xf6\x5f\x72\x79\xf9\x06\x62\xb3\xa5\xf0\x96\x21\x44\x1d\xdd\xb1\x11\xea\x8b\x51\xb8\xac\x4f\x1e\xa0\xcc\xee\xac\x4f\xc5\xa9\x48\xed\xeb\x32\x5d\x4b\x00\x76\x4f\xc1\x2e\x20\xa1\x7a\x0d\xb3\x0f\x87\x8c\x5c\x4d\x78\x72\x7d\x1e\x85\x60\xa5\xb2\x9f\x89\xe8\xa3\x9a\xa2\x31\xff\xdd\xba\x0e\x1c\xf7\x5a\xe7\x5d\xb9\xbd\xae\xa2\x13\xf7\xd2\x91\xcc\x0e\x4e\xa8\xd6\x32\xe1\x55\xcc\x1f\x9c\xc2\xd5\x91\x9c\xc2\x91\xbc\x3e\x32\x80\x96\xf8\x28\xfa\x87\x67\x1c\xa7\xb4\x52\x1d\xeb\x1b\x5c\x78\x6a\xad\xed\xd5\x91\x95\x3b\xeb\xae\x79\x55\xeb\xa7\xe9\xad\xbe\xb9\xf0\xb3\xaf\x07\x75\x8c\xe2\xf5\x79\xd7\xc0\x79\x91\x55\x42\x5f\x4d\xd7\xdf\x63\x2d\xc4\x6a\x5e\xac\xbd\xcc\x0b\x37\x97\x7b\x83\x9f\xb9\x80\x34\x08\x95\x42\x16\x65\x86\x59\xab\xed\xdb\x8a\xfa\x68\x1e\x3e\x67\x0d\x01\xea\x4d\x6b\x46\xf4\xd0\x72\xbe\xe7\xd1\x97\x28\x32\x08\x5e\xfc\xe5\xab\xaf\x9e\x7a\xa7\xa2\x76\x8e\xb3\x75\xb7\x2a\x6a\x15\xea\xda\xa2\x14\x6c\x51\x0a\xee\xba\xd6\x1e\x89\xfd\xf4\x38\x04\x9d\x14\x89\x75\x51\x20\xd6\x16\x69\xa0\x65\x71\x59\x37\x85\x65\xad\xb1\x04\x1e\x15\x41\xa0\xa3\x1a\xab\xf6\x68\x01\x5b\x8c\x80\x3f\x06\x46\x40\x77\xb5\x55\x5d\xe1\x01\xb4\xaf\xa9\x7a\xfe\xb5\xff\xad\xc5\x44\xdb\x0a\xf3\x87\xd7\x95\x77\xd5\xbf\xa2\x2b\x3f\x7b\x67\x8e\x81\x9a\x57\xd7\xd9\xbb\x9e\x33\x30\xf3\xba\x42\x7c\x37\xd2\x0a\x8d\x35\x5a\xbb\xa4\xb5\xb3\x00\xa7\x22\x1b\x9d\xc1\x75\xae\xc1\x91\xde\x5d\xce\x85\xd8\xc3\xc7\x9b\x1f\x59\xdf\x86\x98\xb7\x6d\xd4\xb7\xf1\xc7\x70\xdd\x12\x7f\xd4\x35\x8c\x57\xef\x11\x04\x49\x08\x2a\x98\x1c\xc6\x7d\x54\xaa\xfd\x7f\x78\x7e\x4a\x12\xc5\x00\xd2\x80\x66\x7a\x40\x96\x68\x68\x3e\x52\xe3\x34\x3a\xaf\x99\x51\x63\x58\x5e\x98\xb6\x0c\xb7\x0d\x3f\xfe\xc1\xc2\x8f\x1d\xc7\x0c\x7e\x0a\xc3\x79\x6f\xd1\xa4\xcc\xa9\xe8\x5b\x69\x01\x81\xc8\x5a\x3e\xc7\xdc\xc1\x37\x20\xbe\x06\x0e\xa9\x49\x15\x43\x70\xf3\x52\xf0\xdf\x4a\x56\xf9\x17\x82\x7a\xb1\x01\xa1\x16\x98\x47\xc7\xb4\x43\xd5\x69\x4e\x8a\x24\x72\xa1\x94\xc9\x11\x24\xd0\xd1\x0b\x8c\x48\xff\xaa\xf9\xca\xcc\x84\xa1\x9a\x76\x0e\xe0\x00\xd5\x5d\x75\xfb\x0e\x0d\x3c\x9a\x65\xf2\x06\x9f\x1d\x2b\x1e\x76\xfd\xec\x5c\x1c\x1e\xc7\x90\x91\x9c\x2b\x25\x95\x0b\xf1\xc4\xd3\xc1\xb4\x1c\x6b\x27\x32\x85\x06\x97\x72\x59\x15\x97\xcc\xc4\xac\x62\x24\xa1\x02\x0b\x17\xed\x7f\xfb\xa4\x64\xec\x7f\xe6\xe4\xdd\x90\x4d\xe8\x94\xcb\x52\xe1\xaf\x8d\x24\x3b\xee\x2b\x38\x72\x67\xb2\x0c\x6e\xee\x12\xea\x94\xc2\xdb\xe9\x25\x74\x3a\xab\xbe\x04\x03\x35\x95\xde\x7f\xd8\x67\x1f\xb9\x36\x8b\xef\xe2\x49\xe4\x1b\x24\xac\x83\xf3\xa6\xba\xb0\x07\xec\x4f\x8d\x6b\x4e\xeb\xfc\x16\x8f\x56\x57\x49\xa7\x97\xf0\xd5\x7d\x0a\xa9\x43\x6a\xc1\x52\x71\x5f\x14\xf6\xf4\xd2\x3d\xf1\x2d\x1b\x76\x66\xda\x6a\xc4\x4f\x45\x23\x0e\x09\x12\x19\x4f\x66\xa7\xc7\xdd\xe8\x7c\x21\x31\xc2\x0e\x4a\xbe\xa7\x9a\xa5\xe4\x2d\x15\x74\x8c\xce\x91\xbd\xcb\xf3\xef\xdf\xee\x5b\x26\x01\xe7\xcb\xe9\xf1\xd2\xec\x89\xcb\x78\x66\x67\xeb\x2a\xdf\x26\xf3\x34\xea\x4c\x2b\x78\x20\x95\xd6\x56\xc0\x4e\xc2\xc9\xde\xa6\x65\xd7\x22\xb8\x11\xa6\x43\x78\xa4\x32\x3d\x2f\x5e\xa7\x79\x7a\xfd\x98\xaf\x1b\xf9\xaa\xef\x7a\xa7\xd5\x02\x4d\x2b\x04\x93\xe6\xd6\x5e\x51\xc3\xc6\xb3\x63\x56\x64\x72\x66\x97\xfb\x3c\x72\x9d\xe3\xad\x43\x3c\xea\xd5\x90\x26\x44\x95\x19\xc3\xee\x35\xf3\x10\x61\x82\xb1\xb4\x92\x53\x5c\x68\x43\x01\x20\x0c\xc7\xbf\x73\x46\x2b\x1f\x30\xab\x1e\x25\x7d\x9c\xe7\xbd\x77\xd5\xe1\x14\xed\x86\xba\xf3\x27\xab\x1f\x26\xf0\xf8\xfb\x39\xf4\x21\xc1\xc3\x95\xc3\x84\x75\x06\x87\x3d\x7d\x51\x66\xf6\xe8\xc8\xd2\xb9\x26\xa2\xa0\x5b\xb9\x35\x46\x64\x06\x90\x00\x76\xf6\x3d\x32\x2c\xad\xe2\xc5\x74\xcd\xbf\xbc\x08\x4b\x79\x33\xc1\xb8\xb1\xfd\x11\xa1\x45\x91\x71\xcc\xeb\x95\xca\x05\x7f\x23\x6f\xe3\xe2\x6d\xab\x08\x92\x07\xea\x1f\x0f\xd3\x37\xfa\x64\xca\xd4\x70\x15\x4c\x85\x87\xaa\x12\xb4\xe0\x10\x3b\x59\x59\xf3\xa8\x83\x42\x9e\x9f\xe2\xaf\xbd\xa5\x16\x9b\x66\xfe\x4b\x5c\x41\xb7\x36\x1e\x50\xd0\x75\xa5\x41\x6b\x23\xa0\x02\x1d\x9e\x9f\x22\x0c\x95\x03\x06\xaa\x5c\x16\x56\xb7\xa7\x98\x1c\x58\xa1\x11\xd2\xb1\x1d\xd1\x10\x29\xc2\x43\x99\x28\x73\x86\x60\x42\x55\x3b\x2b\x6b\xf0\x89\x59\x35\x7a\xe5\xf1\xb0\xf6\xc9\xea\xea\xc4\xc3\xc3\xe8\x0f\x0c\x9b\x3f\xf8\xe4\x11\x52\x5c\xb8\xd7\x7c\x7f\xf1\xa6\xd9\x22\x9e\xd5\xc7\x70\xe0\x31\x0c\x70\xf2\x0a\xaa\x0c\xa7\x19\x29\x55\xe6\xc3\x70\x98\xf4\xee\xd2\xd2\x26\x74\x1a\x01\xec\x0c\x08\xf9\x0c\x57\xce\x11\x16\xf7\x27\xb6\x77\xc5\x95\x1f\x95\x59\xd6\x23\x23\x2e\xa8\x15\xbb\xac\x20\x71\x38\xe8\x92\x8b\xc4\x9a\x5f\xd6\xd6\x77\xfd\x5a\x60\x46\xde\x28\x0b\x9b\x14\xa2\x8c\x10\x2d\x65\x59\x0a\xa0\x8b\xf0\x08\xbb\x61\x13\x70\x11\x58\xab\xf1\x28\x2b\xb5\x61\xea\x42\xda\xc3\x20\xca\x6b\x01\x38\x0a\x1a\x7f\xfd\x3d\x17\x29\xa4\x30\x5d\xc0\xc1\x91\x50\x41\x18\x07\xe7\x8b\x1d\x12\xe2\xd4\x96\x77\x2a\x86\xda\xd3\x65\x32\xb1\xaf\xb4\x53\xc8\x54\xef\x58\x31\xb2\x83\x2e\x3a\xbd\xb3\x6f\xff\x9a\x7f\x07\x4c\x53\x89\x7e\x77\x40\x0b\xbe\xb3\xdf\x23\x40\x20\x08\x9c\x49\x33\x79\xba\x7c\xe8\xdf\x15\x6c\xe2\x46\x5c\x78\x11\x8f\x00\x3c\x28\xaa\xee\x5f\x37\x13\x6e\x58\x68\xbe\x8d\x9e\x9d\x80\xaf\x32\x2f\xac\x09\x39\x14\x84\xe5\x85\x01\x6f\x31\xc9\x19\xf5\x21\x64\x36\x65\x6a\x66\x6d\x72\x00\xa2\x78\xf2\x9b\x3f\xf0\x63\x2b\x82\xcf\x75\x36\xaf\x98\x1c\x76\xd8\x02\x71\x77\x3f\xdb\xad\xd9\xf9\x59\x16\x49\xf3\x27\x4b\x4a\x38\x5e\x1b\x91\xf1\x27\xfb\xcb\x3a\x09\xf1\x23\x94\x96\x41\x7e\xbc\x79\xe3\x02\x19\x48\xab\x1f\xb9\x48\x51\x45\x3d\x34\x46\xf1\x61\x69\xd8\x05\xb3\x13\x4e\x30\xe5\xc1\x77\xe1\x73\xd9\xd1\x6e\x25\x96\x92\x1f\xe6\xfe\x14\x49\xbf\xa8\xd8\xae\xaa\x8c\xde\x31\xbc\xd7\xe5\x6f\x1b\xea\xce\x01\x9c\x41\xf0\x56\xa6\xcb\x37\xd5\x5c\x65\x48\x75\xb3\x53\x55\xa2\xce\x96\x7e\x2c\xa7\xc4\xce\x8a\xa5\x9a\xfe\xdd\xcb\x71\x07\xe9\x6f\x9b\x49\xe5\x1b\x00\x09\x1a\x7d\x73\x35\x2b\x98\x43\xda\x26\xa3\x8c\x8e\x2b\x36\x02\x79\x88\xea\xd3\xd1\xe5\x4f\xfe\x15\x34\xe1\xcb\x15\xd9\x7b\x35\xdd\xfb\x74\xdb\x7e\x45\xa5\x5b\xef\xb0\x0f\x59\xfa\xe5\xfd\x0a\x6e\x18\xfc\x76\x6e\x5a\x25\xec\x67\xee\x74\xa9\xdd\x46\xff\x2b\x87\xf0\x45\x23\x4e\xf0\x00\x62\xde\xdc\x84\x4c\x24\xd0\x50\x2e\x7f\xaa\xb1\xc9\x3d\xf3\xbd\x85\x69\xaf\xd9\xec\x46\xaa\xe5\x68\xe0\x8d\xf9\xeb\xce\x27\x62\x77\xfe\x7b\x37\xc8\x5b\x5a\xd8\xd7\xae\xf2\x3c\x51\xe0\xb9\xa8\x23\x5a\x05\x98\xa1\xe5\xb3\xe2\xa4\x1a\x53\xc1\xff\x8d\xc9\xb1\x89\xdd\xc7\x52\xd9\x3f\xf7\x30\x72\x81\x16\x7d\xc6\x12\xb3\xef\xf8\x6f\xa9\xdc\xbb\x87\x41\x69\x9a\x72\xd4\x2b\xce\xef\xe1\xa5\xbb\x89\xc0\xc5\xf5\x63\xd0\xfc\x8e\x8d\x75\x3f\xef\xdf\x1d\xfa\x5c\x41\x36\x97\xea\x8e\xec\xa6\x3b\x7f\x9f\x53\xee\x3a\xba\x6e\x1c\x55\x58\x4e\x79\xd3\xd7\xc2\xab\x05\x5d\x73\x6a\x4a\xc5\xcd\xd2\x03\xe9\xee\x1f\x72\xf1\x63\x39\x64\x2e\xda\xfb\xe0\x9f\x0b\x48\xde\x3b\x3c\x3f\xed\x76\x39\x16\xe1\xa5\xdd\x04\xad\x46\x43\x4a\x41\xf3\x21\x1f\x97\xb2\xd4\xd9\x2c\x76\x57\x52\x08\x56\x5b\x73\x1f\xfd\x35\x62\xd7\x10\x2a\xa4\x98\xe5\xee\x56\x91\x64\x65\xca\x6a\x23\x42\x4c\x6f\x2a\x79\x4a\x68\x69\x64\x4e\x0d\x4f\x48\x22\xf1\xbb\xfa\x48\xa5\x66\x84\xde\xf2\xdb\xa4\xd4\x46\xe6\x24\xa7\x4a\x4f\x68\x96\xdd\xb6\xc6\x1d\x9c\x6a\x77\x01\x68\xf7\xe1\xfd\x6f\xfd\x72\x8a\xb3\x6e\xc8\xdf\xf7\xe0\x85\xaf\xc0\xdf\x76\x72\xad\x06\x98\xde\xce\xa5\x2b\x8c\xe1\x4a\xe2\x97\xc2\xf5\xdc\xb3\x30\xf7\x51\xe7\xae\x9d\x7b\xef\x7b\xdd\x21\x0d\xef\xfc\x2d\xa4\xce\xb2\xf4\x34\xa7\xe3\x15\x14\xc9\x37\xd6\x6e\xa0\x62\xe6\x7f\x86\x28\x92\xba\x47\xa4\x72\x39\x20\xa1\x27\xb7\xfb\x2a\x00\x90\x2a\xf2\x0e\xc2\x6c\x52\xb9\x64\x6a\xc7\xa5\x90\x5a\xcf\xd4\x48\xaa\xdc\xea\x75\x5c\x91\x51\x29\xd0\xb4\x70\xb9\xd7\x60\xac\x38\x2f\x0e\xcd\xb4\x0c\x3b\x10\xe2\x76\xc2\x4f\x82\x50\x4d\x6e\x58\x96\x0d\xc8\x61\x96\x39\x78\xcb\x08\x1a\xa1\x2a\x79\xae\x32\x04\x86\x33\x92\xf2\x31\xd3\x86\xec\x5d\xfe\xed\x70\x1f\x4e\x6d\xf0\x70\xcc\x88\xa1\xbe\x4e\xac\xee\xb9\x81\xf3\x3f\x2d\x41\x4f\x48\xa8\xa1\x99\x1c\x63\x90\x1c\x3c\xb8\x22\x25\x45\x46\x67\x00\x52\x5f\x50\x05\x89\xa2\x09\x7a\x6f\x88\x2a\x05\xc0\xf3\x7e\xd2\x13\xe7\x7e\x51\x70\x17\x82\x6e\x1f\x78\xb2\xe1\x56\xbf\x07\xb5\xf4\x71\x8f\x32\xc5\x8a\x8c\xde\xe2\x6f\xb8\xa3\xec\xd7\xaa\xb9\x60\xc2\x4a\xc1\xc2\x18\x03\x72\x89\xbc\x93\x53\x93\x60\x08\xf3\x9f\x39\x33\x34\xa5\x86\x0e\xac\x2d\xf8\xcf\x7a\x61\x9a\xcc\x52\x3b\xd0\xed\x0b\x7d\xcb\x9c\x51\x5f\x5c\xde\x8c\xbd\xbe\x0b\xad\x52\x1b\x6e\x07\xfd\xdc\xef\xc7\x3b\x1d\x1c\x2d\xe5\x13\xbc\xfe\xc9\x47\x6b\x8a\xdd\x19\x5d\xab\xcd\x75\xfe\x47\x75\xff\x43\x56\x7f\x13\xc7\xad\x39\x03\x5c\xc4\x2b\xd7\xcf\xc7\x7f\x02\xce\xd5\xc3\xb3\xe3\xdb\x1d\x61\xf7\xbb\x0c\xee\x71\x11\xd4\x43\x06\x77\x4c\xcf\xbb\x9e\xdd\x37\xf5\xb8\x81\x2f\x4e\x81\xfa\x3d\x2c\xf5\xa0\x1e\x3c\xc5\xdf\x8c\x0b\x56\xaf\x3c\xc4\xdf\xdd\xee\x1f\x59\x29\x70\xb3\x4a\xb8\xe6\xbe\x42\xaf\x7e\x98\xec\xad\x37\xad\x16\xbd\xb9\xb7\x18\xab\x46\x70\x57\xed\x08\xc5\x95\x40\x79\x28\xd9\xf0\xce\xd3\x40\xec\x55\xa3\x5d\x2b\xfa\x77\xfc\xab\x3e\x60\xa2\x61\x29\x6b\x69\x44\xd7\x6c\xb6\xab\x5d\x2d\x8a\x14\x7a\xc2\x0b\xac\x16\x74\x01\x0a\xb7\xba\xe4\x27\x9a\xf1\x34\x0c\x81\x5c\x7d\x2a\x7a\xe4\x4c\x1a\xfb\xcf\xc9\x47\xae\x0d\x9a\x9f\xc7\x92\xe9\x33\x69\xe0\x93\x4e\x5e\x15\xa7\xf0\x80\x17\x75\x06\x30\xfa\xb8\x61\x5f\x45\x66\xb2\x7f\xa1\x53\x27\xf6\x3c\x51\xb8\x26\xa7\xc2\x6a\x04\xee\x8d\x42\x15\xad\x76\x43\xf8\x42\x11\x21\x45\x1f\xbc\xdf\x4b\xc7\x70\x84\x90\xaa\x46\x87\x3b\x86\x73\x43\x61\x3a\x1f\x7c\xc3\xb5\x17\xe2\xe1\xcc\xa6\xde\xed\xc6\x13\x92\x33\x35\x86\x78\x4e\x72\x4f\x3c\x63\x55\x57\xe4\x4a\x0e\xc8\x7b\xd7\x0a\x44\xe6\x9b\x5b\x1d\x17\x0b\x8b\x14\xdd\x8f\x62\x29\x47\x6f\xc6\xff\x58\xe9\x03\x94\xfa\x5f\x28\xa5\xd6\x03\x72\xe8\x9b\xa5\xc4\xdf\xb9\xb8\x56\x3c\x8c\x1d\x81\x6b\x62\x45\xc9\x94\x66\x0c\x91\xe3\xa9\x08\x55\x50\x72\xb4\x20\xd8\x7b\xae\xa4\xda\xee\xd9\xa0\x32\xed\x5c\xb3\xd9\x4e\x6f\x61\x69\x77\x4e\xc5\x4e\x55\x02\x57\x5b\xcc\x20\x44\x41\xdb\xda\x81\xef\x76\x9a\x9f\x05\x77\x0a\xcb\xd5\xdd\x2b\xf7\xae\x9b\xbe\xe6\xcb\x03\xd3\x4b\x95\x8d\x3d\xbd\x6f\x49\x08\xc1\x60\x45\x72\xa9\xc0\x9d\x69\x3f\x8d\x81\x34\xac\xaa\x7a\xcd\x8b\xa2\xc2\x1d\x29\x8b\xb1\xa2\x29\x23\x63\x45\x8b\xc9\x43\xd5\x12\xd4\x6d\x96\x0d\xff\x64\x14\xdd\x5b\x88\x7f\x87\x45\x57\x23\xbf\x37\x40\xbc\xe1\x0d\x9b\xe5\x46\xd1\xa2\x60\x8a\x50\x25\x4b\x70\xda\xe5\x53\xa6\x06\xfe\x16\x4c\xb9\x08\x7e\xe6\x44\x2a\xc5\x12\xe3\x4d\x74\x97\x15\x8c\x05\xab\x22\x85\x6a\xd4\x07\xab\x7d\x37\x6c\x38\x91\xf2\x1a\xaa\xe6\x80\x1d\x1f\xd1\x0b\xf2\x33\x3e\xeb\xb8\xfa\xcc\x1b\xb4\x9a\xa4\xcc\x50\x9e\x41\xae\xc9\xbb\x37\x6f\x5d\x36\x8a\xd7\x26\xfc\x2c\x97\x27\x76\x74\x60\x86\xd0\xd4\x65\x49\x5d\xb0\x29\x67\x37\x8e\xfe\xb7\xe5\x91\xf4\xc9\x98\x09\x48\x9e\xb8\x23\xc9\xa8\x4f\x34\x4f\xd9\x09\x14\xe3\xde\x3e\x50\x0b\xf7\xfd\x2d\x73\xbe\x4f\x84\xdc\x7d\x8e\xdc\x7b\x86\xac\x70\xd6\x07\x23\xfc\x5c\xaa\x3b\x80\x7f\x56\xab\x0d\x5e\xad\xee\xd7\x65\xa7\xbf\x22\x5f\x7d\xf5\xe5\xad\x37\xe5\xf4\x23\xcf\xcb\xfc\x15\xf9\xcb\x9f\xff\xfc\xe5\x9f\x6f\xbf\x8d\x0b\xbc\xed\xe5\xed\xef\xe7\xf6\xfc\xd1\xc5\xf1\x06\xd0\x3b\x0d\xd9\x7e\x77\x87\x06\x57\x18\x6a\x44\x79\x56\x2a\x97\x92\xba\xa2\xa1\xf2\x3a\xfe\x0d\x84\x75\xaa\x62\x0a\xea\x47\xf4\xc9\x68\x2e\x49\x6d\xc4\x05\xd3\xd0\x1a\xa5\x14\x8a\x25\x72\x2c\xf8\xbf\x59\xea\x3b\xa3\x40\xe2\x09\x00\xac\x7b\x16\x27\x4c\xa4\xd8\x93\xd2\x9e\xbc\x13\x2a\xd2\xec\xae\x84\x84\x15\xde\x34\xde\xc1\xad\x48\x06\xe7\xdf\x83\x08\xf6\xb6\xfa\xc5\x1c\xb9\xa0\xb3\xa6\x0b\x82\xe1\xb9\x8a\x64\x6b\xf5\xa6\x28\x18\x2f\xef\x30\xef\x97\xcc\x71\xc1\xfa\x44\xc3\x19\x3e\xfb\xad\x64\x6a\x06\x85\x23\x95\x79\x11\x25\xaa\x5d\x55\xb8\x02\xfe\x35\x9c\x5e\x87\x48\x2e\x73\x16\x79\xa5\x4a\x55\xe9\x28\x73\xcf\x86\xdf\x30\x0c\xe2\xfb\x70\x16\x39\x24\xa2\xcc\xb2\xdb\x6e\x15\xf2\xae\xc0\x57\x4c\xbb\x7b\x0c\xda\xd5\x2c\xcd\x55\x9d\x13\x4b\x28\xfd\x49\x5d\x14\xf1\x8b\x77\x64\x50\x6c\xb6\xd3\x22\x7e\xe1\x95\x72\x4e\x57\xcf\x37\x5d\x0d\xaf\x66\x05\x67\x06\x5e\x0f\x49\x48\x5d\x11\x65\xe6\x31\xdd\x1b\x78\x3d\x28\x7f\x68\x35\x57\xc7\x92\xa9\x6f\x9c\xc3\xa3\xc1\xcb\xaf\xe2\xfc\x58\xf2\xea\x5b\x17\xc8\x02\xc1\x57\xcd\xc9\x7a\x40\x3e\xd6\x8a\x2b\xb9\x82\x6b\x04\xaf\xad\x83\xe4\x41\x27\xd1\x0a\x82\xf9\x61\xce\x92\x95\x57\x55\x31\x2e\xa6\x12\x51\x9a\x1f\xa4\xc3\x5d\x2c\xfc\x70\x4e\x95\xbb\x01\xc9\xea\x74\xb9\xa0\xfc\xc6\x2a\xad\x35\x68\x49\xa9\xef\x77\xb9\xdf\xfd\x06\x77\xd7\xa6\x74\x62\x83\xd4\xdf\xbc\xcc\xd8\xcf\xdc\x4c\xde\x79\x34\x76\xc7\xd5\xa6\x2c\x32\x78\xd9\xe8\x0b\xcb\x42\x17\x95\x66\x78\x8a\x1d\xbc\x58\x22\xf3\x9c\x89\x14\x53\x99\x72\x7a\xcd\x48\xd5\x08\xd2\xea\x78\xa0\x06\xc3\x70\xec\x63\x41\x45\xa5\x27\x4e\xad\x2c\xbf\x8b\xa3\x56\xe4\xa7\x55\xcf\xda\x95\x8b\x3e\xee\x2e\xf6\x88\xaa\x35\x6a\x45\x1d\x64\xc8\x32\x09\x4e\x1c\xcc\x57\xc5\x5c\x6b\x77\x2b\x88\x64\xf7\xa9\x3b\xf5\x1c\xf2\x23\x13\xe3\x0a\x67\x4a\x67\xd0\xa4\xd5\x49\x60\x29\xd8\x80\x5c\x38\x15\x66\x35\xad\x68\x15\x71\xba\xa2\x28\x5d\xf9\x40\xac\xb0\x19\x1e\x4c\x59\xff\xbb\x98\xb6\x53\xff\xd9\x2a\xd4\xf5\x37\x3f\x67\xfa\x86\x4e\x09\x0f\x23\x6f\x7d\x4b\x57\xa7\x42\xa0\xed\x9c\xf0\x4a\xb0\x05\x30\xb8\xea\xfa\xe4\xe8\xe2\xe4\xf0\xea\xa4\x47\xde\x9f\x1f\xc3\xbf\xc7\x27\x6f\x4e\xec\xbf\x47\xef\xce\xce\x4e\x8e\xae\xac\x1e\xf1\x19\xe2\xc0\x5b\x33\xce\x52\xd7\x9e\x47\xb2\x2e\x2d\xa8\x98\x91\x51\x69\xac\x38\xa8\x1e\x56\x9b\x05\x45\x1f\x00\x4d\x53\x6b\x32\x3e\xb9\x35\x5c\x4e\xf0\x79\xb7\x49\xdc\xec\x02\xa1\xf3\x5d\x31\xd7\xfd\x6a\xd2\xca\x4c\xb2\x72\x55\x44\x6d\xca\x3b\x0d\xcb\x21\x3e\x08\xf2\x5a\x2a\xe2\xfa\x7c\xbd\x22\xbb\x85\x4c\xf5\xae\x2b\x3a\xb1\xff\x3d\xc0\x8f\x0e\x32\x39\xde\x0d\xb5\x28\x8c\x64\x72\x4c\x74\x39\x0c\x35\x42\x70\x9a\xc2\xdd\x9f\xf9\xdb\x6a\xa5\x15\xbd\x50\x28\x14\xfd\x2a\x0c\x5e\xfb\x4d\x7c\x43\x3c\xee\x01\x34\xf9\xaa\xdd\x69\x3f\x98\x1f\xf0\xb3\x83\xe5\x33\xf0\x8a\x13\x57\x73\xbf\xf8\x20\x2c\xbb\xde\xf0\x2c\x4d\xa8\x4a\x17\x78\x16\x0e\x37\x5c\x72\xa0\x1e\xe2\xe6\x62\x8f\xe4\x6a\x70\x07\x9e\x21\xa7\x4c\x65\xb4\xc0\x3c\x75\x00\x2e\x86\x04\x28\x78\xc8\x31\x2b\x18\xd4\x69\xf9\xae\xdd\x4c\x24\x99\x04\x9c\x0e\x3c\x19\x7b\xf5\x57\xc7\x84\x28\x0f\x4a\xe8\x8a\x7d\xaa\x1d\xb2\xb3\xb1\x62\x0e\x92\x9d\x1f\xc4\xbd\x98\x1e\x7d\x2b\xd8\x4b\xa8\x1e\x41\xa3\x31\x68\xbe\x8c\xec\xb8\x2a\xb8\x9d\x1e\xd9\x09\x78\x26\xa9\xd3\x92\x77\x3e\xdb\xa9\x6e\x88\xeb\xa8\x40\x49\x76\x81\xa9\x3e\x3c\x27\xae\xb6\x84\x05\xf6\xe1\xb3\xf0\xe8\x0a\x93\xc6\x1e\x6d\xce\x89\x05\x73\xa8\x0f\x34\xa8\x4d\x64\xe1\xa9\x55\x09\xe0\xbd\x4f\xb4\xd3\x8f\x7e\x6e\xa0\x5c\x1e\x4b\x09\x1d\x71\x54\x54\x71\x33\x20\x97\x35\xe6\x09\xe1\xbf\x18\x34\x87\x2b\x52\x50\x65\x4d\x11\x7f\x67\xbd\x5f\xd8\x67\xf7\x76\x0b\x5b\x81\x09\xa2\xf8\xca\x8a\x5a\xfb\x65\xf8\xc5\x51\x46\xb5\x5e\xe2\x79\x05\x41\x60\x07\x26\x0c\x47\x26\xd4\x07\x9f\x00\x84\x7a\x42\xa7\x77\xc0\x25\xac\x30\x69\x43\xd5\x98\x99\xbb\x23\x23\x54\xcc\xde\xdd\x09\x93\xd6\x5f\x19\x58\xb5\xbf\xda\x6e\xfa\xd8\xaf\x40\xb9\xfa\x5c\x98\xbe\x54\x7d\xfc\xc9\x2b\x62\x54\x79\x5b\x8c\xcb\xf0\x9c\xc9\xd2\x5c\xb2\x44\x8a\xe5\x75\x15\xee\xbe\xce\x42\x3d\x0f\x28\x36\x71\xd1\xc6\x43\xaf\x46\xf8\x8a\x93\xd8\xc9\x5e\xe9\x18\x3e\xc2\x58\x07\x69\x79\xf7\xe6\x6d\x9b\xc5\x26\x50\x66\x7d\xf7\x4a\xfe\xe4\xc4\xbe\x18\x87\x99\xba\x99\xdf\xf9\xb3\xb7\xa5\x79\xf8\x8f\xfe\x3f\xe6\xae\x2c\xb7\x6d\x1e\x08\xbf\xe7\x14\x7c\xfb\xff\x02\x8d\x7b\x86\xc2\x79\xeb\x82\xc2\x4e\x0f\xc0\x48\x74\x2c\xd4\x96\x0c\x52\x8a\xbb\xa0\x77\x2f\x38\x33\xa4\x4c\x99\x9b\x22\xd9\xb1\x1e\x6d\x72\xb8\x88\x43\xcd\xfa\xcd\xd2\x7a\xae\xe2\xad\x69\x33\xe2\xc0\x1c\xc1\xf5\xab\x96\xb7\xdd\xd9\x69\x70\xde\x0d\x5d\x96\x6b\x4c\x6c\x23\x99\x7e\x0d\xfd\x4e\x8d\x7c\xe7\xf8\x04\x88\x73\x0b\xed\x4c\xc8\xe4\x82\x51\x47\xcd\x9f\xad\xe4\x15\x2a\x90\xbc\x68\x3b\xc8\x9d\xe6\x2d\x85\x57\x12\xbc\xce\x9d\x6f\x19\x5e\x95\x31\xa6\x26\x16\x42\xb6\xea\x33\x57\xed\xf7\x43\xc9\x03\x39\x54\x83\xb0\x49\xd5\x02\xc3\xa0\x60\x7d\xac\x45\xa9\x6f\x78\xda\x02\xa4\xc7\x8e\xfa\xea\xed\x90\xe2\x58\x4f\x7e\xcf\x40\xba\xfb\xbd\x1e\xca\x3f\xeb\x55\xa3\xf7\xe4\xa3\xf7\x02\x72\x03\x46\x52\xb3\xd5\x9f\x13\x09\xd4\x58\x2d\x7e\xfa\x34\xee\xe9\x33\xde\x09\x5e\xfb\x83\xf6\x07\x27\x0a\xda\x8d\x3f\x43\x34\x00\x3b\x6e\x2b\x2d\xb2\x62\xae\x99\x62\x46\x84\x2a\xc5\x4e\x04\x52\xce\x26\x06\xb4\xd2\x08\x0f\x34\x40\x56\xb0\xd5\x37\xb7\x8f\x35\xe8\x93\x10\x4e\x29\x1c\xbd\xb0\x4c\xd2\x83\xd5\x9a\x86\xab\x02\xf1\xe5\x69\xd7\x14\x3f\x10\x64\x0c\xf0\x06\xaa\xdf\x42\x9a\xe8\xf7\xca\x56\xf5\xa2\xca\x53\xcf\xa6\x2a\xa6\xd9\x37\x53\x7e\x08\xa8\x68\xda\x7a\x03\x2d\xfd\x46\xf6\x96\xc5\xae\xa6\x1c\xbe\xeb\x04\xd0\x1a\x45\x05\xb2\x06\x1c\xcf\xc1\xb9\xce\x82\x81\x36\x80\x81\x48\x2a\x23\xdf\x53\x8e\xcd\x87\x4f\xe1\x7c\x94\x59\x83\x62\x63\x59\x31\xd8\x02\xb6\xaf\x2e\xa2\x50\x38\xd1\xfc\x99\x5c\xcb\x57\x22\x4f\x86\xe5\x0b\xe9\x76\xca\x39\xd4\x66\x0d\x71\x9c\xdd\xdb\x17\x4c\x46\xe8\x9f\x31\x3e\xbc\x5c\xf0\xd5\x51\x5e\xa6\x7a\x0c\x48\xa6\x0b\x6e\x62\xd5\x0e\x4a\x35\x45\x4f\xfc\xa6\x91\x41\x05\x66\xbe\xc9\xc7\xb3\xaa\x92\x84\xb4\xf4\x19\x8e\x5d\x3b\x4f\x21\xd2\xb7\x97\xed\xf2\x9e\x71\xb6\xad\x54\xdb\x48\x72\xad\x41\xf1\x30\xc9\xa1\x42\xa9\x3f\x06\x6c\x9e\x68\xb8\xa5\x9d\x02\xe3\x87\x83\xe0\xb6\xd8\x10\x7d\x9b\xa0\x5a\x90\x14\x45\x23\x4b\xef\xc4\x8c\x76\xef\x95\xa5\xbc\xc3\xcf\x90\x21\xba\xe3\xaa\x7d\xb4\x73\xd0\x02\x42\xe6\x6d\xec\x8a\x3f\xb4\xc4\x7e\x35\x06\x6e\xa6\xa9\xfb\x3f\x1b\xc6\x6b\xb4\x6a\x4c\x93\xc1\xd3\x42\x46\xbf\x36\x94\xe6\x5e\xb5\xae\xa3\x95\xdc\x4e\x96\x78\x9d\x99\xef\x85\x52\xd1\x74\xa7\x41\x90\x06\xe0\x04\x33\x8b\x13\x4c\xdd\xcd\xc7\x1e\x05\x04\x0c\xc7\x34\xa8\x60\xbf\xc2\x47\x8d\x81\x98\x80\x06\x05\xcb\x56\x93\x5e\xd9\x61\xcb\x55\xee\x62\x2c\x17\xd9\x40\xe3\x6c\x76\xc8\x9c\x8d\x14\x5c\xc5\x12\x36\x07\x7b\xfb\x24\x2b\xb1\x61\x4b\xbe\x17\xbb\x25\x57\x73\x6e\x2e\xdc\x00\x0b\x26\x16\xcf\x0b\xf6\xdf\xea\xc4\xdb\xfa\xb5\x69\xbf\xc4\x0a\x36\x24\x30\x0a\x72\x38\xfa\xa2\xbc\x3c\x59\x49\x48\x73\xee\x44\x9e\x9d\x3c\xc3\x08\x87\xde\x04\x6f\xc6\xb3\x8e\x43\xfc\xe8\x72\x62\x27\xc1\xe2\x57\xbc\x96\x23\x13\x29\x95\x21\x2e\xbc\x65\xfe\x4b\x2c\xc9\x92\x58\x7b\x4d\x26\x67\xab\x7b\x74\x34\x57\x30\xfb\x9f\x06\xd8\x61\x65\xfe\x4a\x69\x15\x6c\x4e\xb1\xe5\x6d\x53\xfe\xe9\x05\x06\xff\x8f\xc8\xe5\xf7\xf1\xaf\xf0\x54\x38\x81\x12\x1c\x2d\xfa\x04\x5c\x33\x00\xe3\xc1\x8c\x4a\xb6\x0e\xb2\x01\xd0\xb9\xd8\x50\x95\x33\x6a\xe3\x9c\x8f\xff\xa1\x8e\x9c\x78\xc1\xaa\x8d\x90\xf0\x21\x58\x2d\x94\x66\x8a\x77\x91\xe1\x33\x15\xaa\x3c\x65\x2a\xad\xe8\x26\x95\x58\x96\x7e\xb5\xa6\x51\xec\x05\xe3\x93\xab\xb3\x65\xe8\xc4\x23\x94\xb5\xb4\xc6\x33\x82\x58\x52\xfc\x1b\x49\xcf\x6f\xc0\x1d\x3e\x03\xe4\x61\xdd\x65\x05\x97\x34\x3a\x86\x0b\x7d\x03\x17\x80\x3e\x8d\x77\x37\x5d\x4f\xae\xfd\x76\x35\xbc\x03\x21\xdc\xd0\x3d\xe1\x73\x2d\xab\xeb\xaa\xf9\xf6\x3c\x89\xe3\x91\x4d\xef\x06\x40\x49\x92\x07\xe8\xb2\x70\x09\xf8\xa4\x4e\xdd\xdb\x9f\xb7\x1c\x58\xa8\xe8\x19\xbb\x10\x3e\x8c\x12\xf2\x45\x94\x8e\xa7\x8e\xb0\xe5\xdd\xdf\x4e\xfc\xb6\x3d\x7d\xda\x76\xf6\xe7\xef\xdd\xbf\x00\x00\x00\xff\xff\x12\xac\x7d\xb1\x7e\x88\x07\x00") func operatorsCoreosCom_clusterserviceversionsYamlBytes() ([]byte, error) { return bindataRead( @@ -124,7 +124,7 @@ func operatorsCoreosCom_clusterserviceversionsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x4b\x8f\x23\xb7\x11\xbe\xcf\xaf\x28\x8c\x0f\x6b\x03\x2b\x8d\xed\x00\x41\xa0\xdb\x66\x1c\x07\x93\xf8\xb1\xd8\x19\xef\xc5\xf1\xa1\xd4\x5d\x52\xd3\xc3\x26\x69\x3e\xa4\x55\x0c\xff\xf7\xa0\xc8\x7e\x4a\xdd\xad\xd6\xec\x78\xbd\x08\xdc\x97\xdd\xe9\x2e\x92\xf5\xae\xaf\x48\x0a\x8d\x78\x4b\xd6\x09\xad\x56\x80\x46\xd0\x3b\x4f\x8a\xff\x72\xcb\xc7\xbf\xb9\xa5\xd0\x37\xbb\x2f\xae\x1e\x85\xca\x57\x70\x1b\x9c\xd7\xe5\x1b\x72\x3a\xd8\x8c\xbe\xa2\x8d\x50\xc2\x0b\xad\xae\x4a\xf2\x98\xa3\xc7\xd5\x15\x00\x2a\xa5\x3d\xf2\x6b\xc7\x7f\x02\x64\x5a\x79\xab\xa5\x24\xbb\xd8\x92\x5a\x3e\x86\x35\xad\x83\x90\x39\xd9\x38\x79\xbd\xf4\xee\xf3\xe5\x5f\x97\x9f\x5f\x01\x64\x96\xe2\xf0\x07\x51\x92\xf3\x58\x9a\x15\xa8\x20\xe5\x15\x80\xc2\x92\x56\x20\x94\xf3\x28\xa5\x91\xa8\xdc\x52\x1b\xb2\xe8\xb5\x75\xcb\x4c\x5b\xd2\xfc\x4f\x79\xe5\x0c\x65\xbc\xf6\xd6\xea\x60\x56\x30\x48\x93\x66\xab\x59\x44\x4f\x5b\x6d\x45\xfd\x37\xc0\x02\xb4\x2c\xe3\xff\x93\xe8\x77\x69\xd1\xd7\x12\x55\x7c\x2b\x85\xf3\xff\x3e\xfe\xf2\x8d\x70\x3e\x7e\x35\x32\x58\x94\x7d\x56\xe3\x07\x57\x68\xeb\xbf\x6b\x17\xe6\x85\x84\x49\x9f\x84\xda\x06\x89\xb6\x37\xea\x0a\xc0\x65\xda\xd0\x0a\xe2\x20\x83\x19\xe5\x57\x00\x95\xd2\xaa\x49\x16\x80\x79\x1e\x0d\x81\xf2\xb5\x15\xca\x93\xbd\xd5\x32\x94\xaa\x59\x84\x69\x72\x72\x99\x15\xc6\x47\x65\x3f\x14\x04\x1b\x61\x9d\x87\xdb\xfb\xb7\x20\x14\xf8\x82\xa2\x4c\xa0\x37\x90\xc9\xe0\x3c\xd9\x7b\xb2\x3b\x91\x51\xe5\x1b\x71\xfd\x66\x3a\x80\x9f\x9d\x56\xaf\xd1\x17\x2b\x58\xb2\xba\x97\xe3\x83\x7e\xfc\xfc\xa7\xce\xb8\x64\xc3\xdb\xfb\xb7\x9d\x77\xfe\xc0\x12\x3a\x6f\x85\xda\x4e\x71\x8c\xc6\x58\xbd\x43\x09\xa5\xce\x69\x82\x97\x9a\xee\x64\xd9\x57\xa7\x1f\x46\xd6\x1e\x9e\x32\x2a\x7f\x68\xca\xde\x87\x34\xe5\x5a\x6b\x49\x95\xb7\xd4\xc4\xbb\x2f\x50\x9a\x02\xbf\xa8\x5e\xba\xac\xa0\x12\x5b\x23\x69\x43\xea\xd5\xeb\xbb\xb7\x7f\xb9\x3f\xfa\x00\x7d\x5d\x74\x5c\x0e\x72\x8e\x42\x72\xd1\x80\x95\xe3\xc4\xe8\x61\x43\x22\x38\x8a\x16\x6d\x23\xe0\x84\x4d\xbd\xfe\x99\x32\xdf\x79\x6d\xe9\x97\x20\x2c\xe5\xdd\xd5\x59\x23\x75\x8c\x1f\xbd\x66\xed\x74\x5e\x19\xcb\x6b\xf9\x4e\x24\xa5\xa7\x93\x64\x7a\xef\x8f\x24\x7b\xc1\xe2\x27\xba\x9e\x64\x95\xc3\x53\x5e\xe9\x8c\x85\xf2\x85\x70\x60\xc9\x58\x72\xa4\x7c\x2b\xb4\xaa\x64\x5a\x02\x3b\x23\x59\xc7\x51\x17\x64\xce\x89\x68\x47\xd6\x83\xa5\x4c\x6f\x95\xf8\x6f\x33\x9b\x03\xaf\x53\x04\xa0\x27\xe7\x21\x86\x90\x42\x09\x3b\x94\x81\x5e\x02\xaa\x1c\x4a\x3c\x80\x25\x9e\x17\x82\xea\xcc\x10\x49\xdc\x12\xbe\xd5\x96\x0d\xb0\xd1\x2b\x28\xbc\x37\x6e\x75\x73\xb3\x15\xbe\x4e\xa1\x99\x2e\xcb\xa0\x84\x3f\xdc\xc4\x6c\x28\xd6\x81\xad\x71\x93\xd3\x8e\xe4\x8d\x13\xdb\x05\xda\xac\x10\x9e\x32\x1f\x2c\xdd\xa0\x11\x8b\xc8\xac\x8a\x69\x74\x59\xe6\x9f\xd8\x2a\xe9\xba\x17\x47\xea\x1b\xf4\x5f\xa8\xf3\xd6\xa4\xae\x39\x7f\x81\x70\xec\x26\x71\x78\x92\xa5\x55\x29\xbf\x62\xad\xbc\xf9\xc7\xfd\x03\xd4\x0c\x24\xb5\x27\x0d\xb7\xa4\xae\x55\x36\x2b\x4a\xa8\x0d\xd9\x44\xb9\xb1\xba\x8c\xb3\x90\xca\x8d\x16\xca\xc7\x3f\x32\x29\x48\x79\x70\x61\x5d\x0a\xef\xa2\xcf\x91\xf3\x6c\x87\x25\xdc\xc6\x0a\x02\x6b\x82\x60\x72\xf4\x94\x2f\xe1\x4e\xc1\x2d\x96\x24\x6f\xd1\xd1\xef\xae\x6a\xd6\xa8\x5b\xb0\xfa\xe6\x2b\xbb\x5b\x00\x4f\x07\x9c\xc4\x18\x40\x5d\xa2\x46\xad\xd3\x89\xf1\x7b\x43\x59\x13\x0d\x4d\x4c\xbf\x32\x46\x8a\x2c\xb9\x7d\xe3\x1d\xec\xc8\xeb\x26\x11\xf4\xb2\xd2\x24\x3b\x63\x61\x0f\xa9\xbc\x9c\xa6\xcd\xfe\xa7\x93\x85\xf8\xd3\xac\x32\x02\x13\x39\x03\x62\xde\x48\x4b\x9f\x7e\x39\xd2\x57\x9d\xda\xd9\xa1\xd9\xc3\x82\x23\xdb\x16\x0c\xa3\xa5\xc8\x0e\xb0\xd1\x96\xf3\x43\x47\xb7\x4b\xb8\xf3\x50\x06\x17\xfd\x4d\x2b\x62\xcd\x5e\xbf\x0a\x5e\x97\xe8\x45\x76\x0d\xda\xc2\xf5\xb7\xa8\x02\xca\xeb\xe5\x00\x0b\xa3\x0e\xd1\xf2\x3e\xa4\xd2\xe1\x1a\xd1\x3e\xe3\xaa\x1b\x9f\x0b\xad\xc5\xc3\xc0\x57\xe1\xa9\x1c\x1c\x76\x86\xfb\x2d\x29\x2e\x1a\x03\x19\xbb\x1d\xca\x89\x72\x4b\xf6\xe4\x7b\xf2\xc6\xf1\x71\x23\x4b\xa6\x61\x0d\xd2\xb9\x68\xbc\xf3\xe8\xc3\x89\x9c\x3d\x17\xb9\xee\xc6\x54\x24\xef\x24\xb0\xaa\x80\x6e\xb4\x2d\x53\x4c\xe1\x5a\x87\x94\xac\xd2\xd4\xec\x19\xce\x93\x71\x4d\xa8\x70\xb0\x65\xba\x34\x92\x7c\xbf\xf6\x2e\xe1\x3f\x0a\xaa\x15\x38\x1d\x7a\x8b\x42\xc6\xa9\x30\xf3\x01\x65\x9c\x91\xaa\x0a\x7d\x70\x9e\xca\xe5\xf5\xf3\x44\x6a\x86\x1e\xa5\xde\xde\xa7\x6c\x30\x40\x60\x0a\x74\x74\x49\xfc\x79\x4f\x2a\x70\x16\xae\x9c\xf1\x55\x96\xe9\xa0\xfc\x1b\xda\x9c\x0f\xc9\xf1\xb1\x60\x69\x43\x96\x54\x56\xd5\x77\x97\x08\x00\x13\x05\xf8\x02\x3d\x47\x72\x70\x49\xcd\xb9\x4e\x38\x38\x6f\xa0\x4c\xad\xf0\xf1\xa8\x1c\x54\xde\x39\x79\x61\x12\xab\x0c\x8b\xf9\xfa\xae\xc6\x27\x09\x96\x50\x2d\x9d\x1f\x62\x0e\xce\x45\x01\x3f\x1b\x41\x32\x8f\xf8\x73\x0e\x07\x2f\xee\x2a\x85\xc6\x2a\xee\x35\x20\x18\x41\x19\xf5\xe0\x50\x54\x18\x61\x5e\xbd\xe4\x82\x67\xa9\xfa\xf6\x32\xd5\xea\x0a\x06\xb4\x70\xc9\xa3\x50\x80\x8c\x0b\x44\x0e\xff\xba\xff\xfe\xbb\x9b\x7f\xea\xc4\x1b\x5b\x8a\x9c\x4b\x9e\x5c\x92\xf2\x2f\xc1\x85\xac\x00\x74\xcc\x1a\xbb\x27\xfb\x3f\x2d\x4b\x54\x62\x43\xce\x2f\xab\xd9\xc8\xba\x1f\xbf\xfc\x69\x09\x5f\x6b\x0b\xf4\x0e\x39\x78\x5e\x82\x48\x5a\x6b\x40\x45\xe5\x1a\x31\x95\xb3\x30\xcd\x58\xd8\x0b\x5f\x44\x96\x8c\xce\x2b\xa6\xf7\x91\x59\x8f\x8f\x9c\xbf\x13\xb3\x81\x7b\x99\x47\x5a\xc1\x75\x6a\x4d\x9a\xa5\x7f\x65\x18\xfe\xdb\x35\x7c\xba\x2f\xc8\x12\x5c\xf3\x9f\xd7\x69\xc1\x06\x03\xf2\xbb\xda\x8e\xed\xc2\xd1\x21\xbd\x15\xdb\x2d\xc5\xc8\x67\x40\xc3\xa0\xe1\x33\xae\x10\x62\x03\x4a\x77\x88\xe3\x14\xac\x4f\x43\x99\xd8\x08\xca\x4f\x18\xf9\xf1\xcb\x9f\xae\xe1\xd3\xbe\x5c\x20\x54\x4e\xef\xe0\xcb\xd4\x8e\x09\xc7\x32\x7e\xb6\x84\x87\x68\x99\x83\xf2\xf8\x8e\xe7\xcc\x0a\xed\x48\x81\x56\xf2\xc0\x1c\x17\xb8\x23\x70\xba\x24\xd8\x93\x94\x8b\x84\x12\x72\xd8\xe3\x81\x65\xa8\x55\xc9\x56\x45\x30\x68\xfd\x11\x42\x7e\xf8\xfe\xab\xef\x57\x69\x35\x36\xdb\x56\xf1\x12\x8c\xbe\x36\x82\xf1\x2f\x03\xdf\x84\xe2\xa2\xcd\x99\x91\x90\x8c\xc4\xa9\xaf\x40\xb5\xa5\xba\x79\xdc\x04\xc6\x53\xcb\x63\xc4\x34\xdb\xe3\x87\xe0\xea\xb0\xb3\x47\xd8\x7a\x1c\x68\x7f\x20\x28\x9c\x2d\x62\xec\x01\x67\x89\xf8\x5d\xc7\x07\x27\x45\x7c\x0c\x6b\xb2\x8a\x3c\x45\x29\x73\x9d\x39\x16\x30\x23\xe3\xdd\x8d\xde\x71\x52\xa5\xfd\xcd\x5e\xdb\x47\xa1\xb6\x0b\x76\xb2\x45\xb2\xbc\xbb\x89\xbb\x1f\x37\x9f\xc4\x7f\xde\x4b\xa2\xd1\x52\x3d\x2c\x56\x24\xff\x10\xb2\xf1\x3a\xee\xe6\xc9\xa2\xd5\x90\xfa\x92\x4a\xf0\xe2\x3e\x05\x7c\x76\x3c\x9a\xc3\x65\x5f\x88\xac\xa8\x9b\xd6\x4e\x86\x2b\x31\x4f\x29\x10\xd5\xe1\x77\x77\x63\x56\x60\xb0\xbc\xf6\x61\x51\xed\xcb\x2d\x50\xe5\xfc\x7f\x27\x9c\xe7\xf7\x4f\xd6\x58\x10\x33\x03\xf8\x87\xbb\xaf\x3e\x8c\x73\x07\xf1\xc4\x68\x5d\x07\x95\x4b\xfa\x46\xeb\xc7\x60\x06\x41\x42\x4f\xa0\xbf\x77\xa9\xeb\xfe\xa3\xea\xd2\x84\x5a\x18\xab\xb7\x96\x6b\x65\xa7\xcb\x05\x13\x64\x4a\xaf\x41\x19\xcc\x1e\x71\x4b\xd5\xa2\xb1\x8c\x70\x6f\x5c\x95\xa3\xaa\x15\x18\x87\x39\x4f\xc0\xfd\xa3\xdc\xa7\xdd\x80\x8a\xcf\x11\x36\xeb\xba\xc8\x3c\x46\x04\x5b\xf1\x7d\x9e\xdf\xb3\xc0\x6c\x0a\xdb\xa6\xe7\x08\xe1\xbe\xa1\xcd\x28\xa1\xc8\xd9\xef\x37\x62\xa0\x3d\xa9\x49\x0c\xfa\x62\xf4\xa3\x25\x23\x71\x08\x44\xc3\x0c\x08\x09\x27\x7c\x8e\xd1\x1d\x59\xe3\xf6\x68\x58\x6d\x91\x3a\x61\x54\x5a\xee\x91\xc5\x37\x95\x15\x58\x24\xd8\xa3\x8b\x19\x48\xee\x28\x8f\x1b\x30\x63\x38\x74\x86\x45\xe6\x49\x0b\xb3\x60\xf3\x80\xbc\x4f\x00\xcf\x5d\xc6\x27\xd2\x51\x7a\xce\x02\xe9\x01\x9e\xfe\x84\xd3\x7f\xc2\xe9\x8f\x1c\x4e\x5f\x14\x03\x53\xd0\x7a\xc8\xfd\x3f\x56\x80\x7d\x91\xd0\x53\x60\x7b\x48\xe8\x8f\x04\x72\x5f\x2c\xe3\x24\xfc\x1e\x13\xf4\x23\x01\xe1\x17\x09\x3b\x13\x90\x0f\x89\xfc\xff\x0c\xcb\x2f\xd2\xe1\x04\x44\x1f\xd2\xdb\x47\x01\xd4\x67\x0b\x98\x69\x95\x4e\xc1\x27\x50\x4a\x1f\x6b\x35\x03\x8e\xf7\x81\x99\x69\x94\xbd\x7d\xda\x2e\x4c\x3e\x07\xa7\xc6\x20\x79\x7a\x26\x80\x79\x77\x92\x33\x98\xec\x3c\x56\x4e\xcf\xa2\xda\xbe\x3e\x43\xc4\x6b\x4e\x90\xcc\x43\x80\x00\x12\x9d\x7f\xb0\xa8\x9c\xa8\x6f\x70\x4c\xd3\x1f\x59\xe4\x1b\xe4\xb6\x43\x94\x4d\x97\x91\xec\x03\xbe\x99\xb2\x02\xb4\xf1\xa8\xa6\xda\x97\x67\x4c\xa3\xb4\x2f\xc6\x9a\x8e\xf6\x99\x19\x25\xfc\xa4\x73\x80\x15\xe4\xe8\x69\xc1\x1c\x9d\x15\xfb\x87\x78\x58\xf9\x6c\x22\x33\x86\x37\x56\xaf\x29\xff\xc3\xa4\x2a\xc9\x39\xdc\x5e\x26\xce\x2b\x28\x42\x89\x0a\x2c\x61\x8e\x6b\x49\xf5\x24\x8c\xc6\xe2\x69\xa5\xda\x42\x4e\x1e\x85\x74\x9d\x13\x96\xd6\xbe\xcf\x26\xac\x25\x74\xe7\xaa\x04\x9c\x5e\x31\x49\xc3\xe2\x41\x61\xcf\x1e\x2f\x5c\x34\xf2\xef\xc1\xe9\xf0\xc9\xd5\x24\xa7\xf7\xcd\x89\x54\x8f\xc9\x97\xf5\x09\xe6\x83\x0d\xf4\x12\xbe\x46\xe9\xe8\x25\xfc\xa0\x1e\x95\xde\x3f\x1f\xbf\x91\xf0\x22\xbd\x1e\x4c\xe4\xaa\xe1\xf3\x19\x58\x69\xbb\xfb\x99\xc9\xfe\xae\x19\x50\xef\xd0\x54\x1d\xfa\x22\x28\xf1\x4b\xe8\x37\x2a\xcd\x21\xd3\xa7\xc7\x2d\xcc\xed\xfd\xdb\xe8\x1c\xa9\xdd\x76\xa9\x91\xa9\x5b\xbb\xdb\xfb\xb7\xee\xb3\x33\xb5\x61\x52\x2a\x33\xd9\xa8\xf6\xe4\xe1\x9e\xf6\xa8\xd5\x92\x3a\xeb\x5c\xfd\x69\xb7\x65\x4c\x90\x72\x09\x77\xfe\x85\x63\x1e\x44\x86\x52\x1e\xb8\x6b\x11\x25\x07\x66\x83\x7a\xce\x55\xb5\x69\xce\x67\x14\x88\x93\x60\xa3\xcd\x86\x32\x2f\x76\xd4\x19\x5e\x2b\x3a\x6d\x38\x51\x5e\xc9\xf1\x5e\xcc\xd5\x5b\x39\x33\x59\x7b\x53\x91\xd7\x8e\xd2\xb5\x7f\xab\xd5\x6a\xd2\xd4\x6b\x46\xa7\x51\x04\x1b\x1d\x54\x0e\xe8\xa3\x79\x9e\xc8\x73\xff\x0c\xf7\xc3\x1d\xf8\x4f\xe3\xa7\xe7\xd9\x6c\xec\x9c\xc0\x37\xe8\x6b\x0a\x7c\xb5\x49\x8e\xde\x51\x16\x3a\x77\xbc\xba\x77\x38\x9e\xb6\xd7\x78\xde\x65\x2f\x41\x33\xb3\xd2\xe7\xdc\xfa\x3b\x17\x4f\x3c\xeb\xa2\x67\xcb\xfd\xac\x48\x9b\xae\xba\xc3\xf8\xfb\x4d\x2a\xba\x71\xab\x33\xc3\x92\x64\x86\x8e\xf2\xe3\x5a\x9c\xc0\xf8\x9c\x02\x3c\x83\xd1\x73\x45\x77\xc6\x14\xd3\x75\xf0\xac\xdb\xc7\xaa\x98\xa8\xd6\xf5\x2d\x88\xa6\xdd\xe8\xf9\x37\xe7\x13\x84\x8c\x6c\x2c\x32\xe9\x12\x1d\xb2\xae\xf6\x85\x7e\x72\x66\x9c\xb0\x76\x8f\xf5\x6f\x6b\xfc\xc6\x0b\x46\x6c\xb7\x38\xc1\x76\x55\xfd\x6b\xb1\x1d\xe5\xbd\xab\x34\xb1\x48\x96\x78\x88\x57\xd3\x4a\xa3\xad\xc7\x74\xc0\x11\x54\x4e\xd6\x79\x54\x39\x8f\xdd\x17\x87\xa8\x06\xc3\x32\x17\xe8\x40\x78\x07\xa9\x2f\xf6\x95\xc1\x2e\xbe\x83\x15\xef\xbb\x9c\x15\xb2\xa3\xec\xd7\x3c\xa0\x81\x08\xbd\xc5\x53\x5d\xed\x19\x66\xd2\x0a\xd3\x8c\x49\x9c\xb8\x58\xf5\xbe\x79\xf6\xde\x93\x39\xce\xab\x1d\x21\x54\x84\xe3\x3b\x91\xa7\xcb\x48\x64\x40\xa8\xe7\x49\xaa\xe7\x0f\x70\xd2\xc1\xc4\x78\x58\x2d\x9a\x5d\x9a\x51\x82\x89\x8e\xf6\x7c\x52\x6f\xd6\x7f\xcf\x44\x37\x7e\xc7\x2d\x3d\x27\xf6\xa8\x7f\x37\x31\x61\x97\xce\x2d\xdb\x78\x8f\xd3\xdb\x0a\x03\x1d\x66\x59\x07\xe6\x6e\x1e\xcc\xd9\x3a\x58\xa4\x9f\x4f\x4c\x52\x3c\x0a\x75\x7a\xf3\xb3\x4b\xc0\xd0\x69\x92\xa0\xbd\xf2\x37\x93\x2c\x6e\x29\x4e\xd2\x56\xc7\x49\xef\x79\x9a\x95\x7e\x3b\xf2\x61\xb6\xdf\x67\x4e\x54\x1f\xfe\x3c\xcb\x64\xe7\xf7\xc7\x67\x4e\xd4\x9a\xe6\x99\xa7\x9b\xb1\xb3\x3d\x73\xce\xdd\x9c\x2d\xe3\x67\x00\x0d\x27\x21\x5f\xf5\xe9\x13\xd5\xc4\xa0\xf5\x22\x0b\x12\x6d\x1b\xfb\x31\x3d\x9f\xfc\xe2\xe8\x62\x9e\x9d\x47\xeb\xc7\xf0\xe3\xf1\x76\x42\xa2\xac\x39\x8d\xfb\x51\xfb\x82\x54\x73\x6c\x97\x7e\xc0\x05\x6b\xda\x72\xd9\x33\x46\x1e\xea\x5f\x07\xb4\x77\xcf\xa5\x70\x3e\x56\xfe\xb6\x8a\xcf\xbd\xc4\x30\xaa\xf6\x31\xf0\xea\xc8\xee\x28\x5f\x81\xb7\xa1\x79\xe5\xb5\x65\x44\xd3\x7b\x17\xd6\x0d\x7f\xad\x1a\x2a\x3b\xc2\xaf\xbf\x5d\xfd\x2f\x00\x00\xff\xff\xf9\x92\xd3\x00\xfd\x36\x00\x00") +var _operatorsCoreosCom_installplansYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\xdd\x6f\x1b\x37\x12\x7f\xf7\x5f\x31\x70\x1f\xd2\x02\x96\xdc\xe6\x80\xc3\x41\x6f\x39\xf7\x7a\xf0\x5d\x3f\x82\xd8\xcd\x4b\xaf\x0f\xa3\xdd\x91\x96\x35\x97\x64\xf9\x21\x47\x57\xf4\x7f\x3f\x0c\xb9\x9f\xd2\xee\x6a\xe5\x38\x69\x70\xe8\xbe\x24\xde\x1d\x92\xf3\x3d\xbf\x21\x29\x34\xe2\x2d\x59\x27\xb4\x5a\x01\x1a\x41\xef\x3c\x29\xfe\xcb\x2d\x1f\xfe\xe6\x96\x42\x5f\xef\xbe\xba\x78\x10\x2a\x5f\xc1\x4d\x70\x5e\x97\x6f\xc8\xe9\x60\x33\xfa\x9a\x36\x42\x09\x2f\xb4\xba\x28\xc9\x63\x8e\x1e\x57\x17\x00\xa8\x94\xf6\xc8\xaf\x1d\xff\x09\x90\x69\xe5\xad\x96\x92\xec\x62\x4b\x6a\xf9\x10\xd6\xb4\x0e\x42\xe6\x64\xe3\xe4\xf5\xd2\xbb\x2f\x97\x7f\x5d\xbe\xbc\x00\xc8\x2c\xc5\xe1\xf7\xa2\x24\xe7\xb1\x34\x2b\x50\x41\xca\x0b\x00\x85\x25\xad\x40\x28\xe7\x51\x4a\x23\x51\xb9\xa5\x36\x64\xd1\x6b\xeb\x96\x99\xb6\xa4\xf9\x9f\xf2\xc2\x19\xca\x78\xed\xad\xd5\xc1\xac\x60\x90\x26\xcd\x56\xb3\x88\x9e\xb6\xda\x8a\xfa\x6f\x80\x05\x68\x59\xc6\xff\x27\xd1\x6f\xd3\xa2\xaf\x25\xaa\xf8\x56\x0a\xe7\xff\x7d\xf8\xe5\x5b\xe1\x7c\xfc\x6a\x64\xb0\x28\xfb\xac\xc6\x0f\xae\xd0\xd6\x7f\xdf\x2e\xcc\x0b\x09\x93\x3e\x09\xb5\x0d\x12\x6d\x6f\xd4\x05\x80\xcb\xb4\xa1\x15\xc4\x41\x06\x33\xca\x2f\x00\x2a\xa5\x55\x93\x2c\x00\xf3\x3c\x1a\x02\xe5\x6b\x2b\x94\x27\x7b\xa3\x65\x28\x55\xb3\x08\xd3\xe4\xe4\x32\x2b\x8c\x8f\xca\xbe\x2f\x08\x36\xc2\x3a\x0f\x37\x77\x6f\x41\x28\xf0\x05\x45\x99\x40\x6f\x20\x93\xc1\x79\xb2\x77\x64\x77\x22\xa3\xca\x37\xe2\xfa\xcd\x74\x00\xbf\x38\xad\x5e\xa3\x2f\x56\xb0\x64\x75\x2f\xc7\x07\xfd\xf4\xe5\xcf\x9d\x71\xc9\x86\x37\x77\x6f\x3b\xef\xfc\x9e\x25\x74\xde\x0a\xb5\x9d\xe2\x18\x8d\xb1\x7a\x87\x12\x4a\x9d\xd3\x04\x2f\x35\xdd\xd1\xb2\xaf\x8e\x3f\x8c\xac\x3d\x3c\x65\x54\xfe\xd0\x94\xbd\x0f\x69\xca\xb5\xd6\x92\x2a\x6f\xa9\x89\x77\x5f\xa1\x34\x05\x7e\x55\xbd\x74\x59\x41\x25\xb6\x46\xd2\x86\xd4\xab\xd7\xb7\x6f\xff\x72\x77\xf0\x01\xfa\xba\xe8\xb8\x1c\xe4\x1c\x85\xe4\xa2\x01\x2b\xc7\x89\xd1\xc3\x86\x44\x70\x14\x2d\xda\x46\xc0\x11\x9b\x7a\xfd\x0b\x65\xbe\xf3\xda\xd2\xaf\x41\x58\xca\xbb\xab\xb3\x46\xea\x18\x3f\x78\xcd\xda\xe9\xbc\x32\x96\xd7\xf2\x9d\x48\x4a\x4f\x27\xc9\xf4\xde\x1f\x48\xf6\x82\xc5\x4f\x74\x3d\xc9\x2a\x87\xa7\xbc\xd2\x19\x0b\xe5\x0b\xe1\xc0\x92\xb1\xe4\x48\xf9\x56\x68\x55\xc9\xb4\x04\x76\x46\xb2\x8e\xa3\x2e\xc8\x9c\x13\xd1\x8e\xac\x07\x4b\x99\xde\x2a\xf1\xdf\x66\x36\x07\x5e\xa7\x08\x40\x4f\xce\x43\x0c\x21\x85\x12\x76\x28\x03\x5d\x01\xaa\x1c\x4a\xdc\x83\x25\x9e\x17\x82\xea\xcc\x10\x49\xdc\x12\xbe\xd3\x96\x0d\xb0\xd1\x2b\x28\xbc\x37\x6e\x75\x7d\xbd\x15\xbe\x4e\xa1\x99\x2e\xcb\xa0\x84\xdf\x5f\xc7\x6c\x28\xd6\x81\xad\x71\x9d\xd3\x8e\xe4\xb5\x13\xdb\x05\xda\xac\x10\x9e\x32\x1f\x2c\x5d\xa3\x11\x8b\xc8\xac\x8a\x69\x74\x59\xe6\x9f\xd9\x2a\xe9\xba\x17\x07\xea\x1b\xf4\x5f\xa8\xf3\xd6\xa4\xae\x39\x7f\x81\x70\xec\x26\x71\x78\x92\xa5\x55\x29\xbf\x62\xad\xbc\xf9\xc7\xdd\x3d\xd4\x0c\x24\xb5\x27\x0d\xb7\xa4\xae\x55\x36\x2b\x4a\xa8\x0d\xd9\x44\xb9\xb1\xba\x8c\xb3\x90\xca\x8d\x16\xca\xc7\x3f\x32\x29\x48\x79\x70\x61\x5d\x0a\xef\xa2\xcf\x91\xf3\x6c\x87\x25\xdc\xc4\x0a\x02\x6b\x82\x60\x72\xf4\x94\x2f\xe1\x56\xc1\x0d\x96\x24\x6f\xd0\xd1\x07\x57\x35\x6b\xd4\x2d\x58\x7d\xf3\x95\xdd\x2d\x80\xc7\x03\x8e\x62\x0c\xa0\x2e\x51\xa3\xd6\xe9\xc4\xf8\x9d\xa1\xac\x89\x86\x26\xa6\x5f\x19\x23\x45\x96\xdc\xbe\xf1\x0e\x76\xe4\x75\x93\x08\x7a\x59\x69\x92\x9d\xb1\xb0\x87\x54\x5e\x8e\xd3\x66\xff\xd3\xd1\x42\xfc\x69\x56\x19\x81\x89\x9c\x01\x31\x6f\xa4\xa5\x8f\xbf\x1c\xe8\xab\x4e\xed\xec\xd0\xec\x61\xc1\x91\x6d\x0b\x86\xd1\x52\x64\x7b\xd8\x68\xcb\xf9\xa1\xa3\xdb\x25\xdc\x7a\x28\x83\x8b\xfe\xa6\x15\xb1\x66\x2f\x5f\x05\xaf\x4b\xf4\x22\xbb\x04\x6d\xe1\xf2\x3b\x54\x01\xe5\xe5\x72\x80\x85\x51\x87\x68\x79\x1f\x52\xe9\x70\x8d\x68\x9f\x71\xd5\x8d\xcf\x85\xd6\xe2\x7e\xe0\xab\xf0\x54\x0e\x0e\x3b\xc1\xfd\x96\x14\x17\x8d\x81\x8c\xdd\x0e\xe5\x44\xb9\x25\x7b\xf4\x3d\x79\xe3\xf8\xb8\x91\x25\xd3\xb0\x06\xe9\x9c\x35\xde\x79\xf4\xe1\x48\xce\x9e\x8b\x5c\x76\x63\x2a\x92\x77\x12\x58\x55\x40\x37\xda\x96\x29\xa6\x70\xad\x43\x4a\x56\x69\x6a\xf6\x0c\xe7\xc9\xb8\x26\x54\x38\xd8\x32\x5d\x1a\x49\xbe\x5f\x7b\x97\xf0\x1f\x05\xd5\x0a\x9c\x0e\xbd\x45\x21\xe3\x54\x98\xf9\x80\x32\xce\x48\x55\x85\xde\x3b\x4f\xe5\xf2\xf2\x79\x22\x35\x43\x8f\x52\x6f\xef\x52\x36\x18\x20\x30\x05\x3a\x3a\x27\xfe\xbc\x27\x15\x38\x0b\x57\xce\xf8\x2a\xcb\x74\x50\xfe\x0d\x6d\x4e\x87\xe4\xf8\x58\xb0\xb4\x21\x4b\x2a\xab\xea\xbb\x4b\x04\x80\x89\x02\x7c\x81\x9e\x23\x39\xb8\xa4\xe6\x5c\x27\x1c\x9c\x37\x50\xa6\x56\xf8\x78\x54\x0e\x2a\xef\x94\xbc\x30\x89\x55\x86\xc5\x7c\x7d\x5b\xe3\x93\x04\x4b\xa8\x96\xce\x0f\x31\x07\xa7\xa2\x80\x9f\x8d\x20\x99\x47\xfc\x39\x87\x83\x17\xb7\x95\x42\x63\x15\xf7\x1a\x10\x8c\xa0\x8c\x7a\x70\x28\x2a\x8c\x30\xaf\x5e\x72\xc1\xb3\x54\x7d\xbb\x4a\xb5\xba\x82\x01\x2d\x5c\xf2\x28\x14\x20\xe3\x02\x91\xc3\xbf\xee\x7e\xf8\xfe\xfa\x9f\x3a\xf1\xc6\x96\x22\xe7\x92\x27\x97\xa4\xfc\x15\xb8\x90\x15\x80\x8e\x59\x63\xf7\x64\xff\xa7\x65\x89\x4a\x6c\xc8\xf9\x65\x35\x1b\x59\xf7\xd3\xcb\x9f\x97\xf0\x8d\xb6\x40\xef\x90\x83\xe7\x0a\x44\xd2\x5a\x03\x2a\x2a\xd7\x88\xa9\x9c\x85\x69\xc6\xc2\xa3\xf0\x45\x64\xc9\xe8\xbc\x62\xfa\x31\x32\xeb\xf1\x81\xf3\x77\x62\x36\x70\x2f\xf3\x40\x2b\xb8\x4c\xad\x49\xb3\xf4\x6f\x0c\xc3\x7f\xbf\x84\xcf\x1f\x0b\xb2\x04\x97\xfc\xe7\x65\x5a\xb0\xc1\x80\xfc\xae\xb6\x63\xbb\x70\x74\x48\x6f\xc5\x76\x4b\x31\xf2\x19\xd0\x30\x68\xf8\x82\x2b\x84\xd8\x80\xd2\x1d\xe2\x38\x05\xeb\xd3\x50\x26\x36\x82\xf2\x23\x46\x7e\x7a\xf9\xf3\x25\x7c\xde\x97\x0b\x84\xca\xe9\x1d\xbc\x4c\xed\x98\x70\x2c\xe3\x17\x4b\xb8\x8f\x96\xd9\x2b\x8f\xef\x78\xce\xac\xd0\x8e\x14\x68\x25\xf7\xcc\x71\x81\x3b\x02\xa7\x4b\x82\x47\x92\x72\x91\x50\x42\x0e\x8f\xb8\x67\x19\x6a\x55\xb2\x55\x11\x0c\x5a\x7f\x80\x90\xef\x7f\xf8\xfa\x87\x55\x5a\x8d\xcd\xb6\x55\xbc\x04\xa3\xaf\x8d\x60\xfc\xcb\xc0\x37\xa1\xb8\x68\x73\x66\x24\x24\x23\x71\xea\x2b\x50\x6d\xa9\x6e\x1e\x37\x81\xf1\xd4\xf2\x10\x31\xcd\xf6\xf8\x21\xb8\x3a\xec\xec\x11\xb6\x1e\x06\xda\x1f\x08\x0a\x67\x8b\x18\x7b\xc0\x59\x22\x7e\xdf\xf1\xc1\x49\x11\x1f\xc2\x9a\xac\x22\x4f\x51\xca\x5c\x67\x8e\x05\xcc\xc8\x78\x77\xad\x77\x9c\x54\xe9\xf1\xfa\x51\xdb\x07\xa1\xb6\x0b\x76\xb2\x45\xb2\xbc\xbb\x8e\xbb\x1f\xd7\x9f\xc5\x7f\xde\x4b\xa2\xd1\x52\x3d\x2c\x56\x24\xff\x18\xb2\xf1\x3a\xee\xfa\xc9\xa2\xd5\x90\xfa\x9c\x4a\xf0\xe2\x2e\x05\x7c\x76\x38\x9a\xc3\xe5\xb1\x10\x59\x51\x37\xad\x9d\x0c\x57\x62\x9e\x52\x20\xaa\xfd\x07\x77\x63\x56\x60\xb0\xbc\xf6\x7e\x51\xed\xcb\x2d\x50\xe5\xfc\x7f\x27\x9c\xe7\xf7\x4f\xd6\x58\x10\x33\x03\xf8\xc7\xdb\xaf\x3f\x8e\x73\x07\xf1\xc4\x68\x5d\x07\x95\x4b\xfa\x56\xeb\x87\x60\x06\x41\x42\x4f\xa0\xbf\x77\xa9\xeb\xfe\xa3\xea\xd2\x84\x5a\x18\xab\xb7\x96\x6b\x65\xa7\xcb\x05\x13\x64\x4a\xaf\x41\x19\xcc\x1e\x70\x4b\xd5\xa2\xb1\x8c\x70\x6f\x5c\x95\xa3\xaa\x15\x18\x87\x39\x4f\xc0\xfd\xa3\xdc\xa7\xdd\x80\x8a\xcf\x11\x36\xeb\xba\xc8\x3c\x46\x04\x5b\xf1\x7d\x9a\xdf\x93\xc0\x6c\x0a\xdb\xa6\xe7\x00\xe1\xbe\xa1\xcd\x28\xa1\xc8\xd9\xef\x37\x62\xa0\x3d\xa9\x49\x0c\xfa\x62\xf4\xa3\x25\x23\x71\x08\x44\xc3\x0c\x08\x09\x47\x7c\x8e\xd1\x1d\x58\xe3\xe6\x60\x58\x6d\x91\x3a\x61\x54\x5a\xee\x91\xc5\x37\x95\x15\x58\x24\x78\x44\x17\x33\x90\xdc\x51\x1e\x37\x60\xc6\x70\xe8\x0c\x8b\xcc\x93\x16\x66\xc1\xe6\x01\x79\x9f\x00\x9e\xbb\x8c\x4f\xa4\xa3\xf4\x9c\x04\xd2\x03\x3c\xfd\x09\xa7\xff\x84\xd3\x9f\x38\x9c\x3e\x2b\x06\xa6\xa0\xf5\x90\xfb\x7f\xaa\x00\xfb\x2c\xa1\xa7\xc0\xf6\x90\xd0\x9f\x08\xe4\x3e\x5b\xc6\x49\xf8\x3d\x26\xe8\x27\x02\xc2\xcf\x12\x76\x26\x20\x1f\x12\xf9\xff\x19\x96\x9f\xa5\xc3\x09\x88\x3e\xa4\xb7\x4f\x02\xa8\xcf\x16\x30\xd3\x2a\x9d\x82\x4f\xa0\x94\x3e\xd6\x6a\x06\x1c\xee\x03\x33\xd3\x28\x7b\xfb\xb4\x5d\x98\x7c\x0a\x4e\x8d\x41\xf2\xf4\x4c\x00\xf3\xee\x24\x27\x30\xd9\x69\xac\x9c\x9e\x45\xb5\x7d\x7d\x82\x88\xd7\x9c\x20\x99\x87\x00\x01\x24\x3a\x7f\x6f\x51\x39\x51\xdf\xe0\x98\xa6\x3f\xb0\xc8\xb7\xc8\x6d\x87\x28\x9b\x2e\x23\xd9\x07\x7c\x33\x65\x05\x68\xe3\x51\x4d\xb5\x2f\xcf\x98\x46\x69\x5f\x8c\x35\x1d\xed\x33\x33\x4a\xf8\x49\xe7\x00\x2b\xc8\xd1\xd3\x82\x39\x3a\x29\xf6\x8f\xf1\xb0\xf2\xd9\x44\x66\x0c\x6f\xac\x5e\x53\xfe\x87\x49\x55\x92\x73\xb8\x3d\x4f\x9c\x57\x50\x84\x12\x15\x58\xc2\x1c\xd7\x92\xea\x49\x18\x8d\xc5\xd3\x4a\xb5\x85\x9c\x3c\x0a\xe9\x3a\x27\x2c\xad\x7d\x9f\x4d\x58\x4b\xe8\x4e\x55\x09\x38\xbe\x62\x92\x86\xc5\x83\xc2\x9e\x3d\x5e\xb8\x68\xe4\x0f\xc1\xe9\xf0\xc9\xd5\x24\xa7\x77\xcd\x89\x54\x8f\xc9\xab\xfa\x04\xf3\xde\x06\xba\x82\x6f\x50\x3a\xba\x82\x1f\xd5\x83\xd2\x8f\xcf\xc7\x6f\x24\x3c\x4b\xaf\x7b\x13\xb9\x6a\xf8\x7c\x06\x56\xda\xee\x7e\x66\xb2\xbf\x6d\x06\xd4\x3b\x34\x55\x87\xbe\x08\x4a\xfc\x1a\xfa\x8d\x4a\x73\xc8\xf4\xf9\x61\x0b\x73\x73\xf7\x36\x3a\x47\x6a\xb7\x5d\x6a\x64\xea\xd6\xee\xe6\xee\xad\xfb\xe2\x44\x6d\x98\x94\xca\x4c\x36\xaa\x3d\x79\xb8\xa7\x3d\x68\xb5\xa4\xce\x3a\x57\x7f\xda\x6d\x19\x13\xa4\x5c\xc2\xad\x7f\xe1\x98\x07\x91\xa1\x94\x7b\xee\x5a\x44\xc9\x81\xd9\xa0\x9e\x53\x55\x6d\x9a\xf3\x19\x05\xe2\x28\xd8\x68\xb3\xa1\xcc\x8b\x1d\x75\x86\xd7\x8a\x4e\x1b\x4e\x94\x57\x72\xbc\x17\x73\xf5\x56\xce\x4c\xd6\xde\x54\xe4\xb5\xa3\x74\xed\xdf\x6a\xb5\x9a\x34\xf5\x9a\xd1\x69\x14\xc1\x46\x07\x95\x03\xfa\x68\x9e\x27\xf2\xdc\x3f\xc3\xfd\x78\x07\xfe\xd3\xf8\xe9\x79\x36\x1b\x3b\x27\xf0\x0d\xfa\x9a\x02\x5f\x6d\x92\xa3\x77\x94\x85\xce\x1d\xaf\xee\x1d\x8e\xa7\xed\x35\x9e\x76\xd9\x73\xd0\xcc\xac\xf4\x39\xb7\xfe\xce\xc5\x13\xcf\xba\xe8\xc9\x72\x3f\x2b\xd2\xa6\xab\xee\x30\xfe\x7e\x93\x8a\x6e\xdc\xea\xcc\xb0\x24\x99\xa1\xa3\xfc\xb0\x16\x27\x30\x3e\xa7\x00\xcf\x60\xf4\x54\xd1\x9d\x31\xc5\x74\x1d\x3c\xe9\xf6\xb1\x2a\x26\xaa\x75\x7d\x0b\xa2\x69\x37\x7a\xfe\xcd\xf9\x04\x21\x23\x1b\x8b\x4c\xba\x44\x87\xac\xab\xc7\x42\x3f\x39\x33\x4e\x58\xbb\xc7\xfa\x77\x35\x7e\xe3\x05\x23\xb6\x5b\x1c\x61\xbb\xaa\xfe\xb5\xd8\x8e\xf2\xde\x55\x9a\x58\x24\x4b\xdc\xc7\xab\x69\xa5\xd1\xd6\x63\x3a\xe0\x08\x2a\x27\xeb\x3c\xaa\x9c\xc7\x3e\x16\xfb\xa8\x06\xc3\x32\x17\xe8\x40\x78\x07\xa9\x2f\xf6\x95\xc1\xce\xbe\x83\x15\xef\xbb\x9c\x14\xb2\xa3\xec\xd7\x3c\xa0\x81\x08\xbd\xc5\x53\x5d\xed\x19\x66\xd2\x0a\xd3\x8c\x49\x9c\xb8\x58\xf5\xbe\x79\xf6\xce\x93\x39\xcc\xab\x1d\x21\x54\x84\xe3\x3b\x91\xa7\xcb\x48\x64\x40\xa8\xe7\x49\xaa\xa7\x0f\x70\xd2\xc1\xc4\x78\x58\x2d\x9a\x5d\x9a\x51\x82\x89\x8e\xf6\x74\x52\x6f\xd6\x7f\xcf\x44\x37\x7e\xc7\x2d\x3d\x47\xf6\xa8\x7f\x37\x31\x61\x97\xce\x2d\xdb\x78\x8f\xd3\xdb\x0a\x03\xed\x67\x59\x07\xe6\x6e\x1e\xcc\xd9\x3a\x58\xa4\x9f\x4f\x4c\x52\x3c\x08\x75\x7c\xf3\xb3\x4b\xc0\xd0\x69\x92\xa0\xbd\xf2\x37\x93\x2c\x6e\x29\x4e\xd2\x56\xc7\x49\xef\x79\x9a\x95\x7e\x3b\xf2\x71\xb6\xdf\x67\x4e\x54\x1f\xfe\x3c\xcb\x64\xa7\xf7\xc7\x67\x4e\xd4\x9a\xe6\x99\xa7\x9b\xb1\xb3\x3d\x73\xce\xdd\x9c\x2d\xe3\x67\x00\x0d\x47\x21\x5f\xf5\xe9\x13\xd5\xc4\xa0\xf5\x22\x0b\x12\x6d\x1b\xfb\x31\x3d\x1f\xfd\xe2\xe8\x6c\x9e\x9d\x47\xeb\xc7\xf0\xe3\xe1\x76\x42\xa2\xac\x39\x8d\xfb\x51\x8f\x05\xa9\xe6\xd8\x2e\xfd\x80\x0b\xd6\xb4\xe5\xb2\x67\x8c\xdc\xd7\xbf\x0e\x68\xef\x9e\x4b\xe1\x7c\xac\xfc\x6d\x15\x9f\x7b\x89\x61\x54\xed\x63\xe0\xd5\x91\xdd\x51\xbe\x02\x6f\x43\xf3\xca\x6b\xcb\x88\xa6\xf7\x2e\xac\x1b\xfe\x5a\x35\x54\x76\x84\xdf\x7e\xbf\xf8\x5f\x00\x00\x00\xff\xff\xaa\x07\xfe\xc9\xfd\x36\x00\x00") func operatorsCoreosCom_installplansYamlBytes() ([]byte, error) { return bindataRead( @@ -144,7 +144,7 @@ func operatorsCoreosCom_installplansYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\x1b\xb9\x11\x7f\xf7\xa7\x18\xa8\x05\x62\xa7\xd2\x3a\xce\x15\xe9\x9d\x80\x20\x08\x72\x4d\x11\x24\xbe\x04\xb1\x7b\x0f\xb5\xdc\x66\x76\x39\x92\x78\xd9\x25\xf7\xf8\x47\xb6\xee\x70\xdf\xbd\x18\x72\x57\xbb\xb2\x56\x8a\x8b\xa4\xc1\xb5\x20\x5f\x2c\x91\xb3\xc3\xe1\xfc\xff\xd1\x2b\xac\xe5\x8f\x64\xac\xd4\x6a\x0a\x58\x4b\xba\x75\xa4\xf8\x9b\xcd\x3e\x7e\x6b\x33\xa9\x4f\x57\x67\x47\x1f\xa5\x12\x53\x78\xe1\xad\xd3\xd5\x7b\xb2\xda\x9b\x82\xbe\xa7\xb9\x54\xd2\x49\xad\x8e\x2a\x72\x28\xd0\xe1\xf4\x08\x00\x95\xd2\x0e\x79\xda\xf2\x57\x80\x42\x2b\x67\x74\x59\x92\x99\x2c\x48\x65\x1f\x7d\x4e\xb9\x97\xa5\x20\x13\x98\xb7\x5b\xaf\x1e\x65\x4f\xb2\x47\x47\x00\x85\xa1\xf0\xf8\xa5\xac\xc8\x3a\xac\xea\x29\x28\x5f\x96\x47\x00\x0a\x2b\x9a\x82\xae\xc9\xa0\xd3\xa6\xd0\x4a\x84\xed\x6d\xd6\x4e\xd9\xac\xd0\x86\x34\xff\xa9\x8e\x6c\x4d\x05\x4b\xb0\x30\xda\xd7\xdd\x63\x5b\x34\x91\x67\x2b\x28\x3a\x5a\x68\x23\xdb\xef\x00\x13\xd0\x65\x15\x3e\x47\x05\xbc\x6d\x78\xbc\x68\xb7\x0e\x6b\xa5\xb4\xee\xf5\xf0\xfa\x1b\x69\x5d\xa0\xa9\x4b\x6f\xb0\x1c\x12\x3e\x2c\xdb\xa5\x36\xee\x87\x4e\x14\xde\xba\xd8\xda\xc4\x4a\xb5\xf0\x25\x9a\x01\x16\x47\x00\xb6\xd0\x35\x4d\x21\x70\xa8\xb1\x20\x71\x04\xd0\x68\xb6\xe1\x38\x69\xb4\xb7\x3a\x6b\x36\xb0\xc5\x92\x2a\x6c\xb7\x03\x66\xab\x9e\xbf\x7b\xf5\xe3\x37\x17\x77\x16\x00\x04\xd9\xc2\xc8\xda\x05\x3b\xed\x9c\x11\xa4\x05\x6c\x7c\x03\x5a\xe7\x00\x3d\x07\xb7\xae\x09\x3e\xec\xd0\x7f\x80\x9b\xa5\x2c\x96\xfc\x98\xb7\x24\xc0\x69\x3e\xea\x8a\xd6\x20\xd5\x5c\x9b\x2a\x18\x9f\x67\xdf\xbe\x39\x07\xcc\xb5\x77\xe0\x96\x04\xd6\xa1\x0b\x6c\x51\x6d\x54\x90\xf5\x84\xe4\xdd\xa6\xa0\xf3\x9f\xa8\x70\xbd\x69\x43\x3f\x7b\x69\x48\xf4\xcf\xc3\xda\x68\x5d\xb6\x37\x5d\x1b\xe6\xeb\x7a\xf6\x8f\xa3\x17\x20\x5b\xf3\x77\x14\xf3\x80\xb5\x17\xe9\x40\x70\x6c\x90\x0d\x82\x37\x76\x20\xd1\xa8\x3c\xa8\x66\x29\x2d\x18\xaa\x0d\x59\x52\x31\x5a\xda\xa3\x85\x03\x64\x70\x41\x86\x1f\x64\xcf\xf0\xa5\x88\x1a\x32\x0e\x0c\x15\x7a\xa1\xe4\x2f\x1b\x6e\x96\x35\xc5\xdb\x94\xe8\xc8\x3a\x90\xca\x91\x51\x58\xc2\x0a\x4b\x4f\x63\x40\x25\xa0\xc2\x35\x18\x62\xbe\xe0\x55\x8f\x43\x20\xb1\x19\x9c\x6b\x43\x41\xf9\x53\x58\x3a\x57\xdb\xe9\xe9\xe9\x42\xba\x36\xfc\x0b\x5d\x55\x5e\x49\xb7\x3e\x0d\x91\x2c\x73\xcf\x51\x74\x2a\x68\x45\xe5\xa9\x95\x8b\x09\x9a\x62\x29\x1d\x15\xce\x1b\x3a\xc5\x5a\x4e\x82\xb0\x2a\x86\x66\x25\xfe\x60\x1a\x9f\xb0\x0f\xee\xa8\x2f\x9a\xcc\x3a\x23\xd5\x62\x6b\x29\x44\xdb\x41\x5d\x73\xbc\x45\xc7\x8b\x8f\xc7\xb3\x74\x2a\xe5\x29\xd6\xca\xfb\xbf\x5e\x5c\x42\x2b\x40\x54\x7b\xd4\x70\x47\x6a\x3b\x65\xb3\xa2\xa4\x9a\x93\x89\x94\x73\xa3\xab\xc0\x85\x94\xa8\xb5\x54\xd1\x11\x8b\x52\x92\x72\x60\x7d\x5e\x49\x67\x83\x83\x91\x75\x6c\x87\x0c\x5e\x84\xec\x07\x39\x81\xaf\x05\x3a\x12\x19\xbc\x52\xf0\x02\x2b\x2a\x5f\xa0\xa5\xff\xba\xaa\x59\xa3\x76\xc2\xea\xbb\xbf\xb2\xfb\xc9\x7b\xf7\x81\x9d\x80\x02\x68\x13\xeb\x5e\xeb\xec\x84\xfc\x45\x4d\x05\x60\x59\xea\x1b\xb6\x58\x51\x7a\xeb\xc8\x00\x8a\x4a\xaa\x3d\xe1\x7f\x38\xee\x9b\xec\x30\x86\x5a\x3b\x3e\x3d\x96\xe5\x1a\xf4\x8a\x8c\x91\x82\x2d\x1f\x9f\x31\x54\x6b\xe3\x48\x40\xbe\x0e\x9c\x86\xb2\xc6\xc1\x83\xee\x4f\x09\xf1\xc8\x75\xa9\xd7\x15\x7b\xd0\xee\x62\xcb\x15\x8d\xc1\xf5\xc0\xaa\x74\x54\x0d\x3e\x76\xc0\x50\x3c\x9a\x43\x0e\xc9\xf3\x19\x5b\x6e\x59\x6f\xd4\x65\x76\xf6\x42\x94\xca\x82\x20\x87\xb2\xb4\x30\xd7\x06\xb4\x22\x40\xf6\x01\x17\x33\x19\x41\xe1\x8d\x09\x21\xd1\x9a\x2a\x44\xcf\xf3\x77\xaf\x36\xe5\x20\x83\xc9\x64\x02\x97\x3c\x6d\x9d\xf1\x85\xe3\xd8\xe5\x54\xa5\x04\x89\xc0\x55\x48\x13\xf2\x93\x65\xe6\x6c\xeb\x70\x0c\xc0\xe8\x04\x73\x49\xa5\x80\x1a\xdd\x12\x32\xde\xc5\x73\xf9\xde\x94\x7f\x80\x97\xda\x00\xdd\x62\x55\x97\x34\x8e\x75\xe7\xa5\xd6\x17\x81\xb0\xd9\xf0\xd7\x70\xd0\xd3\x53\x78\xbf\x89\xfb\xe8\x14\xb9\x25\xb3\x8a\xfd\x4a\xf0\x32\x98\x6b\xfd\xc0\x6e\x9f\x29\x6b\x1f\x7e\xad\xf4\x8d\x1a\x12\x21\xec\x89\x86\xa6\x30\x1b\x3d\x5f\xa1\x2c\x31\x2f\x69\x36\x1a\xc3\x6c\xf4\xce\xe8\x85\x21\xcb\x05\x9c\x27\x38\x21\xcf\x46\xdf\xd3\xc2\xa0\x20\x31\x1b\xb5\xac\xff\x54\xa3\x2b\x96\xe7\x64\x16\xf4\x9a\xd6\x4f\x03\xc3\xad\xa5\x0b\x67\xb8\x41\x59\x3f\xad\x98\x66\xb3\xc6\xdd\xc7\xe5\xba\xa6\xa7\x15\xd6\x5b\x93\xe7\x58\x6f\x31\xda\x98\xd5\xc2\xd5\x35\x07\xfd\xea\x2c\xeb\x4c\xfd\xe1\x27\xab\xd5\x74\x36\xea\xce\x34\xd6\x15\xbb\x4c\xed\xd6\xb3\x11\x6c\x49\x30\x9d\x8d\x82\x0c\xed\x7c\x2b\xf4\x74\x36\xe2\xdd\x78\xda\x68\xa7\x73\x3f\x9f\xce\x46\xf9\xda\x91\x1d\x9f\x8d\x0d\xd5\x63\x6e\x41\x9e\x76\x3b\xcc\x46\x1f\x60\xa6\x5a\xa1\xb5\x5b\x92\x89\x96\xb6\xf0\xdb\xe8\x40\x6c\x0c\x86\x6a\x1c\xc3\xe5\xbe\x1b\x5c\xf8\xad\xc5\x05\xed\x5d\x37\x84\xb6\xe9\xb9\x86\x96\xa3\xe9\xf7\x2e\xb3\x80\x83\x8b\x87\x32\x49\x1c\x25\x5a\x77\x69\x50\x59\xd9\x76\xbf\xfb\x28\xef\x04\xec\xee\x83\x1c\x5d\xb1\x27\xb0\x0e\x1c\x4f\x84\x30\xdd\x18\xdb\x6d\xa8\x39\xfa\xb8\xca\x71\x50\xc7\xa3\x71\x6e\x45\x15\x8c\x91\x35\x11\x1b\x5b\x90\x9c\xe0\x66\x49\x2a\xb0\xf2\x4a\x90\x29\xd7\x9c\x6b\x3b\xae\xc5\x12\xd5\x82\x4b\x1e\xbc\xe2\x14\x80\x21\xc8\xb9\x1c\x7e\xe4\xa8\x19\xf3\x83\x0a\xbc\x6d\x4b\x73\x90\x6b\xc3\x91\xb3\x45\x8c\xf2\x86\x4d\xa8\xee\x45\x41\xb5\xe3\x50\xba\x9b\xb3\xbb\x71\x30\x5d\xb6\x23\x16\x96\x29\x70\x4d\x9e\xf0\xc6\x7b\x28\x1b\xe7\xb8\xa7\xe2\x1b\xea\xd8\x87\x2c\x7d\x85\x8a\xbd\x47\xb0\xbc\xdd\x9a\x12\xb2\xc0\xd0\x8f\xb4\x49\xb4\xab\x6d\x9d\x1d\x1a\x55\x73\x03\x92\x13\xa7\xbf\x10\x78\xcd\xb1\x3e\xf3\xf0\x15\xde\xbe\x21\xb5\x70\xcb\x29\x7c\xf3\xf8\x2f\x4f\xbe\xdd\x43\x18\x33\x21\x89\xbf\x91\xe2\x3a\x39\xd0\xee\xee\x51\xc3\xee\x83\xbd\xe6\x2a\x9c\x33\x6b\x7b\x8c\x6c\xd1\xd1\x04\x0f\xd9\xf6\xcb\x1b\xb4\x60\xc9\x41\x8e\x0c\x0c\x7c\xcd\x7a\xe1\xd4\x2e\x95\x75\xa8\x0a\x1a\x83\x9c\x0f\x33\x93\x9b\x8c\x5d\xae\xe1\xec\xf1\x18\xf2\x46\xc5\xbb\xb9\xfa\xea\xf6\x3a\x1b\x10\x59\x5a\xf8\x6e\x7c\x47\x1e\xee\x16\x7d\x28\x73\xec\x38\x70\x23\xdd\x92\x9b\xc9\x50\xfb\x9a\xb6\x7b\xa0\xf6\xd1\x46\xde\x4f\x19\x8e\x2b\xe0\x82\xcc\x27\xdd\x56\x2a\xf7\xe4\xcf\xfb\xed\x2b\x95\xac\x7c\x35\x85\x47\x7b\x48\x62\x4a\xbb\xa7\x35\x23\x71\x57\xfa\x91\x53\xd7\xc2\x60\xc5\x9d\x59\x01\x52\x70\xc3\x35\x97\x64\xfa\xae\xcd\x87\x6e\x1e\xe4\x62\xbe\xa5\xc5\x07\xb6\xc9\x43\x3d\x67\x7f\x67\xb4\xf0\x05\xb7\xdc\x7a\x1e\xfa\x49\x39\x97\x45\x3f\x41\x71\x1f\x1b\xa2\x21\x22\x29\xa0\x5b\x56\xfa\x06\xb3\x44\x58\x43\xa8\xa4\x5a\xd8\x66\x4b\x6e\xd8\x39\x81\xc4\x12\x7b\xb3\xa4\x50\x4f\x02\x02\x6b\x9e\x31\x41\x2a\x2b\x05\x19\x12\x80\xb0\xf0\x68\x50\x39\x22\xc1\xe9\x87\x43\xb0\xa1\xed\xa5\x3c\xec\xba\xf7\x36\x1a\x63\xa8\xc6\x64\xc5\x22\x36\x1d\x7f\x88\xd8\x2f\x17\xaa\x67\x8f\x1e\x1f\x34\xf9\x86\x6e\x2f\x51\x8d\x8e\xb1\xe0\x14\xfe\x79\xf5\x7c\xf2\x0f\x9c\xfc\x72\x7d\xdc\x7c\x78\x34\xf9\xee\x5f\xe3\xe9\xf5\xc3\xde\xd7\xeb\x93\x67\x7f\xdc\xc3\x29\x46\xd0\x3d\xdd\xa7\x29\x22\x6d\x67\xd8\x5a\x74\x1c\x2a\x8c\x9e\xc3\xa5\x61\x54\xfa\x12\x4b\x4b\x63\xf8\xbb\x0a\xa5\xe1\x33\x95\x46\xca\x57\xfb\xa5\xe3\xaa\x3c\xe2\x5d\x87\x3b\x8a\x0d\x49\x10\xe9\x30\x4d\x23\xee\x1e\x9a\x20\xeb\xfd\x94\x14\x7a\x32\x3d\xef\x67\x9a\x1e\x4a\x84\x90\xf1\xb8\x0f\xcd\x9a\x9e\x36\x2b\x74\x75\xda\x43\x91\xdc\x4c\x9f\xa3\x5a\x43\x97\xd6\x62\x07\x7a\xd7\xd3\x2d\xc3\x23\xc0\xc2\x68\x6b\x37\x30\xd8\x42\x29\x3f\x12\x6c\xda\xd4\x98\x2c\x73\x2a\x30\x74\xdf\x26\x97\xce\xa0\x59\x77\xd2\x59\x28\x50\x05\x50\x6b\x69\xee\x4b\x38\xb6\x44\x90\x29\x2d\x68\x37\xbb\x9e\xc4\x1c\x8a\xb9\x2c\xa5\x5b\x73\x96\x14\x54\x68\x35\x2f\x65\xd3\xf4\x57\x0c\xca\x50\xb9\x18\x6e\x86\x16\x74\x0b\xd2\x41\xc5\x8d\x24\x59\x26\x39\x16\xca\x9e\x9d\x3d\xfe\xe6\xc2\xe7\x42\x57\x28\xd5\xcb\xca\x9d\x9e\x3c\x3b\xfe\xd9\x63\xc9\x99\x47\xfc\x80\x15\xbd\xac\xdc\xc9\x97\x2b\x8b\x67\x4f\xee\x11\x45\xc7\x57\x31\x56\xae\x8f\xaf\x26\xcd\xa7\x87\xed\xd4\xc9\xb3\xe3\x59\x76\x70\xfd\xe4\x21\x9f\xa1\x17\x81\xd7\x57\x93\x2e\xfc\xb2\xeb\x87\x27\xcf\x7a\x6b\x27\xbb\xc1\xc8\x15\x4b\x16\xf4\xbc\x28\xb4\xff\x6a\x98\x73\x38\xf6\x3f\x81\xf6\x63\x0a\x68\xf1\xfe\x36\x6c\x1f\xc0\xfa\xd2\xd9\xa6\x7c\x46\x58\x1f\x3d\xa3\x49\x24\x9c\x60\x9d\x41\x59\x46\xb7\x2a\x9c\xc7\xb2\x77\x27\x00\x76\x6d\x1d\x55\x5f\x08\xd2\x77\x6e\x9c\xe0\x75\x82\xd7\x09\x5e\xef\x8c\x4f\xc3\xeb\x5d\x30\x9a\x90\x78\x42\xe2\xdd\x48\x48\x3c\x21\xf1\x84\xc4\xef\x65\xcd\x84\xc4\x13\x12\xdf\x1e\x09\x89\x37\x34\x09\x89\x27\x24\xfe\xb5\x91\x78\xac\x53\x53\x70\xc6\xb7\x4d\x8b\x75\xda\x70\x93\x02\x73\x76\xd9\x76\xd2\xe7\x1b\xfb\x76\x5e\xd8\x84\x2e\xfc\xfa\xdb\xf6\xeb\x38\x8f\xd3\xeb\x38\xe9\x75\x9c\xf4\x3a\x4e\x7a\x1d\xa7\x1d\x5f\xfb\x75\x9c\xed\xeb\xb9\xf8\xce\xcc\xd6\x75\x5c\xf0\xd9\xda\xe8\x95\x14\x64\xef\xbc\xbc\x13\xfa\xf0\x3b\x55\xa6\x42\xe5\xfb\x2f\xe4\xd0\xd7\x79\x1d\x27\xdd\xdd\xa5\xbb\xbb\x74\x77\x97\xee\xee\xd2\xdd\x5d\xba\xbb\x4b\x77\x77\xe9\xee\xae\x1b\xe9\xee\x2e\xdd\xdd\xed\x33\x79\xba\xbb\x6b\x47\xba\xbb\x4b\x77\x77\x03\xa6\xf8\xff\xb8\xbb\xeb\x7b\x50\xfa\xd5\x46\x82\xa6\x09\x9a\xfe\x8f\x41\xd3\x84\x37\x13\xde\x4c\x78\x73\x60\x24\xbc\x99\xf0\x66\xc2\x9b\x09\x6f\xee\x8c\x84\x37\x1b\x9a\x84\x37\x13\xde\x4c\xbf\xda\xf8\x0f\x7f\xb5\xf1\xf6\xcd\x79\xef\x4d\x90\xf8\x86\x48\xcf\xb3\x96\xb8\x22\xc8\x89\xd4\xa6\x8d\x48\xff\xc5\x4d\x50\x39\x41\xe5\xdf\x03\x54\x4e\xff\xc5\x4d\xa8\x3a\xa1\xea\x3d\x23\xa1\xea\x84\xaa\x13\xaa\x4e\xa8\x3a\xa1\xea\x43\x24\x09\x55\x27\x54\x3d\x34\x7e\xc7\xbf\xc0\xe8\xcf\x7d\xea\x07\x18\xff\x0e\x00\x00\xff\xff\xa4\x54\x9b\x0f\xf2\x56\x00\x00") +var _operatorsCoreosCom_operatorconditionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5b\x5f\x6f\x1b\xb9\x11\x7f\xf7\xa7\x18\xa8\x05\x62\xa7\xd2\x2a\xf6\x15\xe9\x9d\x80\x20\x08\x72\x4d\x11\x24\xbe\x04\xb1\x7b\x0f\xb5\xdc\x66\x76\x39\x5a\xf1\xb2\x4b\xee\x91\x5c\xd9\xba\xc3\x7d\xf7\x62\xc8\x5d\xed\xca\x5a\xc9\x2e\x92\x06\xd7\x82\x7c\xb1\x44\xce\x0e\x87\xf3\xff\x47\xaf\xb0\x92\x3f\x92\xb1\x52\xab\x19\x60\x25\xe9\xd6\x91\xe2\x6f\x36\xf9\xf4\xad\x4d\xa4\x9e\xae\x4e\x8f\x3e\x49\x25\x66\xf0\xb2\xb6\x4e\x97\x1f\xc8\xea\xda\x64\xf4\x3d\x2d\xa4\x92\x4e\x6a\x75\x54\x92\x43\x81\x0e\x67\x47\x00\xa8\x94\x76\xc8\xd3\x96\xbf\x02\x64\x5a\x39\xa3\x8b\x82\xcc\x24\x27\x95\x7c\xaa\x53\x4a\x6b\x59\x08\x32\x9e\x79\xbb\xf5\xea\x49\xf2\x34\x39\x3b\x02\xc8\x0c\xf9\xc7\x2f\x65\x49\xd6\x61\x59\xcd\x40\xd5\x45\x71\x04\xa0\xb0\xa4\x19\xe8\x8a\x0c\x3a\x6d\x32\xad\x84\xdf\xde\x26\xed\x94\x4d\x32\x6d\x48\xf3\x9f\xf2\xc8\x56\x94\xb1\x04\xb9\xd1\x75\xd5\x3d\xb6\x45\x13\x78\xb6\x82\xa2\xa3\x5c\x1b\xd9\x7e\x07\x98\x80\x2e\x4a\xff\x39\x28\xe0\x5d\xc3\xe3\x65\xbb\xb5\x5f\x2b\xa4\x75\x6f\x86\xd7\xdf\x4a\xeb\x3c\x4d\x55\xd4\x06\x8b\x21\xe1\xfd\xb2\x5d\x6a\xe3\x7e\xe8\x44\xe1\xad\xb3\xad\x4d\xac\x54\x79\x5d\xa0\x19\x60\x71\x04\x60\x33\x5d\xd1\x0c\x3c\x87\x0a\x33\x12\x47\x00\x8d\x66\x1b\x8e\x93\x46\x7b\xab\xd3\x66\x03\x9b\x2d\xa9\xc4\x76\x3b\x60\xb6\xea\xc5\xfb\xd7\x3f\x7e\x73\x71\x67\x01\x40\x90\xcd\x8c\xac\x9c\xb7\xd3\xce\x19\x41\x5a\xc0\xc6\x37\xa0\x75\x0e\xd0\x0b\x70\xeb\x8a\xe0\xe3\x0e\xfd\x47\xb8\x59\xca\x6c\xc9\x8f\xd5\x96\x04\x38\xcd\x47\x5d\xd1\x1a\xa4\x5a\x68\x53\x7a\xe3\xf3\xec\xbb\xb7\xe7\x80\xa9\xae\x1d\xb8\x25\x81\x75\xe8\x3c\x5b\x54\x1b\x15\x24\x3d\x21\x79\xb7\x19\xe8\xf4\x27\xca\x5c\x6f\xda\xd0\xcf\xb5\x34\x24\xfa\xe7\x61\x6d\xb4\x2e\xdb\x9b\xae\x0c\xf3\x75\x3d\xfb\x87\xd1\x0b\x90\xad\xf9\x3b\x8a\x79\xc4\xda\x0b\x74\x20\x38\x36\xc8\x7a\xc1\x1b\x3b\x90\x68\x54\xee\x55\xb3\x94\x16\x0c\x55\x86\x2c\xa9\x10\x2d\xed\xd1\xfc\x01\x12\xb8\x20\xc3\x0f\xb2\x67\xd4\x85\x08\x1a\x32\x0e\x0c\x65\x3a\x57\xf2\x97\x0d\x37\xcb\x9a\xe2\x6d\x0a\x74\x64\x1d\x48\xe5\xc8\x28\x2c\x60\x85\x45\x4d\x63\x40\x25\xa0\xc4\x35\x18\x62\xbe\x50\xab\x1e\x07\x4f\x62\x13\x38\xd7\x86\xbc\xf2\x67\xb0\x74\xae\xb2\xb3\xe9\x34\x97\xae\x0d\xff\x4c\x97\x65\xad\xa4\x5b\x4f\x7d\x24\xcb\xb4\xe6\x28\x9a\x0a\x5a\x51\x31\xb5\x32\x9f\xa0\xc9\x96\xd2\x51\xe6\x6a\x43\x53\xac\xe4\xc4\x0b\xab\x42\x68\x96\xe2\x0f\xa6\xf1\x09\xfb\xe8\x8e\xfa\x82\xc9\xac\x33\x52\xe5\x5b\x4b\x3e\xda\x0e\xea\x9a\xe3\x2d\x38\x5e\x78\x3c\x9c\xa5\x53\x29\x4f\xb1\x56\x3e\xfc\xf5\xe2\x12\x5a\x01\x82\xda\x83\x86\x3b\x52\xdb\x29\x9b\x15\x25\xd5\x82\x4c\xa0\x5c\x18\x5d\x7a\x2e\xa4\x44\xa5\xa5\x0a\x8e\x98\x15\x92\x94\x03\x5b\xa7\xa5\x74\xd6\x3b\x18\x59\xc7\x76\x48\xe0\xa5\xcf\x7e\x90\x12\xd4\x95\x40\x47\x22\x81\xd7\x0a\x5e\x62\x49\xc5\x4b\xb4\xf4\x5f\x57\x35\x6b\xd4\x4e\x58\x7d\x0f\x57\x76\x3f\x79\xef\x3e\xb0\x13\x50\x00\x6d\x62\xdd\x6b\x9d\x9d\x90\xbf\xa8\x28\x03\x2c\x0a\x7d\xc3\x16\xcb\x8a\xda\x3a\x32\x80\xa2\x94\x6a\x4f\xf8\x1f\x8e\xfb\x26\x3b\x8c\xa1\xd2\x8e\x4f\x8f\x45\xb1\x06\xbd\x22\x63\xa4\x60\xcb\x87\x67\x0c\x55\xda\x38\x12\x90\xae\x3d\xa7\xa1\xac\x71\xf0\xa0\xfb\x53\x42\x38\x72\x55\xe8\x75\xc9\x1e\xb4\xbb\xd8\x72\x45\x63\x70\x3d\xb0\x2a\x1d\x95\x83\x8f\x1d\x30\x14\x8f\xe6\x90\x43\xf2\x7c\xc6\x96\x5b\xd6\x1b\x75\x99\x9d\xbd\x10\xa5\xb2\x20\xc8\xa1\x2c\x2c\x2c\xb4\x01\xad\x08\x90\x7d\xc0\x85\x4c\x46\x90\xd5\xc6\xf8\x90\x68\x4d\xe5\xa3\xe7\xc5\xfb\xd7\x9b\x72\x90\xc0\x64\x32\x81\x4b\x9e\xb6\xce\xd4\x99\xe3\xd8\xe5\x54\xa5\x04\x09\xcf\x55\x48\xe3\xf3\x93\x65\xe6\x6c\x6b\x7f\x0c\xc0\xe0\x04\x0b\x49\x85\x80\x0a\xdd\x12\x12\xde\xa5\xe6\xf2\xbd\x29\xff\x00\xaf\xb4\x01\xba\xc5\xb2\x2a\x68\x1c\xea\xce\x2b\xad\x2f\x3c\x61\xb3\xe1\xaf\xfe\xa0\xd3\x29\x7c\xd8\xc4\x7d\x70\x8a\xd4\x92\x59\x85\x7e\xc5\x7b\x19\x2c\xb4\x7e\x64\xb7\xcf\x94\xb4\x0f\xbf\x51\xfa\x46\x0d\x89\xe0\xf7\x44\x43\x33\x98\x8f\x5e\xac\x50\x16\x98\x16\x34\x1f\x8d\x61\x3e\x7a\x6f\x74\x6e\xc8\x72\x01\xe7\x09\x4e\xc8\xf3\xd1\xf7\x94\x1b\x14\x24\xe6\xa3\x96\xf5\x9f\x2a\x74\xd9\xf2\x9c\x4c\x4e\x6f\x68\xfd\xcc\x33\xdc\x5a\xba\x70\x86\x1b\x94\xf5\xb3\x92\x69\x36\x6b\xdc\x7d\x5c\xae\x2b\x7a\x56\x62\xb5\x35\x79\x8e\xd5\x16\xa3\x8d\x59\x2d\x5c\x5d\x73\xd0\xaf\x4e\x93\xce\xd4\x1f\x7f\xb2\x5a\xcd\xe6\xa3\xee\x4c\x63\x5d\xb2\xcb\x54\x6e\x3d\x1f\xc1\x96\x04\xb3\xf9\xc8\xcb\xd0\xce\xb7\x42\xcf\xe6\x23\xde\x8d\xa7\x8d\x76\x3a\xad\x17\xb3\xf9\x28\x5d\x3b\xb2\xe3\xd3\xb1\xa1\x6a\xcc\x2d\xc8\xb3\x6e\x87\xf9\xe8\x23\xcc\x55\x2b\xb4\x76\x4b\x32\xc1\xd2\x16\x7e\x1b\x1d\x88\x8d\xc1\x50\x0d\x63\xb8\xdc\x77\x83\x0b\xbf\xb5\x98\xd3\xde\x75\x43\x68\x9b\x9e\x6b\x68\x39\x98\x7e\xef\x32\x0b\x38\xb8\x78\x28\x93\x84\x51\xa0\x75\x97\x06\x95\x95\x6d\xf7\xbb\x8f\xf2\x4e\xc0\xee\x3e\xc8\xd1\x15\x7a\x02\xeb\xc0\xf1\x84\x0f\xd3\x8d\xb1\xdd\x86\x9a\xa3\x8f\xab\x1c\x07\x75\x38\x1a\xe7\x56\x54\xde\x18\x49\x13\xb1\xa1\x05\x49\x09\x6e\x96\xa4\x3c\xab\x5a\x09\x32\xc5\x9a\x73\x6d\xc7\x35\x5b\xa2\xca\xb9\xe4\xc1\x6b\x4e\x01\xe8\x83\x9c\xcb\xe1\x27\x8e\x9a\x31\x3f\xa8\xa0\xb6\x6d\x69\xf6\x72\x6d\x38\x72\xb6\x08\x51\xde\xb0\xf1\xd5\x3d\xcb\xa8\x72\x1c\x4a\x77\x73\x76\x37\x0e\xa6\xcb\x76\x84\xc2\x32\x03\xae\xc9\x13\xde\x78\x0f\x65\xe3\x1c\x0f\x54\x7c\x43\x1d\xfa\x90\x65\x5d\xa2\x62\xef\x11\x2c\x6f\xb7\xa6\x84\xcc\xd0\xf7\x23\x6d\x12\xed\x6a\x5b\x67\x87\x46\xd5\xdc\x80\xa4\xc4\xe9\xcf\x07\x5e\x73\xac\xcf\x3c\x7c\x89\xb7\x6f\x49\xe5\x6e\x39\x83\x6f\xce\xfe\xf2\xf4\xdb\x3d\x84\x21\x13\x92\xf8\x1b\x29\xae\x93\x03\xed\xee\x1e\x35\xec\x3e\xd8\x6b\xae\xfc\x39\x93\xb6\xc7\x48\xf2\x8e\xc6\x7b\xc8\xb6\x5f\xde\xa0\x05\x4b\x0e\x52\x64\x60\x50\x57\xac\x17\x4e\xed\x52\x59\x87\x2a\xa3\x31\xc8\xc5\x30\x33\xb9\xc9\xd8\xc5\x1a\x4e\xcf\xc6\x90\x36\x2a\xde\xcd\xd5\x57\xb7\xd7\xc9\x80\xc8\xd2\xc2\x77\xe3\x3b\xf2\x70\xb7\x58\xfb\x32\xc7\x8e\x03\x37\xd2\x2d\xb9\x99\xf4\xb5\xaf\x69\xbb\x07\x6a\x1f\x6d\xe4\xbd\xcf\x70\x5c\x01\x73\x32\xf7\xba\xad\x54\xee\xe9\x9f\xf7\xdb\x57\x2a\x59\xd6\xe5\x0c\x9e\xec\x21\x09\x29\xed\x81\xd6\x0c\xc4\x5d\xe9\x47\x4e\x5d\xb9\xc1\x92\x3b\xb3\x0c\xa4\xe0\x86\x6b\x21\xc9\xf4\x5d\x9b\x0f\xdd\x3c\xc8\xc5\x7c\x4b\x8b\x8f\x6c\x93\x87\x7a\xce\xfe\xde\x68\x51\x67\xdc\x72\xeb\x85\xef\x27\xe5\x42\x66\xfd\x04\xc5\x7d\xac\x8f\x86\x80\xa4\x80\x6e\x59\xe9\x1b\xcc\x12\x60\x0d\xa1\x92\x2a\xb7\xcd\x96\xdc\xb0\x73\x02\x09\x25\xf6\x66\x49\xbe\x9e\x78\x04\xd6\x3c\x63\xbc\x54\x56\x0a\x32\x24\x00\x21\xaf\xd1\xa0\x72\x44\x82\xd3\x0f\x87\x60\x43\xdb\x4b\x79\xd8\x75\xef\x6d\x34\x86\x50\x0d\xc9\x8a\x45\x6c\x3a\x7e\x1f\xb1\x5f\x2e\x54\x4f\x9f\x9c\x1d\x34\xf9\x86\x6e\x2f\x51\x85\x8e\xb1\xe0\x0c\xfe\x79\xf5\x62\xf2\x0f\x9c\xfc\x72\x7d\xdc\x7c\x78\x32\xf9\xee\x5f\xe3\xd9\xf5\xe3\xde\xd7\xeb\x93\xe7\x7f\xdc\xc3\x29\x44\xd0\x03\xdd\xa7\x29\x22\x6d\x67\xd8\x5a\x74\xec\x2b\x8c\x5e\xc0\xa5\x61\x54\xfa\x0a\x0b\x4b\x63\xf8\xbb\xf2\xa5\xe1\x33\x95\x46\xaa\x2e\xf7\x4b\xc7\x55\x79\xc4\xbb\x0e\x77\x14\x1b\x12\x2f\xd2\x61\x9a\x46\xdc\x3d\x34\x5e\xd6\x87\x29\xc9\xf7\x64\x7a\xd1\xcf\x34\x3d\x94\x08\x3e\xe3\x71\x1f\x9a\x34\x3d\x6d\x92\xe9\x72\xda\x43\x91\xdc\x4c\x9f\xa3\x5a\x43\x97\xd6\x42\x07\x7a\xd7\xd3\x2d\xc3\x23\xc0\xcc\x68\x6b\x37\x30\xd8\x42\x21\x3f\x11\x6c\xda\xd4\x90\x2c\x53\xca\xd0\x77\xdf\x26\x95\xce\xa0\x59\x77\xd2\x59\xc8\x50\x79\x50\x6b\x69\x51\x17\x70\x6c\x89\x20\x51\x5a\xd0\x6e\x76\x3d\x09\x39\x14\x53\x59\x48\xb7\xe6\x2c\x29\x28\xd3\x6a\x51\xc8\xa6\xe9\x2f\x19\x94\xa1\x72\x21\xdc\x0c\xe5\x74\x0b\xd2\x41\xc9\x8d\x24\x59\x26\x39\x16\xca\x9e\x9e\x9e\x7d\x73\x51\xa7\x42\x97\x28\xd5\xab\xd2\x4d\x4f\x9e\x1f\xff\x5c\x63\xc1\x99\x47\xfc\x80\x25\xbd\x2a\xdd\xc9\x97\x2b\x8b\xa7\x4f\x1f\x10\x45\xc7\x57\x21\x56\xae\x8f\xaf\x26\xcd\xa7\xc7\xed\xd4\xc9\xf3\xe3\x79\x72\x70\xfd\xe4\x31\x9f\xa1\x17\x81\xd7\x57\x93\x2e\xfc\x92\xeb\xc7\x27\xcf\x7b\x6b\x27\xbb\xc1\xc8\x15\x4b\x66\xf4\x22\xcb\x74\xfd\xd5\x30\xe7\x70\xec\xdf\x83\xf6\x43\x0a\x68\xf1\xfe\x36\x6c\x1f\xc0\xfa\xd2\xd9\xa6\x7c\x06\x58\x1f\x3c\xa3\x49\x24\x9c\x60\x9d\x41\x59\x04\xb7\xca\x5c\x8d\x45\xef\x4e\x00\xec\xda\x3a\x2a\xbf\x10\xa4\xef\xdc\x38\xc2\xeb\x08\xaf\x23\xbc\xde\x19\xf7\xc3\xeb\x5d\x30\x1a\x91\x78\x44\xe2\xdd\x88\x48\x3c\x22\xf1\x88\xc4\x1f\x64\xcd\x88\xc4\x23\x12\xdf\x1e\x11\x89\x37\x34\x11\x89\x47\x24\xfe\xb5\x91\x78\xa8\x53\x33\x70\xa6\x6e\x9b\x16\xeb\xb4\xe1\x26\x05\x16\xec\xb2\xed\x64\x9d\x6e\xec\xdb\x79\x61\x13\xba\xf0\xeb\x6f\xdb\xaf\xe3\x9c\xc5\xd7\x71\xe2\xeb\x38\xf1\x75\x9c\xf8\x3a\x4e\x3b\xbe\xf6\xeb\x38\xdb\xd7\x73\xe1\x9d\x99\xad\xeb\x38\xef\xb3\x95\xd1\x2b\x29\xc8\xde\x79\x79\xc7\xf7\xe1\x77\xaa\x4c\x89\xaa\xee\xbf\x90\x43\x5f\xe7\x75\x9c\x78\x77\x17\xef\xee\xe2\xdd\x5d\xbc\xbb\x8b\x77\x77\xf1\xee\x2e\xde\xdd\xc5\xbb\xbb\x6e\xc4\xbb\xbb\x78\x77\xb7\xcf\xe4\xf1\xee\xae\x1d\xf1\xee\x2e\xde\xdd\x0d\x98\xe2\xff\xe3\xee\xae\xef\x41\xf1\x57\x1b\x11\x9a\x46\x68\xfa\x3f\x06\x4d\x23\xde\x8c\x78\x33\xe2\xcd\x81\x11\xf1\x66\xc4\x9b\x11\x6f\x46\xbc\xb9\x33\x22\xde\x6c\x68\x22\xde\x8c\x78\x33\xfe\x6a\xe3\x3f\xfc\xd5\xc6\xbb\xb7\xe7\xbd\x37\x41\xc2\x1b\x22\x3d\xcf\x5a\xe2\x8a\x20\x25\x52\x9b\x36\x22\xfe\x17\x37\x42\xe5\x08\x95\x7f\x0f\x50\x39\xfe\x17\x37\xa2\xea\x88\xaa\xf7\x8c\x88\xaa\x23\xaa\x8e\xa8\x3a\xa2\xea\x88\xaa\x0f\x91\x44\x54\x1d\x51\xf5\xd0\xf8\x1d\xff\x02\xa3\x3f\x77\xdf\x0f\x30\xfe\x1d\x00\x00\xff\xff\xcd\xc3\xfd\xa8\xf2\x56\x00\x00") func operatorsCoreosCom_operatorconditionsYamlBytes() ([]byte, error) { return bindataRead( @@ -164,7 +164,7 @@ func operatorsCoreosCom_operatorconditionsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xe9\x6f\x1b\x37\x16\xff\xee\xbf\xe2\x41\x5d\x20\x76\x56\x1a\xc5\xee\x22\xdb\x0a\x08\x02\x23\x69\x0a\x6f\x73\x18\xb1\xdb\x0f\x6b\x7b\xb7\xd4\xcc\xd3\x88\x35\x87\x9c\x92\x1c\xdb\x6a\x90\xff\x7d\xf1\x1e\x39\x87\x4e\xcb\x49\xda\xed\x2e\xa4\x2f\xf6\x0c\x8f\x79\xe7\xef\x1d\xa4\x28\xe5\x4f\x68\x9d\x34\x7a\x04\xa2\x94\x78\xe7\x51\xd3\x93\x4b\xae\xbf\x71\x89\x34\xc3\x9b\xc3\xbd\x6b\xa9\xb3\x11\xbc\xa8\x9c\x37\xc5\x7b\x74\xa6\xb2\x29\xbe\xc4\x89\xd4\xd2\x4b\xa3\xf7\x0a\xf4\x22\x13\x5e\x8c\xf6\x00\x84\xd6\xc6\x0b\x7a\xed\xe8\x11\x20\x35\xda\x5b\xa3\x14\xda\x41\x8e\x3a\xb9\xae\xc6\x38\xae\xa4\xca\xd0\xf2\xe6\xf5\xa7\x6f\x9e\x24\x4f\x93\x27\x7b\x00\xa9\x45\x5e\x7e\x2e\x0b\x74\x5e\x14\xe5\x08\x74\xa5\xd4\x1e\x80\x16\x05\x8e\xc0\x94\x68\x85\x37\x36\xb7\xa6\x2a\x5d\x52\x3f\xba\x24\x35\x16\x0d\xfd\x29\xf6\x5c\x89\x29\x7d\x9d\xe7\xb4\x4b\xe6\xe6\x84\xfd\x6a\x22\x85\xc7\xdc\x58\x59\x3f\x03\x0c\xc0\xa8\x82\xff\x0f\xcc\xbf\x8b\x7b\x7c\x4f\x5b\xf2\x7b\x25\x9d\xff\x61\x79\xec\xb5\x74\x9e\xc7\x4b\x55\x59\xa1\x16\x09\xe6\x21\x37\x35\xd6\xbf\x6d\x3f\xcf\x9f\xcb\xc3\x90\xd4\x79\xa5\x84\x5d\x58\xb7\x07\xe0\x52\x53\xe2\x08\x78\x59\x29\x52\xcc\xf6\x00\xa2\xf8\xe2\x36\x83\x28\xa2\x9b\xc3\xb8\xab\x4b\xa7\x58\x88\xfa\x1b\x40\x5b\xea\xe3\xd3\x93\x9f\xbe\x3e\x5b\x18\x00\xc8\xd0\xa5\x56\x96\x9e\x95\x31\xc7\x10\x48\x07\x7e\x8a\x50\x69\xe9\xc1\x4c\xa0\xa8\x94\x97\x1e\xb5\xd0\xe9\x0c\x26\xc6\xc2\xbb\xd7\x6f\xa0\x10\x5a\xe4\x98\x75\x44\x0d\x27\x9e\x74\xef\xbc\x15\x52\x87\x1d\xa4\x76\x5e\x28\xc5\xea\xa5\x9d\x9a\xc9\x20\x35\x48\xef\x82\x46\x88\x37\xf0\x06\x04\x90\x1a\xe5\x44\x62\x06\x0e\xf9\xd3\x5e\xd8\x1c\x7d\x3b\xcd\x25\x1d\x0e\xfc\x8c\xc4\x63\xc6\xbf\x60\xea\x3b\xaf\x2d\xfe\x5a\x49\x8b\x59\x97\x59\x12\x55\x6d\xb4\x9d\xd7\xa5\x25\x8a\x7c\xc7\x0a\xc2\xaf\xe3\x22\x73\xef\x17\xa4\xf6\x88\x44\x1b\xe6\x41\x46\xde\x81\x81\xed\xa8\x24\x62\x83\xc5\xce\x9c\x4c\xa5\x03\x8b\xa5\x45\x87\xda\x37\x12\x11\x3a\x32\x90\xc0\x19\x5a\x5a\x48\xb6\x52\xa9\x8c\x44\x79\x83\xd6\x83\xc5\xd4\xe4\x5a\xfe\xd6\xec\xe6\x48\x56\xf4\x19\x25\x3c\x3a\x0f\x52\x7b\xb4\x5a\x28\xb8\x11\xaa\xc2\x3e\x08\x9d\x41\x21\x66\x60\x91\xf6\x85\x4a\x77\x76\xe0\x29\x2e\x81\x37\xc6\x92\x76\x26\x66\x04\x53\xef\x4b\x37\x1a\x0e\x73\xe9\x6b\x00\x48\x4d\x51\x90\xf2\x67\x43\xf6\x65\x39\xae\x48\x67\xc3\x0c\x6f\x50\x0d\x9d\xcc\x07\xc2\xa6\x53\xe9\x31\xf5\x95\xc5\xa1\x28\xe5\x80\x89\xd5\x0c\x02\x49\x91\x7d\x65\x23\x64\xb8\x47\x0b\xe2\x0b\x2a\x73\xde\x4a\x9d\xcf\x0d\xb1\xcf\x6d\x94\x35\x79\x1e\x59\xa6\x88\xcb\x03\x2f\xad\x48\xe9\x15\x49\xe5\xfd\x77\x67\xe7\x50\x13\x10\xc4\x1e\x24\xdc\x4e\x75\xad\xb0\x49\x50\x52\x4f\xd0\x86\x99\x13\x6b\x0a\xde\x05\x75\x56\x1a\xa9\x3d\x3f\xa4\x4a\xa2\xf6\xe0\xaa\x71\x41\x46\x4b\x06\x86\xce\x93\x1e\x12\x78\xc1\xf8\x07\x63\x84\xaa\xcc\x84\xc7\x2c\x81\x13\x0d\x2f\x44\x81\xea\x85\x70\xf8\xbb\x8b\x9a\x24\xea\x06\x24\xbe\xed\x85\xdd\x85\xef\xe5\x05\x4b\x0e\x05\x50\xc3\xeb\x5a\xed\xcc\xe1\xc7\x59\x89\x69\x8d\x21\xb4\x92\x31\x43\xe8\x05\x90\xa9\x55\x94\x6c\x4b\xc4\x7a\x77\x65\x12\x51\x61\xea\x8d\x5d\x1e\x59\x20\xf5\x2c\x4e\x8c\x2b\x02\x99\x73\xa4\x3d\x72\x9b\x71\x67\x0b\x4a\xef\xa3\x96\xb5\x20\x7c\x3a\xfd\xee\x8e\x6c\xb2\x03\xe9\xf7\x50\xbf\xb8\x28\x78\x04\x45\x26\x42\x13\x25\xc6\xa8\x1a\x51\xd4\x48\x58\x04\x93\x3f\x9f\xe2\xdc\x1b\x10\x16\xe1\xf8\xed\x4b\xcc\x56\x31\xd7\x32\x28\xac\x15\xb3\x35\x33\xa4\xc7\x62\x2d\xe1\x0b\xa4\x1f\x6f\x20\x2f\x3a\x76\x3d\xe2\xa7\x82\x63\x89\xe7\x48\x12\x40\xab\x0f\x02\xae\x71\x16\xf0\x8d\x60\x33\xaa\x2c\x4c\xb6\xc8\x68\xc8\xca\xbc\xc6\x19\x4f\x8a\x60\xb7\x96\xba\x7b\xf4\x17\x7e\xab\xa3\xc9\xfc\x6f\x40\x9f\xdc\x38\x5e\x13\xbb\x76\xd2\x7d\xc6\x12\x7e\xd7\x38\xdb\x34\xbc\x20\x70\x92\x43\x74\xc3\x20\x79\x7a\xc1\xd2\x62\xcf\xac\x85\x2d\xca\x52\x49\x64\x34\xdb\xb8\xf7\x5a\x38\x99\xff\xd5\xac\x3e\x80\xd0\x46\x95\x2d\x42\x07\x65\x3f\x72\x41\xb1\x64\xe9\x53\x59\xc6\x24\x21\xa4\x06\x75\x28\xfb\x49\x28\xd9\x49\x43\xd8\xaa\x4f\x74\x1f\xde\x1a\x4f\x7f\xbe\xbb\x93\x04\xd5\x64\x0f\x2f\x0d\xba\xb7\xc6\xf3\x9b\x2f\xc2\x6a\x20\xe1\x01\x8c\x86\x05\x6c\xec\x3a\xf8\x15\x71\xd2\x8d\x67\x94\x46\x4d\x58\x3f\x8d\x50\xa4\xa3\x88\x62\x6c\xcd\x11\x67\x18\x61\xa3\xb0\x45\x51\x39\x0e\x40\xda\xe8\x01\x16\xa5\x9f\xad\xdc\x23\x0a\xc2\xd8\x39\x39\x6c\xd8\x2e\x6e\x75\x4e\x71\x31\x8c\x84\x0c\x46\x51\x2a\x0a\x59\xc5\x44\x73\x34\xa6\x5c\x5a\xa6\x50\xa0\xcd\x11\x4a\x42\xa8\x6d\xc4\xbb\x09\x57\xc2\xef\x1e\x74\xd9\x52\x57\x0c\x99\xaf\xc9\x01\x1e\x00\xb1\x61\x7e\x80\xa5\x42\x94\xa4\xa6\x0f\x84\x3e\x2c\xa9\x8f\x50\x0a\x49\x19\xef\x31\x67\xef\x0a\xe7\xc6\xa4\x66\x99\x76\xb7\xa1\x1d\xa4\x03\x82\x92\x1b\xa1\x08\xef\xc8\x92\x35\xa0\x0a\xe8\x47\x49\xf6\x02\xb0\xf7\xe1\x76\x6a\x5c\x00\xb3\x89\x44\xc5\xb9\x4f\xef\x1a\x67\xbd\xfe\x92\x6a\x7b\x27\xba\x17\x70\x71\x49\x99\x0d\x88\x1a\xad\x66\xd0\xe3\xb1\xde\xa7\xc7\x82\x8d\x60\x29\xb2\x8c\xcb\x43\xa1\x4e\xb7\x40\xb3\x8d\x7a\x73\x68\x6f\x64\x8a\xc7\x69\x6a\x2a\xcd\x85\xd3\x16\x71\x7d\x71\x49\x0d\x7e\x22\x2b\xa4\x9e\xab\x2d\x78\x26\x88\x30\x15\x6e\xa7\x32\x9d\xc2\xad\x54\x8a\xd3\x38\x87\x19\xa9\x27\xc3\x52\x99\x59\x23\xe7\x7d\x77\x10\x34\x4b\xf9\x64\x2d\x7b\xae\xd4\xd6\xa7\x06\xeb\x98\xa3\xf4\x3f\x3d\xb5\xe6\x46\x66\x98\x1d\x9f\x9e\xac\x94\xd2\x3c\x73\xbc\x04\x3c\x2a\xe5\xb8\xfc\xa2\x9c\xd3\x9b\x98\x73\xae\x4c\x61\xca\xce\xfe\x9d\x22\x7d\x2d\xb1\x63\x63\x14\x8a\xe5\xf1\x90\x0a\x35\x45\xe8\xfd\xb4\x9e\x2f\x2c\x88\x70\x87\x77\xa5\x92\xa9\xf4\x35\x7e\xb7\xb9\x15\xd7\x33\xbc\x88\x81\x4b\x72\x36\xe0\xd0\xf7\xdb\x5c\x4d\x3a\x90\xb9\x36\x76\xb5\x7d\x6e\xc6\x93\x0d\x28\x72\x0f\x76\xdc\x0d\xae\xab\x31\x5a\x8d\x1e\xdd\x80\x72\xac\x41\x5c\x80\x0b\xe9\xb1\x17\xbe\x5a\xfa\xc4\x86\x04\x99\xe7\x37\x29\x72\x78\x5a\x95\x24\xbf\x7f\x78\x8e\xbc\x3e\x5f\x19\x80\x12\xce\xff\x18\xaa\x94\x07\x64\xd6\xa9\xd1\xc1\xaf\xef\x57\xfd\x8b\x66\xea\x62\x8c\x5b\x65\xa1\xed\xc6\x5f\x54\xa9\x73\x14\xf5\x1a\x92\x5a\x28\xcc\xd0\x0b\xa9\x82\xc4\x8d\x46\x10\x04\x0d\xbe\xa6\x32\xad\xac\xe5\x6a\xcf\x93\x67\xd5\x95\xfb\xf1\xe9\x09\x34\xda\x80\xc1\x60\x10\xe2\xa2\xf3\xb6\x4a\xd9\x5e\xa9\x0a\xd7\x19\x66\xbc\x6b\x26\x2d\x97\xde\x8e\x36\x6f\xe5\x10\x33\xaf\x00\xe7\xa5\xf0\x53\x48\x82\xf2\x93\x8e\x28\x00\x5e\x19\x0b\x78\x27\x8a\x52\x61\x9f\xc5\x00\xaf\x8c\x89\x36\x13\x3e\xf8\x81\x19\x1d\x0e\xe1\x7d\x9b\x30\x71\x50\x18\x13\xb6\x85\x7c\x89\xbb\x0b\x30\x31\x86\x24\xdd\xe5\x29\xa9\x17\xff\xa0\xcd\xad\x5e\x45\x02\x7f\x53\x58\x1c\xc1\x65\xef\xf8\x46\x48\x25\xc6\x0a\x2f\x7b\x7d\xb8\xec\x9d\x5a\x93\x73\x88\xd2\xf9\x65\x8c\x39\x97\xbd\x97\x98\x5b\x91\x61\x76\xd9\xab\xb7\xfe\x2b\x67\x01\x6f\x28\x21\xf8\x01\x67\xcf\x78\xc3\xb9\xa1\xb3\x90\x35\xcc\x9e\x85\xa4\xa1\x1e\x23\x27\x3b\x9f\x95\xf8\x8c\x22\x66\xf7\xe5\x1b\x51\xce\x6d\xd4\xb1\xb4\x8b\x2b\xaa\x67\x6f\x0e\x93\x56\xd5\x3f\xff\xe2\x8c\x1e\x5d\xf6\x5a\x9e\xfa\xa6\x20\x93\x29\xfd\xec\xb2\x07\x73\x14\x8c\x2e\x7b\x4c\x43\xfd\xbe\x26\x7a\x74\xd9\xa3\xaf\xd1\x6b\x6b\xbc\x19\x57\x93\xd1\x65\x6f\x3c\xf3\xe8\xfa\x87\x7d\x8b\x65\x9f\x00\xec\x59\xfb\x85\xcb\xde\xcf\x70\xa9\x6b\xa2\x8d\x9f\xa2\x0d\x9a\x76\xf0\xb1\xb7\x01\x7d\x36\x84\xd4\xfb\x6a\x8f\xe0\xd1\xe7\x56\x68\x27\xeb\x0e\xea\xda\xa9\x05\x3a\x27\xf2\xf5\xe3\x16\x85\x5b\x19\x1e\xc2\x70\xb0\x92\xb5\xc3\xc4\xcb\xca\xc1\xfb\x0b\x9b\x65\x1e\xb6\x2c\x28\x97\x17\xb6\xe5\x8e\xf3\xe0\xe9\x05\x7b\x74\x63\x17\xbe\x99\x4d\x8e\x6a\x4d\xc1\xfe\x1f\x01\x98\x53\x32\xd6\x5b\x4c\x7a\x63\x23\x6e\x8c\x70\x3b\x45\x1d\x5b\xa2\x19\x5a\x35\xa3\xcc\xb7\xdd\x35\x9d\x0a\x9d\x63\x96\x40\x48\xbb\x05\xe3\x01\x05\xe8\x6b\x72\x30\x4e\xd7\x34\x54\xae\x6e\x50\x31\x5d\xcd\x8e\x04\x2c\x01\x10\xe2\x36\x8c\x9c\x69\x8a\xa5\x27\xaf\xbb\xaf\x7a\xbd\xa7\x46\x99\x18\x5b\x08\x3f\x02\xc2\xfc\x81\x5f\x6f\x1e\xd1\x38\xb6\x14\x7c\x9c\x1d\xb2\xe3\x69\x55\x08\x4d\xd6\x93\x11\xbd\xed\x98\xce\x64\x2a\xb8\x2b\x57\xe3\xad\x18\x9b\x2a\x20\x60\xab\x87\x28\xea\x42\xcc\x48\xce\x94\x26\x90\x8f\x46\xb6\x3e\x93\xf9\x42\xdc\xbd\x46\x9d\xfb\xe9\x08\xbe\x3e\xfa\xfb\xd3\x6f\xd6\x4c\x0c\xa0\x89\xd9\xf7\xa8\x29\x3e\xad\x68\xfa\xae\x11\xc3\xf2\xc2\x6e\x01\x4b\x7c\x26\x75\xa7\x2d\xc9\xdb\x39\x4d\x05\xde\x5a\xd0\xad\xe0\x84\x07\xc6\x82\x92\xcf\xaa\x24\xb9\x50\x14\xe0\xfe\xb9\x4e\xb1\x0f\x72\xb2\x7a\x33\xd9\x80\xbb\x9a\xc1\xe1\x51\x1f\xc6\x51\xc4\xcb\xb0\x7e\x71\x77\x95\xac\x20\x59\x3a\xf8\xb6\xbf\x40\x0f\xe5\xb8\x15\x47\x44\x4e\x2f\x6f\xa5\x9f\x82\xc5\x10\x26\x63\xf3\x79\x45\x98\xc4\x86\xde\xfb\x14\x47\xc1\x32\xc7\xf5\xdd\x90\xda\x6c\xa5\xf6\x4f\xff\xb6\x5e\xbf\x52\xcb\xa2\x2a\x46\xf0\x64\xcd\x94\x00\x69\x5b\x6a\x33\x4c\x6e\xb3\x04\x41\xd0\x95\x5b\x51\x14\x9c\x7a\xcb\x0c\xb5\xa7\xfa\xc1\x76\x4d\xdb\x73\x1d\xc5\x0b\x27\xdc\x8a\xea\x48\xf1\x91\x8b\x38\xd4\x31\xf6\x53\x6b\xb2\x2a\x45\xcb\xd1\x39\x56\x24\x69\x17\xa0\x66\x25\x06\x6f\x08\xe7\x09\x94\x35\x63\xea\x9b\xce\x7d\x68\xee\xa3\xd0\x52\xe7\x2e\x7e\x52\xba\x00\x20\x21\x1a\xdf\x4e\x91\x43\xcf\x5c\x25\xc8\x54\x39\x99\xa1\xc5\x0c\x04\xe4\x95\xb0\x42\x7b\xc4\x8c\xe0\x27\x54\x83\xa1\x9b\xde\x42\x9e\x68\x7b\xd8\xb5\x37\x06\x57\x0d\x60\x45\x24\xc6\xbe\x77\xe8\x13\x7c\x31\x57\x3d\x7c\x72\xb4\x51\xe5\xcd\xbc\xf5\xbd\x34\xe1\x3d\x5a\x3d\x82\x7f\x5d\x1c\x0f\xfe\x29\x06\xbf\x5d\xed\xc7\x7f\x9e\x0c\xbe\xfd\x77\x7f\x74\xf5\xb8\xf3\x78\x75\xf0\xfc\x2f\x6b\x76\x5a\x9d\xd6\xaf\x31\x9f\x18\x44\xea\x24\xb2\xd6\x68\x9f\x23\x8c\x99\xc0\xb9\xad\xb0\x0f\xaf\x84\x72\xd8\x87\x1f\x35\x87\x86\xcf\x14\x1a\xea\xaa\xd8\xdc\x96\xec\xd1\x57\x57\x27\x1f\xcd\x14\x26\x69\xf3\x9c\x48\xee\xa6\xce\xc0\x76\x42\xe2\xf4\xcd\x4c\xba\x48\xd3\x39\x2b\x01\x46\x3c\x4a\x59\x93\x98\xfe\x26\xa9\x29\x86\x9d\xb3\x14\xca\xbb\xdf\x08\x3d\x83\x16\xd6\x42\xb2\xba\x68\xe9\xce\x13\x36\x89\xd4\x1a\xe7\x9a\x93\x06\x07\x4a\x5e\x23\x34\x19\x6d\x00\xcb\x31\xa6\x82\x13\x75\x3b\x96\xde\x0a\x3b\xeb\xd4\x25\x90\x0a\x1d\x7b\x02\x93\x4a\xc1\xbe\x43\x84\x44\x9b\x0c\x97\xd1\xf5\x20\x60\xa8\x18\x4b\x25\xfd\x2c\x34\x10\x52\xa3\x27\x4a\xc6\xfa\xa0\x28\x8d\xf5\x42\xfb\xba\xf9\x92\xe3\x1d\x95\xba\xdc\xf7\x09\x45\xf2\x7e\xa6\xdd\xe1\xe1\xd1\xd7\x67\xd5\x38\x33\x85\x90\xfa\x55\xe1\x87\x07\xcf\xf7\x7f\xad\x84\xe2\xce\x05\xd5\xd4\xaf\x0a\x7f\xf0\xe5\xc2\xe2\xe1\xd3\x2d\xbc\x68\xff\x22\xf8\xca\xd5\xfe\xc5\x20\xfe\xf7\xb8\x7e\x75\xf0\x7c\xff\x32\xd9\x38\x7e\xf0\x98\x78\xe8\x78\xe0\xd5\xc5\xa0\x75\xbf\xe4\xea\xf1\xc1\xf3\xce\xd8\xc1\xb2\x33\x76\xaa\xd6\x7b\x0b\xd0\xd7\xed\xdc\x90\x9d\xf8\xfa\x52\x41\xed\x99\xf3\xa9\xe1\x62\x49\x1a\xbd\x98\xe2\x71\xdc\xe6\xc1\xdd\x9d\x6d\x92\x2e\xbd\x7d\x37\x65\xbe\x8f\x12\x1a\xf7\xab\x8f\xc6\x9b\x08\x34\xc7\xd4\x9f\xb1\x5f\x02\x4b\x1d\xbe\xf7\x38\x79\x60\x83\xef\x3d\x4e\xc0\xe2\x04\x2d\xea\x14\x6b\xc1\xcc\xf7\xf5\xe2\xb1\x6f\xd3\xf8\xfb\x1d\xce\xf0\xd6\x5f\x14\x58\xc9\x02\x25\xfb\xf1\x72\x40\x6d\x8f\x91\x87\xb5\x07\x12\xf7\xba\x34\xc7\xe3\x53\xe1\xa7\x5b\x51\xf0\xe8\x24\x8a\x8d\xbb\xf7\x7c\x9e\x52\x4a\x4c\x71\xee\x2e\x02\xe7\x71\x28\xb2\xf8\x92\x12\x1f\x8b\x71\xac\x1f\x32\x8e\x78\x66\xd1\xde\x55\xa0\xa4\x09\x04\x01\xb1\xcc\xe0\x1f\x67\xef\xde\x0e\xbf\x37\x31\x57\xa0\x6a\xc6\x05\xdf\xe2\x6e\x73\x1f\x5c\x95\x4e\x41\x38\x22\x8d\xea\xdb\x33\x6e\x4b\x14\x42\xcb\x09\x3a\x9f\xc4\xdd\xd0\xba\x8b\xa3\xab\x64\xbe\x1d\x22\xe3\xc1\x46\x7d\xa2\x1f\x0d\x80\x7d\x83\x98\x69\xd6\x72\xd2\xca\x24\x95\x26\x8b\x44\xdf\x32\xb1\x5e\x5c\x23\x98\x48\x6c\x85\x1c\x14\x46\xd0\x23\x33\xe9\x7c\xfa\x03\x39\xd6\xc7\x1e\xec\xdf\x4e\xd1\x22\xf4\xe8\xb1\x17\x3e\xd8\x5c\xc0\xa0\x77\x9d\x88\x1f\x3f\x1c\xf2\x7b\x2b\xf3\x9c\xd3\x2d\xbe\x4d\x70\x83\xda\x1f\x70\x7c\x9b\x80\x36\x9d\xc9\x3a\xf6\xa9\xdb\xee\xf4\x22\x21\x17\x47\x57\x3d\xd8\x9f\xe7\x8b\x52\x50\xbc\x83\xa3\xa6\x23\x5d\x9a\xec\xa0\xae\x5a\x67\xda\x8b\x3b\x2e\x0c\xa6\xc6\xa1\x0e\x9d\x7f\x6f\x60\x2a\x6e\x10\x9c\xa1\xe2\x13\x95\x1a\x84\x04\x33\x83\xdb\xd0\xa0\xab\x45\x19\x0e\x75\x4a\x61\xfd\xc2\xf5\x94\xf3\x77\x2f\xdf\x8d\xc2\xd7\x48\x6d\xb9\xae\xab\xdc\x89\xd4\x42\xc5\xd3\x87\x26\x3f\x24\x42\xaa\xa0\x24\x6f\x62\x69\x5b\x9f\x8c\x4c\x2a\x5f\x59\x4c\x16\xaf\x2b\x6c\x6d\xf1\xab\xee\x8a\xac\x36\x76\xbe\x33\xb2\xe8\x68\xff\xc5\x1b\x19\x5b\xb3\xa8\xd7\x9c\x78\x2c\xb3\xf8\xb6\x63\x83\x1b\x59\x6c\xa1\x99\xb8\xcc\x4c\xea\x88\xc1\x14\x4b\xef\x86\xe6\x86\xa0\x13\x6f\x87\xb7\xc6\x5e\x4b\x9d\x0f\xc8\xc8\x06\x41\xf3\x6e\xc8\x21\x66\xf8\x15\xff\xf9\x2c\x8e\x38\x4e\x6d\xcf\x56\xb8\x18\xf6\x07\xf0\xc6\xe1\x73\xf8\xc9\xac\xd5\xf9\xe5\x43\x22\xc1\xa3\xb3\xba\xf8\x5b\x58\x4d\xee\x12\x0e\xa4\xe2\x8d\xb1\x0e\xc2\x15\x22\x0b\x10\x28\xf4\xec\x77\x37\x63\x12\x20\xd7\xf8\xe9\x6c\x10\xaf\x74\x0e\x84\xce\x06\x4d\x7e\x9d\xce\x3e\x59\x62\x95\xdc\xd2\x81\x7f\x3c\x79\xf9\xc7\x18\x77\x25\x1f\xe4\xad\xa1\x8b\x32\x02\x6f\xab\x3a\xbb\x73\xde\x58\x91\xe3\xfc\xbb\x6a\xdc\x14\x1f\x2d\xc3\xb1\xae\x84\x0f\x1f\xf9\x55\x7b\x89\x53\xa8\x72\x2a\x8e\xea\xb5\xbb\xab\x9c\xbb\xab\x9c\xbb\xab\x9c\xbb\xab\x9c\x1b\x85\xbd\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xb9\xbb\xca\xf9\x79\xac\xee\xae\x72\xee\xae\x72\xee\xae\x72\x36\xbf\xdd\x55\xce\x2d\x99\xdb\x5d\xe5\xfc\xb3\x5f\xe5\xfc\xff\xbe\x9c\xb9\x3b\x1c\xfb\xdf\x38\x1c\xdb\x1d\x77\xed\x8e\xbb\x76\xc7\x5d\xbb\xe3\xae\x4f\xb0\xf8\xdd\x71\xd7\xee\xb8\x6b\x77\xdc\xb5\x3b\xee\xfa\x93\x1e\x77\x4d\x84\x72\x5b\x9f\x77\xfd\x27\x00\x00\xff\xff\x65\x94\xba\x94\x7c\x46\x00\x00") +var _operatorsCoreosCom_operatorgroupsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x5a\xe9\x6f\x1b\x37\x16\xff\xee\xbf\xe2\x41\x5d\x20\x76\x56\x1a\xc5\xee\x22\xdb\x0a\x08\x02\x23\x69\x0a\x6f\x73\x18\xb1\xdb\x0f\x6b\x7b\xb7\xd4\xcc\xd3\x88\x35\x87\x9c\x92\x1c\xdb\x6a\x90\xff\x7d\xf1\x1e\x39\x87\x4e\xcb\x49\xda\xed\x2e\xa4\x2f\xf6\x0c\x8f\x79\xe7\xef\x1d\xa4\x28\xe5\x4f\x68\x9d\x34\x7a\x04\xa2\x94\x78\xe7\x51\xd3\x93\x4b\xae\xbf\x71\x89\x34\xc3\x9b\xc3\xbd\x6b\xa9\xb3\x11\xbc\xa8\x9c\x37\xc5\x7b\x74\xa6\xb2\x29\xbe\xc4\x89\xd4\xd2\x4b\xa3\xf7\x0a\xf4\x22\x13\x5e\x8c\xf6\x00\x84\xd6\xc6\x0b\x7a\xed\xe8\x11\x20\x35\xda\x5b\xa3\x14\xda\x41\x8e\x3a\xb9\xae\xc6\x38\xae\xa4\xca\xd0\xf2\xe6\xf5\xa7\x6f\x9e\x24\x4f\x93\xa3\x3d\x80\xd4\x22\x2f\x3f\x97\x05\x3a\x2f\x8a\x72\x04\xba\x52\x6a\x0f\x40\x8b\x02\x47\x60\x4a\xb4\xc2\x1b\x9b\x5b\x53\x95\x2e\xa9\x1f\x5d\x92\x1a\x8b\x86\xfe\x14\x7b\xae\xc4\x94\xbe\xce\x73\xda\x25\x73\x73\xc2\x7e\x35\x91\xc2\x63\x6e\xac\xac\x9f\x01\x06\x60\x54\xc1\xff\x07\xe6\xdf\xc5\x3d\xbe\xa7\x2d\xf9\xbd\x92\xce\xff\xb0\x3c\xf6\x5a\x3a\xcf\xe3\xa5\xaa\xac\x50\x8b\x04\xf3\x90\x9b\x1a\xeb\xdf\xb6\x9f\xe7\xcf\xe5\x61\x48\xea\xbc\x52\xc2\x2e\xac\xdb\x03\x70\xa9\x29\x71\x04\xbc\xac\x14\x29\x66\x7b\x00\x51\x7c\x71\x9b\x41\x14\xd1\xcd\x61\xdc\xd5\xa5\x53\x2c\x44\xfd\x0d\xa0\x2d\xf5\xf1\xe9\xc9\x4f\x5f\x9f\x2d\x0c\x00\x64\xe8\x52\x2b\x4b\xcf\xca\x98\x63\x08\xa4\x03\x3f\x45\xa8\xb4\xf4\x60\x26\x50\x54\xca\x4b\x8f\x5a\xe8\x74\x06\x13\x63\xe1\xdd\xeb\x37\x50\x08\x2d\x72\xcc\x3a\xa2\x86\x13\x4f\xba\x77\xde\x0a\xa9\xc3\x0e\x52\x3b\x2f\x94\x62\xf5\xd2\x4e\xcd\x64\x90\x1a\xa4\x77\x41\x23\xc4\x1b\x78\x03\x02\x48\x8d\x72\x22\x31\x03\x87\xfc\x69\x2f\x6c\x8e\xbe\x9d\xe6\x92\x0e\x07\x7e\x46\xe2\x31\xe3\x5f\x30\xf5\x9d\xd7\x16\x7f\xad\xa4\xc5\xac\xcb\x2c\x89\xaa\x36\xda\xce\xeb\xd2\x12\x45\xbe\x63\x05\xe1\xd7\x71\x91\xb9\xf7\x0b\x52\x7b\x44\xa2\x0d\xf3\x20\x23\xef\xc0\xc0\x76\x54\x12\xb1\xc1\x62\x67\x4e\xa6\xd2\x81\xc5\xd2\xa2\x43\xed\x1b\x89\x08\x1d\x19\x48\xe0\x0c\x2d\x2d\x24\x5b\xa9\x54\x46\xa2\xbc\x41\xeb\xc1\x62\x6a\x72\x2d\x7f\x6b\x76\x73\x24\x2b\xfa\x8c\x12\x1e\x9d\x07\xa9\x3d\x5a\x2d\x14\xdc\x08\x55\x61\x1f\x84\xce\xa0\x10\x33\xb0\x48\xfb\x42\xa5\x3b\x3b\xf0\x14\x97\xc0\x1b\x63\x49\x3b\x13\x33\x82\xa9\xf7\xa5\x1b\x0d\x87\xb9\xf4\x35\x00\xa4\xa6\x28\x48\xf9\xb3\x21\xfb\xb2\x1c\x57\xa4\xb3\x61\x86\x37\xa8\x86\x4e\xe6\x03\x61\xd3\xa9\xf4\x98\xfa\xca\xe2\x50\x94\x72\xc0\xc4\x6a\x06\x81\xa4\xc8\xbe\xb2\x11\x32\xdc\xa3\x05\xf1\x05\x95\x39\x6f\xa5\xce\xe7\x86\xd8\xe7\x36\xca\x9a\x3c\x8f\x2c\x53\xc4\xe5\x81\x97\x56\xa4\xf4\x8a\xa4\xf2\xfe\xbb\xb3\x73\xa8\x09\x08\x62\x0f\x12\x6e\xa7\xba\x56\xd8\x24\x28\xa9\x27\x68\xc3\xcc\x89\x35\x05\xef\x82\x3a\x2b\x8d\xd4\x9e\x1f\x52\x25\x51\x7b\x70\xd5\xb8\x20\xa3\x25\x03\x43\xe7\x49\x0f\x09\xbc\x60\xfc\x83\x31\x42\x55\x66\xc2\x63\x96\xc0\x89\x86\x17\xa2\x40\xf5\x42\x38\xfc\xdd\x45\x4d\x12\x75\x03\x12\xdf\xf6\xc2\xee\xc2\xf7\xf2\x82\x25\x87\x02\xa8\xe1\x75\xad\x76\xe6\xf0\xe3\xac\xc4\xb4\xc6\x10\x5a\xc9\x98\x21\xf4\x02\xc8\xd4\x2a\x4a\xb6\x25\x62\xbd\xbb\x32\x89\xa8\x30\xf5\xc6\x2e\x8f\x2c\x90\x7a\x16\x27\xc6\x15\x81\xcc\x39\xd2\x1e\xb9\xcd\xb8\xb3\x05\xa5\xf7\x51\xcb\x5a\x10\x3e\x9d\x7e\x77\x47\x36\xd9\x81\xf4\x7b\xa8\x5f\x5c\x14\x3c\x82\x22\x13\xa1\x89\x12\x63\x54\x8d\x28\x6a\x24\x2c\x82\xc9\x9f\x4f\x71\xee\x0d\x08\x8b\x70\xfc\xf6\x25\x66\xab\x98\x6b\x19\x14\xd6\x8a\xd9\x9a\x19\xd2\x63\xb1\x96\xf0\x05\xd2\x8f\x37\x90\x17\x1d\xbb\x1e\xf1\x53\xc1\xb1\xc4\x73\x24\x09\xa0\xd5\x07\x01\xd7\x38\x0b\xf8\x46\xb0\x19\x55\x16\x26\x5b\x64\x34\x64\x65\x5e\xe3\x8c\x27\x45\xb0\x5b\x4b\xdd\x3d\xfa\x0b\xbf\xd5\xd1\x64\xfe\x37\xa0\x4f\x6e\x1c\xaf\x89\x5d\x3b\xe9\x3e\x63\x09\xbf\x6b\x9c\x6d\x1a\x5e\x10\x38\xc9\x21\xba\x61\x90\x3c\xbd\x60\x69\xb1\x67\xd6\xc2\x16\x65\xa9\x24\x32\x9a\x6d\xdc\x7b\x2d\x9c\xcc\xff\x6a\x56\x1f\x40\x68\xa3\xca\x16\xa1\x83\xb2\x1f\xb9\xa0\x58\xb2\xf4\xa9\x2c\x63\x92\x10\x52\x83\x3a\x94\xfd\x24\x94\xec\xa4\x21\x6c\xd5\x27\xba\x0f\x6f\x8d\xa7\x3f\xdf\xdd\x49\x82\x6a\xb2\x87\x97\x06\xdd\x5b\xe3\xf9\xcd\x17\x61\x35\x90\xf0\x00\x46\xc3\x02\x36\x76\x1d\xfc\x8a\x38\xe9\xc6\x33\x4a\xa3\x26\xac\x9f\x46\x28\xd2\x51\x44\x31\xb6\xe6\x88\x33\x8c\xb0\x51\xd8\xa2\xa8\x1c\x07\x20\x6d\xf4\x00\x8b\xd2\xcf\x56\xee\x11\x05\x61\xec\x9c\x1c\x36\x6c\x17\xb7\x3a\xa7\xb8\x18\x46\x42\x06\xa3\x28\x15\x85\xac\x62\xa2\x39\x1a\x53\x2e\x2d\x53\x28\xd0\xe6\x08\x25\x21\xd4\x36\xe2\xdd\x84\x2b\xe1\x77\x0f\xba\x6c\xa9\x2b\x86\xcc\xd7\xe4\x00\x0f\x80\xd8\x30\x3f\xc0\x52\x21\x4a\x52\xd3\x07\x42\x1f\x96\xd4\x47\x28\x85\xa4\x8c\xf7\x98\xb3\x77\x85\x73\x63\x52\xb3\x4c\xbb\xdb\xd0\x0e\xd2\x01\x41\xc9\x8d\x50\x84\x77\x64\xc9\x1a\x50\x05\xf4\xa3\x24\x7b\x01\xd8\xfb\x70\x3b\x35\x2e\x80\xd9\x44\xa2\xe2\xdc\xa7\x77\x8d\xb3\x5e\x7f\x49\xb5\xbd\x13\xdd\x0b\xb8\xb8\xa4\xcc\x06\x44\x8d\x56\x33\xe8\xf1\x58\xef\xd3\x63\xc1\x46\xb0\x14\x59\xc6\xe5\xa1\x50\xa7\x5b\xa0\xd9\x46\xbd\x39\xb4\x37\x32\xc5\xe3\x34\x35\x95\xe6\xc2\x69\x8b\xb8\xbe\xb8\xa4\x06\x3f\x91\x15\x52\xcf\xd5\x16\x3c\x13\x44\x98\x0a\xb7\x53\x99\x4e\xe1\x56\x2a\xc5\x69\x9c\xc3\x8c\xd4\x93\x61\xa9\xcc\xac\x91\xf3\xbe\x3b\x08\x9a\xa5\x7c\xb2\x96\x3d\x57\x6a\xeb\x53\x83\x75\xcc\x51\xfa\x9f\x9e\x5a\x73\x23\x33\xcc\x8e\x4f\x4f\x56\x4a\x69\x9e\x39\x5e\x02\x1e\x95\x72\x5c\x7e\x51\xce\xe9\x4d\xcc\x39\x57\xa6\x30\x65\x67\xff\x4e\x91\xbe\x96\xd8\xb1\x31\x0a\xc5\xf2\x78\x48\x85\x9a\x22\xf4\x7e\x5a\xcf\x17\x16\x44\xb8\xc3\xbb\x52\xc9\x54\xfa\x1a\xbf\xdb\xdc\x8a\xeb\x19\x5e\xc4\xc0\x25\x39\x1b\x70\xe8\xfb\x6d\xae\x26\x1d\xc8\x5c\x1b\xbb\xda\x3e\x37\xe3\xc9\x06\x14\xb9\x07\x3b\xee\x06\xd7\xd5\x18\xad\x46\x8f\x6e\x40\x39\xd6\x20\x2e\xc0\x85\xf4\xd8\x0b\x5f\x2d\x7d\x62\x43\x82\xcc\xf3\x9b\x14\x39\x3c\xad\x4a\x92\xdf\x3f\x3c\x47\x5e\x9f\xaf\x0c\x40\x09\xe7\x7f\x0c\x55\xca\x03\x32\xeb\xd4\xe8\xe0\xd7\xf7\xab\xfe\x45\x33\x75\x31\xc6\xad\xb2\xd0\x76\xe3\x2f\xaa\xd4\x39\x8a\x7a\x0d\x49\x2d\x14\x66\xe8\x85\x54\x41\xe2\x46\x23\x08\x82\x06\x5f\x53\x99\x56\xd6\x72\xb5\xe7\xc9\xb3\xea\xca\xfd\xf8\xf4\x04\x1a\x6d\xc0\x60\x30\x08\x71\xd1\x79\x5b\xa5\x6c\xaf\x54\x85\xeb\x0c\x33\xde\x35\x93\x96\x4b\x6f\x47\x9b\xb7\x72\x88\x99\x57\x80\xf3\x52\xf8\x29\x24\x41\xf9\x49\x47\x14\x00\xaf\x8c\x05\xbc\x13\x45\xa9\xb0\xcf\x62\x80\x57\xc6\x44\x9b\x09\x1f\xfc\xc0\x8c\x0e\x87\xf0\xbe\x4d\x98\x38\x28\x8c\x09\xdb\x42\xbe\xc4\xdd\x05\x98\x18\x43\x92\xee\xf2\x94\xd4\x8b\x7f\xd0\xe6\x56\xaf\x22\x81\xbf\x29\x2c\x8e\xe0\xb2\x77\x7c\x23\xa4\x12\x63\x85\x97\xbd\x3e\x5c\xf6\x4e\xad\xc9\x39\x44\xe9\xfc\x32\xc6\x9c\xcb\xde\x4b\xcc\xad\xc8\x30\xbb\xec\xd5\x5b\xff\x95\xb3\x80\x37\x94\x10\xfc\x80\xb3\x67\xbc\xe1\xdc\xd0\x59\xc8\x1a\x66\xcf\x42\xd2\x50\x8f\x91\x93\x9d\xcf\x4a\x7c\x46\x11\xb3\xfb\xf2\x8d\x28\xe7\x36\xea\x58\xda\xc5\x15\xd5\xb3\x37\x87\x49\xab\xea\x9f\x7f\x71\x46\x8f\x2e\x7b\x2d\x4f\x7d\x53\x90\xc9\x94\x7e\x76\xd9\x83\x39\x0a\x46\x97\x3d\xa6\xa1\x7e\x5f\x13\x3d\xba\xec\xd1\xd7\xe8\xb5\x35\xde\x8c\xab\xc9\xe8\xb2\x37\x9e\x79\x74\xfd\xc3\xbe\xc5\xb2\x4f\x00\xf6\xac\xfd\xc2\x65\xef\x67\xb8\xd4\x35\xd1\xc6\x4f\xd1\x06\x4d\x3b\xf8\xd8\xdb\x80\x3e\x1b\x42\xea\x7d\xb5\x47\xf0\xe8\x73\x2b\xb4\x93\x75\x07\x75\xed\xd4\x02\x9d\x13\xf9\xfa\x71\x8b\xc2\xad\x0c\x0f\x61\x38\x58\xc9\xda\x61\xe2\x65\xe5\xe0\xfd\x85\xcd\x32\x0f\x5b\x16\x94\xcb\x0b\xdb\x72\xc7\x79\xf0\xf4\x82\x3d\xba\xb1\x0b\xdf\xcc\x26\x47\xb5\xa6\x60\xff\x8f\x00\xcc\x29\x19\xeb\x2d\x26\xbd\xb1\x11\x37\x46\xb8\x9d\xa2\x8e\x2d\xd1\x0c\xad\x9a\x51\xe6\xdb\xee\x9a\x4e\x85\xce\x31\x4b\x20\xa4\xdd\x82\xf1\x80\x02\xf4\x35\x39\x18\xa7\x6b\x1a\x2a\x57\x37\xa8\x98\xae\x66\x47\x02\x96\x00\x08\x71\x1b\x46\xce\x34\xc5\xd2\x93\xd7\xdd\x57\xbd\xde\x53\xa3\x4c\x8c\x2d\x84\x1f\x01\x61\xfe\xc0\xaf\x37\x8f\x68\x1c\x5b\x0a\x3e\xce\x0e\xd9\xf1\xb4\x2a\x84\x26\xeb\xc9\x88\xde\x76\x4c\x67\x32\x15\xdc\x95\xab\xf1\x56\x8c\x4d\x15\x10\xb0\xd5\x43\x14\x75\x21\x66\x24\x67\x4a\x13\xc8\x47\x23\x5b\x9f\xc9\x7c\x21\xee\x5e\xa3\xce\xfd\x74\x04\x5f\x1f\xfd\xfd\xe9\x37\x6b\x26\x06\xd0\xc4\xec\x7b\xd4\x14\x9f\x56\x34\x7d\xd7\x88\x61\x79\x61\xb7\x80\x25\x3e\x93\xba\xd3\x96\xe4\xed\x9c\xa6\x02\x6f\x2d\xe8\x56\x70\xc2\x03\x63\x41\xc9\x67\x55\x92\x5c\x28\x0a\x70\xff\x5c\xa7\xd8\x07\x39\x59\xbd\x99\x6c\xc0\x5d\xcd\xe0\xf0\xa8\x0f\xe3\x28\xe2\x65\x58\xbf\xb8\xbb\x4a\x56\x90\x2c\x1d\x7c\xdb\x5f\xa0\x87\x72\xdc\x8a\x23\x22\xa7\x97\xb7\xd2\x4f\xc1\x62\x08\x93\xb1\xf9\xbc\x22\x4c\x62\x43\xef\x7d\x8a\xa3\x60\x99\xe3\xfa\x6e\x48\x6d\xb6\x52\xfb\xa7\x7f\x5b\xaf\x5f\xa9\x65\x51\x15\x23\x78\xb2\x66\x4a\x80\xb4\x2d\xb5\x19\x26\xb7\x59\x82\x20\xe8\xca\xad\x28\x0a\x4e\xbd\x65\x86\xda\x53\xfd\x60\xbb\xa6\xed\xb9\x8e\xe2\x85\x13\x6e\x45\x75\xa4\xf8\xc8\x45\x1c\xea\x18\xfb\xa9\x35\x59\x95\xa2\xe5\xe8\x1c\x2b\x92\xb4\x0b\x50\xb3\x12\x83\x37\x84\xf3\x04\xca\x9a\x31\xf5\x4d\xe7\x3e\x34\xf7\x51\x68\xa9\x73\x17\x3f\x29\x5d\x00\x90\x10\x8d\x6f\xa7\xc8\xa1\x67\xae\x12\x64\xaa\x9c\xcc\xd0\x62\x06\x02\xf2\x4a\x58\xa1\x3d\x62\x46\xf0\x13\xaa\xc1\xd0\x4d\x6f\x21\x4f\xb4\x3d\xec\xda\x1b\x83\xab\x06\xb0\x22\x12\x63\xdf\x3b\xf4\x09\xbe\x98\xab\x1e\x3e\x39\xda\xa8\xf2\x66\xde\xfa\x5e\x9a\xf0\x1e\xad\x1e\xc1\xbf\x2e\x8e\x07\xff\x14\x83\xdf\xae\xf6\xe3\x3f\x4f\x06\xdf\xfe\xbb\x3f\xba\x7a\xdc\x79\xbc\x3a\x78\xfe\x97\x35\x3b\xad\x4e\xeb\xd7\x98\x4f\x0c\x22\x75\x12\x59\x6b\xb4\xcf\x11\xc6\x4c\xe0\xdc\x56\xd8\x87\x57\x42\x39\xec\xc3\x8f\x9a\x43\xc3\x67\x0a\x0d\x75\x55\x6c\x6e\x4b\xf6\xe8\xab\xab\x93\x8f\x66\x0a\x93\xb4\x79\x4e\x24\x77\x53\x67\x60\x3b\x21\x71\xfa\x66\x26\x5d\xa4\xe9\x9c\x95\x00\x23\x1e\xa5\xac\x49\x4c\x7f\x93\xd4\x14\xc3\xce\x59\x0a\xe5\xdd\x6f\x84\x9e\x41\x0b\x6b\x21\x59\x5d\xb4\x74\xe7\x09\x9b\x44\x6a\x8d\x73\xcd\x49\x83\x03\x25\xaf\x11\x9a\x8c\x36\x80\xe5\x18\x53\xc1\x89\xba\x1d\x4b\x6f\x85\x9d\x75\xea\x12\x48\x85\x8e\x3d\x81\x49\xa5\x60\xdf\x21\x42\xa2\x4d\x86\xcb\xe8\x7a\x10\x30\x54\x8c\xa5\x92\x7e\x16\x1a\x08\xa9\xd1\x13\x25\x63\x7d\x50\x94\xc6\x7a\xa1\x7d\xdd\x7c\xc9\xf1\x8e\x4a\x5d\xee\xfb\x84\x22\x79\x3f\xd3\xee\xf0\xf0\xe8\xeb\xb3\x6a\x9c\x99\x42\x48\xfd\xaa\xf0\xc3\x83\xe7\xfb\xbf\x56\x42\x71\xe7\x82\x6a\xea\x57\x85\x3f\xf8\x72\x61\xf1\xf0\xe9\x16\x5e\xb4\x7f\x11\x7c\xe5\x6a\xff\x62\x10\xff\x7b\x5c\xbf\x3a\x78\xbe\x7f\x99\x6c\x1c\x3f\x78\x4c\x3c\x74\x3c\xf0\xea\x62\xd0\xba\x5f\x72\xf5\xf8\xe0\x79\x67\xec\x60\xd9\x19\x3b\x55\xeb\xbd\x05\xe8\xeb\x76\x6e\xc8\x4e\x7c\x7d\xa9\xa0\xf6\xcc\xf9\xd4\x70\xb1\x24\x8d\x5e\x4c\xf1\x38\x6e\xf3\xe0\xee\xce\x36\x49\x97\xde\xbe\x9b\x32\xdf\x47\x09\x8d\xfb\xd5\x47\xe3\x4d\x04\x9a\x63\xea\xcf\xd8\x2f\x81\xa5\x0e\xdf\x7b\x9c\x3c\xb0\xc1\xf7\x1e\x27\x60\x71\x82\x16\x75\x8a\xb5\x60\xe6\xfb\x7a\xf1\xd8\xb7\x69\xfc\xfd\x0e\x67\x78\xeb\x2f\x0a\xac\x64\x81\x92\xfd\x78\x39\xa0\xb6\xc7\xc8\xc3\xda\x03\x89\x7b\x5d\x9a\xe3\xf1\xa9\xf0\xd3\xad\x28\x78\x74\x12\xc5\xc6\xdd\x7b\x3e\x4f\x29\x25\xa6\x38\x77\x17\x81\xf3\x38\x14\x59\x7c\x49\x89\x8f\xc5\x38\xd6\x0f\x19\x47\x3c\xb3\x68\xef\x2a\x50\xd2\x04\x82\x80\x58\x66\xf0\x8f\xb3\x77\x6f\x87\xdf\x9b\x98\x2b\x50\x35\xe3\x82\x6f\x71\xb7\xb9\x0f\xae\x4a\xa7\x20\x1c\x91\x46\xf5\xed\x19\xb7\x25\x0a\xa1\xe5\x04\x9d\x4f\xe2\x6e\x68\xdd\xc5\xd1\x55\x32\xdf\x0e\x91\xf1\x60\xa3\x3e\xd1\x8f\x06\xc0\xbe\x41\xcc\x34\x6b\x39\x69\x65\x92\x4a\x93\x45\xa2\x6f\x99\x58\x2f\xae\x11\x4c\x24\xb6\x42\x0e\x0a\x23\xe8\x91\x99\x74\x3e\xfd\x81\x1c\xeb\x63\x0f\xf6\x6f\xa7\x68\x11\x7a\xf4\xd8\x0b\x1f\x6c\x2e\x60\xd0\xbb\x4e\xc4\x8f\x1f\x0e\xf9\xbd\x95\x79\xce\xe9\x16\xdf\x26\xb8\x41\xed\x0f\x38\xbe\x4d\x40\x9b\xce\x64\x1d\xfb\xd4\x6d\x77\x7a\x91\x90\x8b\xa3\xab\x1e\xec\xcf\xf3\x45\x29\x28\xde\xc1\x51\xd3\x91\x2e\x4d\x76\x50\x57\xad\x33\xed\xc5\x1d\x17\x06\x53\xe3\x50\x87\xce\xbf\x37\x30\x15\x37\x08\xce\x50\xf1\x89\x4a\x0d\x42\x82\x99\xc1\x6d\x68\xd0\xd5\xa2\x0c\x87\x3a\xa5\xb0\x7e\xe1\x7a\xca\xf9\xbb\x97\xef\x46\xe1\x6b\xa4\xb6\x5c\xd7\x55\xee\x44\x6a\xa1\xe2\xe9\x43\x93\x1f\x12\x21\x55\x50\x92\x37\xb1\xb4\xad\x4f\x46\x26\x95\xaf\x2c\x26\x8b\xd7\x15\xb6\xb6\xf8\x55\x77\x45\x56\x1b\x3b\xdf\x19\x59\x74\xb4\xff\xe2\x8d\x8c\xad\x59\xd4\x6b\x4e\x3c\x96\x59\x7c\xdb\xb1\xc1\x8d\x2c\xb6\xd0\x4c\x5c\x66\x26\x75\xc4\x60\x8a\xa5\x77\x43\x73\x43\xd0\x89\xb7\xc3\x5b\x63\xaf\xa5\xce\x07\x64\x64\x83\xa0\x79\x37\xe4\x10\x33\xfc\x8a\xff\x7c\x16\x47\x1c\xa7\xb6\x67\x2b\x5c\x0c\xfb\x03\x78\xe3\xf0\x39\xfc\x64\xd6\xea\xfc\xf2\x21\x91\xe0\xd1\x59\x5d\xfc\x2d\xac\x26\x77\x09\x07\x52\xf1\xc6\x58\x07\xe1\x0a\x91\x05\x08\x14\x7a\xf6\xbb\x9b\x31\x09\x90\x6b\xfc\x74\x36\x88\x57\x3a\x07\x42\x67\x83\x26\xbf\x4e\x67\x9f\x2c\xb1\x4a\x6e\xe9\xc0\x3f\x9e\xbc\xfc\x63\x8c\xbb\x92\x0f\xf2\xd6\xd0\x45\x19\x81\xb7\x55\x9d\xdd\x39\x6f\xac\xc8\x71\xfe\x5d\x35\x6e\x8a\x8f\x96\xe1\x58\x57\xc2\x87\x8f\xfc\xaa\xbd\xc4\x29\x54\x39\x15\x47\xf5\xda\xdd\x55\xce\xdd\x55\xce\xdd\x55\xce\xdd\x55\xce\x8d\xc2\xde\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xdc\x5d\xe5\xfc\x3c\x56\x77\x57\x39\x77\x57\x39\x77\x57\x39\x9b\xdf\xee\x2a\xe7\x96\xcc\xed\xae\x72\xfe\xd9\xaf\x72\xfe\x7f\x5f\xce\xdc\x1d\x8e\xfd\x6f\x1c\x8e\xed\x8e\xbb\x76\xc7\x5d\xbb\xe3\xae\xdd\x71\xd7\x27\x58\xfc\xee\xb8\x6b\x77\xdc\xb5\x3b\xee\xda\x1d\x77\xfd\x49\x8f\xbb\x26\x42\xb9\xad\xcf\xbb\xfe\x13\x00\x00\xff\xff\xf2\x1a\x66\xa5\x7c\x46\x00\x00") func operatorsCoreosCom_operatorgroupsYamlBytes() ([]byte, error) { return bindataRead( @@ -184,7 +184,7 @@ func operatorsCoreosCom_operatorgroupsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x8f\xe3\xb6\x11\x7f\xdf\x4f\x31\x70\x1e\x36\x01\xfc\x27\xb9\x02\x45\xe1\xb7\xc5\xee\xa5\xd8\x36\xdd\x3b\xdc\xee\xdd\x4b\x90\x87\xb1\x34\xb6\x58\x53\xa4\xc2\xa1\xec\x75\x0f\xf7\xdd\x8b\x21\x29\x5b\xb2\xbd\xb6\x7c\xdd\x4b\xc3\x17\x5b\x14\x39\x9c\xbf\xbf\x99\xa1\xb0\x52\x9f\xc8\xb1\xb2\x66\x0a\x58\x29\x7a\xf6\x64\xe4\x89\xc7\xcb\xbf\xf1\x58\xd9\xc9\xea\xa7\xab\xa5\x32\xf9\x14\x6e\x6b\xf6\xb6\xfc\x40\x6c\x6b\x97\xd1\x1d\xcd\x95\x51\x5e\x59\x73\x55\x92\xc7\x1c\x3d\x4e\xaf\x00\xd0\x18\xeb\x51\xa6\x59\x1e\x01\x32\x6b\xbc\xb3\x5a\x93\x1b\x2d\xc8\x8c\x97\xf5\x8c\x66\xb5\xd2\x39\xb9\x40\xbc\x39\x7a\xf5\xe3\xf8\xaf\xe3\x1f\xaf\x00\x32\x47\x61\xfb\x93\x2a\x89\x3d\x96\xd5\x14\x4c\xad\xf5\x15\x80\xc1\x92\xa6\x60\x2b\x72\xe8\xad\xe3\xf1\xee\x5f\x66\x1d\x59\xf9\x29\xaf\xb8\xa2\x4c\x0e\x5e\x38\x5b\x57\xed\xd5\xad\x35\x91\x54\xc3\x1f\x7a\x5a\x58\xa7\x9a\x67\x80\x11\x58\x5d\x86\xff\x51\xee\x77\x89\x46\x98\xd2\x8a\xfd\x3f\x3b\xd3\xbf\x28\xf6\xe1\x55\xa5\x6b\x87\xba\x75\x66\x98\x65\x65\x16\xb5\x46\xb7\x9b\xbf\x02\xe0\xcc\x56\x34\x85\x5b\x5d\xb3\x27\x99\x48\x7a\x48\x3c\x8c\x92\xac\xab\x9f\x12\x4b\x9c\x15\x54\x62\xc3\x20\x08\x29\x73\xf3\xfe\xfe\xd3\x5f\x1e\xf7\x5e\x00\xe4\xc4\x99\x53\x95\x0f\x5a\x6d\x78\x04\x47\x95\x23\x26\xe3\x19\x10\xb2\x78\xec\x96\xa1\x71\x6b\xbb\xdf\x08\x63\x76\xf6\x6f\xca\x7c\x6b\xba\x72\xb2\xd8\xb7\xb4\x14\x47\xcb\x7b\x3a\xf3\x7b\x7c\x5c\x0b\xb3\x71\x1d\xe4\xe2\x38\xc4\xe0\x0b\x6a\xc4\xa6\x3c\x49\x08\x76\x0e\xbe\x50\xbc\xe3\x37\xf8\x82\x4c\xa3\x49\x5c\x8d\xe1\x91\x9c\x6c\x04\x2e\x6c\xad\x73\xf1\xb0\x15\x39\x0f\x8e\x32\xbb\x30\xea\x3f\x5b\x6a\x0c\xde\x86\x63\x34\x7a\x62\x0f\xca\x78\x72\x06\x35\xac\x50\xd7\x34\x04\x34\x39\x94\xb8\x01\x47\x42\x17\x6a\xd3\xa2\x10\x96\xf0\x18\xfe\x65\x1d\x81\x32\x73\x3b\x85\xc2\xfb\x8a\xa7\x93\xc9\x42\xf9\x26\x36\x32\x5b\x96\xb5\x51\x7e\x33\x09\x6e\xae\x66\xb5\xd8\x7d\x92\xd3\x8a\xf4\x84\xd5\x62\x84\x2e\x2b\x94\xa7\xcc\xd7\x8e\x26\x58\xa9\x51\x60\xd6\x84\xf8\x18\x97\xf9\x77\x2e\x45\x13\x5f\xef\xa9\x2f\xda\x81\xbd\x53\x66\xd1\x79\x15\x7c\xf2\xa4\xae\xc5\x3d\x41\x89\xa1\xe3\xf6\x28\xcb\x4e\xa5\x32\x25\x5a\xf9\xf0\xf6\xf1\x09\x1a\x06\xa2\xda\xa3\x86\x5b\xde\xb2\x53\xb6\x28\x4a\x99\x39\xb9\xb8\x72\xee\x6c\x19\xa8\x90\xc9\x2b\xab\x8c\x0f\x0f\x99\x56\x64\x3c\x70\x3d\x2b\x95\x17\x2b\xfe\x5e\x13\x7b\xb1\xc3\x18\x6e\x03\x34\xc0\x8c\xa0\xae\x72\xf4\x94\x8f\xe1\xde\xc0\x2d\x96\xa4\x6f\x91\xe9\x9b\xab\x5a\x34\xca\x23\x51\x5f\x7f\x65\xb7\x91\xed\x70\xc3\x41\x94\x00\x34\xf0\xf3\xa2\x75\x9a\x88\x7c\xac\x28\xeb\x84\x42\x4e\xac\x9c\xb8\xae\x47\x4f\xe2\xf0\x1d\xd8\xe9\x73\xb4\x47\x5f\x73\xbf\xc3\xc3\xd2\xce\xf1\x76\xc6\x62\xe8\xd6\xf9\x68\x76\xf0\x21\x91\x22\x06\xcd\x6c\x59\x59\x23\x8e\xd1\x97\xab\x97\xa1\x03\x42\x72\x68\xe8\x1d\xbe\xdb\xe3\xfd\x76\xbb\x34\xcd\xcf\x88\xb7\xde\x2b\x32\xa0\x8f\xe4\x98\xa2\x40\x47\xc0\xad\x07\xb7\x32\xc4\x6d\xc5\x16\xc7\x78\x12\x70\xd6\x38\x23\xfd\x48\x9a\xb2\x43\xf3\x9c\x93\x58\x46\x67\xff\xf1\x25\x7b\xc2\xff\xd2\xde\x11\x63\x3b\x10\x81\xdf\x6b\x72\x1b\xb0\x2b\x72\x12\xee\xe4\xc5\x70\x3b\xa5\xd4\x4c\xb9\x60\x20\x87\x9d\x1d\xb5\x5c\x9f\x30\x66\x4f\x35\xf5\x11\x55\x46\x89\x3e\x2b\xde\x3e\x0b\xa4\xb4\x72\x5c\x0f\xa9\xf7\x37\x26\xc1\x15\x07\x31\xa3\x02\xb8\x51\x4a\x32\x5a\x19\x51\xeb\xa9\xa0\xce\x0c\xa0\x23\xb8\x79\xb8\xa3\xfc\x98\x3f\x74\x05\x46\xe7\x70\x73\x62\x95\xf2\x54\x9e\x14\x62\x4f\x8c\x9b\x13\xac\x26\x9c\x6e\xde\x24\x2f\x36\x1e\x95\xe1\x94\x83\x86\x80\xb0\xa4\x4d\x4c\x57\x92\x05\x9b\xa0\x0c\x8b\x1d\x85\xe4\x16\x6c\xbb\xa4\x4d\x58\x94\x72\xd7\x49\x0e\x7b\xd8\x36\x8e\xd3\xc1\xb0\x1b\x23\x39\xfe\xec\x1a\x7b\x1c\xd4\xba\xa3\x8f\x53\xc5\xb1\xa4\xcd\xb9\x25\x7b\xc6\x10\x1d\x29\x4e\x55\x81\x58\x45\x26\x82\x26\x65\x6a\x6b\x08\xac\x2a\xad\x28\x24\xae\xb3\xf4\x5f\xcc\x1e\x87\xa3\x11\xff\x42\xa6\xed\xd1\x32\x6e\x49\x9b\x6b\x8e\x0e\x20\xd1\x51\xa8\x4a\x62\x7d\x0b\x03\x4d\x05\xf3\x09\xb5\xca\x77\x45\x69\x88\x84\x7b\x33\x84\x07\xeb\xe5\xe7\xed\xb3\x92\x0c\x2d\x7e\x73\x67\x89\x1f\xac\x0f\x33\xaf\x2a\x76\x64\xe5\x42\xa1\xe3\xa6\x10\x20\x26\xc6\xa4\x48\xd5\x2e\x69\x78\x0c\xf7\xf3\x0e\xaa\xc9\xea\x7b\x03\xd6\x35\xd2\x85\x22\x33\x12\x8a\x24\xca\x9a\x43\x0d\x62\xac\x19\x51\x59\xf9\xcd\x51\x1a\x49\x29\xd6\x75\x74\x72\x82\x5c\x22\xf5\x24\xa5\x51\x7c\x13\x8b\x58\x8d\x19\xe5\x90\xd7\x81\xe9\x50\x90\x49\xbb\xa1\x32\x28\xc9\x2d\x08\x2a\x41\xb8\xbe\xaa\x3e\x87\x4b\x71\xf4\x40\xa7\x36\xd1\x33\xf6\x0b\x10\x1c\xb2\xcf\x85\xb0\x1d\xf7\x44\x78\x2b\xb1\x12\xd3\x7d\x16\x14\x0b\xda\xfb\x02\x15\x2a\xc7\x63\xb8\x09\xed\x91\xa6\xce\x3b\x65\x82\x9e\xdb\x64\x84\x82\x62\x10\x28\x5a\xa1\x16\xdc\x14\x4f\x37\x40\x3a\xa2\xa8\x9d\x1f\x24\x8b\x21\xac\x0b\xa9\x05\x24\xbe\xe7\x8a\x74\x28\x89\x07\x4b\xda\x0c\x86\x07\xe6\x1e\xdc\x9b\x41\xc4\xd7\x03\x03\x6f\xc1\xd8\x1a\xbd\x81\x41\x78\x37\xf8\xdf\xf2\xcb\x59\xd0\xc5\x3c\x0f\x8d\x35\xea\xf7\x3d\x91\xf0\xac\x2d\x1d\xcd\x5f\x24\xd1\x31\xde\x07\x9a\x47\x61\x5a\xe5\xc4\x9c\x1c\x99\x50\x64\xd9\x17\x6b\x88\x5d\xd5\x31\x4c\x28\x4a\x39\xac\x95\x2f\xba\xb5\xcb\x4b\xda\x39\xef\xe1\x67\xfc\xba\x2b\x84\xca\x8a\x0f\x0d\xdb\xd1\x07\xb7\x52\x44\x8c\x6c\xb8\x1d\x02\x19\xa7\xb2\xa2\x61\x56\x8a\xdc\x58\x48\x8b\xe5\xa3\x19\x4e\x64\xd2\x5e\x06\xed\x97\xce\x5e\xee\xa4\x4f\x08\x7a\xf3\xfe\xbe\xe9\xa1\x63\xeb\x4c\x8d\xa0\x67\x00\xbc\x27\x78\xef\x74\x70\x01\x53\xb7\xdb\x4d\xed\x7c\xd5\xea\xc3\xb7\x2d\x46\x68\x19\x1b\x0f\xea\xc3\xf0\x79\x08\xec\x05\x7f\xc7\xd9\xdd\x71\xdb\x66\x16\x57\xa8\x34\xce\x74\xd3\x22\xc5\x64\x9b\x1a\xa4\x2d\xf3\xd7\xd1\x6d\xe8\x1c\x96\xf7\x2e\xbb\xfa\x17\x5e\x52\x56\x45\x97\xed\xb1\x50\xce\x3f\xb3\xac\x7f\xf5\x25\x9d\x0c\xfb\x27\x87\x86\x55\x73\x65\xd7\x27\xf3\xec\xb5\x36\xec\xc1\xab\x92\x92\x37\x34\xc6\xf0\x5b\xb2\x94\xc7\xdb\x06\x6b\xa8\x89\xcd\x80\xfe\xd6\x17\xf4\x22\xa0\xb4\xc7\x05\x95\x8a\x8c\xb9\x75\x25\xfa\x29\xe4\xe8\x69\x24\x9c\xf5\x52\xc3\xc7\x70\xa9\xf1\xaa\x2a\x58\x23\x8b\x35\x66\x94\xff\x19\x84\x2c\x89\x19\x17\x97\x4b\x77\x03\x45\x5d\xa2\x44\x17\xe6\x21\x8e\x12\x21\x50\x26\x57\x19\x86\xeb\xa8\x9c\x3c\x2a\xcd\x80\x33\x5b\xc7\xe8\xdb\x99\xff\xd5\x2d\xec\x08\xf9\x1c\xca\x1e\x91\x23\xa6\x7c\xd9\x2a\xca\xeb\x9a\xea\x9a\x83\x0f\x7c\x4b\xae\x8f\x5f\xef\x9c\xe5\x3a\x5d\xf5\x6c\xc1\x36\x31\x3c\x0c\xd1\x64\xe7\xf0\xe4\x6a\x1a\xc2\xcf\xa8\x99\x86\xf0\xd1\x2c\x8d\x5d\xbf\x3e\xef\x61\xf1\xc5\xfa\xde\x54\x81\xc3\x2d\xcf\xaf\xc8\x56\x28\x08\xdf\xa3\x2f\x2e\x48\x6b\xd7\xf7\xa9\x16\x0a\xb5\x7c\xa8\x22\x2a\x45\x19\x75\x2e\xa7\x41\x19\xf6\x84\x79\x9a\x24\xe3\x95\xa3\xf4\x6e\x18\x6f\x4e\x53\x07\xb3\xbb\xbc\x96\xfa\x12\x50\xca\x4e\x95\xc3\x3f\x1e\xdf\x3d\x4c\xfe\x6e\x53\xc9\x8a\x59\x46\x9c\x52\x8b\xd4\x99\x43\xe0\x3a\x2b\x00\xb9\xb9\x2e\x7c\x0c\x49\xa7\x44\xa3\xe6\xc4\x7e\x9c\xa8\x91\xe3\x5f\xdf\xfc\x36\x86\x9f\xad\x03\x7a\xc6\xb2\xd2\x34\x04\x95\xda\x9c\xe6\x8a\xb7\x55\x1e\x05\x61\xb6\x7b\x43\x25\x14\x58\xaa\x6c\x9e\x98\x5e\x07\x66\x3d\x2e\x09\x6c\x62\xb6\x26\xd0\x6a\x49\x53\x18\x70\x45\x59\xeb\xe8\xcf\x06\x4b\xfa\x32\x80\xef\xd7\x05\x39\x82\x81\x3c\x0e\xe2\x81\xdb\x12\x52\xe6\x5a\x4e\x99\x0e\x8e\x7d\xb8\x53\x8b\x05\x39\x8a\xc5\x38\xad\xc8\xf8\x1f\xa4\x13\x53\x73\x30\xb6\xb5\x38\x90\x10\x7d\x56\x94\xa9\xb9\xa2\xfc\x80\x91\x5f\xdf\xfc\x36\x80\xef\xbb\x72\x09\xea\xd0\x33\xbc\x89\x5d\x86\x62\x91\xf1\x87\xd4\xb8\xf1\xc6\x78\x7c\x16\x9a\x99\xb4\x0e\x26\xd6\xfc\xde\x42\x81\x2b\x02\xb6\x25\xc1\x9a\xb4\x1e\xc5\x7b\xd3\x1c\xd6\xb1\x25\x6d\x54\x19\x5b\xbc\x0a\x9d\xdf\xfb\x5e\xf1\xf4\xee\xee\xdd\x34\x9e\x26\x66\x5b\x18\x39\xc2\x58\x0f\x73\x65\x50\xa7\xbe\x43\xf1\xae\x4d\xe1\x3a\x1a\xc9\x5b\xc8\x0a\x34\x01\x2b\x83\x36\xe6\xb5\xaf\x1d\x8d\xf7\xef\xaf\xbf\x2a\x06\x8e\x7d\x48\x38\xe5\xfe\xe1\xb3\xc2\x7e\x91\xf9\x7f\xbc\xb4\xff\x2a\xa1\xc3\x77\xb5\x0b\x84\x7e\x68\xf9\xe9\x49\xa1\x97\xf5\x8c\x9c\x21\x4f\x41\xee\xdc\x66\x2c\x22\x67\x54\x79\x9e\xd8\x15\xb9\x95\xa2\xf5\x64\x6d\xdd\x52\x99\xc5\x48\x1c\x71\x14\xbd\x83\x27\xe1\x5b\xe4\xe4\xbb\xf0\xf3\x6a\x32\x72\x85\xd9\xc5\x82\x86\x4d\x7f\x84\xb4\x72\x0e\x4f\x5e\x45\xd8\xa6\x91\xbb\xbc\x77\xba\x7e\x8c\xc0\x91\xed\xd3\x90\xb0\x5b\x17\x2a\x2b\x9a\x4f\x91\x2d\xa4\x2c\x31\x8f\x50\x8a\x66\xf3\xcd\x9d\x5f\x54\x5a\x3b\x39\x7b\x33\x4a\x9f\xd1\x47\x68\x72\xf9\xcf\x8a\xbd\xcc\xbf\x8a\x0e\x6b\x75\x11\x10\x7c\xbc\xbf\xfb\x63\x42\xa2\x56\x5f\x11\xf5\xf1\x33\xd6\x14\xbc\xab\x9b\x9a\x96\xbd\x75\x52\xb9\x76\xe6\xea\xd9\xf6\xc6\x62\x27\x7c\x2a\xb2\xe0\xf3\x97\xab\xff\x06\x00\x00\xff\xff\x39\x29\x67\x42\x18\x21\x00\x00") +var _operatorsCoreosCom_operatorsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xcc\x59\x5f\x8f\xdb\xb8\x11\x7f\xdf\x4f\x31\xf0\x3d\xec\x1d\xe0\x3f\xbd\x14\x28\x0a\xbf\x2d\x76\x73\xc5\xb6\xd7\x4d\x90\xdd\xe4\xe5\x70\x0f\x63\x69\x6c\xb1\xa6\x48\x1d\x87\xb2\xd7\x0d\xf2\xdd\x8b\x21\x29\x5b\xb2\xbd\xb6\x9c\x6e\xd2\xf2\xc5\x16\x45\x0e\xe7\xef\x6f\x66\x28\xac\xd4\x27\x72\xac\xac\x99\x02\x56\x8a\x9e\x3d\x19\x79\xe2\xf1\xf2\xaf\x3c\x56\x76\xb2\xfa\xf9\x6a\xa9\x4c\x3e\x85\xdb\x9a\xbd\x2d\x3f\x10\xdb\xda\x65\x74\x47\x73\x65\x94\x57\xd6\x5c\x95\xe4\x31\x47\x8f\xd3\x2b\x00\x34\xc6\x7a\x94\x69\x96\x47\x80\xcc\x1a\xef\xac\xd6\xe4\x46\x0b\x32\xe3\x65\x3d\xa3\x59\xad\x74\x4e\x2e\x10\x6f\x8e\x5e\xfd\x69\xfc\x97\xf1\x9b\x2b\x80\xcc\x51\xd8\xfe\xa4\x4a\x62\x8f\x65\x35\x05\x53\x6b\x7d\x05\x60\xb0\xa4\x29\xd8\x8a\x1c\x7a\xeb\x78\xbc\xfb\x97\x59\x47\x56\x7e\xca\x2b\xae\x28\x93\x83\x17\xce\xd6\x55\x7b\x75\x6b\x4d\x24\xd5\xf0\x87\x9e\x16\xd6\xa9\xe6\x19\x60\x04\x56\x97\xe1\x7f\x94\xfb\x5d\xa2\x11\xa6\xb4\x62\xff\x8f\xce\xf4\xaf\x8a\x7d\x78\x55\xe9\xda\xa1\x6e\x9d\x19\x66\x59\x99\x45\xad\xd1\xed\xe6\xaf\x00\x38\xb3\x15\x4d\xe1\x56\xd7\xec\x49\x26\x92\x1e\x12\x0f\xa3\x24\xeb\xea\xe7\xc4\x12\x67\x05\x95\xd8\x30\x08\x42\xca\xdc\xbc\xbf\xff\xf4\xe7\xc7\xbd\x17\x00\x39\x71\xe6\x54\xe5\x83\x56\x1b\x1e\xc1\x51\xe5\x88\xc9\x78\x06\x84\x2c\x1e\xbb\x65\x68\xdc\xda\xee\x37\xc2\x98\x9d\xfd\x8b\x32\xdf\x9a\xae\x9c\x2c\xf6\x2d\x2d\xc5\xd1\xf2\x9e\xce\xfc\x1e\x1f\xd7\xc2\x6c\x5c\x07\xb9\x38\x0e\x31\xf8\x82\x1a\xb1\x29\x4f\x12\x82\x9d\x83\x2f\x14\xef\xf8\x0d\xbe\x20\xd3\x68\x12\x57\x63\x78\x24\x27\x1b\x81\x0b\x5b\xeb\x5c\x3c\x6c\x45\xce\x83\xa3\xcc\x2e\x8c\xfa\xf7\x96\x1a\x83\xb7\xe1\x18\x8d\x9e\xd8\x83\x32\x9e\x9c\x41\x0d\x2b\xd4\x35\x0d\x01\x4d\x0e\x25\x6e\xc0\x91\xd0\x85\xda\xb4\x28\x84\x25\x3c\x86\x7f\x5a\x47\xa0\xcc\xdc\x4e\xa1\xf0\xbe\xe2\xe9\x64\xb2\x50\xbe\x89\x8d\xcc\x96\x65\x6d\x94\xdf\x4c\x82\x9b\xab\x59\x2d\x76\x9f\xe4\xb4\x22\x3d\x61\xb5\x18\xa1\xcb\x0a\xe5\x29\xf3\xb5\xa3\x09\x56\x6a\x14\x98\x35\x21\x3e\xc6\x65\xfe\x83\x4b\xd1\xc4\xd7\x7b\xea\x8b\x76\x60\xef\x94\x59\x74\x5e\x05\x9f\x3c\xa9\x6b\x71\x4f\x50\x62\xe8\xb8\x3d\xca\xb2\x53\xa9\x4c\x89\x56\x3e\xbc\x7d\x7c\x82\x86\x81\xa8\xf6\xa8\xe1\x96\xb7\xec\x94\x2d\x8a\x52\x66\x4e\x2e\xae\x9c\x3b\x5b\x06\x2a\x64\xf2\xca\x2a\xe3\xc3\x43\xa6\x15\x19\x0f\x5c\xcf\x4a\xe5\xc5\x8a\x7f\xd4\xc4\x5e\xec\x30\x86\xdb\x00\x0d\x30\x23\xa8\xab\x1c\x3d\xe5\x63\xb8\x37\x70\x8b\x25\xe9\x5b\x64\xfa\xe6\xaa\x16\x8d\xf2\x48\xd4\xd7\x5f\xd9\x6d\x64\x3b\xdc\x70\x10\x25\x00\x0d\xfc\xbc\x68\x9d\x26\x22\x1f\x2b\xca\x3a\xa1\x90\x13\x2b\x27\xae\xeb\xd1\x93\x38\x7c\x07\x76\xfa\x1c\xed\xd1\xd7\xdc\xef\xf0\xb0\xb4\x73\xbc\x9d\xb1\x18\xba\x75\x3e\x9a\x1d\x7c\x48\xa4\x88\x41\x33\x5b\x56\xd6\x88\x63\xf4\xe5\xea\x65\xe8\x80\x90\x1c\x1a\x7a\x87\xef\xf6\x78\xbf\xdd\x2e\x4d\xf3\x33\xe2\xad\xf7\x8a\x0c\xe8\x23\x39\xa6\x28\xd0\x11\x70\xeb\xc1\xad\x0c\x71\x5b\xb1\xc5\x31\x9e\x04\x9c\x35\xce\x48\x3f\x92\xa6\xec\xd0\x3c\xe7\x24\x96\xd1\xd9\x7f\x7c\xc9\x9e\xf0\xbf\xb6\x77\xc4\xd8\x0e\x44\xe0\x8f\x9a\xdc\x06\xec\x8a\x9c\x84\x3b\x79\x31\xdc\x4e\x29\x35\x53\x2e\x18\xc8\x61\x67\x47\x2d\xd7\x27\x8c\xd9\x53\x4d\x7d\x44\x95\x51\xa2\xcf\x8a\xb7\xcf\x02\x29\xad\x1c\xd7\x43\xea\xfd\x8d\x49\x70\xc5\x41\xcc\xa8\x00\x6e\x94\x92\x8c\x56\x46\xd4\x7a\x2a\xa8\x33\x03\xe8\x08\x6e\x1e\xee\x28\x3f\xe6\x0f\x5d\x81\xd1\x39\xdc\x9c\x58\xa5\x3c\x95\x27\x85\xd8\x13\xe3\xe6\x04\xab\x09\xa7\x9b\x37\xc9\x8b\x8d\x47\x65\x38\xe5\xa0\x21\x20\x2c\x69\x13\xd3\x95\x64\xc1\x26\x28\xc3\x62\x47\x21\xb9\x05\xdb\x2e\x69\x13\x16\xa5\xdc\x75\x92\xc3\x1e\xb6\x8d\xe3\x74\x30\xec\xc6\x48\x8e\x3f\xbb\xc6\x1e\x07\xb5\xee\xe8\xe3\x54\x71\x2c\x69\x73\x6e\xc9\x9e\x31\x44\x47\x8a\x53\x55\x20\x56\x91\x89\xa0\x49\x99\xda\x1a\x02\xab\x4a\x2b\x0a\x89\xeb\x2c\xfd\x17\xb3\xc7\xe1\x68\xc4\xbf\x90\x69\x7b\xb4\x8c\x5b\xd2\xe6\x9a\xa3\x03\x48\x74\x14\xaa\x92\x58\xdf\xc2\x40\x53\xc1\x7c\x42\xad\xf2\x5d\x51\x1a\x22\xe1\xde\x0c\xe1\xc1\x7a\xf9\x79\xfb\xac\x24\x43\x8b\xdf\xdc\x59\xe2\x07\xeb\xc3\xcc\xab\x8a\x1d\x59\xb9\x50\xe8\xb8\x29\x04\x88\x89\x31\x29\x52\xb5\x4b\x1a\x1e\xc3\xfd\xbc\x83\x6a\xb2\xfa\xde\x80\x75\x8d\x74\xa1\xc8\x8c\x84\x22\x89\xb2\xe6\x50\x83\x18\x6b\x46\x54\x56\x7e\x73\x94\x46\x52\x8a\x75\x1d\x9d\x9c\x20\x97\x48\x3d\x49\x69\x14\xdf\xc4\x22\x56\x63\x46\x39\xe4\x75\x60\x3a\x14\x64\xd2\x6e\xa8\x0c\x4a\x72\x0b\x82\x4a\x10\xae\xaf\xaa\xcf\xe1\x52\x1c\x3d\xd0\xa9\x4d\xf4\x8c\xfd\x02\x04\x87\xec\x73\x21\x6c\xc7\x3d\x11\xde\x4a\xac\xc4\x74\x9f\x05\xc5\x82\xf6\xbe\x40\x85\xca\xf1\x18\x6e\x42\x7b\xa4\xa9\xf3\x4e\x99\xa0\xe7\x36\x19\xa1\xa0\x18\x04\x8a\x56\xa8\x05\x37\xc5\xd3\x0d\x90\x8e\x28\x6a\xe7\x07\xc9\x62\x08\xeb\x42\x6a\x01\x89\xef\xb9\x22\x1d\x4a\xe2\xc1\x92\x36\x83\xe1\x81\xb9\x07\xf7\x66\x10\xf1\xf5\xc0\xc0\x5b\x30\xb6\x46\x6f\x60\x10\xde\x0d\xfe\xbb\xfc\x72\x16\x74\x31\xcf\x43\x63\x8d\xfa\x7d\x4f\x24\x3c\x6b\x4b\x47\xf3\x17\x49\x74\x8c\xf7\x81\xe6\x51\x98\x56\x39\x31\x27\x47\x26\x14\x59\xf6\xc5\x1a\x62\x57\x75\x0c\x13\x8a\x52\x0e\x6b\xe5\x8b\x6e\xed\xf2\x92\x76\xce\x7b\xf8\x19\xbf\xee\x0a\xa1\xb2\xe2\x43\xc3\x76\xf4\xc1\xad\x14\x11\x23\x1b\x6e\x87\x40\xc6\xa9\xac\x68\x98\x95\x22\x37\x16\xd2\x62\xf9\x68\x86\x13\x99\xb4\x97\x41\xfb\xa5\xb3\x97\x3b\xe9\x13\x82\xde\xbc\xbf\x6f\x7a\xe8\xd8\x3a\x53\x23\xe8\x19\x00\xef\x09\xde\x3b\x1d\x5c\xc0\xd4\xed\x76\x53\x3b\x5f\xb5\xfa\xf0\x6d\x8b\x11\x5a\xc6\xc6\x83\xfa\x30\x7c\x1e\x02\x7b\xc1\xdf\x71\x76\x77\xdc\xb6\x99\xc5\x15\x2a\x8d\x33\xdd\xb4\x48\x31\xd9\xa6\x06\x69\xcb\xfc\x75\x74\x1b\x3a\x87\xe5\xbd\xcb\xae\xfe\x85\x97\x94\x55\xd1\x65\x7b\x2c\x94\xf3\xcf\x2c\xeb\x5f\x7d\x49\x27\xc3\xfe\xc9\xa1\x61\xd5\x5c\xd9\xf5\xc9\x3c\x7b\xad\x0d\x7b\xf0\xaa\xa4\xe4\x0d\x8d\x31\xfc\x96\x2c\xe5\xf1\xb6\xc1\x1a\x6a\x62\x33\xa0\xbf\xf5\x05\xbd\x08\x28\xed\x71\x41\xa5\x22\x63\x6e\x5d\x89\x7e\x0a\x39\x7a\x1a\x09\x67\xbd\xd4\xf0\x31\x5c\x6a\xbc\xaa\x0a\xd6\xc8\x62\x8d\x19\xe5\xff\x0f\x42\x96\xc4\x8c\x8b\xcb\xa5\xbb\x81\xa2\x2e\x51\xa2\x0b\xf3\x10\x47\x89\x10\x28\x93\xab\x0c\xc3\x75\x54\x4e\x1e\x95\x66\xc0\x99\xad\x63\xf4\xed\xcc\xff\xea\x16\x76\x84\x7c\x0e\x65\x8f\xc8\x11\x53\xbe\x6c\x15\xe5\x75\x4d\x75\xcd\xc1\x07\xbe\x25\xd7\xc7\xaf\x77\xce\x72\x9d\xae\x7a\xb6\x60\x9b\x18\x1e\x86\x68\xb2\x73\x78\x72\x35\x0d\xe1\x17\xd4\x4c\x43\xf8\x68\x96\xc6\xae\x5f\x9f\xf7\xb0\xf8\x62\x7d\x6f\xaa\xc0\xe1\x96\xe7\x57\x64\x2b\x14\x84\xef\xd1\x17\x17\xa4\xb5\xeb\xfb\x54\x0b\x85\x5a\x3e\x54\x11\x95\xa2\x8c\x3a\x97\xd3\xa0\x0c\x7b\xc2\x3c\x4d\x92\xf1\xca\x51\x7a\x37\x8c\x37\xa7\xa9\x83\xd9\x5d\x5e\x4b\x7d\x09\x28\x65\xa7\xca\xe1\xef\x8f\xef\x1e\x26\x7f\xb3\xa9\x64\xc5\x2c\x23\x4e\xa9\x45\xea\xcc\x21\x70\x9d\x15\x80\xdc\x5c\x17\x3e\x86\xa4\x53\xa2\x51\x73\x62\x3f\x4e\xd4\xc8\xf1\x6f\x6f\x7e\x1f\xc3\x2f\xd6\x01\x3d\x63\x59\x69\x1a\x82\x4a\x6d\x4e\x73\xc5\xdb\x2a\x8f\x82\x30\xdb\xbd\xa1\x12\x0a\x2c\x55\x36\x4f\x4c\xaf\x03\xb3\x1e\x97\x04\x36\x31\x5b\x13\x68\xb5\xa4\x29\x0c\xb8\xa2\xac\x75\xf4\x67\x83\x25\x7d\x19\xc0\x8f\xeb\x82\x1c\xc1\x40\x1e\x07\xf1\xc0\x6d\x09\x29\x73\x2d\xa7\x4c\x07\xc7\x3e\xdc\xa9\xc5\x82\x1c\xc5\x62\x9c\x56\x64\xfc\x4f\xd2\x89\xa9\x39\x18\xdb\x5a\x1c\x48\x88\x3e\x2b\xca\xd4\x5c\x51\x7e\xc0\xc8\x6f\x6f\x7e\x1f\xc0\x8f\x5d\xb9\x04\x75\xe8\x19\xde\xc4\x2e\x43\xb1\xc8\xf8\x53\x6a\xdc\x78\x63\x3c\x3e\x0b\xcd\x4c\x5a\x07\x13\x6b\x7e\x6f\xa1\xc0\x15\x01\xdb\x92\x60\x4d\x5a\x8f\xe2\xbd\x69\x0e\xeb\xd8\x92\x36\xaa\x8c\x2d\x5e\x85\xce\xef\x7d\xaf\x78\x7a\x77\xf7\x6e\x1a\x4f\x13\xb3\x2d\x8c\x1c\x61\xac\x87\xb9\x32\xa8\x53\xdf\xa1\x78\xd7\xa6\x70\x1d\x8d\xe4\x2d\x64\x05\x9a\x80\x95\x41\x1b\xf3\xda\xd7\x8e\xc6\xfb\xf7\xd7\x5f\x15\x03\xc7\x3e\x24\x9c\x72\xff\xf0\x59\x61\xbf\xc8\xfc\x1f\x5e\xda\x7f\x95\xd0\xe1\xbb\xda\x05\x42\x3f\xb4\xfc\xf4\xa4\xd0\xcb\x7a\x46\xce\x90\xa7\x20\x77\x6e\x33\x16\x91\x33\xaa\x3c\x4f\xec\x8a\xdc\x4a\xd1\x7a\xb2\xb6\x6e\xa9\xcc\x62\x24\x8e\x38\x8a\xde\xc1\x93\xf0\x2d\x72\xf2\x43\xf8\x79\x35\x19\xb9\xc2\xec\x62\x41\xc3\xa6\xef\x21\xad\x9c\xc3\x93\x57\x11\xb6\x69\xe4\x2e\xef\x9d\xae\x1f\x23\x70\x64\xfb\x34\x24\xec\xd6\x85\xca\x8a\xe6\x53\x64\x0b\x29\x4b\xcc\x23\x94\xa2\xd9\x7c\x73\xe7\x17\x95\xd6\x4e\xce\xde\x8c\xd2\x67\xf4\x11\x9a\x5c\xfe\xb3\x62\x2f\xf3\xaf\xa2\xc3\x5a\x5d\x04\x04\x1f\xef\xef\xbe\x4f\x48\xd4\xea\x2b\xa2\x3e\x7e\xc6\x9a\x82\x77\x75\x53\xd3\xb2\xb7\x4e\x2a\xd7\xce\x5c\x3d\xdb\xde\x58\xec\x84\x4f\x45\x16\x7c\xfe\x72\xf5\x9f\x00\x00\x00\xff\xff\xb3\x0d\x9b\xb8\x18\x21\x00\x00") func operatorsCoreosCom_operatorsYamlBytes() ([]byte, error) { return bindataRead( @@ -204,7 +204,7 @@ func operatorsCoreosCom_operatorsYaml() (*asset, error) { return a, nil } -var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\x95\xe8\xf7\xf9\x15\x28\x27\x55\xb6\xb3\x92\xdc\x9d\x9d\x4d\x72\xbd\xa9\xa4\xdc\xb6\x7b\xa2\x9d\x6e\xb7\xb7\xe5\xee\xa9\xdc\x24\x37\x81\x48\x48\xc2\x98\x04\x38\x00\x28\xb7\xf2\xf8\xef\xb7\x70\x0e\x00\x82\xd4\x8b\x94\xe5\xc7\x4c\xcc\x0f\x33\x6d\x0a\x00\x81\x83\x83\xf3\xc2\x79\xd0\x82\x7f\x66\x4a\x73\x29\x4e\x09\x2d\x38\xfb\x62\x98\xb0\x7f\xe9\xc1\xed\x6f\xf4\x80\xcb\x93\xf9\xeb\xaf\x6e\xb9\x48\x4f\xc9\x79\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x0b\x36\xe1\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\x9e\x7e\x45\x08\x15\x42\x1a\x6a\x5f\x6b\xfb\x27\x21\x89\x14\x46\xc9\x2c\x63\xaa\x3f\x65\x62\x70\x5b\x8e\xd9\xb8\xe4\x59\xca\x14\x0c\xee\x3f\x3d\x7f\x35\xf8\xd5\xe0\xd5\x57\x84\x24\x8a\x41\xf7\x1b\x9e\x33\x6d\x68\x5e\x9c\x12\x51\x66\xd9\x57\x84\x08\x9a\xb3\x53\xa2\xcb\xb1\x4e\x14\x2f\xe0\x13\x03\x59\x30\x45\x8d\x54\x7a\x90\x48\xc5\xa4\xfd\x5f\xfe\x95\x2e\x58\x62\x3f\x3e\x55\xb2\x2c\x4e\xc9\xca\x36\x38\x9c\x9f\x23\x35\x6c\x2a\x15\xf7\x7f\x13\xd2\x27\x32\xcb\xe1\xdf\xb8\xf6\x51\xf4\x55\x78\x9d\x71\x6d\xbe\x5d\xfa\xe9\x1d\xd7\x06\x7e\x2e\xb2\x52\xd1\xac\x31\x5b\xf8\x45\xcf\xa4\x32\x57\xd5\xb7\xed\xb7\x74\x39\x8e\xff\xed\x1a\x72\x31\x2d\x33\xaa\xea\x83\x7c\x45\x88\x4e\x64\xc1\x4e\x09\x8c\x51\xd0\x84\xa5\x5f\x11\xe2\xe0\xe8\xc6\xec\x13\x9a\xa6\xb0\x37\x34\xbb\x56\x5c\x18\xa6\xce\x65\x56\xe6\x22\x7c\xd3\xb6\x49\x59\x18\xf5\x94\xdc\xcc\x18\x29\x68\x72\x4b\xa7\xcc\x7f\x6f\xcc\x52\x62\x64\xe8\x40\xc8\xf7\x5a\x8a\x6b\x6a\x66\xa7\x64\x60\x41\x3c\xb0\x10\x8c\x7e\xc6\xfd\xb9\xc6\x41\xa2\xf7\x66\x61\xa7\xab\x8d\xe2\x62\xba\xe9\xf3\x09\x35\x34\x93\x53\x82\xf8\x45\x26\x52\x11\x33\x63\xc4\x7e\x8a\x4f\x38\x4b\xfd\xfc\x36\xcc\x08\xbb\x2e\xcd\x69\xd4\x7c\xdd\x7a\x4a\x33\x2a\x04\xcb\x88\x9c\x90\xb2\x48\xa9\x61\x9a\x18\x59\xc1\x67\x33\x78\x5c\xe7\xa5\xd9\x9c\x2f\xbd\x5f\x31\x1d\x6c\x3a\x7f\x4d\xb3\x62\x46\x5f\xbb\x97\x3a\x99\xb1\x9c\x56\x7b\x28\x0b\x26\xce\xae\x87\x9f\xff\x73\xd4\xf8\x81\xd4\x97\x12\xa3\x28\xb9\x65\xac\xd0\xd5\xa1\x20\x65\x61\xd7\x64\x17\x47\xc6\x0b\x62\x14\x4d\x6e\xb9\x98\xc2\xd2\xa7\xb8\xde\x73\xdc\x18\x3d\x58\x9a\xb2\x1c\x7f\xcf\x12\x13\xbd\x56\xec\x87\x92\x2b\x96\xc6\x53\xb1\x90\xf5\x24\xa2\xf1\xda\xc2\x29\x7a\x55\x28\x3b\x2d\x13\x9d\x43\x7c\x22\x1a\x55\x7b\xdf\x58\xe6\xa1\x85\x05\xb6\x23\xa9\x25\x4f\x76\xfa\x33\xe6\x0f\x07\x4b\x1d\x00\xed\x76\x9a\x19\xd7\x44\xb1\x42\x31\xcd\x04\x12\x2c\xfb\x9a\x0a\xb7\xa6\x01\x19\x31\x65\x3b\xda\x03\x5b\x66\xa9\xa5\x63\x73\xa6\x0c\x51\x2c\x91\x53\xc1\xff\x1e\x46\x03\x10\xd9\xcf\x64\x16\x3f\x0c\x81\xe3\x26\x68\x46\xe6\x34\x2b\x59\x8f\x50\x91\x92\x9c\x2e\x88\x62\x76\x5c\x52\x8a\x68\x04\x68\xa2\x07\xe4\xbd\x54\x8c\x70\x31\x91\xa7\x64\x66\x4c\xa1\x4f\x4f\x4e\xa6\xdc\x78\x0a\x9c\xc8\x3c\x2f\x05\x37\x8b\x13\x20\xa6\x7c\x5c\xda\x8d\x3b\x49\xd9\x9c\x65\x27\x9a\x4f\xfb\x54\x25\x33\x6e\x58\x62\x4a\xc5\x4e\x68\xc1\xfb\x30\x59\x81\x24\x32\x4f\x7f\xa6\x1c\xcd\xd6\x87\x0d\xf0\xad\x3c\x07\xc4\x53\xbd\x8d\xb0\xb6\xc4\x8f\x70\x4d\xa8\xeb\x8e\x6b\xa9\x40\x6a\x5f\x59\xa8\x7c\xbc\x1c\xdd\x10\x3f\x01\x04\x3b\x42\xb8\x6a\xaa\x2b\x60\x5b\x40\x71\x31\x61\x0a\x5b\x4e\x94\xcc\x61\x14\x26\xd2\x42\x72\x61\xe0\x8f\x24\xe3\x4c\x18\x7b\x0c\x73\x6e\x34\xe0\x1c\xd3\xc6\xee\xc3\x80\x9c\x03\x03\x22\x63\xe6\x0e\x6c\x3a\x20\x43\x41\xce\x69\xce\xb2\x73\xaa\xd9\x83\x83\xda\x42\x54\xf7\x2d\xf8\xda\x03\x3b\xe6\x9f\xcb\x1d\x96\xce\x18\x21\x9e\xc1\xad\xdd\x9d\xf8\xc0\x8f\x0a\x96\x84\xe3\x40\x05\x39\x2b\x8a\x8c\x27\x88\xf1\x66\x46\x0d\x49\xa8\xb0\xf0\xe2\x42\x1b\x9a\x65\xc0\x4e\x5a\xcd\x62\xdd\x69\x27\x70\xb4\x1b\xcc\xc1\xbf\x5e\xa2\xd0\xf5\x1f\x02\x53\x6b\xb4\x58\x47\x19\xec\xe3\xe8\xec\xf2\x0f\x1b\x40\x4e\x50\x32\x99\xf0\xe9\xaa\x6e\x6b\x61\x79\x0e\x5d\x40\xa6\xa1\x5c\x68\x37\x44\xa9\x10\x9a\x15\xa7\xb2\xbc\x8b\xd6\xf8\xf6\x60\xed\xec\x56\x42\x76\xdb\x9a\xed\xc3\xc4\x7c\xf5\x0f\x8d\x05\x5c\x8a\x39\x1e\x54\x2b\xb3\x58\x22\xc7\xc4\x9c\x2b\x29\x72\x7b\x88\xe6\x54\x71\x3a\xce\x1c\x63\x63\x96\x7c\xe1\x19\xc3\x25\x32\xb5\xea\x48\xad\xf9\x2a\xae\x87\x2a\x45\x17\x6b\x5a\x70\xc3\xf2\x35\xab\x59\x35\xed\xcf\x54\x45\x54\xc2\x22\xef\xaa\xa9\x13\xd7\xc0\x4e\x9d\x92\xf3\x30\xf1\xb5\x9f\xd9\x02\x77\x7c\xd6\xe3\x76\xf5\xac\xc1\x72\xff\x6c\xdb\x40\x7c\x80\xd3\x6f\xf8\xbd\x01\x16\x7b\x42\x90\x81\xb1\x95\xd0\x18\x90\xf7\xa5\x86\xdd\xa2\xe4\xfc\xaf\xc3\x8b\xcb\xab\x9b\xe1\xdb\xe1\xe5\xc7\xf5\xe0\x20\xdb\x0e\x4a\xf5\x00\x8d\xef\x30\xd9\xc3\xcf\x7e\x8f\x14\x9b\x30\xc5\x44\xc2\x34\xf9\xf9\xd1\xe7\xb3\x8f\x7f\xbd\x3a\x7b\x7f\x79\x4c\xa8\x62\x84\x7d\x29\xa8\x48\x59\x4a\x4a\xed\x99\x46\xa1\xd8\x9c\xcb\x52\x67\x0b\x47\xb9\xd2\x35\x48\xdb\xc4\x56\xe0\xb6\x54\x2c\x88\x66\x6a\xce\x93\xd5\x20\xd2\x03\x32\x9c\x10\x5a\x21\x50\x12\x30\xdc\x32\xaa\x6c\xce\xd2\x1e\x0c\x1b\x26\xed\xbf\xc3\x45\x51\x1a\xcf\xf0\xee\x78\x96\xc1\xa9\x10\x28\x2b\xa5\x03\x72\x21\x4b\x3b\xde\xcf\x7f\x0e\x0b\x53\x2c\x2d\x13\x10\xa2\x2d\x31\xe0\x62\x6a\x7f\xea\x91\xbb\x19\x4f\x66\x84\x66\x99\xbc\xd3\x40\x29\x98\x4e\x68\xe1\x97\x1e\x43\x47\x2f\x84\xa1\x5f\x4e\x09\x1f\xb0\x01\x39\xf8\x79\xf4\xd3\x01\x7e\xbd\x50\xd2\x7e\x02\xe5\x64\x9c\x55\xc6\x0d\x53\x34\x23\x07\x71\xeb\x01\xb9\xb4\xdf\x60\x69\xbc\x0f\x30\x82\x60\x73\xa6\xec\x2a\xfc\x2e\xf4\x88\x62\x53\xaa\xd2\x8c\x69\x6d\xf1\xec\x6e\xc6\xcc\x8c\xa1\x28\x1e\x00\xc6\xbe\x70\xcb\x70\xa5\x22\x42\x9a\x01\xb9\x60\x13\x5a\x66\xc0\x81\xc9\xc1\xc1\xa0\xc9\xf8\x76\x47\xb5\xb7\x4a\xe6\x1d\xd0\x6d\x54\xd7\x1c\x56\xed\xfd\xa1\xc6\x91\x6b\x64\x4d\xb3\x94\xf0\x89\x93\x60\xb8\xb6\x8b\x22\x2c\x2f\xcc\xa2\xcd\xa1\xd9\x42\x47\x48\x6b\x42\x40\x02\x4f\x7a\x4f\x8b\x6f\xd9\xe2\x23\x9b\x6c\x6b\xde\x5c\x3f\xcb\x58\x62\x09\x25\xb9\x65\x0b\x10\x67\xc9\xb9\x1f\x70\xf3\x52\x3a\x2d\x87\xb4\x24\x8f\xfe\xe9\xdb\xe9\x6c\x6d\xd7\x1e\x48\xf6\xb9\x65\x8b\x36\xcd\xc8\xb2\x4e\x67\x41\x03\xbc\xce\xc2\x6a\x3b\x54\x48\x7b\x94\xf5\xcf\x76\x8a\xbe\x72\x72\x87\x31\x69\x77\xe7\xd4\xac\x14\x58\x6f\xcb\x31\x53\x82\x19\x06\x32\x6b\x2a\x13\x6d\xc5\xd5\x84\x15\x46\x9f\xc8\xb9\xa5\x7c\xec\xee\xe4\x4e\x2a\xab\xc8\xf5\xef\xb8\x99\xf5\x71\x57\xf5\x09\x18\x3d\x4e\x7e\x06\xff\x23\x37\x1f\x2e\x3e\x9c\x92\xb3\x34\x25\x12\x8e\x78\xa9\xd9\xa4\xcc\xc8\x84\xb3\x2c\xd5\x83\x48\xeb\xea\x81\x3e\xd0\x23\x25\x4f\x7f\xbf\xf9\x70\xef\x08\x31\x59\xa0\xb1\x62\x07\xa8\x8d\x40\xe8\x5a\xd4\xe8\x54\x40\x7a\x4b\xa1\xac\x8a\x60\xf7\x3c\x77\x6c\xd1\x31\x94\x0e\xcb\x18\x4b\x99\x31\x2a\xb6\xf4\x00\xb0\x75\x3f\xb3\x87\xd5\xa1\x85\x11\x3c\x02\x14\x32\x3d\x25\xba\x2c\x0a\xa9\x8c\x0e\x2a\x02\xd8\x5c\x7a\xf5\x3f\x41\x5e\xee\x91\xbf\x85\x97\x19\x1d\xb3\x4c\xff\xe9\xf0\xf0\xb7\xdf\x5e\xfe\xf1\x77\x87\x87\x7f\xf9\x5b\xfc\x6b\x64\xa1\xab\x37\x41\x9b\x8e\x4c\x41\x08\x77\x7f\x3a\x36\x7a\x96\x24\xb2\x14\xc6\xfd\x60\xa8\x29\xf5\x60\x26\xb5\x19\x5e\x87\x3f\x0b\x99\x36\xff\xd2\x5b\x38\x01\x79\x58\xa2\x03\xe0\xbc\xa6\x66\xb6\x67\xd2\xb3\xde\x1a\xb1\xfa\xa9\x6d\xb7\xb7\x4f\xb8\x5d\x76\x06\x09\xfb\xcf\xb7\x7e\xba\x96\x03\xdd\x29\x6e\x0c\x13\x20\x77\x30\x95\x5b\x4e\xdc\xb3\x98\x5b\xb1\xd9\xf9\xeb\x83\x07\x21\x5e\x01\x6a\x3b\x2c\x0e\x66\xef\x56\x86\xc8\x1c\x08\xad\x97\xa0\x2a\x1d\xe9\xec\x7a\xe8\x2d\x33\x7b\x5f\x88\xb7\x37\xbc\xbd\xf7\x99\x0c\x96\x0b\xb7\xac\x20\x69\x9e\x12\x29\xb2\x45\xf8\x5d\x93\x8c\x83\x35\xc2\x0a\xa0\xc1\x22\x71\x84\x2f\x07\x49\x51\xf6\x5c\x83\x41\xce\x72\xa9\x16\xe1\x4f\x56\xcc\x58\x6e\x25\xb6\xbe\x36\x52\xd1\x29\xeb\x85\xee\xd8\x2d\xfc\x85\x1d\x6b\x1f\x58\xee\x8d\x22\x75\x52\x2a\xcb\x3c\xb2\x85\xa7\x20\x2c\x7d\xda\xb3\xe8\xc1\xb4\xe7\xa3\x18\x76\xe3\x6a\x47\x96\x1b\xb4\x45\x67\x70\xf5\xab\x02\x19\x72\x2e\xb3\x32\x67\xba\x17\xd8\x13\x4a\xeb\x62\x6e\xa5\xc9\x25\xf3\xce\xea\xa7\xe3\xe9\x4b\xf9\x9c\x6b\xa9\x76\xe6\x83\xdc\x99\x3c\x65\x69\xac\xa6\x32\x91\x2a\xa7\x26\xa8\x8b\x5f\x0a\xa9\x41\x07\x70\x38\xdb\x20\x29\xaf\x0f\x5a\x7d\xb6\xa0\xc6\x30\x25\x4e\xc9\xff\x3b\xfa\xf3\x7f\xfc\xb3\x7f\xfc\xfb\xa3\xa3\x3f\xbd\xea\xff\x9f\xbf\xfc\xc7\xd1\x9f\x07\xf0\x8f\x5f\x1c\xff\xfe\xf8\x9f\xfe\x8f\xff\x38\x3e\x3e\x3a\xfa\xd3\xb7\xef\xbf\xb9\xb9\xbe\xfc\x0b\x3f\xfe\xe7\x9f\x44\x99\xdf\xe2\x5f\xff\x3c\xfa\x13\xbb\xfc\x4b\xcb\x41\x8e\x8f\x7f\xff\xf3\x56\xd3\xa3\x62\xf1\xa1\xc5\x81\xc7\xa7\xef\x36\x88\x0b\xc3\xa6\x4c\x75\xec\xd5\x7a\x5b\x09\xf9\xd2\xaf\x84\xb6\x3e\x17\xa6\x2f\x55\x1f\xbb\x9f\x12\xa3\xca\xed\x07\xa3\x22\x6a\xbb\xe0\xf9\x47\x7f\x5a\x23\x53\xac\x27\xcd\x7b\x47\x64\xcd\x12\xc5\xcc\xbe\x34\x18\x1c\xcd\xf3\x8f\x42\xa6\x87\x9a\x88\x35\x66\xc2\x75\xd3\xfe\xb7\x50\x6a\xbc\x48\x81\xf0\xaa\x38\xef\x44\xc9\x7c\x40\x22\xb3\xd0\x9c\x66\x3c\xf5\xed\x6e\xd9\x16\x2d\xd7\x3f\x2f\x4a\xd0\x8f\x4b\x09\x1a\xe1\xfe\x3e\xb8\x06\xc4\xc4\x7c\x93\x99\xa6\x69\xd3\xb5\x6d\xeb\xe6\x68\x2f\x40\x19\x49\x0a\x59\x94\x19\x35\x6b\xcc\x76\x2b\x6c\xd3\x0e\xf7\x75\x30\x13\xda\x8d\x06\x3b\xb0\xa3\x72\xf9\x6a\x63\x28\x39\xcb\x32\xc2\x05\x9e\x04\x18\xc0\x5b\xf3\x14\x43\x79\x89\x50\x34\x38\xcf\xed\x14\xee\x66\xac\x69\x68\xe4\xda\xea\x3a\xca\x70\x31\x1d\x90\xef\xec\xef\x48\xb3\x9c\x69\x8c\x0b\x92\x97\x99\xe1\x45\xc6\x48\xe0\xb6\x68\x43\xcb\x4a\x46\xa8\xd6\x32\xe1\xd4\xb8\x19\xbb\xfb\x43\x6d\xfc\xb4\x61\x36\x86\xde\x82\x29\x34\x61\x29\x13\x09\x1b\x90\xcf\x70\x5d\x18\xd6\x3a\xb6\xc2\x20\x98\xf7\x61\x0c\x4a\xd2\x12\xaf\x76\x90\x1e\xac\x1e\x63\x98\xe7\xa5\x01\x43\xf1\x63\x59\xf1\xed\x8e\x3b\xcb\x5c\x64\xcc\x07\x52\x15\x44\x6b\x0a\x77\x0f\x72\x52\xa9\xee\xfa\x7e\xe6\xfb\x76\x84\x37\x98\xdb\xb6\x72\xaa\x25\x8a\x5b\xd9\x18\xea\x94\xf6\xb1\x2d\x86\xed\xe8\xec\x4f\x92\xc6\x76\xa0\xaf\xed\x69\x6b\x07\xe3\x52\x57\x7a\xda\xd6\x9a\x54\x28\x36\xe1\x5f\x3a\xe0\xe3\x99\xa8\x54\x14\x9e\x32\x61\xac\x22\xa0\x80\xa0\x2a\x56\x30\x01\x7a\x38\xa3\xc9\x0c\xe8\x82\xa3\xa2\x95\x65\xf8\x21\x6f\x8c\x50\xca\xe8\x7e\xbc\x46\xab\xa4\x98\x97\xb3\xf5\x13\x3f\x5b\x6e\xd7\xf7\x7f\xb0\x84\x4c\x19\xea\x16\xeb\x95\xeb\xc6\x3e\x46\x3d\x9c\x9f\x8b\xff\x0b\x2f\xf0\xfc\x24\xad\xf6\x16\xae\x9c\x0a\x09\x67\x6d\xc2\x0d\x91\x56\x22\xb0\xdf\x1d\x90\xd1\x8a\x9e\x39\x35\xc9\xcc\xb5\x38\x3c\xd4\x04\x8d\xb6\xcd\x81\xc6\x68\x22\x4c\xcb\x8c\xa5\xc4\x3b\x6c\xe0\xa0\x1d\x51\xaa\xe6\xaa\x70\x42\xb5\xe6\x53\xd1\x2f\x64\xda\xb7\xa3\x9d\xac\x43\x88\x16\x87\x2a\x76\x35\xdc\x7e\xb0\xb6\xe2\x55\x30\x4e\xb4\xdb\xa6\x8f\xc1\xfe\x16\xc9\x16\x89\xcc\x8b\xd2\xb0\xc8\x38\x17\xec\x3a\xe3\x05\x7a\x16\x45\x32\x64\x25\x11\xdd\x0f\xa6\x39\x15\x74\xca\xfa\xee\xe3\xfd\xf0\xf1\x7e\xf8\xd6\x7d\xc0\xdc\x86\x6a\xa1\x49\x71\xd3\x39\xac\x03\xef\x1d\x9a\x2c\xf1\xe5\xd8\x99\x8e\x72\xfa\x85\xe7\x65\x4e\x68\x2e\x4b\x01\x32\xd9\x32\x38\xe1\xf2\x9a\xa5\xfb\x01\xd8\x0a\x40\xe9\xb5\x90\x6a\x09\x2d\xd2\x19\x31\xc9\xf3\xb5\x6c\xb5\xb2\x68\x75\xb3\x64\x75\xb0\x60\xed\x6c\xb9\xf2\x46\xea\xf6\xf8\xf8\xd1\xdb\xcd\x1b\x18\xc9\xc5\x56\x8c\xf4\x07\x1c\x5c\x3b\xc2\x38\x5c\x13\x99\x73\x63\x82\x4b\x56\xc0\xb0\x1e\xe1\xa6\x66\xfd\x74\x67\x81\x4f\x90\xc6\x72\x4d\xd8\x17\xab\x4d\x71\xb0\xa2\xfb\x5b\x8b\x1e\x72\xd9\x3b\xae\xc1\x80\x46\x05\xe1\x79\x91\xb1\xdc\xfb\x90\xf6\xbd\x6e\xe6\x9c\x0c\x5e\xce\xc7\xcb\xf9\x58\xd5\x49\x77\x91\x45\x62\x31\x04\x0d\x05\x63\x96\x55\xe2\x88\xc5\xec\x42\xa6\xda\xc9\x0b\x1e\x87\xec\x59\xb8\xfc\xc2\x35\x78\xe2\x7e\x64\x60\x19\x18\x31\xa3\xc9\xdd\x4c\x6a\x86\x3d\xa8\x62\x6e\x9c\x88\x35\x7a\x4b\x08\xdc\x23\x80\xd3\xe8\x64\x52\x6f\x91\xb2\x22\x93\x8b\x1c\x24\xdb\xa1\x89\xe5\x99\x20\xba\xb0\xbc\xc8\xa8\x61\x41\xb0\xd9\x6c\x6d\xb8\x37\xe7\x83\xaf\x5f\x7e\xb1\x12\x40\x14\x07\xd1\x02\xb6\xcd\x8e\x75\xd3\x54\x03\xd2\x8e\xc8\xe4\xe8\xb3\x7c\x03\x12\x7e\xf5\x06\xa0\x79\x76\x75\xb1\xde\x41\x92\xb4\x32\xaf\x90\xed\x26\x96\xa5\x65\x9c\x6d\x98\x6a\x43\x7a\x45\x9f\x5f\xef\xc1\x8a\x1e\xe8\x3d\x34\x5e\xf5\x9c\xfb\x5c\x88\x0e\xc0\xc6\x8a\x65\x18\xfa\xe0\x0c\xcd\xb6\x91\xf3\x5c\xdf\x8f\x46\xd6\xd6\xee\xde\xc6\xe6\xde\x0f\x93\xdf\x93\x12\xd8\xca\x28\x5f\xdb\x0c\x50\xb2\xe3\xa3\x0a\x2e\x47\x16\x92\x68\x9f\x77\x1b\x41\x8b\x22\x83\xfb\x3a\xd9\xd6\x37\xab\xa5\x3a\x86\xcb\xef\x38\xe9\xb0\xe5\xb1\xc3\xad\x9d\xf9\xa1\x46\x04\xb0\xa7\x63\xc6\x0b\xe7\xcd\x88\xd6\x3a\x1f\xbf\xf0\x19\xec\xa8\x55\x4c\x89\x3d\x09\x43\xd1\x23\x57\xd2\xd8\xff\x5d\xa2\x4d\xd4\xe2\xcd\x85\x64\xfa\x4a\x1a\x78\xb3\xd7\x65\xe3\x54\x3a\x2e\x1a\x3b\xc1\x01\x11\x78\x26\xc1\x20\x1d\x05\x34\xa0\xaf\x28\x90\x42\x0f\x20\xae\xc9\x50\x10\xa9\xfc\xea\x82\x55\x57\xbb\x21\xbc\x66\x28\xa4\xe8\xa3\x1b\xe1\xaa\x31\x2e\x83\x0f\x65\x0c\x93\x0d\xc3\xb9\xa1\x6e\x2c\x05\xc6\x5f\x30\x84\x25\xa3\x09\x4b\x49\x5a\xc2\xa4\x21\x1c\x83\x1a\x36\xe5\x09\xc9\x99\x9a\x32\xcb\xb4\x93\x59\x5b\x50\x6f\xa3\x4b\xf8\xb4\xa0\x4e\xf1\xa0\x5b\xf6\x0f\x48\xf0\x3b\xe0\x12\xdd\xc8\x36\xf6\x41\xf2\x96\xd3\xc2\x6e\xdd\x3f\x2c\x15\x03\xe8\xfd\x8b\x14\x94\x2b\x3d\x20\x67\xde\xf5\x36\xfe\xcd\xd9\xc0\xe2\x61\xec\x08\x56\xea\xfb\xa1\xe4\x73\x9a\x59\xba\x89\x02\x1e\x43\xf1\xce\x8e\xde\x64\x16\x3d\xc7\x4b\xed\xf9\x46\x7f\x17\xae\xc9\xc1\x2d\x5b\x1c\xf4\x96\xb6\xfb\x60\x28\x0e\x90\xbe\x2e\x6d\x70\x20\xc6\xe0\x51\x72\x00\xbf\x1d\xdc\x8f\xbf\x3c\x80\xf0\xb7\x75\x2f\x8d\xcc\x98\x8a\x43\x3f\xb7\xec\xe1\x4d\xd5\x1e\x96\x56\x5d\xef\x46\x23\x3d\xce\x2d\xc5\x8d\x17\x5b\xec\xd9\xaa\xe6\x05\xa8\x65\x0c\x4d\x66\xe8\xc5\xed\xe6\x05\x71\x34\x0b\x62\xf7\xcc\x20\x5d\x07\xc4\x70\x1c\xd2\x28\xb8\xf4\xf9\x6d\xc0\xb6\x1e\x03\xf9\xe9\x77\x91\x7f\x3b\xb4\xb7\x7f\x04\x0c\xf9\xad\xff\xd7\xef\xee\x19\xb7\xd0\x8e\xb1\xe1\x94\x3a\x08\x18\x97\xd0\x81\x70\x91\xc2\x05\x93\x5b\x2a\x40\x00\xc7\xb2\xf0\x81\x65\x0d\xc8\xa5\x25\x54\x24\x67\x54\x68\x6f\xe6\x82\x9b\xa8\xaa\xb1\x76\x57\x66\x91\x5e\xe5\x4c\x0a\xd5\xc9\x60\xe4\x4a\x8e\x9c\xed\xab\x47\xae\xc1\x96\x5a\xbd\x81\x93\x74\x25\x2f\xbf\xb0\xa4\x34\x6b\xef\xb2\x62\xb8\x6d\xe5\x22\x5b\x19\x7d\x0d\x20\xdf\x56\x4c\x1e\x57\x56\x63\xf2\x15\x06\xc7\x6c\x7e\x23\x64\x6e\xd9\xa2\x62\x36\x4e\x84\x00\x92\xdf\xab\xb0\xc4\xb3\x02\xe4\x1d\xff\xed\x4d\x59\xf9\x98\x0b\xfc\x18\x0e\xed\xb7\x02\x46\xf7\x00\xb5\x92\x5d\x96\xe1\x67\xf6\x01\xae\x76\x72\x46\x0d\x66\x1f\x3a\xc8\x18\x81\x4a\xae\x96\x2e\x22\x91\xe2\xf2\x87\x92\x66\xf5\x20\x04\xf7\xca\x35\x5a\xa2\xea\x77\x3c\x4b\x13\xaa\x9c\x97\x17\x86\x69\x6a\x89\xbb\x47\x81\x10\x24\x54\x84\xd3\x5e\xed\x91\xc6\xab\xca\x82\x2a\xc3\x93\x32\xa3\xca\x47\x8e\xb7\x0a\x14\xd8\x0a\xd1\x0a\x69\x46\x2c\x91\x22\xed\xa2\x00\xdc\x34\xfb\x36\xef\x5a\x0b\xa6\xb8\x44\xef\x62\x9e\xb3\x26\x92\x1e\xd5\x6d\xda\x72\xe2\x4f\x75\x38\x62\x35\xcb\x07\xc4\x66\x7a\x86\xc7\xa7\x42\x2a\x96\x1e\x47\xe4\x31\x9c\x8a\x01\x79\xb3\xf0\x66\x16\x30\xb9\xb8\xe8\x0a\xcd\x8c\x0f\x84\xf1\x28\xeb\x80\x5d\x1d\xa8\x89\x54\x10\x9c\x72\x94\x4a\x8c\xc8\x98\xf3\xc4\x1c\x0f\xc8\xff\x65\x4a\xc2\xc6\x0b\x36\xa5\x86\xcf\x03\x37\x0d\x8a\xab\x62\xd4\xdd\xe0\xbf\x22\x47\xd0\x8d\xf0\x3c\x67\x29\xa7\x86\x65\x8b\x63\xd4\x63\x19\xd1\x0b\x6d\x58\xde\x66\xeb\xda\x18\x0d\xd0\xd7\x0e\xda\xfe\xea\xeb\x0d\x2d\xbb\xc6\x50\x7d\xf6\x51\x29\x15\x64\xd0\x87\xa0\xb1\x85\x81\x07\xc9\x0d\xe2\x66\xec\x83\xe0\x02\x9b\xbd\x64\x19\x6f\xf0\xf7\x16\x0f\x28\x51\x0c\x32\x10\x38\xcc\xbd\x27\x8e\xa3\x37\xe5\x7b\x59\x8a\xf5\x26\xc1\xda\xc2\xdf\x39\x25\xfc\x73\xd4\x71\x6d\x94\xe2\xa3\x88\x09\xd1\x4c\x22\x13\x25\x25\x60\x97\x04\x76\x6e\xc9\x03\xb6\xaa\x3c\x51\xb6\x4e\x72\xaf\x11\x89\x30\x97\x2d\x5e\xef\x7b\x89\x5b\x0c\x1f\xea\x80\xcb\xe0\x20\xee\x00\xd3\x88\xdb\x33\x8e\x1c\x00\x7e\x22\x04\x2b\x04\x85\x6f\xb1\xd4\x7b\xb1\x59\x6a\xe0\xba\x92\xc3\xd3\xc3\xbd\x10\x5f\x5c\x8e\x92\x05\x9d\xc2\x79\xea\xb0\xaa\x66\x57\x92\x32\xc3\x54\x0e\x01\xd7\x33\x79\x87\xbf\x23\xdb\x2a\x5c\x2b\x96\x56\xb1\xed\x33\xa9\x81\x2b\xd5\x83\x18\xe1\xfc\xc2\xc5\xe8\x1d\x5d\x10\xaa\x64\x29\x52\x27\x35\x05\x02\xfa\xbe\xf1\xe1\x2b\x29\x80\x52\x94\xda\xc2\xea\xa6\x46\xa5\xc7\xcc\x50\x7b\x6c\x5e\x0f\x5e\xbf\xda\x0b\xc0\x3a\xc6\xad\xc2\x6c\x1a\x96\x42\x7f\x57\xee\xcf\xcc\x5e\xe6\xa5\x18\x4d\x3f\x88\xac\x8b\x2c\xf7\x1e\xd1\x0b\xba\xf6\x41\x09\xe3\x13\xb0\xdd\xf6\xf0\xd5\x9d\xe2\x86\x45\xe4\xf1\x68\x42\x33\xcd\xac\xea\x5e\x8a\x20\xc2\x1e\xd7\x45\x10\x68\xd2\x66\x41\xdb\xfd\x41\x74\x39\xbe\xe7\x39\x73\x07\x0a\x50\xae\x3a\x66\x01\xe1\x0e\xf5\x86\x23\x57\x0f\xee\x24\x47\xd8\xd2\x4a\x6c\x52\x9a\xe3\xfd\x38\x89\xe0\x02\xad\x66\xdd\x45\x25\xf1\x71\xc3\xc5\x1e\x57\xfb\x86\xcd\xe8\x9c\x69\xa2\x79\xce\x33\xaa\x32\x88\x15\x1c\xe1\xfc\xc8\xb8\x34\xab\x23\xd0\xbb\x45\x37\xc7\x33\x89\x86\xdb\x0a\x6a\x3f\x0f\x0b\x27\xa0\x11\x7e\x5e\xf6\x3b\x79\x69\x4a\x9a\x65\x0b\xc2\xbe\x24\x59\xa9\xf9\xfc\xbe\xa7\xc9\x45\x3f\xec\xc0\xaa\x9b\x5c\xba\x90\xe9\xa8\x60\xc9\x63\xf2\xe8\xba\x86\x61\x49\x55\xea\x37\x1d\x78\x32\x2a\xfb\xa0\xb9\x2f\xc0\xf3\x29\x49\x98\xd6\xde\xa7\x72\x11\xfb\x79\x86\x35\xfc\x58\x12\x0a\xd0\x3b\x7d\x99\x51\x6d\x78\xf2\x26\x93\xc9\xed\xc8\x48\xd5\x29\x66\xff\xec\xbb\xd1\x52\xff\x46\x1a\x86\xb3\xef\x46\xe4\x82\xeb\xdb\x38\xb1\x0b\x5e\x9a\xc6\xe6\x12\x4a\x6e\xcb\x31\xcb\x98\x39\x3c\xd4\xc8\xe5\x72\x9a\xcc\xb8\x60\x9e\xc1\x89\x10\x92\xe2\x14\x3e\x0b\xe5\xae\x77\xa6\x2e\xf0\xe9\xc4\xe1\xeb\xcf\xe8\x9d\x66\x38\xfd\xb1\x9d\xbe\xfd\x99\xb5\x89\x48\xdf\xeb\x3d\x05\x4e\x66\x78\xb1\xa7\x3b\x88\x89\xbe\xb1\x73\xec\x66\xdc\x3e\x7c\xcb\x33\x86\x3a\x0e\x2c\xd1\x7b\xa5\xb9\x73\x00\x3b\xb6\x90\x25\xb9\xa3\xa8\x15\x03\x0d\x1c\x90\x1b\x5e\x9c\x92\x4b\xa1\x4b\xc5\x2a\x7b\xc6\xa4\x31\x14\xd7\x55\x64\x99\x57\xa7\x60\x87\x51\xe5\xb0\x94\xce\x69\x57\xe4\xf2\x0b\xcd\x8b\x8c\xe9\x53\x72\xc0\xbe\x98\xaf\x0f\x7a\xe4\xe0\xcb\x44\xdb\xff\x09\x33\xd1\x07\x03\x32\xcc\xc3\x3d\x3b\xa4\xfe\x51\xcc\xbb\x3e\x61\x07\xcb\x8c\x23\x3e\xfb\x20\x08\xe2\xdc\xe8\xac\xb4\x96\x4a\x72\x87\x19\x28\x2c\x89\x67\x4a\x49\x15\x3c\xcf\x23\x30\x00\x77\x49\x64\x5e\x28\x99\xf3\xc8\xb0\x07\x08\xbe\x57\xff\x3a\x30\x37\x6c\x17\x49\x97\xf7\x1f\x73\xba\xb9\xce\xa4\xce\x1c\xd7\xed\xfe\x70\xe2\x3d\x26\x50\x55\x74\xba\x3b\xe8\x9f\xae\x91\xdd\x6f\x37\x8a\xa5\x56\xf1\x0e\xbf\x0d\x51\x73\xe4\x24\x65\xf3\x13\x9d\xd2\xd7\x3d\xf8\x8c\x76\xde\x7e\xa6\x36\x27\xaa\xc9\xc1\xeb\x83\x01\x19\x79\x6e\xdb\x8b\xe7\x58\xb5\x9b\x48\x15\x06\x04\x63\xfa\xab\x03\x72\x24\x15\x8c\x9c\x50\x41\x32\x46\xe7\xce\x80\x8c\x67\x6a\x81\x3a\xed\x71\xeb\xa8\xc7\xb6\x01\x60\x91\x96\xff\x9f\xbf\xdc\xd2\xba\x9d\x24\xba\xbc\x6f\xde\x33\xf2\xc0\x8a\xa0\x07\x20\x4c\x4a\x4b\x63\x2d\xd5\xb4\x6c\x15\xd2\x6a\xb9\xb1\xab\x05\x73\xb1\xa4\x29\xe3\x00\x1b\x37\xf5\x00\xe4\xd4\x83\x27\xa0\xba\xa4\x63\x7c\xbd\x27\xa9\x5d\xa1\xf9\x49\xf0\x1f\x4a\x46\x86\x17\x21\xb2\x9e\x29\xcd\xb5\xb1\xa7\x3b\xad\xf1\x30\x8e\x8c\xed\xe8\x2c\xa7\x7f\x97\x82\x5c\xbe\x19\xb9\x8f\x1e\x3f\x29\x78\xb6\x12\x09\xfa\xf7\x52\x31\xcb\x8e\xbb\x38\x0c\xf8\x3e\x4d\xce\x6e\xdf\x93\x0b\x6a\x28\x32\x78\xe7\x72\x25\x2a\x0a\x6f\xb1\x70\xcc\x45\xea\x7e\x8a\x38\xf7\x63\x33\x59\xbb\x7b\x57\x9b\xe4\xa5\xb8\xe1\xa7\x8f\xc3\x3d\x31\xe3\x04\x68\xfc\xf4\xbd\x4c\x3b\x73\xe4\x3f\x58\x00\x9e\x63\x7f\x92\xdb\x01\x88\xd5\xd9\x7b\x70\x9c\x89\x3d\xcf\xee\x9f\xdf\x59\x8d\xb3\x35\xf1\x6a\xc5\x46\x3c\xb4\x3a\xce\xf9\x26\xd2\xd3\x81\x76\x58\xd4\x80\x73\xe3\x18\xca\x38\x93\x63\xe2\xf0\x7d\xdf\xf3\xfd\xf4\x71\xb8\xc3\x74\x3f\x7d\x1c\x3e\xee\x54\x77\x12\xcf\x9a\xd2\x59\xc5\x83\xab\x70\x8c\xa6\xd8\xd5\x5e\xe6\x1a\xec\x4b\xda\xda\x27\x9c\x56\x65\x95\xdc\x02\xa5\xc3\xcb\x2f\x05\x3a\x9f\x39\x23\xff\x68\x46\x21\x8e\x39\x44\xd7\xc1\xa6\xda\x5d\xd6\x96\xb2\xfb\xed\xb5\x1a\x1d\xd0\x27\x72\xc1\xf0\xca\x32\x3d\xf5\x8e\x00\xa1\xc7\xea\x0e\xef\xc1\xed\x32\x3d\x45\xba\x4a\xd0\x0b\x33\x8d\xb0\xe9\x08\x4d\x44\x22\xfc\x44\xe7\x94\x67\x74\xcc\x33\x6e\x16\x96\x43\x1f\x0f\x6a\xae\xa5\x1a\xa6\xbc\xd7\xc3\xbc\xa3\x68\xb1\x64\xa0\x22\x47\x76\xa4\x13\x30\x70\x1d\x0f\x2a\xa9\x62\xc6\x94\x0b\x42\x44\xd1\xa3\x26\x72\x68\x66\x00\xdb\x1a\x12\x47\x5b\x54\xd9\xce\xee\x01\xf0\xf6\x7c\x74\x65\x68\xb6\xcf\x4a\x86\x06\x3f\x8c\x5c\x4e\xb8\xe7\xcc\xd3\x30\x5e\xaa\x15\x57\x03\xb4\xda\xda\xb2\x3d\x5f\xfb\x69\xe3\x14\x09\xc1\x68\x3b\x30\x41\x3b\x55\xe1\x98\xa0\x8f\xaf\xaf\xb9\x51\x22\x96\x8d\x1c\x29\x71\xe9\x92\x90\x6f\x5a\xdc\xfa\xb6\x45\xaa\x80\x2e\x09\x16\xfc\xce\x77\x0d\xb9\x9a\x81\x5b\xc5\x76\xe4\x6a\x3d\x9b\x84\x15\xb3\x49\x97\x7b\xea\x73\x56\xcc\xde\x8e\xea\xe6\x39\xfb\x8e\xbc\x1d\xad\x38\x97\x00\x64\x58\xad\x46\xa3\xdd\xa1\x26\x19\x9f\x30\xc3\xb7\x2c\xe1\x01\x4e\x66\x2e\x05\x37\x52\xad\x8f\x4b\x26\x9d\x4e\x9b\x1f\xae\x2b\x3f\xac\x32\x79\xbc\x77\x23\xa0\x03\x5c\x22\xb3\x8c\x25\x3e\x8f\x35\x80\xd4\x7f\x62\x95\xf2\xc2\x9c\xce\x1e\xb2\xfc\xa3\xa2\x72\x82\x1b\x7a\xf2\xf1\xf2\xec\xe2\xfd\xe5\x20\x4f\x7f\x36\x93\x77\x7d\x23\xfb\xa5\x66\x7d\xde\x22\x55\xc8\xd3\xb9\x11\xe2\x53\xb4\xca\x5c\x55\x07\xe9\x07\x1f\xc0\x48\x3e\x69\x74\x1b\x00\x53\x8e\xbf\x14\x92\xd2\xf4\x88\xa2\x2e\x48\x91\x3a\x4b\x50\x99\x65\x08\x65\xa3\x18\xeb\xc5\x2a\xf5\xc6\xd8\x8c\xce\x0b\xda\xd5\x88\x50\x2d\xea\x61\x09\xf4\xe3\x23\x57\x17\x5a\xbf\x5d\x88\xd8\x04\xb9\x51\x18\xc3\xfb\x5f\xc0\x55\x93\x91\xe0\x9f\x05\xfe\xb6\x13\xa9\x2c\xd6\xa8\x3a\x06\x30\x93\xc0\x62\x4f\x4a\xcd\xd4\xc0\x71\x8c\x47\x07\x54\x87\x64\x3d\x3b\xe4\x48\x6b\x82\xe9\x23\x9b\xa0\x43\xb2\xcf\x99\xeb\xa4\x28\x5a\x9a\x19\x13\xc6\xa7\x1c\x77\xc0\x58\x09\x37\xe7\xe1\xfc\xe8\x80\x6a\x99\x1e\xa8\x5b\x32\x9f\x97\x04\x38\x5d\xd0\xd0\x1e\x94\x7b\xd1\xed\x10\x1d\xa5\x68\x2a\xc1\x05\x02\x73\xba\xd5\x10\x8c\xa6\x39\x17\xcf\xf0\x20\x26\x5c\xa4\xdb\xd6\xdf\x48\x5c\x07\x3d\xea\x72\x14\x8e\xe2\xad\xe7\xe1\x26\x8e\x7a\xbd\x06\x43\xc8\xdd\x9d\x5c\xfd\x46\xae\xd5\xa1\xcb\x17\xfa\x87\xac\x8f\x5f\xe9\x17\x69\x05\x95\x97\xeb\xb5\xfd\x1b\x70\x1e\xe1\xd2\x6c\x4f\xfb\x4b\xfe\xfd\x04\x9a\x7b\x43\xaa\x8b\x0c\x73\x2f\xde\x0c\x55\x53\xb4\x0f\xda\xc2\x8c\x60\x58\x7e\xc5\xe9\xae\x16\x04\x05\x55\x34\x67\x86\x29\x74\x1d\x73\xce\x68\xc2\x79\xf5\x7f\x28\x98\x18\x19\x9a\xdc\xee\x3b\x85\xe8\x0b\x3f\x7d\x38\x7e\xba\xeb\x6d\x99\x77\x92\x49\x03\x26\xb8\x84\x42\x8b\xf8\x66\x96\x0b\xc7\x6c\x9e\x09\x5d\x09\x79\xbc\xba\x58\x22\x42\x1e\xa7\x3a\x13\xad\xf2\x7a\xa1\xf1\x01\x5c\xc4\x42\x62\x3a\x70\x7d\x47\x28\xec\x87\xe9\xb5\x3f\x04\x4e\x8e\xd9\xe5\xde\xa9\xa2\x07\xb9\x4c\x19\x19\x73\x53\x9d\x74\xcd\x0c\x29\x98\xca\xb9\x0b\x80\x96\x02\x6b\xf0\xb1\x14\xb9\x97\xe5\x54\xee\xd3\x11\x67\x13\x44\x26\xc6\x17\xb9\x22\x63\x66\xee\x18\x13\xe4\xd5\xab\x57\xaf\x40\xde\x78\xf5\xeb\x5f\xff\x9a\x40\xc6\x85\x94\x25\x3c\x5f\x6e\x08\xad\xfe\xeb\xf5\xeb\x01\xf9\xe3\xd9\xfb\x77\xe0\x7f\x55\x18\x4d\xc6\xd2\xcc\xdc\xc8\xb6\x41\xad\xb3\xee\x91\xff\x19\x7d\xb8\xf2\x62\x82\x6e\xfc\x0a\x2a\x45\x58\x5e\xdd\x99\xee\xd5\xaf\xbe\xfe\x7a\x40\x2e\xb8\x82\xc8\x5b\x0e\xb1\x02\xc1\x5d\xb0\xf0\x2e\x74\x42\x9a\xe5\x58\x77\xc7\x26\x9c\x3b\x6d\xce\xa7\x33\x83\xd5\x92\x00\x53\x32\x9e\x18\xcc\xbe\x87\x87\x1d\x73\x21\x69\x17\x4a\xe2\x02\xa3\x9c\xe3\x08\x4c\xae\x47\x32\x7e\xcb\xc8\x44\x7f\xa3\x64\x59\x54\x01\x81\x8a\x69\x2b\xa3\xba\x5a\x4c\x38\x58\xb5\x57\x9a\x99\x27\xf5\x64\x68\x69\xa9\xa9\x21\xdd\xb0\x26\x80\xf4\x42\xfe\xb1\x3e\x62\x42\x41\x79\x70\xae\x83\xeb\xe6\x5a\xf6\xfb\xa0\x45\xa6\xd1\x39\xf5\xf1\x1d\x85\x92\xdf\xe3\x26\x71\xe1\x23\x85\x9c\xcc\xab\x9d\xcc\xe5\x02\x33\xc1\x66\xcb\xeb\x91\xeb\x96\xef\xb9\xa8\xf8\x28\xc6\x68\x38\x89\x83\xd1\x20\x74\x9b\x6b\xfb\x89\x5a\x72\xc8\x15\x5f\x8e\xcb\x13\x9a\x99\xc6\x1d\x2d\xc5\x52\x6f\x57\x6b\xc4\x51\x1a\x57\x81\xc6\x85\x79\x55\x63\xa0\xbb\xaa\x0b\x92\x89\xea\x1a\xd5\x12\xb6\xd5\x9c\x64\x34\x33\xa5\x03\x0d\xf8\x2a\xd9\x6f\x33\xad\x5d\xac\x4d\x4e\xd5\xad\x15\xfb\xdd\xf9\x1f\x80\x67\xb0\x0e\x71\x3e\x18\x74\x35\x67\xa1\x48\x5d\xec\x59\x6f\x3f\x72\x38\x18\x1c\xe2\x01\x91\x0a\xf3\x5d\x22\xb6\xdb\xf7\x4f\x14\x53\x5c\xf7\xdc\xa6\x45\x54\x82\xce\x95\xf6\xa0\x35\x8f\x60\xea\x20\xd5\x26\xcb\x6d\x27\xf1\xa5\x5b\xbe\xe0\xb6\x19\x83\xb1\x65\xd1\xa6\x6c\x41\x57\x09\xaa\x43\x82\xe1\xf5\x75\x53\xdc\x11\x68\x97\x33\xb8\x73\x0e\x5c\x82\x5e\x11\xbb\xcc\xb1\x2b\x93\x73\x41\x6c\xb5\x8a\x59\xcf\x9f\xab\x0d\x27\x18\xfe\x51\xa7\x55\x8e\x16\x44\x12\x42\x55\x9d\xaa\x8a\x05\x79\xd6\xcc\x2b\x46\x97\x6e\xd9\xd8\xbb\x30\x32\x7c\xda\x5d\x12\xe0\xb3\x74\x0e\x02\xcd\x2c\x6a\xd5\x2e\x32\x34\x00\x80\xdc\xe8\x0f\xcb\x80\xbc\x77\x34\x15\x91\x8b\x8e\xb5\xcc\x4a\x83\x5d\xab\x1f\x63\x82\x0b\x83\xfa\x94\x03\x40\x65\x43\xb3\x88\xfc\x9a\xaa\xde\x57\x3b\x4a\x8c\x4f\x87\xc3\xf8\x92\xfa\xf2\xc9\xd2\xca\x56\x19\xbb\xf5\x83\xa5\x98\x4d\x34\xef\xa2\x2a\x8d\x86\xe4\xa8\x2a\x95\xe1\xaf\xb9\x87\xc2\x30\x35\xa1\x09\x3b\x8e\x55\xa8\x50\x92\x24\x78\xd6\xf8\xd8\x80\x19\x15\x69\x86\xa2\x75\xc2\x14\xa0\x3c\xfb\xe2\x8a\xe5\xda\x4f\xa4\x8a\x43\x11\xd8\xa3\x37\xcc\xca\x83\x8c\x9a\x52\xb1\x56\x11\x46\xfb\x75\x2b\x84\x69\xec\x4b\x69\x83\xc1\xba\xba\x54\x40\x27\x2f\xa1\x8a\xe8\x58\x55\x60\x42\xa8\x22\x48\x75\xac\x96\x0e\x2c\x2a\x01\x3d\x06\x52\xb1\x90\xa5\x72\x76\x6f\x9f\x5b\x34\x91\xca\x2a\x42\x38\x30\xd5\x44\xb1\xa9\x95\x56\x15\x88\xb5\xd8\x22\x2b\xed\x8b\xbd\x3a\x7f\xed\xd9\x49\x6e\x93\x8b\xdb\xc4\x89\xcf\x72\xce\x53\xcf\x22\xe1\x6e\xa9\x2a\xf1\x57\x50\x1d\xc5\x9d\x44\xe9\xd8\x23\x08\xa3\x30\x0e\x8c\x34\x44\x74\xd6\xfc\xa7\x63\xeb\xae\x84\x44\x0f\x2d\x6a\x29\x74\x21\xc2\x32\x65\xd7\xe5\x38\xe3\x7a\x36\xda\xd1\x14\x78\xb5\x62\x08\x74\x18\x58\xba\xa8\x5b\x6b\x1e\xd4\x4c\x68\x0e\x2c\xcf\x92\x71\xcb\x6c\xa1\x76\xb0\x04\x20\xfa\xde\x31\x66\x4a\x08\x8c\xc8\x98\x0b\xe7\xb7\x3f\x45\xf3\x70\x11\x5a\x98\xc0\x23\x65\x9f\x44\x51\x7b\x9f\xd0\x2c\xd3\xcd\xe8\x55\x4f\x68\x51\xe6\xf0\x51\x5b\xb8\xa7\xdc\x6e\x77\x28\x13\xd2\x48\x05\xb9\x76\x61\x9a\xe4\x12\x23\x5c\x04\x91\xc2\x37\x82\x3c\x24\xbe\x43\x14\xd5\x07\xb1\xbb\x80\x32\x7b\xae\xa3\xf8\x62\x03\x7d\x38\x1b\xe8\x8e\x37\x0d\x55\x25\x25\x1a\x45\x04\xd7\x4b\x3d\x7b\x52\xea\x49\xee\x96\x2b\x89\xbd\xde\x0a\xe0\x37\xcf\x0c\x96\x27\xef\x9c\xf3\xec\x73\xa3\x3b\xb0\x69\xab\x77\xc0\xe1\xed\x3b\xcd\x22\x89\x30\xd3\x29\x04\xe1\x08\x2c\x1f\xf9\x8a\xe7\x00\xbb\xc1\x97\x87\x9a\xa4\x32\x29\x43\x6e\x54\x00\x5a\x75\x01\xd6\x26\x83\x20\xe9\x7a\x9c\xba\xa7\xb5\x8a\x3f\xb2\x15\xab\x52\x79\x27\xee\xa8\x4a\xcf\xae\xb7\xf8\xa5\xd7\xd9\x79\xd5\x2b\x16\x94\xfc\x60\x50\x09\x8f\x8e\x65\x69\xaa\xf4\x99\x3f\x6d\xd3\xb3\x91\x96\x22\xb4\xb4\x34\x93\x17\xe3\xf5\x8b\xf1\xba\xf9\x3c\xb8\xf1\xda\xf6\xa9\xe7\x82\xad\x1d\x57\x9f\x62\x80\x67\x6d\x5d\x69\x1f\xd2\x0a\x1a\x11\x18\xa4\xee\x4d\x3f\xf8\x86\xdc\x86\x47\xa4\xda\xdb\x48\xd6\xf3\x14\x08\x58\xf5\xd3\x5b\x4c\x1f\xc8\x0e\xda\xbe\x56\x2f\x3e\xeb\x5c\x70\x37\xd5\xee\x05\xa9\x21\x2a\xb6\xdb\x73\x99\x90\x7b\x4e\xef\x12\x69\x55\xc6\x0e\x13\x31\x77\x28\xd5\x89\x4f\x47\xe0\x93\xce\x1b\x40\x3a\x16\xd2\xc5\xa7\xeb\x6e\x90\x1d\x8a\xea\xe2\xf3\xc4\xa5\x75\xf1\xe9\x6c\xe2\x26\xdd\xcb\xec\xae\x58\xee\xc3\x16\xdb\xdd\x71\x69\x8f\x6f\xbd\xef\x55\x25\xde\x9e\x3f\x5b\x7f\xb1\xde\x2f\x3d\x8f\x68\xbd\x8f\x08\xb7\x27\x06\x0e\x00\xb1\x45\x3f\x36\xb7\x79\xb3\xfe\x98\x79\xb1\x72\x50\x65\x20\xb3\x28\xe7\x0d\xfa\x52\xd5\xaf\x4d\x0f\x07\x83\xc3\x43\x6f\xe6\x77\xf8\x59\x9a\x49\xff\x37\x84\x89\x44\xa6\xb8\xa9\x76\x7c\xa5\x0d\x30\xfd\x4a\x3b\x8f\xe7\x92\xfb\x6f\xc5\x57\xaf\x30\x76\xb7\x2d\xe9\x70\x82\xbb\x97\xce\x5e\x05\xe9\xc7\x28\xa0\x1d\x97\xc9\xae\x57\xc5\xc6\x16\xf7\x29\x85\x1d\x03\xef\xc1\xf9\x6b\xeb\xe2\xd8\xf8\xec\xc2\x5e\x77\x28\x94\x8d\xcf\x23\x97\xcb\xc6\x67\x27\x8e\xda\xa9\x74\xf6\x8a\xc5\x3d\x5e\x01\x6d\x7c\x9e\x69\x31\x95\xfa\xd3\xa9\x98\x36\x3e\xbb\x95\xd4\xae\xf7\xed\xb8\xf5\x7b\x29\xaf\x8d\x4f\xb7\x22\xdb\xf8\xec\xbb\xd4\x36\x3e\x2d\x21\x01\x36\xf0\x0b\xde\x29\x78\xe0\xd2\xf5\xa9\x7b\x3e\x1a\x96\x17\x52\x51\xb5\x20\xa9\xb3\x35\x2c\x56\x04\x60\x46\x11\x98\xf7\xce\x8a\x02\x73\x4f\xb9\xda\x53\xfc\x40\x87\xe0\x4b\x96\xf2\x72\x6d\xc9\xe2\x75\x60\xfb\x0e\xb2\x61\xb9\x4c\x5a\xfe\x72\x13\x87\x0a\xa9\x04\x69\x72\xeb\x6a\xe4\x78\x18\x22\xa7\x8f\x53\xee\x1c\x34\x32\x1f\x83\x31\x0c\x6e\xfa\x5c\x2d\x40\xdf\x18\xc7\xae\x19\xae\xf0\xca\xc3\xdd\xfd\x1f\xb9\x86\xc7\x56\xfe\x78\x0f\x4c\xef\x91\xf6\x84\x74\x0c\x32\xe3\x7f\x67\x50\x60\xab\x73\x0a\x2b\x09\x62\x77\x28\xfc\x95\xc9\x24\xba\x58\xae\xb1\x1f\x80\x7a\xc0\x6c\x6f\x98\xb7\xb0\xb7\x5f\x47\xe1\x01\x2c\x3a\x99\xc6\xbb\x3a\x9e\x40\xee\x46\x10\xd1\x01\x76\x01\xde\x37\x51\x19\xbc\x52\xdb\x2f\x41\x6a\xf5\xa8\x4d\xf5\xa1\x3b\x9f\x42\xd2\x44\x95\xca\xea\x8a\x85\xfd\x65\xe4\x21\x10\x29\x65\x10\x9e\xe0\xa5\x70\x5d\x82\x0c\xe8\xbe\xe2\x64\x21\x39\x81\xfb\xa8\xaa\xee\x57\xc8\x5e\xb8\x84\x55\x82\x67\x75\xb4\xf2\xa9\xdb\xc2\xc2\x4b\xe1\xbc\x08\x96\x70\x64\x35\x8a\x94\x9a\xa9\xfe\xb4\xe4\xe9\x2e\xc8\xf1\x8c\xb9\x5b\x6b\x9e\xd6\x9d\x93\x75\xe4\x5f\xf7\xe0\x5a\xc1\xcb\xa2\x03\xdd\x3f\xb8\x0c\xae\x19\x35\xc2\x1f\xa7\x84\xab\xbb\x69\x50\xef\x09\x10\x8e\x9c\xbf\xef\xb9\x09\x7a\xab\x63\x08\xc9\x22\x71\x61\xb2\xbc\x96\xcf\x11\x87\x45\xcc\x03\xaf\xd4\xbe\xfd\x8f\xd7\x6f\xbd\xb1\x7e\xcc\x26\xb2\x2a\x01\x82\xea\x8e\xf3\xa5\x4d\x59\xc6\xa0\x4e\xba\xaf\xc1\x6e\x1b\xc0\x35\x6f\x2e\xe7\x16\x99\xff\x2c\xc8\x27\x9f\x94\x9e\x4f\x4e\x09\x3d\xae\x85\x2a\xb8\xb2\x2a\x82\xb1\x14\x1d\x6c\xb3\xea\x3b\xaa\x14\xba\x47\xc6\xc7\xde\xd9\x04\x4e\x9c\xb0\x32\x5f\xe6\xc5\x59\x54\x9a\x15\xb3\x00\x80\x80\x5f\x25\x73\xa2\x05\x2d\xf4\x4c\x42\x75\xfd\x84\x16\x34\xe1\x66\x61\xc1\x6d\x14\x4d\x6e\xa1\x0c\x8f\x62\xee\x8b\x3d\x92\x1c\x3b\x7f\xad\x18\x82\x75\xb7\x5f\x33\x53\xb2\x9c\xce\xc0\x93\x15\x5b\x25\x19\xd5\x1e\x00\x2b\xfb\x3b\x6d\x46\x93\x74\x21\x68\xce\x93\x90\x34\x4f\xc9\x39\xd7\x5c\x3a\x6b\x2e\x8e\x6b\xb1\x9e\x5c\x87\xbc\x67\x68\x24\x3e\xcf\x28\xcf\xc9\x91\x66\x8c\x04\xc4\xc0\x5f\x5c\xb5\x76\x34\x5e\x28\x66\xbb\xc7\x16\x64\x19\x92\x77\x0b\x97\x71\xa0\xa2\x74\xe1\x8a\x0a\x19\x25\x1c\xb7\x74\xf5\xa7\x8f\xc3\xd6\xad\x9e\x99\x54\x70\x31\xef\xb3\x56\x32\x91\xca\xe8\x7a\xf2\xec\x7a\xa8\x63\xb5\x03\xf1\xcc\xe5\x76\x83\x1f\x32\x29\xa6\x71\xc8\x7e\x85\xa5\x96\xac\x0a\xa8\x65\x32\xe7\x69\x49\x33\x24\xa8\x6e\x32\xe7\xa3\x21\x76\xe7\xd3\x99\xe9\xdf\x31\x30\xbb\x20\xdf\xa9\x5c\x9b\xfc\x47\xf9\x92\x5b\x0e\xd7\x40\x80\x8d\x33\x1b\xa0\x09\xcb\x4e\xed\x8e\x2e\x20\xbf\x8b\x73\x21\xa9\xdd\x8c\xfa\xdc\x5a\x38\x44\x80\x7b\x04\x74\x98\xde\x59\xa8\x4d\x61\x25\x06\xb0\x4b\x59\x28\x03\xd6\x2e\xcf\xcd\x02\x3e\xca\x75\x17\x5e\xbb\x32\x64\xd4\xee\x11\x48\x71\x7f\x16\x68\x61\x82\xeb\x8e\x71\xe4\x7b\x05\x43\xa0\x1d\x1b\x33\x1c\x81\x63\xbd\x3b\x86\xdf\x30\xc1\x14\x4f\x1a\xa8\x13\xba\x4e\xa9\x81\xc3\xc7\x84\xed\x96\x0e\x36\xab\x46\x0f\x20\xe3\xcd\x2b\x54\xba\x71\xd5\x08\x3b\x4a\x1f\x07\xdf\x45\x56\xb8\xe8\xde\xc4\x9e\x52\x2a\xd2\x3e\xcd\x2c\x7e\x5e\x7f\x3e\x77\x7e\xd1\x78\xee\x6a\x7e\x01\xbe\xb0\x10\x17\x21\x13\xb5\x95\x52\x56\x1e\x37\x08\x80\x1f\xb3\x14\xc8\x54\x5c\x83\xf1\xce\x2a\xdc\x0e\x45\xae\x3f\x9f\xf7\x08\x1f\xb0\x81\xff\x2b\x34\xf5\x74\xd2\xc8\x29\x7a\x15\x06\x4f\x51\xc0\x6e\x98\x4a\x6c\xdb\x8a\xfb\xfe\xed\xb7\x76\x92\xf6\xd7\xdf\xf5\x7f\x1b\xe5\xf6\xfc\xdd\xdf\xec\x7e\x2b\xdb\xa0\xfe\x36\x76\x4d\x0b\x89\xec\xff\x76\xed\x12\x3d\xbb\x34\xd0\x7f\x73\xf5\xad\x98\x30\x56\x30\xbd\x96\x70\xe9\xcf\x53\xc4\x79\xf8\xb6\x62\xdf\x7b\x3b\x25\x80\x29\xd8\x88\x12\x6a\x98\x00\xd6\xe0\x63\x38\x84\x34\xd8\xdd\x95\x72\xb5\xf3\x3f\x02\x0b\x03\x86\x9b\xf5\x88\x91\x12\x0e\x3d\x12\x96\x33\x41\x98\x2f\x7f\x89\x6b\x05\x70\x50\xe7\xf7\xe6\xb9\x9d\x1d\xd6\x42\x38\x44\xe4\xda\x79\xc0\xdc\x7e\x21\xa4\xf9\x45\xd8\xfe\x46\x61\x6e\x3a\x97\xdc\xe7\xf4\xb6\xe7\x51\x60\x91\xc4\x90\x65\x7a\xbc\x20\x39\xd7\x86\xde\xb2\x01\x19\x59\x6e\x16\x5f\xae\x21\xf4\x04\x81\x5c\x90\x2c\x25\xa5\x30\x3c\x83\x5f\xab\x71\xec\x94\x63\x2e\x37\x9c\x10\x5d\x42\xc5\xf0\x42\xb1\xbe\xe7\x9b\xae\xd5\x12\xc5\xa9\xd6\xd2\x0b\x9b\x3d\xa3\xa8\x6c\x14\x29\x74\x05\x78\x50\xe1\xd0\x6b\xc9\x1b\xcc\xce\x53\x8a\xa4\xe2\x95\x00\x4c\x3d\x20\x57\xc0\x1e\x33\x7f\xc3\x8c\x7a\x8f\xb3\x87\x0a\x96\x30\xad\xa9\x5a\xf4\x20\x57\x3a\x0f\xf9\xb5\x9d\x03\x10\x10\x8f\x9c\x0a\xcc\x54\xae\x58\x22\x85\x36\xaa\x4c\x0c\x96\xae\x1b\x2b\x79\xcb\x44\xf0\x3e\x0c\x84\x29\xb8\x81\x55\xee\x38\x70\x7d\x26\x49\x32\xa3\x62\x1a\x95\x7e\xc9\x69\x0a\xb0\xff\x36\xc8\x55\x7e\x3d\x16\x02\x74\x62\x45\x19\x6e\x00\x14\x63\xcb\xb0\x82\x55\xf7\xcf\x82\x78\xc5\xbd\x57\x99\x5d\xed\x92\x78\xb6\x85\x76\x75\xa2\x5f\xa4\xa3\x8d\xb0\x0f\x52\xc2\x9e\xdd\xc8\x72\x66\x68\x4a\x0d\xdd\xc1\x95\xec\x7d\x55\xaf\xce\x97\xac\xc7\x9a\xa1\xe1\x9e\xd3\x71\x3b\x2f\xe0\xc9\x82\xc7\xe1\x52\x70\x12\x67\x1e\xf2\x10\x7f\x6d\x2c\x4e\xb9\x7b\x07\xf4\x10\x03\xf1\xc9\x17\x04\xb3\xc3\xfb\xd1\x90\x5c\x54\xd5\x0e\x2b\x72\xd2\xee\x56\xab\xa3\x41\xd7\x82\x7e\x07\x18\xdd\x54\x57\x6f\x49\xdd\x5d\x6c\xa5\xa0\x83\x5c\x82\x09\xc3\x15\x8b\xa3\xd3\x1c\xe8\x4a\x81\x48\xde\x00\x22\x40\x79\xca\x8c\xae\x1c\x5e\x90\x0e\x5b\xe2\xe2\xf8\x9d\x53\x7f\x81\x48\x3b\xc0\x3a\x0d\x72\xb5\xc4\x85\x60\xd7\xd2\xd1\x59\x4b\xf9\x1f\x04\xae\xbb\xd8\xb0\x31\x43\xff\x7b\x99\x76\x31\x7b\x37\x12\xdb\x57\x43\x54\x5e\xa0\xe8\xcf\xab\xc1\x8c\x80\xdf\x80\xcb\x2f\x5d\x8b\xb1\x43\x22\x37\xa3\xf3\xdd\x6d\x5e\x95\x24\xd6\x0f\x49\x81\xe1\x73\x7d\xf8\x5c\xff\x75\x7b\xdb\x60\x17\x87\x12\xff\xb4\x76\x2c\xa9\x7f\xa4\x93\x21\xd6\x92\x94\x51\x47\xeb\x69\x33\x63\x79\xa0\xf6\xee\x3a\x32\x5c\x01\xbb\x90\x09\xc6\x2d\x9d\x38\x25\xbf\xa8\xf1\x77\x27\x47\x05\xad\x0c\x3d\x7d\x8f\xbc\x9a\x36\x70\x9b\xe0\x03\xd2\xeb\xcd\x8f\x1b\x83\x81\x60\xb1\x5a\x63\xf1\x1e\xc5\x41\xd8\xb3\x82\x99\x02\xbb\x9c\x0f\x64\xb0\x88\xa5\x64\x96\x31\x05\x4b\x70\x6a\x5a\xe3\x3a\x1e\x72\x89\xa2\x71\xb8\x17\xd4\xe1\x20\x5d\x0a\x76\x17\xc4\x08\xaa\x31\x6b\x8b\xbf\x3a\x63\xae\x0a\xdd\xda\xf1\x82\xd7\xf3\x99\x58\xe0\xd4\x2f\xc2\xb6\xac\x13\xce\x7b\x71\x45\x37\x98\x0b\xcd\xee\xe8\x42\x03\xc6\x57\xda\x42\xf8\xbe\xcb\x90\x56\x0d\xfc\x91\x4d\xb0\x77\xeb\xab\xb5\x9d\x2e\xd7\x76\xb9\x5e\x83\xb8\x4b\x2e\xda\xf8\x32\x55\x1d\x36\x56\xe1\x68\x3e\xbb\xdc\xc7\x81\xc3\x0b\xdc\xc3\x77\xbb\x5c\xa9\xa7\x3c\xbd\x1e\xc2\x10\x5e\x1a\x9f\xc2\x1f\x9e\xd7\x84\xdb\x87\x31\xb3\x58\x5d\x45\x54\x03\x86\xc4\x7d\x57\xb8\x24\x54\xa8\xf5\x2d\xa4\x45\x75\x06\xe8\x50\xb6\x4b\x31\x70\x29\x81\x2f\x0e\x20\xed\x3f\x15\x0b\xc7\xc3\xcd\x8c\xab\xb4\x5f\x50\x65\x16\xa8\x9e\xf6\x6a\x5f\x0b\xee\xf9\x9d\x16\xbe\xe3\xbd\x50\xbb\x8c\xc3\x6b\x21\x0c\x8b\xf7\xa5\xf7\x9c\xe1\x7f\x2d\x5c\x1f\x63\x3d\xed\x03\x00\x56\xae\xe7\x2a\x8a\x87\xf7\xba\xe0\x93\xad\x27\x8d\xc9\xc7\xae\x1c\xa3\x71\x6b\x8b\x84\x3f\xae\xfc\x24\x63\x07\xea\xc0\xd1\x41\xf9\xb1\x13\xe8\x59\x9d\x93\x56\xa5\xba\x23\xb3\xa1\x93\x0a\xbc\xfb\x8d\x2b\x14\x24\x16\xce\x18\x14\x7f\x2b\x1e\x20\x9c\x0b\x72\x24\xa4\xc0\xb3\x82\x6d\x8f\xd1\xfb\x68\x8d\xb5\x0b\x9a\xb8\x0a\x6f\xf5\x02\x9b\xd1\xd9\xf4\x6c\x81\x8b\xd4\x6e\x16\xd0\x6a\xd0\x87\x74\x99\x24\x8c\x05\x0d\x3a\xae\xf7\x52\x9d\x65\x37\x65\x5f\x29\x52\x4b\x48\xe5\xa2\x0d\xcd\xb2\x4a\x73\x75\xe0\x92\xc0\xd9\xbc\x71\x31\x62\x78\xb5\xd0\x1c\xa7\xc4\x43\x0d\x72\xf4\x98\x29\x45\x82\xb7\xff\xdc\x2c\xfc\x0c\x62\x0e\x04\xdd\x40\x65\xd0\xa8\xd0\xf2\x09\x5a\xb2\x22\xd1\x3f\x00\x13\x88\x91\xab\x80\x5e\xe7\x45\x2e\x6d\x83\xa5\x3c\x63\x9a\xdc\xde\x51\x95\x42\x25\xdc\x82\x1a\x8e\x89\xb8\x7b\xb5\x61\x8f\xa2\x39\x40\x1d\xfa\x18\xf9\x8e\x83\x82\x01\xe5\x35\x64\xe3\x33\x84\x96\x46\xe6\xd4\xf0\x04\xd4\x56\x3e\x89\xec\x92\x79\xc8\x5b\xd8\xa8\xda\x07\x74\x35\xd4\x7f\xbf\xc1\xbb\x1e\xc5\x88\xb9\x93\x84\xe7\x56\x26\xa0\x50\x80\x62\x12\x62\x8c\xbc\x11\x75\xd3\x4c\xad\xe0\xf3\x1d\x98\xb0\xa3\x56\xa8\x10\x5b\x75\x49\xc3\xf0\xc1\x46\x1a\x8c\x83\x2e\x48\xa7\xd7\x60\xd9\xc4\xf7\xb2\x58\x6d\x67\x1b\x21\x6b\xcf\x6e\xd0\x1d\xb3\xb2\x80\xde\x88\xb2\x7a\xb0\x6a\x4e\x58\x14\x56\x93\x94\xeb\x46\x65\xe7\xa3\x54\xc9\xa2\x70\xe6\x90\xfc\x78\x79\x4e\x70\x33\xa1\xe6\x4c\x47\xe5\x8b\xd1\x12\x3e\x65\x22\xd4\xdf\x76\xd9\x2e\xe0\xf4\x36\x3f\x02\x9e\x5d\x24\x4a\x7e\x76\x74\x96\x15\x33\x7a\x4c\x3e\xb9\x42\x3d\x01\x7f\x83\xdf\x5e\x2b\x89\x09\x0d\x2c\xde\xa2\xf9\x22\xea\xb4\x7c\x5e\x44\x9d\x17\x51\xe7\xdf\x5b\xd4\x09\x0e\x63\xbb\x8a\x39\x1f\x83\x97\x64\xa3\xac\xb7\xf7\x38\xa8\xdc\x28\x1f\xde\x6e\x11\xbe\xf5\xc0\x14\x70\x37\x6a\x83\xae\x13\xf7\xc0\x9c\xc3\x77\xe8\x7c\x51\x55\x78\x36\x91\x3f\x48\xe5\x8b\x62\xa5\x8d\xd2\xb0\x08\xf4\x8e\x09\x75\x86\x75\x2d\xb6\xf4\x04\xab\x8a\xf4\xc3\xb0\xfd\xca\xfd\xa3\x45\x6a\xf1\xf8\xd9\x09\xea\xe4\x1e\x61\x94\xf1\xf3\x8c\x3d\x40\x1a\x8b\xed\xee\xe3\x48\xee\xe9\xe7\x48\xee\xe3\xeb\x48\xf6\xe9\xef\x48\x82\xd7\xf4\x7d\x4e\xcc\x47\xef\xaf\xdd\x38\x33\x8e\x38\x6d\x3a\x33\xb5\x68\xfd\x30\x0e\xd7\xbe\x62\x9d\xbb\xed\x0b\x67\x00\xec\x65\xb1\xd7\xad\x3b\xad\xa0\xf8\xe0\x95\x1e\xfb\x12\x72\xe3\x46\xbc\xbe\x2a\xdf\x6c\x24\x5c\xff\xe7\x05\xa6\xd9\x81\x53\xd7\x77\xbe\x51\x5e\xb1\x78\x39\xc1\x2f\x27\xb8\x6d\xff\xa7\x3c\xc1\xe8\x57\xdc\xc5\xed\xbd\x2e\x57\xe3\x25\x1e\xf9\xa1\x64\x6a\x41\xe4\x9c\x45\xfe\x34\x90\x04\x58\xf3\xd4\x79\xa4\x38\x9b\x43\x7b\x59\xf6\x11\x79\x3e\x58\x34\x2e\xbf\x58\xc9\x08\x22\xc4\xee\x41\xcb\x9a\x43\xd5\x83\x80\x11\x5a\x1e\xe8\x9e\x78\x59\x2a\xa2\x07\x2e\x3b\x58\xf5\x06\xf4\xfd\xb3\xab\x8b\xdd\x14\x80\x6e\xf7\x3b\x64\x97\x3b\x9e\xa5\xc5\x9f\x6d\x58\x20\x02\x22\xfc\x52\xaf\x7f\x14\xb4\x74\x72\xcb\x16\x3d\x77\x25\xec\xf2\x9a\xfb\xc6\xe8\xd9\x50\x4f\xc6\xd9\x36\x09\xc4\x2a\x00\xed\x40\x15\x77\xd3\xaa\xf1\x69\x9f\xbe\xb1\xde\xcb\x03\xa1\x2b\xf1\xdd\x99\x6c\x77\x4a\xf3\x18\x3f\x35\x54\x70\xa9\x49\xc1\x71\x0e\x70\x02\x52\xda\x79\xa7\xe2\x80\x06\xe0\x48\x0d\xd4\xa2\xeb\x26\x92\xdd\x55\x43\x7c\x3c\x60\xef\xbd\xd4\x80\xa6\x35\xaf\xd8\x5b\xb6\x38\xd4\x2e\x1e\x4f\x0a\x3d\xe3\x85\xcf\xa2\x0e\x94\xc0\x61\x2e\xf9\x0c\x57\xe5\x7e\x08\x3c\xf3\x43\xd1\x23\x57\xd2\xd8\xff\x5d\x82\xd7\x0c\x1a\xf2\x24\xd3\x57\xd2\xc0\x9b\x47\x07\x16\x4e\xf7\xde\xa0\x72\x36\x3c\x0e\x16\x38\xf4\xee\x82\x58\x08\xef\x8d\x01\x20\x71\x17\x90\x01\xac\x5c\x93\xa1\x20\x52\x79\x98\x18\x9f\x76\x57\xbb\x21\xbc\xcd\x25\x32\x98\xae\x18\xc3\x81\x52\xaa\x1a\x24\x37\x0c\x17\x6c\xaf\xdc\xff\x02\x36\x19\x30\x56\x07\x17\x12\x48\x1e\x4b\x0d\x9b\xf2\x84\xe4\x4c\x4d\x21\xf2\x32\x99\xed\xbe\x41\xdd\xe9\x36\x3e\x3b\x51\xef\xf8\xc3\x9d\x31\x03\x58\xdd\x3b\x70\xe2\xb9\x2f\xc3\xc4\x51\x90\x45\xe4\xb4\xb0\x48\xf1\x0f\xcb\x09\x60\x5f\xfe\x05\xc9\x9e\xf5\x80\x9c\xf9\x0a\x9c\xf1\x6f\xce\xd0\x16\x0f\x63\x47\xb0\x72\xfc\x0f\x25\x9f\xd3\x8c\xa1\x6b\x1b\x15\x21\x2f\xa6\x9c\x2c\xb1\xe9\x9e\xcb\xf8\x6c\xa9\x54\xb8\x38\x39\xb8\x65\x8b\x83\xde\x12\x22\x1d\x0c\xc5\x41\x15\xfe\x5c\x43\x9d\xc0\xd0\xc0\xa6\x7e\x00\xbf\x1d\xec\x9b\xb3\x3f\x91\x38\xbf\x03\x96\x38\x23\xd0\x79\x46\xb5\xee\x16\x39\xba\x3e\xff\xd8\x28\x1a\xb3\x8a\xe0\x71\x0e\x8b\x09\x3a\x44\xed\xcf\x56\x05\x7e\xf4\xdd\x9d\x6b\x3a\x41\x69\xee\xca\x87\xb4\x4f\x7d\xd0\xa4\xaa\x61\x80\x10\x28\x71\x17\xc7\x9a\x55\x77\x92\x6b\xe0\xf5\x19\x6e\x3d\xe4\x24\xce\x97\xc8\x35\xa8\xb8\xdc\x87\x4e\x08\x69\x08\x17\x49\x56\xa6\x98\xe7\x11\xba\x82\x82\xdc\x55\xa4\xdf\x01\x38\xf7\x40\x9e\xcf\x61\x00\x2f\x8f\xf8\xdb\xcf\x25\x9f\xd5\xe6\x35\x15\x5c\x0d\x86\x1b\x1f\x84\xd5\xbe\xd7\x3a\xd9\xe2\x21\x58\x4f\x67\x79\x5e\x97\x31\xde\xf2\xb1\x62\xe4\x7c\x46\x85\x60\x59\x14\x2f\xea\x0c\x19\xa1\x84\x13\x08\x1e\xae\x70\xd3\x61\xbd\x72\x93\xa7\x63\x22\x44\x27\xef\xbd\x7a\xed\x8f\xbb\x90\xd2\xde\x2a\x61\xbb\xac\x86\x33\x79\x47\x52\x49\xee\x20\x97\xff\xdc\xb2\x23\xb8\x89\xd4\x9e\x91\x45\x33\x05\xdf\x80\x44\xe6\x85\x92\x39\xd7\xde\x03\xdc\x6d\xdc\x5e\x03\x2c\xb3\xb2\x45\xde\x9c\x75\x09\x57\xde\x9e\x13\x43\xd5\x94\x19\x3b\x0c\x11\x65\x3e\x66\xad\xc3\x3f\x1f\x22\x61\xd7\x73\xaf\x10\xb5\xdf\x22\x4f\x08\xfa\xef\xbe\xbb\xea\x5c\x0a\x76\xd5\x0e\xde\x49\x95\xa5\x77\x3c\xc5\x4b\x2f\x4d\x8e\xec\xc0\xc7\xcf\xbf\x6e\xeb\xdd\x1d\x4f\xef\x07\x00\xef\xd9\x63\x01\x40\x00\x02\xae\x72\x11\x87\x9c\xd2\xf0\x81\x63\x72\xc9\x31\x36\xc6\xfe\x85\x59\x5b\xf2\x31\x17\x55\x14\x56\xd8\x0c\xa0\xab\xf6\x3c\x78\x6d\x42\x33\x83\x51\x0d\x10\x18\x20\xcd\x8c\x68\x9e\x97\x99\xa1\x82\xc9\x52\x67\x8b\xd6\x68\xf1\x34\x40\x9e\x64\xec\x0b\x62\x71\x17\x7e\x15\x3a\xd5\xf9\xd6\x14\x63\xbf\x3c\xcc\x97\x18\x57\xe5\x2e\x94\x9e\x04\x26\x16\x82\x65\xd8\x17\x96\x38\xcf\xd6\x22\x2b\xa7\x7c\x8b\xf3\xfe\xbf\x59\x8a\xef\x2a\x89\x72\xa9\x59\x15\xd9\xde\xb6\x88\xc9\xd3\x65\xe4\x7e\x50\x66\x7d\xb3\x3a\xed\x76\xca\x0a\x26\x52\xc8\x08\x16\xe1\x2a\x4e\x77\xaf\xb0\x72\xd9\xb5\x76\xa7\x50\x97\x5f\x8c\xa2\x96\xdc\xe4\x10\x54\xe9\x92\x75\xf1\x09\xa1\xa2\x3d\xe9\x78\x1e\x59\x70\xc9\xbf\x1d\x8f\x7e\xf0\x22\xc9\xf7\xcb\xbd\x8e\x54\xd4\xa1\xbd\xae\x3b\xac\xae\xc8\x91\xee\xbe\x12\x7b\x96\xde\x37\x57\xba\x5e\x91\x1e\xba\x31\xab\x97\xe2\x91\x3f\x8a\xc4\xe9\x13\x88\x49\xed\x92\x4e\xe8\x2d\xf6\x68\x68\xb6\xee\x65\xb3\x18\xf1\x06\x4d\xd6\xe1\x6d\x44\xd2\x21\x77\xa7\x1b\xc8\xc5\xd5\x10\x6d\x61\x59\xb9\x70\x95\x42\x6c\x23\x56\x0f\x91\x0f\x9b\x1a\xaa\x99\x69\x67\xd5\x58\x76\x4b\xf3\x9c\x1e\x47\xc1\x04\xec\xe0\x10\xed\x03\x33\x49\xff\x77\x4e\x26\x10\xb5\x96\x56\x1a\xf0\x00\xf1\x19\x87\x58\xb8\xa6\xc5\x31\x52\xbb\x0d\x09\x35\xad\xab\xc5\xb4\xa2\xf7\x6e\x06\x9f\x3e\x75\x2e\x29\x6a\xbb\x34\x56\x3c\x08\xf9\x06\x4a\xc1\x7f\x28\x63\x49\x1d\x72\x33\x84\x35\xba\xf6\xfb\x5a\xc8\x34\x61\x95\x89\xe8\x82\xeb\xdb\x2e\x49\xb3\xbe\x39\xbf\xac\x77\xae\x23\xfc\x37\xe7\x97\xc4\xbd\x6d\x65\xc5\xe9\x62\xc6\xb9\x6f\x4e\xa7\x69\xc2\x2a\xd3\x68\xca\xf5\xed\xa3\x17\xec\x2e\xd2\xab\x6d\x7e\xc6\x8f\x6d\x65\xf2\x79\x45\xa2\xe4\x37\x0b\x59\x92\x3b\x17\x49\xef\x84\xda\x1b\x5e\x9c\x92\x4b\xa1\x4b\xc5\xaa\xdb\xcf\xa6\x7c\x6b\x39\xe9\x73\x2a\xec\x7d\x2f\xdc\x78\xce\x66\xae\x82\x2a\x03\x92\x6d\xe7\x3c\x62\x90\x2a\xdf\x75\xf6\x4b\xd8\xb2\xf5\xc3\x89\xf7\x41\xeb\xb9\x28\xe1\x90\x6c\xcb\x37\xb2\x9b\x1d\x25\xc6\x88\xb7\xf7\x6d\x48\x4d\x43\x4e\x52\x36\x3f\xd1\x29\x7d\xdd\x83\xcf\xf8\x50\x56\x53\x9b\x13\xd5\xe4\xe0\xf5\xc1\x80\x8c\x78\xce\x33\xaa\xb2\x45\x2d\x37\x70\xd5\xce\xb2\x00\x3f\x20\x5c\x66\xbd\x3a\x20\x47\x52\xc1\xc8\x09\x15\x24\x63\x3e\x4e\xc6\x1d\xa8\x05\x8a\x80\xc7\x8f\x4d\x45\xc8\x83\xda\x08\x91\xa0\x74\x45\x83\x4f\xc8\x6e\x6a\x69\x50\x2e\x2a\x8a\xcd\x85\x25\xe3\x03\xf2\x69\x55\xe9\x6b\x38\x1b\xbe\xc5\x53\x81\xf2\x41\x75\xb3\x7b\xd6\xcd\x5f\x52\xe8\x9e\x0e\x4c\xdb\xb5\xba\x29\x37\x1f\x59\x21\x3b\x09\x00\xd8\xa5\x61\x09\xe3\xc6\xbe\x90\x9a\x43\xbe\x4c\x6a\xa0\xfa\xac\x32\x3c\x29\x33\x6a\x65\x62\xb4\x83\x0d\xc8\xc5\xe5\xf5\xc7\xcb\xf3\xb3\x9b\xcb\x8b\x53\xe2\x47\xe2\xb1\xb4\x36\x20\x37\x71\x16\xa1\xc8\xe5\xd5\xa5\x6a\x09\xdf\xea\x39\xe2\x43\x45\x95\x86\x10\x72\x43\x50\x41\x86\x82\x9b\x2a\x4b\x2f\x3a\x69\x65\x52\x38\xb7\x2b\xdb\xdb\xd9\xe1\xa6\x1c\x5d\x27\x84\x1b\xcc\xfe\x5c\x1f\x0d\x4e\x07\x66\xfc\x0c\x53\xd9\xa2\xc5\x3d\x80\xe4\x50\x01\x77\x5f\xb2\xbb\x4f\xcc\xd9\xf1\x78\xdc\xa0\x81\xbd\xca\x8d\x8a\x14\x3f\xa4\x03\xf7\x59\x51\x56\x14\x4a\x26\x96\x97\x1c\x0e\x0e\xbd\xa0\x90\x2d\xa5\x7e\x0f\x83\xc6\x89\x9f\xea\xb8\x35\x20\xe4\x83\x77\x61\x86\xa8\xd5\xd5\x59\xe4\x31\x95\x40\x94\x8b\xbc\x81\xa1\xbe\x34\x40\x39\x8e\x3f\xea\x32\x45\x4d\xf9\x9c\x09\x5c\xd8\x7e\x09\x92\xff\x7c\x47\x98\x7f\xac\xe6\xfd\xe9\xe3\xbb\xfd\x4e\x09\xcf\x59\xc7\x09\x9d\xcb\x3c\xc7\xfc\x41\xb3\x10\x7d\x56\x05\x90\x85\xd3\xbe\x37\x85\x05\x33\x21\x4d\xb6\x20\x75\x83\x4e\xf9\x4e\x0d\x05\x25\xbc\x76\xde\xf8\xa2\x92\x53\xbb\xa7\xf9\x75\x49\xb7\xb4\x4f\xa9\xe1\x48\xf6\x49\x98\xf1\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\x7d\x74\x92\xc1\x44\x5a\x48\x2e\x8c\xde\xae\x96\x6c\x2b\x6a\xd2\x9e\xac\x84\x8f\x76\xe5\xba\x97\xbe\x63\xec\xe2\xe0\x47\x8b\x72\x95\xa5\xcc\x50\x9e\xe9\x68\x1f\x8d\x2c\x64\x26\xa7\xab\x73\xfe\x76\xd8\xa0\x9f\x61\xe6\x91\x3e\xed\xdb\x9d\xdf\xaf\xbc\xde\xa6\x54\x43\x1d\x1e\xbe\x34\x03\xe4\x18\x0c\x6b\x0d\x72\x30\x54\x54\x78\xa6\xcb\x7d\x10\xc1\x6b\x09\x06\xa8\x0d\xc2\x21\xf6\x69\xdc\xaa\xbc\x68\x51\x99\x94\xb6\x12\xd9\x43\x83\x6e\xbb\x30\x66\x69\xd0\xf6\x5a\x38\x75\x98\xfd\xc1\xf5\xa9\x13\xb9\x42\xb1\x7e\x48\xe4\x03\xd5\x3b\xa4\x8a\xb8\x6b\x4c\xf3\xbc\xe1\xc5\x9b\x69\xb0\x55\xb6\x68\x1a\x60\x2a\xd9\x27\x58\xad\x30\x0e\x3d\xcb\x16\x55\x6a\x40\xa7\x0a\xd3\x29\x26\xe8\x51\xce\x7e\x5b\x28\x3e\xe7\x19\x9b\x42\x12\x50\x2e\xa6\x51\x2d\x45\x1f\xb1\x0e\xc9\xe1\xd9\xd2\xbc\xec\x56\x69\x13\xa7\x7e\x06\xbc\xb8\xfa\x70\x03\x89\x65\xe1\x52\xf0\xde\x02\xb6\xfd\x20\x14\x1a\xe9\xf7\xfb\xa0\xf7\x1f\x7d\x6f\x65\xc5\x34\x3b\x26\xdf\x31\xf7\x1d\x09\xc9\x6f\x15\x54\x9b\x99\xc9\x90\x7d\x14\xe6\x5a\x41\x16\xd0\x11\x2f\xcd\x5d\xab\x13\xdb\xd2\x0a\x46\xc8\x6e\x6a\xed\xa1\xb8\x26\xa6\xf3\xc3\xfb\x9e\xc7\x97\x2b\xf7\x48\xfa\x77\xa6\x72\xde\x2a\xba\x0a\x3f\xc3\x8d\x4c\xe1\xe8\x21\x25\x7a\x91\x67\x5c\xdc\x56\x19\xa3\x26\xd2\xe2\x10\xfa\xe8\x73\x71\xeb\x31\x56\x31\x9a\xad\xa7\x94\xbb\xe0\xc7\x5e\xa9\xa4\xd9\xc1\x78\x77\xb3\x28\xf0\x2e\x3c\x1c\x7b\x77\xd5\x1b\x93\xb8\x83\x83\x67\xb7\x5e\xae\xbb\x55\x5a\x3f\x1c\x8e\xce\x47\xb5\x2a\xa1\x56\xa7\x83\x77\x8f\x69\x5c\x5e\xc7\x12\x60\x39\x4f\x28\xd9\xf1\x1f\xb6\xdd\xd4\xf6\x49\x56\x6e\x6f\x83\x6e\x3e\xd7\x52\x19\x9a\xed\x89\x08\x24\x33\x5a\x9c\x95\x66\x76\xc1\x75\x22\xe7\xac\xb3\xaa\x73\x37\xc3\xac\xbd\x3e\x61\x1c\xf7\x9b\x8e\xa3\x91\xf3\x3f\x9c\x5d\x13\x5a\xda\x5d\x34\x2e\xad\xe4\x5e\xaf\xb8\xfd\xfc\x47\xe8\x50\xbf\x97\xd9\xbb\xb1\x1e\x7c\xee\x2f\x17\x02\x7b\xbc\x10\x80\x33\xfe\x9c\x2f\x01\xb8\xe0\x86\x53\x23\x5b\xd6\xb2\xaa\xeb\xef\xa5\x36\x32\x77\xe8\x39\xf4\x03\xc1\xad\x2c\x30\xdc\xda\xd8\xf5\x1c\xfd\x20\x68\x03\x70\x86\xc2\x8a\xc5\x34\x61\x0d\x0f\xc0\x1e\x64\x6e\xc4\xb1\x79\x68\xf3\x5b\xe7\x99\x09\x29\x9f\xb2\xdf\x9d\xd6\x32\x69\x2f\x15\x42\xf0\x46\x85\x2a\xb9\xfe\x5e\x2d\x31\xfc\x87\xae\x27\xdb\x99\xbd\x70\x55\xff\x5b\xd2\x0c\xa1\x71\xb5\x6f\x1b\x51\x1d\xb2\x1d\x27\xe9\xf7\xd3\xc3\xfc\x2a\x68\xcd\xa5\xc6\x6c\x51\xd8\xc2\x28\x2a\xb4\xdd\x88\xba\x6e\x74\xe8\xae\x76\x0e\xc9\x91\x49\x8a\xd6\xe5\xda\x1f\xc8\x33\x1b\xa7\xea\xe0\xfe\x2e\x78\x64\xb7\x9d\xd5\x83\xdc\xb6\x00\xee\x76\x35\x6d\xd4\x16\x82\xcc\x96\xbc\xe3\xda\xf8\xb4\xf8\xf0\x82\x6b\x97\xd3\x15\x24\x9d\x6b\xab\x3a\xf1\xe2\xaf\x34\x4d\xd5\x29\x72\x12\x5f\x52\x57\x81\xbc\xe3\xf3\x2e\x51\x11\xee\xe3\x8e\xcc\xa2\x70\xa9\xd9\x6e\xce\xaf\x09\x56\xc5\xf8\xcd\xaf\xb0\x9c\xe7\x7f\xfe\xf2\x57\xaf\x5a\x6f\xe8\xd3\xb9\x3f\xef\x68\x39\xd8\xfb\x8d\xcd\xb3\xf0\x9a\x03\x71\x01\xfd\xe5\x80\x1e\xba\xb3\x8b\x78\x64\x37\x35\x50\xe9\xdd\x84\x8a\x17\x0f\xb3\x27\xf5\x30\x23\x21\xe8\x01\x69\xc2\xfd\xa9\x0a\x12\x94\xeb\xe7\x47\x50\xb6\xc2\x62\x3b\xd6\xd4\xb1\x05\xcf\xaf\xd5\xef\xa2\xdb\x27\xf0\xb9\xbe\xb8\x1a\xfd\xf5\xdd\xd9\x9b\xcb\x77\x30\x4b\xe7\x57\x65\xd1\x80\x8b\x9d\xfd\x88\xda\xa3\x55\x1b\x4d\x70\x3b\x30\xba\xdd\x73\x5c\xbd\x1d\x35\x14\x65\xfb\xa6\xe3\xe5\xc6\x7d\xa5\x65\x31\x69\xb5\xf6\xc7\x35\x5d\x41\xd9\x08\xa6\xf6\x17\xe2\xb0\xb3\x85\x2b\x4a\xc9\x54\x53\x86\xec\x4e\xe1\x0c\xef\xad\xaf\x6c\xdd\x01\xf2\x0c\x8c\xf8\x76\xbd\x08\x83\xbd\x9b\xef\x1f\x08\x56\x6d\x59\xbc\xea\x1e\xfb\x72\x38\x82\x5e\xfe\x92\xc7\x1e\x52\xf4\xc8\x51\x96\x5e\x5b\x4a\xcd\x74\x48\x72\xff\x4c\x31\xa5\x58\x95\x11\xb7\x0b\xf5\x5a\x99\x52\xb7\x56\x0f\xaa\x76\xb1\x51\x8b\x18\x58\x97\x43\xda\xdf\xed\x53\xa7\x5e\xea\x82\x26\x7b\xcd\xfc\x58\xbd\xc2\x37\x10\x52\xfd\xf8\x04\x10\x3e\xbb\x47\x87\xd2\x30\x5e\x57\x44\x3e\xf7\x1d\x9b\x81\x5c\x9d\x76\xc8\xd7\x53\x28\xa4\x0f\x92\x8b\x23\xbe\x9e\x78\xfb\xc8\xa3\x50\xcf\xef\x76\x54\x5d\xf6\xad\xb6\x14\x33\x69\xa4\xd8\xd9\x49\xfc\x7a\x45\xf7\xfa\x39\xc6\x16\xe7\x55\x91\x90\xa8\x42\x1f\x78\x18\x06\x83\xbe\x15\xe3\x3c\x97\x90\xc2\x9b\xf6\xeb\x86\xfd\x47\x97\x3c\xd2\xe1\xc5\x9e\xce\xdc\x8f\x29\xf8\xb0\xab\x09\x76\xaf\x2e\x14\x69\xe7\x88\x8b\xe1\x85\x93\xbb\x7c\x54\x85\x76\x68\x47\xd6\xe3\xdd\xde\xf8\xa2\x54\xe6\x4e\xaa\xee\xa1\xc6\xd7\xb5\x8e\x8d\x5b\x7d\xf7\xdb\x52\x34\xd1\x73\x3c\x23\x38\xc7\x27\x3e\x27\x23\xb8\x30\x6d\xe4\x8a\x6e\x9e\x8c\xe0\xc5\xfe\x00\x87\xe7\x69\x0f\xcd\x8e\x5c\xe8\x61\x43\x52\xf7\x2a\x78\x7b\x2c\xeb\xb8\xc2\xcf\xae\x9b\x33\x10\xd8\xbd\xa9\x88\x04\x0d\x87\xd0\x0d\xbf\x37\xa2\xa0\x24\xd6\xed\xeb\x40\x0f\x86\x86\xe5\x58\xe0\x97\x66\x99\x85\xa5\x14\x71\xda\x60\x17\x76\xda\x23\x98\x79\x37\xa7\x85\xaf\x96\x2c\xef\xc4\x1d\x55\x29\x39\xbb\x1e\xee\xe7\xe8\x77\x70\x2d\x46\xfc\x69\x97\x09\xaa\x5e\x56\x51\xa6\x8c\x8c\xb9\xd1\x55\xc1\x33\x66\x62\x6d\xd0\x92\xb7\x70\x47\x64\x0f\xa9\x3d\x90\xee\x7b\x11\xf7\x13\x44\x26\x86\x66\x8d\x02\xf4\xaf\x5e\xbd\x42\xe3\xd5\xab\x5f\xff\xfa\xd7\x58\x84\x26\x65\x09\xcf\x97\x1b\x42\xab\xff\x7a\xfd\x7a\x40\xfe\x78\xf6\xfe\x1d\x14\xc4\x2b\x8c\xc6\x74\x17\x38\x32\x96\xe4\x8e\x3a\xeb\x1e\xf9\x9f\xd1\x87\xab\xaa\x94\x46\xfd\x57\x57\xcd\xd8\x2d\x6f\x40\x2e\x22\x17\xa0\xd8\x3c\x45\xcd\xcc\xd5\x7e\x31\x84\x4e\x26\x58\xe6\x71\xec\xab\x8c\xe2\x91\xf2\x91\xcd\x50\x92\x19\x6b\x34\xd8\xed\xcf\xc0\x37\xc9\x2a\xd2\x68\xcc\xf3\xc1\xf5\xe8\x6a\x05\x63\x05\xfa\x07\x53\xe9\x61\x51\xef\x89\x86\x4a\x0d\x55\x2a\x38\xc5\xb4\x95\x29\x5d\xe9\x39\x1c\x2c\x4c\xdd\x4e\xe2\x29\xef\x60\x5a\x57\x10\xa8\x21\x96\x4f\x5c\x5b\x55\x07\xff\x1e\xaf\x15\xb7\x39\xc7\x3e\xd0\x9d\x48\x9d\xe7\x87\xd9\xe0\x5e\xb9\x90\xf5\x40\x2e\x08\xcd\x24\x54\x39\x0a\x5b\x5b\xf1\xa3\xa8\xca\xf8\xf6\xa5\x74\xce\xbc\xd7\x35\xfb\x2a\x52\xa1\xf7\xb4\x75\x8d\x93\xba\x49\x3b\x0a\xed\xa7\x63\x59\x1a\x7f\x05\x8c\x63\x62\x79\x3f\xac\x31\xdd\x21\x73\xe0\x0e\xc9\x06\x77\x49\x3a\xdb\x39\x6f\x65\x9d\xcc\xd7\x84\x80\x1e\x61\x34\x99\x91\x5b\xb6\xe8\x23\x61\x2a\x28\x44\xa3\x84\x2a\x52\x2e\xb7\x63\xfd\xbe\x24\x61\xa9\x95\x6c\x1d\xb0\xfc\x8d\x7a\x85\x45\x21\x9a\xc5\x8b\x8f\xda\x49\x3a\x2e\x67\xa4\x88\x14\x78\x9f\x98\x38\xaa\xc3\x1a\x92\x44\x62\x11\xe6\x7a\xd4\x85\x3d\x5f\x2c\xb5\xdd\xf4\xa6\x2f\x57\x6e\x04\x96\xd0\x39\x56\x55\x8a\xa5\xde\xae\xe8\xb0\x13\xdb\xe0\x83\xd4\xa7\xe2\x8d\x5c\x11\xa0\xb4\x99\x2b\x67\xe3\xda\x7a\x28\x05\x40\xd4\xa2\x42\x34\x33\xa5\x03\x0d\xd6\x4d\x2a\x45\xc6\xb4\x26\x1c\x56\x98\x53\x75\xcb\x7c\x52\x12\x9a\x0d\xc8\xb5\x9d\x64\xc8\x7c\x84\x39\x70\xe7\xe8\x46\x66\xcf\x68\x1c\xee\x62\x3f\x72\x38\x18\x1c\x22\x05\x5f\x11\xfc\xd2\x01\x33\x76\x4b\xa0\xba\x43\xe2\xd4\x46\x49\xe3\x42\x63\x1a\x58\x2b\xb5\x41\x9a\x63\x09\x51\x5c\x66\xe6\x39\x14\x6d\x9d\x7e\x67\x79\x39\x3b\x64\xfb\xdc\x35\x49\xf5\x2e\x29\xaa\x5b\x5d\x27\xd4\x9f\xdd\x53\x53\xef\x94\x98\x7a\xa9\xb6\xb2\xdb\x22\x77\xcc\xba\x67\xea\xbd\x47\x22\xe5\xbc\x53\x92\x4f\xff\xac\xcb\x09\x93\xb7\x91\xfa\x5c\xb5\xb2\x8c\xfd\xa8\xc4\xbc\xe1\x64\x55\xad\x2d\x1f\xee\x56\xc9\xc9\x81\x68\x5a\x08\x3c\xbd\x7c\xd7\xad\x3a\x07\xe9\x2c\xf0\x35\x9f\x2e\x02\x60\xf3\x69\x77\x29\xd7\x7c\x96\x4e\x53\xa0\xee\x45\xe4\x92\x0e\xa0\x34\x12\x32\x31\x9b\x70\xe4\x06\x50\xfe\xdd\xf1\x28\x6a\x65\x15\x2d\xb3\xd2\x84\xb0\x9c\x15\xac\x01\x06\xf5\x79\x9b\x31\x18\xd2\x37\x8b\x18\x05\xb0\x48\xa4\xbf\x5d\x79\x06\x3e\x3b\x1d\xe9\xae\x15\xc6\x7e\xb2\x8e\x1b\xf7\x80\xa1\x97\x19\x76\x86\xe3\xc8\x65\x43\xf0\x1e\xc4\x35\x19\x06\x9c\x37\x8c\x46\x01\xc9\x8b\x23\xae\x52\x4f\xe7\x95\xb5\x33\xac\xb8\x29\x3a\x2b\xc2\xd9\xf5\x70\x8f\x12\x7d\x34\xea\x4f\x5a\xa6\x07\xd3\x4d\xad\x6e\xca\x45\xb5\x72\x67\xe0\xb5\x14\xe6\xd9\x8b\x86\x4b\xd3\x7e\x6b\xe9\x62\x64\x56\x6d\x24\x65\x73\x25\xdc\x03\x05\x8d\x12\xb9\xf9\x0b\x3e\x38\xaf\xcf\x5d\x8c\x7c\x44\x91\x10\xe0\xd1\xa9\x00\xb4\x7f\x96\x4b\x90\xc1\x62\xc9\x08\x6a\x93\xa0\x8e\x17\x29\x8b\x85\x4c\x4f\x5d\xa9\x5c\x21\x24\x56\xfd\xd2\x3d\x2c\x6e\xa2\x7b\xa8\x04\x5a\x41\x21\xba\x96\x55\x91\x01\x7c\x67\xd1\x60\xa7\x32\x35\xf7\x29\x54\x63\x37\x10\x56\x7e\xdd\x75\x17\xc9\x3d\xeb\xce\x90\x88\x0b\xed\x56\xc9\xa2\x6e\xac\xc6\x91\x42\x1d\xeb\x64\xc6\x72\x8a\x49\xe1\xfc\xf2\x2c\x95\xb9\x53\xdc\x18\x86\x59\x7d\x98\xca\x35\x91\x93\x5e\xad\x42\xdc\xc1\xfc\xf5\xc1\x2e\xf5\x3c\xee\x59\x72\x85\x54\xbb\xb0\x07\x60\x5c\xd7\xa4\x33\x8b\xd7\xa0\x2e\x64\x90\xc9\x51\x34\x8c\x0c\x96\xc1\xcc\x11\x7a\x8f\xbe\xf0\xa7\x54\x91\x7a\x41\x48\x78\x51\x91\x5e\x54\xa4\xbd\xa8\x48\x11\x63\xf1\x04\xc7\x01\x2a\x56\x9b\xe2\x8c\x52\x5e\x77\xaa\xa2\x7a\xa2\x2c\x31\x16\x35\xbd\xd6\x24\x55\xdd\x8a\x66\x55\x9f\x43\xaf\x4b\x39\x3c\x2e\xcd\xa4\xff\x1b\xc2\x44\x22\x53\xdc\x7c\x3b\xbe\xd2\x06\x44\x9b\x4a\xfd\x88\xe7\x92\xfb\x6f\xc5\x96\x38\x18\x7b\xd7\xad\xdb\x89\x0e\xf8\xbb\xba\xb7\x7b\x62\xf0\x15\x5b\x0f\x41\xb0\x6e\xf9\x21\x46\xde\xf1\xf7\xea\x96\x10\x6b\x01\x03\x72\xfb\x32\xa7\xe4\x08\x5f\x0e\x92\xa2\xec\xb9\x06\x83\x9c\xe5\x52\x2d\x7a\xa1\x91\xfd\xb1\xd6\xcb\xb5\x38\x06\x99\x20\x29\x95\x55\xf6\xb2\xc5\x8f\x55\x3a\xf0\x00\x7a\x64\xe1\x20\xec\x53\xb7\x6a\x30\xf1\xd3\x70\xbf\x0b\x89\xae\x40\x95\xaf\xaa\xe3\x4c\x42\xf2\x3d\xdd\x0b\x2a\x2a\xbc\x65\x62\x4e\xe6\x54\x75\x28\x5d\x1d\x3f\xf7\x94\x07\x52\x3e\xe7\x7a\xb7\x82\x75\x2b\xb5\x66\xee\xd2\x7a\xc9\xd2\x14\xa5\x71\x94\xd2\x9f\x0a\x1f\xea\x1d\x4e\x43\x43\x28\x7a\x7d\xb0\xd3\x34\x7e\x34\x45\x61\xf1\xd9\xb1\x34\x2c\x3e\xf7\x2d\x10\x5b\x1f\x65\x67\xb4\xd9\x6b\xb9\x67\xff\x78\xb4\xd8\xc7\x39\xac\x58\x64\x95\x9f\xc0\x0b\xa7\x8f\x74\xd0\xd0\x1f\x64\x8f\xb6\x1a\x97\x08\xfd\xa7\x6c\xa6\xd9\xd3\xd5\xab\x8b\xd4\xfb\x37\xbf\x77\x1d\xb9\x9c\xf8\x2f\x97\xae\xad\x90\xef\xe5\xd2\xf5\xe5\xd2\xb5\xed\xf3\x72\xe9\xfa\x62\x51\xa8\x3f\x3f\x6a\x8b\xc2\xcb\xa5\xeb\xcb\xa5\xeb\xfd\x60\xf8\x20\x97\xae\x4e\x8c\xab\x6e\x5c\x1f\xf5\xc2\xd5\x95\x75\x39\x4b\x12\x59\x0a\x73\x23\x6f\x59\xeb\x1b\x84\x56\xc2\xfc\xd2\xe8\x8f\x27\xd9\x77\x17\x2c\x3a\x89\x07\xbb\x08\x06\xb4\x4c\xb9\x15\xde\x77\x46\xa0\x33\x37\x80\x97\xd3\x2d\x29\x16\x29\x4b\xc3\xc8\xfe\x90\x1a\x0b\xeb\x01\x39\x23\x8a\x25\xbc\xe0\xae\x7a\x37\xc5\xf7\x88\x61\x21\xcb\x3e\x37\x9a\x65\x13\x97\xed\x5c\xc4\x45\x61\x2a\x11\xdc\x51\xb8\x95\x9f\x41\x9e\x23\x7d\x92\x6c\x5f\x21\x47\xb1\xef\x3d\xb3\x72\xb3\xb9\x89\x47\x88\x8d\x22\xb0\x94\x5a\x2d\x1a\xf8\x58\xc1\x5d\x04\xf2\x43\x1f\x6c\xf6\xa5\xe0\x0a\x90\x77\xc4\x12\x29\xda\x54\xc4\x5c\xb3\x41\x97\xcd\x91\xfc\x4e\x39\x8b\x26\x16\xc0\x0f\x75\x2f\xe7\x34\xe3\x29\x37\x8b\x70\xd7\xe6\xaa\x2c\x51\x3c\x31\x61\x1b\x75\x05\x46\x42\x8b\x42\x49\x9a\xcc\x98\x8e\xe6\x8d\x22\x87\x0b\xc4\x0a\x5e\xe7\x58\x09\x0c\xa4\x0e\xe8\x63\x59\x5f\xb6\x20\x4a\x1a\x7f\x5d\xbe\xe6\x83\x37\xd1\x60\xd0\x1d\xf9\x97\x51\x0b\xb8\x53\x97\xf1\x10\x38\x2b\x3e\x89\xff\xd0\x44\x66\xa9\xcf\xef\xf1\x9b\x57\x56\xcc\x4b\x1c\x0e\x5a\x2a\x07\x19\x20\x8c\x24\x99\x65\xc5\x96\xf2\xad\xef\xfc\xcb\xaf\xc9\x4c\x96\x4a\x0f\xe2\x20\xa1\xd7\xf0\x0e\x55\x34\x2f\x26\x1a\x92\x31\xaa\x0d\x79\xfd\x8a\xe4\x5c\x94\x96\x03\x75\x46\x9b\xee\x92\x4d\x24\xd3\xfc\xea\xeb\xd6\xfd\xba\x4a\x33\xcb\x37\x92\x0e\xab\x0a\xcc\xc4\xeb\x84\x1a\x77\x92\x30\xb8\x0c\xf3\x58\x37\x44\x1c\x47\x74\x63\x68\x0b\x23\x1f\xe0\x7c\xfd\x50\xca\xf1\xc2\x74\x09\x44\xfc\x5f\xec\x51\x8f\x40\xf4\x2f\xdb\x64\x17\xa9\x92\x8b\x6c\xfc\xe8\x83\xd4\x4a\x98\x72\x6d\xb6\x54\x4a\xa8\x62\x14\x37\x36\x6b\xcf\x56\xa6\x56\xde\xef\x18\x96\x02\x3a\x82\x97\x75\xbd\x79\x28\x49\x18\xd6\x34\xbc\xa8\x2a\xed\x08\x89\xe3\x6f\x1d\xfe\x89\x93\x6d\x79\x04\xd9\x43\x8e\xee\x96\x4b\x6d\x27\x5d\x79\x94\xe8\xbc\x56\xec\x56\x3f\x05\x9a\x8b\x29\xa6\xd4\xce\xcb\xcc\xf0\x22\xab\xd6\x1d\x3a\x38\x42\x1e\x9b\xcd\x68\x64\xe9\xa1\x18\x9c\x8b\xa9\x98\xc0\xc4\x78\x14\xc6\x62\xc2\x60\x66\x68\x65\xf9\x41\x41\x15\x0d\xc0\x83\xba\xa9\xfa\xd8\x59\xe0\x28\xdc\x03\x22\xe5\xb1\xe4\x5c\xd1\x2c\x2c\x34\xbe\xfb\xd9\x27\xd2\x18\x26\xa8\x68\x61\x60\xae\xab\x7a\xd0\x89\xc8\xbb\xe0\x02\x86\x15\x36\x1a\xd8\xe2\x84\x9a\x37\x34\xb9\x65\x22\xc5\xf2\x43\xb0\xec\x74\x21\x68\xee\x52\x51\x45\x35\x95\x1b\xfd\x75\xcf\x99\x1a\x30\x52\xce\x87\xea\x22\xd7\xdd\x27\x0c\x4a\xdd\x39\xd7\xcb\x27\x8d\xb5\x8c\x37\x9d\x73\x8d\x46\x18\xc5\xe7\x09\xf3\xfc\xdf\x7e\x6a\x9f\x53\x9f\xb7\x88\x47\x5f\x9a\xbc\x73\x55\xe4\x11\xfe\x02\xb9\x0f\xc6\x6f\xc8\x3a\x45\x33\x7b\xb4\x17\x21\x3c\xb3\xb1\xb9\xe3\xc5\x7e\x0b\xaa\xa8\x71\x97\x30\xda\xc3\x8f\x6f\x2e\xea\x87\xf8\x23\x4d\xa5\x26\x6f\x32\x99\xdc\x92\x0b\x06\x42\xd7\x43\x16\x04\x51\xe3\xf4\x29\x13\x46\xe7\x74\xba\xed\x76\xac\x4f\x72\x29\xb8\x91\x6a\x33\xbd\x78\xa9\x4f\xf8\x24\xe9\x88\xd5\x38\x7d\xd6\xc9\x88\x2d\x82\xed\x52\x8d\x50\xc1\x31\x84\xee\x3e\x97\xdf\x8e\x87\xea\x67\x33\x79\xd7\x37\xb2\x5f\x6a\xd6\xe7\x2d\xee\x5b\x3b\xac\xee\x96\x2d\xe0\x92\xb9\xe3\xfa\xbe\xc5\x6e\x35\xe5\xc0\x48\xb0\x29\xc1\x7b\xcb\xa2\x3f\xbe\xb9\xb0\xbc\x61\x10\x0b\x7b\x27\xcc\x24\x27\x09\x2b\x66\x27\xee\xc3\xcf\x12\x28\x9e\x5a\x74\x85\xca\x19\x49\x64\x96\xb9\x78\x67\x39\x21\xe7\xac\x98\x85\xc1\x1e\x7b\xa5\x4f\x97\xea\xb6\x90\xb2\x6b\xca\xcf\xe8\xc0\xd8\xde\xee\xbc\x44\x88\xa3\xc6\xdd\xea\x18\x3c\x16\xaa\x3c\xeb\x4a\x8c\x0f\x08\x9c\x07\xae\xaa\x5f\xab\xa5\x1f\xbb\x5e\xd6\xd3\x01\x7b\x1f\x8e\x1a\xb9\x19\x4e\x50\x92\x4e\x59\x4a\xe4\x9c\x29\xc5\x53\xa6\x49\xa0\x37\xb1\xea\xc9\xb3\xc7\x86\xdb\x4b\x66\xe2\x27\xcf\x4c\xbc\x83\x8e\x13\x91\x27\xdb\x7b\x99\x3c\xd1\x34\xe7\xe2\xd9\x11\x28\x9d\xd0\x8c\x0d\x3f\x74\x50\x26\x46\xd8\xa3\xae\x4f\xf8\x97\x51\x42\xb1\x2d\x69\xba\xbe\x0d\xf8\x42\x84\x4c\xb7\xd9\x47\x1f\x40\x2b\x98\x52\xc3\xee\xb6\xb2\xbf\x7e\x45\xa0\xb6\xb7\x04\xb9\xf3\x29\xf5\x87\x27\x4a\x8d\x17\x61\x39\xe6\xfd\xda\x27\xfb\x74\xfb\xd4\xd5\xe8\xe2\x17\xd2\xc8\x24\xeb\x11\xf5\xec\x7a\x48\xbe\xc1\x91\xf7\x9b\xa9\x4f\x49\x83\xd2\xdd\x85\xcc\x29\xef\x5c\x68\x63\x56\x2f\x4c\xed\xa7\x7b\x1d\x86\x25\x38\x6e\x5c\x23\x64\xc2\xa7\xa5\xd5\xc0\x9c\xd6\xf4\x92\x44\xed\x51\x04\x90\x4a\xfe\x88\x2c\x41\xde\xe3\xb0\x92\x39\xfc\x0e\x02\x53\x08\x57\x93\x44\x33\xa1\x39\xdc\x93\x44\x97\xd5\xae\xdc\x1b\xd6\x17\x44\xf7\x42\x14\x52\x7a\xe4\x9d\x9c\x72\xe1\x4f\xa5\x74\xd7\x68\x13\xca\xb3\xb6\xc0\x78\x91\x2a\x9e\x5c\xaa\xd0\x3a\xbb\x14\x74\x9c\xb5\xf1\x02\xa8\x93\xf5\x8c\xc2\x3d\x27\x83\xde\x27\x29\xd7\xf6\xff\x64\x34\x7a\x07\x36\xf1\x52\x78\x59\x17\xec\xc5\x8e\xac\x05\x4f\x7f\x3c\x80\xfb\x3d\x33\x48\x69\x76\xc8\x71\x37\x14\xa9\x9d\x2c\xd3\x35\xb7\x13\x37\x1e\x66\xfa\x0b\x9e\xb3\x78\x73\x3f\x66\xe4\x66\xc6\x93\xdb\xeb\xc8\xf4\x2d\x95\x7d\x27\xa2\x57\x35\x26\xd4\xfc\x6d\x9f\x04\xd1\x4d\xf5\xba\xbb\x02\x7b\x13\xd1\xf3\x91\x5b\xb0\x1d\x86\x50\xad\x65\xc2\xab\x7b\x0e\x30\x97\x54\x04\x3f\x05\x82\xbf\xdf\x45\x00\x4f\xbf\x27\x6f\xf2\x9b\xe6\xab\x9e\xea\x98\x17\x71\xe1\xd7\xba\xd7\x89\x23\x6a\xec\x90\xa5\xfb\xa6\x96\x97\xdb\xcb\xa6\x0d\xa3\xbd\xf7\xe2\x76\x9b\xe4\xa5\x24\x5f\x65\x71\x69\x9b\x42\x7e\x6e\x97\x97\x6f\x6f\x4b\x6d\x13\xc8\xb0\x4a\x1b\x6e\xdc\xd4\xe1\x3b\x67\xc6\x87\xc3\x54\xc8\xa2\xcc\xd0\x57\xe2\xfe\xc9\xc5\xbd\x75\x16\xbf\xb3\x27\xb3\xfe\x63\x24\xda\xec\xea\x08\xfc\xd3\xc8\xb9\x19\x89\x64\xaf\x7e\xf5\xf5\xd7\x3f\xf6\x2c\x9c\x6d\x55\xe0\x87\x48\xc3\xd9\xd2\x24\xfa\x12\x69\xf3\x12\x69\x13\xa3\xe2\x43\xa6\x51\xdd\x73\x2c\x4d\x47\x17\xd7\x6e\xee\xad\xed\xa3\x65\x5a\x3b\xc1\x76\x75\x80\xed\x10\x0f\xb3\xa7\x28\x98\xce\xbe\xa0\x5d\x22\x5e\x5e\xe2\x5c\x7e\x6a\x71\x2e\xbb\xf8\x80\x76\x8f\x69\xe9\xe2\xfb\xf9\x53\x8a\x5f\xe9\x70\x18\xdb\xc7\x59\x74\x8f\xae\xe8\x9e\xcf\xae\xbb\x65\x6b\x97\x92\x46\xb1\x7d\xc6\x69\x11\x55\x05\x41\x5f\x78\x10\xf3\x63\x19\x69\x0f\xd6\xa3\xe8\x10\xa4\x83\x02\x85\xc3\xcb\x2e\xb5\x04\x9d\x4e\xfe\x61\xd4\xb8\xda\x08\xaf\x9f\xe6\x46\xe3\xa7\x79\x65\xf0\x52\x18\xe4\x79\xdb\xb4\x75\x2d\xb7\x88\xb7\x24\xc0\x59\x07\x46\x2c\xc7\x71\x4e\xc3\xea\x8c\x9c\x5d\x0f\xad\xba\x0c\xe1\x33\x34\xd3\x03\xb2\x82\x4f\x7b\xbb\xa4\xe3\xeb\x9e\x3f\x53\x63\x58\x5e\x98\xf6\x9b\xfd\x62\xd2\x7e\x72\x93\xf6\xce\xf6\xb8\xcf\xa1\x63\xa8\x00\x59\xe6\x54\xf4\xed\x89\x02\xe3\x76\xed\x16\xac\x41\x82\x07\xc4\x7b\xe5\x22\x2c\xa8\x62\x98\xf4\xa9\x5e\xf1\x96\x46\xf5\x0f\x1f\xc6\x08\x09\x63\xef\xbc\x72\x64\xa0\x8d\x93\x96\xc8\x25\xb7\x4f\xb7\x9c\x00\x05\x7f\xa8\x22\x2e\x5c\xd3\x9b\xcd\x8c\x21\xb3\xbe\x86\x40\x94\xaa\x55\x5d\x12\x46\x51\x98\x66\x99\xbc\xc3\x6f\xc7\x0c\xcc\x42\xdf\xce\xc5\x45\x58\x8d\x19\xc9\xb9\x55\xaa\x9d\xf1\x33\x9e\x0e\x5e\x45\x5a\x89\x9a\x29\x14\x58\x95\xbb\xcd\x1a\x31\x13\x6f\xb4\x55\x48\x05\x3a\x42\xdb\x7f\x7b\xc7\x1b\xcc\x8a\xeb\x68\xc2\x98\xcd\xe8\x9c\xcb\x52\x61\x6f\x23\xc9\x81\xfb\x09\x58\xc2\x42\x96\xc1\x34\x85\x55\x12\xc3\xea\xf4\x0a\x38\x5d\x55\x3f\x82\x28\x9f\x4a\x6f\x4b\xe8\xb3\x2f\x5c\x9b\xe5\xb5\x78\x10\xf9\xa4\x6d\xfb\xc2\x9b\xb9\x2e\x2c\x5b\xe8\x5c\x11\xed\x73\xdc\xaf\x2e\x98\xcc\x47\xf0\xd3\x8f\xa8\x1e\xda\xd6\x5c\xa4\x2f\xb2\xce\xbe\x65\x9d\x70\x5d\x95\xf1\x64\xd1\xb9\x52\x58\x75\x4d\x65\xbb\x93\x37\x54\xb3\x94\xbc\xa7\x82\x4e\x51\x2d\x3b\x1a\x5d\xbf\x79\x7f\x6c\xb7\x0d\xd4\xbe\xe1\xc5\xca\xbb\xac\x51\x3c\x87\xab\x7d\x86\x41\x2c\xad\x70\x07\x4e\xd4\x71\x8d\x7b\x0d\xe3\x20\x81\x9b\xb4\x4b\x10\xbb\x1c\x7a\xd9\xac\xf1\xd8\x20\x0a\xf3\x3c\xbd\x67\x55\x47\x2e\xb4\xa1\x59\x76\x9d\x51\x71\x56\x14\x4a\xce\x57\x6b\xc2\xf5\xc0\x70\xd7\xd0\xb3\x76\xf4\x7d\xf0\x2f\x0b\x04\x34\xdc\xf5\x0a\x32\xac\xc6\x1f\x90\xa1\x09\x0a\xb1\x14\xc0\x06\x0f\xce\x4a\x23\x73\x6a\x78\x72\x60\xf5\xe6\x83\xf7\x54\x94\x34\x5b\xe9\x61\xb4\x71\x19\xeb\xc4\xba\x8d\x9d\xd6\x27\x47\x6b\xd1\x6d\xa3\x7c\xb0\xb9\xbf\xa1\xca\xd2\x96\xf3\xd1\xe7\x4e\x7d\xb5\xa1\xa6\x5c\xa2\x9c\x1b\xa8\xf9\x7a\xfa\xdd\x27\x19\xd5\xe6\x53\x91\xda\x93\xdc\xf8\x75\x13\x91\x4e\xa8\xa1\x99\x9c\xfe\x81\xd1\x6c\x35\x3e\xd7\xf0\xe4\x3c\x6e\xed\x8d\x3f\x88\x32\xa3\x72\x1c\x1a\x1e\x6a\x62\x85\x62\x1f\xaf\xad\x58\xc6\xe6\x54\x18\xdf\x1d\x2b\x65\xeb\x43\xb7\x7e\xc0\x22\x5e\x19\x3c\x53\x66\x98\xca\xb9\xa8\x8f\x39\x82\xb6\xe7\x52\xa4\x1c\x4d\x7d\x60\xcc\xc2\x1e\xf5\x71\xd7\xa3\xda\x3a\x73\xfe\x06\x03\x7e\x9d\xf2\x44\xf3\xa9\x83\x02\x9b\x8d\x9d\x4c\x38\xc3\x97\x70\x73\x5d\x9b\xdb\x12\xa4\xc8\xad\xb0\xc2\x1c\xe4\xbc\x58\x4d\xa4\xb6\xf2\xf6\x6d\x3c\xbd\xef\xf7\x18\xa7\xb0\xde\x2f\xb2\xef\xe6\xbd\xce\xd0\xbf\x09\xc5\xf0\xd9\x2e\x0d\x34\xa7\xb2\x9e\x82\xae\xc2\xbb\xd0\x0d\x83\xfb\x1a\xd5\xd5\x6b\x8d\xd6\x53\xfc\x56\xc2\x52\x3b\xb9\xa6\x6d\xde\xf4\x3a\xad\xad\xb2\x7c\x2f\xa9\x9f\x2d\xa4\xbc\xad\x2c\xaa\x65\xfa\xf2\xba\x32\x3c\x74\x4e\x71\xca\xa9\x0f\x94\x14\x9c\x61\xa2\x0e\x2a\x1c\xb0\x80\xb3\x30\x9a\xba\x97\x96\x83\x59\x35\x0e\x7e\xeb\xb9\xbb\x66\x34\xec\x3a\xdf\x05\x6f\x1c\xa6\x98\xa8\x02\x2e\x0b\x4e\xbe\x91\xee\xa2\xd4\x05\x94\x5a\x1a\x00\x7c\xbb\x47\x74\x99\xcc\x08\xd5\x76\x6a\x16\xa1\xed\x89\x67\x83\x9c\x0a\x3e\x61\xda\x0c\x42\x1e\x5a\xfd\xa7\x5f\xfe\x65\x40\xde\x4a\x45\x9c\x1f\x76\xcf\x67\x80\x70\xf3\xac\xf0\x82\x6b\x5c\x4c\xe8\x5b\x69\x9a\x85\x4c\xdd\xa4\xef\x60\xb2\x86\xde\x5a\x1e\x86\x93\x2d\x19\x5c\x17\x9c\x92\x03\x2b\xe4\x45\x9f\xfe\x87\x65\x4b\xff\x3a\x20\x47\x77\xc0\xb4\x0f\xec\x9f\x07\xf8\xc1\xe0\x4b\x18\x2b\xc2\xd5\x87\x31\xcc\x4f\xf1\xe9\x94\x29\x54\xf9\x08\x84\xc3\x1d\xbb\x0c\x16\x42\x46\x8d\xfd\xcd\x6f\xa5\x22\x36\x27\xf2\xa7\x5f\xfe\xe5\x80\x1c\xd5\xd7\x45\xb8\x48\xd9\x17\xf2\x4b\x34\xfd\x72\x6d\xd7\x78\xec\x2e\x50\xf4\x42\x18\xfa\xc5\x8e\x99\xcc\xa4\x66\x02\xd5\x6f\x23\xc9\x8c\xce\x19\xd1\xd2\x6a\xad\x2c\xcb\xfa\xce\xac\x4d\xee\x28\x64\x15\xf1\xa0\x84\x20\x70\x52\x50\x65\x6a\x28\x31\x70\x56\x0d\xf8\x9a\xdd\xb6\xa9\xf0\xd7\xbf\x13\x2e\xdc\x9d\x91\xbb\xad\xb2\x7b\x0e\x21\x8d\xb8\x49\x46\x92\x64\x46\xc5\x34\xc4\x51\x4f\x4a\x53\x2a\xb6\xe5\xba\xa5\xe5\x19\xb8\xe5\xa2\x53\xb8\xed\xb7\x5c\x34\x6f\xee\x57\xdb\x82\xa6\xdc\x78\xa7\x7f\xe7\xc8\x67\x16\x27\x76\x17\x14\x1f\x97\x46\x2a\x7d\x92\xb2\x39\xcb\x4e\x34\x9f\xf6\xa9\x4a\x66\xdc\xb0\xc4\x2e\xeb\x84\x16\xbc\x9f\x48\x61\x77\x1c\x32\x08\xe4\xe9\xcf\xa0\x08\x66\xdf\x4e\x75\x4b\x5e\xe3\x96\x8b\xde\x6e\x08\x7b\x52\x03\xd8\xde\xd6\xd8\xc2\x86\xb3\xbc\x50\xb4\xa7\x3c\xc2\x6a\xc1\x78\x71\xb2\x97\xc5\xfa\xb4\xbc\xdd\x79\xcc\xa1\xcb\x34\x9d\x34\xc7\xb0\xc7\x0e\xbd\x34\xe0\x54\xd6\x28\x65\x4e\x53\x24\xa5\x54\x2c\x1e\x1c\xf9\x2d\x48\x21\x21\x7b\xb2\xe8\x27\x58\xdf\xbe\x4f\x45\x6a\xff\x8d\xf1\x28\xc9\x62\x2f\x30\x2c\x79\x27\x42\xf0\x69\x78\xf1\x38\x47\xa2\xe4\x7b\x38\xf5\x4e\x5e\x6b\x29\x44\xa1\xa8\x0a\x2e\x3b\x46\x95\xcc\x33\xcd\xba\x80\xca\xb5\x1f\xf5\xbf\xdd\x9d\x49\xc8\xcc\xb5\x4d\xa4\xda\x7c\xd3\x11\xc9\x8e\x2d\xe7\xfb\xae\xea\xd1\xac\x89\x6f\x07\x73\x69\xa0\x7c\xf4\x7c\x6d\x19\x5e\x41\x01\x06\xb3\xfe\x8e\xb6\x15\x0e\xf9\x3b\x7a\x3b\x91\xfe\xca\xfc\x40\x49\x50\x4a\xb6\x2b\x50\x95\xfe\x52\xab\xb4\x85\x8b\x32\x4c\x1b\x42\xe7\x94\x67\x60\x51\x97\x63\xcd\xd4\x1c\x4b\x1e\xb9\xb4\x78\xb4\xa9\x67\xb9\xaa\x06\x28\x46\x3d\x92\xe6\xe3\xd7\xb0\xbc\x2b\x9b\x16\x00\xda\x50\x63\xf6\x6b\x67\xbd\x17\xbd\x07\xd5\xcb\xb5\x3f\xdb\x2f\xec\xa8\xc6\x58\xfc\xfb\x03\xa3\xca\x8c\x19\x35\x37\x7c\x13\xdf\x5d\x42\xe9\x5a\x3f\x6f\x70\xa9\x10\xfa\x8e\x91\xa9\x34\x56\xc4\x2a\x01\xf7\x51\x26\xc5\x04\x34\x01\xd1\x1e\x1a\xa3\xab\x55\xde\x28\x0a\x71\x2f\x52\x74\x5c\x66\xbd\xe3\xf2\x3a\x9d\x74\xec\x30\xc9\x60\x6b\x4c\x01\x21\x05\x73\x7b\x87\x37\x10\x40\x81\x1e\x67\xc9\x39\xd3\x7a\x63\x6a\x88\xba\x0b\x1f\xb6\xc6\xa3\xdc\xb8\x0e\xcb\xfd\x6f\x18\x3f\x61\x05\xe8\x94\x19\xca\x33\x7f\x94\x11\x14\x01\x4a\xdb\xa8\xeb\xc6\x05\x2a\x46\xf5\x26\x01\xa1\x99\x11\x4b\x4b\x81\x93\x96\x82\xf5\xef\xa4\x4a\xc9\x39\xcd\x59\x76\x4e\x35\x73\x63\xc5\xe1\x6a\xb8\x47\x87\x7a\xaf\x53\x5e\x6d\xfb\x5a\x33\x65\x34\xfe\x78\x24\x72\xb8\x51\xa9\x58\x38\xc1\x9e\x37\x41\xde\xa8\x92\xf5\xc8\x5b\xcb\xbd\x7a\xe4\x93\xb8\x15\xf2\xee\x7e\x73\x35\x1b\x6f\x2e\xea\x6e\x56\x2e\x73\x0b\xa4\xc8\x73\x09\x61\x6a\x06\x9f\x30\xdd\x1d\x67\xe4\x08\xfe\x1a\x53\x63\x9d\xd9\x84\xa6\x7e\x46\xf6\x9f\x4b\x26\x28\xab\x28\x2a\x39\x55\x4c\x63\xce\x95\x95\x09\xfd\xda\x9a\x9c\xbf\x61\xc2\x45\xbc\x6d\x9d\xde\x70\x55\x2f\x3f\x53\xcf\xd7\xa6\xd5\x2f\x6e\xbf\xdd\xc7\x8a\x6c\xa5\xa8\xb1\xd9\x0b\x2f\x9a\xe8\x1a\xe3\xd3\xba\x19\xae\x36\x3a\x45\x5c\x2f\x6a\x8b\x42\xc9\x26\xeb\xa8\x5f\xdd\xf9\xe8\xf3\x7a\x60\xaf\xe5\x7d\xdb\xf8\xd3\x76\xb3\xd4\x7d\x0d\x52\x5b\xcf\xcc\x56\x23\xd4\x8b\xf9\xe9\xc5\xfc\xf4\x63\x32\x3f\x6d\xc5\xf8\x4d\x26\xa7\x1f\x87\xb1\x69\xeb\x12\x37\x19\x98\x9e\xa5\x69\xa9\xd5\x8a\x36\x9a\x93\x9e\xad\x21\x69\xeb\xd2\x5a\x1a\x8f\xfe\x7d\xcc\x46\x5b\x21\xb6\xc1\x54\xf4\x0c\x8d\x44\x6d\x04\x32\x96\xb6\x11\x13\x87\x51\xe3\x58\x50\xac\x0a\x26\x86\xe1\xbc\x4b\x4d\x2c\xce\xec\x2a\x2d\x5a\x01\x6e\xeb\xdc\x0e\xdd\xe4\xda\xcb\x5e\x4e\x60\x74\xe5\x04\x97\x26\x4b\x2e\x2e\xaf\x3f\x5e\x9e\x9f\xdd\x5c\x5e\x34\xe5\xbb\x55\x90\xde\x22\x89\x6d\xb6\x41\xf4\x23\x49\x6c\x4d\x03\x4b\x90\xd7\xfc\x64\x71\x60\xcd\x4f\x65\xc9\x57\xf5\xba\xbf\x5c\x78\x2f\x2e\x77\x2f\xfe\xb1\xfd\x74\xb6\x3d\x9e\xf6\x74\x02\xb6\xa0\xc7\x98\x95\x7b\x66\x32\x4b\xb5\xf7\x35\x1d\x5e\x84\xe8\x25\x2e\x92\xac\x4c\xad\x70\xf1\xe9\xd3\xf0\x42\x0f\x08\x79\xc3\x12\x5a\x6a\xb0\xc2\xa4\x52\x1c\x1a\xf2\xe1\xea\xdd\x1f\xc1\x87\x1a\x5a\xf4\x42\xb2\x0f\xc8\x20\xcb\x29\x26\xc1\x35\x98\x85\x8c\xbc\x61\x28\xa8\xc0\x97\x13\x5a\x58\x2a\xa6\xb1\xca\x82\x01\x59\x64\xc6\xb2\xc2\x52\xcc\x5b\x46\xaa\xdc\x9f\x76\xe0\xaa\x86\xb9\x77\x79\x9c\x32\x83\x91\x4e\x9b\xbc\x1a\x37\x42\x6d\x8b\xc5\xf5\x1e\xb6\xd6\x9a\xfa\xe8\xb4\xf1\x3b\xaa\x9d\xc5\x6a\xe5\x6c\xb7\xec\xef\x76\xfb\xcc\x7a\x13\xc7\x1a\xe3\x06\x92\x67\xf8\x6b\x69\xce\x76\xb2\x95\x1d\x03\x9d\x48\xb8\x69\x6d\x4d\x5d\xef\x06\xb4\x3a\x67\xfd\x92\x2d\x83\x35\x81\x5c\xfb\x70\xf0\xa2\x8e\xa6\xdc\x6e\x2e\x50\xf0\x22\xad\x55\x97\x74\xde\x76\xf5\x77\xe5\x38\xd4\x17\xad\xe6\xeb\x2c\x32\xe4\x1f\xff\xfa\xea\xff\x07\x00\x00\xff\xff\xda\x8b\x54\xf8\x5f\xac\x01\x00") +var _operatorsCoreosCom_subscriptionsYaml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\x7d\x6b\x73\xe3\xb8\x95\xe8\xf7\xf9\x15\x28\x27\x55\xb6\xb3\x92\xdc\x9d\x9d\x4d\x72\xbd\xa9\xa4\xdc\xb6\x7b\xa2\x9d\x6e\xb7\xb7\xe5\xee\xa9\xdc\x24\x37\x81\x48\x48\xc2\x98\x04\x38\x00\x28\xb7\xf2\xf8\xef\xb7\x70\x0e\x00\x82\xd4\x8b\x94\xe5\xc7\x4c\xcc\x0f\x33\x6d\x0a\x00\x81\x83\x83\xf3\xc2\x79\xd0\x82\x7f\x66\x4a\x73\x29\x4e\x09\x2d\x38\xfb\x62\x98\xb0\x7f\xe9\xc1\xed\x6f\xf4\x80\xcb\x93\xf9\xeb\xaf\x6e\xb9\x48\x4f\xc9\x79\xa9\x8d\xcc\x3f\x32\x2d\x4b\x95\xb0\x0b\x36\xe1\x82\x1b\x2e\xc5\x57\x39\x33\x34\xa5\x86\x9e\x7e\x45\x08\x15\x42\x1a\x6a\x5f\x6b\xfb\x27\x21\x89\x14\x46\xc9\x2c\x63\xaa\x3f\x65\x62\x70\x5b\x8e\xd9\xb8\xe4\x59\xca\x14\x0c\xee\x3f\x3d\x7f\x35\xf8\xd5\xe0\x97\x5f\x11\x92\x28\x06\xdd\x6f\x78\xce\xb4\xa1\x79\x71\x4a\x44\x99\x65\x5f\x11\x22\x68\xce\x4e\x89\x2e\xc7\x3a\x51\xbc\x80\x4f\x0c\x64\xc1\x14\x35\x52\xe9\x41\x22\x15\x93\xf6\x7f\xf9\x57\xba\x60\x89\xfd\xf8\x54\xc9\xb2\x38\x25\x2b\xdb\xe0\x70\x7e\x8e\xd4\xb0\xa9\x54\xdc\xff\x4d\x48\x9f\xc8\x2c\x87\x7f\xe3\xda\x47\xd1\x57\xe1\x75\xc6\xb5\xf9\x76\xe9\xa7\x77\x5c\x1b\xf8\xb9\xc8\x4a\x45\xb3\xc6\x6c\xe1\x17\x3d\x93\xca\x5c\x55\xdf\xb6\xdf\xd2\xe5\x38\xfe\xb7\x6b\xc8\xc5\xb4\xcc\xa8\xaa\x0f\xf2\x15\x21\x3a\x91\x05\x3b\x25\x30\x46\x41\x13\x96\x7e\x45\x88\x83\xa3\x1b\xb3\x4f\x68\x9a\xc2\xde\xd0\xec\x5a\x71\x61\x98\x3a\x97\x59\x99\x8b\xf0\x4d\xdb\x26\x65\x61\xd4\x53\x72\x33\x63\xa4\xa0\xc9\x2d\x9d\x32\xff\xbd\x31\x4b\x89\x91\xa1\x03\x21\xdf\x6b\x29\xae\xa9\x99\x9d\x92\x81\x05\xf1\xc0\x42\x30\xfa\x19\xf7\xe7\x1a\x07\x89\xde\x9b\x85\x9d\xae\x36\x8a\x8b\xe9\xa6\xcf\x27\xd4\xd0\x4c\x4e\x09\xe2\x17\x99\x48\x45\xcc\x8c\x11\xfb\x29\x3e\xe1\x2c\xf5\xf3\xdb\x30\x23\xec\xba\x34\xa7\x51\xf3\x75\xeb\x29\xcd\xa8\x10\x2c\x23\x72\x42\xca\x22\xa5\x86\x69\x62\x64\x05\x9f\xcd\xe0\x71\x9d\x97\x66\x73\xbe\xf4\x7e\xc5\x74\xb0\xe9\xfc\x35\xcd\x8a\x19\x7d\xed\x5e\xea\x64\xc6\x72\x5a\xed\xa1\x2c\x98\x38\xbb\x1e\x7e\xfe\xcf\x51\xe3\x07\x52\x5f\x4a\x8c\xa2\xe4\x96\xb1\x42\x57\x87\x82\x94\x85\x5d\x93\x5d\x1c\x19\x2f\x88\x51\x34\xb9\xe5\x62\x0a\x4b\x9f\xe2\x7a\xcf\x71\x63\xf4\x60\x69\xca\x72\xfc\x3d\x4b\x4c\xf4\x5a\xb1\x1f\x4a\xae\x58\x1a\x4f\xc5\x42\xd6\x93\x88\xc6\x6b\x0b\xa7\xe8\x55\xa1\xec\xb4\x4c\x74\x0e\xf1\x89\x68\x54\xed\x7d\x63\x99\x87\x16\x16\xd8\x8e\xa4\x96\x3c\xd9\xe9\xcf\x98\x3f\x1c\x2c\x75\x00\xb4\xdb\x69\x66\x5c\x13\xc5\x0a\xc5\x34\x13\x48\xb0\xec\x6b\x2a\xdc\x9a\x06\x64\xc4\x94\xed\x68\x0f\x6c\x99\xa5\x96\x8e\xcd\x99\x32\x44\xb1\x44\x4e\x05\xff\x7b\x18\x0d\x40\x64\x3f\x93\x59\xfc\x30\x04\x8e\x9b\xa0\x19\x99\xd3\xac\x64\x3d\x42\x45\x4a\x72\xba\x20\x8a\xd9\x71\x49\x29\xa2\x11\xa0\x89\x1e\x90\xf7\x52\x31\xc2\xc5\x44\x9e\x92\x99\x31\x85\x3e\x3d\x39\x99\x72\xe3\x29\x70\x22\xf3\xbc\x14\xdc\x2c\x4e\x80\x98\xf2\x71\x69\x37\xee\x24\x65\x73\x96\x9d\x68\x3e\xed\x53\x95\xcc\xb8\x61\x89\x29\x15\x3b\xa1\x05\xef\xc3\x64\x05\x92\xc8\x3c\xfd\x99\x72\x34\x5b\x1f\x36\xc0\xb7\xf2\x1c\x10\x4f\xf5\x36\xc2\xda\x12\x3f\xc2\x35\xa1\xae\x3b\xae\xa5\x02\xa9\x7d\x65\xa1\xf2\xf1\x72\x74\x43\xfc\x04\x10\xec\x08\xe1\xaa\xa9\xae\x80\x6d\x01\xc5\xc5\x84\x29\x6c\x39\x51\x32\x87\x51\x98\x48\x0b\xc9\x85\x81\x3f\x92\x8c\x33\x61\xec\x31\xcc\xb9\xd1\x80\x73\x4c\x1b\xbb\x0f\x03\x72\x0e\x0c\x88\x8c\x99\x3b\xb0\xe9\x80\x0c\x05\x39\xa7\x39\xcb\xce\xa9\x66\x0f\x0e\x6a\x0b\x51\xdd\xb7\xe0\x6b\x0f\xec\x98\x7f\x2e\x77\x58\x3a\x63\x84\x78\x06\xb7\x76\x77\xe2\x03\x3f\x2a\x58\x12\x8e\x03\x15\xe4\xac\x28\x32\x9e\x20\xc6\x9b\x19\x35\x24\xa1\xc2\xc2\x8b\x0b\x6d\x68\x96\x01\x3b\x69\x35\x8b\x75\xa7\x9d\xc0\xd1\x6e\x30\x07\xff\x7a\x89\x42\xd7\x7f\x08\x4c\xad\xd1\x62\x1d\x65\xb0\x8f\xa3\xb3\xcb\x3f\x6c\x00\x39\x41\xc9\x64\xc2\xa7\xab\xba\xad\x85\xe5\x39\x74\x01\x99\x86\x72\xa1\xdd\x10\xa5\x42\x68\x56\x9c\xca\xf2\x2e\x5a\xe3\xdb\x83\xb5\xb3\x5b\x09\xd9\x6d\x6b\xb6\x0f\x13\xf3\xd5\x3f\x34\x16\x70\x29\xe6\x78\x50\xad\xcc\x62\x89\x1c\x13\x73\xae\xa4\xc8\xed\x21\x9a\x53\xc5\xe9\x38\x73\x8c\x8d\x59\xf2\x85\x67\x0c\x97\xc8\xd4\xaa\x23\xb5\xe6\xab\xb8\x1e\xaa\x14\x5d\xac\x69\xc1\x0d\xcb\xd7\xac\x66\xd5\xb4\x3f\x53\x15\x51\x09\x8b\xbc\xab\xa6\x4e\x5c\x03\x3b\x75\x4a\xce\xc3\xc4\xd7\x7e\x66\x0b\xdc\xf1\x59\x8f\xdb\xd5\xb3\x06\xcb\xfd\xb3\x6d\x03\xf1\x01\x4e\xbf\xe1\xf7\x06\x58\xec\x09\x41\x06\xc6\x56\x42\x63\x40\xde\x97\x1a\x76\x8b\x92\xf3\xbf\x0e\x2f\x2e\xaf\x6e\x86\x6f\x87\x97\x1f\xd7\x83\x83\x6c\x3b\x28\xd5\x03\x34\xbe\xc3\x64\x0f\x3f\xfb\x3d\x52\x6c\xc2\x14\x13\x09\xd3\xe4\xe7\x47\x9f\xcf\x3e\xfe\xf5\xea\xec\xfd\xe5\x31\xa1\x8a\x11\xf6\xa5\xa0\x22\x65\x29\x29\xb5\x67\x1a\x85\x62\x73\x2e\x4b\x9d\x2d\x1c\xe5\x4a\xd7\x20\x6d\x13\x5b\x81\xdb\x52\xb1\x20\x9a\xa9\x39\x4f\x56\x83\x48\x0f\xc8\x70\x42\x68\x85\x40\x49\xc0\x70\xcb\xa8\xb2\x39\x4b\x7b\x30\x6c\x98\xb4\xff\x0e\x17\x45\x69\x3c\xc3\xbb\xe3\x59\x06\xa7\x42\xa0\xac\x94\x0e\xc8\x85\x2c\xed\x78\x3f\xff\x39\x2c\x4c\xb1\xb4\x4c\x40\x88\xb6\xc4\x80\x8b\xa9\xfd\xa9\x47\xee\x66\x3c\x99\x11\x9a\x65\xf2\x4e\x03\xa5\x60\x3a\xa1\x85\x5f\x7a\x0c\x1d\xbd\x10\x86\x7e\x39\x25\x7c\xc0\x06\xe4\xe0\xe7\xd1\x4f\x07\xf8\xf5\x42\x49\xfb\x09\x94\x93\x71\x56\x19\x37\x4c\xd1\x8c\x1c\xc4\xad\x07\xe4\xd2\x7e\x83\xa5\xf1\x3e\xc0\x08\x82\xcd\x99\xb2\xab\xf0\xbb\xd0\x23\x8a\x4d\xa9\x4a\x33\xa6\xb5\xc5\xb3\xbb\x19\x33\x33\x86\xa2\x78\x00\x18\xfb\xc2\x2d\xc3\x95\x8a\x08\x69\x06\xe4\x82\x4d\x68\x99\x01\x07\x26\x07\x07\x83\x26\xe3\xdb\x1d\xd5\xde\x2a\x99\x77\x40\xb7\x51\x5d\x73\x58\xb5\xf7\x87\x1a\x47\xae\x91\x35\xcd\x52\xc2\x27\x4e\x82\xe1\xda\x2e\x8a\xb0\xbc\x30\x8b\x36\x87\x66\x0b\x1d\x21\xad\x09\x01\x09\x3c\xe9\x3d\x2d\xbe\x65\x8b\x8f\x6c\xb2\xad\x79\x73\xfd\x2c\x63\x89\x25\x94\xe4\x96\x2d\x40\x9c\x25\xe7\x7e\xc0\xcd\x4b\xe9\xb4\x1c\xd2\x92\x3c\xfa\xa7\x6f\xa7\xb3\xb5\x5d\x7b\x20\xd9\xe7\x96\x2d\xda\x34\x23\xcb\x3a\x9d\x05\x0d\xf0\x3a\x0b\xab\xed\x50\x21\xed\x51\xd6\x3f\xdb\x29\xfa\xca\xc9\x1d\xc6\xa4\xdd\x9d\x53\xb3\x52\x60\xbd\x2d\xc7\x4c\x09\x66\x18\xc8\xac\xa9\x4c\xb4\x15\x57\x13\x56\x18\x7d\x22\xe7\x96\xf2\xb1\xbb\x93\x3b\xa9\xac\x22\xd7\xbf\xe3\x66\xd6\xc7\x5d\xd5\x27\x60\xf4\x38\xf9\x19\xfc\x8f\xdc\x7c\xb8\xf8\x70\x4a\xce\xd2\x94\x48\x38\xe2\xa5\x66\x93\x32\x23\x13\xce\xb2\x54\x0f\x22\xad\xab\x07\xfa\x40\x8f\x94\x3c\xfd\xfd\xe6\xc3\xbd\x23\xc4\x64\x81\xc6\x8a\x1d\xa0\x36\x02\xa1\x6b\x51\xa3\x53\x01\xe9\x2d\x85\xb2\x2a\x82\xdd\xf3\xdc\xb1\x45\xc7\x50\x3a\x2c\x63\x2c\x65\xc6\xa8\xd8\xd2\x03\xc0\xd6\xfd\xcc\x1e\x56\x87\x16\x46\xf0\x08\x50\xc8\xf4\x94\xe8\xb2\x28\xa4\x32\x3a\xa8\x08\x60\x73\xe9\xd5\xff\x04\x79\xb9\x47\xfe\x16\x5e\x66\x74\xcc\x32\xfd\xa7\xc3\xc3\xdf\x7e\x7b\xf9\xc7\xdf\x1d\x1e\xfe\xe5\x6f\xf1\xaf\x91\x85\xae\xde\x04\x6d\x3a\x32\x05\x21\xdc\xfd\xe9\xd8\xe8\x59\x92\xc8\x52\x18\xf7\x83\xa1\xa6\xd4\x83\x99\xd4\x66\x78\x1d\xfe\x2c\x64\xda\xfc\x4b\x6f\xe1\x04\xe4\x61\x89\x0e\x80\xf3\x9a\x9a\xd9\x9e\x49\xcf\x7a\x6b\xc4\xea\xa7\xb6\xdd\xde\x3e\xe1\x76\xd9\x19\x24\xec\x3f\xdf\xfa\xe9\x5a\x0e\x74\xa7\xb8\x31\x4c\x80\xdc\xc1\x54\x6e\x39\x71\xcf\x62\x6e\xc5\x66\xe7\xaf\x0f\x1e\x84\x78\x05\xa8\xed\xb0\x38\x98\xbd\x5b\x19\x22\x73\x20\xb4\x5e\x82\xaa\x74\xa4\xb3\xeb\xa1\xb7\xcc\xec\x7d\x21\xde\xde\xf0\xf6\xde\x67\x32\x58\x2e\xdc\xb2\x82\xa4\x79\x4a\xa4\xc8\x16\xe1\x77\x4d\x32\x0e\xd6\x08\x2b\x80\x06\x8b\xc4\x11\xbe\x1c\x24\x45\xd9\x73\x0d\x06\x39\xcb\xa5\x5a\x84\x3f\x59\x31\x63\xb9\x95\xd8\xfa\xda\x48\x45\xa7\xac\x17\xba\x63\xb7\xf0\x17\x76\xac\x7d\x60\xb9\x37\x8a\xd4\x49\xa9\x2c\xf3\xc8\x16\x9e\x82\xb0\xf4\x69\xcf\xa2\x07\xd3\x9e\x8f\x62\xd8\x8d\xab\x1d\x59\x6e\xd0\x16\x9d\xc1\xd5\xaf\x0a\x64\xc8\xb9\xcc\xca\x9c\xe9\x5e\x60\x4f\x28\xad\x8b\xb9\x95\x26\x97\xcc\x3b\xab\x9f\x8e\xa7\x2f\xe5\x73\xae\xa5\xda\x99\x0f\x72\x67\xf2\x94\xa5\xb1\x9a\xca\x44\xaa\x9c\x9a\xa0\x2e\x7e\x29\xa4\x06\x1d\xc0\xe1\x6c\x83\xa4\xbc\x3e\x68\xf5\xd9\x82\x1a\xc3\x94\x38\x25\xff\xef\xe8\xcf\xff\xf1\xcf\xfe\xf1\xef\x8f\x8e\xfe\xf4\xaa\xff\x7f\xfe\xf2\x1f\x47\x7f\x1e\xc0\x3f\x7e\x71\xfc\xfb\xe3\x7f\xfa\x3f\xfe\xe3\xf8\xf8\xe8\xe8\x4f\xdf\xbe\xff\xe6\xe6\xfa\xf2\x2f\xfc\xf8\x9f\x7f\x12\x65\x7e\x8b\x7f\xfd\xf3\xe8\x4f\xec\xf2\x2f\x2d\x07\x39\x3e\xfe\xfd\xcf\x5b\x4d\x8f\x8a\xc5\x87\x16\x07\x1e\x9f\xbe\xdb\x20\x2e\x0c\x9b\x32\xd5\xb1\x57\xeb\x6d\x25\xe4\x4b\xbf\x12\xda\xfa\x5c\x98\xbe\x54\x7d\xec\x7e\x4a\x8c\x2a\xb7\x1f\x8c\x8a\xa8\xed\x82\xe7\x1f\xfd\x69\x8d\x4c\xb1\x9e\x34\xef\x1d\x91\x35\x4b\x14\x33\xfb\xd2\x60\x70\x34\xcf\x3f\x0a\x99\x1e\x6a\x22\xd6\x98\x09\xd7\x4d\xfb\xdf\x42\xa9\xf1\x22\x05\xc2\xab\xe2\xbc\x13\x25\xf3\x01\x89\xcc\x42\x73\x9a\xf1\xd4\xb7\xbb\x65\x5b\xb4\x5c\xff\xbc\x28\x41\x3f\x2e\x25\x68\x84\xfb\xfb\xe0\x1a\x10\x13\xf3\x4d\x66\x9a\xa6\x4d\xd7\xb6\xad\x9b\xa3\xbd\x00\x65\x24\x29\x64\x51\x66\xd4\xac\x31\xdb\xad\xb0\x4d\x3b\xdc\xd7\xc1\x4c\x68\x37\x1a\xec\xc0\x8e\xca\xe5\xab\x8d\xa1\xe4\x2c\xcb\x08\x17\x78\x12\x60\x00\x6f\xcd\x53\x0c\xe5\x25\x42\xd1\xe0\x3c\xb7\x53\xb8\x9b\xb1\xa6\xa1\x91\x6b\xab\xeb\x28\xc3\xc5\x74\x40\xbe\xb3\xbf\x23\xcd\x72\xa6\x31\x2e\x48\x5e\x66\x86\x17\x19\x23\x81\xdb\xa2\x0d\x2d\x2b\x19\xa1\x5a\xcb\x84\x53\xe3\x66\xec\xee\x0f\xb5\xf1\xd3\x86\xd9\x18\x7a\x0b\xa6\xd0\x84\xa5\x4c\x24\x6c\x40\x3e\xc3\x75\x61\x58\xeb\xd8\x0a\x83\x60\xde\x87\x31\x28\x49\x4b\xbc\xda\x41\x7a\xb0\x7a\x8c\x61\x9e\x97\x06\x0c\xc5\x8f\x65\xc5\xb7\x3b\xee\x2c\x73\x91\x31\x1f\x48\x55\x10\xad\x29\xdc\x3d\xc8\x49\xa5\xba\xeb\xfb\x99\xef\xdb\x11\xde\x60\x6e\xdb\xca\xa9\x96\x28\x6e\x65\x63\xa8\x53\xda\xc7\xb6\x18\xb6\xa3\xb3\x3f\x49\x1a\xdb\x81\xbe\xb6\xa7\xad\x1d\x8c\x4b\x5d\xe9\x69\x5b\x6b\x52\xa1\xd8\x84\x7f\xe9\x80\x8f\x67\xa2\x52\x51\x78\xca\x84\xb1\x8a\x80\x02\x82\xaa\x58\xc1\x04\xe8\xe1\x8c\x26\x33\xa0\x0b\x8e\x8a\x56\x96\xe1\x87\xbc\x31\x42\x29\xa3\xfb\xf1\x1a\xad\x92\x62\x5e\xce\xd6\x4f\xfc\x6c\xb9\x5d\xdf\xff\xc1\x12\x32\x65\xa8\x5b\xac\x57\xae\x1b\xfb\x18\xf5\x70\x7e\x2e\xfe\x2f\xbc\xc0\xf3\x93\xb4\xda\x5b\xb8\x72\x2a\x24\x9c\xb5\x09\x37\x44\x5a\x89\xc0\x7e\x77\x40\x46\x2b\x7a\xe6\xd4\x24\x33\xd7\xe2\xf0\x50\x13\x34\xda\x36\x07\x1a\xa3\x89\x30\x2d\x33\x96\x12\xef\xb0\x81\x83\x76\x44\xa9\x9a\xab\xc2\x09\xd5\x9a\x4f\x45\xbf\x90\x69\xdf\x8e\x76\xb2\x0e\x21\x5a\x1c\xaa\xd8\xd5\x70\xfb\xc1\xda\x8a\x57\xc1\x38\xd1\x6e\x9b\x3e\x06\xfb\x5b\x24\x5b\x24\x32\x2f\x4a\xc3\x22\xe3\x5c\xb0\xeb\x8c\x17\xe8\x59\x14\xc9\x90\x95\x44\x74\x3f\x98\xe6\x54\xd0\x29\xeb\xbb\x8f\xf7\xc3\xc7\xfb\xe1\x5b\xf7\x01\x73\x1b\xaa\x85\x26\xc5\x4d\xe7\xb0\x0e\xbc\x77\x68\xb2\xc4\x97\x63\x67\x3a\xca\xe9\x17\x9e\x97\x39\xa1\xb9\x2c\x05\xc8\x64\xcb\xe0\x84\xcb\x6b\x96\xee\x07\x60\x2b\x00\xa5\xd7\x42\xaa\x25\xb4\x48\x67\xc4\x24\xcf\xd7\xb2\xd5\xca\xa2\xd5\xcd\x92\xd5\xc1\x82\xb5\xb3\xe5\xca\x1b\xa9\xdb\xe3\xe3\x47\x6f\x37\x6f\x60\x24\x17\x5b\x31\xd2\x1f\x70\x70\xed\x08\xe3\x70\x4d\x64\xce\x8d\x09\x2e\x59\x01\xc3\x7a\x84\x9b\x9a\xf5\xd3\x9d\x05\x3e\x41\x1a\xcb\x35\x61\x5f\xac\x36\xc5\xc1\x8a\xee\x6f\x2d\x7a\xc8\x65\xef\xb8\x06\x03\x1a\x15\x84\xe7\x45\xc6\x72\xef\x43\xda\xf7\xba\x99\x73\x32\x78\x39\x1f\x2f\xe7\x63\x55\x27\xdd\x45\x16\x89\xc5\x10\x34\x14\x8c\x59\x56\x89\x23\x16\xb3\x0b\x99\x6a\x27\x2f\x78\x1c\xb2\x67\xe1\xf2\x0b\xd7\xe0\x89\xfb\x91\x81\x65\x60\xc4\x8c\x26\x77\x33\xa9\x19\xf6\xa0\x8a\xb9\x71\x22\xd6\xe8\x2d\x21\x70\x8f\x00\x4e\xa3\x93\x49\xbd\x45\xca\x8a\x4c\x2e\x72\x90\x6c\x87\x26\x96\x67\x82\xe8\xc2\xf2\x22\xa3\x86\x05\xc1\x66\xb3\xb5\xe1\xde\x9c\x0f\xbe\x7e\xf9\xc5\x4a\x00\x51\x1c\x44\x0b\xd8\x36\x3b\xd6\x4d\x53\x0d\x48\x3b\x22\x93\xa3\xcf\xf2\x0d\x48\xf8\xd5\x1b\x80\xe6\xd9\xd5\xc5\x7a\x07\x49\xd2\xca\xbc\x42\xb6\x9b\x58\x96\x96\x71\xb6\x61\xaa\x0d\xe9\x15\x7d\x7e\xbd\x07\x2b\x7a\xa0\xf7\xd0\x78\xd5\x73\xee\x73\x21\x3a\x00\x1b\x2b\x96\x61\xe8\x83\x33\x34\xdb\x46\xce\x73\x7d\x3f\x1a\x59\x5b\xbb\x7b\x1b\x9b\x7b\x3f\x4c\x7e\x4f\x4a\x60\x2b\xa3\x7c\x6d\x33\x40\xc9\x8e\x8f\x2a\xb8\x1c\x59\x48\xa2\x7d\xde\x6d\x04\x2d\x8a\x0c\xee\xeb\x64\x5b\xdf\xac\x96\xea\x18\x2e\xbf\xe3\xa4\xc3\x96\xc7\x0e\xb7\x76\xe6\x87\x1a\x11\xc0\x9e\x8e\x19\x2f\x9c\x37\x23\x5a\xeb\x7c\xfc\xc2\x67\xb0\xa3\x56\x31\x25\xf6\x24\x0c\x45\x8f\x5c\x49\x63\xff\x77\x89\x36\x51\x8b\x37\x17\x92\xe9\x2b\x69\xe0\xcd\x5e\x97\x8d\x53\xe9\xb8\x68\xec\x04\x07\x44\xe0\x99\x04\x83\x74\x14\xd0\x80\xbe\xa2\x40\x0a\x3d\x80\xb8\x26\x43\x41\xa4\xf2\xab\x0b\x56\x5d\xed\x86\xf0\x9a\xa1\x90\xa2\x8f\x6e\x84\xab\xc6\xb8\x0c\x3e\x94\x31\x4c\x36\x0c\xe7\x86\xba\xb1\x14\x18\x7f\xc1\x10\x96\x8c\x26\x2c\x25\x69\x09\x93\x86\x70\x0c\x6a\xd8\x94\x27\x24\x67\x6a\xca\x2c\xd3\x4e\x66\x6d\x41\xbd\x8d\x2e\xe1\xd3\x82\x3a\xc5\x83\x6e\xd9\x3f\x20\xc1\xef\x80\x4b\x74\x23\xdb\xd8\x07\xc9\x5b\x4e\x0b\xbb\x75\xff\xb0\x54\x0c\xa0\xf7\x2f\x52\x50\xae\xf4\x80\x9c\x79\xd7\xdb\xf8\x37\x67\x03\x8b\x87\xb1\x23\x58\xa9\xef\x87\x92\xcf\x69\x66\xe9\x26\x0a\x78\x0c\xc5\x3b\x3b\x7a\x93\x59\xf4\x1c\x2f\xb5\xe7\x1b\xfd\x5d\xb8\x26\x07\xb7\x6c\x71\xd0\x5b\xda\xee\x83\xa1\x38\x40\xfa\xba\xb4\xc1\x81\x18\x83\x47\xc9\x01\xfc\x76\x70\x3f\xfe\xf2\x00\xc2\xdf\xd6\xbd\x34\x32\x63\x2a\x0e\xfd\xdc\xb2\x87\x37\x55\x7b\x58\x5a\x75\xbd\x1b\x8d\xf4\x38\xb7\x14\x37\x5e\x6c\xb1\x67\xab\x9a\x17\xa0\x96\x31\x34\x99\xa1\x17\xb7\x9b\x17\xc4\xd1\x2c\x88\xdd\x33\x83\x74\x1d\x10\xc3\x71\x48\xa3\xe0\xd2\xe7\xb7\x01\xdb\x7a\x0c\xe4\xa7\xdf\x45\xfe\xed\xd0\xde\xfe\x11\x30\xe4\xb7\xfe\x5f\xbf\xbb\x67\xdc\x42\x3b\xc6\x86\x53\xea\x20\x60\x5c\x42\x07\xc2\x45\x0a\x17\x4c\x6e\xa9\x00\x01\x1c\xcb\xc2\x07\x96\x35\x20\x97\x96\x50\x91\x9c\x51\xa1\xbd\x99\x0b\x6e\xa2\xaa\xc6\xda\x5d\x99\x45\x7a\x95\x33\x29\x54\x27\x83\x91\x2b\x39\x72\xb6\xaf\x1e\xb9\x06\x5b\x6a\xf5\x06\x4e\xd2\x95\xbc\xfc\xc2\x92\xd2\xac\xbd\xcb\x8a\xe1\xb6\x95\x8b\x6c\x65\xf4\x35\x80\x7c\x5b\x31\x79\x5c\x59\x8d\xc9\x57\x18\x1c\xb3\xf9\x8d\x90\xb9\x65\x8b\x8a\xd9\x38\x11\x02\x48\x7e\xaf\xc2\x12\xcf\x0a\x90\x77\xfc\xb7\x37\x65\xe5\x63\x2e\xf0\x63\x38\xb4\xdf\x0a\x18\xdd\x03\xd4\x4a\x76\x59\x86\x9f\xd9\x07\xb8\xda\xc9\x19\x35\x98\x7d\xe8\x20\x63\x04\x2a\xb9\x5a\xba\x88\x44\x8a\xcb\x1f\x4a\x9a\xd5\x83\x10\xdc\x2b\xd7\x68\x89\xaa\xdf\xf1\x2c\x4d\xa8\x72\x5e\x5e\x18\xa6\xa9\x25\xee\x1e\x05\x42\x90\x50\x11\x4e\x7b\xb5\x47\x1a\xaf\x2a\x0b\xaa\x0c\x4f\xca\x8c\x2a\x1f\x39\xde\x2a\x50\x60\x2b\x44\x2b\xa4\x19\xb1\x44\x8a\xb4\x8b\x02\x70\xd3\xec\xdb\xbc\x6b\x2d\x98\xe2\x12\xbd\x8b\x79\xce\x9a\x48\x7a\x54\xb7\x69\xcb\x89\x3f\xd5\xe1\x88\xd5\x2c\x1f\x10\x9b\xe9\x19\x1e\x9f\x0a\xa9\x58\x7a\x1c\x91\xc7\x70\x2a\x06\xe4\xcd\xc2\x9b\x59\xc0\xe4\xe2\xa2\x2b\x34\x33\x3e\x10\xc6\xa3\xac\x03\x76\x75\xa0\x26\x52\x41\x70\xca\x51\x2a\x31\x22\x63\xce\x13\x73\x3c\x20\xff\x97\x29\x09\x1b\x2f\xd8\x94\x1a\x3e\x0f\xdc\x34\x28\xae\x8a\x51\x77\x83\xff\x8a\x1c\x41\x37\xc2\xf3\x9c\xa5\x9c\x1a\x96\x2d\x8e\x51\x8f\x65\x44\x2f\xb4\x61\x79\x9b\xad\x6b\x63\x34\x40\x5f\x3b\x68\xfb\xab\xaf\x37\xb4\xec\x1a\x43\xf5\xd9\x47\xa5\x54\x90\x41\x1f\x82\xc6\x16\x06\x1e\x24\x37\x88\x9b\xb1\x0f\x82\x0b\x6c\xf6\x92\x65\xbc\xc1\xdf\x5b\x3c\xa0\x44\x31\xc8\x40\xe0\x30\xf7\x9e\x38\x8e\xde\x94\xef\x65\x29\xd6\x9b\x04\x6b\x0b\x7f\xe7\x94\xf0\xcf\x51\xc7\xb5\x51\x8a\x8f\x22\x26\x44\x33\x89\x4c\x94\x94\x80\x5d\x12\xd8\xb9\x25\x0f\xd8\xaa\xf2\x44\xd9\x3a\xc9\xbd\x46\x24\xc2\x5c\xb6\x78\xbd\xef\x25\x6e\x31\x7c\xa8\x03\x2e\x83\x83\xb8\x03\x4c\x23\x6e\xcf\x38\x72\x00\xf8\x89\x10\xac\x10\x14\xbe\xc5\x52\xef\xc5\x66\xa9\x81\xeb\x4a\x0e\x4f\x0f\xf7\x42\x7c\x71\x39\x4a\x16\x74\x0a\xe7\xa9\xc3\xaa\x9a\x5d\x49\xca\x0c\x53\x39\x04\x5c\xcf\xe4\x1d\xfe\x8e\x6c\xab\x70\xad\x58\x5a\xc5\xb6\xcf\xa4\x06\xae\x54\x0f\x62\x84\xf3\x0b\x17\xa3\x77\x74\x41\xa8\x92\xa5\x48\x9d\xd4\x14\x08\xe8\xfb\xc6\x87\xaf\xa4\x00\x4a\x51\x6a\x0b\xab\x9b\x1a\x95\x1e\x33\x43\xed\xb1\x79\x3d\x78\xfd\x6a\x2f\x00\xeb\x18\xb7\x0a\xb3\x69\x58\x0a\xfd\x5d\xb9\x3f\x33\x7b\x99\x97\x62\x34\xfd\x20\xb2\x2e\xb2\xdc\x7b\x44\x2f\xe8\xda\x07\x25\x8c\x4f\xc0\x76\xdb\xc3\x57\x77\x8a\x1b\x16\x91\xc7\xa3\x09\xcd\x34\xb3\xaa\x7b\x29\x82\x08\x7b\x5c\x17\x41\xa0\x49\x9b\x05\x6d\xf7\x07\xd1\xe5\xf8\x9e\xe7\xcc\x1d\x28\x40\xb9\xea\x98\x05\x84\x3b\xd4\x1b\x8e\x5c\x3d\xb8\x93\x1c\x61\x4b\x2b\xb1\x49\x69\x8e\xf7\xe3\x24\x82\x0b\xb4\x9a\x75\x17\x95\xc4\xc7\x0d\x17\x7b\x5c\xed\x1b\x36\xa3\x73\xa6\x89\xe6\x39\xcf\xa8\xca\x20\x56\x70\x84\xf3\x23\xe3\xd2\xac\x8e\x40\xef\x16\xdd\x1c\xcf\x24\x1a\x6e\x2b\xa8\xfd\x3c\x2c\x9c\x80\x46\xf8\x79\xd9\xef\xe4\xa5\x29\x69\x96\x2d\x08\xfb\x92\x64\xa5\xe6\xf3\xfb\x9e\x26\x17\xfd\xb0\x03\xab\x6e\x72\xe9\x42\xa6\xa3\x82\x25\x8f\xc9\xa3\xeb\x1a\x86\x25\x55\xa9\xdf\x74\xe0\xc9\xa8\xec\x83\xe6\xbe\x00\xcf\xa7\x24\x61\x5a\x7b\x9f\xca\x45\xec\xe7\x19\xd6\xf0\x63\x49\x28\x40\xef\xf4\x65\x46\xb5\xe1\xc9\x9b\x4c\x26\xb7\x23\x23\x55\xa7\x98\xfd\xb3\xef\x46\x4b\xfd\x1b\x69\x18\xce\xbe\x1b\x91\x0b\xae\x6f\xe3\xc4\x2e\x78\x69\x1a\x9b\x4b\x28\xb9\x2d\xc7\x2c\x63\xe6\xf0\x50\x23\x97\xcb\x69\x32\xe3\x82\x79\x06\x27\x42\x48\x8a\x53\xf8\x2c\x94\xbb\xde\x99\xba\xc0\xa7\x13\x87\xaf\x3f\xa3\x77\x9a\xe1\xf4\xc7\x76\xfa\xf6\x67\xd6\x26\x22\x7d\xaf\xf7\x14\x38\x99\xe1\xc5\x9e\xee\x20\x26\xfa\xc6\xce\xb1\x9b\x71\xfb\xf0\x2d\xcf\x18\xea\x38\xb0\x44\xef\x95\xe6\xce\x01\xec\xd8\x42\x96\xe4\x8e\xa2\x56\x0c\x34\x70\x40\x6e\x78\x71\x4a\x2e\x85\x2e\x15\xab\xec\x19\x93\xc6\x50\x5c\x57\x91\x65\x5e\x9d\x82\x1d\x46\x95\xc3\x52\x3a\xa7\x5d\x91\xcb\x2f\x34\x2f\x32\xa6\x4f\xc9\x01\xfb\x62\xbe\x3e\xe8\x91\x83\x2f\x13\x6d\xff\x27\xcc\x44\x1f\x0c\xc8\x30\x0f\xf7\xec\x90\xfa\x47\x31\xef\xfa\x84\x1d\x2c\x33\x8e\xf8\xec\x83\x20\x88\x73\xa3\xb3\xd2\x5a\x2a\xc9\x1d\x66\xa0\xb0\x24\x9e\x29\x25\x55\xf0\x3c\x8f\xc0\x00\xdc\x25\x91\x79\xa1\x64\xce\x23\xc3\x1e\x20\xf8\x5e\xfd\xeb\xc0\xdc\xb0\x5d\x24\x5d\xde\x7f\xcc\xe9\xe6\x3a\x93\x3a\x73\x5c\xb7\xfb\xc3\x89\xf7\x98\x40\x55\xd1\xe9\xee\xa0\x7f\xba\x46\x76\xbf\xdd\x28\x96\x5a\xc5\x3b\xfc\x36\x44\xcd\x91\x93\x94\xcd\x4f\x74\x4a\x5f\xf7\xe0\x33\xda\x79\xfb\x99\xda\x9c\xa8\x26\x07\xaf\x0f\x06\x64\xe4\xb9\x6d\x2f\x9e\x63\xd5\x6e\x22\x55\x18\x10\x8c\xe9\xaf\x0e\xc8\x91\x54\x30\x72\x42\x05\xc9\x18\x9d\x3b\x03\x32\x9e\xa9\x05\xea\xb4\xc7\xad\xa3\x1e\xdb\x06\x80\x45\x5a\xfe\x7f\xfe\x72\x4b\xeb\x76\x92\xe8\xf2\xbe\x79\xcf\xc8\x03\x2b\x82\x1e\x80\x30\x29\x2d\x8d\xb5\x54\xd3\xb2\x55\x48\xab\xe5\xc6\xae\x16\xcc\xc5\x92\xa6\x8c\x03\x6c\xdc\xd4\x03\x90\x53\x0f\x9e\x80\xea\x92\x8e\xf1\xf5\x9e\xa4\x76\x85\xe6\x27\xc1\x7f\x28\x19\x19\x5e\x84\xc8\x7a\xa6\x34\xd7\xc6\x9e\xee\xb4\xc6\xc3\x38\x32\xb6\xa3\xb3\x9c\xfe\x5d\x0a\x72\xf9\x66\xe4\x3e\x7a\xfc\xa4\xe0\xd9\x4a\x24\xe8\xdf\x4b\xc5\x2c\x3b\xee\xe2\x30\xe0\xfb\x34\x39\xbb\x7d\x4f\x2e\xa8\xa1\xc8\xe0\x9d\xcb\x95\xa8\x28\xbc\xc5\xc2\x31\x17\xa9\xfb\x29\xe2\xdc\x8f\xcd\x64\xed\xee\x5d\x6d\x92\x97\xe2\x86\x9f\x3e\x0e\xf7\xc4\x8c\x13\xa0\xf1\xd3\xf7\x32\xed\xcc\x91\xff\x60\x01\x78\x8e\xfd\x49\x6e\x07\x20\x56\x67\xef\xc1\x71\x26\xf6\x3c\xbb\x7f\x7e\x67\x35\xce\xd6\xc4\xab\x15\x1b\xf1\xd0\xea\x38\xe7\x9b\x48\x4f\x07\xda\x61\x51\x03\xce\x8d\x63\x28\xe3\x4c\x8e\x89\xc3\xf7\x7d\xcf\xf7\xd3\xc7\xe1\x0e\xd3\xfd\xf4\x71\xf8\xb8\x53\xdd\x49\x3c\x6b\x4a\x67\x15\x0f\xae\xc2\x31\x9a\x62\x57\x7b\x99\x6b\xb0\x2f\x69\x6b\x9f\x70\x5a\x95\x55\x72\x0b\x94\x0e\x2f\xbf\x14\xe8\x7c\xe6\x8c\xfc\xa3\x19\x85\x38\xe6\x10\x5d\x07\x9b\x6a\x77\x59\x5b\xca\xee\xb7\xd7\x6a\x74\x40\x9f\xc8\x05\xc3\x2b\xcb\xf4\xd4\x3b\x02\x84\x1e\xab\x3b\xbc\x07\xb7\xcb\xf4\x14\xe9\x2a\x41\x2f\xcc\x34\xc2\xa6\x23\x34\x11\x89\xf0\x13\x9d\x53\x9e\xd1\x31\xcf\xb8\x59\x58\x0e\x7d\x3c\xa8\xb9\x96\x6a\x98\xf2\x5e\x0f\xf3\x8e\xa2\xc5\x92\x81\x8a\x1c\xd9\x91\x4e\xc0\xc0\x75\x3c\xa8\xa4\x8a\x19\x53\x2e\x08\x11\x45\x8f\x9a\xc8\xa1\x99\x01\x6c\x6b\x48\x1c\x6d\x51\x65\x3b\xbb\x07\xc0\xdb\xf3\xd1\x95\xa1\xd9\x3e\x2b\x19\x1a\xfc\x30\x72\x39\xe1\x9e\x33\x4f\xc3\x78\xa9\x56\x5c\x0d\xd0\x6a\x6b\xcb\xf6\x7c\xed\xa7\x8d\x53\x24\x04\xa3\xed\xc0\x04\xed\x54\x85\x63\x82\x3e\xbe\xbe\xe6\x46\x89\x58\x36\x72\xa4\xc4\xa5\x4b\x42\xbe\x69\x71\xeb\xdb\x16\xa9\x02\xba\x24\x58\xf0\x3b\xdf\x35\xe4\x6a\x06\x6e\x15\xdb\x91\xab\xf5\x6c\x12\x56\xcc\x26\x5d\xee\xa9\xcf\x59\x31\x7b\x3b\xaa\x9b\xe7\xec\x3b\xf2\x76\xb4\xe2\x5c\x02\x90\x61\xb5\x1a\x8d\x76\x87\x9a\x64\x7c\xc2\x0c\xdf\xb2\x84\x07\x38\x99\xb9\x14\xdc\x48\xb5\x3e\x2e\x99\x74\x3a\x6d\x7e\xb8\xae\xfc\xb0\xca\xe4\xf1\xde\x8d\x80\x0e\x70\x89\xcc\x32\x96\xf8\x3c\xd6\x00\x52\xff\x89\x55\xca\x0b\x73\x3a\x7b\xc8\xf2\x8f\x8a\xca\x09\x6e\xe8\xc9\xc7\xcb\xb3\x8b\xf7\x97\x83\x3c\xfd\xd9\x4c\xde\xf5\x8d\xec\x97\x9a\xf5\x79\x8b\x54\x21\x4f\xe7\x46\x88\x4f\xd1\x2a\x73\x55\x1d\xa4\x1f\x7c\x00\x23\xf9\xa4\xd1\x6d\x00\x4c\x39\xfe\x52\x48\x4a\xd3\x23\x8a\xba\x20\x45\xea\x2c\x41\x65\x96\x21\x94\x8d\x62\xac\x17\xab\xd4\x1b\x63\x33\x3a\x2f\x68\x57\x23\x42\xb5\xa8\x87\x25\xd0\x8f\x8f\x5c\x5d\x68\xfd\x76\x21\x62\x13\xe4\x46\x61\x0c\xef\x7f\x01\x57\x4d\x46\x82\x7f\x16\xf8\xdb\x4e\xa4\xb2\x58\xa3\xea\x18\xc0\x4c\x02\x8b\x3d\x29\x35\x53\x03\xc7\x31\x1e\x1d\x50\x1d\x92\xf5\xec\x90\x23\xad\x09\xa6\x8f\x6c\x82\x0e\xc9\x3e\x67\xae\x93\xa2\x68\x69\x66\x4c\x18\x9f\x72\xdc\x01\x63\x25\xdc\x9c\x87\xf3\xa3\x03\xaa\x65\x7a\xa0\x6e\xc9\x7c\x5e\x12\xe0\x74\x41\x43\x7b\x50\xee\x45\xb7\x43\x74\x94\xa2\xa9\x04\x17\x08\xcc\xe9\x56\x43\x30\x9a\xe6\x5c\x3c\xc3\x83\x98\x70\x91\x6e\x5b\x7f\x23\x71\x1d\xf4\xa8\xcb\x51\x38\x8a\xb7\x9e\x87\x9b\x38\xea\xf5\x1a\x0c\x21\x77\x77\x72\xf5\x1b\xb9\x56\x87\x2e\x5f\xe8\x1f\xb2\x3e\x7e\xa5\x5f\xa4\x15\x54\x5e\xae\xd7\xf6\x6f\xc0\x79\x84\x4b\xb3\x3d\xed\x2f\xf9\xf7\x13\x68\xee\x0d\xa9\x2e\x32\xcc\xbd\x78\x33\x54\x4d\xd1\x3e\x68\x0b\x33\x82\x61\xf9\x15\xa7\xbb\x5a\x10\x14\x54\xd1\x9c\x19\xa6\xd0\x75\xcc\x39\xa3\x09\xe7\xd5\xff\xa1\x60\x62\x64\x68\x72\xbb\xef\x14\xa2\x2f\xfc\xf4\xe1\xf8\xe9\xae\xb7\x65\xde\x49\x26\x0d\x98\xe0\x12\x0a\x2d\xe2\x9b\x59\x2e\x1c\xb3\x79\x26\x74\x25\xe4\xf1\xea\x62\x89\x08\x79\x9c\xea\x4c\xb4\xca\xeb\x85\xc6\x07\x70\x11\x0b\x89\xe9\xc0\xf5\x1d\xa1\xb0\x1f\xa6\xd7\xfe\x10\x38\x39\x66\x97\x7b\xa7\x8a\x1e\xe4\x32\x65\x64\xcc\x4d\x75\xd2\x35\x33\xa4\x60\x2a\xe7\x2e\x00\x5a\x0a\xac\xc1\xc7\x52\xe4\x5e\x96\x53\xb9\x4f\x47\x9c\x4d\x10\x99\x18\x5f\xe4\x8a\x8c\x99\xb9\x63\x4c\x90\x57\xaf\x5e\xbd\x02\x79\xe3\xd5\xaf\x7f\xfd\x6b\x02\x19\x17\x52\x96\xf0\x7c\xb9\x21\xb4\xfa\xaf\xd7\xaf\x07\xe4\x8f\x67\xef\xdf\x81\xff\x55\x61\x34\x19\x4b\x33\x73\x23\xdb\x06\xb5\xce\xba\x47\xfe\x67\xf4\xe1\xca\x8b\x09\xba\xf1\x2b\xa8\x14\x61\x79\x75\x67\xba\x57\xbf\xfa\xfa\xeb\x01\xb9\xe0\x0a\x22\x6f\x39\xc4\x0a\x04\x77\xc1\xc2\xbb\xd0\x09\x69\x96\x63\xdd\x1d\x9b\x70\xee\xb4\x39\x9f\xce\x0c\x56\x4b\x02\x4c\xc9\x78\x62\x30\xfb\x1e\x1e\x76\xcc\x85\xa4\x5d\x28\x89\x0b\x8c\x72\x8e\x23\x30\xb9\x1e\xc9\xf8\x2d\x23\x13\xfd\x8d\x92\x65\x51\x05\x04\x2a\xa6\xad\x8c\xea\x6a\x31\xe1\x60\xd5\x5e\x69\x66\x9e\xd4\x93\xa1\xa5\xa5\xa6\x86\x74\xc3\x9a\x00\xd2\x0b\xf9\xc7\xfa\x88\x09\x05\xe5\xc1\xb9\x0e\xae\x9b\x6b\xd9\xef\x83\x16\x99\x46\xe7\xd4\xc7\x77\x14\x4a\x7e\x8f\x9b\xc4\x85\x8f\x14\x72\x32\xaf\x76\x32\x97\x0b\xcc\x04\x9b\x2d\xaf\x47\xae\x5b\xbe\xe7\xa2\xe2\xa3\x18\xa3\xe1\x24\x0e\x46\x83\xd0\x6d\xae\xed\x27\x6a\xc9\x21\x57\x7c\x39\x2e\x4f\x68\x66\x1a\x77\xb4\x14\x4b\xbd\x5d\xad\x11\x47\x69\x5c\x05\x1a\x17\xe6\x55\x8d\x81\xee\xaa\x2e\x48\x26\xaa\x6b\x54\x4b\xd8\x56\x73\x92\xd1\xcc\x94\x0e\x34\xe0\xab\x64\xbf\xcd\xb4\x76\xb1\x36\x39\x55\xb7\x56\xec\x77\xe7\x7f\x00\x9e\xc1\x3a\xc4\xf9\x60\xd0\xd5\x9c\x85\x22\x75\xb1\x67\xbd\xfd\xc8\xe1\x60\x70\x88\x07\x44\x2a\xcc\x77\x89\xd8\x6e\xdf\x3f\x51\x4c\x71\xdd\x73\x9b\x16\x51\x09\x3a\x57\xda\x83\xd6\x3c\x82\xa9\x83\x54\x9b\x2c\xb7\x9d\xc4\x97\x6e\xf9\x82\xdb\x66\x0c\xc6\x96\x45\x9b\xb2\x05\x5d\x25\xa8\x0e\x09\x86\xd7\xd7\x4d\x71\x47\xa0\x5d\xce\xe0\xce\x39\x70\x09\x7a\x45\xec\x32\xc7\xae\x4c\xce\x05\xb1\xd5\x2a\x66\x3d\x7f\xae\x36\x9c\x60\xf8\x47\x9d\x56\x39\x5a\x10\x49\x08\x55\x75\xaa\x2a\x16\xe4\x59\x33\xaf\x18\x5d\xba\x65\x63\xef\xc2\xc8\xf0\x69\x77\x49\x80\xcf\xd2\x39\x08\x34\xb3\xa8\x55\xbb\xc8\xd0\x00\x00\x72\xa3\x3f\x2c\x03\xf2\xde\xd1\x54\x44\x2e\x3a\xd6\x32\x2b\x0d\x76\xad\x7e\x8c\x09\x2e\x0c\xea\x53\x0e\x00\x95\x0d\xcd\x22\xf2\x6b\xaa\x7a\x5f\xed\x28\x31\x3e\x1d\x0e\xe3\x4b\xea\xcb\x27\x4b\x2b\x5b\x65\xec\xd6\x0f\x96\x62\x36\xd1\xbc\x8b\xaa\x34\x1a\x92\xa3\xaa\x54\x86\xbf\xe6\x1e\x0a\xc3\xd4\x84\x26\xec\x38\x56\xa1\x42\x49\x92\xe0\x59\xe3\x63\x03\x66\x54\xa4\x19\x8a\xd6\x09\x53\x80\xf2\xec\x8b\x2b\x96\x6b\x3f\x91\x2a\x0e\x45\x60\x8f\xde\x30\x2b\x0f\x32\x6a\x4a\xc5\x5a\x45\x18\xed\xd7\xad\x10\xa6\xb1\x2f\xa5\x0d\x06\xeb\xea\x52\x01\x9d\xbc\x84\x2a\xa2\x63\x55\x81\x09\xa1\x8a\x20\xd5\xb1\x5a\x3a\xb0\xa8\x04\xf4\x18\x48\xc5\x42\x96\xca\xd9\xbd\x7d\x6e\xd1\x44\x2a\xab\x08\xe1\xc0\x54\x13\xc5\xa6\x56\x5a\x55\x20\xd6\x62\x8b\xac\xb4\x2f\xf6\xea\xfc\xb5\x67\x27\xb9\x4d\x2e\x6e\x13\x27\x3e\xcb\x39\x4f\x3d\x8b\x84\xbb\xa5\xaa\xc4\x5f\x41\x75\x14\x77\x12\xa5\x63\x8f\x20\x8c\xc2\x38\x30\xd2\x10\xd1\x59\xf3\x9f\x8e\xad\xbb\x12\x12\x3d\xb4\xa8\xa5\xd0\x85\x08\xcb\x94\x5d\x97\xe3\x8c\xeb\xd9\x68\x47\x53\xe0\xd5\x8a\x21\xd0\x61\x60\xe9\xa2\x6e\xad\x79\x50\x33\xa1\x39\xb0\x3c\x4b\xc6\x2d\xb3\x85\xda\xc1\x12\x80\xe8\x7b\xc7\x98\x29\x21\x30\x22\x63\x2e\x9c\xdf\xfe\x14\xcd\xc3\x45\x68\x61\x02\x8f\x94\x7d\x12\x45\xed\x7d\x42\xb3\x4c\x37\xa3\x57\x3d\xa1\x45\x99\xc3\x47\x6d\xe1\x9e\x72\xbb\xdd\xa1\x4c\x48\x23\x15\xe4\xda\x85\x69\x92\x4b\x8c\x70\x11\x44\x0a\xdf\x08\xf2\x90\xf8\x0e\x51\x54\x1f\xc4\xee\x02\xca\xec\xb9\x8e\xe2\x8b\x0d\xf4\xe1\x6c\xa0\x3b\xde\x34\x54\x95\x94\x68\x14\x11\x5c\x2f\xf5\xec\x49\xa9\x27\xb9\x5b\xae\x24\xf6\x7a\x2b\x80\xdf\x3c\x33\x58\x9e\xbc\x73\xce\xb3\xcf\x8d\xee\xc0\xa6\xad\xde\x01\x87\xb7\xef\x34\x8b\x24\xc2\x4c\xa7\x10\x84\x23\xb0\x7c\xe4\x2b\x9e\x03\xec\x06\x5f\x1e\x6a\x92\xca\xa4\x0c\xb9\x51\x01\x68\xd5\x05\x58\x9b\x0c\x82\xa4\xeb\x71\xea\x9e\xd6\x2a\xfe\xc8\x56\xac\x4a\xe5\x9d\xb8\xa3\x2a\x3d\xbb\xde\xe2\x97\x5e\x67\xe7\x55\xaf\x58\x50\xf2\x83\x41\x25\x3c\x3a\x96\xa5\xa9\xd2\x67\xfe\xb4\x4d\xcf\x46\x5a\x8a\xd0\xd2\xd2\x4c\x5e\x8c\xd7\x2f\xc6\xeb\xe6\xf3\xe0\xc6\x6b\xdb\xa7\x9e\x0b\xb6\x76\x5c\x7d\x8a\x01\x9e\xb5\x75\xa5\x7d\x48\x2b\x68\x44\x60\x90\xba\x37\xfd\xe0\x1b\x72\x1b\x1e\x91\x6a\x6f\x23\x59\xcf\x53\x20\x60\xd5\x4f\x6f\x31\x7d\x20\x3b\x68\xfb\x5a\xbd\xf8\xac\x73\xc1\xdd\x54\xbb\x17\xa4\x86\xa8\xd8\x6e\xcf\x65\x42\xee\x39\xbd\x4b\xa4\x55\x19\x3b\x4c\xc4\xdc\xa1\x54\x27\x3e\x1d\x81\x4f\x3a\x6f\x00\xe9\x58\x48\x17\x9f\xae\xbb\x41\x76\x28\xaa\x8b\xcf\x13\x97\xd6\xc5\xa7\xb3\x89\x9b\x74\x2f\xb3\xbb\x62\xb9\x0f\x5b\x6c\x77\xc7\xa5\x3d\xbe\xf5\xbe\x57\x95\x78\x7b\xfe\x6c\xfd\xc5\x7a\xbf\xf4\x3c\xa2\xf5\x3e\x22\xdc\x9e\x18\x38\x00\xc4\x16\xfd\xd8\xdc\xe6\xcd\xfa\x63\xe6\xc5\xca\x41\x95\x81\xcc\xa2\x9c\x37\xe8\x4b\x55\xbf\x36\x3d\x1c\x0c\x0e\x0f\xbd\x99\xdf\xe1\x67\x69\x26\xfd\xdf\x10\x26\x12\x99\xe2\xa6\xda\xf1\x95\x36\xc0\xf4\x2b\xed\x3c\x9e\x4b\xee\xbf\x15\x5f\xbd\xc2\xd8\xdd\xb6\xa4\xc3\x09\xee\x5e\x3a\x7b\x15\xa4\x1f\xa3\x80\x76\x5c\x26\xbb\x5e\x15\x1b\x5b\xdc\xa7\x14\x76\x0c\xbc\x07\xe7\xaf\xad\x8b\x63\xe3\xb3\x0b\x7b\xdd\xa1\x50\x36\x3e\x8f\x5c\x2e\x1b\x9f\x9d\x38\x6a\xa7\xd2\xd9\x2b\x16\xf7\x78\x05\xb4\xf1\x79\xa6\xc5\x54\xea\x4f\xa7\x62\xda\xf8\xec\x56\x52\xbb\xde\xb7\xe3\xd6\xef\xa5\xbc\x36\x3e\xdd\x8a\x6c\xe3\xb3\xef\x52\xdb\xf8\xb4\x84\x04\xd8\xc0\x2f\x78\xa7\xe0\x81\x4b\xd7\xa7\xee\xf9\x68\x58\x5e\x48\x45\xd5\x82\xa4\xce\xd6\xb0\x58\x11\x80\x19\x45\x60\xde\x3b\x2b\x0a\xcc\x3d\xe5\x6a\x4f\xf1\x03\x1d\x82\x2f\x59\xca\xcb\xb5\x25\x8b\xd7\x81\xed\x3b\xc8\x86\xe5\x32\x69\xf9\xcb\x4d\x1c\x2a\xa4\x12\xa4\xc9\xad\xab\x91\xe3\x61\x88\x9c\x3e\x4e\xb9\x73\xd0\xc8\x7c\x0c\xc6\x30\xb8\xe9\x73\xb5\x00\x7d\x63\x1c\xbb\x66\xb8\xc2\x2b\x0f\x77\xf7\x7f\xe4\x1a\x1e\x5b\xf9\xe3\x3d\x30\xbd\x47\xda\x13\xd2\x31\xc8\x8c\xff\x9d\x41\x81\xad\xce\x29\xac\x24\x88\xdd\xa1\xf0\x57\x26\x93\xe8\x62\xb9\xc6\x7e\x00\xea\x01\xb3\xbd\x61\xde\xc2\xde\x7e\x1d\x85\x07\xb0\xe8\x64\x1a\xef\xea\x78\x02\xb9\x1b\x41\x44\x07\xd8\x05\x78\xdf\x44\x65\xf0\x4a\x6d\xbf\x04\xa9\xd5\xa3\x36\xd5\x87\xee\x7c\x0a\x49\x13\x55\x2a\xab\x2b\x16\xf6\x97\x91\x87\x40\xa4\x94\x41\x78\x82\x97\xc2\x75\x09\x32\xa0\xfb\x8a\x93\x85\xe4\x04\xee\xa3\xaa\xba\x5f\x21\x7b\xe1\x12\x56\x09\x9e\xd5\xd1\xca\xa7\x6e\x0b\x0b\x2f\x85\xf3\x22\x58\xc2\x91\xd5\x28\x52\x6a\xa6\xfa\xd3\x92\xa7\xbb\x20\xc7\x33\xe6\x6e\xad\x79\x5a\x77\x4e\xd6\x91\x7f\xdd\x83\x6b\x05\x2f\x8b\x0e\x74\xff\xe0\x32\xb8\x66\xd4\x08\x7f\x9c\x12\xae\xee\xa6\x41\xbd\x27\x40\x38\x72\xfe\xbe\xe7\x26\xe8\xad\x8e\x21\x24\x8b\xc4\x85\xc9\xf2\x5a\x3e\x47\x1c\x16\x31\x0f\xbc\x52\xfb\xf6\x3f\x5e\xbf\xf5\xc6\xfa\x31\x9b\xc8\xaa\x04\x08\xaa\x3b\xce\x97\x36\x65\x19\x83\x3a\xe9\xbe\x06\xbb\x6d\x00\xd7\xbc\xb9\x9c\x5b\x64\xfe\xb3\x20\x9f\x7c\x52\x7a\x3e\x39\x25\xf4\xb8\x16\xaa\xe0\xca\xaa\x08\xc6\x52\x74\xb0\xcd\xaa\xef\xa8\x52\xe8\x1e\x19\x1f\x7b\x67\x13\x38\x71\xc2\xca\x7c\x99\x17\x67\x51\x69\x56\xcc\x02\x00\x02\x7e\x95\xcc\x89\x16\xb4\xd0\x33\x09\xd5\xf5\x13\x5a\xd0\x84\x9b\x85\x05\xb7\x51\x34\xb9\x85\x32\x3c\x8a\xb9\x2f\xf6\x48\x72\xec\xfc\xb5\x62\x08\xd6\xdd\x7e\xcd\x4c\xc9\x72\x3a\x03\x4f\x56\x6c\x95\x64\x54\x7b\x00\xac\xec\xef\xb4\x19\x4d\xd2\x85\xa0\x39\x4f\x42\xd2\x3c\x25\xe7\x5c\x73\xe9\xac\xb9\x38\xae\xc5\x7a\x72\x1d\xf2\x9e\xa1\x91\xf8\x3c\xa3\x3c\x27\x47\x9a\x31\x12\x10\x03\x7f\x71\xd5\xda\xd1\x78\xa1\x98\xed\x1e\x5b\x90\x65\x48\xde\x2d\x5c\xc6\x81\x8a\xd2\x85\x2b\x2a\x64\x94\x70\xdc\xd2\xd5\x9f\x3e\x0e\x5b\xb7\x7a\x66\x52\xc1\xc5\xbc\xcf\x5a\xc9\x44\x2a\xa3\xeb\xc9\xb3\xeb\xa1\x8e\xd5\x0e\xc4\x33\x97\xdb\x0d\x7e\xc8\xa4\x98\xc6\x21\xfb\x15\x96\x5a\xb2\x2a\xa0\x96\xc9\x9c\xa7\x25\xcd\x90\xa0\xba\xc9\x9c\x8f\x86\xd8\x9d\x4f\x67\xa6\x7f\xc7\xc0\xec\x82\x7c\xa7\x72\x6d\xf2\x1f\xe5\x4b\x6e\x39\x5c\x03\x01\x36\xce\x6c\x80\x26\x2c\x3b\xb5\x3b\xba\x80\xfc\x2e\xce\x85\xa4\x76\x33\xea\x73\x6b\xe1\x10\x01\xee\x11\xd0\x61\x7a\x67\xa1\x36\x85\x95\x18\xc0\x2e\x65\xa1\x0c\x58\xbb\x3c\x37\x0b\xf8\x28\xd7\x5d\x78\xed\xca\x90\x51\xbb\x47\x20\xc5\xfd\x59\xa0\x85\x09\xae\x3b\xc6\x91\xef\x15\x0c\x81\x76\x6c\xcc\x70\x04\x8e\xf5\xee\x18\x7e\xc3\x04\x53\x3c\x69\xa0\x4e\xe8\x3a\xa5\x06\x0e\x1f\x13\xb6\x5b\x3a\xd8\xac\x1a\x3d\x80\x8c\x37\xaf\x50\xe9\xc6\x55\x23\xec\x28\x7d\x1c\x7c\x17\x59\xe1\xa2\x7b\x13\x7b\x4a\xa9\x48\xfb\x34\xb3\xf8\x79\xfd\xf9\xdc\xf9\x45\xe3\xb9\xab\xf9\x05\xf8\xc2\x42\x5c\x84\x4c\xd4\x56\x4a\x59\x79\xdc\x20\x00\x7e\xcc\x52\x20\x53\x71\x0d\xc6\x3b\xab\x70\x3b\x14\xb9\xfe\x7c\xde\x23\x7c\xc0\x06\xfe\xaf\xd0\xd4\xd3\x49\x23\xa7\xe8\x55\x18\x3c\x45\x01\xbb\x61\x2a\xb1\x6d\x2b\xee\xfb\xb7\xdf\xda\x49\xda\x5f\x7f\xd7\xff\x6d\x94\xdb\xf3\x77\x7f\xb3\xfb\xad\x6c\x83\xfa\xdb\xd8\x35\x2d\x24\xb2\xff\xdb\xb5\x4b\xf4\xec\xd2\x40\xff\xcd\xd5\xb7\x62\xc2\x58\xc1\xf4\x5a\xc2\xa5\x3f\x4f\x11\xe7\xe1\xdb\x8a\x7d\xef\xed\x94\x00\xa6\x60\x23\x4a\xa8\x61\x02\x58\x83\x8f\xe1\x10\xd2\x60\x77\x57\xca\xd5\xce\xff\x08\x2c\x0c\x18\x6e\xd6\x23\x46\x4a\x38\xf4\x48\x58\xce\x04\x61\xbe\xfc\x25\xae\x15\xc0\x41\x9d\xdf\x9b\xe7\x76\x76\x58\x0b\xe1\x10\x91\x6b\xe7\x01\x73\xfb\x85\x90\xe6\x17\x61\xfb\x1b\x85\xb9\xe9\x5c\x72\x9f\xd3\xdb\x9e\x47\x81\x45\x12\x43\x96\xe9\xf1\x82\xe4\x5c\x1b\x7a\xcb\x06\x64\x64\xb9\x59\x7c\xb9\x86\xd0\x13\x04\x72\x41\xb2\x94\x94\xc2\xf0\x0c\x7e\xad\xc6\xb1\x53\x8e\xb9\xdc\x70\x42\x74\x09\x15\xc3\x0b\xc5\xfa\x9e\x6f\xba\x56\x4b\x14\xa7\x5a\x4b\x2f\x6c\xf6\x8c\xa2\xb2\x51\xa4\xd0\x15\xe0\x41\x85\x43\xaf\x25\x6f\x30\x3b\x4f\x29\x92\x8a\x57\x02\x30\xf5\x80\x5c\x01\x7b\xcc\xfc\x0d\x33\xea\x3d\xce\x1e\x2a\x58\xc2\xb4\xa6\x6a\xd1\x83\x5c\xe9\x3c\xe4\xd7\x76\x0e\x40\x40\x3c\x72\x2a\x30\x53\xb9\x62\x89\x14\xda\xa8\x32\x31\x58\xba\x6e\xac\xe4\x2d\x13\xc1\xfb\x30\x10\xa6\xe0\x06\x56\xb9\xe3\xc0\xf5\x99\x24\xc9\x8c\x8a\x69\x54\xfa\x25\xa7\x29\xc0\xfe\xdb\x20\x57\xf9\xf5\x58\x08\xd0\x89\x15\x65\xb8\x01\x50\x8c\x2d\xc3\x0a\x56\xdd\x3f\x0b\xe2\x15\xf7\x5e\x65\x76\xb5\x4b\xe2\xd9\x16\xda\xd5\x89\x7e\x91\x8e\x36\xc2\x3e\x48\x09\x7b\x76\x23\xcb\x99\xa1\x29\x35\x74\x07\x57\xb2\xf7\x55\xbd\x3a\x5f\xb2\x1e\x6b\x86\x86\x7b\x4e\xc7\xed\xbc\x80\x27\x0b\x1e\x87\x4b\xc1\x49\x9c\x79\xc8\x43\xfc\xb5\xb1\x38\xe5\xee\x1d\xd0\x43\x0c\xc4\x27\x5f\x10\xcc\x0e\xef\x47\x43\x72\x51\x55\x3b\xac\xc8\x49\xbb\x5b\xad\x8e\x06\x5d\x0b\xfa\x1d\x60\x74\x53\x5d\xbd\x25\x75\x77\xb1\x95\x82\x0e\x72\x09\x26\x0c\x57\x2c\x8e\x4e\x73\xa0\x2b\x05\x22\x79\x03\x88\x00\xe5\x29\x33\xba\x72\x78\x41\x3a\x6c\x89\x8b\xe3\x77\x4e\xfd\x05\x22\xed\x00\xeb\x34\xc8\xd5\x12\x17\x82\x5d\x4b\x47\x67\x2d\xe5\x7f\x10\xb8\xee\x62\xc3\xc6\x0c\xfd\xef\x65\xda\xc5\xec\xdd\x48\x6c\x5f\x0d\x51\x79\x81\xa2\x3f\xaf\x06\x33\x02\x7e\x03\x2e\xbf\x74\x2d\xc6\x0e\x89\xdc\x8c\xce\x77\xb7\x79\x55\x92\x58\x3f\x24\x05\x86\xcf\xf5\xe1\x73\xfd\xd7\xed\x6d\x83\x5d\x1c\x4a\xfc\xd3\xda\xb1\xa4\xfe\x91\x4e\x86\x58\x4b\x52\x46\x1d\xad\xa7\xcd\x8c\xe5\x81\xda\xbb\xeb\xc8\x70\x05\xec\x42\x26\x18\xb7\x74\xe2\x94\xfc\xa2\xc6\xdf\x9d\x1c\x15\xb4\x32\xf4\xf4\x3d\xf2\x6a\xda\xc0\x6d\x82\x0f\x48\xaf\x37\x3f\x6e\x0c\x06\x82\xc5\x6a\x8d\xc5\x7b\x14\x07\x61\xcf\x0a\x66\x0a\xec\x72\x3e\x90\xc1\x22\x96\x92\x59\xc6\x14\x2c\xc1\xa9\x69\x8d\xeb\x78\xc8\x25\x8a\xc6\xe1\x5e\x50\x87\x83\x74\x29\xd8\x5d\x10\x23\xa8\xc6\xac\x2d\xfe\xea\x8c\xb9\x2a\x74\x6b\xc7\x0b\x5e\xcf\x67\x62\x81\x53\xbf\x08\xdb\xb2\x4e\x38\xef\xc5\x15\xdd\x60\x2e\x34\xbb\xa3\x0b\x0d\x18\x5f\x69\x0b\xe1\xfb\x2e\x43\x5a\x35\xf0\x47\x36\xc1\xde\xad\xaf\xd6\x76\xba\x5c\xdb\xe5\x7a\x0d\xe2\x2e\xb9\x68\xe3\xcb\x54\x75\xd8\x58\x85\xa3\xf9\xec\x72\x1f\x07\x0e\x2f\x70\x0f\xdf\xed\x72\xa5\x9e\xf2\xf4\x7a\x08\x43\x78\x69\x7c\x0a\x7f\x78\x5e\x13\x6e\x1f\xc6\xcc\x62\x75\x15\x51\x0d\x18\x12\xf7\x5d\xe1\x92\x50\xa1\xd6\xb7\x90\x16\xd5\x19\xa0\x43\xd9\x2e\xc5\xc0\xa5\x04\xbe\x38\x80\xb4\xff\x54\x2c\x1c\x0f\x37\x33\xae\xd2\x7e\x41\x95\x59\xa0\x7a\xda\xab\x7d\x2d\xb8\xe7\x77\x5a\xf8\x8e\xf7\x42\xed\x32\x0e\xaf\x85\x30\x2c\xde\x97\xde\x73\x86\xff\xb5\x70\x7d\x8c\xf5\xb4\x0f\x00\x58\xb9\x9e\xab\x28\x1e\xde\xeb\x82\x4f\xb6\x9e\x34\x26\x1f\xbb\x72\x8c\xc6\xad\x2d\x12\xfe\xb8\xf2\x93\x8c\x1d\xa8\x03\x47\x07\xe5\xc7\x4e\xa0\x67\x75\x4e\x5a\x95\xea\x8e\xcc\x86\x4e\x2a\xf0\xee\x37\xae\x50\x90\x58\x38\x63\x50\xfc\xad\x78\x80\x70\x2e\xc8\x91\x90\x02\xcf\x0a\xb6\x3d\x46\xef\xa3\x35\xd6\x2e\x68\xe2\x2a\xbc\xd5\x0b\x6c\x46\x67\xd3\xb3\x05\x2e\x52\xbb\x59\x40\xab\x41\x1f\xd2\x65\x92\x30\x16\x34\xe8\xb8\xde\x4b\x75\x96\xdd\x94\x7d\xa5\x48\x2d\x21\x95\x8b\x36\x34\xcb\x2a\xcd\xd5\x81\x4b\x02\x67\xf3\xc6\xc5\x88\xe1\xd5\x42\x73\x9c\x12\x0f\x35\xc8\xd1\x63\xa6\x14\x09\xde\xfe\x73\xb3\xf0\x33\x88\x39\x10\x74\x03\x95\x41\xa3\x42\xcb\x27\x68\xc9\x8a\x44\xff\x00\x4c\x20\x46\xae\x02\x7a\x9d\x17\xb9\xb4\x0d\x96\xf2\x8c\x69\x72\x7b\x47\x55\x0a\x95\x70\x0b\x6a\x38\x26\xe2\xee\xd5\x86\x3d\x8a\xe6\x00\x75\xe8\x63\xe4\x3b\x0e\x0a\x06\x94\xd7\x90\x8d\xcf\x10\x5a\x1a\x99\x53\xc3\x13\x50\x5b\xf9\x24\xb2\x4b\xe6\x21\x6f\x61\xa3\x6a\x1f\xd0\xd5\x50\xff\xfd\x06\xef\x7a\x14\x23\xe6\x4e\x12\x9e\x5b\x99\x80\x42\x01\x8a\x49\x88\x31\xf2\x46\xd4\x4d\x33\xb5\x82\xcf\x77\x60\xc2\x8e\x5a\xa1\x42\x6c\xd5\x25\x0d\xc3\x07\x1b\x69\x30\x0e\xba\x20\x9d\x5e\x83\x65\x13\xdf\xcb\x62\xb5\x9d\x6d\x84\xac\x3d\xbb\x41\x77\xcc\xca\x02\x7a\x23\xca\xea\xc1\xaa\x39\x61\x51\x58\x4d\x52\xae\x1b\x95\x9d\x8f\x52\x25\x8b\xc2\x99\x43\xf2\xe3\xe5\x39\xc1\xcd\x84\x9a\x33\x1d\x95\x2f\x46\x4b\xf8\x94\x89\x50\x7f\xdb\x65\xbb\x80\xd3\xdb\xfc\x08\x78\x76\x91\x28\xf9\xd9\xd1\x59\x56\xcc\xe8\x31\xf9\xe4\x0a\xf5\x04\xfc\x0d\x7e\x7b\xad\x24\x26\x34\xb0\x78\x8b\xe6\x8b\xa8\xd3\xf2\x79\x11\x75\x5e\x44\x9d\x7f\x6f\x51\x27\x38\x8c\xed\x2a\xe6\x7c\x0c\x5e\x92\x8d\xb2\xde\xde\xe3\xa0\x72\xa3\x7c\x78\xbb\x45\xf8\xd6\x03\x53\xc0\xdd\xa8\x0d\xba\x4e\xdc\x03\x73\x0e\xdf\xa1\xf3\x45\x55\xe1\xd9\x44\xfe\x20\x95\x2f\x8a\x95\x36\x4a\xc3\x22\xd0\x3b\x26\xd4\x19\xd6\xb5\xd8\xd2\x13\xac\x2a\xd2\x0f\xc3\xf6\x2b\xf7\x8f\x16\xa9\xc5\xe3\x67\x27\xa8\x93\x7b\x84\x51\xc6\xcf\x33\xf6\x00\x69\x2c\xb6\xbb\x8f\x23\xb9\xa7\x9f\x23\xb9\x8f\xaf\x23\xd9\xa7\xbf\x23\x09\x5e\xd3\xf7\x39\x31\x1f\xbd\xbf\x76\xe3\xcc\x38\xe2\xb4\xe9\xcc\xd4\xa2\xf5\xc3\x38\x5c\xfb\x8a\x75\xee\xb6\x2f\x9c\x01\xb0\x97\xc5\x5e\xb7\xee\xb4\x82\xe2\x83\x57\x7a\xec\x4b\xc8\x8d\x1b\xf1\xfa\xaa\x7c\xb3\x91\x70\xfd\x9f\x17\x98\x66\x07\x4e\x5d\xdf\xf9\x46\x79\xc5\xe2\xe5\x04\xbf\x9c\xe0\xb6\xfd\x9f\xf2\x04\xa3\x5f\x71\x17\xb7\xf7\xba\x5c\x8d\x97\x78\xe4\x87\x92\xa9\x05\x91\x73\x16\xf9\xd3\x40\x12\x60\xcd\x53\xe7\x91\xe2\x6c\x0e\xed\x65\xd9\x47\xe4\xf9\x60\xd1\xb8\xfc\x62\x25\x23\x88\x10\xbb\x07\x2d\x6b\x0e\x55\x0f\x02\x46\x68\x79\xa0\x7b\xe2\x65\xa9\x88\x1e\xb8\xec\x60\xd5\x1b\xd0\xf7\xcf\xae\x2e\x76\x53\x00\xba\xdd\xef\x90\x5d\xee\x78\x96\x16\x7f\xb6\x61\x81\x08\x88\xf0\x4b\xbd\xfe\x51\xd0\xd2\xc9\x2d\x5b\xf4\xdc\x95\xb0\xcb\x6b\xee\x1b\xa3\x67\x43\x3d\x19\x67\xdb\x24\x10\xab\x00\xb4\x03\x55\xdc\x4d\xab\xc6\xa7\x7d\xfa\xc6\x7a\x2f\x0f\x84\xae\xc4\x77\x67\xb2\xdd\x29\xcd\x63\xfc\xd4\x50\xc1\xa5\x26\x05\xc7\x39\xc0\x09\x48\x69\xe7\x9d\x8a\x03\x1a\x80\x23\x35\x50\x8b\xae\x9b\x48\x76\x57\x0d\xf1\xf1\x80\xbd\xf7\x52\x03\x9a\xd6\xbc\x62\x6f\xd9\xe2\x50\xbb\x78\x3c\x29\xf4\x8c\x17\x3e\x8b\x3a\x50\x02\x87\xb9\xe4\x33\x5c\x95\xfb\x21\xf0\xcc\x0f\x45\x8f\x5c\x49\x63\xff\x77\x09\x5e\x33\x68\xc8\x93\x4c\x5f\x49\x03\x6f\x1e\x1d\x58\x38\xdd\x7b\x83\xca\xd9\xf0\x38\x58\xe0\xd0\xbb\x0b\x62\x21\xbc\x37\x06\x80\xc4\x5d\x40\x06\xb0\x72\x4d\x86\x82\x48\xe5\x61\x62\x7c\xda\x5d\xed\x86\xf0\x36\x97\xc8\x60\xba\x62\x0c\x07\x4a\xa9\x6a\x90\xdc\x30\x5c\xb0\xbd\x72\xff\x0b\xd8\x64\xc0\x58\x1d\x5c\x48\x20\x79\x2c\x35\x6c\xca\x13\x92\x33\x35\x85\xc8\xcb\x64\xb6\xfb\x06\x75\xa7\xdb\xf8\xec\x44\xbd\xe3\x0f\x77\xc6\x0c\x60\x75\xef\xc0\x89\xe7\xbe\x0c\x13\x47\x41\x16\x91\xd3\xc2\x22\xc5\x3f\x2c\x27\x80\x7d\xf9\x17\x24\x7b\xd6\x03\x72\xe6\x2b\x70\xc6\xbf\x39\x43\x5b\x3c\x8c\x1d\xc1\xca\xf1\x3f\x94\x7c\x4e\x33\x86\xae\x6d\x54\x84\xbc\x98\x72\xb2\xc4\xa6\x7b\x2e\xe3\xb3\xa5\x52\xe1\xe2\xe4\xe0\x96\x2d\x0e\x7a\x4b\x88\x74\x30\x14\x07\x55\xf8\x73\x0d\x75\x02\x43\x03\x9b\xfa\x01\xfc\x76\xb0\x6f\xce\xfe\x44\xe2\xfc\x0e\x58\xe2\x8c\x40\xe7\x19\xd5\xba\x5b\xe4\xe8\xfa\xfc\x63\xa3\x68\xcc\x2a\x82\xc7\x39\x2c\x26\xe8\x10\xb5\x3f\x5b\x15\xf8\xd1\x77\x77\xae\xe9\x04\xa5\xb9\x2b\x1f\xd2\x3e\xf5\x41\x93\xaa\x86\x01\x42\xa0\xc4\x5d\x1c\x6b\x56\xdd\x49\xae\x81\xd7\x67\xb8\xf5\x90\x93\x38\x5f\x22\xd7\xa0\xe2\x72\x1f\x3a\x21\xa4\x21\x5c\x24\x59\x99\x62\x9e\x47\xe8\x0a\x0a\x72\x57\x91\x7e\x07\xe0\xdc\x03\x79\x3e\x87\x01\xbc\x3c\xe2\x6f\x3f\x97\x7c\x56\x9b\xd7\x54\x70\x35\x18\x6e\x7c\x10\x56\xfb\x5e\xeb\x64\x8b\x87\x60\x3d\x9d\xe5\x79\x5d\xc6\x78\xcb\xc7\x8a\x91\xf3\x19\x15\x82\x65\x51\xbc\xa8\x33\x64\x84\x12\x4e\x20\x78\xb8\xc2\x4d\x87\xf5\xca\x4d\x9e\x8e\x89\x10\x9d\xbc\xf7\xea\xb5\x3f\xee\x42\x4a\x7b\xab\x84\xed\xb2\x1a\xce\xe4\x1d\x49\x25\xb9\x83\x5c\xfe\x73\xcb\x8e\xe0\x26\x52\x7b\x46\x16\xcd\x14\x7c\x03\x12\x99\x17\x4a\xe6\x5c\x7b\x0f\x70\xb7\x71\x7b\x0d\xb0\xcc\xca\x16\x79\x73\xd6\x25\x5c\x79\x7b\x4e\x0c\x55\x53\x66\xec\x30\x44\x94\xf9\x98\xb5\x0e\xff\x7c\x88\x84\x5d\xcf\xbd\x42\xd4\x7e\x8b\x3c\x21\xe8\xbf\xfb\xee\xaa\x73\x29\xd8\x55\x3b\x78\x27\x55\x96\xde\xf1\x14\x2f\xbd\x34\x39\xb2\x03\x1f\x3f\xff\xba\xad\x77\x77\x3c\xbd\x1f\x00\xbc\x67\x8f\x05\x00\x01\x08\xb8\xca\x45\x1c\x72\x4a\xc3\x07\x8e\xc9\x25\xc7\xd8\x18\xfb\x17\x66\x6d\xc9\xc7\x5c\x54\x51\x58\x61\x33\x80\xae\xda\xf3\xe0\xb5\x09\xcd\x0c\x46\x35\x40\x60\x80\x34\x33\xa2\x79\x5e\x66\x86\x0a\x26\x4b\x9d\x2d\x5a\xa3\xc5\xd3\x00\x79\x92\xb1\x2f\x88\xc5\x5d\xf8\x55\xe8\x54\xe7\x5b\x53\x8c\xfd\xf2\x30\x5f\x62\x5c\x95\xbb\x50\x7a\x12\x98\x58\x08\x96\x61\x5f\x58\xe2\x3c\x5b\x8b\xac\x9c\xf2\x2d\xce\xfb\xff\x66\x29\xbe\xab\x24\xca\xa5\x66\x55\x64\x7b\xdb\x22\x26\x4f\x97\x91\xfb\x41\x99\xf5\xcd\xea\xb4\xdb\x29\x2b\x98\x48\x21\x23\x58\x84\xab\x38\xdd\xbd\xc2\xca\x65\xd7\xda\x9d\x42\x5d\x7e\x31\x8a\x5a\x72\x93\x43\x50\xa5\x4b\xd6\xc5\x27\x84\x8a\xf6\xa4\xe3\x79\x64\xc1\x25\xff\x76\x3c\xfa\xc1\x8b\x24\xdf\x2f\xf7\x3a\x52\x51\x87\xf6\xba\xee\xb0\xba\x22\x47\xba\xfb\x4a\xec\x59\x7a\xdf\x5c\xe9\x7a\x45\x7a\xe8\xc6\xac\x5e\x8a\x47\xfe\x28\x12\xa7\x4f\x20\x26\xb5\x4b\x3a\xa1\xb7\xd8\xa3\xa1\xd9\xba\x97\xcd\x62\xc4\x1b\x34\x59\x87\xb7\x11\x49\x87\xdc\x9d\x6e\x20\x17\x57\x43\xb4\x85\x65\xe5\xc2\x55\x0a\xb1\x8d\x58\x3d\x44\x3e\x6c\x6a\xa8\x66\xa6\x9d\x55\x63\xd9\x2d\xcd\x73\x7a\x1c\x05\x13\xb0\x83\x43\xb4\x0f\xcc\x24\xfd\xdf\x39\x99\x40\xd4\x5a\x5a\x69\xc0\x03\xc4\x67\x1c\x62\xe1\x9a\x16\xc7\x48\xed\x36\x24\xd4\xb4\xae\x16\xd3\x8a\xde\xbb\x19\x7c\xfa\xd4\xb9\xa4\xa8\xed\xd2\x58\xf1\x20\xe4\x1b\x28\x05\xff\xa1\x8c\x25\x75\xc8\xcd\x10\xd6\xe8\xda\xef\x6b\x21\xd3\x84\x55\x26\xa2\x0b\xae\x6f\xbb\x24\xcd\xfa\xe6\xfc\xb2\xde\xb9\x8e\xf0\xdf\x9c\x5f\x12\xf7\xb6\x95\x15\xa7\x8b\x19\xe7\xbe\x39\x9d\xa6\x09\xab\x4c\xa3\x29\xd7\xb7\x8f\x5e\xb0\xbb\x48\xaf\xb6\xf9\x19\x3f\xb6\x95\xc9\xe7\x15\x89\x92\xdf\x2c\x64\x49\xee\x5c\x24\xbd\x13\x6a\x6f\x78\x71\x4a\x2e\x85\x2e\x15\xab\x6e\x3f\x9b\xf2\xad\xe5\xa4\xcf\xa9\xb0\xf7\xbd\x70\xe3\x39\x9b\xb9\x0a\xaa\x0c\x48\xb6\x9d\xf3\x88\x41\xaa\x7c\xd7\xd9\x2f\x61\xcb\xd6\x0f\x27\xde\x07\xad\xe7\xa2\x84\x43\xb2\x2d\xdf\xc8\x6e\x76\x94\x18\x23\xde\xde\xb7\x21\x35\x0d\x39\x49\xd9\xfc\x44\xa7\xf4\x75\x0f\x3e\xe3\x43\x59\x4d\x6d\x4e\x54\x93\x83\xd7\x07\x03\x32\xe2\x39\xcf\xa8\xca\x16\xb5\xdc\xc0\x55\x3b\xcb\x02\xfc\x80\x70\x99\xf5\xea\x80\x1c\x49\x05\x23\x27\x54\x90\x8c\xf9\x38\x19\x77\xa0\x16\x28\x02\x1e\x3f\x36\x15\x21\x0f\x6a\x23\x44\x82\xd2\x15\x0d\x3e\x21\xbb\xa9\xa5\x41\xb9\xa8\x28\x36\x17\x96\x8c\x0f\xc8\xa7\x55\xa5\xaf\xe1\x6c\xf8\x16\x4f\x05\xca\x07\xd5\xcd\xee\x59\x37\x7f\x49\xa1\x7b\x3a\x30\x6d\xd7\xea\xa6\xdc\x7c\x64\x85\xec\x24\x00\x60\x97\x86\x25\x8c\x1b\xfb\x42\x6a\x0e\xf9\x32\xa9\x81\xea\xb3\xca\xf0\xa4\xcc\xa8\x95\x89\xd1\x0e\x36\x20\x17\x97\xd7\x1f\x2f\xcf\xcf\x6e\x2e\x2f\x4e\x89\x1f\x89\xc7\xd2\xda\x80\xdc\xc4\x59\x84\x22\x97\x57\x97\xaa\x25\x7c\xab\xe7\x88\x0f\x15\x55\x1a\x42\xc8\x0d\x41\x05\x19\x0a\x6e\xaa\x2c\xbd\xe8\xa4\x95\x49\xe1\xdc\xae\x6c\x6f\x67\x87\x9b\x72\x74\x9d\x10\x6e\x30\xfb\x73\x7d\x34\x38\x1d\x98\xf1\x33\x4c\x65\x8b\x16\xf7\x00\x92\x43\x05\xdc\x7d\xc9\xee\x3e\x31\x67\xc7\xe3\x71\x83\x06\xf6\x2a\x37\x2a\x52\xfc\x90\x0e\xdc\x67\x45\x59\x51\x28\x99\x58\x5e\x72\x38\x38\xf4\x82\x42\xb6\x94\xfa\x3d\x0c\x1a\x27\x7e\xaa\xe3\xd6\x80\x90\x0f\xde\x85\x19\xa2\x56\x57\x67\x91\xc7\x54\x02\x51\x2e\xf2\x06\x86\xfa\xd2\x00\xe5\x38\xfe\xa8\xcb\x14\x35\xe5\x73\x26\x70\x61\xfb\x25\x48\xfe\xf3\x1d\x61\xfe\xb1\x9a\xf7\xa7\x8f\xef\xf6\x3b\x25\x3c\x67\x1d\x27\x74\x2e\xf3\x1c\xf3\x07\xcd\x42\xf4\x59\x15\x40\x16\x4e\xfb\xde\x14\x16\xcc\x84\x34\xd9\x82\xd4\x0d\x3a\xe5\x3b\x35\x14\x94\xf0\xda\x79\xe3\x8b\x4a\x4e\xed\x9e\xe6\xd7\x25\xdd\xd2\x3e\xa5\x86\x23\xd9\x27\x61\xc6\x27\x1f\x2f\xcf\x2e\xde\x5f\x0e\xf2\xf4\xd1\x49\x06\x13\x69\x21\xb9\x30\x7a\xbb\x5a\xb2\xad\xa8\x49\x7b\xb2\x12\x3e\xda\x95\xeb\x5e\xfa\x8e\xb1\x8b\x83\x1f\x2d\xca\x55\x96\x32\x43\x79\xa6\xa3\x7d\x34\xb2\x90\x99\x9c\xae\xce\xf9\xdb\x61\x83\x7e\x86\x99\x47\xfa\xb4\x6f\x77\x7e\xbf\xf2\x7a\x9b\x52\x0d\x75\x78\xf8\xd2\x0c\x90\x63\x30\xac\x35\xc8\xc1\x50\x51\xe1\x99\x2e\xf7\x41\x04\xaf\x25\x18\xa0\x36\x08\x87\xd8\xa7\x71\xab\xf2\xa2\x45\x65\x52\xda\x4a\x64\x0f\x0d\xba\xed\xc2\x98\xa5\x41\xdb\x6b\xe1\xd4\x61\xf6\x07\xd7\xa7\x4e\xe4\x0a\xc5\xfa\x21\x91\x0f\x54\xef\x90\x2a\xe2\xae\x31\xcd\xf3\x86\x17\x6f\xa6\xc1\x56\xd9\xa2\x69\x80\xa9\x64\x9f\x60\xb5\xc2\x38\xf4\x2c\x5b\x54\xa9\x01\x9d\x2a\x4c\xa7\x98\xa0\x47\x39\xfb\x6d\xa1\xf8\x9c\x67\x6c\x0a\x49\x40\xb9\x98\x46\xb5\x14\x7d\xc4\x3a\x24\x87\x67\x4b\xf3\xb2\x5b\xa5\x4d\x9c\xfa\x19\xf0\xe2\xea\xc3\x0d\x24\x96\x85\x4b\xc1\x7b\x0b\xd8\xf6\x83\x50\x68\xa4\xdf\xef\x83\xde\x7f\xf4\xbd\x95\x15\xd3\xec\x98\x7c\xc7\xdc\x77\x24\x24\xbf\x55\x50\x6d\x66\x26\x43\xf6\x51\x98\x6b\x05\x59\x40\x47\xbc\x34\x77\xad\x4e\x6c\x4b\x2b\x18\x21\xbb\xa9\xb5\x87\xe2\x9a\x98\xce\x0f\xef\x7b\x1e\x5f\xae\xdc\x23\xe9\xdf\x99\xca\x79\xab\xe8\x2a\xfc\x0c\x37\x32\x85\xa3\x87\x94\xe8\x45\x9e\x71\x71\x5b\x65\x8c\x9a\x48\x8b\x43\xe8\xa3\xcf\xc5\xad\xc7\x58\xc5\x68\xb6\x9e\x52\xee\x82\x1f\x7b\xa5\x92\x66\x07\xe3\xdd\xcd\xa2\xc0\xbb\xf0\x70\xec\xdd\x55\x6f\x4c\xe2\x0e\x0e\x9e\xdd\x7a\xb9\xee\x56\x69\xfd\x70\x38\x3a\x1f\xd5\xaa\x84\x5a\x9d\x0e\xde\x3d\xa6\x71\x79\x1d\x4b\x80\xe5\x3c\xa1\x64\xc7\x7f\xd8\x76\x53\xdb\x27\x59\xb9\xbd\x0d\xba\xf9\x5c\x4b\x65\x68\xb6\x27\x22\x90\xcc\x68\x71\x56\x9a\xd9\x05\xd7\x89\x9c\xb3\xce\xaa\xce\xdd\x0c\xb3\xf6\xfa\x84\x71\xdc\x6f\x3a\x8e\x46\xce\xff\x70\x76\x4d\x68\x69\x77\xd1\xb8\xb4\x92\x7b\xbd\xe2\xf6\xf3\x1f\xa1\x43\xfd\x5e\x66\xef\xc6\x7a\xf0\xb9\xbf\x5c\x08\xec\xf1\x42\x00\xce\xf8\x73\xbe\x04\xe0\x82\x1b\x4e\x8d\x6c\x59\xcb\xaa\xae\xbf\x97\xda\xc8\xdc\xa1\xe7\xd0\x0f\x04\xb7\xb2\xc0\x70\x6b\x63\xd7\x73\xf4\x83\xa0\x0d\xc0\x19\x0a\x2b\x16\xd3\x84\x35\x3c\x00\x7b\x90\xb9\x11\xc7\xe6\xa1\xcd\x6f\x9d\x67\x26\xa4\x7c\xca\x7e\x77\x5a\xcb\xa4\xbd\x54\x08\xc1\x1b\x15\xaa\xe4\xfa\x7b\xb5\xc4\xf0\x1f\xba\x9e\x6c\x67\xf6\xc2\x55\xfd\x6f\x49\x33\x84\xc6\xd5\xbe\x6d\x44\x75\xc8\x76\x9c\xa4\xdf\x4f\x0f\xf3\xab\xa0\x35\x97\x1a\xb3\x45\x61\x0b\xa3\xa8\xd0\x76\x23\xea\xba\xd1\xa1\xbb\xda\x39\x24\x47\x26\x29\x5a\x97\x6b\x7f\x20\xcf\x6c\x9c\xaa\x83\xfb\xbb\xe0\x91\xdd\x76\x56\x0f\x72\xdb\x02\xb8\xdb\xd5\xb4\x51\x5b\x08\x32\x5b\xf2\x8e\x6b\xe3\xd3\xe2\xc3\x0b\xae\x5d\x4e\x57\x90\x74\xae\xad\xea\xc4\x8b\xbf\xd2\x34\x55\xa7\xc8\x49\x7c\x49\x5d\x05\xf2\x8e\xcf\xbb\x44\x45\xb8\x8f\x3b\x32\x8b\xc2\xa5\x66\xbb\x39\xbf\x26\x58\x15\xe3\x37\xbf\xc2\x72\x9e\xff\xf9\xcb\x5f\xbd\x6a\xbd\xa1\x4f\xe7\xfe\xbc\xa3\xe5\x60\xef\x37\x36\xcf\xc2\x6b\x0e\xc4\x05\xf4\x97\x03\x7a\xe8\xce\x2e\xe2\x91\xdd\xd4\x40\xa5\x77\x13\x2a\x5e\x3c\xcc\x9e\xd4\xc3\x8c\x84\xa0\x07\xa4\x09\xf7\xa7\x2a\x48\x50\xae\x9f\x1f\x41\xd9\x0a\x8b\xed\x58\x53\xc7\x16\x3c\xbf\x56\xbf\x8b\x6e\x9f\xc0\xe7\xfa\xe2\x6a\xf4\xd7\x77\x67\x6f\x2e\xdf\xc1\x2c\x9d\x5f\x95\x45\x03\x2e\x76\xf6\x23\x6a\x8f\x56\x6d\x34\xc1\xed\xc0\xe8\x76\xcf\x71\xf5\x76\xd4\x50\x94\xed\x9b\x8e\x97\x1b\xf7\x95\x96\xc5\xa4\xd5\xda\x1f\xd7\x74\x05\x65\x23\x98\xda\x5f\x88\xc3\xce\x16\xae\x28\x25\x53\x4d\x19\xb2\x3b\x85\x33\xbc\xb7\xbe\xb2\x75\x07\xc8\x33\x30\xe2\xdb\xf5\x22\x0c\xf6\x6e\xbe\x7f\x20\x58\xb5\x65\xf1\xaa\x7b\xec\xcb\xe1\x08\x7a\xf9\x4b\x1e\x7b\x48\xd1\x23\x47\x59\x7a\x6d\x29\x35\xd3\x21\xc9\xfd\x33\xc5\x94\x62\x55\x46\xdc\x2e\xd4\x6b\x65\x4a\xdd\x5a\x3d\xa8\xda\xc5\x46\x2d\x62\x60\x5d\x0e\x69\x7f\xb7\x4f\x9d\x7a\xa9\x0b\x9a\xec\x35\xf3\x63\xf5\x0a\xdf\x40\x48\xf5\xe3\x13\x40\xf8\xec\x1e\x1d\x4a\xc3\x78\x5d\x11\xf9\xdc\x77\x6c\x06\x72\x75\xda\x21\x5f\x4f\xa1\x90\x3e\x48\x2e\x8e\xf8\x7a\xe2\xed\x23\x8f\x42\x3d\xbf\xdb\x51\x75\xd9\xb7\xda\x52\xcc\xa4\x91\x62\x67\x27\xf1\xeb\x15\xdd\xeb\xe7\x18\x5b\x9c\x57\x45\x42\xa2\x0a\x7d\xe0\x61\x18\x0c\xfa\x56\x8c\xf3\x5c\x42\x0a\x6f\xda\xaf\x1b\xf6\x1f\x5d\xf2\x48\x87\x17\x7b\x3a\x73\x3f\xa6\xe0\xc3\xae\x26\xd8\xbd\xba\x50\xa4\x9d\x23\x2e\x86\x17\x4e\xee\xf2\x51\x15\xda\xa1\x1d\x59\x8f\x77\x7b\xe3\x8b\x52\x99\x3b\xa9\xba\x87\x1a\x5f\xd7\x3a\x36\x6e\xf5\xdd\x6f\x4b\xd1\x44\xcf\xf1\x8c\xe0\x1c\x9f\xf8\x9c\x8c\xe0\xc2\xb4\x91\x2b\xba\x79\x32\x82\x17\xfb\x03\x1c\x9e\xa7\x3d\x34\x3b\x72\xa1\x87\x0d\x49\xdd\xab\xe0\xed\xb1\xac\xe3\x0a\x3f\xbb\x6e\xce\x40\x60\xf7\xa6\x22\x12\x34\x1c\x42\x37\xfc\xde\x88\x82\x92\x58\xb7\xaf\x03\x3d\x18\x1a\x96\x63\x81\x5f\x9a\x65\x16\x96\x52\xc4\x69\x83\x5d\xd8\x69\x8f\x60\xe6\xdd\x9c\x16\xbe\x5a\xb2\xbc\x13\x77\x54\xa5\xe4\xec\x7a\xb8\x9f\xa3\xdf\xc1\xb5\x18\xf1\xa7\x5d\x26\xa8\x7a\x59\x45\x99\x32\x32\xe6\x46\x57\x05\xcf\x98\x89\xb5\x41\x4b\xde\xc2\x1d\x91\x3d\xa4\xf6\x40\xba\xef\x45\xdc\x4f\x10\x99\x18\x9a\x35\x0a\xd0\xbf\x7a\xf5\x0a\x8d\x57\xaf\x7e\xfd\xeb\x5f\x63\x11\x9a\x94\x25\x3c\x5f\x6e\x08\xad\xfe\xeb\xf5\xeb\x01\xf9\xe3\xd9\xfb\x77\x50\x10\xaf\x30\x1a\xd3\x5d\xe0\xc8\x58\x92\x3b\xea\xac\x7b\xe4\x7f\x46\x1f\xae\xaa\x52\x1a\xf5\x5f\x5d\x35\x63\xb7\xbc\x01\xb9\x88\x5c\x80\x62\xf3\x14\x35\x33\x57\xfb\xc5\x10\x3a\x99\x60\x99\xc7\xb1\xaf\x32\x8a\x47\xca\x47\x36\x43\x49\x66\xac\xd1\x60\xb7\x3f\x03\xdf\x24\xab\x48\xa3\x31\xcf\x07\xd7\xa3\xab\x15\x8c\x15\xe8\x1f\x4c\xa5\x87\x45\xbd\x27\x1a\x2a\x35\x54\xa9\xe0\x14\xd3\x56\xa6\x74\xa5\xe7\x70\xb0\x30\x75\x3b\x89\xa7\xbc\x83\x69\x5d\x41\xa0\x86\x58\x3e\x71\x6d\x55\x1d\xfc\x7b\xbc\x56\xdc\xe6\x1c\xfb\x40\x77\x22\x75\x9e\x1f\x66\x83\x7b\xe5\x42\xd6\x03\xb9\x20\x34\x93\x50\xe5\x28\x6c\x6d\xc5\x8f\xa2\x2a\xe3\xdb\x97\xd2\x39\xf3\x5e\xd7\xec\xab\x48\x85\xde\xd3\xd6\x35\x4e\xea\x26\xed\x28\xb4\x9f\x8e\x65\x69\xfc\x15\x30\x8e\x89\xe5\xfd\xb0\xc6\x74\x87\xcc\x81\x3b\x24\x1b\xdc\x25\xe9\x6c\xe7\xbc\x95\x75\x32\x5f\x13\x02\x7a\x84\xd1\x64\x46\x6e\xd9\xa2\x8f\x84\xa9\xa0\x10\x8d\x12\xaa\x48\xb9\xdc\x8e\xf5\xfb\x92\x84\xa5\x56\xb2\x75\xc0\xf2\x37\xea\x15\x16\x85\x68\x16\x2f\x3e\x6a\x27\xe9\xb8\x9c\x91\x22\x52\xe0\x7d\x62\xe2\xa8\x0e\x6b\x48\x12\x89\x45\x98\xeb\x51\x17\xf6\x7c\xb1\xd4\x76\xd3\x9b\xbe\x5c\xb9\x11\x58\x42\xe7\x58\x55\x29\x96\x7a\xbb\xa2\xc3\x4e\x6c\x83\x0f\x52\x9f\x8a\x37\x72\x45\x80\xd2\x66\xae\x9c\x8d\x6b\xeb\xa1\x14\x00\x51\x8b\x0a\xd1\xcc\x94\x0e\x34\x58\x37\xa9\x14\x19\xd3\x9a\x70\x58\x61\x4e\xd5\x2d\xf3\x49\x49\x68\x36\x20\xd7\x76\x92\x21\xf3\x11\xe6\xc0\x9d\xa3\x1b\x99\x3d\xa3\x71\xb8\x8b\xfd\xc8\xe1\x60\x70\x88\x14\x7c\x45\xf0\x4b\x07\xcc\xd8\x2d\x81\xea\x0e\x89\x53\x1b\x25\x8d\x0b\x8d\x69\x60\xad\xd4\x06\x69\x8e\x25\x44\x71\x99\x99\xe7\x50\xb4\x75\xfa\x9d\xe5\xe5\xec\x90\xed\x73\xd7\x24\xd5\xbb\xa4\xa8\x6e\x75\x9d\x50\x7f\x76\x4f\x4d\xbd\x53\x62\xea\xa5\xda\xca\x6e\x8b\xdc\x31\xeb\x9e\xa9\xf7\x1e\x89\x94\xf3\x4e\x49\x3e\xfd\xb3\x2e\x27\x4c\xde\x46\xea\x73\xd5\xca\x32\xf6\xa3\x12\xf3\x86\x93\x55\xb5\xb6\x7c\xb8\x5b\x25\x27\x07\xa2\x69\x21\xf0\xf4\xf2\x5d\xb7\xea\x1c\xa4\xb3\xc0\xd7\x7c\xba\x08\x80\xcd\xa7\xdd\xa5\x5c\xf3\x59\x3a\x4d\x81\xba\x17\x91\x4b\x3a\x80\xd2\x48\xc8\xc4\x6c\xc2\x91\x1b\x40\xf9\x77\xc7\xa3\xa8\x95\x55\xb4\xcc\x4a\x13\xc2\x72\x56\xb0\x06\x18\xd4\xe7\x6d\xc6\x60\x48\xdf\x2c\x62\x14\xc0\x22\x91\xfe\x76\xe5\x19\xf8\xec\x74\xa4\xbb\x56\x18\xfb\xc9\x3a\x6e\xdc\x03\x86\x5e\x66\xd8\x19\x8e\x23\x97\x0d\xc1\x7b\x10\xd7\x64\x18\x70\xde\x30\x1a\x05\x24\x2f\x8e\xb8\x4a\x3d\x9d\x57\xd6\xce\xb0\xe2\xa6\xe8\xac\x08\x67\xd7\xc3\x3d\x4a\xf4\xd1\xa8\x3f\x69\x99\x1e\x4c\x37\xb5\xba\x29\x17\xd5\xca\x9d\x81\xd7\x52\x98\x67\x2f\x1a\x2e\x4d\xfb\xad\xa5\x8b\x91\x59\xb5\x91\x94\xcd\x95\x70\x0f\x14\x34\x4a\xe4\xe6\x2f\xf8\xe0\xbc\x3e\x77\x31\xf2\x11\x45\x42\x80\x47\xa7\x02\xd0\xfe\x59\x2e\x41\x06\x8b\x25\x23\xa8\x4d\x82\x3a\x5e\xa4\x2c\x16\x32\x3d\x75\xa5\x72\x85\x90\x58\xf5\x4b\xf7\xb0\xb8\x89\xee\xa1\x12\x68\x05\x85\xe8\x5a\x56\x45\x06\xf0\x9d\x45\x83\x9d\xca\xd4\xdc\xa7\x50\x8d\xdd\x40\x58\xf9\x75\xd7\x5d\x24\xf7\xac\x3b\x43\x22\x2e\xb4\x5b\x25\x8b\xba\xb1\x1a\x47\x0a\x75\xac\x93\x19\xcb\x29\x26\x85\xf3\xcb\xb3\x54\xe6\x4e\x71\x63\x18\x66\xf5\x61\x2a\xd7\x44\x4e\x7a\xb5\x0a\x71\x07\xf3\xd7\x07\xbb\xd4\xf3\xb8\x67\xc9\x15\x52\xed\xc2\x1e\x80\x71\x5d\x93\xce\x2c\x5e\x83\xba\x90\x41\x26\x47\xd1\x30\x32\x58\x06\x33\x47\xe8\x3d\xfa\xc2\x9f\x52\x45\xea\x05\x21\xe1\x45\x45\x7a\x51\x91\xf6\xa2\x22\x45\x8c\xc5\x13\x1c\x07\xa8\x58\x6d\x8a\x33\x4a\x79\xdd\xa9\x8a\xea\x89\xb2\xc4\x58\xd4\xf4\x5a\x93\x54\x75\x2b\x9a\x55\x7d\x0e\xbd\x2e\xe5\xf0\xb8\x34\x93\xfe\x6f\x08\x13\x89\x4c\x71\xf3\xed\xf8\x4a\x1b\x10\x6d\x2a\xf5\x23\x9e\x4b\xee\xbf\x15\x5b\xe2\x60\xec\x5d\xb7\x6e\x27\x3a\xe0\xef\xea\xde\xee\x89\xc1\x57\x6c\x3d\x04\xc1\xba\xe5\x87\x18\x79\xc7\xdf\xab\x5b\x42\xac\x05\x0c\xc8\xed\xcb\x9c\x92\x23\x7c\x39\x48\x8a\xb2\xe7\x1a\x0c\x72\x96\x4b\xb5\xe8\x85\x46\xf6\xc7\x5a\x2f\xd7\xe2\x18\x64\x82\xa4\x54\x56\xd9\xcb\x16\x3f\x56\xe9\xc0\x03\xe8\x91\x85\x83\xb0\x4f\xdd\xaa\xc1\xc4\x4f\xc3\xfd\x2e\x24\xba\x02\x55\xbe\xaa\x8e\x33\x09\xc9\xf7\x74\x2f\xa8\xa8\xf0\x96\x89\x39\x99\x53\xd5\xa1\x74\x75\xfc\xdc\x53\x1e\x48\xf9\x9c\xeb\xdd\x0a\xd6\xad\xd4\x9a\xb9\x4b\xeb\x25\x4b\x53\x94\xc6\x51\x4a\x7f\x2a\x7c\xa8\x77\x38\x0d\x0d\xa1\xe8\xf5\xc1\x4e\xd3\xf8\xd1\x14\x85\xc5\x67\xc7\xd2\xb0\xf8\xdc\xb7\x40\x6c\x7d\x94\x9d\xd1\x66\xaf\xe5\x9e\xfd\xe3\xd1\x62\x1f\xe7\xb0\x62\x91\x55\x7e\x02\x2f\x9c\x3e\xd2\x41\x43\x7f\x90\x3d\xda\x6a\x5c\x22\xf4\x9f\xb2\x99\x66\x4f\x57\xaf\x2e\x52\xef\xdf\xfc\xde\x75\xe4\x72\xe2\xbf\x5c\xba\xb6\x42\xbe\x97\x4b\xd7\x97\x4b\xd7\xb6\xcf\xcb\xa5\xeb\x8b\x45\xa1\xfe\xfc\xa8\x2d\x0a\x2f\x97\xae\x2f\x97\xae\xf7\x83\xe1\x83\x5c\xba\x3a\x31\xae\xba\x71\x7d\xd4\x0b\x57\x57\xd6\xe5\x2c\x49\x64\x29\xcc\x8d\xbc\x65\xad\x6f\x10\x5a\x09\xf3\x4b\xa3\x3f\x9e\x64\xdf\x5d\xb0\xe8\x24\x1e\xec\x22\x18\xd0\x32\xe5\x56\x78\xdf\x19\x81\xce\xdc\x00\x5e\x4e\xb7\xa4\x58\xa4\x2c\x0d\x23\xfb\x43\x6a\x2c\xac\x07\xe4\x8c\x28\x96\xf0\x82\xbb\xea\xdd\x14\xdf\x23\x86\x85\x2c\xfb\xdc\x68\x96\x4d\x5c\xb6\x73\x11\x17\x85\xa9\x44\x70\x47\xe1\x56\x7e\x06\x79\x8e\xf4\x49\xb2\x7d\x85\x1c\xc5\xbe\xf7\xcc\xca\xcd\xe6\x26\x1e\x21\x36\x8a\xc0\x52\x6a\xb5\x68\xe0\x63\x05\x77\x11\xc8\x0f\x7d\xb0\xd9\x97\x82\x2b\x40\xde\x11\x4b\xa4\x68\x53\x11\x73\xcd\x06\x5d\x36\x47\xf2\x3b\xe5\x2c\x9a\x58\x00\x3f\xd4\xbd\x9c\xd3\x8c\xa7\xdc\x2c\xc2\x5d\x9b\xab\xb2\x44\xf1\xc4\x84\x6d\xd4\x15\x18\x09\x2d\x0a\x25\x69\x32\x63\x3a\x9a\x37\x8a\x1c\x2e\x10\x2b\x78\x9d\x63\x25\x30\x90\x3a\xa0\x8f\x65\x7d\xd9\x82\x28\x69\xfc\x75\xf9\x9a\x0f\xde\x44\x83\x41\x77\xe4\x5f\x46\x2d\xe0\x4e\x5d\xc6\x43\xe0\xac\xf8\x24\xfe\x43\x13\x99\xa5\x3e\xbf\xc7\x6f\x5e\x59\x31\x2f\x71\x38\x68\xa9\x1c\x64\x80\x30\x92\x64\x96\x15\x5b\xca\xb7\xbe\xf3\x2f\xbf\x26\x33\x59\x2a\x3d\x88\x83\x84\x5e\xc3\x3b\x54\xd1\xbc\x98\x68\x48\xc6\xa8\x36\xe4\xf5\x2b\x92\x73\x51\x5a\x0e\xd4\x19\x6d\xba\x4b\x36\x91\x4c\xf3\xab\xaf\x5b\xf7\xeb\x2a\xcd\x2c\xdf\x48\x3a\xac\x2a\x30\x13\xaf\x13\x6a\xdc\x49\xc2\xe0\x32\xcc\x63\xdd\x10\x71\x1c\xd1\x8d\xa1\x2d\x8c\x7c\x80\xf3\xf5\x43\x29\xc7\x0b\xd3\x25\x10\xf1\x7f\xb1\x47\x3d\x02\xd1\xbf\x6c\x93\x5d\xa4\x4a\x2e\xb2\xf1\xa3\x0f\x52\x2b\x61\xca\xb5\xd9\x52\x29\xa1\x8a\x51\xdc\xd8\xac\x3d\x5b\x99\x5a\x79\xbf\x63\x58\x0a\xe8\x08\x5e\xd6\xf5\xe6\xa1\x24\x61\x58\xd3\xf0\xa2\xaa\xb4\x23\x24\x8e\xbf\x75\xf8\x27\x4e\xb6\xe5\x11\x64\x0f\x39\xba\x5b\x2e\xb5\x9d\x74\xe5\x51\xa2\xf3\x5a\xb1\x5b\xfd\x14\x68\x2e\xa6\x98\x52\x3b\x2f\x33\xc3\x8b\xac\x5a\x77\xe8\xe0\x08\x79\x6c\x36\xa3\x91\xa5\x87\x62\x70\x2e\xa6\x62\x02\x13\xe3\x51\x18\x8b\x09\x83\x99\xa1\x95\xe5\x07\x05\x55\x34\x00\x0f\xea\xa6\xea\x63\x67\x81\xa3\x70\x0f\x88\x94\xc7\x92\x73\x45\xb3\xb0\xd0\xf8\xee\x67\x9f\x48\x63\x98\xa0\xa2\x85\x81\xb9\xae\xea\x41\x27\x22\xef\x82\x0b\x18\x56\xd8\x68\x60\x8b\x13\x6a\xde\xd0\xe4\x96\x89\x14\xcb\x0f\xc1\xb2\xd3\x85\xa0\xb9\x4b\x45\x15\xd5\x54\x6e\xf4\xd7\x3d\x67\x6a\xc0\x48\x39\x1f\xaa\x8b\x5c\x77\x9f\x30\x28\x75\xe7\x5c\x2f\x9f\x34\xd6\x32\xde\x74\xce\x35\x1a\x61\x14\x9f\x27\xcc\xf3\x7f\xfb\xa9\x7d\x4e\x7d\xde\x22\x1e\x7d\x69\xf2\xce\x55\x91\x47\xf8\x0b\xe4\x3e\x18\xbf\x21\xeb\x14\xcd\xec\xd1\x5e\x84\xf0\xcc\xc6\xe6\x8e\x17\xfb\x2d\xa8\xa2\xc6\x5d\xc2\x68\x0f\x3f\xbe\xb9\xa8\x1f\xe2\x8f\x34\x95\x9a\xbc\xc9\x64\x72\x4b\x2e\x18\x08\x5d\x0f\x59\x10\x44\x8d\xd3\xa7\x4c\x18\x9d\xd3\xe9\xb6\xdb\xb1\x3e\xc9\xa5\xe0\x46\xaa\xcd\xf4\xe2\xa5\x3e\xe1\x93\xa4\x23\x56\xe3\xf4\x59\x27\x23\xb6\x08\xb6\x4b\x35\x42\x05\xc7\x10\xba\xfb\x5c\x7e\x3b\x1e\xaa\x9f\xcd\xe4\x5d\xdf\xc8\x7e\xa9\x59\x9f\xb7\xb8\x6f\xed\xb0\xba\x5b\xb6\x80\x4b\xe6\x8e\xeb\xfb\x16\xbb\xd5\x94\x03\x23\xc1\xa6\x04\xef\x2d\x8b\xfe\xf8\xe6\xc2\xf2\x86\x41\x2c\xec\x9d\x30\x93\x9c\x24\xac\x98\x9d\xb8\x0f\x3f\x4b\xa0\x78\x6a\xd1\x15\x2a\x67\x24\x91\x59\xe6\xe2\x9d\xe5\x84\x9c\xb3\x62\x16\x06\x7b\xec\x95\x3e\x5d\xaa\xdb\x42\xca\xae\x29\x3f\xa3\x03\x63\x7b\xbb\xf3\x12\x21\x8e\x1a\x77\xab\x63\xf0\x58\xa8\xf2\xac\x2b\x31\x3e\x20\x70\x1e\xb8\xaa\x7e\xad\x96\x7e\xec\x7a\x59\x4f\x07\xec\x7d\x38\x6a\xe4\x66\x38\x41\x49\x3a\x65\x29\x91\x73\xa6\x14\x4f\x99\x26\x81\xde\xc4\xaa\x27\xcf\x1e\x1b\x6e\x2f\x99\x89\x9f\x3c\x33\xf1\x0e\x3a\x4e\x44\x9e\x6c\xef\x65\xf2\x44\xd3\x9c\x8b\x67\x47\xa0\x74\x42\x33\x36\xfc\xd0\x41\x99\x18\x61\x8f\xba\x3e\xe1\x5f\x46\x09\xc5\xb6\xa4\xe9\xfa\x36\xe0\x0b\x11\x32\xdd\x66\x1f\x7d\x00\xad\x60\x4a\x0d\xbb\xdb\xca\xfe\xfa\x15\x81\xda\xde\x12\xe4\xce\xa7\xd4\x1f\x9e\x28\x35\x5e\x84\xe5\x98\xf7\x6b\x9f\xec\xd3\xed\x53\x57\xa3\x8b\x5f\x48\x23\x93\xac\x47\xd4\xb3\xeb\x21\xf9\x06\x47\xde\x6f\xa6\x3e\x25\x0d\x4a\x77\x17\x32\xa7\xbc\x73\xa1\x8d\x59\xbd\x30\xb5\x9f\xee\x75\x18\x96\xe0\xb8\x71\x8d\x90\x09\x9f\x96\x56\x03\x73\x5a\xd3\x4b\x12\xb5\x47\x11\x40\x2a\xf9\x23\xb2\x04\x79\x8f\xc3\x4a\xe6\xf0\x3b\x08\x4c\x21\x5c\x4d\x12\xcd\x84\xe6\x70\x4f\x12\x5d\x56\xbb\x72\x6f\x58\x5f\x10\xdd\x0b\x51\x48\xe9\x91\x77\x72\xca\x85\x3f\x95\xd2\x5d\xa3\x4d\x28\xcf\xda\x02\xe3\x45\xaa\x78\x72\xa9\x42\xeb\xec\x52\xd0\x71\xd6\xc6\x0b\xa0\x4e\xd6\x33\x0a\xf7\x9c\x0c\x7a\x9f\xa4\x5c\xdb\xff\x93\xd1\xe8\x1d\xd8\xc4\x4b\xe1\x65\x5d\xb0\x17\x3b\xb2\x16\x3c\xfd\xf1\x00\xee\xf7\xcc\x20\xa5\xd9\x21\xc7\xdd\x50\xa4\x76\xb2\x4c\xd7\xdc\x4e\xdc\x78\x98\xe9\x2f\x78\xce\xe2\xcd\xfd\x98\x91\x9b\x19\x4f\x6e\xaf\x23\xd3\xb7\x54\xf6\x9d\x88\x5e\xd5\x98\x50\xf3\xb7\x7d\x12\x44\x37\xd5\xeb\xee\x0a\xec\x4d\x44\xcf\x47\x6e\xc1\x76\x18\x42\xb5\x96\x09\xaf\xee\x39\xc0\x5c\x52\x11\xfc\x14\x08\xfe\x7e\x17\x01\x3c\xfd\x9e\xbc\xc9\x6f\x9a\xaf\x7a\xaa\x63\x5e\xc4\x85\x5f\xeb\x5e\x27\x8e\xa8\xb1\x43\x96\xee\x9b\x5a\x5e\x6e\x2f\x9b\x36\x8c\xf6\xde\x8b\xdb\x6d\x92\x97\x92\x7c\x95\xc5\xa5\x6d\x0a\xf9\xb9\x5d\x5e\xbe\xbd\x2d\xb5\x4d\x20\xc3\x2a\x6d\xb8\x71\x53\x87\xef\x9c\x19\x1f\x0e\x53\x21\x8b\x32\x43\x5f\x89\xfb\x27\x17\xf7\xd6\x59\xfc\xce\x9e\xcc\xfa\x8f\x91\x68\xb3\xab\x23\xf0\x4f\x23\xe7\x66\x24\x92\xbd\xfa\xd5\xd7\x5f\xff\xd8\xb3\x70\xb6\x55\x81\x1f\x22\x0d\x67\x4b\x93\xe8\x4b\xa4\xcd\x4b\xa4\x4d\x8c\x8a\x0f\x99\x46\x75\xcf\xb1\x34\x1d\x5d\x5c\xbb\xb9\xb7\xb6\x8f\x96\x69\xed\x04\xdb\xd5\x01\xb6\x43\x3c\xcc\x9e\xa2\x60\x3a\xfb\x82\x76\x89\x78\x79\x89\x73\xf9\xa9\xc5\xb9\xec\xe2\x03\xda\x3d\xa6\xa5\x8b\xef\xe7\x4f\x29\x7e\xa5\xc3\x61\x6c\x1f\x67\xd1\x3d\xba\xa2\x7b\x3e\xbb\xee\x96\xad\x5d\x4a\x1a\xc5\xf6\x19\xa7\x45\x54\x15\x04\x7d\xe1\x41\xcc\x8f\x65\xa4\x3d\x58\x8f\xa2\x43\x90\x0e\x0a\x14\x0e\x2f\xbb\xd4\x12\x74\x3a\xf9\x87\x51\xe3\x6a\x23\xbc\x7e\x9a\x1b\x8d\x9f\xe6\x95\xc1\x4b\x61\x90\xe7\x6d\xd3\xd6\xb5\xdc\x22\xde\x92\x00\x67\x1d\x18\xb1\x1c\xc7\x39\x0d\xab\x33\x72\x76\x3d\xb4\xea\x32\x84\xcf\xd0\x4c\x0f\xc8\x0a\x3e\xed\xed\x92\x8e\xaf\x7b\xfe\x4c\x8d\x61\x79\x61\xda\x6f\xf6\x8b\x49\xfb\xc9\x4d\xda\x3b\xdb\xe3\x3e\x87\x8e\xa1\x02\x64\x99\x53\xd1\xb7\x27\x0a\x8c\xdb\xb5\x5b\xb0\x06\x09\x1e\x10\xef\x95\x8b\xb0\xa0\x8a\x61\xd2\xa7\x7a\xc5\x5b\x1a\xd5\x3f\x7c\x18\x23\x24\x8c\xbd\xf3\xca\x91\x81\x36\x4e\x5a\x22\x97\xdc\x3e\xdd\x72\x02\x14\xfc\xa1\x8a\xb8\x70\x4d\x6f\x36\x33\x86\xcc\xfa\x1a\x02\x51\xaa\x56\x75\x49\x18\x45\x61\x9a\x65\xf2\x0e\xbf\x1d\x33\x30\x0b\x7d\x3b\x17\x17\x61\x35\x66\x24\xe7\x56\xa9\x76\xc6\xcf\x78\x3a\x78\x15\x69\x25\x6a\xa6\x50\x60\x55\xee\x36\x6b\xc4\x4c\xbc\xd1\x56\x21\x15\xe8\x08\x6d\xff\xed\x1d\x6f\x30\x2b\xae\xa3\x09\x63\x36\xa3\x73\x2e\x4b\x85\xbd\x8d\x24\x07\xee\x27\x60\x09\x0b\x59\x06\xd3\x14\x56\x49\x0c\xab\xd3\x2b\xe0\x74\x55\xfd\x08\xa2\x7c\x2a\xbd\x2d\xa1\xcf\xbe\x70\x6d\x96\xd7\xe2\x41\xe4\x93\xb6\xed\x0b\x6f\xe6\xba\xb0\x6c\xa1\x73\x45\xb4\xcf\x71\xbf\xba\x60\x32\x1f\xc1\x4f\x3f\xa2\x7a\x68\x5b\x73\x91\xbe\xc8\x3a\xfb\x96\x75\xc2\x75\x55\xc6\x93\x45\xe7\x4a\x61\xd5\x35\x95\xed\x4e\xde\x50\xcd\x52\xf2\x9e\x0a\x3a\x45\xb5\xec\x68\x74\xfd\xe6\xfd\xb1\xdd\x36\x50\xfb\x86\x17\x2b\xef\xb2\x46\xf1\x1c\xae\xf6\x19\x06\xb1\xb4\xc2\x1d\x38\x51\xc7\x35\xee\x35\x8c\x83\x04\x6e\xd2\x2e\x41\xec\x72\xe8\x65\xb3\xc6\x63\x83\x28\xcc\xf3\xf4\x9e\x55\x1d\xb9\xd0\x86\x66\xd9\x75\x46\xc5\x59\x51\x28\x39\x5f\xad\x09\xd7\x03\xc3\x5d\x43\xcf\xda\xd1\xf7\xc1\xbf\x2c\x10\xd0\x70\xd7\x2b\xc8\xb0\x1a\x7f\x40\x86\x26\x28\xc4\x52\x00\x1b\x3c\x38\x2b\x8d\xcc\xa9\xe1\xc9\x81\xd5\x9b\x0f\xde\x53\x51\xd2\x6c\xa5\x87\xd1\xc6\x65\xac\x13\xeb\x36\x76\x5a\x9f\x1c\xad\x45\xb7\x8d\xf2\xc1\xe6\xfe\x86\x2a\x4b\x5b\xce\x47\x9f\x3b\xf5\xd5\x86\x9a\x72\x89\x72\x6e\xa0\xe6\xeb\xe9\x77\x9f\x64\x54\x9b\x4f\x45\x6a\x4f\x72\xe3\xd7\x4d\x44\x3a\xa1\x86\x66\x72\xfa\x07\x46\xb3\xd5\xf8\x5c\xc3\x93\xf3\xb8\xb5\x37\xfe\x20\xca\x8c\xca\x71\x68\x78\xa8\x89\x15\x8a\x7d\xbc\xb6\x62\x19\x9b\x53\x61\x7c\x77\xac\x94\xad\x0f\xdd\xfa\x01\x8b\x78\x65\xf0\x4c\x99\x61\x2a\xe7\xa2\x3e\xe6\x08\xda\x9e\x4b\x91\x72\x34\xf5\x81\x31\x0b\x7b\xd4\xc7\x5d\x8f\x6a\xeb\xcc\xf9\x1b\x0c\xf8\x75\xca\x13\xcd\xa7\x0e\x0a\x6c\x36\x76\x32\xe1\x0c\x5f\xc2\xcd\x75\x6d\x6e\x4b\x90\x22\xb7\xc2\x0a\x73\x90\xf3\x62\x35\x91\xda\xca\xdb\xb7\xf1\xf4\xbe\xdf\x63\x9c\xc2\x7a\xbf\xc8\xbe\x9b\xf7\x3a\x43\xff\x26\x14\xc3\x67\xbb\x34\xd0\x9c\xca\x7a\x0a\xba\x0a\xef\x42\x37\x0c\xee\x6b\x54\x57\xaf\x35\x5a\x4f\xf1\x5b\x09\x4b\xed\xe4\x9a\xb6\x79\xd3\xeb\xb4\xb6\xca\xf2\xbd\xa4\x7e\xb6\x90\xf2\xb6\xb2\xa8\x96\xe9\xcb\xeb\xca\xf0\xd0\x39\xc5\x29\xa7\x3e\x50\x52\x70\x86\x89\x3a\xa8\x70\xc0\x02\xce\xc2\x68\xea\x5e\x5a\x0e\x66\xd5\x38\xf8\xad\xe7\xee\x9a\xd1\xb0\xeb\x7c\x17\xbc\x71\x98\x62\xa2\x0a\xb8\x2c\x38\xf9\x46\xba\x8b\x52\x17\x50\x6a\x69\x00\xf0\xed\x1e\xd1\x65\x32\x23\x54\xdb\xa9\x59\x84\xb6\x27\x9e\x0d\x72\x2a\xf8\x84\x69\x33\x08\x79\x68\xf5\x9f\x7e\xf9\x97\x01\x79\x2b\x15\x71\x7e\xd8\x3d\x9f\x01\xc2\xcd\xb3\xc2\x0b\xae\x71\x31\xa1\x6f\xa5\x69\x16\x32\x75\x93\xbe\x83\xc9\x1a\x7a\x6b\x79\x18\x4e\xb6\x64\x70\x5d\x70\x4a\x0e\xac\x90\x17\x7d\xfa\x1f\x96\x2d\xfd\xeb\x80\x1c\xdd\x01\xd3\x3e\xb0\x7f\x1e\xe0\x07\x83\x2f\x61\xac\x08\x57\x1f\xc6\x30\x3f\xc5\xa7\x53\xa6\x50\xe5\x23\x10\x0e\x77\xec\x32\x58\x08\x19\x35\xf6\x37\xbf\x95\x8a\xd8\x9c\xc8\x9f\x7e\xf9\x97\x03\x72\x54\x5f\x17\xe1\x22\x65\x5f\xc8\x2f\xd1\xf4\xcb\xb5\x5d\xe3\xb1\xbb\x40\xd1\x0b\x61\xe8\x17\x3b\x66\x32\x93\x9a\x09\x54\xbf\x8d\x24\x33\x3a\x67\x44\x4b\xab\xb5\xb2\x2c\xeb\x3b\xb3\x36\xb9\xa3\x90\x55\xc4\x83\x12\x82\xc0\x49\x41\x95\xa9\xa1\xc4\xc0\x59\x35\xe0\x6b\x76\xdb\xa6\xc2\x5f\xff\x4e\xb8\x70\x77\x46\xee\xb6\xca\xee\x39\x84\x34\xe2\x26\x19\x49\x92\x19\x15\xd3\x10\x47\x3d\x29\x4d\xa9\xd8\x96\xeb\x96\x96\x67\xe0\x96\x8b\x4e\xe1\xb6\xdf\x72\xd1\xbc\xb9\x5f\x6d\x0b\x9a\x72\xe3\x9d\xfe\x9d\x23\x9f\x59\x9c\xd8\x5d\x50\x7c\x5c\x1a\xa9\xf4\x49\xca\xe6\x2c\x3b\xd1\x7c\xda\xa7\x2a\x99\x71\xc3\x12\xbb\xac\x13\x5a\xf0\x7e\x22\x85\xdd\x71\xc8\x20\x90\xa7\x3f\x83\x22\x98\x7d\x3b\xd5\x2d\x79\x8d\x5b\x2e\x7a\xbb\x21\xec\x49\x0d\x60\x7b\x5b\x63\x0b\x1b\xce\xf2\x42\xd1\x9e\xf2\x08\xab\x05\xe3\xc5\xc9\x5e\x16\xeb\xd3\xf2\x76\xe7\x31\x87\x2e\xd3\x74\xd2\x1c\xc3\x1e\x3b\xf4\xd2\x80\x53\x59\xa3\x94\x39\x4d\x91\x94\x52\xb1\x78\x70\xe4\xb7\x20\x85\x84\xec\xc9\xa2\x9f\x60\x7d\xfb\x3e\x15\xa9\xfd\x37\xc6\xa3\x24\x8b\xbd\xc0\xb0\xe4\x9d\x08\xc1\xa7\xe1\xc5\xe3\x1c\x89\x92\xef\xe1\xd4\x3b\x79\xad\xa5\x10\x85\xa2\x2a\xb8\xec\x18\x55\x32\xcf\x34\xeb\x02\x2a\xd7\x7e\xd4\xff\x76\x77\x26\x21\x33\xd7\x36\x91\x6a\xf3\x4d\x47\x24\x3b\xb6\x9c\xef\xbb\xaa\x47\xb3\x26\xbe\x1d\xcc\xa5\x81\xf2\xd1\xf3\xb5\x65\x78\x05\x05\x18\xcc\xfa\x3b\xda\x56\x38\xe4\xef\xe8\xed\x44\xfa\x2b\xf3\x03\x25\x41\x29\xd9\xae\x40\x55\xfa\x4b\xad\xd2\x16\x2e\xca\x30\x6d\x08\x9d\x53\x9e\x81\x45\x5d\x8e\x35\x53\x73\x2c\x79\xe4\xd2\xe2\xd1\xa6\x9e\xe5\xaa\x1a\xa0\x18\xf5\x48\x9a\x8f\x5f\xc3\xf2\xae\x6c\x5a\x00\x68\x43\x8d\xd9\xaf\x9d\xf5\x5e\xf4\x1e\x54\x2f\xd7\xfe\x6c\xbf\xb0\xa3\x1a\x63\xf1\xef\x0f\x8c\x2a\x33\x66\xd4\xdc\xf0\x4d\x7c\x77\x09\xa5\x6b\xfd\xbc\xc1\xa5\x42\xe8\x3b\x46\xa6\xd2\x58\x11\xab\x04\xdc\x47\x99\x14\x13\xd0\x04\x44\x7b\x68\x8c\xae\x56\x79\xa3\x28\xc4\xbd\x48\xd1\x71\x99\xf5\x8e\xcb\xeb\x74\xd2\xb1\xc3\x24\x83\xad\x31\x05\x84\x14\xcc\xed\x1d\xde\x40\x00\x05\x7a\x9c\x25\xe7\x4c\xeb\x8d\xa9\x21\xea\x2e\x7c\xd8\x1a\x8f\x72\xe3\x3a\x2c\xf7\xbf\x61\xfc\x84\x15\xa0\x53\x66\x28\xcf\xfc\x51\x46\x50\x04\x28\x6d\xa3\xae\x1b\x17\xa8\x18\xd5\x9b\x04\x84\x66\x46\x2c\x2d\x05\x4e\x5a\x0a\xd6\xbf\x93\x2a\x25\xe7\x34\x67\xd9\x39\xd5\xcc\x8d\x15\x87\xab\xe1\x1e\x1d\xea\xbd\x4e\x79\xb5\xed\x6b\xcd\x94\xd1\xf8\xe3\x91\xc8\xe1\x46\xa5\x62\xe1\x04\x7b\xde\x04\x79\xa3\x4a\xd6\x23\x6f\x2d\xf7\xea\x91\x4f\xe2\x56\xc8\xbb\xfb\xcd\xd5\x6c\xbc\xb9\xa8\xbb\x59\xb9\xcc\x2d\x90\x22\xcf\x25\x84\xa9\x19\x7c\xc2\x74\x77\x9c\x91\x23\xf8\x6b\x4c\x8d\x75\x66\x13\x9a\xfa\x19\xd9\x7f\x2e\x99\xa0\xac\xa2\xa8\xe4\x54\x31\x8d\x39\x57\x56\x26\xf4\x6b\x6b\x72\xfe\x86\x09\x17\xf1\xb6\x75\x7a\xc3\x55\xbd\xfc\x4c\x3d\x5f\x9b\x56\xbf\xb8\xfd\x76\x1f\x2b\xb2\x95\xa2\xc6\x66\x2f\xbc\x68\xa2\x6b\x8c\x4f\xeb\x66\xb8\xda\xe8\x14\x71\xbd\xa8\x2d\x0a\x25\x9b\xac\xa3\x7e\x75\xe7\xa3\xcf\xeb\x81\xbd\x96\xf7\x6d\xe3\x4f\xdb\xcd\x52\xf7\x35\x48\x6d\x3d\x33\x5b\x8d\x50\x2f\xe6\xa7\x17\xf3\xd3\x8f\xc9\xfc\xb4\x15\xe3\x37\x99\x9c\x7e\x1c\xc6\xa6\xad\x4b\xdc\x64\x60\x7a\x96\xa6\xa5\x56\x2b\xda\x68\x4e\x7a\xb6\x86\xa4\xad\x4b\x6b\x69\x3c\xfa\xf7\x31\x1b\x6d\x85\xd8\x06\x53\xd1\x33\x34\x12\xb5\x11\xc8\x58\xda\x46\x4c\x1c\x46\x8d\x63\x41\xb1\x2a\x98\x18\x86\xf3\x2e\x35\xb1\x38\xb3\xab\xb4\x68\x05\xb8\xad\x73\x3b\x74\x93\x6b\x2f\x7b\x39\x81\xd1\x95\x13\x5c\x9a\x2c\xb9\xb8\xbc\xfe\x78\x79\x7e\x76\x73\x79\xd1\x94\xef\x56\x41\x7a\x8b\x24\xb6\xd9\x06\xd1\x8f\x24\xb1\x35\x0d\x2c\x41\x5e\xf3\x93\xc5\x81\x35\x3f\x95\x25\x5f\xd5\xeb\xfe\x72\xe1\xbd\xb8\xdc\xbd\xf8\xc7\xf6\xd3\xd9\xf6\x78\xda\xd3\x09\xd8\x82\x1e\x63\x56\xee\x99\xc9\x2c\xd5\xde\xd7\x74\x78\x11\xa2\x97\xb8\x48\xb2\x32\xb5\xc2\xc5\xa7\x4f\xc3\x0b\x3d\x20\xe4\x0d\x4b\x68\xa9\xc1\x0a\x93\x4a\x71\x68\xc8\x87\xab\x77\x7f\x04\x1f\x6a\x68\xd1\x0b\xc9\x3e\x20\x83\x2c\xa7\x98\x04\xd7\x60\x16\x32\xf2\x86\xa1\xa0\x02\x5f\x4e\x68\x61\xa9\x98\xc6\x2a\x0b\x06\x64\x91\x19\xcb\x0a\x4b\x31\x6f\x19\xa9\x72\x7f\xda\x81\xab\x1a\xe6\xde\xe5\x71\xca\x0c\x46\x3a\x6d\xf2\x6a\xdc\x08\xb5\x2d\x16\xd7\x7b\xd8\x5a\x6b\xea\xa3\xd3\xc6\xef\xa8\x76\x16\xab\x95\xb3\xdd\xb2\xbf\xdb\xed\x33\xeb\x4d\x1c\x6b\x8c\x1b\x48\x9e\xe1\xaf\xa5\x39\xdb\xc9\x56\x76\x0c\x74\x22\xe1\xa6\xb5\x35\x75\xbd\x1b\xd0\xea\x9c\xf5\x4b\xb6\x0c\xd6\x04\x72\xed\xc3\xc1\x8b\x3a\x9a\x72\xbb\xb9\x40\xc1\x8b\xb4\x56\x5d\xd2\x79\xdb\xd5\xdf\x95\xe3\x50\x5f\xb4\x9a\xaf\xb3\xc8\x90\x7f\xfc\xeb\xab\xff\x1f\x00\x00\xff\xff\x19\x53\xdb\x44\x5f\xac\x01\x00") func operatorsCoreosCom_subscriptionsYamlBytes() ([]byte, error) { return bindataRead( diff --git a/vendor/github.com/spf13/cobra/.travis.yml b/vendor/github.com/spf13/cobra/.travis.yml deleted file mode 100644 index e0a3b50043..0000000000 --- a/vendor/github.com/spf13/cobra/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -language: go - -stages: - - test - - build - -go: - - 1.12.x - - 1.13.x - - tip - -env: GO111MODULE=on - -before_install: - - go get -u github.com/kyoh86/richgo - - go get -u github.com/mitchellh/gox - - curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin latest - -matrix: - allow_failures: - - go: tip - include: - - stage: build - go: 1.13.x - script: make cobra_generator - -script: - - make test diff --git a/vendor/github.com/spf13/cobra/README.md b/vendor/github.com/spf13/cobra/README.md index a1b13ddda6..074e3979f8 100644 --- a/vendor/github.com/spf13/cobra/README.md +++ b/vendor/github.com/spf13/cobra/README.md @@ -7,7 +7,6 @@ Cobra is used in many Go projects such as [Kubernetes](http://kubernetes.io/), name a few. [This list](./projects_using_cobra.md) contains a more extensive list of projects using Cobra. [![](https://img.shields.io/github/workflow/status/spf13/cobra/Test?longCache=tru&label=Test&logo=github%20actions&logoColor=fff)](https://github.com/spf13/cobra/actions?query=workflow%3ATest) -[![Build Status](https://travis-ci.org/spf13/cobra.svg "Travis CI status")](https://travis-ci.org/spf13/cobra) [![GoDoc](https://godoc.org/github.com/spf13/cobra?status.svg)](https://godoc.org/github.com/spf13/cobra) [![Go Report Card](https://goreportcard.com/badge/github.com/spf13/cobra)](https://goreportcard.com/report/github.com/spf13/cobra) [![Slack](https://img.shields.io/badge/Slack-cobra-brightgreen)](https://gophers.slack.com/archives/CD3LP1199) @@ -19,18 +18,18 @@ name a few. [This list](./projects_using_cobra.md) contains a more extensive lis * [Commands](#commands) * [Flags](#flags) - [Installing](#installing) -- [Getting Started](#getting-started) - * [Using the Cobra Generator](#using-the-cobra-generator) - * [Using the Cobra Library](#using-the-cobra-library) - * [Working with Flags](#working-with-flags) - * [Positional and Custom Arguments](#positional-and-custom-arguments) - * [Example](#example) - * [Help Command](#help-command) - * [Usage Message](#usage-message) - * [PreRun and PostRun Hooks](#prerun-and-postrun-hooks) - * [Suggestions when "unknown command" happens](#suggestions-when-unknown-command-happens) - * [Generating documentation for your command](#generating-documentation-for-your-command) - * [Generating shell completions](#generating-shell-completions) +- [Usage](#usage) + * [Using the Cobra Generator](user_guide.md#using-the-cobra-generator) + * [Using the Cobra Library](user_guide.md#using-the-cobra-library) + * [Working with Flags](user_guide.md#working-with-flags) + * [Positional and Custom Arguments](user_guide.md#positional-and-custom-arguments) + * [Example](user_guide.md#example) + * [Help Command](user_guide.md#help-command) + * [Usage Message](user_guide.md#usage-message) + * [PreRun and PostRun Hooks](user_guide.md#prerun-and-postrun-hooks) + * [Suggestions when "unknown command" happens](user_guide.md#suggestions-when-unknown-command-happens) + * [Generating documentation for your command](user_guide.md#generating-documentation-for-your-command) + * [Generating shell completions](user_guide.md#generating-shell-completions) - [Contributing](CONTRIBUTING.md) - [License](#license) @@ -117,643 +116,9 @@ Next, include Cobra in your application: import "github.com/spf13/cobra" ``` -# Getting Started +# Usage -While you are welcome to provide your own organization, typically a Cobra-based -application will follow the following organizational structure: - -``` - ▾ appName/ - ▾ cmd/ - add.go - your.go - commands.go - here.go - main.go -``` - -In a Cobra app, typically the main.go file is very bare. It serves one purpose: initializing Cobra. - -```go -package main - -import ( - "{pathToYourApp}/cmd" -) - -func main() { - cmd.Execute() -} -``` - -## Using the Cobra Generator - -Cobra provides its own program that will create your application and add any -commands you want. It's the easiest way to incorporate Cobra into your application. - -[Here](https://github.com/spf13/cobra/blob/master/cobra/README.md) you can find more information about it. - -## Using the Cobra Library - -To manually implement Cobra you need to create a bare main.go file and a rootCmd file. -You will optionally provide additional commands as you see fit. - -### Create rootCmd - -Cobra doesn't require any special constructors. Simply create your commands. - -Ideally you place this in app/cmd/root.go: - -```go -var rootCmd = &cobra.Command{ - Use: "hugo", - Short: "Hugo is a very fast static site generator", - Long: `A Fast and Flexible Static Site Generator built with - love by spf13 and friends in Go. - Complete documentation is available at http://hugo.spf13.com`, - Run: func(cmd *cobra.Command, args []string) { - // Do Stuff Here - }, -} - -func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} -``` - -You will additionally define flags and handle configuration in your init() function. - -For example cmd/root.go: - -```go -package cmd - -import ( - "fmt" - "os" - - homedir "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -var ( - // Used for flags. - cfgFile string - userLicense string - - rootCmd = &cobra.Command{ - Use: "cobra", - Short: "A generator for Cobra based Applications", - Long: `Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, - } -) - -// Execute executes the root command. -func Execute() error { - return rootCmd.Execute() -} - -func init() { - cobra.OnInitialize(initConfig) - - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") - rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution") - rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project") - rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration") - viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) - viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) - viper.SetDefault("author", "NAME HERE ") - viper.SetDefault("license", "apache") - - rootCmd.AddCommand(addCmd) - rootCmd.AddCommand(initCmd) -} - -func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - cobra.CheckErr(err) - - // Search config in home directory with name ".cobra" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".cobra") - } - - viper.AutomaticEnv() - - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} -``` - -### Create your main.go - -With the root command you need to have your main function execute it. -Execute should be run on the root for clarity, though it can be called on any command. - -In a Cobra app, typically the main.go file is very bare. It serves one purpose: to initialize Cobra. - -```go -package main - -import ( - "{pathToYourApp}/cmd" -) - -func main() { - cmd.Execute() -} -``` - -### Create additional commands - -Additional commands can be defined and typically are each given their own file -inside of the cmd/ directory. - -If you wanted to create a version command you would create cmd/version.go and -populate it with the following: - -```go -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func init() { - rootCmd.AddCommand(versionCmd) -} - -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Print the version number of Hugo", - Long: `All software has versions. This is Hugo's`, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Hugo Static Site Generator v0.9 -- HEAD") - }, -} -``` - -### Returning and handling errors - -If you wish to return an error to the caller of a command, `RunE` can be used. - -```go -package cmd - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func init() { - rootCmd.AddCommand(tryCmd) -} - -var tryCmd = &cobra.Command{ - Use: "try", - Short: "Try and possibly fail at something", - RunE: func(cmd *cobra.Command, args []string) error { - if err := someFunc(); err != nil { - return err - } - return nil - }, -} -``` - -The error can then be caught at the execute function call. - -## Working with Flags - -Flags provide modifiers to control how the action command operates. - -### Assign flags to a command - -Since the flags are defined and used in different locations, we need to -define a variable outside with the correct scope to assign the flag to -work with. - -```go -var Verbose bool -var Source string -``` - -There are two different approaches to assign a flag. - -### Persistent Flags - -A flag can be 'persistent', meaning that this flag will be available to the -command it's assigned to as well as every command under that command. For -global flags, assign a flag as a persistent flag on the root. - -```go -rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output") -``` - -### Local Flags - -A flag can also be assigned locally, which will only apply to that specific command. - -```go -localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") -``` - -### Local Flag on Parent Commands - -By default, Cobra only parses local flags on the target command, and any local flags on -parent commands are ignored. By enabling `Command.TraverseChildren`, Cobra will -parse local flags on each command before executing the target command. - -```go -command := cobra.Command{ - Use: "print [OPTIONS] [COMMANDS]", - TraverseChildren: true, -} -``` - -### Bind Flags with Config - -You can also bind your flags with [viper](https://github.com/spf13/viper): -```go -var author string - -func init() { - rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution") - viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) -} -``` - -In this example, the persistent flag `author` is bound with `viper`. -**Note**: the variable `author` will not be set to the value from config, -when the `--author` flag is not provided by user. - -More in [viper documentation](https://github.com/spf13/viper#working-with-flags). - -### Required flags - -Flags are optional by default. If instead you wish your command to report an error -when a flag has not been set, mark it as required: -```go -rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)") -rootCmd.MarkFlagRequired("region") -``` - -Or, for persistent flags: -```go -rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)") -rootCmd.MarkPersistentFlagRequired("region") -``` - -## Positional and Custom Arguments - -Validation of positional arguments can be specified using the `Args` field -of `Command`. - -The following validators are built in: - -- `NoArgs` - the command will report an error if there are any positional args. -- `ArbitraryArgs` - the command will accept any args. -- `OnlyValidArgs` - the command will report an error if there are any positional args that are not in the `ValidArgs` field of `Command`. -- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args. -- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args. -- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args. -- `ExactValidArgs(int)` - the command will report an error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command` -- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args. - -An example of setting the custom validator: - -```go -var cmd = &cobra.Command{ - Short: "hello", - Args: func(cmd *cobra.Command, args []string) error { - if len(args) < 1 { - return errors.New("requires a color argument") - } - if myapp.IsValidColor(args[0]) { - return nil - } - return fmt.Errorf("invalid color specified: %s", args[0]) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Hello, World!") - }, -} -``` - -## Example - -In the example below, we have defined three commands. Two are at the top level -and one (cmdTimes) is a child of one of the top commands. In this case the root -is not executable, meaning that a subcommand is required. This is accomplished -by not providing a 'Run' for the 'rootCmd'. - -We have only defined one flag for a single command. - -More documentation about flags is available at https://github.com/spf13/pflag - -```go -package main - -import ( - "fmt" - "strings" - - "github.com/spf13/cobra" -) - -func main() { - var echoTimes int - - var cmdPrint = &cobra.Command{ - Use: "print [string to print]", - Short: "Print anything to the screen", - Long: `print is for printing anything back to the screen. -For many years people have printed back to the screen.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Print: " + strings.Join(args, " ")) - }, - } - - var cmdEcho = &cobra.Command{ - Use: "echo [string to echo]", - Short: "Echo anything to the screen", - Long: `echo is for echoing anything back. -Echo works a lot like print, except it has a child command.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("Echo: " + strings.Join(args, " ")) - }, - } - - var cmdTimes = &cobra.Command{ - Use: "times [string to echo]", - Short: "Echo anything to the screen more times", - Long: `echo things multiple times back to the user by providing -a count and a string.`, - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - for i := 0; i < echoTimes; i++ { - fmt.Println("Echo: " + strings.Join(args, " ")) - } - }, - } - - cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input") - - var rootCmd = &cobra.Command{Use: "app"} - rootCmd.AddCommand(cmdPrint, cmdEcho) - cmdEcho.AddCommand(cmdTimes) - rootCmd.Execute() -} -``` - -For a more complete example of a larger application, please checkout [Hugo](http://gohugo.io/). - -## Help Command - -Cobra automatically adds a help command to your application when you have subcommands. -This will be called when a user runs 'app help'. Additionally, help will also -support all other commands as input. Say, for instance, you have a command called -'create' without any additional configuration; Cobra will work when 'app help -create' is called. Every command will automatically have the '--help' flag added. - -### Example - -The following output is automatically generated by Cobra. Nothing beyond the -command and flag definitions are needed. - - $ cobra help - - Cobra is a CLI library for Go that empowers applications. - This application is a tool to generate the needed files - to quickly create a Cobra application. - - Usage: - cobra [command] - - Available Commands: - add Add a command to a Cobra Application - help Help about any command - init Initialize a Cobra Application - - Flags: - -a, --author string author name for copyright attribution (default "YOUR NAME") - --config string config file (default is $HOME/.cobra.yaml) - -h, --help help for cobra - -l, --license string name of license for the project - --viper use Viper for configuration (default true) - - Use "cobra [command] --help" for more information about a command. - - -Help is just a command like any other. There is no special logic or behavior -around it. In fact, you can provide your own if you want. - -### Defining your own help - -You can provide your own Help command or your own template for the default command to use -with following functions: - -```go -cmd.SetHelpCommand(cmd *Command) -cmd.SetHelpFunc(f func(*Command, []string)) -cmd.SetHelpTemplate(s string) -``` - -The latter two will also apply to any children commands. - -## Usage Message - -When the user provides an invalid flag or invalid command, Cobra responds by -showing the user the 'usage'. - -### Example -You may recognize this from the help above. That's because the default help -embeds the usage as part of its output. - - $ cobra --invalid - Error: unknown flag: --invalid - Usage: - cobra [command] - - Available Commands: - add Add a command to a Cobra Application - help Help about any command - init Initialize a Cobra Application - - Flags: - -a, --author string author name for copyright attribution (default "YOUR NAME") - --config string config file (default is $HOME/.cobra.yaml) - -h, --help help for cobra - -l, --license string name of license for the project - --viper use Viper for configuration (default true) - - Use "cobra [command] --help" for more information about a command. - -### Defining your own usage -You can provide your own usage function or template for Cobra to use. -Like help, the function and template are overridable through public methods: - -```go -cmd.SetUsageFunc(f func(*Command) error) -cmd.SetUsageTemplate(s string) -``` - -## Version Flag - -Cobra adds a top-level '--version' flag if the Version field is set on the root command. -Running an application with the '--version' flag will print the version to stdout using -the version template. The template can be customized using the -`cmd.SetVersionTemplate(s string)` function. - -## PreRun and PostRun Hooks - -It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistentPostRun` and `PostRun` will be executed after `Run`. The `Persistent*Run` functions will be inherited by children if they do not declare their own. These functions are run in the following order: - -- `PersistentPreRun` -- `PreRun` -- `Run` -- `PostRun` -- `PersistentPostRun` - -An example of two commands which use all of these features is below. When the subcommand is executed, it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`: - -```go -package main - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -func main() { - - var rootCmd = &cobra.Command{ - Use: "root [sub]", - Short: "My root command", - PersistentPreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args) - }, - PreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PreRun with args: %v\n", args) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd Run with args: %v\n", args) - }, - PostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PostRun with args: %v\n", args) - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args) - }, - } - - var subCmd = &cobra.Command{ - Use: "sub [no options!]", - Short: "My subcommand", - PreRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PreRun with args: %v\n", args) - }, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd Run with args: %v\n", args) - }, - PostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PostRun with args: %v\n", args) - }, - PersistentPostRun: func(cmd *cobra.Command, args []string) { - fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args) - }, - } - - rootCmd.AddCommand(subCmd) - - rootCmd.SetArgs([]string{""}) - rootCmd.Execute() - fmt.Println() - rootCmd.SetArgs([]string{"sub", "arg1", "arg2"}) - rootCmd.Execute() -} -``` - -Output: -``` -Inside rootCmd PersistentPreRun with args: [] -Inside rootCmd PreRun with args: [] -Inside rootCmd Run with args: [] -Inside rootCmd PostRun with args: [] -Inside rootCmd PersistentPostRun with args: [] - -Inside rootCmd PersistentPreRun with args: [arg1 arg2] -Inside subCmd PreRun with args: [arg1 arg2] -Inside subCmd Run with args: [arg1 arg2] -Inside subCmd PostRun with args: [arg1 arg2] -Inside subCmd PersistentPostRun with args: [arg1 arg2] -``` - -## Suggestions when "unknown command" happens - -Cobra will print automatic suggestions when "unknown command" errors happen. This allows Cobra to behave similarly to the `git` command when a typo happens. For example: - -``` -$ hugo srever -Error: unknown command "srever" for "hugo" - -Did you mean this? - server - -Run 'hugo --help' for usage. -``` - -Suggestions are automatic based on every subcommand registered and use an implementation of [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance). Every registered command that matches a minimum distance of 2 (ignoring case) will be displayed as a suggestion. - -If you need to disable suggestions or tweak the string distance in your command, use: - -```go -command.DisableSuggestions = true -``` - -or - -```go -command.SuggestionsMinimumDistance = 1 -``` - -You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but makes sense in your set of commands and for some which you don't want aliases. Example: - -``` -$ kubectl remove -Error: unknown command "remove" for "kubectl" - -Did you mean this? - delete - -Run 'kubectl help' for usage. -``` - -## Generating documentation for your command - -Cobra can generate documentation based on subcommands, flags, etc. Read more about it in the [docs generation documentation](doc/README.md). - -## Generating shell completions - -Cobra can generate a shell-completion file for the following shells: bash, zsh, fish, PowerShell. If you add more information to your commands, these completions can be amazingly powerful and flexible. Read more about it in [Shell Completions](shell_completions.md). +See [User Guide](user_guide.md). # License diff --git a/vendor/github.com/spf13/cobra/bash_completions.go b/vendor/github.com/spf13/cobra/bash_completions.go index 7106147937..733f4d1211 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.go +++ b/vendor/github.com/spf13/cobra/bash_completions.go @@ -384,7 +384,7 @@ func writePostscript(buf io.StringWriter, name string) { name = strings.Replace(name, ":", "__", -1) WriteStringAndCheck(buf, fmt.Sprintf("__start_%s()\n", name)) WriteStringAndCheck(buf, fmt.Sprintf(`{ - local cur prev words cword + local cur prev words cword split declare -A flaghash 2>/dev/null || : declare -A aliashash 2>/dev/null || : if declare -F _init_completion >/dev/null 2>&1; then @@ -400,11 +400,13 @@ func writePostscript(buf io.StringWriter, name string) { local flags_with_completion=() local flags_completion=() local commands=("%[1]s") + local command_aliases=() local must_have_one_flag=() local must_have_one_noun=() local has_completion_function local last_command local nouns=() + local noun_aliases=() __%[1]s_handle_word } @@ -510,6 +512,8 @@ func writeLocalNonPersistentFlag(buf io.StringWriter, flag *pflag.Flag) { // Setup annotations for go completions for registered flags func prepareCustomAnnotationsForFlags(cmd *Command) { + flagCompletionMutex.RLock() + defer flagCompletionMutex.RUnlock() for flag := range flagCompletionFunctions { // Make sure the completion script calls the __*_go_custom_completion function for // every registered flag. We need to do this here (and not when the flag was registered diff --git a/vendor/github.com/spf13/cobra/bash_completions.md b/vendor/github.com/spf13/cobra/bash_completions.md index 130f99b923..52919b2fa6 100644 --- a/vendor/github.com/spf13/cobra/bash_completions.md +++ b/vendor/github.com/spf13/cobra/bash_completions.md @@ -6,6 +6,8 @@ Please refer to [Shell Completions](shell_completions.md) for details. For backward compatibility, Cobra still supports its legacy dynamic completion solution (described below). Unlike the `ValidArgsFunction` solution, the legacy solution will only work for Bash shell-completion and not for other shells. This legacy solution can be used along-side `ValidArgsFunction` and `RegisterFlagCompletionFunc()`, as long as both solutions are not used for the same command. This provides a path to gradually migrate from the legacy solution to the new solution. +**Note**: Cobra's default `completion` command uses bash completion V2. If you are currently using Cobra's legacy dynamic completion solution, you should not use the default `completion` command but continue using your own. + The legacy solution allows you to inject bash functions into the bash completion script. Those bash functions are responsible for providing the completion choices for your own completions. Some code that works in kubernetes: diff --git a/vendor/github.com/spf13/cobra/bash_completionsV2.go b/vendor/github.com/spf13/cobra/bash_completionsV2.go new file mode 100644 index 0000000000..8859b57c42 --- /dev/null +++ b/vendor/github.com/spf13/cobra/bash_completionsV2.go @@ -0,0 +1,302 @@ +package cobra + +import ( + "bytes" + "fmt" + "io" + "os" +) + +func (c *Command) genBashCompletion(w io.Writer, includeDesc bool) error { + buf := new(bytes.Buffer) + genBashComp(buf, c.Name(), includeDesc) + _, err := buf.WriteTo(w) + return err +} + +func genBashComp(buf io.StringWriter, name string, includeDesc bool) { + compCmd := ShellCompRequestCmd + if !includeDesc { + compCmd = ShellCompNoDescRequestCmd + } + + WriteStringAndCheck(buf, fmt.Sprintf(`# bash completion V2 for %-36[1]s -*- shell-script -*- + +__%[1]s_debug() +{ + if [[ -n ${BASH_COMP_DEBUG_FILE:-} ]]; then + echo "$*" >> "${BASH_COMP_DEBUG_FILE}" + fi +} + +# Macs have bash3 for which the bash-completion package doesn't include +# _init_completion. This is a minimal version of that function. +__%[1]s_init_completion() +{ + COMPREPLY=() + _get_comp_words_by_ref "$@" cur prev words cword +} + +# This function calls the %[1]s program to obtain the completion +# results and the directive. It fills the 'out' and 'directive' vars. +__%[1]s_get_completion_results() { + local requestComp lastParam lastChar args + + # Prepare the command to request completions for the program. + # Calling ${words[0]} instead of directly %[1]s allows to handle aliases + args=("${words[@]:1}") + requestComp="${words[0]} %[2]s ${args[*]}" + + lastParam=${words[$((${#words[@]}-1))]} + lastChar=${lastParam:$((${#lastParam}-1)):1} + __%[1]s_debug "lastParam ${lastParam}, lastChar ${lastChar}" + + if [ -z "${cur}" ] && [ "${lastChar}" != "=" ]; then + # If the last parameter is complete (there is a space following it) + # We add an extra empty parameter so we can indicate this to the go method. + __%[1]s_debug "Adding extra empty parameter" + requestComp="${requestComp} ''" + fi + + # When completing a flag with an = (e.g., %[1]s -n=) + # bash focuses on the part after the =, so we need to remove + # the flag part from $cur + if [[ "${cur}" == -*=* ]]; then + cur="${cur#*=}" + fi + + __%[1]s_debug "Calling ${requestComp}" + # Use eval to handle any environment variables and such + out=$(eval "${requestComp}" 2>/dev/null) + + # Extract the directive integer at the very end of the output following a colon (:) + directive=${out##*:} + # Remove the directive + out=${out%%:*} + if [ "${directive}" = "${out}" ]; then + # There is not directive specified + directive=0 + fi + __%[1]s_debug "The completion directive is: ${directive}" + __%[1]s_debug "The completions are: ${out[*]}" +} + +__%[1]s_process_completion_results() { + local shellCompDirectiveError=%[3]d + local shellCompDirectiveNoSpace=%[4]d + local shellCompDirectiveNoFileComp=%[5]d + local shellCompDirectiveFilterFileExt=%[6]d + local shellCompDirectiveFilterDirs=%[7]d + + if [ $((directive & shellCompDirectiveError)) -ne 0 ]; then + # Error code. No completion. + __%[1]s_debug "Received error from custom completion go code" + return + else + if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then + if [[ $(type -t compopt) = "builtin" ]]; then + __%[1]s_debug "Activating no space" + compopt -o nospace + else + __%[1]s_debug "No space directive not supported in this version of bash" + fi + fi + if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then + if [[ $(type -t compopt) = "builtin" ]]; then + __%[1]s_debug "Activating no file completion" + compopt +o default + else + __%[1]s_debug "No file completion directive not supported in this version of bash" + fi + fi + fi + + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then + # File extension filtering + local fullFilter filter filteringCmd + + # Do not use quotes around the $out variable or else newline + # characters will be kept. + for filter in ${out[*]}; do + fullFilter+="$filter|" + done + + filteringCmd="_filedir $fullFilter" + __%[1]s_debug "File filtering command: $filteringCmd" + $filteringCmd + elif [ $((directive & shellCompDirectiveFilterDirs)) -ne 0 ]; then + # File completion for directories only + + # Use printf to strip any trailing newline + local subdir + subdir=$(printf "%%s" "${out[0]}") + if [ -n "$subdir" ]; then + __%[1]s_debug "Listing directories in $subdir" + pushd "$subdir" >/dev/null 2>&1 && _filedir -d && popd >/dev/null 2>&1 || return + else + __%[1]s_debug "Listing directories in ." + _filedir -d + fi + else + __%[1]s_handle_standard_completion_case + fi + + __%[1]s_handle_special_char "$cur" : + __%[1]s_handle_special_char "$cur" = +} + +__%[1]s_handle_standard_completion_case() { + local tab comp + tab=$(printf '\t') + + local longest=0 + # Look for the longest completion so that we can format things nicely + while IFS='' read -r comp; do + # Strip any description before checking the length + comp=${comp%%%%$tab*} + # Only consider the completions that match + comp=$(compgen -W "$comp" -- "$cur") + if ((${#comp}>longest)); then + longest=${#comp} + fi + done < <(printf "%%s\n" "${out[@]}") + + local completions=() + while IFS='' read -r comp; do + if [ -z "$comp" ]; then + continue + fi + + __%[1]s_debug "Original comp: $comp" + comp="$(__%[1]s_format_comp_descriptions "$comp" "$longest")" + __%[1]s_debug "Final comp: $comp" + completions+=("$comp") + done < <(printf "%%s\n" "${out[@]}") + + while IFS='' read -r comp; do + COMPREPLY+=("$comp") + done < <(compgen -W "${completions[*]}" -- "$cur") + + # If there is a single completion left, remove the description text + if [ ${#COMPREPLY[*]} -eq 1 ]; then + __%[1]s_debug "COMPREPLY[0]: ${COMPREPLY[0]}" + comp="${COMPREPLY[0]%%%% *}" + __%[1]s_debug "Removed description from single completion, which is now: ${comp}" + COMPREPLY=() + COMPREPLY+=("$comp") + fi +} + +__%[1]s_handle_special_char() +{ + local comp="$1" + local char=$2 + if [[ "$comp" == *${char}* && "$COMP_WORDBREAKS" == *${char}* ]]; then + local word=${comp%%"${comp##*${char}}"} + local idx=${#COMPREPLY[*]} + while [[ $((--idx)) -ge 0 ]]; do + COMPREPLY[$idx]=${COMPREPLY[$idx]#"$word"} + done + fi +} + +__%[1]s_format_comp_descriptions() +{ + local tab + tab=$(printf '\t') + local comp="$1" + local longest=$2 + + # Properly format the description string which follows a tab character if there is one + if [[ "$comp" == *$tab* ]]; then + desc=${comp#*$tab} + comp=${comp%%%%$tab*} + + # $COLUMNS stores the current shell width. + # Remove an extra 4 because we add 2 spaces and 2 parentheses. + maxdesclength=$(( COLUMNS - longest - 4 )) + + # Make sure we can fit a description of at least 8 characters + # if we are to align the descriptions. + if [[ $maxdesclength -gt 8 ]]; then + # Add the proper number of spaces to align the descriptions + for ((i = ${#comp} ; i < longest ; i++)); do + comp+=" " + done + else + # Don't pad the descriptions so we can fit more text after the completion + maxdesclength=$(( COLUMNS - ${#comp} - 4 )) + fi + + # If there is enough space for any description text, + # truncate the descriptions that are too long for the shell width + if [ $maxdesclength -gt 0 ]; then + if [ ${#desc} -gt $maxdesclength ]; then + desc=${desc:0:$(( maxdesclength - 1 ))} + desc+="…" + fi + comp+=" ($desc)" + fi + fi + + # Must use printf to escape all special characters + printf "%%q" "${comp}" +} + +__start_%[1]s() +{ + local cur prev words cword split + + COMPREPLY=() + + # Call _init_completion from the bash-completion package + # to prepare the arguments properly + if declare -F _init_completion >/dev/null 2>&1; then + _init_completion -n "=:" || return + else + __%[1]s_init_completion -n "=:" || return + fi + + __%[1]s_debug + __%[1]s_debug "========= starting completion logic ==========" + __%[1]s_debug "cur is ${cur}, words[*] is ${words[*]}, #words[@] is ${#words[@]}, cword is $cword" + + # The user could have moved the cursor backwards on the command-line. + # We need to trigger completion from the $cword location, so we need + # to truncate the command-line ($words) up to the $cword location. + words=("${words[@]:0:$cword+1}") + __%[1]s_debug "Truncated words[*]: ${words[*]}," + + local out directive + __%[1]s_get_completion_results + __%[1]s_process_completion_results +} + +if [[ $(type -t compopt) = "builtin" ]]; then + complete -o default -F __start_%[1]s %[1]s +else + complete -o default -o nospace -F __start_%[1]s %[1]s +fi + +# ex: ts=4 sw=4 et filetype=sh +`, name, compCmd, + ShellCompDirectiveError, ShellCompDirectiveNoSpace, ShellCompDirectiveNoFileComp, + ShellCompDirectiveFilterFileExt, ShellCompDirectiveFilterDirs)) +} + +// GenBashCompletionFileV2 generates Bash completion version 2. +func (c *Command) GenBashCompletionFileV2(filename string, includeDesc bool) error { + outFile, err := os.Create(filename) + if err != nil { + return err + } + defer outFile.Close() + + return c.GenBashCompletionV2(outFile, includeDesc) +} + +// GenBashCompletionV2 generates Bash completion file version 2 +// and writes it to the passed writer. +func (c *Command) GenBashCompletionV2(w io.Writer, includeDesc bool) error { + return c.genBashCompletion(w, includeDesc) +} diff --git a/vendor/github.com/spf13/cobra/command.go b/vendor/github.com/spf13/cobra/command.go index d6732ad115..2cc18891d7 100644 --- a/vendor/github.com/spf13/cobra/command.go +++ b/vendor/github.com/spf13/cobra/command.go @@ -63,9 +63,9 @@ type Command struct { // Example is examples of how to use the command. Example string - // ValidArgs is list of all valid non-flag arguments that are accepted in bash completions + // ValidArgs is list of all valid non-flag arguments that are accepted in shell completions ValidArgs []string - // ValidArgsFunction is an optional function that provides valid non-flag arguments for bash completion. + // ValidArgsFunction is an optional function that provides valid non-flag arguments for shell completion. // It is a dynamic version of using ValidArgs. // Only one of ValidArgs and ValidArgsFunction can be used for a command. ValidArgsFunction func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) @@ -74,11 +74,12 @@ type Command struct { Args PositionalArgs // ArgAliases is List of aliases for ValidArgs. - // These are not suggested to the user in the bash completion, + // These are not suggested to the user in the shell completion, // but accepted if entered manually. ArgAliases []string - // BashCompletionFunction is custom functions used by the bash autocompletion generator. + // BashCompletionFunction is custom bash functions used by the legacy bash autocompletion generator. + // For portability with other shells, it is recommended to instead use ValidArgsFunction BashCompletionFunction string // Deprecated defines, if this command is deprecated and should print this string when used. @@ -168,6 +169,9 @@ type Command struct { //FParseErrWhitelist flag parse errors to be ignored FParseErrWhitelist FParseErrWhitelist + // CompletionOptions is a set of options to control the handling of shell completion + CompletionOptions CompletionOptions + // commandsAreSorted defines, if command slice are sorted or not. commandsAreSorted bool // commandCalledAs is the name or alias value used to call this command. @@ -884,7 +888,8 @@ func (c *Command) preRun() { } // ExecuteContext is the same as Execute(), but sets the ctx on the command. -// Retrieve ctx by calling cmd.Context() inside your *Run lifecycle functions. +// Retrieve ctx by calling cmd.Context() inside your *Run lifecycle or ValidArgs +// functions. func (c *Command) ExecuteContext(ctx context.Context) error { c.ctx = ctx return c.Execute() @@ -898,6 +903,14 @@ func (c *Command) Execute() error { return err } +// ExecuteContextC is the same as ExecuteC(), but sets the ctx on the command. +// Retrieve ctx by calling cmd.Context() inside your *Run lifecycle or ValidArgs +// functions. +func (c *Command) ExecuteContextC(ctx context.Context) (*Command, error) { + c.ctx = ctx + return c.ExecuteC() +} + // ExecuteC executes the command. func (c *Command) ExecuteC() (cmd *Command, err error) { if c.ctx == nil { @@ -914,9 +927,10 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { preExecHookFn(c) } - // initialize help as the last point possible to allow for user - // overriding + // initialize help at the last point to allow for user overriding c.InitDefaultHelpCmd() + // initialize completion at the last point to allow for user overriding + c.initDefaultCompletionCmd() args := c.args @@ -925,7 +939,7 @@ func (c *Command) ExecuteC() (cmd *Command, err error) { args = os.Args[1:] } - // initialize the hidden command to be used for bash completion + // initialize the hidden command to be used for shell completion c.initCompleteCmd(args) var flags []string diff --git a/vendor/github.com/spf13/cobra/custom_completions.go b/vendor/github.com/spf13/cobra/completions.go similarity index 70% rename from vendor/github.com/spf13/cobra/custom_completions.go rename to vendor/github.com/spf13/cobra/completions.go index fa060c147b..b849b9c844 100644 --- a/vendor/github.com/spf13/cobra/custom_completions.go +++ b/vendor/github.com/spf13/cobra/completions.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "strings" + "sync" "github.com/spf13/pflag" ) @@ -17,13 +18,25 @@ const ( ShellCompNoDescRequestCmd = "__completeNoDesc" ) -// Global map of flag completion functions. +// Global map of flag completion functions. Make sure to use flagCompletionMutex before you try to read and write from it. var flagCompletionFunctions = map[*pflag.Flag]func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective){} +// lock for reading and writing from flagCompletionFunctions +var flagCompletionMutex = &sync.RWMutex{} + // ShellCompDirective is a bit map representing the different behaviors the shell // can be instructed to have once completions have been provided. type ShellCompDirective int +type flagCompError struct { + subCommand string + flagName string +} + +func (e *flagCompError) Error() string { + return "Subcommand '" + e.subCommand + "' does not support flag '" + e.flagName + "'" +} + const ( // ShellCompDirectiveError indicates an error occurred and completions should be ignored. ShellCompDirectiveError ShellCompDirective = 1 << iota @@ -34,7 +47,6 @@ const ( // ShellCompDirectiveNoFileComp indicates that the shell should not provide // file completion even when no completion is provided. - // This currently does not work for zsh or bash < 4 ShellCompDirectiveNoFileComp // ShellCompDirectiveFilterFileExt indicates that the provided completions @@ -63,12 +75,41 @@ const ( ShellCompDirectiveDefault ShellCompDirective = 0 ) +const ( + // Constants for the completion command + compCmdName = "completion" + compCmdNoDescFlagName = "no-descriptions" + compCmdNoDescFlagDesc = "disable completion descriptions" + compCmdNoDescFlagDefault = false +) + +// CompletionOptions are the options to control shell completion +type CompletionOptions struct { + // DisableDefaultCmd prevents Cobra from creating a default 'completion' command + DisableDefaultCmd bool + // DisableNoDescFlag prevents Cobra from creating the '--no-descriptions' flag + // for shells that support completion descriptions + DisableNoDescFlag bool + // DisableDescriptions turns off all completion descriptions for shells + // that support them + DisableDescriptions bool +} + +// NoFileCompletions can be used to disable file completion for commands that should +// not trigger file completions. +func NoFileCompletions(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) { + return nil, ShellCompDirectiveNoFileComp +} + // RegisterFlagCompletionFunc should be called to register a function to provide completion for a flag. func (c *Command) RegisterFlagCompletionFunc(flagName string, f func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective)) error { flag := c.Flag(flagName) if flag == nil { return fmt.Errorf("RegisterFlagCompletionFunc: flag '%s' does not exist", flagName) } + flagCompletionMutex.Lock() + defer flagCompletionMutex.Unlock() + if _, exists := flagCompletionFunctions[flag]; exists { return fmt.Errorf("RegisterFlagCompletionFunc: flag '%s' already registered", flagName) } @@ -149,10 +190,6 @@ func (c *Command) initCompleteCmd(args []string) { fmt.Fprintln(finalCmd.OutOrStdout(), comp) } - if directive >= shellCompDirectiveMaxValue { - directive = ShellCompDirectiveDefault - } - // As the last printout, print the completion directive for the completion script to parse. // The directive integer must be that last character following a single colon (:). // The completion script expects : @@ -195,23 +232,41 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi // Unable to find the real command. E.g., someInvalidCmd return c, []string{}, ShellCompDirectiveDefault, fmt.Errorf("Unable to find a command for arguments: %v", trimmedArgs) } + finalCmd.ctx = c.ctx // Check if we are doing flag value completion before parsing the flags. // This is important because if we are completing a flag value, we need to also // remove the flag name argument from the list of finalArgs or else the parsing // could fail due to an invalid value (incomplete) for the flag. - flag, finalArgs, toComplete, err := checkIfFlagCompletion(finalCmd, finalArgs, toComplete) - if err != nil { - // Error while attempting to parse flags - return finalCmd, []string{}, ShellCompDirectiveDefault, err - } + flag, finalArgs, toComplete, flagErr := checkIfFlagCompletion(finalCmd, finalArgs, toComplete) + + // Check if interspersed is false or -- was set on a previous arg. + // This works by counting the arguments. Normally -- is not counted as arg but + // if -- was already set or interspersed is false and there is already one arg then + // the extra added -- is counted as arg. + flagCompletion := true + _ = finalCmd.ParseFlags(append(finalArgs, "--")) + newArgCount := finalCmd.Flags().NArg() // Parse the flags early so we can check if required flags are set if err = finalCmd.ParseFlags(finalArgs); err != nil { return finalCmd, []string{}, ShellCompDirectiveDefault, fmt.Errorf("Error while parsing flags from args %v: %s", finalArgs, err.Error()) } - if flag != nil { + realArgCount := finalCmd.Flags().NArg() + if newArgCount > realArgCount { + // don't do flag completion (see above) + flagCompletion = false + } + // Error while attempting to parse flags + if flagErr != nil { + // If error type is flagCompError and we don't want flagCompletion we should ignore the error + if _, ok := flagErr.(*flagCompError); !(ok && !flagCompletion) { + return finalCmd, []string{}, ShellCompDirectiveDefault, flagErr + } + } + + if flag != nil && flagCompletion { // Check if we are completing a flag value subject to annotations if validExts, present := flag.Annotations[BashCompFilenameExt]; present { if len(validExts) != 0 { @@ -238,7 +293,7 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi // When doing completion of a flag name, as soon as an argument starts with // a '-' we know it is a flag. We cannot use isFlagArg() here as it requires // the flag name to be complete - if flag == nil && len(toComplete) > 0 && toComplete[0] == '-' && !strings.Contains(toComplete, "=") { + if flag == nil && len(toComplete) > 0 && toComplete[0] == '-' && !strings.Contains(toComplete, "=") && flagCompletion { var completions []string // First check for required flags @@ -302,7 +357,7 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi if len(finalArgs) == 0 && !foundLocalNonPersistentFlag { // We only complete sub-commands if: // - there are no arguments on the command-line and - // - there are no local, non-peristent flag on the command-line or TraverseChildren is true + // - there are no local, non-persistent flags on the command-line or TraverseChildren is true for _, subCmd := range finalCmd.Commands() { if subCmd.IsAvailableCommand() || subCmd == finalCmd.helpCommand { if strings.HasPrefix(subCmd.Name(), toComplete) { @@ -351,8 +406,10 @@ func (c *Command) getCompletions(args []string) (*Command, []string, ShellCompDi // Find the completion function for the flag or command var completionFn func(cmd *Command, args []string, toComplete string) ([]string, ShellCompDirective) - if flag != nil { + if flag != nil && flagCompletion { + flagCompletionMutex.RLock() completionFn = flagCompletionFunctions[flag] + flagCompletionMutex.RUnlock() } else { completionFn = finalCmd.ValidArgsFunction } @@ -435,6 +492,7 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p var flagName string trimmedArgs := args flagWithEqual := false + orgLastArg := lastArg // When doing completion of a flag name, as soon as an argument starts with // a '-' we know it is a flag. We cannot use isFlagArg() here as that function @@ -442,7 +500,16 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p if len(lastArg) > 0 && lastArg[0] == '-' { if index := strings.Index(lastArg, "="); index >= 0 { // Flag with an = - flagName = strings.TrimLeft(lastArg[:index], "-") + if strings.HasPrefix(lastArg[:index], "--") { + // Flag has full name + flagName = lastArg[2:index] + } else { + // Flag is shorthand + // We have to get the last shorthand flag name + // e.g. `-asd` => d to provide the correct completion + // https://github.com/spf13/cobra/issues/1257 + flagName = lastArg[index-1 : index] + } lastArg = lastArg[index+1:] flagWithEqual = true } else { @@ -459,8 +526,16 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p // If the flag contains an = it means it has already been fully processed, // so we don't need to deal with it here. if index := strings.Index(prevArg, "="); index < 0 { - flagName = strings.TrimLeft(prevArg, "-") - + if strings.HasPrefix(prevArg, "--") { + // Flag has full name + flagName = prevArg[2:] + } else { + // Flag is shorthand + // We have to get the last shorthand flag name + // e.g. `-asd` => d to provide the correct completion + // https://github.com/spf13/cobra/issues/1257 + flagName = prevArg[len(prevArg)-1:] + } // Remove the uncompleted flag or else there could be an error created // for an invalid value for that flag trimmedArgs = args[:len(args)-1] @@ -476,9 +551,8 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p flag := findFlag(finalCmd, flagName) if flag == nil { - // Flag not supported by this command, nothing to complete - err := fmt.Errorf("Subcommand '%s' does not support flag '%s'", finalCmd.Name(), flagName) - return nil, nil, "", err + // Flag not supported by this command, the interspersed option might be set so return the original args + return nil, args, orgLastArg, &flagCompError{subCommand: finalCmd.Name(), flagName: flagName} } if !flagWithEqual { @@ -494,6 +568,156 @@ func checkIfFlagCompletion(finalCmd *Command, args []string, lastArg string) (*p return flag, trimmedArgs, lastArg, nil } +// initDefaultCompletionCmd adds a default 'completion' command to c. +// This function will do nothing if any of the following is true: +// 1- the feature has been explicitly disabled by the program, +// 2- c has no subcommands (to avoid creating one), +// 3- c already has a 'completion' command provided by the program. +func (c *Command) initDefaultCompletionCmd() { + if c.CompletionOptions.DisableDefaultCmd || !c.HasSubCommands() { + return + } + + for _, cmd := range c.commands { + if cmd.Name() == compCmdName || cmd.HasAlias(compCmdName) { + // A completion command is already available + return + } + } + + haveNoDescFlag := !c.CompletionOptions.DisableNoDescFlag && !c.CompletionOptions.DisableDescriptions + + completionCmd := &Command{ + Use: compCmdName, + Short: "generate the autocompletion script for the specified shell", + Long: fmt.Sprintf(` +Generate the autocompletion script for %[1]s for the specified shell. +See each sub-command's help for details on how to use the generated script. +`, c.Root().Name()), + Args: NoArgs, + ValidArgsFunction: NoFileCompletions, + } + c.AddCommand(completionCmd) + + out := c.OutOrStdout() + noDesc := c.CompletionOptions.DisableDescriptions + shortDesc := "generate the autocompletion script for %s" + bash := &Command{ + Use: "bash", + Short: fmt.Sprintf(shortDesc, "bash"), + Long: fmt.Sprintf(` +Generate the autocompletion script for the bash shell. + +This script depends on the 'bash-completion' package. +If it is not installed already, you can install it via your OS's package manager. + +To load completions in your current shell session: +$ source <(%[1]s completion bash) + +To load completions for every new session, execute once: +Linux: + $ %[1]s completion bash > /etc/bash_completion.d/%[1]s +MacOS: + $ %[1]s completion bash > /usr/local/etc/bash_completion.d/%[1]s + +You will need to start a new shell for this setup to take effect. + `, c.Root().Name()), + Args: NoArgs, + DisableFlagsInUseLine: true, + ValidArgsFunction: NoFileCompletions, + RunE: func(cmd *Command, args []string) error { + return cmd.Root().GenBashCompletionV2(out, !noDesc) + }, + } + if haveNoDescFlag { + bash.Flags().BoolVar(&noDesc, compCmdNoDescFlagName, compCmdNoDescFlagDefault, compCmdNoDescFlagDesc) + } + + zsh := &Command{ + Use: "zsh", + Short: fmt.Sprintf(shortDesc, "zsh"), + Long: fmt.Sprintf(` +Generate the autocompletion script for the zsh shell. + +If shell completion is not already enabled in your environment you will need +to enable it. You can execute the following once: + +$ echo "autoload -U compinit; compinit" >> ~/.zshrc + +To load completions for every new session, execute once: +# Linux: +$ %[1]s completion zsh > "${fpath[1]}/_%[1]s" +# macOS: +$ %[1]s completion zsh > /usr/local/share/zsh/site-functions/_%[1]s + +You will need to start a new shell for this setup to take effect. +`, c.Root().Name()), + Args: NoArgs, + ValidArgsFunction: NoFileCompletions, + RunE: func(cmd *Command, args []string) error { + if noDesc { + return cmd.Root().GenZshCompletionNoDesc(out) + } + return cmd.Root().GenZshCompletion(out) + }, + } + if haveNoDescFlag { + zsh.Flags().BoolVar(&noDesc, compCmdNoDescFlagName, compCmdNoDescFlagDefault, compCmdNoDescFlagDesc) + } + + fish := &Command{ + Use: "fish", + Short: fmt.Sprintf(shortDesc, "fish"), + Long: fmt.Sprintf(` +Generate the autocompletion script for the fish shell. + +To load completions in your current shell session: +$ %[1]s completion fish | source + +To load completions for every new session, execute once: +$ %[1]s completion fish > ~/.config/fish/completions/%[1]s.fish + +You will need to start a new shell for this setup to take effect. +`, c.Root().Name()), + Args: NoArgs, + ValidArgsFunction: NoFileCompletions, + RunE: func(cmd *Command, args []string) error { + return cmd.Root().GenFishCompletion(out, !noDesc) + }, + } + if haveNoDescFlag { + fish.Flags().BoolVar(&noDesc, compCmdNoDescFlagName, compCmdNoDescFlagDefault, compCmdNoDescFlagDesc) + } + + powershell := &Command{ + Use: "powershell", + Short: fmt.Sprintf(shortDesc, "powershell"), + Long: fmt.Sprintf(` +Generate the autocompletion script for powershell. + +To load completions in your current shell session: +PS C:\> %[1]s completion powershell | Out-String | Invoke-Expression + +To load completions for every new session, add the output of the above command +to your powershell profile. +`, c.Root().Name()), + Args: NoArgs, + ValidArgsFunction: NoFileCompletions, + RunE: func(cmd *Command, args []string) error { + if noDesc { + return cmd.Root().GenPowerShellCompletion(out) + } + return cmd.Root().GenPowerShellCompletionWithDesc(out) + + }, + } + if haveNoDescFlag { + powershell.Flags().BoolVar(&noDesc, compCmdNoDescFlagName, compCmdNoDescFlagDefault, compCmdNoDescFlagDesc) + } + + completionCmd.AddCommand(bash, zsh, fish, powershell) +} + func findFlag(cmd *Command, name string) *pflag.Flag { flagSet := cmd.Flags() if len(name) == 1 { diff --git a/vendor/github.com/spf13/cobra/fish_completions.go b/vendor/github.com/spf13/cobra/fish_completions.go index 3e112347d7..bb57fd5685 100644 --- a/vendor/github.com/spf13/cobra/fish_completions.go +++ b/vendor/github.com/spf13/cobra/fish_completions.go @@ -21,44 +21,47 @@ func genFishComp(buf io.StringWriter, name string, includeDesc bool) { WriteStringAndCheck(buf, fmt.Sprintf("# fish completion for %-36s -*- shell-script -*-\n", name)) WriteStringAndCheck(buf, fmt.Sprintf(` function __%[1]s_debug - set file "$BASH_COMP_DEBUG_FILE" + set -l file "$BASH_COMP_DEBUG_FILE" if test -n "$file" echo "$argv" >> $file end end function __%[1]s_perform_completion - __%[1]s_debug "Starting __%[1]s_perform_completion with: $argv" + __%[1]s_debug "Starting __%[1]s_perform_completion" - set args (string split -- " " "$argv") - set lastArg "$args[-1]" + # Extract all args except the last one + set -l args (commandline -opc) + # Extract the last arg and escape it in case it is a space + set -l lastArg (string escape -- (commandline -ct)) __%[1]s_debug "args: $args" __%[1]s_debug "last arg: $lastArg" - set emptyArg "" - if test -z "$lastArg" - __%[1]s_debug "Setting emptyArg" - set emptyArg \"\" - end - __%[1]s_debug "emptyArg: $emptyArg" - - if not type -q "$args[1]" - # This can happen when "complete --do-complete %[2]s" is called when running this script. - __%[1]s_debug "Cannot find $args[1]. No completions." - return - end + set -l requestComp "$args[1] %[3]s $args[2..-1] $lastArg" - set requestComp "$args[1] %[3]s $args[2..-1] $emptyArg" __%[1]s_debug "Calling $requestComp" + set -l results (eval $requestComp 2> /dev/null) + + # Some programs may output extra empty lines after the directive. + # Let's ignore them or else it will break completion. + # Ref: https://github.com/spf13/cobra/issues/1279 + for line in $results[-1..1] + if test (string trim -- $line) = "" + # Found an empty line, remove it + set results $results[1..-2] + else + # Found non-empty line, we have our proper output + break + end + end - set results (eval $requestComp 2> /dev/null) - set comps $results[1..-2] - set directiveLine $results[-1] + set -l comps $results[1..-2] + set -l directiveLine $results[-1] # For Fish, when completing a flag with an = (e.g., -n=) # completions must be prefixed with the flag - set flagPrefix (string match -r -- '-.*=' "$lastArg") + set -l flagPrefix (string match -r -- '-.*=' "$lastArg") __%[1]s_debug "Comps: $comps" __%[1]s_debug "DirectiveLine: $directiveLine" @@ -71,115 +74,124 @@ function __%[1]s_perform_completion printf "%%s\n" "$directiveLine" end -# This function does three things: -# 1- Obtain the completions and store them in the global __%[1]s_comp_results -# 2- Set the __%[1]s_comp_do_file_comp flag if file completion should be performed -# and unset it otherwise -# 3- Return true if the completion results are not empty +# This function does two things: +# - Obtain the completions and store them in the global __%[1]s_comp_results +# - Return false if file completion should be performed function __%[1]s_prepare_completions + __%[1]s_debug "" + __%[1]s_debug "========= starting completion logic ==========" + # Start fresh - set --erase __%[1]s_comp_do_file_comp set --erase __%[1]s_comp_results - # Check if the command-line is already provided. This is useful for testing. - if not set --query __%[1]s_comp_commandLine - # Use the -c flag to allow for completion in the middle of the line - set __%[1]s_comp_commandLine (commandline -c) - end - __%[1]s_debug "commandLine is: $__%[1]s_comp_commandLine" - - set results (__%[1]s_perform_completion "$__%[1]s_comp_commandLine") - set --erase __%[1]s_comp_commandLine + set -l results (__%[1]s_perform_completion) __%[1]s_debug "Completion results: $results" if test -z "$results" __%[1]s_debug "No completion, probably due to a failure" # Might as well do file completion, in case it helps - set --global __%[1]s_comp_do_file_comp 1 return 1 end - set directive (string sub --start 2 $results[-1]) + set -l directive (string sub --start 2 $results[-1]) set --global __%[1]s_comp_results $results[1..-2] __%[1]s_debug "Completions are: $__%[1]s_comp_results" __%[1]s_debug "Directive is: $directive" - set shellCompDirectiveError %[4]d - set shellCompDirectiveNoSpace %[5]d - set shellCompDirectiveNoFileComp %[6]d - set shellCompDirectiveFilterFileExt %[7]d - set shellCompDirectiveFilterDirs %[8]d + set -l shellCompDirectiveError %[4]d + set -l shellCompDirectiveNoSpace %[5]d + set -l shellCompDirectiveNoFileComp %[6]d + set -l shellCompDirectiveFilterFileExt %[7]d + set -l shellCompDirectiveFilterDirs %[8]d if test -z "$directive" set directive 0 end - set compErr (math (math --scale 0 $directive / $shellCompDirectiveError) %% 2) + set -l compErr (math (math --scale 0 $directive / $shellCompDirectiveError) %% 2) if test $compErr -eq 1 __%[1]s_debug "Received error directive: aborting." # Might as well do file completion, in case it helps - set --global __%[1]s_comp_do_file_comp 1 return 1 end - set filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) %% 2) - set dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) %% 2) + set -l filefilter (math (math --scale 0 $directive / $shellCompDirectiveFilterFileExt) %% 2) + set -l dirfilter (math (math --scale 0 $directive / $shellCompDirectiveFilterDirs) %% 2) if test $filefilter -eq 1; or test $dirfilter -eq 1 __%[1]s_debug "File extension filtering or directory filtering not supported" # Do full file completion instead - set --global __%[1]s_comp_do_file_comp 1 return 1 end - set nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) %% 2) - set nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) %% 2) + set -l nospace (math (math --scale 0 $directive / $shellCompDirectiveNoSpace) %% 2) + set -l nofiles (math (math --scale 0 $directive / $shellCompDirectiveNoFileComp) %% 2) __%[1]s_debug "nospace: $nospace, nofiles: $nofiles" - # Important not to quote the variable for count to work - set numComps (count $__%[1]s_comp_results) - __%[1]s_debug "numComps: $numComps" - - if test $numComps -eq 1; and test $nospace -ne 0 - # To support the "nospace" directive we trick the shell - # by outputting an extra, longer completion. - __%[1]s_debug "Adding second completion to perform nospace directive" - set --append __%[1]s_comp_results $__%[1]s_comp_results[1]. - end - - if test $numComps -eq 0; and test $nofiles -eq 0 - __%[1]s_debug "Requesting file completion" - set --global __%[1]s_comp_do_file_comp 1 + # If we want to prevent a space, or if file completion is NOT disabled, + # we need to count the number of valid completions. + # To do so, we will filter on prefix as the completions we have received + # may not already be filtered so as to allow fish to match on different + # criteria than the prefix. + if test $nospace -ne 0; or test $nofiles -eq 0 + set -l prefix (commandline -t | string escape --style=regex) + __%[1]s_debug "prefix: $prefix" + + set -l completions (string match -r -- "^$prefix.*" $__%[1]s_comp_results) + set --global __%[1]s_comp_results $completions + __%[1]s_debug "Filtered completions are: $__%[1]s_comp_results" + + # Important not to quote the variable for count to work + set -l numComps (count $__%[1]s_comp_results) + __%[1]s_debug "numComps: $numComps" + + if test $numComps -eq 1; and test $nospace -ne 0 + # We must first split on \t to get rid of the descriptions to be + # able to check what the actual completion will be. + # We don't need descriptions anyway since there is only a single + # real completion which the shell will expand immediately. + set -l split (string split --max 1 \t $__%[1]s_comp_results[1]) + + # Fish won't add a space if the completion ends with any + # of the following characters: @=/:., + set -l lastChar (string sub -s -1 -- $split) + if not string match -r -q "[@=/:.,]" -- "$lastChar" + # In other cases, to support the "nospace" directive we trick the shell + # by outputting an extra, longer completion. + __%[1]s_debug "Adding second completion to perform nospace directive" + set --global __%[1]s_comp_results $split[1] $split[1]. + __%[1]s_debug "Completions are now: $__%[1]s_comp_results" + end + end + + if test $numComps -eq 0; and test $nofiles -eq 0 + # To be consistent with bash and zsh, we only trigger file + # completion when there are no other completions + __%[1]s_debug "Requesting file completion" + return 1 + end end - # If we don't want file completion, we must return true even if there - # are no completions found. This is because fish will perform the last - # completion command, even if its condition is false, if no other - # completion command was triggered - return (not set --query __%[1]s_comp_do_file_comp) + return 0 end # Since Fish completions are only loaded once the user triggers them, we trigger them ourselves # so we can properly delete any completions provided by another script. -# The space after the the program name is essential to trigger completion for the program -# and not completion of the program name itself. -complete --do-complete "%[2]s " > /dev/null 2>&1 -# Using '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. +# Only do this if the program can be found, or else fish may print some errors; besides, +# the existing completions will only be loaded if the program can be found. +if type -q "%[2]s" + # The space after the program name is essential to trigger completion for the program + # and not completion of the program name itself. + # Also, we use '> /dev/null 2>&1' since '&>' is not supported in older versions of fish. + complete --do-complete "%[2]s " > /dev/null 2>&1 +end # Remove any pre-existing completions for the program since we will be handling all of them. complete -c %[2]s -e -# The order in which the below two lines are defined is very important so that __%[1]s_prepare_completions -# is called first. It is __%[1]s_prepare_completions that sets up the __%[1]s_comp_do_file_comp variable. -# -# This completion will be run second as complete commands are added FILO. -# It triggers file completion choices when __%[1]s_comp_do_file_comp is set. -complete -c %[2]s -n 'set --query __%[1]s_comp_do_file_comp' - -# This completion will be run first as complete commands are added FILO. -# The call to __%[1]s_prepare_completions will setup both __%[1]s_comp_results and __%[1]s_comp_do_file_comp. -# It provides the program's completion choices. +# The call to __%[1]s_prepare_completions will setup __%[1]s_comp_results +# which provides the program's completion choices. complete -c %[2]s -n '__%[1]s_prepare_completions' -f -a '$__%[1]s_comp_results' `, nameForVar, name, compCmd, diff --git a/vendor/github.com/spf13/cobra/go.mod b/vendor/github.com/spf13/cobra/go.mod index ff56144056..1fb9439dd8 100644 --- a/vendor/github.com/spf13/cobra/go.mod +++ b/vendor/github.com/spf13/cobra/go.mod @@ -1,12 +1,11 @@ module github.com/spf13/cobra -go 1.12 +go 1.14 require ( github.com/cpuguy83/go-md2man/v2 v2.0.0 github.com/inconshreveable/mousetrap v1.0.0 - github.com/mitchellh/go-homedir v1.1.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.7.0 + github.com/spf13/viper v1.8.1 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/vendor/github.com/spf13/cobra/go.sum b/vendor/github.com/spf13/cobra/go.sum index 9328ee3ee7..3e22df29a3 100644 --- a/vendor/github.com/spf13/cobra/go.sum +++ b/vendor/github.com/spf13/cobra/go.sum @@ -5,74 +5,141 @@ cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6A cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -94,61 +161,50 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -156,49 +212,65 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= 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= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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/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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -208,16 +280,26 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -226,35 +308,107 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0 h1:HyfiK1WMnHj5FXFXatD+Qs1A/xC2Run6RzeW1SyHxpc= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -264,6 +418,7 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -271,16 +426,73 @@ golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -290,24 +502,91 @@ google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +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/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/vendor/github.com/spf13/cobra/powershell_completions.go b/vendor/github.com/spf13/cobra/powershell_completions.go index c55be71cd1..59234c09f1 100644 --- a/vendor/github.com/spf13/cobra/powershell_completions.go +++ b/vendor/github.com/spf13/cobra/powershell_completions.go @@ -86,7 +86,7 @@ Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock { # We add an extra empty parameter so we can indicate this to the go method. __%[1]s_debug "Adding extra empty parameter" `+" # We need to use `\"`\" to pass an empty argument a \"\" or '' does not work!!!"+` -`+" $RequestComp=\"$RequestComp\" + ' `\"`\"' "+` +`+" $RequestComp=\"$RequestComp\" + ' `\"`\"'"+` } __%[1]s_debug "Calling $RequestComp" @@ -140,19 +140,6 @@ Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock { $Space = "" } - if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { - __%[1]s_debug "ShellCompDirectiveNoFileComp is called" - - if ($Values.Length -eq 0) { - # Just print an empty string here so the - # shell does not start to complete paths. - # We cannot use CompletionResult here because - # it does not accept an empty string as argument. - "" - return - } - } - if ((($Directive -band $ShellCompDirectiveFilterFileExt) -ne 0 ) -or (($Directive -band $ShellCompDirectiveFilterDirs) -ne 0 )) { __%[1]s_debug "ShellCompDirectiveFilterFileExt ShellCompDirectiveFilterDirs are not supported" @@ -165,20 +152,33 @@ Register-ArgumentCompleter -CommandName '%[1]s' -ScriptBlock { # filter the result $_.Name -like "$WordToComplete*" - # Join the flag back if we have a equal sign flag + # Join the flag back if we have an equal sign flag if ( $IsEqualFlag ) { __%[1]s_debug "Join the equal sign flag back to the completion value" $_.Name = $Flag + "=" + $_.Name } } + if (($Directive -band $ShellCompDirectiveNoFileComp) -ne 0 ) { + __%[1]s_debug "ShellCompDirectiveNoFileComp is called" + + if ($Values.Length -eq 0) { + # Just print an empty string here so the + # shell does not start to complete paths. + # We cannot use CompletionResult here because + # it does not accept an empty string as argument. + "" + return + } + } + # Get the current mode $Mode = (Get-PSReadLineKeyHandler | Where-Object {$_.Key -eq "Tab" }).Function __%[1]s_debug "Mode: $Mode" $Values | ForEach-Object { - # store temporay because switch will overwrite $_ + # store temporary because switch will overwrite $_ $comp = $_ # PowerShell supports three different completion modes diff --git a/vendor/github.com/spf13/cobra/shell_completions.md b/vendor/github.com/spf13/cobra/shell_completions.md index cd533ac3d4..4ba06a11c0 100644 --- a/vendor/github.com/spf13/cobra/shell_completions.md +++ b/vendor/github.com/spf13/cobra/shell_completions.md @@ -7,6 +7,15 @@ The currently supported shells are: - fish - PowerShell +Cobra will automatically provide your program with a fully functional `completion` command, +similarly to how it provides the `help` command. + +## Creating your own completion command + +If you do not wish to use the default `completion` command, you can choose to +provide your own, which will take precedence over the default one. (This also provides +backwards-compatibility with programs that already have their own `completion` command.) + If you are using the generator, you can create a completion command by running ```bash @@ -70,7 +79,7 @@ PowerShell: case "fish": cmd.Root().GenFishCompletion(os.Stdout, true) case "powershell": - cmd.Root().GenPowerShellCompletion(os.Stdout) + cmd.Root().GenPowerShellCompletionWithDesc(os.Stdout) } }, } @@ -78,6 +87,26 @@ PowerShell: **Note:** The cobra generator may include messages printed to stdout, for example, if the config file is loaded; this will break the auto-completion script so must be removed. +## Adapting the default completion command + +Cobra provides a few options for the default `completion` command. To configure such options you must set +the `CompletionOptions` field on the *root* command. + +To tell Cobra *not* to provide the default `completion` command: +``` +rootCmd.CompletionOptions.DisableDefaultCmd = true +``` + +To tell Cobra *not* to provide the user with the `--no-descriptions` flag to the completion sub-commands: +``` +rootCmd.CompletionOptions.DisableNoDescFlag = true +``` + +To tell Cobra to completely disable descriptions for completions: +``` +rootCmd.CompletionOptions.DisableDescriptions = true +``` + # Customizing completions The generated completion scripts will automatically handle completing commands and flags. However, you can make your completions much more powerful by providing information to complete your program's nouns and flag values. @@ -323,7 +352,10 @@ cmd.RegisterFlagCompletionFunc(flagName, func(cmd *cobra.Command, args []string, ``` ### Descriptions for completions -`zsh`, `fish` and `powershell` allow for descriptions to annotate completion choices. For commands and flags, Cobra will provide the descriptions automatically, based on usage information. For example, using zsh: +Cobra provides support for completion descriptions. Such descriptions are supported for each shell +(however, for bash, it is only available in the [completion V2 version](#bash-completion-v2)). +For commands and flags, Cobra will provide the descriptions automatically, based on usage information. +For example, using zsh: ``` $ helm s[tab] search -- search for a keyword in charts @@ -336,7 +368,7 @@ $ helm s[tab] search (search for a keyword in charts) show (show information of a chart) status (displays the status of the named release) ``` -Cobra allows you to add annotations to your own completions. Simply add the annotation text after each completion, following a `\t` separator. This technique applies to completions returned by `ValidArgs`, `ValidArgsFunction` and `RegisterFlagCompletionFunc()`. For example: +Cobra allows you to add descriptions to your own completions. Simply add the description text after each completion, following a `\t` separator. This technique applies to completions returned by `ValidArgs`, `ValidArgsFunction` and `RegisterFlagCompletionFunc()`. For example: ```go ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { return []string{"harbor\tAn image registry", "thanos\tLong-term metrics"}, cobra.ShellCompDirectiveNoFileComp @@ -371,6 +403,37 @@ completion firstcommand secondcommand For backward compatibility, Cobra still supports its bash legacy dynamic completion solution. Please refer to [Bash Completions](bash_completions.md) for details. +### Bash completion V2 + +Cobra provides two versions for bash completion. The original bash completion (which started it all!) can be used by calling +`GenBashCompletion()` or `GenBashCompletionFile()`. + +A new V2 bash completion version is also available. This version can be used by calling `GenBashCompletionV2()` or +`GenBashCompletionFileV2()`. The V2 version does **not** support the legacy dynamic completion +(see [Bash Completions](bash_completions.md)) but instead works only with the Go dynamic completion +solution described in this document. +Unless your program already uses the legacy dynamic completion solution, it is recommended that you use the bash +completion V2 solution which provides the following extra features: +- Supports completion descriptions (like the other shells) +- Small completion script of less than 300 lines (v1 generates scripts of thousands of lines; `kubectl` for example has a bash v1 completion script of over 13K lines) +- Streamlined user experience thanks to a completion behavior aligned with the other shells + +`Bash` completion V2 supports descriptions for completions. When calling `GenBashCompletionV2()` or `GenBashCompletionFileV2()` +you must provide these functions with a parameter indicating if the completions should be annotated with a description; Cobra +will provide the description automatically based on usage information. You can choose to make this option configurable by +your users. + +``` +# With descriptions +$ helm s[tab][tab] +search (search for a keyword in charts) status (display the status of the named release) +show (show information of a chart) + +# Without descriptions +$ helm s[tab][tab] +search show status +``` +**Note**: Cobra's default `completion` command uses bash completion V2. If for some reason you need to use bash completion V1, you will need to implement your own `completion` command. ## Zsh completions Cobra supports native zsh completion generated from the root `cobra.Command`. diff --git a/vendor/github.com/spf13/cobra/user_guide.md b/vendor/github.com/spf13/cobra/user_guide.md new file mode 100644 index 0000000000..311abce284 --- /dev/null +++ b/vendor/github.com/spf13/cobra/user_guide.md @@ -0,0 +1,637 @@ +# User Guide + +While you are welcome to provide your own organization, typically a Cobra-based +application will follow the following organizational structure: + +``` + ▾ appName/ + ▾ cmd/ + add.go + your.go + commands.go + here.go + main.go +``` + +In a Cobra app, typically the main.go file is very bare. It serves one purpose: initializing Cobra. + +```go +package main + +import ( + "{pathToYourApp}/cmd" +) + +func main() { + cmd.Execute() +} +``` + +## Using the Cobra Generator + +Cobra provides its own program that will create your application and add any +commands you want. It's the easiest way to incorporate Cobra into your application. + +[Here](https://github.com/spf13/cobra/blob/master/cobra/README.md) you can find more information about it. + +## Using the Cobra Library + +To manually implement Cobra you need to create a bare main.go file and a rootCmd file. +You will optionally provide additional commands as you see fit. + +### Create rootCmd + +Cobra doesn't require any special constructors. Simply create your commands. + +Ideally you place this in app/cmd/root.go: + +```go +var rootCmd = &cobra.Command{ + Use: "hugo", + Short: "Hugo is a very fast static site generator", + Long: `A Fast and Flexible Static Site Generator built with + love by spf13 and friends in Go. + Complete documentation is available at http://hugo.spf13.com`, + Run: func(cmd *cobra.Command, args []string) { + // Do Stuff Here + }, +} + +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} +``` + +You will additionally define flags and handle configuration in your init() function. + +For example cmd/root.go: + +```go +package cmd + +import ( + "fmt" + "os" + + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +var ( + // Used for flags. + cfgFile string + userLicense string + + rootCmd = &cobra.Command{ + Use: "cobra", + Short: "A generator for Cobra based Applications", + Long: `Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + } +) + +// Execute executes the root command. +func Execute() error { + return rootCmd.Execute() +} + +func init() { + cobra.OnInitialize(initConfig) + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)") + rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "author name for copyright attribution") + rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "name of license for the project") + rootCmd.PersistentFlags().Bool("viper", true, "use Viper for configuration") + viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) + viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper")) + viper.SetDefault("author", "NAME HERE ") + viper.SetDefault("license", "apache") + + rootCmd.AddCommand(addCmd) + rootCmd.AddCommand(initCmd) +} + +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := os.UserHomeDir() + cobra.CheckErr(err) + + // Search config in home directory with name ".cobra" (without extension). + viper.AddConfigPath(home) + viper.SetConfigType("yaml") + viper.SetConfigName(".cobra") + } + + viper.AutomaticEnv() + + if err := viper.ReadInConfig(); err == nil { + fmt.Println("Using config file:", viper.ConfigFileUsed()) + } +} +``` + +### Create your main.go + +With the root command you need to have your main function execute it. +Execute should be run on the root for clarity, though it can be called on any command. + +In a Cobra app, typically the main.go file is very bare. It serves one purpose: to initialize Cobra. + +```go +package main + +import ( + "{pathToYourApp}/cmd" +) + +func main() { + cmd.Execute() +} +``` + +### Create additional commands + +Additional commands can be defined and typically are each given their own file +inside of the cmd/ directory. + +If you wanted to create a version command you would create cmd/version.go and +populate it with the following: + +```go +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(versionCmd) +} + +var versionCmd = &cobra.Command{ + Use: "version", + Short: "Print the version number of Hugo", + Long: `All software has versions. This is Hugo's`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Hugo Static Site Generator v0.9 -- HEAD") + }, +} +``` + +### Returning and handling errors + +If you wish to return an error to the caller of a command, `RunE` can be used. + +```go +package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(tryCmd) +} + +var tryCmd = &cobra.Command{ + Use: "try", + Short: "Try and possibly fail at something", + RunE: func(cmd *cobra.Command, args []string) error { + if err := someFunc(); err != nil { + return err + } + return nil + }, +} +``` + +The error can then be caught at the execute function call. + +## Working with Flags + +Flags provide modifiers to control how the action command operates. + +### Assign flags to a command + +Since the flags are defined and used in different locations, we need to +define a variable outside with the correct scope to assign the flag to +work with. + +```go +var Verbose bool +var Source string +``` + +There are two different approaches to assign a flag. + +### Persistent Flags + +A flag can be 'persistent', meaning that this flag will be available to the +command it's assigned to as well as every command under that command. For +global flags, assign a flag as a persistent flag on the root. + +```go +rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output") +``` + +### Local Flags + +A flag can also be assigned locally, which will only apply to that specific command. + +```go +localCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from") +``` + +### Local Flag on Parent Commands + +By default, Cobra only parses local flags on the target command, and any local flags on +parent commands are ignored. By enabling `Command.TraverseChildren`, Cobra will +parse local flags on each command before executing the target command. + +```go +command := cobra.Command{ + Use: "print [OPTIONS] [COMMANDS]", + TraverseChildren: true, +} +``` + +### Bind Flags with Config + +You can also bind your flags with [viper](https://github.com/spf13/viper): +```go +var author string + +func init() { + rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution") + viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author")) +} +``` + +In this example, the persistent flag `author` is bound with `viper`. +**Note**: the variable `author` will not be set to the value from config, +when the `--author` flag is not provided by user. + +More in [viper documentation](https://github.com/spf13/viper#working-with-flags). + +### Required flags + +Flags are optional by default. If instead you wish your command to report an error +when a flag has not been set, mark it as required: +```go +rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)") +rootCmd.MarkFlagRequired("region") +``` + +Or, for persistent flags: +```go +rootCmd.PersistentFlags().StringVarP(&Region, "region", "r", "", "AWS region (required)") +rootCmd.MarkPersistentFlagRequired("region") +``` + +## Positional and Custom Arguments + +Validation of positional arguments can be specified using the `Args` field +of `Command`. + +The following validators are built in: + +- `NoArgs` - the command will report an error if there are any positional args. +- `ArbitraryArgs` - the command will accept any args. +- `OnlyValidArgs` - the command will report an error if there are any positional args that are not in the `ValidArgs` field of `Command`. +- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args. +- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args. +- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args. +- `ExactValidArgs(int)` - the command will report an error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command` +- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args. + +An example of setting the custom validator: + +```go +var cmd = &cobra.Command{ + Short: "hello", + Args: func(cmd *cobra.Command, args []string) error { + if len(args) < 1 { + return errors.New("requires a color argument") + } + if myapp.IsValidColor(args[0]) { + return nil + } + return fmt.Errorf("invalid color specified: %s", args[0]) + }, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Hello, World!") + }, +} +``` + +## Example + +In the example below, we have defined three commands. Two are at the top level +and one (cmdTimes) is a child of one of the top commands. In this case the root +is not executable, meaning that a subcommand is required. This is accomplished +by not providing a 'Run' for the 'rootCmd'. + +We have only defined one flag for a single command. + +More documentation about flags is available at https://github.com/spf13/pflag + +```go +package main + +import ( + "fmt" + "strings" + + "github.com/spf13/cobra" +) + +func main() { + var echoTimes int + + var cmdPrint = &cobra.Command{ + Use: "print [string to print]", + Short: "Print anything to the screen", + Long: `print is for printing anything back to the screen. +For many years people have printed back to the screen.`, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Print: " + strings.Join(args, " ")) + }, + } + + var cmdEcho = &cobra.Command{ + Use: "echo [string to echo]", + Short: "Echo anything to the screen", + Long: `echo is for echoing anything back. +Echo works a lot like print, except it has a child command.`, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Echo: " + strings.Join(args, " ")) + }, + } + + var cmdTimes = &cobra.Command{ + Use: "times [string to echo]", + Short: "Echo anything to the screen more times", + Long: `echo things multiple times back to the user by providing +a count and a string.`, + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + for i := 0; i < echoTimes; i++ { + fmt.Println("Echo: " + strings.Join(args, " ")) + } + }, + } + + cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input") + + var rootCmd = &cobra.Command{Use: "app"} + rootCmd.AddCommand(cmdPrint, cmdEcho) + cmdEcho.AddCommand(cmdTimes) + rootCmd.Execute() +} +``` + +For a more complete example of a larger application, please checkout [Hugo](http://gohugo.io/). + +## Help Command + +Cobra automatically adds a help command to your application when you have subcommands. +This will be called when a user runs 'app help'. Additionally, help will also +support all other commands as input. Say, for instance, you have a command called +'create' without any additional configuration; Cobra will work when 'app help +create' is called. Every command will automatically have the '--help' flag added. + +### Example + +The following output is automatically generated by Cobra. Nothing beyond the +command and flag definitions are needed. + + $ cobra help + + Cobra is a CLI library for Go that empowers applications. + This application is a tool to generate the needed files + to quickly create a Cobra application. + + Usage: + cobra [command] + + Available Commands: + add Add a command to a Cobra Application + help Help about any command + init Initialize a Cobra Application + + Flags: + -a, --author string author name for copyright attribution (default "YOUR NAME") + --config string config file (default is $HOME/.cobra.yaml) + -h, --help help for cobra + -l, --license string name of license for the project + --viper use Viper for configuration (default true) + + Use "cobra [command] --help" for more information about a command. + + +Help is just a command like any other. There is no special logic or behavior +around it. In fact, you can provide your own if you want. + +### Defining your own help + +You can provide your own Help command or your own template for the default command to use +with following functions: + +```go +cmd.SetHelpCommand(cmd *Command) +cmd.SetHelpFunc(f func(*Command, []string)) +cmd.SetHelpTemplate(s string) +``` + +The latter two will also apply to any children commands. + +## Usage Message + +When the user provides an invalid flag or invalid command, Cobra responds by +showing the user the 'usage'. + +### Example +You may recognize this from the help above. That's because the default help +embeds the usage as part of its output. + + $ cobra --invalid + Error: unknown flag: --invalid + Usage: + cobra [command] + + Available Commands: + add Add a command to a Cobra Application + help Help about any command + init Initialize a Cobra Application + + Flags: + -a, --author string author name for copyright attribution (default "YOUR NAME") + --config string config file (default is $HOME/.cobra.yaml) + -h, --help help for cobra + -l, --license string name of license for the project + --viper use Viper for configuration (default true) + + Use "cobra [command] --help" for more information about a command. + +### Defining your own usage +You can provide your own usage function or template for Cobra to use. +Like help, the function and template are overridable through public methods: + +```go +cmd.SetUsageFunc(f func(*Command) error) +cmd.SetUsageTemplate(s string) +``` + +## Version Flag + +Cobra adds a top-level '--version' flag if the Version field is set on the root command. +Running an application with the '--version' flag will print the version to stdout using +the version template. The template can be customized using the +`cmd.SetVersionTemplate(s string)` function. + +## PreRun and PostRun Hooks + +It is possible to run functions before or after the main `Run` function of your command. The `PersistentPreRun` and `PreRun` functions will be executed before `Run`. `PersistentPostRun` and `PostRun` will be executed after `Run`. The `Persistent*Run` functions will be inherited by children if they do not declare their own. These functions are run in the following order: + +- `PersistentPreRun` +- `PreRun` +- `Run` +- `PostRun` +- `PersistentPostRun` + +An example of two commands which use all of these features is below. When the subcommand is executed, it will run the root command's `PersistentPreRun` but not the root command's `PersistentPostRun`: + +```go +package main + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +func main() { + + var rootCmd = &cobra.Command{ + Use: "root [sub]", + Short: "My root command", + PersistentPreRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args) + }, + PreRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside rootCmd PreRun with args: %v\n", args) + }, + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside rootCmd Run with args: %v\n", args) + }, + PostRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside rootCmd PostRun with args: %v\n", args) + }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args) + }, + } + + var subCmd = &cobra.Command{ + Use: "sub [no options!]", + Short: "My subcommand", + PreRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside subCmd PreRun with args: %v\n", args) + }, + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside subCmd Run with args: %v\n", args) + }, + PostRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside subCmd PostRun with args: %v\n", args) + }, + PersistentPostRun: func(cmd *cobra.Command, args []string) { + fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args) + }, + } + + rootCmd.AddCommand(subCmd) + + rootCmd.SetArgs([]string{""}) + rootCmd.Execute() + fmt.Println() + rootCmd.SetArgs([]string{"sub", "arg1", "arg2"}) + rootCmd.Execute() +} +``` + +Output: +``` +Inside rootCmd PersistentPreRun with args: [] +Inside rootCmd PreRun with args: [] +Inside rootCmd Run with args: [] +Inside rootCmd PostRun with args: [] +Inside rootCmd PersistentPostRun with args: [] + +Inside rootCmd PersistentPreRun with args: [arg1 arg2] +Inside subCmd PreRun with args: [arg1 arg2] +Inside subCmd Run with args: [arg1 arg2] +Inside subCmd PostRun with args: [arg1 arg2] +Inside subCmd PersistentPostRun with args: [arg1 arg2] +``` + +## Suggestions when "unknown command" happens + +Cobra will print automatic suggestions when "unknown command" errors happen. This allows Cobra to behave similarly to the `git` command when a typo happens. For example: + +``` +$ hugo srever +Error: unknown command "srever" for "hugo" + +Did you mean this? + server + +Run 'hugo --help' for usage. +``` + +Suggestions are automatic based on every subcommand registered and use an implementation of [Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance). Every registered command that matches a minimum distance of 2 (ignoring case) will be displayed as a suggestion. + +If you need to disable suggestions or tweak the string distance in your command, use: + +```go +command.DisableSuggestions = true +``` + +or + +```go +command.SuggestionsMinimumDistance = 1 +``` + +You can also explicitly set names for which a given command will be suggested using the `SuggestFor` attribute. This allows suggestions for strings that are not close in terms of string distance, but makes sense in your set of commands and for some which you don't want aliases. Example: + +``` +$ kubectl remove +Error: unknown command "remove" for "kubectl" + +Did you mean this? + delete + +Run 'kubectl help' for usage. +``` + +## Generating documentation for your command + +Cobra can generate documentation based on subcommands, flags, etc. Read more about it in the [docs generation documentation](doc/README.md). + +## Generating shell completions + +Cobra can generate a shell-completion file for the following shells: bash, zsh, fish, PowerShell. If you add more information to your commands, these completions can be amazingly powerful and flexible. Read more about it in [Shell Completions](shell_completions.md). diff --git a/vendor/github.com/spf13/cobra/zsh_completions.go b/vendor/github.com/spf13/cobra/zsh_completions.go index 2e840285f3..1afec30ea9 100644 --- a/vendor/github.com/spf13/cobra/zsh_completions.go +++ b/vendor/github.com/spf13/cobra/zsh_completions.go @@ -95,7 +95,7 @@ _%[1]s() local shellCompDirectiveFilterFileExt=%[6]d local shellCompDirectiveFilterDirs=%[7]d - local lastParam lastChar flagPrefix requestComp out directive compCount comp lastComp + local lastParam lastChar flagPrefix requestComp out directive comp lastComp noSpace local -a completions __%[1]s_debug "\n========= starting completion logic ==========" @@ -163,7 +163,6 @@ _%[1]s() return fi - compCount=0 while IFS='\n' read -r comp; do if [ -n "$comp" ]; then # If requested, completions are returned with a description. @@ -175,13 +174,17 @@ _%[1]s() local tab=$(printf '\t') comp=${comp//$tab/:} - ((compCount++)) __%[1]s_debug "Adding completion: ${comp}" completions+=${comp} lastComp=$comp fi done < <(printf "%%s\n" "${out[@]}") + if [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ]; then + __%[1]s_debug "Activating nospace." + noSpace="-S ''" + fi + if [ $((directive & shellCompDirectiveFilterFileExt)) -ne 0 ]; then # File extension filtering local filteringCmd @@ -208,25 +211,40 @@ _%[1]s() __%[1]s_debug "Listing directories in ." fi + local result _arguments '*:dirname:_files -/'" ${flagPrefix}" + result=$? if [ -n "$subdir" ]; then popd >/dev/null 2>&1 fi - elif [ $((directive & shellCompDirectiveNoSpace)) -ne 0 ] && [ ${compCount} -eq 1 ]; then - __%[1]s_debug "Activating nospace." - # We can use compadd here as there is no description when - # there is only one completion. - compadd -S '' "${lastComp}" - elif [ ${compCount} -eq 0 ]; then - if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then - __%[1]s_debug "deactivating file completion" + return $result + else + __%[1]s_debug "Calling _describe" + if eval _describe "completions" completions $flagPrefix $noSpace; then + __%[1]s_debug "_describe found some completions" + + # Return the success of having called _describe + return 0 else - # Perform file completion - __%[1]s_debug "activating file completion" - _arguments '*:filename:_files'" ${flagPrefix}" + __%[1]s_debug "_describe did not find completions." + __%[1]s_debug "Checking if we should do file completion." + if [ $((directive & shellCompDirectiveNoFileComp)) -ne 0 ]; then + __%[1]s_debug "deactivating file completion" + + # We must return an error code here to let zsh know that there were no + # completions found by _describe; this is what will trigger other + # matching algorithms to attempt to find completions. + # For example zsh can match letters in the middle of words. + return 1 + else + # Perform file completion + __%[1]s_debug "Activating file completion" + + # We must return the result of this command, so it must be the + # last command, or else we must store its result to return it. + _arguments '*:filename:_files'" ${flagPrefix}" + fi fi - else - _describe "completions" completions $(echo $flagPrefix) fi } diff --git a/vendor/go.opencensus.io/.travis.yml b/vendor/go.opencensus.io/.travis.yml deleted file mode 100644 index bd6b66ee83..0000000000 --- a/vendor/go.opencensus.io/.travis.yml +++ /dev/null @@ -1,17 +0,0 @@ -language: go - -go_import_path: go.opencensus.io - -go: - - 1.11.x - -env: - global: - GO111MODULE=on - -before_script: - - make install-tools - -script: - - make travis-ci - - go run internal/check/version.go # TODO move this to makefile diff --git a/vendor/go.opencensus.io/Makefile b/vendor/go.opencensus.io/Makefile index 457866cb1f..b3ce3df303 100644 --- a/vendor/go.opencensus.io/Makefile +++ b/vendor/go.opencensus.io/Makefile @@ -8,7 +8,7 @@ ALL_PKGS := $(shell go list $(sort $(dir $(ALL_SRC)))) GOTEST_OPT?=-v -race -timeout 30s GOTEST_OPT_WITH_COVERAGE = $(GOTEST_OPT) -coverprofile=coverage.txt -covermode=atomic GOTEST=go test -GOFMT=gofmt +GOIMPORTS=goimports GOLINT=golint GOVET=go vet EMBEDMD=embedmd @@ -17,14 +17,14 @@ TRACE_ID_LINT_EXCEPTION="type name will be used as trace.TraceID by other packag TRACE_OPTION_LINT_EXCEPTION="type name will be used as trace.TraceOptions by other packages" README_FILES := $(shell find . -name '*README.md' | sort | tr '\n' ' ') -.DEFAULT_GOAL := fmt-lint-vet-embedmd-test +.DEFAULT_GOAL := imports-lint-vet-embedmd-test -.PHONY: fmt-lint-vet-embedmd-test -fmt-lint-vet-embedmd-test: fmt lint vet embedmd test +.PHONY: imports-lint-vet-embedmd-test +imports-lint-vet-embedmd-test: imports lint vet embedmd test # TODO enable test-with-coverage in tavis .PHONY: travis-ci -travis-ci: fmt lint vet embedmd test test-386 +travis-ci: imports lint vet embedmd test test-386 all-pkgs: @echo $(ALL_PKGS) | tr ' ' '\n' | sort @@ -44,15 +44,15 @@ test-386: test-with-coverage: $(GOTEST) $(GOTEST_OPT_WITH_COVERAGE) $(ALL_PKGS) -.PHONY: fmt -fmt: - @FMTOUT=`$(GOFMT) -s -l $(ALL_SRC) 2>&1`; \ - if [ "$$FMTOUT" ]; then \ - echo "$(GOFMT) FAILED => gofmt the following files:\n"; \ - echo "$$FMTOUT\n"; \ +.PHONY: imports +imports: + @IMPORTSOUT=`$(GOIMPORTS) -l $(ALL_SRC) 2>&1`; \ + if [ "$$IMPORTSOUT" ]; then \ + echo "$(GOIMPORTS) FAILED => goimports the following files:\n"; \ + echo "$$IMPORTSOUT\n"; \ exit 1; \ else \ - echo "Fmt finished successfully"; \ + echo "Imports finished successfully"; \ fi .PHONY: lint @@ -91,6 +91,7 @@ embedmd: .PHONY: install-tools install-tools: - go get -u golang.org/x/tools/cmd/cover go get -u golang.org/x/lint/golint + go get -u golang.org/x/tools/cmd/cover + go get -u golang.org/x/tools/cmd/goimports go get -u github.com/rakyll/embedmd diff --git a/vendor/go.opencensus.io/go.mod b/vendor/go.opencensus.io/go.mod index c867df5f5c..95b2522a7f 100644 --- a/vendor/go.opencensus.io/go.mod +++ b/vendor/go.opencensus.io/go.mod @@ -1,15 +1,12 @@ module go.opencensus.io require ( - github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 - github.com/golang/protobuf v1.3.1 - github.com/google/go-cmp v0.3.0 - github.com/stretchr/testify v1.4.0 - golang.org/x/net v0.0.0-20190620200207-3b0461eec859 - golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd // indirect - golang.org/x/text v0.3.2 // indirect - google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb // indirect - google.golang.org/grpc v1.20.1 + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e + github.com/golang/protobuf v1.4.3 + github.com/google/go-cmp v0.5.3 + github.com/stretchr/testify v1.6.1 + golang.org/x/net v0.0.0-20201110031124-69a78807bb2b + google.golang.org/grpc v1.33.2 ) go 1.13 diff --git a/vendor/go.opencensus.io/go.sum b/vendor/go.opencensus.io/go.sum index 01c02972c7..c97cd1b551 100644 --- a/vendor/go.opencensus.io/go.sum +++ b/vendor/go.opencensus.io/go.sum @@ -1,25 +1,47 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 h1:ZgQEtGgCBiWRM39fZuwSd1LwSqqSW0hOdXCYYDX0R3I= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -30,24 +52,25 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd h1:r7DufRZuZbWB7j439YfAzP8RPDa9unLkpwQKUYbIMPI= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -55,20 +78,39 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd h1:/e+gpKk9r3dJobndpTytxS2gOy6m5uvpg+ISQoEcusQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb h1:i1Ppqkc3WQXikh8bXiwHqAN5Rv3/qDCcRk0/Otx73BY= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013 h1:+kGHl1aib/qcwaRi1CbqBZ1rk19r85MNUf8HaBghugY= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0 h1:cfg4PD8YEdSFnm7qLV4++93WcmhH2nIUhMjhdCvl3j8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1 h1:Hz2g2wirWK7H0qIIhGIqRGTuMwTE8HEKFnDZZ7lm9NU= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2 h1:EQyQC3sa8M+p6Ulc8yy9SWSS2GVwyRc83gAbG8lrl4o= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/vendor/go.opencensus.io/trace/basetypes.go b/vendor/go.opencensus.io/trace/basetypes.go index 0c54492a2b..c8e26ed635 100644 --- a/vendor/go.opencensus.io/trace/basetypes.go +++ b/vendor/go.opencensus.io/trace/basetypes.go @@ -49,6 +49,16 @@ type Attribute struct { value interface{} } +// Key returns the attribute's key +func (a *Attribute) Key() string { + return a.key +} + +// Value returns the attribute's value +func (a *Attribute) Value() interface{} { + return a.value +} + // BoolAttribute returns a bool-valued attribute. func BoolAttribute(key string, value bool) Attribute { return Attribute{key: key, value: value} diff --git a/vendor/go.opencensus.io/trace/lrumap.go b/vendor/go.opencensus.io/trace/lrumap.go index dc7a295c77..908c2497ed 100644 --- a/vendor/go.opencensus.io/trace/lrumap.go +++ b/vendor/go.opencensus.io/trace/lrumap.go @@ -44,7 +44,7 @@ func (lm lruMap) len() int { } func (lm lruMap) keys() []interface{} { - keys := []interface{}{} + keys := make([]interface{}, len(lm.cacheKeys)) for k := range lm.cacheKeys { keys = append(keys, k) } diff --git a/vendor/go.opencensus.io/trace/spanstore.go b/vendor/go.opencensus.io/trace/spanstore.go index c442d99021..e601f76f2c 100644 --- a/vendor/go.opencensus.io/trace/spanstore.go +++ b/vendor/go.opencensus.io/trace/spanstore.go @@ -48,8 +48,10 @@ func (i internalOnly) ReportActiveSpans(name string) []*SpanData { var out []*SpanData s.mu.Lock() defer s.mu.Unlock() - for span := range s.active { - out = append(out, span.makeSpanData()) + for activeSpan := range s.active { + if s, ok := activeSpan.(*span); ok { + out = append(out, s.makeSpanData()) + } } return out } @@ -185,7 +187,7 @@ func (i internalOnly) ReportSpansByLatency(name string, minLatency, maxLatency t // bucketed by latency. type spanStore struct { mu sync.Mutex // protects everything below. - active map[*Span]struct{} + active map[SpanInterface]struct{} errors map[int32]*bucket latency []bucket maxSpansPerErrorBucket int @@ -194,7 +196,7 @@ type spanStore struct { // newSpanStore creates a span store. func newSpanStore(name string, latencyBucketSize int, errorBucketSize int) *spanStore { s := &spanStore{ - active: make(map[*Span]struct{}), + active: make(map[SpanInterface]struct{}), latency: make([]bucket, len(defaultLatencies)+1), maxSpansPerErrorBucket: errorBucketSize, } @@ -271,7 +273,7 @@ func (s *spanStore) resize(latencyBucketSize int, errorBucketSize int) { } // add adds a span to the active bucket of the spanStore. -func (s *spanStore) add(span *Span) { +func (s *spanStore) add(span SpanInterface) { s.mu.Lock() s.active[span] = struct{}{} s.mu.Unlock() @@ -279,7 +281,7 @@ func (s *spanStore) add(span *Span) { // finished removes a span from the active set, and adds a corresponding // SpanData to a latency or error bucket. -func (s *spanStore) finished(span *Span, sd *SpanData) { +func (s *spanStore) finished(span SpanInterface, sd *SpanData) { latency := sd.EndTime.Sub(sd.StartTime) if latency < 0 { latency = 0 diff --git a/vendor/go.opencensus.io/trace/trace.go b/vendor/go.opencensus.io/trace/trace.go index 3f8977b41b..861df9d391 100644 --- a/vendor/go.opencensus.io/trace/trace.go +++ b/vendor/go.opencensus.io/trace/trace.go @@ -28,12 +28,16 @@ import ( "go.opencensus.io/trace/tracestate" ) +type tracer struct{} + +var _ Tracer = &tracer{} + // Span represents a span of a trace. It has an associated SpanContext, and // stores data accumulated while the span is active. // // Ideally users should interact with Spans by calling the functions in this // package that take a Context parameter. -type Span struct { +type span struct { // data contains information recorded about the span. // // It will be non-nil if we are exporting the span or recording events for it. @@ -66,7 +70,7 @@ type Span struct { // IsRecordingEvents returns true if events are being recorded for this span. // Use this check to avoid computing expensive annotations when they will never // be used. -func (s *Span) IsRecordingEvents() bool { +func (s *span) IsRecordingEvents() bool { if s == nil { return false } @@ -109,13 +113,13 @@ type SpanContext struct { type contextKey struct{} // FromContext returns the Span stored in a context, or nil if there isn't one. -func FromContext(ctx context.Context) *Span { +func (t *tracer) FromContext(ctx context.Context) *Span { s, _ := ctx.Value(contextKey{}).(*Span) return s } // NewContext returns a new context with the given Span attached. -func NewContext(parent context.Context, s *Span) context.Context { +func (t *tracer) NewContext(parent context.Context, s *Span) context.Context { return context.WithValue(parent, contextKey{}, s) } @@ -166,12 +170,14 @@ func WithSampler(sampler Sampler) StartOption { // // Returned context contains the newly created span. You can use it to // propagate the returned span in process. -func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { +func (t *tracer) StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { var opts StartOptions var parent SpanContext - if p := FromContext(ctx); p != nil { - p.addChild() - parent = p.spanContext + if p := t.FromContext(ctx); p != nil { + if ps, ok := p.internal.(*span); ok { + ps.addChild() + } + parent = p.SpanContext() } for _, op := range o { op(&opts) @@ -180,7 +186,8 @@ func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Cont ctx, end := startExecutionTracerTask(ctx, name) span.executionTracerTaskEnd = end - return NewContext(ctx, span), span + extSpan := NewSpan(span) + return t.NewContext(ctx, extSpan), extSpan } // StartSpanWithRemoteParent starts a new child span of the span from the given parent. @@ -190,7 +197,7 @@ func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Cont // // Returned context contains the newly created span. You can use it to // propagate the returned span in process. -func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { +func (t *tracer) StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { var opts StartOptions for _, op := range o { op(&opts) @@ -198,19 +205,24 @@ func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanCont span := startSpanInternal(name, parent != SpanContext{}, parent, true, opts) ctx, end := startExecutionTracerTask(ctx, name) span.executionTracerTaskEnd = end - return NewContext(ctx, span), span + extSpan := NewSpan(span) + return t.NewContext(ctx, extSpan), extSpan } -func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *Span { - span := &Span{} - span.spanContext = parent +func startSpanInternal(name string, hasParent bool, parent SpanContext, remoteParent bool, o StartOptions) *span { + s := &span{} + s.spanContext = parent cfg := config.Load().(*Config) + if gen, ok := cfg.IDGenerator.(*defaultIDGenerator); ok { + // lazy initialization + gen.init() + } if !hasParent { - span.spanContext.TraceID = cfg.IDGenerator.NewTraceID() + s.spanContext.TraceID = cfg.IDGenerator.NewTraceID() } - span.spanContext.SpanID = cfg.IDGenerator.NewSpanID() + s.spanContext.SpanID = cfg.IDGenerator.NewSpanID() sampler := cfg.DefaultSampler if !hasParent || remoteParent || o.Sampler != nil { @@ -222,47 +234,47 @@ func startSpanInternal(name string, hasParent bool, parent SpanContext, remotePa if o.Sampler != nil { sampler = o.Sampler } - span.spanContext.setIsSampled(sampler(SamplingParameters{ + s.spanContext.setIsSampled(sampler(SamplingParameters{ ParentContext: parent, - TraceID: span.spanContext.TraceID, - SpanID: span.spanContext.SpanID, + TraceID: s.spanContext.TraceID, + SpanID: s.spanContext.SpanID, Name: name, HasRemoteParent: remoteParent}).Sample) } - if !internal.LocalSpanStoreEnabled && !span.spanContext.IsSampled() { - return span + if !internal.LocalSpanStoreEnabled && !s.spanContext.IsSampled() { + return s } - span.data = &SpanData{ - SpanContext: span.spanContext, + s.data = &SpanData{ + SpanContext: s.spanContext, StartTime: time.Now(), SpanKind: o.SpanKind, Name: name, HasRemoteParent: remoteParent, } - span.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) - span.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) - span.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) - span.links = newEvictedQueue(cfg.MaxLinksPerSpan) + s.lruAttributes = newLruMap(cfg.MaxAttributesPerSpan) + s.annotations = newEvictedQueue(cfg.MaxAnnotationEventsPerSpan) + s.messageEvents = newEvictedQueue(cfg.MaxMessageEventsPerSpan) + s.links = newEvictedQueue(cfg.MaxLinksPerSpan) if hasParent { - span.data.ParentSpanID = parent.SpanID + s.data.ParentSpanID = parent.SpanID } if internal.LocalSpanStoreEnabled { var ss *spanStore ss = spanStoreForNameCreateIfNew(name) if ss != nil { - span.spanStore = ss - ss.add(span) + s.spanStore = ss + ss.add(s) } } - return span + return s } // End ends the span. -func (s *Span) End() { +func (s *span) End() { if s == nil { return } @@ -292,7 +304,7 @@ func (s *Span) End() { // makeSpanData produces a SpanData representing the current state of the Span. // It requires that s.data is non-nil. -func (s *Span) makeSpanData() *SpanData { +func (s *span) makeSpanData() *SpanData { var sd SpanData s.mu.Lock() sd = *s.data @@ -317,7 +329,7 @@ func (s *Span) makeSpanData() *SpanData { } // SpanContext returns the SpanContext of the span. -func (s *Span) SpanContext() SpanContext { +func (s *span) SpanContext() SpanContext { if s == nil { return SpanContext{} } @@ -325,7 +337,7 @@ func (s *Span) SpanContext() SpanContext { } // SetName sets the name of the span, if it is recording events. -func (s *Span) SetName(name string) { +func (s *span) SetName(name string) { if !s.IsRecordingEvents() { return } @@ -335,7 +347,7 @@ func (s *Span) SetName(name string) { } // SetStatus sets the status of the span, if it is recording events. -func (s *Span) SetStatus(status Status) { +func (s *span) SetStatus(status Status) { if !s.IsRecordingEvents() { return } @@ -344,32 +356,32 @@ func (s *Span) SetStatus(status Status) { s.mu.Unlock() } -func (s *Span) interfaceArrayToLinksArray() []Link { - linksArr := make([]Link, 0) +func (s *span) interfaceArrayToLinksArray() []Link { + linksArr := make([]Link, 0, len(s.links.queue)) for _, value := range s.links.queue { linksArr = append(linksArr, value.(Link)) } return linksArr } -func (s *Span) interfaceArrayToMessageEventArray() []MessageEvent { - messageEventArr := make([]MessageEvent, 0) +func (s *span) interfaceArrayToMessageEventArray() []MessageEvent { + messageEventArr := make([]MessageEvent, 0, len(s.messageEvents.queue)) for _, value := range s.messageEvents.queue { messageEventArr = append(messageEventArr, value.(MessageEvent)) } return messageEventArr } -func (s *Span) interfaceArrayToAnnotationArray() []Annotation { - annotationArr := make([]Annotation, 0) +func (s *span) interfaceArrayToAnnotationArray() []Annotation { + annotationArr := make([]Annotation, 0, len(s.annotations.queue)) for _, value := range s.annotations.queue { annotationArr = append(annotationArr, value.(Annotation)) } return annotationArr } -func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { - attributes := make(map[string]interface{}) +func (s *span) lruAttributesToAttributeMap() map[string]interface{} { + attributes := make(map[string]interface{}, s.lruAttributes.len()) for _, key := range s.lruAttributes.keys() { value, ok := s.lruAttributes.get(key) if ok { @@ -380,13 +392,13 @@ func (s *Span) lruAttributesToAttributeMap() map[string]interface{} { return attributes } -func (s *Span) copyToCappedAttributes(attributes []Attribute) { +func (s *span) copyToCappedAttributes(attributes []Attribute) { for _, a := range attributes { s.lruAttributes.add(a.key, a.value) } } -func (s *Span) addChild() { +func (s *span) addChild() { if !s.IsRecordingEvents() { return } @@ -398,7 +410,7 @@ func (s *Span) addChild() { // AddAttributes sets attributes in the span. // // Existing attributes whose keys appear in the attributes parameter are overwritten. -func (s *Span) AddAttributes(attributes ...Attribute) { +func (s *span) AddAttributes(attributes ...Attribute) { if !s.IsRecordingEvents() { return } @@ -407,49 +419,27 @@ func (s *Span) AddAttributes(attributes ...Attribute) { s.mu.Unlock() } -// copyAttributes copies a slice of Attributes into a map. -func copyAttributes(m map[string]interface{}, attributes []Attribute) { - for _, a := range attributes { - m[a.key] = a.value - } -} - -func (s *Span) lazyPrintfInternal(attributes []Attribute, format string, a ...interface{}) { +func (s *span) printStringInternal(attributes []Attribute, str string) { now := time.Now() - msg := fmt.Sprintf(format, a...) - var m map[string]interface{} - s.mu.Lock() + var am map[string]interface{} if len(attributes) != 0 { - m = make(map[string]interface{}) - copyAttributes(m, attributes) + am = make(map[string]interface{}, len(attributes)) + for _, attr := range attributes { + am[attr.key] = attr.value + } } - s.annotations.add(Annotation{ - Time: now, - Message: msg, - Attributes: m, - }) - s.mu.Unlock() -} - -func (s *Span) printStringInternal(attributes []Attribute, str string) { - now := time.Now() - var a map[string]interface{} s.mu.Lock() - if len(attributes) != 0 { - a = make(map[string]interface{}) - copyAttributes(a, attributes) - } s.annotations.add(Annotation{ Time: now, Message: str, - Attributes: a, + Attributes: am, }) s.mu.Unlock() } // Annotate adds an annotation with attributes. // Attributes can be nil. -func (s *Span) Annotate(attributes []Attribute, str string) { +func (s *span) Annotate(attributes []Attribute, str string) { if !s.IsRecordingEvents() { return } @@ -457,11 +447,11 @@ func (s *Span) Annotate(attributes []Attribute, str string) { } // Annotatef adds an annotation with attributes. -func (s *Span) Annotatef(attributes []Attribute, format string, a ...interface{}) { +func (s *span) Annotatef(attributes []Attribute, format string, a ...interface{}) { if !s.IsRecordingEvents() { return } - s.lazyPrintfInternal(attributes, format, a...) + s.printStringInternal(attributes, fmt.Sprintf(format, a...)) } // AddMessageSendEvent adds a message send event to the span. @@ -470,7 +460,7 @@ func (s *Span) Annotatef(attributes []Attribute, format string, a ...interface{} // unique in this span and the same between the send event and the receive // event (this allows to identify a message between the sender and receiver). // For example, this could be a sequence id. -func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { +func (s *span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { if !s.IsRecordingEvents() { return } @@ -492,7 +482,7 @@ func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedBy // unique in this span and the same between the send event and the receive // event (this allows to identify a message between the sender and receiver). // For example, this could be a sequence id. -func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { +func (s *span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { if !s.IsRecordingEvents() { return } @@ -509,7 +499,7 @@ func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compresse } // AddLink adds a link to the span. -func (s *Span) AddLink(l Link) { +func (s *span) AddLink(l Link) { if !s.IsRecordingEvents() { return } @@ -518,7 +508,7 @@ func (s *Span) AddLink(l Link) { s.mu.Unlock() } -func (s *Span) String() string { +func (s *span) String() string { if s == nil { return "" } @@ -534,20 +524,9 @@ func (s *Span) String() string { var config atomic.Value // access atomically func init() { - gen := &defaultIDGenerator{} - // initialize traceID and spanID generators. - var rngSeed int64 - for _, p := range []interface{}{ - &rngSeed, &gen.traceIDAdd, &gen.nextSpanID, &gen.spanIDInc, - } { - binary.Read(crand.Reader, binary.LittleEndian, p) - } - gen.traceIDRand = rand.New(rand.NewSource(rngSeed)) - gen.spanIDInc |= 1 - config.Store(&Config{ DefaultSampler: ProbabilitySampler(defaultSamplingProbability), - IDGenerator: gen, + IDGenerator: &defaultIDGenerator{}, MaxAttributesPerSpan: DefaultMaxAttributesPerSpan, MaxAnnotationEventsPerSpan: DefaultMaxAnnotationEventsPerSpan, MaxMessageEventsPerSpan: DefaultMaxMessageEventsPerSpan, @@ -571,6 +550,24 @@ type defaultIDGenerator struct { traceIDAdd [2]uint64 traceIDRand *rand.Rand + + initOnce sync.Once +} + +// init initializes the generator on the first call to avoid consuming entropy +// unnecessarily. +func (gen *defaultIDGenerator) init() { + gen.initOnce.Do(func() { + // initialize traceID and spanID generators. + var rngSeed int64 + for _, p := range []interface{}{ + &rngSeed, &gen.traceIDAdd, &gen.nextSpanID, &gen.spanIDInc, + } { + binary.Read(crand.Reader, binary.LittleEndian, p) + } + gen.traceIDRand = rand.New(rand.NewSource(rngSeed)) + gen.spanIDInc |= 1 + }) } // NewSpanID returns a non-zero span ID from a randomly-chosen sequence. diff --git a/vendor/go.opencensus.io/trace/trace_api.go b/vendor/go.opencensus.io/trace/trace_api.go new file mode 100644 index 0000000000..9e2c3a9992 --- /dev/null +++ b/vendor/go.opencensus.io/trace/trace_api.go @@ -0,0 +1,265 @@ +// Copyright 2020, OpenCensus Authors +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package trace + +import ( + "context" +) + +// DefaultTracer is the tracer used when package-level exported functions are invoked. +var DefaultTracer Tracer = &tracer{} + +// Tracer can start spans and access context functions. +type Tracer interface { + + // StartSpan starts a new child span of the current span in the context. If + // there is no span in the context, creates a new trace and span. + // + // Returned context contains the newly created span. You can use it to + // propagate the returned span in process. + StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) + + // StartSpanWithRemoteParent starts a new child span of the span from the given parent. + // + // If the incoming context contains a parent, it ignores. StartSpanWithRemoteParent is + // preferred for cases where the parent is propagated via an incoming request. + // + // Returned context contains the newly created span. You can use it to + // propagate the returned span in process. + StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) + + // FromContext returns the Span stored in a context, or nil if there isn't one. + FromContext(ctx context.Context) *Span + + // NewContext returns a new context with the given Span attached. + NewContext(parent context.Context, s *Span) context.Context +} + +// StartSpan starts a new child span of the current span in the context. If +// there is no span in the context, creates a new trace and span. +// +// Returned context contains the newly created span. You can use it to +// propagate the returned span in process. +func StartSpan(ctx context.Context, name string, o ...StartOption) (context.Context, *Span) { + return DefaultTracer.StartSpan(ctx, name, o...) +} + +// StartSpanWithRemoteParent starts a new child span of the span from the given parent. +// +// If the incoming context contains a parent, it ignores. StartSpanWithRemoteParent is +// preferred for cases where the parent is propagated via an incoming request. +// +// Returned context contains the newly created span. You can use it to +// propagate the returned span in process. +func StartSpanWithRemoteParent(ctx context.Context, name string, parent SpanContext, o ...StartOption) (context.Context, *Span) { + return DefaultTracer.StartSpanWithRemoteParent(ctx, name, parent, o...) +} + +// FromContext returns the Span stored in a context, or a Span that is not +// recording events if there isn't one. +func FromContext(ctx context.Context) *Span { + return DefaultTracer.FromContext(ctx) +} + +// NewContext returns a new context with the given Span attached. +func NewContext(parent context.Context, s *Span) context.Context { + return DefaultTracer.NewContext(parent, s) +} + +// SpanInterface represents a span of a trace. It has an associated SpanContext, and +// stores data accumulated while the span is active. +// +// Ideally users should interact with Spans by calling the functions in this +// package that take a Context parameter. +type SpanInterface interface { + + // IsRecordingEvents returns true if events are being recorded for this span. + // Use this check to avoid computing expensive annotations when they will never + // be used. + IsRecordingEvents() bool + + // End ends the span. + End() + + // SpanContext returns the SpanContext of the span. + SpanContext() SpanContext + + // SetName sets the name of the span, if it is recording events. + SetName(name string) + + // SetStatus sets the status of the span, if it is recording events. + SetStatus(status Status) + + // AddAttributes sets attributes in the span. + // + // Existing attributes whose keys appear in the attributes parameter are overwritten. + AddAttributes(attributes ...Attribute) + + // Annotate adds an annotation with attributes. + // Attributes can be nil. + Annotate(attributes []Attribute, str string) + + // Annotatef adds an annotation with attributes. + Annotatef(attributes []Attribute, format string, a ...interface{}) + + // AddMessageSendEvent adds a message send event to the span. + // + // messageID is an identifier for the message, which is recommended to be + // unique in this span and the same between the send event and the receive + // event (this allows to identify a message between the sender and receiver). + // For example, this could be a sequence id. + AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) + + // AddMessageReceiveEvent adds a message receive event to the span. + // + // messageID is an identifier for the message, which is recommended to be + // unique in this span and the same between the send event and the receive + // event (this allows to identify a message between the sender and receiver). + // For example, this could be a sequence id. + AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) + + // AddLink adds a link to the span. + AddLink(l Link) + + // String prints a string representation of a span. + String() string +} + +// NewSpan is a convenience function for creating a *Span out of a *span +func NewSpan(s SpanInterface) *Span { + return &Span{internal: s} +} + +// Span is a struct wrapper around the SpanInt interface, which allows correctly handling +// nil spans, while also allowing the SpanInterface implementation to be swapped out. +type Span struct { + internal SpanInterface +} + +// Internal returns the underlying implementation of the Span +func (s *Span) Internal() SpanInterface { + return s.internal +} + +// IsRecordingEvents returns true if events are being recorded for this span. +// Use this check to avoid computing expensive annotations when they will never +// be used. +func (s *Span) IsRecordingEvents() bool { + if s == nil { + return false + } + return s.internal.IsRecordingEvents() +} + +// End ends the span. +func (s *Span) End() { + if s == nil { + return + } + s.internal.End() +} + +// SpanContext returns the SpanContext of the span. +func (s *Span) SpanContext() SpanContext { + if s == nil { + return SpanContext{} + } + return s.internal.SpanContext() +} + +// SetName sets the name of the span, if it is recording events. +func (s *Span) SetName(name string) { + if !s.IsRecordingEvents() { + return + } + s.internal.SetName(name) +} + +// SetStatus sets the status of the span, if it is recording events. +func (s *Span) SetStatus(status Status) { + if !s.IsRecordingEvents() { + return + } + s.internal.SetStatus(status) +} + +// AddAttributes sets attributes in the span. +// +// Existing attributes whose keys appear in the attributes parameter are overwritten. +func (s *Span) AddAttributes(attributes ...Attribute) { + if !s.IsRecordingEvents() { + return + } + s.internal.AddAttributes(attributes...) +} + +// Annotate adds an annotation with attributes. +// Attributes can be nil. +func (s *Span) Annotate(attributes []Attribute, str string) { + if !s.IsRecordingEvents() { + return + } + s.internal.Annotate(attributes, str) +} + +// Annotatef adds an annotation with attributes. +func (s *Span) Annotatef(attributes []Attribute, format string, a ...interface{}) { + if !s.IsRecordingEvents() { + return + } + s.internal.Annotatef(attributes, format, a...) +} + +// AddMessageSendEvent adds a message send event to the span. +// +// messageID is an identifier for the message, which is recommended to be +// unique in this span and the same between the send event and the receive +// event (this allows to identify a message between the sender and receiver). +// For example, this could be a sequence id. +func (s *Span) AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize int64) { + if !s.IsRecordingEvents() { + return + } + s.internal.AddMessageSendEvent(messageID, uncompressedByteSize, compressedByteSize) +} + +// AddMessageReceiveEvent adds a message receive event to the span. +// +// messageID is an identifier for the message, which is recommended to be +// unique in this span and the same between the send event and the receive +// event (this allows to identify a message between the sender and receiver). +// For example, this could be a sequence id. +func (s *Span) AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize int64) { + if !s.IsRecordingEvents() { + return + } + s.internal.AddMessageReceiveEvent(messageID, uncompressedByteSize, compressedByteSize) +} + +// AddLink adds a link to the span. +func (s *Span) AddLink(l Link) { + if !s.IsRecordingEvents() { + return + } + s.internal.AddLink(l) +} + +// String prints a string representation of a span. +func (s *Span) String() string { + if s == nil { + return "" + } + return s.internal.String() +} diff --git a/vendor/go.uber.org/zap/CHANGELOG.md b/vendor/go.uber.org/zap/CHANGELOG.md index 3b99bf0ac8..fdfef8808a 100644 --- a/vendor/go.uber.org/zap/CHANGELOG.md +++ b/vendor/go.uber.org/zap/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## 1.19.0 (9 Aug 2021) + +Enhancements: +* [#975][]: Avoid panicking in Sampler core if the level is out of bounds. +* [#984][]: Reduce the size of BufferedWriteSyncer by aligning the fields + better. + +[#975]: https://github.com/uber-go/zap/pull/975 +[#984]: https://github.com/uber-go/zap/pull/984 + +Thanks to @lancoLiu and @thockin for their contributions to this release. + +## 1.18.1 (28 Jun 2021) + +Bugfixes: +* [#974][]: Fix nil dereference in logger constructed by `zap.NewNop`. + +[#974]: https://github.com/uber-go/zap/pull/974 + +## 1.18.0 (28 Jun 2021) + +Enhancements: +* [#961][]: Add `zapcore.BufferedWriteSyncer`, a new `WriteSyncer` that buffers + messages in-memory and flushes them periodically. +* [#971][]: Add `zapio.Writer` to use a Zap logger as an `io.Writer`. +* [#897][]: Add `zap.WithClock` option to control the source of time via the + new `zapcore.Clock` interface. +* [#949][]: Avoid panicking in `zap.SugaredLogger` when arguments of `*w` + methods don't match expectations. +* [#943][]: Add support for filtering by level or arbitrary matcher function to + `zaptest/observer`. +* [#691][]: Comply with `io.StringWriter` and `io.ByteWriter` in Zap's + `buffer.Buffer`. + +Thanks to @atrn0, @ernado, @heyanfu, @hnlq715, @zchee +for their contributions to this release. + +[#691]: https://github.com/uber-go/zap/pull/691 +[#897]: https://github.com/uber-go/zap/pull/897 +[#943]: https://github.com/uber-go/zap/pull/943 +[#949]: https://github.com/uber-go/zap/pull/949 +[#961]: https://github.com/uber-go/zap/pull/961 +[#971]: https://github.com/uber-go/zap/pull/971 + ## 1.17.0 (25 May 2021) Bugfixes: diff --git a/vendor/go.uber.org/zap/buffer/buffer.go b/vendor/go.uber.org/zap/buffer/buffer.go index 3f4b86e081..9e929cd98e 100644 --- a/vendor/go.uber.org/zap/buffer/buffer.go +++ b/vendor/go.uber.org/zap/buffer/buffer.go @@ -106,6 +106,24 @@ func (b *Buffer) Write(bs []byte) (int, error) { return len(bs), nil } +// WriteByte writes a single byte to the Buffer. +// +// Error returned is always nil, function signature is compatible +// with bytes.Buffer and bufio.Writer +func (b *Buffer) WriteByte(v byte) error { + b.AppendByte(v) + return nil +} + +// WriteString writes a string to the Buffer. +// +// Error returned is always nil, function signature is compatible +// with bytes.Buffer and bufio.Writer +func (b *Buffer) WriteString(s string) (int, error) { + b.AppendString(s) + return len(s), nil +} + // TrimNewline trims any final "\n" byte from the end of the buffer. func (b *Buffer) TrimNewline() { if i := len(b.bs) - 1; i >= 0 { diff --git a/vendor/go.uber.org/zap/go.mod b/vendor/go.uber.org/zap/go.mod index 6578a35454..9455c99cc9 100644 --- a/vendor/go.uber.org/zap/go.mod +++ b/vendor/go.uber.org/zap/go.mod @@ -3,9 +3,11 @@ module go.uber.org/zap go 1.13 require ( + github.com/benbjohnson/clock v1.1.0 github.com/pkg/errors v0.8.1 github.com/stretchr/testify v1.7.0 go.uber.org/atomic v1.7.0 + go.uber.org/goleak v1.1.10 go.uber.org/multierr v1.6.0 gopkg.in/yaml.v2 v2.2.8 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect diff --git a/vendor/go.uber.org/zap/go.sum b/vendor/go.uber.org/zap/go.sum index 911a87ae1c..9031a6131a 100644 --- a/vendor/go.uber.org/zap/go.sum +++ b/vendor/go.uber.org/zap/go.sum @@ -1,20 +1,44 @@ +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= +go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11 h1:Yq9t9jnGoR+dBuitxdo9l6Q7xh/zOyNnYUtDKaQ3x0E= +golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/vendor/go.uber.org/zap/logger.go b/vendor/go.uber.org/zap/logger.go index 553f258e74..f116bd936f 100644 --- a/vendor/go.uber.org/zap/logger.go +++ b/vendor/go.uber.org/zap/logger.go @@ -26,7 +26,6 @@ import ( "os" "runtime" "strings" - "time" "go.uber.org/zap/zapcore" ) @@ -51,6 +50,8 @@ type Logger struct { addStack zapcore.LevelEnabler callerSkip int + + clock zapcore.Clock } // New constructs a new Logger from the provided zapcore.Core and Options. If @@ -71,6 +72,7 @@ func New(core zapcore.Core, options ...Option) *Logger { core: core, errorOutput: zapcore.Lock(os.Stderr), addStack: zapcore.FatalLevel + 1, + clock: zapcore.DefaultClock, } return log.WithOptions(options...) } @@ -85,6 +87,7 @@ func NewNop() *Logger { core: zapcore.NewNopCore(), errorOutput: zapcore.AddSync(ioutil.Discard), addStack: zapcore.FatalLevel + 1, + clock: zapcore.DefaultClock, } } @@ -270,7 +273,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { // log message will actually be written somewhere. ent := zapcore.Entry{ LoggerName: log.name, - Time: time.Now(), + Time: log.clock.Now(), Level: lvl, Message: msg, } @@ -307,7 +310,7 @@ func (log *Logger) check(lvl zapcore.Level, msg string) *zapcore.CheckedEntry { if log.addCaller { frame, defined := getCallerFrame(log.callerSkip + callerSkipOffset) if !defined { - fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", time.Now().UTC()) + fmt.Fprintf(log.errorOutput, "%v Logger.check error: failed to get caller\n", ent.Time.UTC()) log.errorOutput.Sync() } diff --git a/vendor/go.uber.org/zap/options.go b/vendor/go.uber.org/zap/options.go index 0135c20923..e9e66161f5 100644 --- a/vendor/go.uber.org/zap/options.go +++ b/vendor/go.uber.org/zap/options.go @@ -138,3 +138,11 @@ func OnFatal(action zapcore.CheckWriteAction) Option { log.onFatal = action }) } + +// WithClock specifies the clock used by the logger to determine the current +// time for logged entries. Defaults to the system clock with time.Now. +func WithClock(clock zapcore.Clock) Option { + return optionFunc(func(log *Logger) { + log.clock = clock + }) +} diff --git a/vendor/go.uber.org/zap/sugar.go b/vendor/go.uber.org/zap/sugar.go index 4084dada79..0b9651981a 100644 --- a/vendor/go.uber.org/zap/sugar.go +++ b/vendor/go.uber.org/zap/sugar.go @@ -266,7 +266,7 @@ func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { // Make sure this element isn't a dangling key. if i == len(args)-1 { - s.base.DPanic(_oddNumberErrMsg, Any("ignored", args[i])) + s.base.Error(_oddNumberErrMsg, Any("ignored", args[i])) break } @@ -287,7 +287,7 @@ func (s *SugaredLogger) sweetenFields(args []interface{}) []Field { // If we encountered any invalid key-value pairs, log an error. if len(invalid) > 0 { - s.base.DPanic(_nonStringKeyErrMsg, Array("invalid", invalid)) + s.base.Error(_nonStringKeyErrMsg, Array("invalid", invalid)) } return fields } diff --git a/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go new file mode 100644 index 0000000000..ef2f7d9637 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/buffered_write_syncer.go @@ -0,0 +1,188 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "bufio" + "sync" + "time" + + "go.uber.org/multierr" +) + +const ( + // _defaultBufferSize specifies the default size used by Buffer. + _defaultBufferSize = 256 * 1024 // 256 kB + + // _defaultFlushInterval specifies the default flush interval for + // Buffer. + _defaultFlushInterval = 30 * time.Second +) + +// A BufferedWriteSyncer is a WriteSyncer that buffers writes in-memory before +// flushing them to a wrapped WriteSyncer after reaching some limit, or at some +// fixed interval--whichever comes first. +// +// BufferedWriteSyncer is safe for concurrent use. You don't need to use +// zapcore.Lock for WriteSyncers with BufferedWriteSyncer. +type BufferedWriteSyncer struct { + // WS is the WriteSyncer around which BufferedWriteSyncer will buffer + // writes. + // + // This field is required. + WS WriteSyncer + + // Size specifies the maximum amount of data the writer will buffered + // before flushing. + // + // Defaults to 256 kB if unspecified. + Size int + + // FlushInterval specifies how often the writer should flush data if + // there have been no writes. + // + // Defaults to 30 seconds if unspecified. + FlushInterval time.Duration + + // Clock, if specified, provides control of the source of time for the + // writer. + // + // Defaults to the system clock. + Clock Clock + + // unexported fields for state + mu sync.Mutex + initialized bool // whether initialize() has run + stopped bool // whether Stop() has run + writer *bufio.Writer + ticker *time.Ticker + stop chan struct{} // closed when flushLoop should stop + done chan struct{} // closed when flushLoop has stopped +} + +func (s *BufferedWriteSyncer) initialize() { + size := s.Size + if size == 0 { + size = _defaultBufferSize + } + + flushInterval := s.FlushInterval + if flushInterval == 0 { + flushInterval = _defaultFlushInterval + } + + if s.Clock == nil { + s.Clock = DefaultClock + } + + s.ticker = s.Clock.NewTicker(flushInterval) + s.writer = bufio.NewWriterSize(s.WS, size) + s.stop = make(chan struct{}) + s.done = make(chan struct{}) + s.initialized = true + go s.flushLoop() +} + +// Write writes log data into buffer syncer directly, multiple Write calls will be batched, +// and log data will be flushed to disk when the buffer is full or periodically. +func (s *BufferedWriteSyncer) Write(bs []byte) (int, error) { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + s.initialize() + } + + // To avoid partial writes from being flushed, we manually flush the existing buffer if: + // * The current write doesn't fit into the buffer fully, and + // * The buffer is not empty (since bufio will not split large writes when the buffer is empty) + if len(bs) > s.writer.Available() && s.writer.Buffered() > 0 { + if err := s.writer.Flush(); err != nil { + return 0, err + } + } + + return s.writer.Write(bs) +} + +// Sync flushes buffered log data into disk directly. +func (s *BufferedWriteSyncer) Sync() error { + s.mu.Lock() + defer s.mu.Unlock() + + var err error + if s.initialized { + err = s.writer.Flush() + } + + return multierr.Append(err, s.WS.Sync()) +} + +// flushLoop flushes the buffer at the configured interval until Stop is +// called. +func (s *BufferedWriteSyncer) flushLoop() { + defer close(s.done) + + for { + select { + case <-s.ticker.C: + // we just simply ignore error here + // because the underlying bufio writer stores any errors + // and we return any error from Sync() as part of the close + _ = s.Sync() + case <-s.stop: + return + } + } +} + +// Stop closes the buffer, cleans up background goroutines, and flushes +// remaining unwritten data. +func (s *BufferedWriteSyncer) Stop() (err error) { + var stopped bool + + // Critical section. + func() { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.initialized { + return + } + + stopped = s.stopped + if stopped { + return + } + s.stopped = true + + s.ticker.Stop() + close(s.stop) // tell flushLoop to stop + <-s.done // and wait until it has + }() + + // Don't call Sync on consecutive Stops. + if !stopped { + err = s.Sync() + } + + return err +} diff --git a/vendor/go.uber.org/zap/zapcore/clock.go b/vendor/go.uber.org/zap/zapcore/clock.go new file mode 100644 index 0000000000..d2ea95b394 --- /dev/null +++ b/vendor/go.uber.org/zap/zapcore/clock.go @@ -0,0 +1,50 @@ +// Copyright (c) 2021 Uber Technologies, Inc. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package zapcore + +import ( + "time" +) + +// DefaultClock is the default clock used by Zap in operations that require +// time. This clock uses the system clock for all operations. +var DefaultClock = systemClock{} + +// Clock is a source of time for logged entries. +type Clock interface { + // Now returns the current local time. + Now() time.Time + + // NewTicker returns *time.Ticker that holds a channel + // that delivers "ticks" of a clock. + NewTicker(time.Duration) *time.Ticker +} + +// systemClock implements default Clock that uses system time. +type systemClock struct{} + +func (systemClock) Now() time.Time { + return time.Now() +} + +func (systemClock) NewTicker(duration time.Duration) *time.Ticker { + return time.NewTicker(duration) +} diff --git a/vendor/go.uber.org/zap/zapcore/entry.go b/vendor/go.uber.org/zap/zapcore/entry.go index 4aa8b4f90b..0885505b75 100644 --- a/vendor/go.uber.org/zap/zapcore/entry.go +++ b/vendor/go.uber.org/zap/zapcore/entry.go @@ -208,7 +208,7 @@ func (ce *CheckedEntry) Write(fields ...Field) { // If the entry is dirty, log an internal error; because the // CheckedEntry is being used after it was returned to the pool, // the message may be an amalgamation from multiple call sites. - fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", time.Now(), ce.Entry) + fmt.Fprintf(ce.ErrorOutput, "%v Unsafe CheckedEntry re-use near Entry %+v.\n", ce.Time, ce.Entry) ce.ErrorOutput.Sync() } return @@ -219,11 +219,9 @@ func (ce *CheckedEntry) Write(fields ...Field) { for i := range ce.cores { err = multierr.Append(err, ce.cores[i].Write(ce.Entry, fields)) } - if ce.ErrorOutput != nil { - if err != nil { - fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", time.Now(), err) - ce.ErrorOutput.Sync() - } + if err != nil && ce.ErrorOutput != nil { + fmt.Fprintf(ce.ErrorOutput, "%v write error: %v\n", ce.Time, err) + ce.ErrorOutput.Sync() } should, msg := ce.should, ce.Message diff --git a/vendor/go.uber.org/zap/zapcore/error.go b/vendor/go.uber.org/zap/zapcore/error.go index f2a07d7864..74919b0ccb 100644 --- a/vendor/go.uber.org/zap/zapcore/error.go +++ b/vendor/go.uber.org/zap/zapcore/error.go @@ -83,7 +83,7 @@ type errorGroup interface { Errors() []error } -// Note that errArry and errArrayElem are very similar to the version +// Note that errArray and errArrayElem are very similar to the version // implemented in the top-level error.go file. We can't re-use this because // that would require exporting errArray as part of the zapcore API. diff --git a/vendor/go.uber.org/zap/zapcore/sampler.go b/vendor/go.uber.org/zap/zapcore/sampler.go index 25f10ca1d7..31ed96e129 100644 --- a/vendor/go.uber.org/zap/zapcore/sampler.go +++ b/vendor/go.uber.org/zap/zapcore/sampler.go @@ -197,12 +197,14 @@ func (s *sampler) Check(ent Entry, ce *CheckedEntry) *CheckedEntry { return ce } - counter := s.counts.get(ent.Level, ent.Message) - n := counter.IncCheckReset(ent.Time, s.tick) - if n > s.first && (n-s.first)%s.thereafter != 0 { - s.hook(ent, LogDropped) - return ce + if ent.Level >= _minLevel && ent.Level <= _maxLevel { + counter := s.counts.get(ent.Level, ent.Message) + n := counter.IncCheckReset(ent.Time, s.tick) + if n > s.first && (n-s.first)%s.thereafter != 0 { + s.hook(ent, LogDropped) + return ce + } + s.hook(ent, LogSampled) } - s.hook(ent, LogSampled) return s.Core.Check(ent, ce) } diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md index 8cfd6063e7..1473e1296d 100644 --- a/vendor/golang.org/x/oauth2/README.md +++ b/vendor/golang.org/x/oauth2/README.md @@ -1,7 +1,7 @@ # OAuth2 for Go +[![Go Reference](https://pkg.go.dev/badge/golang.org/x/oauth2.svg)](https://pkg.go.dev/golang.org/x/oauth2) [![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2) -[![GoDoc](https://godoc.org/golang.org/x/oauth2?status.svg)](https://godoc.org/golang.org/x/oauth2) oauth2 package contains a client implementation for OAuth 2.0 spec. @@ -14,17 +14,17 @@ go get golang.org/x/oauth2 Or you can manually git clone the repository to `$(go env GOPATH)/src/golang.org/x/oauth2`. -See godoc for further documentation and examples. +See pkg.go.dev for further documentation and examples. -* [godoc.org/golang.org/x/oauth2](https://godoc.org/golang.org/x/oauth2) -* [godoc.org/golang.org/x/oauth2/google](https://godoc.org/golang.org/x/oauth2/google) +* [pkg.go.dev/golang.org/x/oauth2](https://pkg.go.dev/golang.org/x/oauth2) +* [pkg.go.dev/golang.org/x/oauth2/google](https://pkg.go.dev/golang.org/x/oauth2/google) ## Policy for new packages We no longer accept new provider-specific packages in this repo if all they do is add a single endpoint variable. If you just want to add a single endpoint, add it to the -[godoc.org/golang.org/x/oauth2/endpoints](https://godoc.org/golang.org/x/oauth2/endpoints) +[pkg.go.dev/golang.org/x/oauth2/endpoints](https://pkg.go.dev/golang.org/x/oauth2/endpoints) package. ## Report Issues / Send Patches diff --git a/vendor/golang.org/x/oauth2/go.mod b/vendor/golang.org/x/oauth2/go.mod index b345781552..2b13f0b34c 100644 --- a/vendor/golang.org/x/oauth2/go.mod +++ b/vendor/golang.org/x/oauth2/go.mod @@ -3,8 +3,7 @@ module golang.org/x/oauth2 go 1.11 require ( - cloud.google.com/go v0.34.0 - golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect - google.golang.org/appengine v1.4.0 + cloud.google.com/go v0.65.0 + golang.org/x/net v0.0.0-20200822124328-c89045814202 + google.golang.org/appengine v1.6.6 ) diff --git a/vendor/golang.org/x/oauth2/go.sum b/vendor/golang.org/x/oauth2/go.sum index 6f0079b0d7..eab5833c42 100644 --- a/vendor/golang.org/x/oauth2/go.sum +++ b/vendor/golang.org/x/oauth2/go.sum @@ -1,12 +1,361 @@ -cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +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/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +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/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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/vendor/golang.org/x/oauth2/google/appengine_gen1.go b/vendor/golang.org/x/oauth2/google/appengine_gen1.go index 83dacac320..16c6c6b90c 100644 --- a/vendor/golang.org/x/oauth2/google/appengine_gen1.go +++ b/vendor/golang.org/x/oauth2/google/appengine_gen1.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build appengine // +build appengine // This file applies to App Engine first generation runtimes (<= Go 1.9). diff --git a/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go b/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go index 04c2c2216a..a7e27b3d29 100644 --- a/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go +++ b/vendor/golang.org/x/oauth2/google/appengine_gen2_flex.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build !appengine // +build !appengine // This file applies to App Engine second generation runtimes (>= Go 1.11) and App Engine flexible. diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go index ad2c09236c..ae391313d2 100644 --- a/vendor/golang.org/x/oauth2/google/default.go +++ b/vendor/golang.org/x/oauth2/google/default.go @@ -21,6 +21,10 @@ import ( // Credentials holds Google credentials, including "Application Default Credentials". // For more details, see: // https://developers.google.com/accounts/docs/application-default-credentials +// Credentials from external accounts (workload identity federation) are used to +// identify a particular application from an on-prem or non-Google Cloud platform +// including Amazon Web Services (AWS), Microsoft Azure or any identity provider +// that supports OpenID Connect (OIDC). type Credentials struct { ProjectID string // may be empty TokenSource oauth2.TokenSource @@ -65,6 +69,10 @@ func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSourc // // 1. A JSON file whose path is specified by the // GOOGLE_APPLICATION_CREDENTIALS environment variable. +// For workload identity federation, refer to +// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation on +// how to generate the JSON configuration file for on-prem/non-Google cloud +// platforms. // 2. A JSON file in a location known to the gcloud command-line tool. // On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. // On other systems, $HOME/.config/gcloud/application_default_credentials.json. @@ -119,8 +127,10 @@ func FindDefaultCredentials(ctx context.Context, scopes ...string) (*Credentials // CredentialsFromJSON obtains Google credentials from a JSON value. The JSON can // represent either a Google Developers Console client_credentials.json file (as in -// ConfigFromJSON) or a Google Developers service account key file (as in -// JWTConfigFromJSON). +// ConfigFromJSON), a Google Developers service account key file (as in +// JWTConfigFromJSON) or the JSON configuration file for workload identity federation +// in non-Google cloud platforms (see +// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation). func CredentialsFromJSON(ctx context.Context, jsonData []byte, scopes ...string) (*Credentials, error) { var f credentialsFile if err := json.Unmarshal(jsonData, &f); err != nil { diff --git a/vendor/golang.org/x/oauth2/google/doc.go b/vendor/golang.org/x/oauth2/google/doc.go index 73be629033..b241c728a6 100644 --- a/vendor/golang.org/x/oauth2/google/doc.go +++ b/vendor/golang.org/x/oauth2/google/doc.go @@ -4,13 +4,16 @@ // Package google provides support for making OAuth2 authorized and authenticated // HTTP requests to Google APIs. It supports the Web server flow, client-side -// credentials, service accounts, Google Compute Engine service accounts, and Google -// App Engine service accounts. +// credentials, service accounts, Google Compute Engine service accounts, Google +// App Engine service accounts and workload identity federation from non-Google +// cloud platforms. // // A brief overview of the package follows. For more information, please read // https://developers.google.com/accounts/docs/OAuth2 // and // https://developers.google.com/accounts/docs/application-default-credentials. +// For more information on using workload identity federation, refer to +// https://cloud.google.com/iam/docs/how-to#using-workload-identity-federation. // // OAuth2 Configs // @@ -19,6 +22,35 @@ // the other by JWTConfigFromJSON. The returned Config can be used to obtain a TokenSource or // create an http.Client. // +// Workload Identity Federation +// +// Using workload identity federation, your application can access Google Cloud +// resources from Amazon Web Services (AWS), Microsoft Azure or any identity +// provider that supports OpenID Connect (OIDC). +// Traditionally, applications running outside Google Cloud have used service +// account keys to access Google Cloud resources. Using identity federation, +// you can allow your workload to impersonate a service account. +// This lets you access Google Cloud resources directly, eliminating the +// maintenance and security burden associated with service account keys. +// +// Follow the detailed instructions on how to configure Workload Identity Federation +// in various platforms: +// +// Amazon Web Services (AWS): https://cloud.google.com/iam/docs/access-resources-aws +// Microsoft Azure: https://cloud.google.com/iam/docs/access-resources-azure +// OIDC identity provider: https://cloud.google.com/iam/docs/access-resources-oidc +// +// For OIDC providers, the library can retrieve OIDC tokens either from a +// local file location (file-sourced credentials) or from a local server +// (URL-sourced credentials). +// For file-sourced credentials, a background process needs to be continuously +// refreshing the file location with a new OIDC token prior to expiration. +// For tokens with one hour lifetimes, the token needs to be updated in the file +// every hour. The token can be stored directly as plain text or in JSON format. +// For URL-sourced credentials, a local server needs to host a GET endpoint to +// return the OIDC token. The response can be in plain text or JSON. +// Additional required request headers can also be specified. +// // // Credentials // @@ -29,6 +61,13 @@ // FindDefaultCredentials looks in some well-known places for a credentials file, and // will call AppEngineTokenSource or ComputeTokenSource as needed. // +// Application Default Credentials also support workload identity federation to +// access Google Cloud resources from non-Google Cloud platforms including Amazon +// Web Services (AWS), Microsoft Azure or any identity provider that supports +// OpenID Connect (OIDC). Workload identity federation is recommended for +// non-Google Cloud environments as it avoids the need to download, manage and +// store service account private keys locally. +// // DefaultClient and DefaultTokenSource are convenience methods. They first call FindDefaultCredentials, // then use the credentials to construct an http.Client or an oauth2.TokenSource. // diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go index 81de32b360..2c8f1bd5ad 100644 --- a/vendor/golang.org/x/oauth2/google/google.go +++ b/vendor/golang.org/x/oauth2/google/google.go @@ -15,6 +15,7 @@ import ( "cloud.google.com/go/compute/metadata" "golang.org/x/oauth2" + "golang.org/x/oauth2/google/internal/externalaccount" "golang.org/x/oauth2/jwt" ) @@ -93,6 +94,7 @@ func JWTConfigFromJSON(jsonKey []byte, scope ...string) (*jwt.Config, error) { const ( serviceAccountKey = "service_account" userCredentialsKey = "authorized_user" + externalAccountKey = "external_account" ) // credentialsFile is the unmarshalled representation of a credentials file. @@ -111,6 +113,15 @@ type credentialsFile struct { ClientSecret string `json:"client_secret"` ClientID string `json:"client_id"` RefreshToken string `json:"refresh_token"` + + // External Account fields + Audience string `json:"audience"` + SubjectTokenType string `json:"subject_token_type"` + TokenURLExternal string `json:"token_url"` + TokenInfoURL string `json:"token_info_url"` + ServiceAccountImpersonationURL string `json:"service_account_impersonation_url"` + CredentialSource externalaccount.CredentialSource `json:"credential_source"` + QuotaProjectID string `json:"quota_project_id"` } func (f *credentialsFile) jwtConfig(scopes []string) *jwt.Config { @@ -141,6 +152,20 @@ func (f *credentialsFile) tokenSource(ctx context.Context, scopes []string) (oau } tok := &oauth2.Token{RefreshToken: f.RefreshToken} return cfg.TokenSource(ctx, tok), nil + case externalAccountKey: + cfg := &externalaccount.Config{ + Audience: f.Audience, + SubjectTokenType: f.SubjectTokenType, + TokenURL: f.TokenURLExternal, + TokenInfoURL: f.TokenInfoURL, + ServiceAccountImpersonationURL: f.ServiceAccountImpersonationURL, + ClientSecret: f.ClientSecret, + ClientID: f.ClientID, + CredentialSource: f.CredentialSource, + QuotaProjectID: f.QuotaProjectID, + Scopes: scopes, + } + return cfg.TokenSource(ctx), nil case "": return nil, errors.New("missing 'type' field in credentials") default: diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go new file mode 100644 index 0000000000..fbcefb474e --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/aws.go @@ -0,0 +1,466 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "bytes" + "context" + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "errors" + "fmt" + "golang.org/x/oauth2" + "io" + "io/ioutil" + "net/http" + "net/url" + "os" + "path" + "sort" + "strings" + "time" +) + +type awsSecurityCredentials struct { + AccessKeyID string `json:"AccessKeyID"` + SecretAccessKey string `json:"SecretAccessKey"` + SecurityToken string `json:"Token"` +} + +// awsRequestSigner is a utility class to sign http requests using a AWS V4 signature. +type awsRequestSigner struct { + RegionName string + AwsSecurityCredentials awsSecurityCredentials +} + +// getenv aliases os.Getenv for testing +var getenv = os.Getenv + +const ( + // AWS Signature Version 4 signing algorithm identifier. + awsAlgorithm = "AWS4-HMAC-SHA256" + + // The termination string for the AWS credential scope value as defined in + // https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html + awsRequestType = "aws4_request" + + // The AWS authorization header name for the security session token if available. + awsSecurityTokenHeader = "x-amz-security-token" + + // The AWS authorization header name for the auto-generated date. + awsDateHeader = "x-amz-date" + + awsTimeFormatLong = "20060102T150405Z" + awsTimeFormatShort = "20060102" +) + +func getSha256(input []byte) (string, error) { + hash := sha256.New() + if _, err := hash.Write(input); err != nil { + return "", err + } + return hex.EncodeToString(hash.Sum(nil)), nil +} + +func getHmacSha256(key, input []byte) ([]byte, error) { + hash := hmac.New(sha256.New, key) + if _, err := hash.Write(input); err != nil { + return nil, err + } + return hash.Sum(nil), nil +} + +func cloneRequest(r *http.Request) *http.Request { + r2 := new(http.Request) + *r2 = *r + if r.Header != nil { + r2.Header = make(http.Header, len(r.Header)) + + // Find total number of values. + headerCount := 0 + for _, headerValues := range r.Header { + headerCount += len(headerValues) + } + copiedHeaders := make([]string, headerCount) // shared backing array for headers' values + + for headerKey, headerValues := range r.Header { + headerCount = copy(copiedHeaders, headerValues) + r2.Header[headerKey] = copiedHeaders[:headerCount:headerCount] + copiedHeaders = copiedHeaders[headerCount:] + } + } + return r2 +} + +func canonicalPath(req *http.Request) string { + result := req.URL.EscapedPath() + if result == "" { + return "/" + } + return path.Clean(result) +} + +func canonicalQuery(req *http.Request) string { + queryValues := req.URL.Query() + for queryKey := range queryValues { + sort.Strings(queryValues[queryKey]) + } + return queryValues.Encode() +} + +func canonicalHeaders(req *http.Request) (string, string) { + // Header keys need to be sorted alphabetically. + var headers []string + lowerCaseHeaders := make(http.Header) + for k, v := range req.Header { + k := strings.ToLower(k) + if _, ok := lowerCaseHeaders[k]; ok { + // include additional values + lowerCaseHeaders[k] = append(lowerCaseHeaders[k], v...) + } else { + headers = append(headers, k) + lowerCaseHeaders[k] = v + } + } + sort.Strings(headers) + + var fullHeaders bytes.Buffer + for _, header := range headers { + headerValue := strings.Join(lowerCaseHeaders[header], ",") + fullHeaders.WriteString(header) + fullHeaders.WriteRune(':') + fullHeaders.WriteString(headerValue) + fullHeaders.WriteRune('\n') + } + + return strings.Join(headers, ";"), fullHeaders.String() +} + +func requestDataHash(req *http.Request) (string, error) { + var requestData []byte + if req.Body != nil { + requestBody, err := req.GetBody() + if err != nil { + return "", err + } + defer requestBody.Close() + + requestData, err = ioutil.ReadAll(io.LimitReader(requestBody, 1<<20)) + if err != nil { + return "", err + } + } + + return getSha256(requestData) +} + +func requestHost(req *http.Request) string { + if req.Host != "" { + return req.Host + } + return req.URL.Host +} + +func canonicalRequest(req *http.Request, canonicalHeaderColumns, canonicalHeaderData string) (string, error) { + dataHash, err := requestDataHash(req) + if err != nil { + return "", err + } + + return fmt.Sprintf("%s\n%s\n%s\n%s\n%s\n%s", req.Method, canonicalPath(req), canonicalQuery(req), canonicalHeaderData, canonicalHeaderColumns, dataHash), nil +} + +// SignRequest adds the appropriate headers to an http.Request +// or returns an error if something prevented this. +func (rs *awsRequestSigner) SignRequest(req *http.Request) error { + signedRequest := cloneRequest(req) + timestamp := now() + + signedRequest.Header.Add("host", requestHost(req)) + + if rs.AwsSecurityCredentials.SecurityToken != "" { + signedRequest.Header.Add(awsSecurityTokenHeader, rs.AwsSecurityCredentials.SecurityToken) + } + + if signedRequest.Header.Get("date") == "" { + signedRequest.Header.Add(awsDateHeader, timestamp.Format(awsTimeFormatLong)) + } + + authorizationCode, err := rs.generateAuthentication(signedRequest, timestamp) + if err != nil { + return err + } + signedRequest.Header.Set("Authorization", authorizationCode) + + req.Header = signedRequest.Header + return nil +} + +func (rs *awsRequestSigner) generateAuthentication(req *http.Request, timestamp time.Time) (string, error) { + canonicalHeaderColumns, canonicalHeaderData := canonicalHeaders(req) + + dateStamp := timestamp.Format(awsTimeFormatShort) + serviceName := "" + if splitHost := strings.Split(requestHost(req), "."); len(splitHost) > 0 { + serviceName = splitHost[0] + } + + credentialScope := fmt.Sprintf("%s/%s/%s/%s", dateStamp, rs.RegionName, serviceName, awsRequestType) + + requestString, err := canonicalRequest(req, canonicalHeaderColumns, canonicalHeaderData) + if err != nil { + return "", err + } + requestHash, err := getSha256([]byte(requestString)) + if err != nil { + return "", err + } + + stringToSign := fmt.Sprintf("%s\n%s\n%s\n%s", awsAlgorithm, timestamp.Format(awsTimeFormatLong), credentialScope, requestHash) + + signingKey := []byte("AWS4" + rs.AwsSecurityCredentials.SecretAccessKey) + for _, signingInput := range []string{ + dateStamp, rs.RegionName, serviceName, awsRequestType, stringToSign, + } { + signingKey, err = getHmacSha256(signingKey, []byte(signingInput)) + if err != nil { + return "", err + } + } + + return fmt.Sprintf("%s Credential=%s/%s, SignedHeaders=%s, Signature=%s", awsAlgorithm, rs.AwsSecurityCredentials.AccessKeyID, credentialScope, canonicalHeaderColumns, hex.EncodeToString(signingKey)), nil +} + +type awsCredentialSource struct { + EnvironmentID string + RegionURL string + RegionalCredVerificationURL string + CredVerificationURL string + TargetResource string + requestSigner *awsRequestSigner + region string + ctx context.Context + client *http.Client +} + +type awsRequestHeader struct { + Key string `json:"key"` + Value string `json:"value"` +} + +type awsRequest struct { + URL string `json:"url"` + Method string `json:"method"` + Headers []awsRequestHeader `json:"headers"` +} + +func (cs awsCredentialSource) doRequest(req *http.Request) (*http.Response, error) { + if cs.client == nil { + cs.client = oauth2.NewClient(cs.ctx, nil) + } + return cs.client.Do(req.WithContext(cs.ctx)) +} + +func (cs awsCredentialSource) subjectToken() (string, error) { + if cs.requestSigner == nil { + awsSecurityCredentials, err := cs.getSecurityCredentials() + if err != nil { + return "", err + } + + if cs.region, err = cs.getRegion(); err != nil { + return "", err + } + + cs.requestSigner = &awsRequestSigner{ + RegionName: cs.region, + AwsSecurityCredentials: awsSecurityCredentials, + } + } + + // Generate the signed request to AWS STS GetCallerIdentity API. + // Use the required regional endpoint. Otherwise, the request will fail. + req, err := http.NewRequest("POST", strings.Replace(cs.RegionalCredVerificationURL, "{region}", cs.region, 1), nil) + if err != nil { + return "", err + } + // The full, canonical resource name of the workload identity pool + // provider, with or without the HTTPS prefix. + // Including this header as part of the signature is recommended to + // ensure data integrity. + if cs.TargetResource != "" { + req.Header.Add("x-goog-cloud-target-resource", cs.TargetResource) + } + cs.requestSigner.SignRequest(req) + + /* + The GCP STS endpoint expects the headers to be formatted as: + # [ + # {key: 'x-amz-date', value: '...'}, + # {key: 'Authorization', value: '...'}, + # ... + # ] + # And then serialized as: + # quote(json.dumps({ + # url: '...', + # method: 'POST', + # headers: [{key: 'x-amz-date', value: '...'}, ...] + # })) + */ + + awsSignedReq := awsRequest{ + URL: req.URL.String(), + Method: "POST", + } + for headerKey, headerList := range req.Header { + for _, headerValue := range headerList { + awsSignedReq.Headers = append(awsSignedReq.Headers, awsRequestHeader{ + Key: headerKey, + Value: headerValue, + }) + } + } + sort.Slice(awsSignedReq.Headers, func(i, j int) bool { + headerCompare := strings.Compare(awsSignedReq.Headers[i].Key, awsSignedReq.Headers[j].Key) + if headerCompare == 0 { + return strings.Compare(awsSignedReq.Headers[i].Value, awsSignedReq.Headers[j].Value) < 0 + } + return headerCompare < 0 + }) + + result, err := json.Marshal(awsSignedReq) + if err != nil { + return "", err + } + return url.QueryEscape(string(result)), nil +} + +func (cs *awsCredentialSource) getRegion() (string, error) { + if envAwsRegion := getenv("AWS_REGION"); envAwsRegion != "" { + return envAwsRegion, nil + } + + if cs.RegionURL == "" { + return "", errors.New("oauth2/google: unable to determine AWS region") + } + + req, err := http.NewRequest("GET", cs.RegionURL, nil) + if err != nil { + return "", err + } + + resp, err := cs.doRequest(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return "", err + } + + if resp.StatusCode != 200 { + return "", fmt.Errorf("oauth2/google: unable to retrieve AWS region - %s", string(respBody)) + } + + // This endpoint will return the region in format: us-east-2b. + // Only the us-east-2 part should be used. + respBodyEnd := 0 + if len(respBody) > 1 { + respBodyEnd = len(respBody) - 1 + } + return string(respBody[:respBodyEnd]), nil +} + +func (cs *awsCredentialSource) getSecurityCredentials() (result awsSecurityCredentials, err error) { + if accessKeyID := getenv("AWS_ACCESS_KEY_ID"); accessKeyID != "" { + if secretAccessKey := getenv("AWS_SECRET_ACCESS_KEY"); secretAccessKey != "" { + return awsSecurityCredentials{ + AccessKeyID: accessKeyID, + SecretAccessKey: secretAccessKey, + SecurityToken: getenv("AWS_SESSION_TOKEN"), + }, nil + } + } + + roleName, err := cs.getMetadataRoleName() + if err != nil { + return + } + + credentials, err := cs.getMetadataSecurityCredentials(roleName) + if err != nil { + return + } + + if credentials.AccessKeyID == "" { + return result, errors.New("oauth2/google: missing AccessKeyId credential") + } + + if credentials.SecretAccessKey == "" { + return result, errors.New("oauth2/google: missing SecretAccessKey credential") + } + + return credentials, nil +} + +func (cs *awsCredentialSource) getMetadataSecurityCredentials(roleName string) (awsSecurityCredentials, error) { + var result awsSecurityCredentials + + req, err := http.NewRequest("GET", fmt.Sprintf("%s/%s", cs.CredVerificationURL, roleName), nil) + if err != nil { + return result, err + } + req.Header.Add("Content-Type", "application/json") + + resp, err := cs.doRequest(req) + if err != nil { + return result, err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return result, err + } + + if resp.StatusCode != 200 { + return result, fmt.Errorf("oauth2/google: unable to retrieve AWS security credentials - %s", string(respBody)) + } + + err = json.Unmarshal(respBody, &result) + return result, err +} + +func (cs *awsCredentialSource) getMetadataRoleName() (string, error) { + if cs.CredVerificationURL == "" { + return "", errors.New("oauth2/google: unable to determine the AWS metadata server security credentials endpoint") + } + + req, err := http.NewRequest("GET", cs.CredVerificationURL, nil) + if err != nil { + return "", err + } + + resp, err := cs.doRequest(req) + if err != nil { + return "", err + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return "", err + } + + if resp.StatusCode != 200 { + return "", fmt.Errorf("oauth2/google: unable to retrieve AWS role name - %s", string(respBody)) + } + + return string(respBody), nil +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go new file mode 100644 index 0000000000..1a6e93cec7 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/basecredentials.go @@ -0,0 +1,163 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "context" + "fmt" + "golang.org/x/oauth2" + "net/http" + "strconv" + "time" +) + +// now aliases time.Now for testing +var now = func() time.Time { + return time.Now().UTC() +} + +// Config stores the configuration for fetching tokens with external credentials. +type Config struct { + Audience string + SubjectTokenType string + TokenURL string + TokenInfoURL string + ServiceAccountImpersonationURL string + ClientSecret string + ClientID string + CredentialSource CredentialSource + QuotaProjectID string + Scopes []string +} + +// TokenSource Returns an external account TokenSource struct. This is to be called by package google to construct a google.Credentials. +func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { + ts := tokenSource{ + ctx: ctx, + conf: c, + } + if c.ServiceAccountImpersonationURL == "" { + return oauth2.ReuseTokenSource(nil, ts) + } + scopes := c.Scopes + ts.conf.Scopes = []string{"https://www.googleapis.com/auth/cloud-platform"} + imp := impersonateTokenSource{ + ctx: ctx, + url: c.ServiceAccountImpersonationURL, + scopes: scopes, + ts: oauth2.ReuseTokenSource(nil, ts), + } + return oauth2.ReuseTokenSource(nil, imp) +} + +// Subject token file types. +const ( + fileTypeText = "text" + fileTypeJSON = "json" +) + +type format struct { + // Type is either "text" or "json". When not provided "text" type is assumed. + Type string `json:"type"` + // SubjectTokenFieldName is only required for JSON format. This would be "access_token" for azure. + SubjectTokenFieldName string `json:"subject_token_field_name"` +} + +// CredentialSource stores the information necessary to retrieve the credentials for the STS exchange. +type CredentialSource struct { + File string `json:"file"` + + URL string `json:"url"` + Headers map[string]string `json:"headers"` + + EnvironmentID string `json:"environment_id"` + RegionURL string `json:"region_url"` + RegionalCredVerificationURL string `json:"regional_cred_verification_url"` + CredVerificationURL string `json:"cred_verification_url"` + Format format `json:"format"` +} + +// parse determines the type of CredentialSource needed +func (c *Config) parse(ctx context.Context) (baseCredentialSource, error) { + if len(c.CredentialSource.EnvironmentID) > 3 && c.CredentialSource.EnvironmentID[:3] == "aws" { + if awsVersion, err := strconv.Atoi(c.CredentialSource.EnvironmentID[3:]); err == nil { + if awsVersion != 1 { + return nil, fmt.Errorf("oauth2/google: aws version '%d' is not supported in the current build", awsVersion) + } + return awsCredentialSource{ + EnvironmentID: c.CredentialSource.EnvironmentID, + RegionURL: c.CredentialSource.RegionURL, + RegionalCredVerificationURL: c.CredentialSource.RegionalCredVerificationURL, + CredVerificationURL: c.CredentialSource.URL, + TargetResource: c.Audience, + ctx: ctx, + }, nil + } + } else if c.CredentialSource.File != "" { + return fileCredentialSource{File: c.CredentialSource.File, Format: c.CredentialSource.Format}, nil + } else if c.CredentialSource.URL != "" { + return urlCredentialSource{URL: c.CredentialSource.URL, Headers: c.CredentialSource.Headers, Format: c.CredentialSource.Format, ctx: ctx}, nil + } + return nil, fmt.Errorf("oauth2/google: unable to parse credential source") +} + +type baseCredentialSource interface { + subjectToken() (string, error) +} + +// tokenSource is the source that handles external credentials. +type tokenSource struct { + ctx context.Context + conf *Config +} + +// Token allows tokenSource to conform to the oauth2.TokenSource interface. +func (ts tokenSource) Token() (*oauth2.Token, error) { + conf := ts.conf + + credSource, err := conf.parse(ts.ctx) + if err != nil { + return nil, err + } + subjectToken, err := credSource.subjectToken() + + if err != nil { + return nil, err + } + stsRequest := stsTokenExchangeRequest{ + GrantType: "urn:ietf:params:oauth:grant-type:token-exchange", + Audience: conf.Audience, + Scope: conf.Scopes, + RequestedTokenType: "urn:ietf:params:oauth:token-type:access_token", + SubjectToken: subjectToken, + SubjectTokenType: conf.SubjectTokenType, + } + header := make(http.Header) + header.Add("Content-Type", "application/x-www-form-urlencoded") + clientAuth := clientAuthentication{ + AuthStyle: oauth2.AuthStyleInHeader, + ClientID: conf.ClientID, + ClientSecret: conf.ClientSecret, + } + stsResp, err := exchangeToken(ts.ctx, conf.TokenURL, &stsRequest, clientAuth, header, nil) + if err != nil { + return nil, err + } + + accessToken := &oauth2.Token{ + AccessToken: stsResp.AccessToken, + TokenType: stsResp.TokenType, + } + if stsResp.ExpiresIn < 0 { + return nil, fmt.Errorf("oauth2/google: got invalid expiry from security token service") + } else if stsResp.ExpiresIn >= 0 { + accessToken.Expiry = now().Add(time.Duration(stsResp.ExpiresIn) * time.Second) + } + + if stsResp.RefreshToken != "" { + accessToken.RefreshToken = stsResp.RefreshToken + } + return accessToken, nil +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/clientauth.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/clientauth.go new file mode 100644 index 0000000000..feccf8b68e --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/clientauth.go @@ -0,0 +1,41 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "encoding/base64" + "golang.org/x/oauth2" + "net/http" + "net/url" +) + +// clientAuthentication represents an OAuth client ID and secret and the mechanism for passing these credentials as stated in rfc6749#2.3.1. +type clientAuthentication struct { + // AuthStyle can be either basic or request-body + AuthStyle oauth2.AuthStyle + ClientID string + ClientSecret string +} + +func (c *clientAuthentication) InjectAuthentication(values url.Values, headers http.Header) { + if c.ClientID == "" || c.ClientSecret == "" || values == nil || headers == nil { + return + } + + switch c.AuthStyle { + case oauth2.AuthStyleInHeader: // AuthStyleInHeader corresponds to basic authentication as defined in rfc7617#2 + plainHeader := c.ClientID + ":" + c.ClientSecret + headers.Add("Authorization", "Basic "+base64.StdEncoding.EncodeToString([]byte(plainHeader))) + case oauth2.AuthStyleInParams: // AuthStyleInParams corresponds to request-body authentication with ClientID and ClientSecret in the message body. + values.Set("client_id", c.ClientID) + values.Set("client_secret", c.ClientSecret) + case oauth2.AuthStyleAutoDetect: + values.Set("client_id", c.ClientID) + values.Set("client_secret", c.ClientSecret) + default: + values.Set("client_id", c.ClientID) + values.Set("client_secret", c.ClientSecret) + } +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/err.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/err.go new file mode 100644 index 0000000000..233a78cef2 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/err.go @@ -0,0 +1,18 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import "fmt" + +// Error for handling OAuth related error responses as stated in rfc6749#5.2. +type Error struct { + Code string + URI string + Description string +} + +func (err *Error) Error() string { + return fmt.Sprintf("got error code %s from %s: %s", err.Code, err.URI, err.Description) +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/filecredsource.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/filecredsource.go new file mode 100644 index 0000000000..e953ddb473 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/filecredsource.go @@ -0,0 +1,57 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "bytes" + "encoding/json" + "errors" + "fmt" + "io" + "io/ioutil" + "os" +) + +type fileCredentialSource struct { + File string + Format format +} + +func (cs fileCredentialSource) subjectToken() (string, error) { + tokenFile, err := os.Open(cs.File) + if err != nil { + return "", fmt.Errorf("oauth2/google: failed to open credential file %q", cs.File) + } + defer tokenFile.Close() + tokenBytes, err := ioutil.ReadAll(io.LimitReader(tokenFile, 1<<20)) + if err != nil { + return "", fmt.Errorf("oauth2/google: failed to read credential file: %v", err) + } + tokenBytes = bytes.TrimSpace(tokenBytes) + switch cs.Format.Type { + case "json": + jsonData := make(map[string]interface{}) + err = json.Unmarshal(tokenBytes, &jsonData) + if err != nil { + return "", fmt.Errorf("oauth2/google: failed to unmarshal subject token file: %v", err) + } + val, ok := jsonData[cs.Format.SubjectTokenFieldName] + if !ok { + return "", errors.New("oauth2/google: provided subject_token_field_name not found in credentials") + } + token, ok := val.(string) + if !ok { + return "", errors.New("oauth2/google: improperly formatted subject token") + } + return token, nil + case "text": + return string(tokenBytes), nil + case "": + return string(tokenBytes), nil + default: + return "", errors.New("oauth2/google: invalid credential_source file format type") + } + +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go new file mode 100644 index 0000000000..1d29c467f7 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/impersonate.go @@ -0,0 +1,83 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "golang.org/x/oauth2" + "io" + "io/ioutil" + "net/http" + "time" +) + +// generateAccesstokenReq is used for service account impersonation +type generateAccessTokenReq struct { + Delegates []string `json:"delegates,omitempty"` + Lifetime string `json:"lifetime,omitempty"` + Scope []string `json:"scope,omitempty"` +} + +type impersonateTokenResponse struct { + AccessToken string `json:"accessToken"` + ExpireTime string `json:"expireTime"` +} + +type impersonateTokenSource struct { + ctx context.Context + ts oauth2.TokenSource + + url string + scopes []string +} + +// Token performs the exchange to get a temporary service account +func (its impersonateTokenSource) Token() (*oauth2.Token, error) { + reqBody := generateAccessTokenReq{ + Lifetime: "3600s", + Scope: its.scopes, + } + b, err := json.Marshal(reqBody) + if err != nil { + return nil, fmt.Errorf("oauth2/google: unable to marshal request: %v", err) + } + client := oauth2.NewClient(its.ctx, its.ts) + req, err := http.NewRequest("POST", its.url, bytes.NewReader(b)) + if err != nil { + return nil, fmt.Errorf("oauth2/google: unable to create impersonation request: %v", err) + } + req = req.WithContext(its.ctx) + req.Header.Set("Content-Type", "application/json") + + resp, err := client.Do(req) + if err != nil { + return nil, fmt.Errorf("oauth2/google: unable to generate access token: %v", err) + } + defer resp.Body.Close() + body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return nil, fmt.Errorf("oauth2/google: unable to read body: %v", err) + } + if c := resp.StatusCode; c < 200 || c > 299 { + return nil, fmt.Errorf("oauth2/google: status code %d: %s", c, body) + } + + var accessTokenResp impersonateTokenResponse + if err := json.Unmarshal(body, &accessTokenResp); err != nil { + return nil, fmt.Errorf("oauth2/google: unable to parse response: %v", err) + } + expiry, err := time.Parse(time.RFC3339, accessTokenResp.ExpireTime) + if err != nil { + return nil, fmt.Errorf("oauth2/google: unable to parse expiry: %v", err) + } + return &oauth2.Token{ + AccessToken: accessTokenResp.AccessToken, + Expiry: expiry, + TokenType: "Bearer", + }, nil +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/sts_exchange.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/sts_exchange.go new file mode 100644 index 0000000000..a8a704bb41 --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/sts_exchange.go @@ -0,0 +1,104 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "context" + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + + "golang.org/x/oauth2" +) + +// exchangeToken performs an oauth2 token exchange with the provided endpoint. +// The first 4 fields are all mandatory. headers can be used to pass additional +// headers beyond the bare minimum required by the token exchange. options can +// be used to pass additional JSON-structured options to the remote server. +func exchangeToken(ctx context.Context, endpoint string, request *stsTokenExchangeRequest, authentication clientAuthentication, headers http.Header, options map[string]interface{}) (*stsTokenExchangeResponse, error) { + + client := oauth2.NewClient(ctx, nil) + + data := url.Values{} + data.Set("audience", request.Audience) + data.Set("grant_type", "urn:ietf:params:oauth:grant-type:token-exchange") + data.Set("requested_token_type", "urn:ietf:params:oauth:token-type:access_token") + data.Set("subject_token_type", request.SubjectTokenType) + data.Set("subject_token", request.SubjectToken) + data.Set("scope", strings.Join(request.Scope, " ")) + if options != nil { + opts, err := json.Marshal(options) + if err != nil { + return nil, fmt.Errorf("oauth2/google: failed to marshal additional options: %v", err) + } + data.Set("options", string(opts)) + } + + authentication.InjectAuthentication(data, headers) + encodedData := data.Encode() + + req, err := http.NewRequest("POST", endpoint, strings.NewReader(encodedData)) + if err != nil { + return nil, fmt.Errorf("oauth2/google: failed to properly build http request: %v", err) + + } + req = req.WithContext(ctx) + for key, list := range headers { + for _, val := range list { + req.Header.Add(key, val) + } + } + req.Header.Add("Content-Length", strconv.Itoa(len(encodedData))) + + resp, err := client.Do(req) + + if err != nil { + return nil, fmt.Errorf("oauth2/google: invalid response from Secure Token Server: %v", err) + } + defer resp.Body.Close() + + body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if c := resp.StatusCode; c < 200 || c > 299 { + return nil, fmt.Errorf("oauth2/google: status code %d: %s", c, body) + } + var stsResp stsTokenExchangeResponse + err = json.Unmarshal(body, &stsResp) + if err != nil { + return nil, fmt.Errorf("oauth2/google: failed to unmarshal response body from Secure Token Server: %v", err) + + } + + return &stsResp, nil +} + +// stsTokenExchangeRequest contains fields necessary to make an oauth2 token exchange. +type stsTokenExchangeRequest struct { + ActingParty struct { + ActorToken string + ActorTokenType string + } + GrantType string + Resource string + Audience string + Scope []string + RequestedTokenType string + SubjectToken string + SubjectTokenType string +} + +// stsTokenExchangeResponse is used to decode the remote server response during an oauth2 token exchange. +type stsTokenExchangeResponse struct { + AccessToken string `json:"access_token"` + IssuedTokenType string `json:"issued_token_type"` + TokenType string `json:"token_type"` + ExpiresIn int `json:"expires_in"` + Scope string `json:"scope"` + RefreshToken string `json:"refresh_token"` +} diff --git a/vendor/golang.org/x/oauth2/google/internal/externalaccount/urlcredsource.go b/vendor/golang.org/x/oauth2/google/internal/externalaccount/urlcredsource.go new file mode 100644 index 0000000000..91b8f2002a --- /dev/null +++ b/vendor/golang.org/x/oauth2/google/internal/externalaccount/urlcredsource.go @@ -0,0 +1,74 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package externalaccount + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "golang.org/x/oauth2" + "io" + "io/ioutil" + "net/http" +) + +type urlCredentialSource struct { + URL string + Headers map[string]string + Format format + ctx context.Context +} + +func (cs urlCredentialSource) subjectToken() (string, error) { + client := oauth2.NewClient(cs.ctx, nil) + req, err := http.NewRequest("GET", cs.URL, nil) + if err != nil { + return "", fmt.Errorf("oauth2/google: HTTP request for URL-sourced credential failed: %v", err) + } + req = req.WithContext(cs.ctx) + + for key, val := range cs.Headers { + req.Header.Add(key, val) + } + resp, err := client.Do(req) + if err != nil { + return "", fmt.Errorf("oauth2/google: invalid response when retrieving subject token: %v", err) + } + defer resp.Body.Close() + + respBody, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return "", fmt.Errorf("oauth2/google: invalid body in subject token URL query: %v", err) + } + if c := resp.StatusCode; c < 200 || c > 299 { + return "", fmt.Errorf("oauth2/google: status code %d: %s", c, respBody) + } + + switch cs.Format.Type { + case "json": + jsonData := make(map[string]interface{}) + err = json.Unmarshal(respBody, &jsonData) + if err != nil { + return "", fmt.Errorf("oauth2/google: failed to unmarshal subject token file: %v", err) + } + val, ok := jsonData[cs.Format.SubjectTokenFieldName] + if !ok { + return "", errors.New("oauth2/google: provided subject_token_field_name not found in credentials") + } + token, ok := val.(string) + if !ok { + return "", errors.New("oauth2/google: improperly formatted subject token") + } + return token, nil + case "text": + return string(respBody), nil + case "": + return string(respBody), nil + default: + return "", errors.New("oauth2/google: invalid credential_source file format type") + } + +} diff --git a/vendor/golang.org/x/oauth2/internal/client_appengine.go b/vendor/golang.org/x/oauth2/internal/client_appengine.go index 7434871880..e1755d1d9a 100644 --- a/vendor/golang.org/x/oauth2/internal/client_appengine.go +++ b/vendor/golang.org/x/oauth2/internal/client_appengine.go @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. +//go:build appengine // +build appengine package internal diff --git a/vendor/golang.org/x/sys/unix/ifreq_linux.go b/vendor/golang.org/x/sys/unix/ifreq_linux.go new file mode 100644 index 0000000000..fd3eeccc3c --- /dev/null +++ b/vendor/golang.org/x/sys/unix/ifreq_linux.go @@ -0,0 +1,109 @@ +// Copyright 2021 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux +// +build linux + +package unix + +import ( + "bytes" + "unsafe" +) + +// Helpers for dealing with ifreq since it contains a union and thus requires a +// lot of unsafe.Pointer casts to use properly. + +// An Ifreq is a type-safe wrapper around the raw ifreq struct. An Ifreq +// contains an interface name and a union of arbitrary data which can be +// accessed using the Ifreq's methods. To create an Ifreq, use the NewIfreq +// function. +// +// Use the Name method to access the stored interface name. The union data +// fields can be get and set using the following methods: +// - Uint16/SetUint16: flags +// - Uint32/SetUint32: ifindex, metric, mtu +type Ifreq struct{ raw ifreq } + +// NewIfreq creates an Ifreq with the input network interface name after +// validating the name does not exceed IFNAMSIZ-1 (trailing NULL required) +// bytes. +func NewIfreq(name string) (*Ifreq, error) { + // Leave room for terminating NULL byte. + if len(name) >= IFNAMSIZ { + return nil, EINVAL + } + + var ifr ifreq + copy(ifr.Ifrn[:], name) + + return &Ifreq{raw: ifr}, nil +} + +// TODO(mdlayher): get/set methods for sockaddr, char array, etc. + +// Name returns the interface name associated with the Ifreq. +func (ifr *Ifreq) Name() string { + // BytePtrToString requires a NULL terminator or the program may crash. If + // one is not present, just return the empty string. + if !bytes.Contains(ifr.raw.Ifrn[:], []byte{0x00}) { + return "" + } + + return BytePtrToString(&ifr.raw.Ifrn[0]) +} + +// Uint16 returns the Ifreq union data as a C short/Go uint16 value. +func (ifr *Ifreq) Uint16() uint16 { + return *(*uint16)(unsafe.Pointer(&ifr.raw.Ifru[:2][0])) +} + +// SetUint16 sets a C short/Go uint16 value as the Ifreq's union data. +func (ifr *Ifreq) SetUint16(v uint16) { + ifr.clear() + *(*uint16)(unsafe.Pointer(&ifr.raw.Ifru[:2][0])) = v +} + +// Uint32 returns the Ifreq union data as a C int/Go uint32 value. +func (ifr *Ifreq) Uint32() uint32 { + return *(*uint32)(unsafe.Pointer(&ifr.raw.Ifru[:4][0])) +} + +// SetUint32 sets a C int/Go uint32 value as the Ifreq's union data. +func (ifr *Ifreq) SetUint32(v uint32) { + ifr.clear() + *(*uint32)(unsafe.Pointer(&ifr.raw.Ifru[:4][0])) = v +} + +// clear zeroes the ifreq's union field to prevent trailing garbage data from +// being sent to the kernel if an ifreq is reused. +func (ifr *Ifreq) clear() { + for i := range ifr.raw.Ifru { + ifr.raw.Ifru[i] = 0 + } +} + +// TODO(mdlayher): export as IfreqData? For now we can provide helpers such as +// IoctlGetEthtoolDrvinfo which use these APIs under the hood. + +// An ifreqData is an Ifreq which carries pointer data. To produce an ifreqData, +// use the Ifreq.withData method. +type ifreqData struct { + name [IFNAMSIZ]byte + // A type separate from ifreq is required in order to comply with the + // unsafe.Pointer rules since the "pointer-ness" of data would not be + // preserved if it were cast into the byte array of a raw ifreq. + data unsafe.Pointer + // Pad to the same size as ifreq. + _ [len(ifreq{}.Ifru) - SizeofPtr]byte +} + +// withData produces an ifreqData with the pointer p set for ioctls which require +// arbitrary pointer data. +func (ifr Ifreq) withData(p unsafe.Pointer) ifreqData { + return ifreqData{ + name: ifr.raw.Ifrn, + data: p, + } +} diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 48773f730a..1dadead21e 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -5,7 +5,6 @@ package unix import ( - "runtime" "unsafe" ) @@ -22,56 +21,42 @@ func IoctlRetInt(fd int, req uint) (int, error) { func IoctlGetUint32(fd int, req uint) (uint32, error) { var value uint32 - err := ioctl(fd, req, uintptr(unsafe.Pointer(&value))) + err := ioctlPtr(fd, req, unsafe.Pointer(&value)) return value, err } func IoctlGetRTCTime(fd int) (*RTCTime, error) { var value RTCTime - err := ioctl(fd, RTC_RD_TIME, uintptr(unsafe.Pointer(&value))) + err := ioctlPtr(fd, RTC_RD_TIME, unsafe.Pointer(&value)) return &value, err } func IoctlSetRTCTime(fd int, value *RTCTime) error { - err := ioctl(fd, RTC_SET_TIME, uintptr(unsafe.Pointer(value))) - runtime.KeepAlive(value) - return err + return ioctlPtr(fd, RTC_SET_TIME, unsafe.Pointer(value)) } func IoctlGetRTCWkAlrm(fd int) (*RTCWkAlrm, error) { var value RTCWkAlrm - err := ioctl(fd, RTC_WKALM_RD, uintptr(unsafe.Pointer(&value))) + err := ioctlPtr(fd, RTC_WKALM_RD, unsafe.Pointer(&value)) return &value, err } func IoctlSetRTCWkAlrm(fd int, value *RTCWkAlrm) error { - err := ioctl(fd, RTC_WKALM_SET, uintptr(unsafe.Pointer(value))) - runtime.KeepAlive(value) - return err -} - -type ifreqEthtool struct { - name [IFNAMSIZ]byte - data unsafe.Pointer + return ioctlPtr(fd, RTC_WKALM_SET, unsafe.Pointer(value)) } // IoctlGetEthtoolDrvinfo fetches ethtool driver information for the network // device specified by ifname. func IoctlGetEthtoolDrvinfo(fd int, ifname string) (*EthtoolDrvinfo, error) { - // Leave room for terminating NULL byte. - if len(ifname) >= IFNAMSIZ { - return nil, EINVAL + ifr, err := NewIfreq(ifname) + if err != nil { + return nil, err } - value := EthtoolDrvinfo{ - Cmd: ETHTOOL_GDRVINFO, - } - ifreq := ifreqEthtool{ - data: unsafe.Pointer(&value), - } - copy(ifreq.name[:], ifname) - err := ioctl(fd, SIOCETHTOOL, uintptr(unsafe.Pointer(&ifreq))) - runtime.KeepAlive(ifreq) + value := EthtoolDrvinfo{Cmd: ETHTOOL_GDRVINFO} + ifrd := ifr.withData(unsafe.Pointer(&value)) + + err = ioctlIfreqData(fd, SIOCETHTOOL, &ifrd) return &value, err } @@ -80,7 +65,7 @@ func IoctlGetEthtoolDrvinfo(fd int, ifname string) (*EthtoolDrvinfo, error) { // https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html. func IoctlGetWatchdogInfo(fd int) (*WatchdogInfo, error) { var value WatchdogInfo - err := ioctl(fd, WDIOC_GETSUPPORT, uintptr(unsafe.Pointer(&value))) + err := ioctlPtr(fd, WDIOC_GETSUPPORT, unsafe.Pointer(&value)) return &value, err } @@ -88,6 +73,7 @@ func IoctlGetWatchdogInfo(fd int) (*WatchdogInfo, error) { // more information, see: // https://www.kernel.org/doc/html/latest/watchdog/watchdog-api.html. func IoctlWatchdogKeepalive(fd int) error { + // arg is ignored and not a pointer, so ioctl is fine instead of ioctlPtr. return ioctl(fd, WDIOC_KEEPALIVE, 0) } @@ -95,9 +81,7 @@ func IoctlWatchdogKeepalive(fd int) error { // range of data conveyed in value to the file associated with the file // descriptor destFd. See the ioctl_ficlonerange(2) man page for details. func IoctlFileCloneRange(destFd int, value *FileCloneRange) error { - err := ioctl(destFd, FICLONERANGE, uintptr(unsafe.Pointer(value))) - runtime.KeepAlive(value) - return err + return ioctlPtr(destFd, FICLONERANGE, unsafe.Pointer(value)) } // IoctlFileClone performs an FICLONE ioctl operation to clone the entire file @@ -148,7 +132,7 @@ func IoctlFileDedupeRange(srcFd int, value *FileDedupeRange) error { rawinfo.Reserved = value.Info[i].Reserved } - err := ioctl(srcFd, FIDEDUPERANGE, uintptr(unsafe.Pointer(&buf[0]))) + err := ioctlPtr(srcFd, FIDEDUPERANGE, unsafe.Pointer(&buf[0])) // Output for i := range value.Info { @@ -166,31 +150,47 @@ func IoctlFileDedupeRange(srcFd int, value *FileDedupeRange) error { } func IoctlHIDGetDesc(fd int, value *HIDRawReportDescriptor) error { - err := ioctl(fd, HIDIOCGRDESC, uintptr(unsafe.Pointer(value))) - runtime.KeepAlive(value) - return err + return ioctlPtr(fd, HIDIOCGRDESC, unsafe.Pointer(value)) } func IoctlHIDGetRawInfo(fd int) (*HIDRawDevInfo, error) { var value HIDRawDevInfo - err := ioctl(fd, HIDIOCGRAWINFO, uintptr(unsafe.Pointer(&value))) + err := ioctlPtr(fd, HIDIOCGRAWINFO, unsafe.Pointer(&value)) return &value, err } func IoctlHIDGetRawName(fd int) (string, error) { var value [_HIDIOCGRAWNAME_LEN]byte - err := ioctl(fd, _HIDIOCGRAWNAME, uintptr(unsafe.Pointer(&value[0]))) + err := ioctlPtr(fd, _HIDIOCGRAWNAME, unsafe.Pointer(&value[0])) return ByteSliceToString(value[:]), err } func IoctlHIDGetRawPhys(fd int) (string, error) { var value [_HIDIOCGRAWPHYS_LEN]byte - err := ioctl(fd, _HIDIOCGRAWPHYS, uintptr(unsafe.Pointer(&value[0]))) + err := ioctlPtr(fd, _HIDIOCGRAWPHYS, unsafe.Pointer(&value[0])) return ByteSliceToString(value[:]), err } func IoctlHIDGetRawUniq(fd int) (string, error) { var value [_HIDIOCGRAWUNIQ_LEN]byte - err := ioctl(fd, _HIDIOCGRAWUNIQ, uintptr(unsafe.Pointer(&value[0]))) + err := ioctlPtr(fd, _HIDIOCGRAWUNIQ, unsafe.Pointer(&value[0])) return ByteSliceToString(value[:]), err } + +// IoctlIfreq performs an ioctl using an Ifreq structure for input and/or +// output. See the netdevice(7) man page for details. +func IoctlIfreq(fd int, req uint, value *Ifreq) error { + // It is possible we will add more fields to *Ifreq itself later to prevent + // misuse, so pass the raw *ifreq directly. + return ioctlPtr(fd, req, unsafe.Pointer(&value.raw)) +} + +// TODO(mdlayher): export if and when IfreqData is exported. + +// ioctlIfreqData performs an ioctl using an ifreqData structure for input +// and/or output. See the netdevice(7) man page for details. +func ioctlIfreqData(fd int, req uint, value *ifreqData) error { + // The memory layout of IfreqData (type-safe) and ifreq (not type-safe) are + // identical so pass *IfreqData directly. + return ioctlPtr(fd, req, unsafe.Pointer(value)) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 6e6afcaa1d..2ed4b6d920 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -217,8 +217,6 @@ struct ltchars { #include #include #include -#include -#include #include #include #include diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 41b91fdfba..43569fe7c5 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -66,11 +66,18 @@ func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { return fchmodat(dirfd, path, mode) } -//sys ioctl(fd int, req uint, arg uintptr) (err error) +//sys ioctl(fd int, req uint, arg uintptr) (err error) = SYS_IOCTL +//sys ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) = SYS_IOCTL -// ioctl itself should not be exposed directly, but additional get/set -// functions for specific types are permissible. -// These are defined in ioctl.go and ioctl_linux.go. +// ioctl itself should not be exposed directly, but additional get/set functions +// for specific types are permissible. These are defined in ioctl.go and +// ioctl_linux.go. +// +// The third argument to ioctl is often a pointer but sometimes an integer. +// Callers should use ioctlPtr when the third argument is a pointer and ioctl +// when the third argument is an integer. +// +// TODO: some existing code incorrectly uses ioctl when it should use ioctlPtr. //sys Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) @@ -1859,7 +1866,7 @@ func Getpgrp() (pid int) { //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT -//sysnb prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 +//sysnb Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) = SYS_PRLIMIT64 //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) //sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 //sys read(fd int, p []byte) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_386.go b/vendor/golang.org/x/sys/unix/syscall_linux_386.go index b430536c8a..91317d749a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_386.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_386.go @@ -105,7 +105,7 @@ const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) func Getrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, nil, rlim) + err = Prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } @@ -133,7 +133,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, rlim, nil) + err = Prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go index 39a864d4e9..b961a620e9 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm.go @@ -184,7 +184,7 @@ const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) func Getrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, nil, rlim) + err = Prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } @@ -212,7 +212,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, rlim, nil) + err = Prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index 7f27ebf2fc..4b977ba44b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -171,7 +171,7 @@ func Pipe2(p []int, flags int) (err error) { // Getrlimit prefers the prlimit64 system call. See issue 38604. func Getrlimit(resource int, rlim *Rlimit) error { - err := prlimit(0, resource, nil, rlim) + err := Prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } @@ -180,7 +180,7 @@ func Getrlimit(resource int, rlim *Rlimit) error { // Setrlimit prefers the prlimit64 system call. See issue 38604. func Setrlimit(resource int, rlim *Rlimit) error { - err := prlimit(0, resource, rlim, nil) + err := Prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go index 3a5621e37f..21d74e2fbe 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go @@ -157,7 +157,7 @@ type rlimit32 struct { //sysnb getrlimit(resource int, rlim *rlimit32) (err error) = SYS_GETRLIMIT func Getrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, nil, rlim) + err = Prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } @@ -185,7 +185,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, rlim, nil) + err = Prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go index cf0d36f76e..e475d09663 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_ppc.go @@ -143,7 +143,7 @@ const rlimInf32 = ^uint32(0) const rlimInf64 = ^uint64(0) func Getrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, nil, rlim) + err = Prlimit(0, resource, nil, rlim) if err != ENOSYS { return err } @@ -171,7 +171,7 @@ func Getrlimit(resource int, rlim *Rlimit) (err error) { //sysnb setrlimit(resource int, rlim *rlimit32) (err error) = SYS_SETRLIMIT func Setrlimit(resource int, rlim *Rlimit) (err error) { - err = prlimit(0, resource, rlim, nil) + err = Prlimit(0, resource, rlim, nil) if err != ENOSYS { return err } diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 77fcde7c18..d2a6495c7e 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -13,7 +13,10 @@ package unix import ( + "fmt" + "os" "runtime" + "sync" "syscall" "unsafe" ) @@ -744,3 +747,240 @@ func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, e func Munmap(b []byte) (err error) { return mapper.Munmap(b) } + +// Event Ports + +type fileObjCookie struct { + fobj *fileObj + cookie interface{} +} + +// EventPort provides a safe abstraction on top of Solaris/illumos Event Ports. +type EventPort struct { + port int + mu sync.Mutex + fds map[uintptr]interface{} + paths map[string]*fileObjCookie +} + +// PortEvent is an abstraction of the port_event C struct. +// Compare Source against PORT_SOURCE_FILE or PORT_SOURCE_FD +// to see if Path or Fd was the event source. The other will be +// uninitialized. +type PortEvent struct { + Cookie interface{} + Events int32 + Fd uintptr + Path string + Source uint16 + fobj *fileObj +} + +// NewEventPort creates a new EventPort including the +// underlying call to port_create(3c). +func NewEventPort() (*EventPort, error) { + port, err := port_create() + if err != nil { + return nil, err + } + e := &EventPort{ + port: port, + fds: make(map[uintptr]interface{}), + paths: make(map[string]*fileObjCookie), + } + return e, nil +} + +//sys port_create() (n int, err error) +//sys port_associate(port int, source int, object uintptr, events int, user *byte) (n int, err error) +//sys port_dissociate(port int, source int, object uintptr) (n int, err error) +//sys port_get(port int, pe *portEvent, timeout *Timespec) (n int, err error) +//sys port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Timespec) (n int, err error) + +// Close closes the event port. +func (e *EventPort) Close() error { + e.mu.Lock() + defer e.mu.Unlock() + e.fds = nil + e.paths = nil + return Close(e.port) +} + +// PathIsWatched checks to see if path is associated with this EventPort. +func (e *EventPort) PathIsWatched(path string) bool { + e.mu.Lock() + defer e.mu.Unlock() + _, found := e.paths[path] + return found +} + +// FdIsWatched checks to see if fd is associated with this EventPort. +func (e *EventPort) FdIsWatched(fd uintptr) bool { + e.mu.Lock() + defer e.mu.Unlock() + _, found := e.fds[fd] + return found +} + +// AssociatePath wraps port_associate(3c) for a filesystem path including +// creating the necessary file_obj from the provided stat information. +func (e *EventPort) AssociatePath(path string, stat os.FileInfo, events int, cookie interface{}) error { + e.mu.Lock() + defer e.mu.Unlock() + if _, found := e.paths[path]; found { + return fmt.Errorf("%v is already associated with this Event Port", path) + } + fobj, err := createFileObj(path, stat) + if err != nil { + return err + } + fCookie := &fileObjCookie{fobj, cookie} + _, err = port_associate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(fobj)), events, (*byte)(unsafe.Pointer(&fCookie.cookie))) + if err != nil { + return err + } + e.paths[path] = fCookie + return nil +} + +// DissociatePath wraps port_dissociate(3c) for a filesystem path. +func (e *EventPort) DissociatePath(path string) error { + e.mu.Lock() + defer e.mu.Unlock() + f, ok := e.paths[path] + if !ok { + return fmt.Errorf("%v is not associated with this Event Port", path) + } + _, err := port_dissociate(e.port, PORT_SOURCE_FILE, uintptr(unsafe.Pointer(f.fobj))) + if err != nil { + return err + } + delete(e.paths, path) + return nil +} + +// AssociateFd wraps calls to port_associate(3c) on file descriptors. +func (e *EventPort) AssociateFd(fd uintptr, events int, cookie interface{}) error { + e.mu.Lock() + defer e.mu.Unlock() + if _, found := e.fds[fd]; found { + return fmt.Errorf("%v is already associated with this Event Port", fd) + } + pcookie := &cookie + _, err := port_associate(e.port, PORT_SOURCE_FD, fd, events, (*byte)(unsafe.Pointer(pcookie))) + if err != nil { + return err + } + e.fds[fd] = pcookie + return nil +} + +// DissociateFd wraps calls to port_dissociate(3c) on file descriptors. +func (e *EventPort) DissociateFd(fd uintptr) error { + e.mu.Lock() + defer e.mu.Unlock() + _, ok := e.fds[fd] + if !ok { + return fmt.Errorf("%v is not associated with this Event Port", fd) + } + _, err := port_dissociate(e.port, PORT_SOURCE_FD, fd) + if err != nil { + return err + } + delete(e.fds, fd) + return nil +} + +func createFileObj(name string, stat os.FileInfo) (*fileObj, error) { + fobj := new(fileObj) + bs, err := ByteSliceFromString(name) + if err != nil { + return nil, err + } + fobj.Name = (*int8)(unsafe.Pointer(&bs[0])) + s := stat.Sys().(*syscall.Stat_t) + fobj.Atim.Sec = s.Atim.Sec + fobj.Atim.Nsec = s.Atim.Nsec + fobj.Mtim.Sec = s.Mtim.Sec + fobj.Mtim.Nsec = s.Mtim.Nsec + fobj.Ctim.Sec = s.Ctim.Sec + fobj.Ctim.Nsec = s.Ctim.Nsec + return fobj, nil +} + +// GetOne wraps port_get(3c) and returns a single PortEvent. +func (e *EventPort) GetOne(t *Timespec) (*PortEvent, error) { + pe := new(portEvent) + _, err := port_get(e.port, pe, t) + if err != nil { + return nil, err + } + p := new(PortEvent) + p.Events = pe.Events + p.Source = pe.Source + e.mu.Lock() + defer e.mu.Unlock() + switch pe.Source { + case PORT_SOURCE_FD: + p.Fd = uintptr(pe.Object) + cookie := (*interface{})(unsafe.Pointer(pe.User)) + p.Cookie = *cookie + delete(e.fds, p.Fd) + case PORT_SOURCE_FILE: + p.fobj = (*fileObj)(unsafe.Pointer(uintptr(pe.Object))) + p.Path = BytePtrToString((*byte)(unsafe.Pointer(p.fobj.Name))) + cookie := (*interface{})(unsafe.Pointer(pe.User)) + p.Cookie = *cookie + delete(e.paths, p.Path) + } + return p, nil +} + +// Pending wraps port_getn(3c) and returns how many events are pending. +func (e *EventPort) Pending() (int, error) { + var n uint32 = 0 + _, err := port_getn(e.port, nil, 0, &n, nil) + return int(n), err +} + +// Get wraps port_getn(3c) and fills a slice of PortEvent. +// It will block until either min events have been received +// or the timeout has been exceeded. It will return how many +// events were actually received along with any error information. +func (e *EventPort) Get(s []PortEvent, min int, timeout *Timespec) (int, error) { + if min == 0 { + return 0, fmt.Errorf("need to request at least one event or use Pending() instead") + } + if len(s) < min { + return 0, fmt.Errorf("len(s) (%d) is less than min events requested (%d)", len(s), min) + } + got := uint32(min) + max := uint32(len(s)) + var err error + ps := make([]portEvent, max, max) + _, err = port_getn(e.port, &ps[0], max, &got, timeout) + // got will be trustworthy with ETIME, but not any other error. + if err != nil && err != ETIME { + return 0, err + } + e.mu.Lock() + defer e.mu.Unlock() + for i := 0; i < int(got); i++ { + s[i].Events = ps[i].Events + s[i].Source = ps[i].Source + switch ps[i].Source { + case PORT_SOURCE_FD: + s[i].Fd = uintptr(ps[i].Object) + cookie := (*interface{})(unsafe.Pointer(ps[i].User)) + s[i].Cookie = *cookie + delete(e.fds, s[i].Fd) + case PORT_SOURCE_FILE: + s[i].fobj = (*fileObj)(unsafe.Pointer(uintptr(ps[i].Object))) + s[i].Path = BytePtrToString((*byte)(unsafe.Pointer(s[i].fobj.Name))) + cookie := (*interface{})(unsafe.Pointer(ps[i].User)) + s[i].Cookie = *cookie + delete(e.paths, s[i].Path) + } + } + return int(got), err +} diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index a7618ceb55..cf296a2433 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -313,6 +313,10 @@ func Recvfrom(fd int, p []byte, flags int) (n int, from Sockaddr, err error) { return } +func Send(s int, buf []byte, flags int) (err error) { + return sendto(s, buf, flags, nil, 0) +} + func Sendto(fd int, p []byte, flags int, to Sockaddr) (err error) { ptr, n, err := to.sockaddr() if err != nil { diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 52f5bbc14c..5ed10c4a0b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -228,6 +228,8 @@ const ( BPF_OR = 0x40 BPF_PSEUDO_BTF_ID = 0x3 BPF_PSEUDO_CALL = 0x1 + BPF_PSEUDO_FUNC = 0x4 + BPF_PSEUDO_KFUNC_CALL = 0x2 BPF_PSEUDO_MAP_FD = 0x1 BPF_PSEUDO_MAP_VALUE = 0x2 BPF_RET = 0x6 @@ -475,6 +477,8 @@ const ( DM_LIST_VERSIONS = 0xc138fd0d DM_MAX_TYPE_NAME = 0x10 DM_NAME_LEN = 0x80 + DM_NAME_LIST_FLAG_DOESNT_HAVE_UUID = 0x2 + DM_NAME_LIST_FLAG_HAS_UUID = 0x1 DM_NOFLUSH_FLAG = 0x800 DM_PERSISTENT_DEV_FLAG = 0x8 DM_QUERY_INACTIVE_TABLE_FLAG = 0x1000 @@ -494,9 +498,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2021-02-01)" + DM_VERSION_EXTRA = "-ioctl (2021-03-22)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2c + DM_VERSION_MINOR = 0x2d DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -981,12 +985,6 @@ const ( HPFS_SUPER_MAGIC = 0xf995e849 HUGETLBFS_MAGIC = 0x958458f6 IBSHIFT = 0x10 - ICMPV6_FILTER = 0x1 - ICMPV6_FILTER_BLOCK = 0x1 - ICMPV6_FILTER_BLOCKOTHERS = 0x3 - ICMPV6_FILTER_PASS = 0x2 - ICMPV6_FILTER_PASSONLY = 0x4 - ICMP_FILTER = 0x1 ICRNL = 0x100 IFA_F_DADFAILED = 0x8 IFA_F_DEPRECATED = 0x20 @@ -1257,6 +1255,7 @@ const ( KEXEC_ARCH_PARISC = 0xf0000 KEXEC_ARCH_PPC = 0x140000 KEXEC_ARCH_PPC64 = 0x150000 + KEXEC_ARCH_RISCV = 0xf30000 KEXEC_ARCH_S390 = 0x160000 KEXEC_ARCH_SH = 0x2a0000 KEXEC_ARCH_X86_64 = 0x3e0000 @@ -1756,14 +1755,19 @@ const ( PERF_ATTR_SIZE_VER4 = 0x68 PERF_ATTR_SIZE_VER5 = 0x70 PERF_ATTR_SIZE_VER6 = 0x78 + PERF_ATTR_SIZE_VER7 = 0x80 PERF_AUX_FLAG_COLLISION = 0x8 + PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT = 0x0 + PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW = 0x100 PERF_AUX_FLAG_OVERWRITE = 0x2 PERF_AUX_FLAG_PARTIAL = 0x4 + PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK = 0xff00 PERF_AUX_FLAG_TRUNCATED = 0x1 PERF_FLAG_FD_CLOEXEC = 0x8 PERF_FLAG_FD_NO_GROUP = 0x1 PERF_FLAG_FD_OUTPUT = 0x2 PERF_FLAG_PID_CGROUP = 0x4 + PERF_HW_EVENT_MASK = 0xffffffff PERF_MAX_CONTEXTS_PER_STACK = 0x8 PERF_MAX_STACK_DEPTH = 0x7f PERF_MEM_BLK_ADDR = 0x4 @@ -1822,6 +1826,7 @@ const ( PERF_MEM_TLB_OS = 0x40 PERF_MEM_TLB_SHIFT = 0x1a PERF_MEM_TLB_WK = 0x20 + PERF_PMU_TYPE_SHIFT = 0x20 PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER = 0x1 PERF_RECORD_MISC_COMM_EXEC = 0x2000 PERF_RECORD_MISC_CPUMODE_MASK = 0x7 @@ -1921,7 +1926,9 @@ const ( PR_PAC_APGAKEY = 0x10 PR_PAC_APIAKEY = 0x1 PR_PAC_APIBKEY = 0x2 + PR_PAC_GET_ENABLED_KEYS = 0x3d PR_PAC_RESET_KEYS = 0x36 + PR_PAC_SET_ENABLED_KEYS = 0x3c PR_SET_CHILD_SUBREAPER = 0x24 PR_SET_DUMPABLE = 0x4 PR_SET_ENDIAN = 0x14 @@ -2003,6 +2010,7 @@ const ( PTRACE_GETREGSET = 0x4204 PTRACE_GETSIGINFO = 0x4202 PTRACE_GETSIGMASK = 0x420a + PTRACE_GET_RSEQ_CONFIGURATION = 0x420f PTRACE_GET_SYSCALL_INFO = 0x420e PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 @@ -2163,6 +2171,7 @@ const ( RTM_DELNEIGH = 0x1d RTM_DELNETCONF = 0x51 RTM_DELNEXTHOP = 0x69 + RTM_DELNEXTHOPBUCKET = 0x75 RTM_DELNSID = 0x59 RTM_DELQDISC = 0x25 RTM_DELROUTE = 0x19 @@ -2193,6 +2202,7 @@ const ( RTM_GETNEIGHTBL = 0x42 RTM_GETNETCONF = 0x52 RTM_GETNEXTHOP = 0x6a + RTM_GETNEXTHOPBUCKET = 0x76 RTM_GETNSID = 0x5a RTM_GETQDISC = 0x26 RTM_GETROUTE = 0x1a @@ -2201,7 +2211,7 @@ const ( RTM_GETTCLASS = 0x2a RTM_GETTFILTER = 0x2e RTM_GETVLAN = 0x72 - RTM_MAX = 0x73 + RTM_MAX = 0x77 RTM_NEWACTION = 0x30 RTM_NEWADDR = 0x14 RTM_NEWADDRLABEL = 0x48 @@ -2215,6 +2225,7 @@ const ( RTM_NEWNEIGHTBL = 0x40 RTM_NEWNETCONF = 0x50 RTM_NEWNEXTHOP = 0x68 + RTM_NEWNEXTHOPBUCKET = 0x74 RTM_NEWNSID = 0x58 RTM_NEWNVLAN = 0x70 RTM_NEWPREFIX = 0x34 @@ -2224,8 +2235,8 @@ const ( RTM_NEWSTATS = 0x5c RTM_NEWTCLASS = 0x28 RTM_NEWTFILTER = 0x2c - RTM_NR_FAMILIES = 0x19 - RTM_NR_MSGTYPES = 0x64 + RTM_NR_FAMILIES = 0x1a + RTM_NR_MSGTYPES = 0x68 RTM_SETDCB = 0x4f RTM_SETLINK = 0x13 RTM_SETNEIGHTBL = 0x43 @@ -2253,6 +2264,7 @@ const ( RTPROT_MROUTED = 0x11 RTPROT_MRT = 0xa RTPROT_NTK = 0xf + RTPROT_OPENR = 0x63 RTPROT_OSPF = 0xbc RTPROT_RA = 0x9 RTPROT_REDIRECT = 0x1 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index 09fc559ed2..cca248d1df 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -147,6 +147,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 75730cc22b..9521a4804a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -147,6 +147,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 127cf17add..ddb40a40d3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 957ca1ff13..3df31e0d42 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -148,6 +148,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 314a2054fc..179c7d68de 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 457e8de97d..84ab15a85d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index 33cd28f6bd..6aa064da5e 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 0e085ba147..960650f2b3 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 1b5928cffb..7365221d09 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -147,6 +147,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index f3a41d6ecb..5967db35c0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -147,6 +147,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 6a5a555d5e..f88869849b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -147,6 +147,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index a4da67edbb..8048706f39 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index a7028e0efb..fb78594174 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -145,6 +145,7 @@ const ( NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x400c4d19 OTPGETREGIONCOUNT = 0x40044d0e OTPGETREGIONINFO = 0x400c4d0f OTPLOCK = 0x800c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index ed3b3286c1..81e18d23ff 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -150,6 +150,7 @@ const ( NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 + OTPERASE = 0x800c4d19 OTPGETREGIONCOUNT = 0x80044d0e OTPGETREGIONINFO = 0x800c4d0f OTPLOCK = 0x400c4d10 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go index 593cc0feff..6d56edc05a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go @@ -1020,7 +1020,10 @@ const ( RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 diff --git a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go index a4e4c22314..aef6c08560 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go @@ -1020,7 +1020,10 @@ const ( RLIMIT_CPU = 0x0 RLIMIT_DATA = 0x2 RLIMIT_FSIZE = 0x1 + RLIMIT_MEMLOCK = 0x6 RLIMIT_NOFILE = 0x8 + RLIMIT_NPROC = 0x7 + RLIMIT_RSS = 0x5 RLIMIT_STACK = 0x3 RLIM_INFINITY = 0x7fffffffffffffff RTAX_AUTHOR = 0x6 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 7305cc915b..2dbe3da7a0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -48,6 +48,16 @@ func ioctl(fd int, req uint, arg uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { + _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Linkat(olddirfd int, oldpath string, newdirfd int, newpath string, flags int) (err error) { var _p0 *byte _p0, err = BytePtrFromString(oldpath) @@ -1201,7 +1211,7 @@ func PivotRoot(newroot string, putold string) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { +func Prlimit(pid int, resource int, newlimit *Rlimit, old *Rlimit) (err error) { _, _, e1 := RawSyscall6(SYS_PRLIMIT64, uintptr(pid), uintptr(resource), uintptr(unsafe.Pointer(newlimit)), uintptr(unsafe.Pointer(old)), 0, 0) if e1 != 0 { err = errnoErr(e1) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go index 4e18d5c99f..b5f926cee2 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go @@ -141,6 +141,11 @@ import ( //go:cgo_import_dynamic libc_getpeername getpeername "libsocket.so" //go:cgo_import_dynamic libc_setsockopt setsockopt "libsocket.so" //go:cgo_import_dynamic libc_recvfrom recvfrom "libsocket.so" +//go:cgo_import_dynamic libc_port_create port_create "libc.so" +//go:cgo_import_dynamic libc_port_associate port_associate "libc.so" +//go:cgo_import_dynamic libc_port_dissociate port_dissociate "libc.so" +//go:cgo_import_dynamic libc_port_get port_get "libc.so" +//go:cgo_import_dynamic libc_port_getn port_getn "libc.so" //go:linkname procpipe libc_pipe //go:linkname procpipe2 libc_pipe2 @@ -272,6 +277,11 @@ import ( //go:linkname procgetpeername libc_getpeername //go:linkname procsetsockopt libc_setsockopt //go:linkname procrecvfrom libc_recvfrom +//go:linkname procport_create libc_port_create +//go:linkname procport_associate libc_port_associate +//go:linkname procport_dissociate libc_port_dissociate +//go:linkname procport_get libc_port_get +//go:linkname procport_getn libc_port_getn var ( procpipe, @@ -403,7 +413,12 @@ var ( proc__xnet_getsockopt, procgetpeername, procsetsockopt, - procrecvfrom syscallFunc + procrecvfrom, + procport_create, + procport_associate, + procport_dissociate, + procport_get, + procport_getn syscallFunc ) // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT @@ -1981,3 +1996,58 @@ func recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Sockl } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func port_create() (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_create)), 0, 0, 0, 0, 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func port_associate(port int, source int, object uintptr, events int, user *byte) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_associate)), 5, uintptr(port), uintptr(source), uintptr(object), uintptr(events), uintptr(unsafe.Pointer(user)), 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func port_dissociate(port int, source int, object uintptr) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_dissociate)), 3, uintptr(port), uintptr(source), uintptr(object), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func port_get(port int, pe *portEvent, timeout *Timespec) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_get)), 3, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(unsafe.Pointer(timeout)), 0, 0, 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func port_getn(port int, pe *portEvent, max uint32, nget *uint32, timeout *Timespec) (n int, err error) { + r0, _, e1 := sysvicall6(uintptr(unsafe.Pointer(&procport_getn)), 5, uintptr(port), uintptr(unsafe.Pointer(pe)), uintptr(max), uintptr(unsafe.Pointer(nget)), uintptr(unsafe.Pointer(timeout)), 0) + n = int(r0) + if e1 != 0 { + err = e1 + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index fbc59b7fdd..eb3afe6789 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -439,4 +439,7 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 04d16d771e..8e7e3aedcf 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -7,358 +7,361 @@ package unix const ( - SYS_READ = 0 - SYS_WRITE = 1 - SYS_OPEN = 2 - SYS_CLOSE = 3 - SYS_STAT = 4 - SYS_FSTAT = 5 - SYS_LSTAT = 6 - SYS_POLL = 7 - SYS_LSEEK = 8 - SYS_MMAP = 9 - SYS_MPROTECT = 10 - SYS_MUNMAP = 11 - SYS_BRK = 12 - SYS_RT_SIGACTION = 13 - SYS_RT_SIGPROCMASK = 14 - SYS_RT_SIGRETURN = 15 - SYS_IOCTL = 16 - SYS_PREAD64 = 17 - SYS_PWRITE64 = 18 - SYS_READV = 19 - SYS_WRITEV = 20 - SYS_ACCESS = 21 - SYS_PIPE = 22 - SYS_SELECT = 23 - SYS_SCHED_YIELD = 24 - SYS_MREMAP = 25 - SYS_MSYNC = 26 - SYS_MINCORE = 27 - SYS_MADVISE = 28 - SYS_SHMGET = 29 - SYS_SHMAT = 30 - SYS_SHMCTL = 31 - SYS_DUP = 32 - SYS_DUP2 = 33 - SYS_PAUSE = 34 - SYS_NANOSLEEP = 35 - SYS_GETITIMER = 36 - SYS_ALARM = 37 - SYS_SETITIMER = 38 - SYS_GETPID = 39 - SYS_SENDFILE = 40 - SYS_SOCKET = 41 - SYS_CONNECT = 42 - SYS_ACCEPT = 43 - SYS_SENDTO = 44 - SYS_RECVFROM = 45 - SYS_SENDMSG = 46 - SYS_RECVMSG = 47 - SYS_SHUTDOWN = 48 - SYS_BIND = 49 - SYS_LISTEN = 50 - SYS_GETSOCKNAME = 51 - SYS_GETPEERNAME = 52 - SYS_SOCKETPAIR = 53 - SYS_SETSOCKOPT = 54 - SYS_GETSOCKOPT = 55 - SYS_CLONE = 56 - SYS_FORK = 57 - SYS_VFORK = 58 - SYS_EXECVE = 59 - SYS_EXIT = 60 - SYS_WAIT4 = 61 - SYS_KILL = 62 - SYS_UNAME = 63 - SYS_SEMGET = 64 - SYS_SEMOP = 65 - SYS_SEMCTL = 66 - SYS_SHMDT = 67 - SYS_MSGGET = 68 - SYS_MSGSND = 69 - SYS_MSGRCV = 70 - SYS_MSGCTL = 71 - SYS_FCNTL = 72 - SYS_FLOCK = 73 - SYS_FSYNC = 74 - SYS_FDATASYNC = 75 - SYS_TRUNCATE = 76 - SYS_FTRUNCATE = 77 - SYS_GETDENTS = 78 - SYS_GETCWD = 79 - SYS_CHDIR = 80 - SYS_FCHDIR = 81 - SYS_RENAME = 82 - SYS_MKDIR = 83 - SYS_RMDIR = 84 - SYS_CREAT = 85 - SYS_LINK = 86 - SYS_UNLINK = 87 - SYS_SYMLINK = 88 - SYS_READLINK = 89 - SYS_CHMOD = 90 - SYS_FCHMOD = 91 - SYS_CHOWN = 92 - SYS_FCHOWN = 93 - SYS_LCHOWN = 94 - SYS_UMASK = 95 - SYS_GETTIMEOFDAY = 96 - SYS_GETRLIMIT = 97 - SYS_GETRUSAGE = 98 - SYS_SYSINFO = 99 - SYS_TIMES = 100 - SYS_PTRACE = 101 - SYS_GETUID = 102 - SYS_SYSLOG = 103 - SYS_GETGID = 104 - SYS_SETUID = 105 - SYS_SETGID = 106 - SYS_GETEUID = 107 - SYS_GETEGID = 108 - SYS_SETPGID = 109 - SYS_GETPPID = 110 - SYS_GETPGRP = 111 - SYS_SETSID = 112 - SYS_SETREUID = 113 - SYS_SETREGID = 114 - SYS_GETGROUPS = 115 - SYS_SETGROUPS = 116 - SYS_SETRESUID = 117 - SYS_GETRESUID = 118 - SYS_SETRESGID = 119 - SYS_GETRESGID = 120 - SYS_GETPGID = 121 - SYS_SETFSUID = 122 - SYS_SETFSGID = 123 - SYS_GETSID = 124 - SYS_CAPGET = 125 - SYS_CAPSET = 126 - SYS_RT_SIGPENDING = 127 - SYS_RT_SIGTIMEDWAIT = 128 - SYS_RT_SIGQUEUEINFO = 129 - SYS_RT_SIGSUSPEND = 130 - SYS_SIGALTSTACK = 131 - SYS_UTIME = 132 - SYS_MKNOD = 133 - SYS_USELIB = 134 - SYS_PERSONALITY = 135 - SYS_USTAT = 136 - SYS_STATFS = 137 - SYS_FSTATFS = 138 - SYS_SYSFS = 139 - SYS_GETPRIORITY = 140 - SYS_SETPRIORITY = 141 - SYS_SCHED_SETPARAM = 142 - SYS_SCHED_GETPARAM = 143 - SYS_SCHED_SETSCHEDULER = 144 - SYS_SCHED_GETSCHEDULER = 145 - SYS_SCHED_GET_PRIORITY_MAX = 146 - SYS_SCHED_GET_PRIORITY_MIN = 147 - SYS_SCHED_RR_GET_INTERVAL = 148 - SYS_MLOCK = 149 - SYS_MUNLOCK = 150 - SYS_MLOCKALL = 151 - SYS_MUNLOCKALL = 152 - SYS_VHANGUP = 153 - SYS_MODIFY_LDT = 154 - SYS_PIVOT_ROOT = 155 - SYS__SYSCTL = 156 - SYS_PRCTL = 157 - SYS_ARCH_PRCTL = 158 - SYS_ADJTIMEX = 159 - SYS_SETRLIMIT = 160 - SYS_CHROOT = 161 - SYS_SYNC = 162 - SYS_ACCT = 163 - SYS_SETTIMEOFDAY = 164 - SYS_MOUNT = 165 - SYS_UMOUNT2 = 166 - SYS_SWAPON = 167 - SYS_SWAPOFF = 168 - SYS_REBOOT = 169 - SYS_SETHOSTNAME = 170 - SYS_SETDOMAINNAME = 171 - SYS_IOPL = 172 - SYS_IOPERM = 173 - SYS_CREATE_MODULE = 174 - SYS_INIT_MODULE = 175 - SYS_DELETE_MODULE = 176 - SYS_GET_KERNEL_SYMS = 177 - SYS_QUERY_MODULE = 178 - SYS_QUOTACTL = 179 - SYS_NFSSERVCTL = 180 - SYS_GETPMSG = 181 - SYS_PUTPMSG = 182 - SYS_AFS_SYSCALL = 183 - SYS_TUXCALL = 184 - SYS_SECURITY = 185 - SYS_GETTID = 186 - SYS_READAHEAD = 187 - SYS_SETXATTR = 188 - SYS_LSETXATTR = 189 - SYS_FSETXATTR = 190 - SYS_GETXATTR = 191 - SYS_LGETXATTR = 192 - SYS_FGETXATTR = 193 - SYS_LISTXATTR = 194 - SYS_LLISTXATTR = 195 - SYS_FLISTXATTR = 196 - SYS_REMOVEXATTR = 197 - SYS_LREMOVEXATTR = 198 - SYS_FREMOVEXATTR = 199 - SYS_TKILL = 200 - SYS_TIME = 201 - SYS_FUTEX = 202 - SYS_SCHED_SETAFFINITY = 203 - SYS_SCHED_GETAFFINITY = 204 - SYS_SET_THREAD_AREA = 205 - SYS_IO_SETUP = 206 - SYS_IO_DESTROY = 207 - SYS_IO_GETEVENTS = 208 - SYS_IO_SUBMIT = 209 - SYS_IO_CANCEL = 210 - SYS_GET_THREAD_AREA = 211 - SYS_LOOKUP_DCOOKIE = 212 - SYS_EPOLL_CREATE = 213 - SYS_EPOLL_CTL_OLD = 214 - SYS_EPOLL_WAIT_OLD = 215 - SYS_REMAP_FILE_PAGES = 216 - SYS_GETDENTS64 = 217 - SYS_SET_TID_ADDRESS = 218 - SYS_RESTART_SYSCALL = 219 - SYS_SEMTIMEDOP = 220 - SYS_FADVISE64 = 221 - SYS_TIMER_CREATE = 222 - SYS_TIMER_SETTIME = 223 - SYS_TIMER_GETTIME = 224 - SYS_TIMER_GETOVERRUN = 225 - SYS_TIMER_DELETE = 226 - SYS_CLOCK_SETTIME = 227 - SYS_CLOCK_GETTIME = 228 - SYS_CLOCK_GETRES = 229 - SYS_CLOCK_NANOSLEEP = 230 - SYS_EXIT_GROUP = 231 - SYS_EPOLL_WAIT = 232 - SYS_EPOLL_CTL = 233 - SYS_TGKILL = 234 - SYS_UTIMES = 235 - SYS_VSERVER = 236 - SYS_MBIND = 237 - SYS_SET_MEMPOLICY = 238 - SYS_GET_MEMPOLICY = 239 - SYS_MQ_OPEN = 240 - SYS_MQ_UNLINK = 241 - SYS_MQ_TIMEDSEND = 242 - SYS_MQ_TIMEDRECEIVE = 243 - SYS_MQ_NOTIFY = 244 - SYS_MQ_GETSETATTR = 245 - SYS_KEXEC_LOAD = 246 - SYS_WAITID = 247 - SYS_ADD_KEY = 248 - SYS_REQUEST_KEY = 249 - SYS_KEYCTL = 250 - SYS_IOPRIO_SET = 251 - SYS_IOPRIO_GET = 252 - SYS_INOTIFY_INIT = 253 - SYS_INOTIFY_ADD_WATCH = 254 - SYS_INOTIFY_RM_WATCH = 255 - SYS_MIGRATE_PAGES = 256 - SYS_OPENAT = 257 - SYS_MKDIRAT = 258 - SYS_MKNODAT = 259 - SYS_FCHOWNAT = 260 - SYS_FUTIMESAT = 261 - SYS_NEWFSTATAT = 262 - SYS_UNLINKAT = 263 - SYS_RENAMEAT = 264 - SYS_LINKAT = 265 - SYS_SYMLINKAT = 266 - SYS_READLINKAT = 267 - SYS_FCHMODAT = 268 - SYS_FACCESSAT = 269 - SYS_PSELECT6 = 270 - SYS_PPOLL = 271 - SYS_UNSHARE = 272 - SYS_SET_ROBUST_LIST = 273 - SYS_GET_ROBUST_LIST = 274 - SYS_SPLICE = 275 - SYS_TEE = 276 - SYS_SYNC_FILE_RANGE = 277 - SYS_VMSPLICE = 278 - SYS_MOVE_PAGES = 279 - SYS_UTIMENSAT = 280 - SYS_EPOLL_PWAIT = 281 - SYS_SIGNALFD = 282 - SYS_TIMERFD_CREATE = 283 - SYS_EVENTFD = 284 - SYS_FALLOCATE = 285 - SYS_TIMERFD_SETTIME = 286 - SYS_TIMERFD_GETTIME = 287 - SYS_ACCEPT4 = 288 - SYS_SIGNALFD4 = 289 - SYS_EVENTFD2 = 290 - SYS_EPOLL_CREATE1 = 291 - SYS_DUP3 = 292 - SYS_PIPE2 = 293 - SYS_INOTIFY_INIT1 = 294 - SYS_PREADV = 295 - SYS_PWRITEV = 296 - SYS_RT_TGSIGQUEUEINFO = 297 - SYS_PERF_EVENT_OPEN = 298 - SYS_RECVMMSG = 299 - SYS_FANOTIFY_INIT = 300 - SYS_FANOTIFY_MARK = 301 - SYS_PRLIMIT64 = 302 - SYS_NAME_TO_HANDLE_AT = 303 - SYS_OPEN_BY_HANDLE_AT = 304 - SYS_CLOCK_ADJTIME = 305 - SYS_SYNCFS = 306 - SYS_SENDMMSG = 307 - SYS_SETNS = 308 - SYS_GETCPU = 309 - SYS_PROCESS_VM_READV = 310 - SYS_PROCESS_VM_WRITEV = 311 - SYS_KCMP = 312 - SYS_FINIT_MODULE = 313 - SYS_SCHED_SETATTR = 314 - SYS_SCHED_GETATTR = 315 - SYS_RENAMEAT2 = 316 - SYS_SECCOMP = 317 - SYS_GETRANDOM = 318 - SYS_MEMFD_CREATE = 319 - SYS_KEXEC_FILE_LOAD = 320 - SYS_BPF = 321 - SYS_EXECVEAT = 322 - SYS_USERFAULTFD = 323 - SYS_MEMBARRIER = 324 - SYS_MLOCK2 = 325 - SYS_COPY_FILE_RANGE = 326 - SYS_PREADV2 = 327 - SYS_PWRITEV2 = 328 - SYS_PKEY_MPROTECT = 329 - SYS_PKEY_ALLOC = 330 - SYS_PKEY_FREE = 331 - SYS_STATX = 332 - SYS_IO_PGETEVENTS = 333 - SYS_RSEQ = 334 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_READ = 0 + SYS_WRITE = 1 + SYS_OPEN = 2 + SYS_CLOSE = 3 + SYS_STAT = 4 + SYS_FSTAT = 5 + SYS_LSTAT = 6 + SYS_POLL = 7 + SYS_LSEEK = 8 + SYS_MMAP = 9 + SYS_MPROTECT = 10 + SYS_MUNMAP = 11 + SYS_BRK = 12 + SYS_RT_SIGACTION = 13 + SYS_RT_SIGPROCMASK = 14 + SYS_RT_SIGRETURN = 15 + SYS_IOCTL = 16 + SYS_PREAD64 = 17 + SYS_PWRITE64 = 18 + SYS_READV = 19 + SYS_WRITEV = 20 + SYS_ACCESS = 21 + SYS_PIPE = 22 + SYS_SELECT = 23 + SYS_SCHED_YIELD = 24 + SYS_MREMAP = 25 + SYS_MSYNC = 26 + SYS_MINCORE = 27 + SYS_MADVISE = 28 + SYS_SHMGET = 29 + SYS_SHMAT = 30 + SYS_SHMCTL = 31 + SYS_DUP = 32 + SYS_DUP2 = 33 + SYS_PAUSE = 34 + SYS_NANOSLEEP = 35 + SYS_GETITIMER = 36 + SYS_ALARM = 37 + SYS_SETITIMER = 38 + SYS_GETPID = 39 + SYS_SENDFILE = 40 + SYS_SOCKET = 41 + SYS_CONNECT = 42 + SYS_ACCEPT = 43 + SYS_SENDTO = 44 + SYS_RECVFROM = 45 + SYS_SENDMSG = 46 + SYS_RECVMSG = 47 + SYS_SHUTDOWN = 48 + SYS_BIND = 49 + SYS_LISTEN = 50 + SYS_GETSOCKNAME = 51 + SYS_GETPEERNAME = 52 + SYS_SOCKETPAIR = 53 + SYS_SETSOCKOPT = 54 + SYS_GETSOCKOPT = 55 + SYS_CLONE = 56 + SYS_FORK = 57 + SYS_VFORK = 58 + SYS_EXECVE = 59 + SYS_EXIT = 60 + SYS_WAIT4 = 61 + SYS_KILL = 62 + SYS_UNAME = 63 + SYS_SEMGET = 64 + SYS_SEMOP = 65 + SYS_SEMCTL = 66 + SYS_SHMDT = 67 + SYS_MSGGET = 68 + SYS_MSGSND = 69 + SYS_MSGRCV = 70 + SYS_MSGCTL = 71 + SYS_FCNTL = 72 + SYS_FLOCK = 73 + SYS_FSYNC = 74 + SYS_FDATASYNC = 75 + SYS_TRUNCATE = 76 + SYS_FTRUNCATE = 77 + SYS_GETDENTS = 78 + SYS_GETCWD = 79 + SYS_CHDIR = 80 + SYS_FCHDIR = 81 + SYS_RENAME = 82 + SYS_MKDIR = 83 + SYS_RMDIR = 84 + SYS_CREAT = 85 + SYS_LINK = 86 + SYS_UNLINK = 87 + SYS_SYMLINK = 88 + SYS_READLINK = 89 + SYS_CHMOD = 90 + SYS_FCHMOD = 91 + SYS_CHOWN = 92 + SYS_FCHOWN = 93 + SYS_LCHOWN = 94 + SYS_UMASK = 95 + SYS_GETTIMEOFDAY = 96 + SYS_GETRLIMIT = 97 + SYS_GETRUSAGE = 98 + SYS_SYSINFO = 99 + SYS_TIMES = 100 + SYS_PTRACE = 101 + SYS_GETUID = 102 + SYS_SYSLOG = 103 + SYS_GETGID = 104 + SYS_SETUID = 105 + SYS_SETGID = 106 + SYS_GETEUID = 107 + SYS_GETEGID = 108 + SYS_SETPGID = 109 + SYS_GETPPID = 110 + SYS_GETPGRP = 111 + SYS_SETSID = 112 + SYS_SETREUID = 113 + SYS_SETREGID = 114 + SYS_GETGROUPS = 115 + SYS_SETGROUPS = 116 + SYS_SETRESUID = 117 + SYS_GETRESUID = 118 + SYS_SETRESGID = 119 + SYS_GETRESGID = 120 + SYS_GETPGID = 121 + SYS_SETFSUID = 122 + SYS_SETFSGID = 123 + SYS_GETSID = 124 + SYS_CAPGET = 125 + SYS_CAPSET = 126 + SYS_RT_SIGPENDING = 127 + SYS_RT_SIGTIMEDWAIT = 128 + SYS_RT_SIGQUEUEINFO = 129 + SYS_RT_SIGSUSPEND = 130 + SYS_SIGALTSTACK = 131 + SYS_UTIME = 132 + SYS_MKNOD = 133 + SYS_USELIB = 134 + SYS_PERSONALITY = 135 + SYS_USTAT = 136 + SYS_STATFS = 137 + SYS_FSTATFS = 138 + SYS_SYSFS = 139 + SYS_GETPRIORITY = 140 + SYS_SETPRIORITY = 141 + SYS_SCHED_SETPARAM = 142 + SYS_SCHED_GETPARAM = 143 + SYS_SCHED_SETSCHEDULER = 144 + SYS_SCHED_GETSCHEDULER = 145 + SYS_SCHED_GET_PRIORITY_MAX = 146 + SYS_SCHED_GET_PRIORITY_MIN = 147 + SYS_SCHED_RR_GET_INTERVAL = 148 + SYS_MLOCK = 149 + SYS_MUNLOCK = 150 + SYS_MLOCKALL = 151 + SYS_MUNLOCKALL = 152 + SYS_VHANGUP = 153 + SYS_MODIFY_LDT = 154 + SYS_PIVOT_ROOT = 155 + SYS__SYSCTL = 156 + SYS_PRCTL = 157 + SYS_ARCH_PRCTL = 158 + SYS_ADJTIMEX = 159 + SYS_SETRLIMIT = 160 + SYS_CHROOT = 161 + SYS_SYNC = 162 + SYS_ACCT = 163 + SYS_SETTIMEOFDAY = 164 + SYS_MOUNT = 165 + SYS_UMOUNT2 = 166 + SYS_SWAPON = 167 + SYS_SWAPOFF = 168 + SYS_REBOOT = 169 + SYS_SETHOSTNAME = 170 + SYS_SETDOMAINNAME = 171 + SYS_IOPL = 172 + SYS_IOPERM = 173 + SYS_CREATE_MODULE = 174 + SYS_INIT_MODULE = 175 + SYS_DELETE_MODULE = 176 + SYS_GET_KERNEL_SYMS = 177 + SYS_QUERY_MODULE = 178 + SYS_QUOTACTL = 179 + SYS_NFSSERVCTL = 180 + SYS_GETPMSG = 181 + SYS_PUTPMSG = 182 + SYS_AFS_SYSCALL = 183 + SYS_TUXCALL = 184 + SYS_SECURITY = 185 + SYS_GETTID = 186 + SYS_READAHEAD = 187 + SYS_SETXATTR = 188 + SYS_LSETXATTR = 189 + SYS_FSETXATTR = 190 + SYS_GETXATTR = 191 + SYS_LGETXATTR = 192 + SYS_FGETXATTR = 193 + SYS_LISTXATTR = 194 + SYS_LLISTXATTR = 195 + SYS_FLISTXATTR = 196 + SYS_REMOVEXATTR = 197 + SYS_LREMOVEXATTR = 198 + SYS_FREMOVEXATTR = 199 + SYS_TKILL = 200 + SYS_TIME = 201 + SYS_FUTEX = 202 + SYS_SCHED_SETAFFINITY = 203 + SYS_SCHED_GETAFFINITY = 204 + SYS_SET_THREAD_AREA = 205 + SYS_IO_SETUP = 206 + SYS_IO_DESTROY = 207 + SYS_IO_GETEVENTS = 208 + SYS_IO_SUBMIT = 209 + SYS_IO_CANCEL = 210 + SYS_GET_THREAD_AREA = 211 + SYS_LOOKUP_DCOOKIE = 212 + SYS_EPOLL_CREATE = 213 + SYS_EPOLL_CTL_OLD = 214 + SYS_EPOLL_WAIT_OLD = 215 + SYS_REMAP_FILE_PAGES = 216 + SYS_GETDENTS64 = 217 + SYS_SET_TID_ADDRESS = 218 + SYS_RESTART_SYSCALL = 219 + SYS_SEMTIMEDOP = 220 + SYS_FADVISE64 = 221 + SYS_TIMER_CREATE = 222 + SYS_TIMER_SETTIME = 223 + SYS_TIMER_GETTIME = 224 + SYS_TIMER_GETOVERRUN = 225 + SYS_TIMER_DELETE = 226 + SYS_CLOCK_SETTIME = 227 + SYS_CLOCK_GETTIME = 228 + SYS_CLOCK_GETRES = 229 + SYS_CLOCK_NANOSLEEP = 230 + SYS_EXIT_GROUP = 231 + SYS_EPOLL_WAIT = 232 + SYS_EPOLL_CTL = 233 + SYS_TGKILL = 234 + SYS_UTIMES = 235 + SYS_VSERVER = 236 + SYS_MBIND = 237 + SYS_SET_MEMPOLICY = 238 + SYS_GET_MEMPOLICY = 239 + SYS_MQ_OPEN = 240 + SYS_MQ_UNLINK = 241 + SYS_MQ_TIMEDSEND = 242 + SYS_MQ_TIMEDRECEIVE = 243 + SYS_MQ_NOTIFY = 244 + SYS_MQ_GETSETATTR = 245 + SYS_KEXEC_LOAD = 246 + SYS_WAITID = 247 + SYS_ADD_KEY = 248 + SYS_REQUEST_KEY = 249 + SYS_KEYCTL = 250 + SYS_IOPRIO_SET = 251 + SYS_IOPRIO_GET = 252 + SYS_INOTIFY_INIT = 253 + SYS_INOTIFY_ADD_WATCH = 254 + SYS_INOTIFY_RM_WATCH = 255 + SYS_MIGRATE_PAGES = 256 + SYS_OPENAT = 257 + SYS_MKDIRAT = 258 + SYS_MKNODAT = 259 + SYS_FCHOWNAT = 260 + SYS_FUTIMESAT = 261 + SYS_NEWFSTATAT = 262 + SYS_UNLINKAT = 263 + SYS_RENAMEAT = 264 + SYS_LINKAT = 265 + SYS_SYMLINKAT = 266 + SYS_READLINKAT = 267 + SYS_FCHMODAT = 268 + SYS_FACCESSAT = 269 + SYS_PSELECT6 = 270 + SYS_PPOLL = 271 + SYS_UNSHARE = 272 + SYS_SET_ROBUST_LIST = 273 + SYS_GET_ROBUST_LIST = 274 + SYS_SPLICE = 275 + SYS_TEE = 276 + SYS_SYNC_FILE_RANGE = 277 + SYS_VMSPLICE = 278 + SYS_MOVE_PAGES = 279 + SYS_UTIMENSAT = 280 + SYS_EPOLL_PWAIT = 281 + SYS_SIGNALFD = 282 + SYS_TIMERFD_CREATE = 283 + SYS_EVENTFD = 284 + SYS_FALLOCATE = 285 + SYS_TIMERFD_SETTIME = 286 + SYS_TIMERFD_GETTIME = 287 + SYS_ACCEPT4 = 288 + SYS_SIGNALFD4 = 289 + SYS_EVENTFD2 = 290 + SYS_EPOLL_CREATE1 = 291 + SYS_DUP3 = 292 + SYS_PIPE2 = 293 + SYS_INOTIFY_INIT1 = 294 + SYS_PREADV = 295 + SYS_PWRITEV = 296 + SYS_RT_TGSIGQUEUEINFO = 297 + SYS_PERF_EVENT_OPEN = 298 + SYS_RECVMMSG = 299 + SYS_FANOTIFY_INIT = 300 + SYS_FANOTIFY_MARK = 301 + SYS_PRLIMIT64 = 302 + SYS_NAME_TO_HANDLE_AT = 303 + SYS_OPEN_BY_HANDLE_AT = 304 + SYS_CLOCK_ADJTIME = 305 + SYS_SYNCFS = 306 + SYS_SENDMMSG = 307 + SYS_SETNS = 308 + SYS_GETCPU = 309 + SYS_PROCESS_VM_READV = 310 + SYS_PROCESS_VM_WRITEV = 311 + SYS_KCMP = 312 + SYS_FINIT_MODULE = 313 + SYS_SCHED_SETATTR = 314 + SYS_SCHED_GETATTR = 315 + SYS_RENAMEAT2 = 316 + SYS_SECCOMP = 317 + SYS_GETRANDOM = 318 + SYS_MEMFD_CREATE = 319 + SYS_KEXEC_FILE_LOAD = 320 + SYS_BPF = 321 + SYS_EXECVEAT = 322 + SYS_USERFAULTFD = 323 + SYS_MEMBARRIER = 324 + SYS_MLOCK2 = 325 + SYS_COPY_FILE_RANGE = 326 + SYS_PREADV2 = 327 + SYS_PWRITEV2 = 328 + SYS_PKEY_MPROTECT = 329 + SYS_PKEY_ALLOC = 330 + SYS_PKEY_FREE = 331 + SYS_STATX = 332 + SYS_IO_PGETEVENTS = 333 + SYS_RSEQ = 334 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index 3b1c105137..0e6ebfef09 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -403,4 +403,7 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index 3198adcf77..cd2a3ef41c 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -7,303 +7,306 @@ package unix const ( - SYS_IO_SETUP = 0 - SYS_IO_DESTROY = 1 - SYS_IO_SUBMIT = 2 - SYS_IO_CANCEL = 3 - SYS_IO_GETEVENTS = 4 - SYS_SETXATTR = 5 - SYS_LSETXATTR = 6 - SYS_FSETXATTR = 7 - SYS_GETXATTR = 8 - SYS_LGETXATTR = 9 - SYS_FGETXATTR = 10 - SYS_LISTXATTR = 11 - SYS_LLISTXATTR = 12 - SYS_FLISTXATTR = 13 - SYS_REMOVEXATTR = 14 - SYS_LREMOVEXATTR = 15 - SYS_FREMOVEXATTR = 16 - SYS_GETCWD = 17 - SYS_LOOKUP_DCOOKIE = 18 - SYS_EVENTFD2 = 19 - SYS_EPOLL_CREATE1 = 20 - SYS_EPOLL_CTL = 21 - SYS_EPOLL_PWAIT = 22 - SYS_DUP = 23 - SYS_DUP3 = 24 - SYS_FCNTL = 25 - SYS_INOTIFY_INIT1 = 26 - SYS_INOTIFY_ADD_WATCH = 27 - SYS_INOTIFY_RM_WATCH = 28 - SYS_IOCTL = 29 - SYS_IOPRIO_SET = 30 - SYS_IOPRIO_GET = 31 - SYS_FLOCK = 32 - SYS_MKNODAT = 33 - SYS_MKDIRAT = 34 - SYS_UNLINKAT = 35 - SYS_SYMLINKAT = 36 - SYS_LINKAT = 37 - SYS_RENAMEAT = 38 - SYS_UMOUNT2 = 39 - SYS_MOUNT = 40 - SYS_PIVOT_ROOT = 41 - SYS_NFSSERVCTL = 42 - SYS_STATFS = 43 - SYS_FSTATFS = 44 - SYS_TRUNCATE = 45 - SYS_FTRUNCATE = 46 - SYS_FALLOCATE = 47 - SYS_FACCESSAT = 48 - SYS_CHDIR = 49 - SYS_FCHDIR = 50 - SYS_CHROOT = 51 - SYS_FCHMOD = 52 - SYS_FCHMODAT = 53 - SYS_FCHOWNAT = 54 - SYS_FCHOWN = 55 - SYS_OPENAT = 56 - SYS_CLOSE = 57 - SYS_VHANGUP = 58 - SYS_PIPE2 = 59 - SYS_QUOTACTL = 60 - SYS_GETDENTS64 = 61 - SYS_LSEEK = 62 - SYS_READ = 63 - SYS_WRITE = 64 - SYS_READV = 65 - SYS_WRITEV = 66 - SYS_PREAD64 = 67 - SYS_PWRITE64 = 68 - SYS_PREADV = 69 - SYS_PWRITEV = 70 - SYS_SENDFILE = 71 - SYS_PSELECT6 = 72 - SYS_PPOLL = 73 - SYS_SIGNALFD4 = 74 - SYS_VMSPLICE = 75 - SYS_SPLICE = 76 - SYS_TEE = 77 - SYS_READLINKAT = 78 - SYS_FSTATAT = 79 - SYS_FSTAT = 80 - SYS_SYNC = 81 - SYS_FSYNC = 82 - SYS_FDATASYNC = 83 - SYS_SYNC_FILE_RANGE = 84 - SYS_TIMERFD_CREATE = 85 - SYS_TIMERFD_SETTIME = 86 - SYS_TIMERFD_GETTIME = 87 - SYS_UTIMENSAT = 88 - SYS_ACCT = 89 - SYS_CAPGET = 90 - SYS_CAPSET = 91 - SYS_PERSONALITY = 92 - SYS_EXIT = 93 - SYS_EXIT_GROUP = 94 - SYS_WAITID = 95 - SYS_SET_TID_ADDRESS = 96 - SYS_UNSHARE = 97 - SYS_FUTEX = 98 - SYS_SET_ROBUST_LIST = 99 - SYS_GET_ROBUST_LIST = 100 - SYS_NANOSLEEP = 101 - SYS_GETITIMER = 102 - SYS_SETITIMER = 103 - SYS_KEXEC_LOAD = 104 - SYS_INIT_MODULE = 105 - SYS_DELETE_MODULE = 106 - SYS_TIMER_CREATE = 107 - SYS_TIMER_GETTIME = 108 - SYS_TIMER_GETOVERRUN = 109 - SYS_TIMER_SETTIME = 110 - SYS_TIMER_DELETE = 111 - SYS_CLOCK_SETTIME = 112 - SYS_CLOCK_GETTIME = 113 - SYS_CLOCK_GETRES = 114 - SYS_CLOCK_NANOSLEEP = 115 - SYS_SYSLOG = 116 - SYS_PTRACE = 117 - SYS_SCHED_SETPARAM = 118 - SYS_SCHED_SETSCHEDULER = 119 - SYS_SCHED_GETSCHEDULER = 120 - SYS_SCHED_GETPARAM = 121 - SYS_SCHED_SETAFFINITY = 122 - SYS_SCHED_GETAFFINITY = 123 - SYS_SCHED_YIELD = 124 - SYS_SCHED_GET_PRIORITY_MAX = 125 - SYS_SCHED_GET_PRIORITY_MIN = 126 - SYS_SCHED_RR_GET_INTERVAL = 127 - SYS_RESTART_SYSCALL = 128 - SYS_KILL = 129 - SYS_TKILL = 130 - SYS_TGKILL = 131 - SYS_SIGALTSTACK = 132 - SYS_RT_SIGSUSPEND = 133 - SYS_RT_SIGACTION = 134 - SYS_RT_SIGPROCMASK = 135 - SYS_RT_SIGPENDING = 136 - SYS_RT_SIGTIMEDWAIT = 137 - SYS_RT_SIGQUEUEINFO = 138 - SYS_RT_SIGRETURN = 139 - SYS_SETPRIORITY = 140 - SYS_GETPRIORITY = 141 - SYS_REBOOT = 142 - SYS_SETREGID = 143 - SYS_SETGID = 144 - SYS_SETREUID = 145 - SYS_SETUID = 146 - SYS_SETRESUID = 147 - SYS_GETRESUID = 148 - SYS_SETRESGID = 149 - SYS_GETRESGID = 150 - SYS_SETFSUID = 151 - SYS_SETFSGID = 152 - SYS_TIMES = 153 - SYS_SETPGID = 154 - SYS_GETPGID = 155 - SYS_GETSID = 156 - SYS_SETSID = 157 - SYS_GETGROUPS = 158 - SYS_SETGROUPS = 159 - SYS_UNAME = 160 - SYS_SETHOSTNAME = 161 - SYS_SETDOMAINNAME = 162 - SYS_GETRLIMIT = 163 - SYS_SETRLIMIT = 164 - SYS_GETRUSAGE = 165 - SYS_UMASK = 166 - SYS_PRCTL = 167 - SYS_GETCPU = 168 - SYS_GETTIMEOFDAY = 169 - SYS_SETTIMEOFDAY = 170 - SYS_ADJTIMEX = 171 - SYS_GETPID = 172 - SYS_GETPPID = 173 - SYS_GETUID = 174 - SYS_GETEUID = 175 - SYS_GETGID = 176 - SYS_GETEGID = 177 - SYS_GETTID = 178 - SYS_SYSINFO = 179 - SYS_MQ_OPEN = 180 - SYS_MQ_UNLINK = 181 - SYS_MQ_TIMEDSEND = 182 - SYS_MQ_TIMEDRECEIVE = 183 - SYS_MQ_NOTIFY = 184 - SYS_MQ_GETSETATTR = 185 - SYS_MSGGET = 186 - SYS_MSGCTL = 187 - SYS_MSGRCV = 188 - SYS_MSGSND = 189 - SYS_SEMGET = 190 - SYS_SEMCTL = 191 - SYS_SEMTIMEDOP = 192 - SYS_SEMOP = 193 - SYS_SHMGET = 194 - SYS_SHMCTL = 195 - SYS_SHMAT = 196 - SYS_SHMDT = 197 - SYS_SOCKET = 198 - SYS_SOCKETPAIR = 199 - SYS_BIND = 200 - SYS_LISTEN = 201 - SYS_ACCEPT = 202 - SYS_CONNECT = 203 - SYS_GETSOCKNAME = 204 - SYS_GETPEERNAME = 205 - SYS_SENDTO = 206 - SYS_RECVFROM = 207 - SYS_SETSOCKOPT = 208 - SYS_GETSOCKOPT = 209 - SYS_SHUTDOWN = 210 - SYS_SENDMSG = 211 - SYS_RECVMSG = 212 - SYS_READAHEAD = 213 - SYS_BRK = 214 - SYS_MUNMAP = 215 - SYS_MREMAP = 216 - SYS_ADD_KEY = 217 - SYS_REQUEST_KEY = 218 - SYS_KEYCTL = 219 - SYS_CLONE = 220 - SYS_EXECVE = 221 - SYS_MMAP = 222 - SYS_FADVISE64 = 223 - SYS_SWAPON = 224 - SYS_SWAPOFF = 225 - SYS_MPROTECT = 226 - SYS_MSYNC = 227 - SYS_MLOCK = 228 - SYS_MUNLOCK = 229 - SYS_MLOCKALL = 230 - SYS_MUNLOCKALL = 231 - SYS_MINCORE = 232 - SYS_MADVISE = 233 - SYS_REMAP_FILE_PAGES = 234 - SYS_MBIND = 235 - SYS_GET_MEMPOLICY = 236 - SYS_SET_MEMPOLICY = 237 - SYS_MIGRATE_PAGES = 238 - SYS_MOVE_PAGES = 239 - SYS_RT_TGSIGQUEUEINFO = 240 - SYS_PERF_EVENT_OPEN = 241 - SYS_ACCEPT4 = 242 - SYS_RECVMMSG = 243 - SYS_ARCH_SPECIFIC_SYSCALL = 244 - SYS_WAIT4 = 260 - SYS_PRLIMIT64 = 261 - SYS_FANOTIFY_INIT = 262 - SYS_FANOTIFY_MARK = 263 - SYS_NAME_TO_HANDLE_AT = 264 - SYS_OPEN_BY_HANDLE_AT = 265 - SYS_CLOCK_ADJTIME = 266 - SYS_SYNCFS = 267 - SYS_SETNS = 268 - SYS_SENDMMSG = 269 - SYS_PROCESS_VM_READV = 270 - SYS_PROCESS_VM_WRITEV = 271 - SYS_KCMP = 272 - SYS_FINIT_MODULE = 273 - SYS_SCHED_SETATTR = 274 - SYS_SCHED_GETATTR = 275 - SYS_RENAMEAT2 = 276 - SYS_SECCOMP = 277 - SYS_GETRANDOM = 278 - SYS_MEMFD_CREATE = 279 - SYS_BPF = 280 - SYS_EXECVEAT = 281 - SYS_USERFAULTFD = 282 - SYS_MEMBARRIER = 283 - SYS_MLOCK2 = 284 - SYS_COPY_FILE_RANGE = 285 - SYS_PREADV2 = 286 - SYS_PWRITEV2 = 287 - SYS_PKEY_MPROTECT = 288 - SYS_PKEY_ALLOC = 289 - SYS_PKEY_FREE = 290 - SYS_STATX = 291 - SYS_IO_PGETEVENTS = 292 - SYS_RSEQ = 293 - SYS_KEXEC_FILE_LOAD = 294 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_RENAMEAT = 38 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 + SYS_IO_PGETEVENTS = 292 + SYS_RSEQ = 293 + SYS_KEXEC_FILE_LOAD = 294 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index c877ec6e68..773640b831 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -424,4 +424,7 @@ const ( SYS_PROCESS_MADVISE = 4440 SYS_EPOLL_PWAIT2 = 4441 SYS_MOUNT_SETATTR = 4442 + SYS_LANDLOCK_CREATE_RULESET = 4444 + SYS_LANDLOCK_ADD_RULE = 4445 + SYS_LANDLOCK_RESTRICT_SELF = 4446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index b5f2903729..86a41e5688 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -7,351 +7,354 @@ package unix const ( - SYS_READ = 5000 - SYS_WRITE = 5001 - SYS_OPEN = 5002 - SYS_CLOSE = 5003 - SYS_STAT = 5004 - SYS_FSTAT = 5005 - SYS_LSTAT = 5006 - SYS_POLL = 5007 - SYS_LSEEK = 5008 - SYS_MMAP = 5009 - SYS_MPROTECT = 5010 - SYS_MUNMAP = 5011 - SYS_BRK = 5012 - SYS_RT_SIGACTION = 5013 - SYS_RT_SIGPROCMASK = 5014 - SYS_IOCTL = 5015 - SYS_PREAD64 = 5016 - SYS_PWRITE64 = 5017 - SYS_READV = 5018 - SYS_WRITEV = 5019 - SYS_ACCESS = 5020 - SYS_PIPE = 5021 - SYS__NEWSELECT = 5022 - SYS_SCHED_YIELD = 5023 - SYS_MREMAP = 5024 - SYS_MSYNC = 5025 - SYS_MINCORE = 5026 - SYS_MADVISE = 5027 - SYS_SHMGET = 5028 - SYS_SHMAT = 5029 - SYS_SHMCTL = 5030 - SYS_DUP = 5031 - SYS_DUP2 = 5032 - SYS_PAUSE = 5033 - SYS_NANOSLEEP = 5034 - SYS_GETITIMER = 5035 - SYS_SETITIMER = 5036 - SYS_ALARM = 5037 - SYS_GETPID = 5038 - SYS_SENDFILE = 5039 - SYS_SOCKET = 5040 - SYS_CONNECT = 5041 - SYS_ACCEPT = 5042 - SYS_SENDTO = 5043 - SYS_RECVFROM = 5044 - SYS_SENDMSG = 5045 - SYS_RECVMSG = 5046 - SYS_SHUTDOWN = 5047 - SYS_BIND = 5048 - SYS_LISTEN = 5049 - SYS_GETSOCKNAME = 5050 - SYS_GETPEERNAME = 5051 - SYS_SOCKETPAIR = 5052 - SYS_SETSOCKOPT = 5053 - SYS_GETSOCKOPT = 5054 - SYS_CLONE = 5055 - SYS_FORK = 5056 - SYS_EXECVE = 5057 - SYS_EXIT = 5058 - SYS_WAIT4 = 5059 - SYS_KILL = 5060 - SYS_UNAME = 5061 - SYS_SEMGET = 5062 - SYS_SEMOP = 5063 - SYS_SEMCTL = 5064 - SYS_SHMDT = 5065 - SYS_MSGGET = 5066 - SYS_MSGSND = 5067 - SYS_MSGRCV = 5068 - SYS_MSGCTL = 5069 - SYS_FCNTL = 5070 - SYS_FLOCK = 5071 - SYS_FSYNC = 5072 - SYS_FDATASYNC = 5073 - SYS_TRUNCATE = 5074 - SYS_FTRUNCATE = 5075 - SYS_GETDENTS = 5076 - SYS_GETCWD = 5077 - SYS_CHDIR = 5078 - SYS_FCHDIR = 5079 - SYS_RENAME = 5080 - SYS_MKDIR = 5081 - SYS_RMDIR = 5082 - SYS_CREAT = 5083 - SYS_LINK = 5084 - SYS_UNLINK = 5085 - SYS_SYMLINK = 5086 - SYS_READLINK = 5087 - SYS_CHMOD = 5088 - SYS_FCHMOD = 5089 - SYS_CHOWN = 5090 - SYS_FCHOWN = 5091 - SYS_LCHOWN = 5092 - SYS_UMASK = 5093 - SYS_GETTIMEOFDAY = 5094 - SYS_GETRLIMIT = 5095 - SYS_GETRUSAGE = 5096 - SYS_SYSINFO = 5097 - SYS_TIMES = 5098 - SYS_PTRACE = 5099 - SYS_GETUID = 5100 - SYS_SYSLOG = 5101 - SYS_GETGID = 5102 - SYS_SETUID = 5103 - SYS_SETGID = 5104 - SYS_GETEUID = 5105 - SYS_GETEGID = 5106 - SYS_SETPGID = 5107 - SYS_GETPPID = 5108 - SYS_GETPGRP = 5109 - SYS_SETSID = 5110 - SYS_SETREUID = 5111 - SYS_SETREGID = 5112 - SYS_GETGROUPS = 5113 - SYS_SETGROUPS = 5114 - SYS_SETRESUID = 5115 - SYS_GETRESUID = 5116 - SYS_SETRESGID = 5117 - SYS_GETRESGID = 5118 - SYS_GETPGID = 5119 - SYS_SETFSUID = 5120 - SYS_SETFSGID = 5121 - SYS_GETSID = 5122 - SYS_CAPGET = 5123 - SYS_CAPSET = 5124 - SYS_RT_SIGPENDING = 5125 - SYS_RT_SIGTIMEDWAIT = 5126 - SYS_RT_SIGQUEUEINFO = 5127 - SYS_RT_SIGSUSPEND = 5128 - SYS_SIGALTSTACK = 5129 - SYS_UTIME = 5130 - SYS_MKNOD = 5131 - SYS_PERSONALITY = 5132 - SYS_USTAT = 5133 - SYS_STATFS = 5134 - SYS_FSTATFS = 5135 - SYS_SYSFS = 5136 - SYS_GETPRIORITY = 5137 - SYS_SETPRIORITY = 5138 - SYS_SCHED_SETPARAM = 5139 - SYS_SCHED_GETPARAM = 5140 - SYS_SCHED_SETSCHEDULER = 5141 - SYS_SCHED_GETSCHEDULER = 5142 - SYS_SCHED_GET_PRIORITY_MAX = 5143 - SYS_SCHED_GET_PRIORITY_MIN = 5144 - SYS_SCHED_RR_GET_INTERVAL = 5145 - SYS_MLOCK = 5146 - SYS_MUNLOCK = 5147 - SYS_MLOCKALL = 5148 - SYS_MUNLOCKALL = 5149 - SYS_VHANGUP = 5150 - SYS_PIVOT_ROOT = 5151 - SYS__SYSCTL = 5152 - SYS_PRCTL = 5153 - SYS_ADJTIMEX = 5154 - SYS_SETRLIMIT = 5155 - SYS_CHROOT = 5156 - SYS_SYNC = 5157 - SYS_ACCT = 5158 - SYS_SETTIMEOFDAY = 5159 - SYS_MOUNT = 5160 - SYS_UMOUNT2 = 5161 - SYS_SWAPON = 5162 - SYS_SWAPOFF = 5163 - SYS_REBOOT = 5164 - SYS_SETHOSTNAME = 5165 - SYS_SETDOMAINNAME = 5166 - SYS_CREATE_MODULE = 5167 - SYS_INIT_MODULE = 5168 - SYS_DELETE_MODULE = 5169 - SYS_GET_KERNEL_SYMS = 5170 - SYS_QUERY_MODULE = 5171 - SYS_QUOTACTL = 5172 - SYS_NFSSERVCTL = 5173 - SYS_GETPMSG = 5174 - SYS_PUTPMSG = 5175 - SYS_AFS_SYSCALL = 5176 - SYS_RESERVED177 = 5177 - SYS_GETTID = 5178 - SYS_READAHEAD = 5179 - SYS_SETXATTR = 5180 - SYS_LSETXATTR = 5181 - SYS_FSETXATTR = 5182 - SYS_GETXATTR = 5183 - SYS_LGETXATTR = 5184 - SYS_FGETXATTR = 5185 - SYS_LISTXATTR = 5186 - SYS_LLISTXATTR = 5187 - SYS_FLISTXATTR = 5188 - SYS_REMOVEXATTR = 5189 - SYS_LREMOVEXATTR = 5190 - SYS_FREMOVEXATTR = 5191 - SYS_TKILL = 5192 - SYS_RESERVED193 = 5193 - SYS_FUTEX = 5194 - SYS_SCHED_SETAFFINITY = 5195 - SYS_SCHED_GETAFFINITY = 5196 - SYS_CACHEFLUSH = 5197 - SYS_CACHECTL = 5198 - SYS_SYSMIPS = 5199 - SYS_IO_SETUP = 5200 - SYS_IO_DESTROY = 5201 - SYS_IO_GETEVENTS = 5202 - SYS_IO_SUBMIT = 5203 - SYS_IO_CANCEL = 5204 - SYS_EXIT_GROUP = 5205 - SYS_LOOKUP_DCOOKIE = 5206 - SYS_EPOLL_CREATE = 5207 - SYS_EPOLL_CTL = 5208 - SYS_EPOLL_WAIT = 5209 - SYS_REMAP_FILE_PAGES = 5210 - SYS_RT_SIGRETURN = 5211 - SYS_SET_TID_ADDRESS = 5212 - SYS_RESTART_SYSCALL = 5213 - SYS_SEMTIMEDOP = 5214 - SYS_FADVISE64 = 5215 - SYS_TIMER_CREATE = 5216 - SYS_TIMER_SETTIME = 5217 - SYS_TIMER_GETTIME = 5218 - SYS_TIMER_GETOVERRUN = 5219 - SYS_TIMER_DELETE = 5220 - SYS_CLOCK_SETTIME = 5221 - SYS_CLOCK_GETTIME = 5222 - SYS_CLOCK_GETRES = 5223 - SYS_CLOCK_NANOSLEEP = 5224 - SYS_TGKILL = 5225 - SYS_UTIMES = 5226 - SYS_MBIND = 5227 - SYS_GET_MEMPOLICY = 5228 - SYS_SET_MEMPOLICY = 5229 - SYS_MQ_OPEN = 5230 - SYS_MQ_UNLINK = 5231 - SYS_MQ_TIMEDSEND = 5232 - SYS_MQ_TIMEDRECEIVE = 5233 - SYS_MQ_NOTIFY = 5234 - SYS_MQ_GETSETATTR = 5235 - SYS_VSERVER = 5236 - SYS_WAITID = 5237 - SYS_ADD_KEY = 5239 - SYS_REQUEST_KEY = 5240 - SYS_KEYCTL = 5241 - SYS_SET_THREAD_AREA = 5242 - SYS_INOTIFY_INIT = 5243 - SYS_INOTIFY_ADD_WATCH = 5244 - SYS_INOTIFY_RM_WATCH = 5245 - SYS_MIGRATE_PAGES = 5246 - SYS_OPENAT = 5247 - SYS_MKDIRAT = 5248 - SYS_MKNODAT = 5249 - SYS_FCHOWNAT = 5250 - SYS_FUTIMESAT = 5251 - SYS_NEWFSTATAT = 5252 - SYS_UNLINKAT = 5253 - SYS_RENAMEAT = 5254 - SYS_LINKAT = 5255 - SYS_SYMLINKAT = 5256 - SYS_READLINKAT = 5257 - SYS_FCHMODAT = 5258 - SYS_FACCESSAT = 5259 - SYS_PSELECT6 = 5260 - SYS_PPOLL = 5261 - SYS_UNSHARE = 5262 - SYS_SPLICE = 5263 - SYS_SYNC_FILE_RANGE = 5264 - SYS_TEE = 5265 - SYS_VMSPLICE = 5266 - SYS_MOVE_PAGES = 5267 - SYS_SET_ROBUST_LIST = 5268 - SYS_GET_ROBUST_LIST = 5269 - SYS_KEXEC_LOAD = 5270 - SYS_GETCPU = 5271 - SYS_EPOLL_PWAIT = 5272 - SYS_IOPRIO_SET = 5273 - SYS_IOPRIO_GET = 5274 - SYS_UTIMENSAT = 5275 - SYS_SIGNALFD = 5276 - SYS_TIMERFD = 5277 - SYS_EVENTFD = 5278 - SYS_FALLOCATE = 5279 - SYS_TIMERFD_CREATE = 5280 - SYS_TIMERFD_GETTIME = 5281 - SYS_TIMERFD_SETTIME = 5282 - SYS_SIGNALFD4 = 5283 - SYS_EVENTFD2 = 5284 - SYS_EPOLL_CREATE1 = 5285 - SYS_DUP3 = 5286 - SYS_PIPE2 = 5287 - SYS_INOTIFY_INIT1 = 5288 - SYS_PREADV = 5289 - SYS_PWRITEV = 5290 - SYS_RT_TGSIGQUEUEINFO = 5291 - SYS_PERF_EVENT_OPEN = 5292 - SYS_ACCEPT4 = 5293 - SYS_RECVMMSG = 5294 - SYS_FANOTIFY_INIT = 5295 - SYS_FANOTIFY_MARK = 5296 - SYS_PRLIMIT64 = 5297 - SYS_NAME_TO_HANDLE_AT = 5298 - SYS_OPEN_BY_HANDLE_AT = 5299 - SYS_CLOCK_ADJTIME = 5300 - SYS_SYNCFS = 5301 - SYS_SENDMMSG = 5302 - SYS_SETNS = 5303 - SYS_PROCESS_VM_READV = 5304 - SYS_PROCESS_VM_WRITEV = 5305 - SYS_KCMP = 5306 - SYS_FINIT_MODULE = 5307 - SYS_GETDENTS64 = 5308 - SYS_SCHED_SETATTR = 5309 - SYS_SCHED_GETATTR = 5310 - SYS_RENAMEAT2 = 5311 - SYS_SECCOMP = 5312 - SYS_GETRANDOM = 5313 - SYS_MEMFD_CREATE = 5314 - SYS_BPF = 5315 - SYS_EXECVEAT = 5316 - SYS_USERFAULTFD = 5317 - SYS_MEMBARRIER = 5318 - SYS_MLOCK2 = 5319 - SYS_COPY_FILE_RANGE = 5320 - SYS_PREADV2 = 5321 - SYS_PWRITEV2 = 5322 - SYS_PKEY_MPROTECT = 5323 - SYS_PKEY_ALLOC = 5324 - SYS_PKEY_FREE = 5325 - SYS_STATX = 5326 - SYS_RSEQ = 5327 - SYS_IO_PGETEVENTS = 5328 - SYS_PIDFD_SEND_SIGNAL = 5424 - SYS_IO_URING_SETUP = 5425 - SYS_IO_URING_ENTER = 5426 - SYS_IO_URING_REGISTER = 5427 - SYS_OPEN_TREE = 5428 - SYS_MOVE_MOUNT = 5429 - SYS_FSOPEN = 5430 - SYS_FSCONFIG = 5431 - SYS_FSMOUNT = 5432 - SYS_FSPICK = 5433 - SYS_PIDFD_OPEN = 5434 - SYS_CLONE3 = 5435 - SYS_CLOSE_RANGE = 5436 - SYS_OPENAT2 = 5437 - SYS_PIDFD_GETFD = 5438 - SYS_FACCESSAT2 = 5439 - SYS_PROCESS_MADVISE = 5440 - SYS_EPOLL_PWAIT2 = 5441 - SYS_MOUNT_SETATTR = 5442 + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 + SYS_RSEQ = 5327 + SYS_IO_PGETEVENTS = 5328 + SYS_PIDFD_SEND_SIGNAL = 5424 + SYS_IO_URING_SETUP = 5425 + SYS_IO_URING_ENTER = 5426 + SYS_IO_URING_REGISTER = 5427 + SYS_OPEN_TREE = 5428 + SYS_MOVE_MOUNT = 5429 + SYS_FSOPEN = 5430 + SYS_FSCONFIG = 5431 + SYS_FSMOUNT = 5432 + SYS_FSPICK = 5433 + SYS_PIDFD_OPEN = 5434 + SYS_CLONE3 = 5435 + SYS_CLOSE_RANGE = 5436 + SYS_OPENAT2 = 5437 + SYS_PIDFD_GETFD = 5438 + SYS_FACCESSAT2 = 5439 + SYS_PROCESS_MADVISE = 5440 + SYS_EPOLL_PWAIT2 = 5441 + SYS_MOUNT_SETATTR = 5442 + SYS_LANDLOCK_CREATE_RULESET = 5444 + SYS_LANDLOCK_ADD_RULE = 5445 + SYS_LANDLOCK_RESTRICT_SELF = 5446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index 46077689ab..77f5728da6 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -7,351 +7,354 @@ package unix const ( - SYS_READ = 5000 - SYS_WRITE = 5001 - SYS_OPEN = 5002 - SYS_CLOSE = 5003 - SYS_STAT = 5004 - SYS_FSTAT = 5005 - SYS_LSTAT = 5006 - SYS_POLL = 5007 - SYS_LSEEK = 5008 - SYS_MMAP = 5009 - SYS_MPROTECT = 5010 - SYS_MUNMAP = 5011 - SYS_BRK = 5012 - SYS_RT_SIGACTION = 5013 - SYS_RT_SIGPROCMASK = 5014 - SYS_IOCTL = 5015 - SYS_PREAD64 = 5016 - SYS_PWRITE64 = 5017 - SYS_READV = 5018 - SYS_WRITEV = 5019 - SYS_ACCESS = 5020 - SYS_PIPE = 5021 - SYS__NEWSELECT = 5022 - SYS_SCHED_YIELD = 5023 - SYS_MREMAP = 5024 - SYS_MSYNC = 5025 - SYS_MINCORE = 5026 - SYS_MADVISE = 5027 - SYS_SHMGET = 5028 - SYS_SHMAT = 5029 - SYS_SHMCTL = 5030 - SYS_DUP = 5031 - SYS_DUP2 = 5032 - SYS_PAUSE = 5033 - SYS_NANOSLEEP = 5034 - SYS_GETITIMER = 5035 - SYS_SETITIMER = 5036 - SYS_ALARM = 5037 - SYS_GETPID = 5038 - SYS_SENDFILE = 5039 - SYS_SOCKET = 5040 - SYS_CONNECT = 5041 - SYS_ACCEPT = 5042 - SYS_SENDTO = 5043 - SYS_RECVFROM = 5044 - SYS_SENDMSG = 5045 - SYS_RECVMSG = 5046 - SYS_SHUTDOWN = 5047 - SYS_BIND = 5048 - SYS_LISTEN = 5049 - SYS_GETSOCKNAME = 5050 - SYS_GETPEERNAME = 5051 - SYS_SOCKETPAIR = 5052 - SYS_SETSOCKOPT = 5053 - SYS_GETSOCKOPT = 5054 - SYS_CLONE = 5055 - SYS_FORK = 5056 - SYS_EXECVE = 5057 - SYS_EXIT = 5058 - SYS_WAIT4 = 5059 - SYS_KILL = 5060 - SYS_UNAME = 5061 - SYS_SEMGET = 5062 - SYS_SEMOP = 5063 - SYS_SEMCTL = 5064 - SYS_SHMDT = 5065 - SYS_MSGGET = 5066 - SYS_MSGSND = 5067 - SYS_MSGRCV = 5068 - SYS_MSGCTL = 5069 - SYS_FCNTL = 5070 - SYS_FLOCK = 5071 - SYS_FSYNC = 5072 - SYS_FDATASYNC = 5073 - SYS_TRUNCATE = 5074 - SYS_FTRUNCATE = 5075 - SYS_GETDENTS = 5076 - SYS_GETCWD = 5077 - SYS_CHDIR = 5078 - SYS_FCHDIR = 5079 - SYS_RENAME = 5080 - SYS_MKDIR = 5081 - SYS_RMDIR = 5082 - SYS_CREAT = 5083 - SYS_LINK = 5084 - SYS_UNLINK = 5085 - SYS_SYMLINK = 5086 - SYS_READLINK = 5087 - SYS_CHMOD = 5088 - SYS_FCHMOD = 5089 - SYS_CHOWN = 5090 - SYS_FCHOWN = 5091 - SYS_LCHOWN = 5092 - SYS_UMASK = 5093 - SYS_GETTIMEOFDAY = 5094 - SYS_GETRLIMIT = 5095 - SYS_GETRUSAGE = 5096 - SYS_SYSINFO = 5097 - SYS_TIMES = 5098 - SYS_PTRACE = 5099 - SYS_GETUID = 5100 - SYS_SYSLOG = 5101 - SYS_GETGID = 5102 - SYS_SETUID = 5103 - SYS_SETGID = 5104 - SYS_GETEUID = 5105 - SYS_GETEGID = 5106 - SYS_SETPGID = 5107 - SYS_GETPPID = 5108 - SYS_GETPGRP = 5109 - SYS_SETSID = 5110 - SYS_SETREUID = 5111 - SYS_SETREGID = 5112 - SYS_GETGROUPS = 5113 - SYS_SETGROUPS = 5114 - SYS_SETRESUID = 5115 - SYS_GETRESUID = 5116 - SYS_SETRESGID = 5117 - SYS_GETRESGID = 5118 - SYS_GETPGID = 5119 - SYS_SETFSUID = 5120 - SYS_SETFSGID = 5121 - SYS_GETSID = 5122 - SYS_CAPGET = 5123 - SYS_CAPSET = 5124 - SYS_RT_SIGPENDING = 5125 - SYS_RT_SIGTIMEDWAIT = 5126 - SYS_RT_SIGQUEUEINFO = 5127 - SYS_RT_SIGSUSPEND = 5128 - SYS_SIGALTSTACK = 5129 - SYS_UTIME = 5130 - SYS_MKNOD = 5131 - SYS_PERSONALITY = 5132 - SYS_USTAT = 5133 - SYS_STATFS = 5134 - SYS_FSTATFS = 5135 - SYS_SYSFS = 5136 - SYS_GETPRIORITY = 5137 - SYS_SETPRIORITY = 5138 - SYS_SCHED_SETPARAM = 5139 - SYS_SCHED_GETPARAM = 5140 - SYS_SCHED_SETSCHEDULER = 5141 - SYS_SCHED_GETSCHEDULER = 5142 - SYS_SCHED_GET_PRIORITY_MAX = 5143 - SYS_SCHED_GET_PRIORITY_MIN = 5144 - SYS_SCHED_RR_GET_INTERVAL = 5145 - SYS_MLOCK = 5146 - SYS_MUNLOCK = 5147 - SYS_MLOCKALL = 5148 - SYS_MUNLOCKALL = 5149 - SYS_VHANGUP = 5150 - SYS_PIVOT_ROOT = 5151 - SYS__SYSCTL = 5152 - SYS_PRCTL = 5153 - SYS_ADJTIMEX = 5154 - SYS_SETRLIMIT = 5155 - SYS_CHROOT = 5156 - SYS_SYNC = 5157 - SYS_ACCT = 5158 - SYS_SETTIMEOFDAY = 5159 - SYS_MOUNT = 5160 - SYS_UMOUNT2 = 5161 - SYS_SWAPON = 5162 - SYS_SWAPOFF = 5163 - SYS_REBOOT = 5164 - SYS_SETHOSTNAME = 5165 - SYS_SETDOMAINNAME = 5166 - SYS_CREATE_MODULE = 5167 - SYS_INIT_MODULE = 5168 - SYS_DELETE_MODULE = 5169 - SYS_GET_KERNEL_SYMS = 5170 - SYS_QUERY_MODULE = 5171 - SYS_QUOTACTL = 5172 - SYS_NFSSERVCTL = 5173 - SYS_GETPMSG = 5174 - SYS_PUTPMSG = 5175 - SYS_AFS_SYSCALL = 5176 - SYS_RESERVED177 = 5177 - SYS_GETTID = 5178 - SYS_READAHEAD = 5179 - SYS_SETXATTR = 5180 - SYS_LSETXATTR = 5181 - SYS_FSETXATTR = 5182 - SYS_GETXATTR = 5183 - SYS_LGETXATTR = 5184 - SYS_FGETXATTR = 5185 - SYS_LISTXATTR = 5186 - SYS_LLISTXATTR = 5187 - SYS_FLISTXATTR = 5188 - SYS_REMOVEXATTR = 5189 - SYS_LREMOVEXATTR = 5190 - SYS_FREMOVEXATTR = 5191 - SYS_TKILL = 5192 - SYS_RESERVED193 = 5193 - SYS_FUTEX = 5194 - SYS_SCHED_SETAFFINITY = 5195 - SYS_SCHED_GETAFFINITY = 5196 - SYS_CACHEFLUSH = 5197 - SYS_CACHECTL = 5198 - SYS_SYSMIPS = 5199 - SYS_IO_SETUP = 5200 - SYS_IO_DESTROY = 5201 - SYS_IO_GETEVENTS = 5202 - SYS_IO_SUBMIT = 5203 - SYS_IO_CANCEL = 5204 - SYS_EXIT_GROUP = 5205 - SYS_LOOKUP_DCOOKIE = 5206 - SYS_EPOLL_CREATE = 5207 - SYS_EPOLL_CTL = 5208 - SYS_EPOLL_WAIT = 5209 - SYS_REMAP_FILE_PAGES = 5210 - SYS_RT_SIGRETURN = 5211 - SYS_SET_TID_ADDRESS = 5212 - SYS_RESTART_SYSCALL = 5213 - SYS_SEMTIMEDOP = 5214 - SYS_FADVISE64 = 5215 - SYS_TIMER_CREATE = 5216 - SYS_TIMER_SETTIME = 5217 - SYS_TIMER_GETTIME = 5218 - SYS_TIMER_GETOVERRUN = 5219 - SYS_TIMER_DELETE = 5220 - SYS_CLOCK_SETTIME = 5221 - SYS_CLOCK_GETTIME = 5222 - SYS_CLOCK_GETRES = 5223 - SYS_CLOCK_NANOSLEEP = 5224 - SYS_TGKILL = 5225 - SYS_UTIMES = 5226 - SYS_MBIND = 5227 - SYS_GET_MEMPOLICY = 5228 - SYS_SET_MEMPOLICY = 5229 - SYS_MQ_OPEN = 5230 - SYS_MQ_UNLINK = 5231 - SYS_MQ_TIMEDSEND = 5232 - SYS_MQ_TIMEDRECEIVE = 5233 - SYS_MQ_NOTIFY = 5234 - SYS_MQ_GETSETATTR = 5235 - SYS_VSERVER = 5236 - SYS_WAITID = 5237 - SYS_ADD_KEY = 5239 - SYS_REQUEST_KEY = 5240 - SYS_KEYCTL = 5241 - SYS_SET_THREAD_AREA = 5242 - SYS_INOTIFY_INIT = 5243 - SYS_INOTIFY_ADD_WATCH = 5244 - SYS_INOTIFY_RM_WATCH = 5245 - SYS_MIGRATE_PAGES = 5246 - SYS_OPENAT = 5247 - SYS_MKDIRAT = 5248 - SYS_MKNODAT = 5249 - SYS_FCHOWNAT = 5250 - SYS_FUTIMESAT = 5251 - SYS_NEWFSTATAT = 5252 - SYS_UNLINKAT = 5253 - SYS_RENAMEAT = 5254 - SYS_LINKAT = 5255 - SYS_SYMLINKAT = 5256 - SYS_READLINKAT = 5257 - SYS_FCHMODAT = 5258 - SYS_FACCESSAT = 5259 - SYS_PSELECT6 = 5260 - SYS_PPOLL = 5261 - SYS_UNSHARE = 5262 - SYS_SPLICE = 5263 - SYS_SYNC_FILE_RANGE = 5264 - SYS_TEE = 5265 - SYS_VMSPLICE = 5266 - SYS_MOVE_PAGES = 5267 - SYS_SET_ROBUST_LIST = 5268 - SYS_GET_ROBUST_LIST = 5269 - SYS_KEXEC_LOAD = 5270 - SYS_GETCPU = 5271 - SYS_EPOLL_PWAIT = 5272 - SYS_IOPRIO_SET = 5273 - SYS_IOPRIO_GET = 5274 - SYS_UTIMENSAT = 5275 - SYS_SIGNALFD = 5276 - SYS_TIMERFD = 5277 - SYS_EVENTFD = 5278 - SYS_FALLOCATE = 5279 - SYS_TIMERFD_CREATE = 5280 - SYS_TIMERFD_GETTIME = 5281 - SYS_TIMERFD_SETTIME = 5282 - SYS_SIGNALFD4 = 5283 - SYS_EVENTFD2 = 5284 - SYS_EPOLL_CREATE1 = 5285 - SYS_DUP3 = 5286 - SYS_PIPE2 = 5287 - SYS_INOTIFY_INIT1 = 5288 - SYS_PREADV = 5289 - SYS_PWRITEV = 5290 - SYS_RT_TGSIGQUEUEINFO = 5291 - SYS_PERF_EVENT_OPEN = 5292 - SYS_ACCEPT4 = 5293 - SYS_RECVMMSG = 5294 - SYS_FANOTIFY_INIT = 5295 - SYS_FANOTIFY_MARK = 5296 - SYS_PRLIMIT64 = 5297 - SYS_NAME_TO_HANDLE_AT = 5298 - SYS_OPEN_BY_HANDLE_AT = 5299 - SYS_CLOCK_ADJTIME = 5300 - SYS_SYNCFS = 5301 - SYS_SENDMMSG = 5302 - SYS_SETNS = 5303 - SYS_PROCESS_VM_READV = 5304 - SYS_PROCESS_VM_WRITEV = 5305 - SYS_KCMP = 5306 - SYS_FINIT_MODULE = 5307 - SYS_GETDENTS64 = 5308 - SYS_SCHED_SETATTR = 5309 - SYS_SCHED_GETATTR = 5310 - SYS_RENAMEAT2 = 5311 - SYS_SECCOMP = 5312 - SYS_GETRANDOM = 5313 - SYS_MEMFD_CREATE = 5314 - SYS_BPF = 5315 - SYS_EXECVEAT = 5316 - SYS_USERFAULTFD = 5317 - SYS_MEMBARRIER = 5318 - SYS_MLOCK2 = 5319 - SYS_COPY_FILE_RANGE = 5320 - SYS_PREADV2 = 5321 - SYS_PWRITEV2 = 5322 - SYS_PKEY_MPROTECT = 5323 - SYS_PKEY_ALLOC = 5324 - SYS_PKEY_FREE = 5325 - SYS_STATX = 5326 - SYS_RSEQ = 5327 - SYS_IO_PGETEVENTS = 5328 - SYS_PIDFD_SEND_SIGNAL = 5424 - SYS_IO_URING_SETUP = 5425 - SYS_IO_URING_ENTER = 5426 - SYS_IO_URING_REGISTER = 5427 - SYS_OPEN_TREE = 5428 - SYS_MOVE_MOUNT = 5429 - SYS_FSOPEN = 5430 - SYS_FSCONFIG = 5431 - SYS_FSMOUNT = 5432 - SYS_FSPICK = 5433 - SYS_PIDFD_OPEN = 5434 - SYS_CLONE3 = 5435 - SYS_CLOSE_RANGE = 5436 - SYS_OPENAT2 = 5437 - SYS_PIDFD_GETFD = 5438 - SYS_FACCESSAT2 = 5439 - SYS_PROCESS_MADVISE = 5440 - SYS_EPOLL_PWAIT2 = 5441 - SYS_MOUNT_SETATTR = 5442 + SYS_READ = 5000 + SYS_WRITE = 5001 + SYS_OPEN = 5002 + SYS_CLOSE = 5003 + SYS_STAT = 5004 + SYS_FSTAT = 5005 + SYS_LSTAT = 5006 + SYS_POLL = 5007 + SYS_LSEEK = 5008 + SYS_MMAP = 5009 + SYS_MPROTECT = 5010 + SYS_MUNMAP = 5011 + SYS_BRK = 5012 + SYS_RT_SIGACTION = 5013 + SYS_RT_SIGPROCMASK = 5014 + SYS_IOCTL = 5015 + SYS_PREAD64 = 5016 + SYS_PWRITE64 = 5017 + SYS_READV = 5018 + SYS_WRITEV = 5019 + SYS_ACCESS = 5020 + SYS_PIPE = 5021 + SYS__NEWSELECT = 5022 + SYS_SCHED_YIELD = 5023 + SYS_MREMAP = 5024 + SYS_MSYNC = 5025 + SYS_MINCORE = 5026 + SYS_MADVISE = 5027 + SYS_SHMGET = 5028 + SYS_SHMAT = 5029 + SYS_SHMCTL = 5030 + SYS_DUP = 5031 + SYS_DUP2 = 5032 + SYS_PAUSE = 5033 + SYS_NANOSLEEP = 5034 + SYS_GETITIMER = 5035 + SYS_SETITIMER = 5036 + SYS_ALARM = 5037 + SYS_GETPID = 5038 + SYS_SENDFILE = 5039 + SYS_SOCKET = 5040 + SYS_CONNECT = 5041 + SYS_ACCEPT = 5042 + SYS_SENDTO = 5043 + SYS_RECVFROM = 5044 + SYS_SENDMSG = 5045 + SYS_RECVMSG = 5046 + SYS_SHUTDOWN = 5047 + SYS_BIND = 5048 + SYS_LISTEN = 5049 + SYS_GETSOCKNAME = 5050 + SYS_GETPEERNAME = 5051 + SYS_SOCKETPAIR = 5052 + SYS_SETSOCKOPT = 5053 + SYS_GETSOCKOPT = 5054 + SYS_CLONE = 5055 + SYS_FORK = 5056 + SYS_EXECVE = 5057 + SYS_EXIT = 5058 + SYS_WAIT4 = 5059 + SYS_KILL = 5060 + SYS_UNAME = 5061 + SYS_SEMGET = 5062 + SYS_SEMOP = 5063 + SYS_SEMCTL = 5064 + SYS_SHMDT = 5065 + SYS_MSGGET = 5066 + SYS_MSGSND = 5067 + SYS_MSGRCV = 5068 + SYS_MSGCTL = 5069 + SYS_FCNTL = 5070 + SYS_FLOCK = 5071 + SYS_FSYNC = 5072 + SYS_FDATASYNC = 5073 + SYS_TRUNCATE = 5074 + SYS_FTRUNCATE = 5075 + SYS_GETDENTS = 5076 + SYS_GETCWD = 5077 + SYS_CHDIR = 5078 + SYS_FCHDIR = 5079 + SYS_RENAME = 5080 + SYS_MKDIR = 5081 + SYS_RMDIR = 5082 + SYS_CREAT = 5083 + SYS_LINK = 5084 + SYS_UNLINK = 5085 + SYS_SYMLINK = 5086 + SYS_READLINK = 5087 + SYS_CHMOD = 5088 + SYS_FCHMOD = 5089 + SYS_CHOWN = 5090 + SYS_FCHOWN = 5091 + SYS_LCHOWN = 5092 + SYS_UMASK = 5093 + SYS_GETTIMEOFDAY = 5094 + SYS_GETRLIMIT = 5095 + SYS_GETRUSAGE = 5096 + SYS_SYSINFO = 5097 + SYS_TIMES = 5098 + SYS_PTRACE = 5099 + SYS_GETUID = 5100 + SYS_SYSLOG = 5101 + SYS_GETGID = 5102 + SYS_SETUID = 5103 + SYS_SETGID = 5104 + SYS_GETEUID = 5105 + SYS_GETEGID = 5106 + SYS_SETPGID = 5107 + SYS_GETPPID = 5108 + SYS_GETPGRP = 5109 + SYS_SETSID = 5110 + SYS_SETREUID = 5111 + SYS_SETREGID = 5112 + SYS_GETGROUPS = 5113 + SYS_SETGROUPS = 5114 + SYS_SETRESUID = 5115 + SYS_GETRESUID = 5116 + SYS_SETRESGID = 5117 + SYS_GETRESGID = 5118 + SYS_GETPGID = 5119 + SYS_SETFSUID = 5120 + SYS_SETFSGID = 5121 + SYS_GETSID = 5122 + SYS_CAPGET = 5123 + SYS_CAPSET = 5124 + SYS_RT_SIGPENDING = 5125 + SYS_RT_SIGTIMEDWAIT = 5126 + SYS_RT_SIGQUEUEINFO = 5127 + SYS_RT_SIGSUSPEND = 5128 + SYS_SIGALTSTACK = 5129 + SYS_UTIME = 5130 + SYS_MKNOD = 5131 + SYS_PERSONALITY = 5132 + SYS_USTAT = 5133 + SYS_STATFS = 5134 + SYS_FSTATFS = 5135 + SYS_SYSFS = 5136 + SYS_GETPRIORITY = 5137 + SYS_SETPRIORITY = 5138 + SYS_SCHED_SETPARAM = 5139 + SYS_SCHED_GETPARAM = 5140 + SYS_SCHED_SETSCHEDULER = 5141 + SYS_SCHED_GETSCHEDULER = 5142 + SYS_SCHED_GET_PRIORITY_MAX = 5143 + SYS_SCHED_GET_PRIORITY_MIN = 5144 + SYS_SCHED_RR_GET_INTERVAL = 5145 + SYS_MLOCK = 5146 + SYS_MUNLOCK = 5147 + SYS_MLOCKALL = 5148 + SYS_MUNLOCKALL = 5149 + SYS_VHANGUP = 5150 + SYS_PIVOT_ROOT = 5151 + SYS__SYSCTL = 5152 + SYS_PRCTL = 5153 + SYS_ADJTIMEX = 5154 + SYS_SETRLIMIT = 5155 + SYS_CHROOT = 5156 + SYS_SYNC = 5157 + SYS_ACCT = 5158 + SYS_SETTIMEOFDAY = 5159 + SYS_MOUNT = 5160 + SYS_UMOUNT2 = 5161 + SYS_SWAPON = 5162 + SYS_SWAPOFF = 5163 + SYS_REBOOT = 5164 + SYS_SETHOSTNAME = 5165 + SYS_SETDOMAINNAME = 5166 + SYS_CREATE_MODULE = 5167 + SYS_INIT_MODULE = 5168 + SYS_DELETE_MODULE = 5169 + SYS_GET_KERNEL_SYMS = 5170 + SYS_QUERY_MODULE = 5171 + SYS_QUOTACTL = 5172 + SYS_NFSSERVCTL = 5173 + SYS_GETPMSG = 5174 + SYS_PUTPMSG = 5175 + SYS_AFS_SYSCALL = 5176 + SYS_RESERVED177 = 5177 + SYS_GETTID = 5178 + SYS_READAHEAD = 5179 + SYS_SETXATTR = 5180 + SYS_LSETXATTR = 5181 + SYS_FSETXATTR = 5182 + SYS_GETXATTR = 5183 + SYS_LGETXATTR = 5184 + SYS_FGETXATTR = 5185 + SYS_LISTXATTR = 5186 + SYS_LLISTXATTR = 5187 + SYS_FLISTXATTR = 5188 + SYS_REMOVEXATTR = 5189 + SYS_LREMOVEXATTR = 5190 + SYS_FREMOVEXATTR = 5191 + SYS_TKILL = 5192 + SYS_RESERVED193 = 5193 + SYS_FUTEX = 5194 + SYS_SCHED_SETAFFINITY = 5195 + SYS_SCHED_GETAFFINITY = 5196 + SYS_CACHEFLUSH = 5197 + SYS_CACHECTL = 5198 + SYS_SYSMIPS = 5199 + SYS_IO_SETUP = 5200 + SYS_IO_DESTROY = 5201 + SYS_IO_GETEVENTS = 5202 + SYS_IO_SUBMIT = 5203 + SYS_IO_CANCEL = 5204 + SYS_EXIT_GROUP = 5205 + SYS_LOOKUP_DCOOKIE = 5206 + SYS_EPOLL_CREATE = 5207 + SYS_EPOLL_CTL = 5208 + SYS_EPOLL_WAIT = 5209 + SYS_REMAP_FILE_PAGES = 5210 + SYS_RT_SIGRETURN = 5211 + SYS_SET_TID_ADDRESS = 5212 + SYS_RESTART_SYSCALL = 5213 + SYS_SEMTIMEDOP = 5214 + SYS_FADVISE64 = 5215 + SYS_TIMER_CREATE = 5216 + SYS_TIMER_SETTIME = 5217 + SYS_TIMER_GETTIME = 5218 + SYS_TIMER_GETOVERRUN = 5219 + SYS_TIMER_DELETE = 5220 + SYS_CLOCK_SETTIME = 5221 + SYS_CLOCK_GETTIME = 5222 + SYS_CLOCK_GETRES = 5223 + SYS_CLOCK_NANOSLEEP = 5224 + SYS_TGKILL = 5225 + SYS_UTIMES = 5226 + SYS_MBIND = 5227 + SYS_GET_MEMPOLICY = 5228 + SYS_SET_MEMPOLICY = 5229 + SYS_MQ_OPEN = 5230 + SYS_MQ_UNLINK = 5231 + SYS_MQ_TIMEDSEND = 5232 + SYS_MQ_TIMEDRECEIVE = 5233 + SYS_MQ_NOTIFY = 5234 + SYS_MQ_GETSETATTR = 5235 + SYS_VSERVER = 5236 + SYS_WAITID = 5237 + SYS_ADD_KEY = 5239 + SYS_REQUEST_KEY = 5240 + SYS_KEYCTL = 5241 + SYS_SET_THREAD_AREA = 5242 + SYS_INOTIFY_INIT = 5243 + SYS_INOTIFY_ADD_WATCH = 5244 + SYS_INOTIFY_RM_WATCH = 5245 + SYS_MIGRATE_PAGES = 5246 + SYS_OPENAT = 5247 + SYS_MKDIRAT = 5248 + SYS_MKNODAT = 5249 + SYS_FCHOWNAT = 5250 + SYS_FUTIMESAT = 5251 + SYS_NEWFSTATAT = 5252 + SYS_UNLINKAT = 5253 + SYS_RENAMEAT = 5254 + SYS_LINKAT = 5255 + SYS_SYMLINKAT = 5256 + SYS_READLINKAT = 5257 + SYS_FCHMODAT = 5258 + SYS_FACCESSAT = 5259 + SYS_PSELECT6 = 5260 + SYS_PPOLL = 5261 + SYS_UNSHARE = 5262 + SYS_SPLICE = 5263 + SYS_SYNC_FILE_RANGE = 5264 + SYS_TEE = 5265 + SYS_VMSPLICE = 5266 + SYS_MOVE_PAGES = 5267 + SYS_SET_ROBUST_LIST = 5268 + SYS_GET_ROBUST_LIST = 5269 + SYS_KEXEC_LOAD = 5270 + SYS_GETCPU = 5271 + SYS_EPOLL_PWAIT = 5272 + SYS_IOPRIO_SET = 5273 + SYS_IOPRIO_GET = 5274 + SYS_UTIMENSAT = 5275 + SYS_SIGNALFD = 5276 + SYS_TIMERFD = 5277 + SYS_EVENTFD = 5278 + SYS_FALLOCATE = 5279 + SYS_TIMERFD_CREATE = 5280 + SYS_TIMERFD_GETTIME = 5281 + SYS_TIMERFD_SETTIME = 5282 + SYS_SIGNALFD4 = 5283 + SYS_EVENTFD2 = 5284 + SYS_EPOLL_CREATE1 = 5285 + SYS_DUP3 = 5286 + SYS_PIPE2 = 5287 + SYS_INOTIFY_INIT1 = 5288 + SYS_PREADV = 5289 + SYS_PWRITEV = 5290 + SYS_RT_TGSIGQUEUEINFO = 5291 + SYS_PERF_EVENT_OPEN = 5292 + SYS_ACCEPT4 = 5293 + SYS_RECVMMSG = 5294 + SYS_FANOTIFY_INIT = 5295 + SYS_FANOTIFY_MARK = 5296 + SYS_PRLIMIT64 = 5297 + SYS_NAME_TO_HANDLE_AT = 5298 + SYS_OPEN_BY_HANDLE_AT = 5299 + SYS_CLOCK_ADJTIME = 5300 + SYS_SYNCFS = 5301 + SYS_SENDMMSG = 5302 + SYS_SETNS = 5303 + SYS_PROCESS_VM_READV = 5304 + SYS_PROCESS_VM_WRITEV = 5305 + SYS_KCMP = 5306 + SYS_FINIT_MODULE = 5307 + SYS_GETDENTS64 = 5308 + SYS_SCHED_SETATTR = 5309 + SYS_SCHED_GETATTR = 5310 + SYS_RENAMEAT2 = 5311 + SYS_SECCOMP = 5312 + SYS_GETRANDOM = 5313 + SYS_MEMFD_CREATE = 5314 + SYS_BPF = 5315 + SYS_EXECVEAT = 5316 + SYS_USERFAULTFD = 5317 + SYS_MEMBARRIER = 5318 + SYS_MLOCK2 = 5319 + SYS_COPY_FILE_RANGE = 5320 + SYS_PREADV2 = 5321 + SYS_PWRITEV2 = 5322 + SYS_PKEY_MPROTECT = 5323 + SYS_PKEY_ALLOC = 5324 + SYS_PKEY_FREE = 5325 + SYS_STATX = 5326 + SYS_RSEQ = 5327 + SYS_IO_PGETEVENTS = 5328 + SYS_PIDFD_SEND_SIGNAL = 5424 + SYS_IO_URING_SETUP = 5425 + SYS_IO_URING_ENTER = 5426 + SYS_IO_URING_REGISTER = 5427 + SYS_OPEN_TREE = 5428 + SYS_MOVE_MOUNT = 5429 + SYS_FSOPEN = 5430 + SYS_FSCONFIG = 5431 + SYS_FSMOUNT = 5432 + SYS_FSPICK = 5433 + SYS_PIDFD_OPEN = 5434 + SYS_CLONE3 = 5435 + SYS_CLOSE_RANGE = 5436 + SYS_OPENAT2 = 5437 + SYS_PIDFD_GETFD = 5438 + SYS_FACCESSAT2 = 5439 + SYS_PROCESS_MADVISE = 5440 + SYS_EPOLL_PWAIT2 = 5441 + SYS_MOUNT_SETATTR = 5442 + SYS_LANDLOCK_CREATE_RULESET = 5444 + SYS_LANDLOCK_ADD_RULE = 5445 + SYS_LANDLOCK_RESTRICT_SELF = 5446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index 80e6696b39..dcd9265137 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -424,4 +424,7 @@ const ( SYS_PROCESS_MADVISE = 4440 SYS_EPOLL_PWAIT2 = 4441 SYS_MOUNT_SETATTR = 4442 + SYS_LANDLOCK_CREATE_RULESET = 4444 + SYS_LANDLOCK_ADD_RULE = 4445 + SYS_LANDLOCK_RESTRICT_SELF = 4446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index b9d697ffb1..d5ee2c9358 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -431,4 +431,7 @@ const ( SYS_PROCESS_MADVISE = 440 SYS_EPOLL_PWAIT2 = 441 SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index 08edc54d35..fec32207c8 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -7,400 +7,403 @@ package unix const ( - SYS_RESTART_SYSCALL = 0 - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_WAITPID = 7 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECVE = 11 - SYS_CHDIR = 12 - SYS_TIME = 13 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LCHOWN = 16 - SYS_BREAK = 17 - SYS_OLDSTAT = 18 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_MOUNT = 21 - SYS_UMOUNT = 22 - SYS_SETUID = 23 - SYS_GETUID = 24 - SYS_STIME = 25 - SYS_PTRACE = 26 - SYS_ALARM = 27 - SYS_OLDFSTAT = 28 - SYS_PAUSE = 29 - SYS_UTIME = 30 - SYS_STTY = 31 - SYS_GTTY = 32 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_FTIME = 35 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_RENAME = 38 - SYS_MKDIR = 39 - SYS_RMDIR = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_PROF = 44 - SYS_BRK = 45 - SYS_SETGID = 46 - SYS_GETGID = 47 - SYS_SIGNAL = 48 - SYS_GETEUID = 49 - SYS_GETEGID = 50 - SYS_ACCT = 51 - SYS_UMOUNT2 = 52 - SYS_LOCK = 53 - SYS_IOCTL = 54 - SYS_FCNTL = 55 - SYS_MPX = 56 - SYS_SETPGID = 57 - SYS_ULIMIT = 58 - SYS_OLDOLDUNAME = 59 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_USTAT = 62 - SYS_DUP2 = 63 - SYS_GETPPID = 64 - SYS_GETPGRP = 65 - SYS_SETSID = 66 - SYS_SIGACTION = 67 - SYS_SGETMASK = 68 - SYS_SSETMASK = 69 - SYS_SETREUID = 70 - SYS_SETREGID = 71 - SYS_SIGSUSPEND = 72 - SYS_SIGPENDING = 73 - SYS_SETHOSTNAME = 74 - SYS_SETRLIMIT = 75 - SYS_GETRLIMIT = 76 - SYS_GETRUSAGE = 77 - SYS_GETTIMEOFDAY = 78 - SYS_SETTIMEOFDAY = 79 - SYS_GETGROUPS = 80 - SYS_SETGROUPS = 81 - SYS_SELECT = 82 - SYS_SYMLINK = 83 - SYS_OLDLSTAT = 84 - SYS_READLINK = 85 - SYS_USELIB = 86 - SYS_SWAPON = 87 - SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 - SYS_MUNMAP = 91 - SYS_TRUNCATE = 92 - SYS_FTRUNCATE = 93 - SYS_FCHMOD = 94 - SYS_FCHOWN = 95 - SYS_GETPRIORITY = 96 - SYS_SETPRIORITY = 97 - SYS_PROFIL = 98 - SYS_STATFS = 99 - SYS_FSTATFS = 100 - SYS_IOPERM = 101 - SYS_SOCKETCALL = 102 - SYS_SYSLOG = 103 - SYS_SETITIMER = 104 - SYS_GETITIMER = 105 - SYS_STAT = 106 - SYS_LSTAT = 107 - SYS_FSTAT = 108 - SYS_OLDUNAME = 109 - SYS_IOPL = 110 - SYS_VHANGUP = 111 - SYS_IDLE = 112 - SYS_VM86 = 113 - SYS_WAIT4 = 114 - SYS_SWAPOFF = 115 - SYS_SYSINFO = 116 - SYS_IPC = 117 - SYS_FSYNC = 118 - SYS_SIGRETURN = 119 - SYS_CLONE = 120 - SYS_SETDOMAINNAME = 121 - SYS_UNAME = 122 - SYS_MODIFY_LDT = 123 - SYS_ADJTIMEX = 124 - SYS_MPROTECT = 125 - SYS_SIGPROCMASK = 126 - SYS_CREATE_MODULE = 127 - SYS_INIT_MODULE = 128 - SYS_DELETE_MODULE = 129 - SYS_GET_KERNEL_SYMS = 130 - SYS_QUOTACTL = 131 - SYS_GETPGID = 132 - SYS_FCHDIR = 133 - SYS_BDFLUSH = 134 - SYS_SYSFS = 135 - SYS_PERSONALITY = 136 - SYS_AFS_SYSCALL = 137 - SYS_SETFSUID = 138 - SYS_SETFSGID = 139 - SYS__LLSEEK = 140 - SYS_GETDENTS = 141 - SYS__NEWSELECT = 142 - SYS_FLOCK = 143 - SYS_MSYNC = 144 - SYS_READV = 145 - SYS_WRITEV = 146 - SYS_GETSID = 147 - SYS_FDATASYNC = 148 - SYS__SYSCTL = 149 - SYS_MLOCK = 150 - SYS_MUNLOCK = 151 - SYS_MLOCKALL = 152 - SYS_MUNLOCKALL = 153 - SYS_SCHED_SETPARAM = 154 - SYS_SCHED_GETPARAM = 155 - SYS_SCHED_SETSCHEDULER = 156 - SYS_SCHED_GETSCHEDULER = 157 - SYS_SCHED_YIELD = 158 - SYS_SCHED_GET_PRIORITY_MAX = 159 - SYS_SCHED_GET_PRIORITY_MIN = 160 - SYS_SCHED_RR_GET_INTERVAL = 161 - SYS_NANOSLEEP = 162 - SYS_MREMAP = 163 - SYS_SETRESUID = 164 - SYS_GETRESUID = 165 - SYS_QUERY_MODULE = 166 - SYS_POLL = 167 - SYS_NFSSERVCTL = 168 - SYS_SETRESGID = 169 - SYS_GETRESGID = 170 - SYS_PRCTL = 171 - SYS_RT_SIGRETURN = 172 - SYS_RT_SIGACTION = 173 - SYS_RT_SIGPROCMASK = 174 - SYS_RT_SIGPENDING = 175 - SYS_RT_SIGTIMEDWAIT = 176 - SYS_RT_SIGQUEUEINFO = 177 - SYS_RT_SIGSUSPEND = 178 - SYS_PREAD64 = 179 - SYS_PWRITE64 = 180 - SYS_CHOWN = 181 - SYS_GETCWD = 182 - SYS_CAPGET = 183 - SYS_CAPSET = 184 - SYS_SIGALTSTACK = 185 - SYS_SENDFILE = 186 - SYS_GETPMSG = 187 - SYS_PUTPMSG = 188 - SYS_VFORK = 189 - SYS_UGETRLIMIT = 190 - SYS_READAHEAD = 191 - SYS_PCICONFIG_READ = 198 - SYS_PCICONFIG_WRITE = 199 - SYS_PCICONFIG_IOBASE = 200 - SYS_MULTIPLEXER = 201 - SYS_GETDENTS64 = 202 - SYS_PIVOT_ROOT = 203 - SYS_MADVISE = 205 - SYS_MINCORE = 206 - SYS_GETTID = 207 - SYS_TKILL = 208 - SYS_SETXATTR = 209 - SYS_LSETXATTR = 210 - SYS_FSETXATTR = 211 - SYS_GETXATTR = 212 - SYS_LGETXATTR = 213 - SYS_FGETXATTR = 214 - SYS_LISTXATTR = 215 - SYS_LLISTXATTR = 216 - SYS_FLISTXATTR = 217 - SYS_REMOVEXATTR = 218 - SYS_LREMOVEXATTR = 219 - SYS_FREMOVEXATTR = 220 - SYS_FUTEX = 221 - SYS_SCHED_SETAFFINITY = 222 - SYS_SCHED_GETAFFINITY = 223 - SYS_TUXCALL = 225 - SYS_IO_SETUP = 227 - SYS_IO_DESTROY = 228 - SYS_IO_GETEVENTS = 229 - SYS_IO_SUBMIT = 230 - SYS_IO_CANCEL = 231 - SYS_SET_TID_ADDRESS = 232 - SYS_FADVISE64 = 233 - SYS_EXIT_GROUP = 234 - SYS_LOOKUP_DCOOKIE = 235 - SYS_EPOLL_CREATE = 236 - SYS_EPOLL_CTL = 237 - SYS_EPOLL_WAIT = 238 - SYS_REMAP_FILE_PAGES = 239 - SYS_TIMER_CREATE = 240 - SYS_TIMER_SETTIME = 241 - SYS_TIMER_GETTIME = 242 - SYS_TIMER_GETOVERRUN = 243 - SYS_TIMER_DELETE = 244 - SYS_CLOCK_SETTIME = 245 - SYS_CLOCK_GETTIME = 246 - SYS_CLOCK_GETRES = 247 - SYS_CLOCK_NANOSLEEP = 248 - SYS_SWAPCONTEXT = 249 - SYS_TGKILL = 250 - SYS_UTIMES = 251 - SYS_STATFS64 = 252 - SYS_FSTATFS64 = 253 - SYS_RTAS = 255 - SYS_SYS_DEBUG_SETCONTEXT = 256 - SYS_MIGRATE_PAGES = 258 - SYS_MBIND = 259 - SYS_GET_MEMPOLICY = 260 - SYS_SET_MEMPOLICY = 261 - SYS_MQ_OPEN = 262 - SYS_MQ_UNLINK = 263 - SYS_MQ_TIMEDSEND = 264 - SYS_MQ_TIMEDRECEIVE = 265 - SYS_MQ_NOTIFY = 266 - SYS_MQ_GETSETATTR = 267 - SYS_KEXEC_LOAD = 268 - SYS_ADD_KEY = 269 - SYS_REQUEST_KEY = 270 - SYS_KEYCTL = 271 - SYS_WAITID = 272 - SYS_IOPRIO_SET = 273 - SYS_IOPRIO_GET = 274 - SYS_INOTIFY_INIT = 275 - SYS_INOTIFY_ADD_WATCH = 276 - SYS_INOTIFY_RM_WATCH = 277 - SYS_SPU_RUN = 278 - SYS_SPU_CREATE = 279 - SYS_PSELECT6 = 280 - SYS_PPOLL = 281 - SYS_UNSHARE = 282 - SYS_SPLICE = 283 - SYS_TEE = 284 - SYS_VMSPLICE = 285 - SYS_OPENAT = 286 - SYS_MKDIRAT = 287 - SYS_MKNODAT = 288 - SYS_FCHOWNAT = 289 - SYS_FUTIMESAT = 290 - SYS_NEWFSTATAT = 291 - SYS_UNLINKAT = 292 - SYS_RENAMEAT = 293 - SYS_LINKAT = 294 - SYS_SYMLINKAT = 295 - SYS_READLINKAT = 296 - SYS_FCHMODAT = 297 - SYS_FACCESSAT = 298 - SYS_GET_ROBUST_LIST = 299 - SYS_SET_ROBUST_LIST = 300 - SYS_MOVE_PAGES = 301 - SYS_GETCPU = 302 - SYS_EPOLL_PWAIT = 303 - SYS_UTIMENSAT = 304 - SYS_SIGNALFD = 305 - SYS_TIMERFD_CREATE = 306 - SYS_EVENTFD = 307 - SYS_SYNC_FILE_RANGE2 = 308 - SYS_FALLOCATE = 309 - SYS_SUBPAGE_PROT = 310 - SYS_TIMERFD_SETTIME = 311 - SYS_TIMERFD_GETTIME = 312 - SYS_SIGNALFD4 = 313 - SYS_EVENTFD2 = 314 - SYS_EPOLL_CREATE1 = 315 - SYS_DUP3 = 316 - SYS_PIPE2 = 317 - SYS_INOTIFY_INIT1 = 318 - SYS_PERF_EVENT_OPEN = 319 - SYS_PREADV = 320 - SYS_PWRITEV = 321 - SYS_RT_TGSIGQUEUEINFO = 322 - SYS_FANOTIFY_INIT = 323 - SYS_FANOTIFY_MARK = 324 - SYS_PRLIMIT64 = 325 - SYS_SOCKET = 326 - SYS_BIND = 327 - SYS_CONNECT = 328 - SYS_LISTEN = 329 - SYS_ACCEPT = 330 - SYS_GETSOCKNAME = 331 - SYS_GETPEERNAME = 332 - SYS_SOCKETPAIR = 333 - SYS_SEND = 334 - SYS_SENDTO = 335 - SYS_RECV = 336 - SYS_RECVFROM = 337 - SYS_SHUTDOWN = 338 - SYS_SETSOCKOPT = 339 - SYS_GETSOCKOPT = 340 - SYS_SENDMSG = 341 - SYS_RECVMSG = 342 - SYS_RECVMMSG = 343 - SYS_ACCEPT4 = 344 - SYS_NAME_TO_HANDLE_AT = 345 - SYS_OPEN_BY_HANDLE_AT = 346 - SYS_CLOCK_ADJTIME = 347 - SYS_SYNCFS = 348 - SYS_SENDMMSG = 349 - SYS_SETNS = 350 - SYS_PROCESS_VM_READV = 351 - SYS_PROCESS_VM_WRITEV = 352 - SYS_FINIT_MODULE = 353 - SYS_KCMP = 354 - SYS_SCHED_SETATTR = 355 - SYS_SCHED_GETATTR = 356 - SYS_RENAMEAT2 = 357 - SYS_SECCOMP = 358 - SYS_GETRANDOM = 359 - SYS_MEMFD_CREATE = 360 - SYS_BPF = 361 - SYS_EXECVEAT = 362 - SYS_SWITCH_ENDIAN = 363 - SYS_USERFAULTFD = 364 - SYS_MEMBARRIER = 365 - SYS_MLOCK2 = 378 - SYS_COPY_FILE_RANGE = 379 - SYS_PREADV2 = 380 - SYS_PWRITEV2 = 381 - SYS_KEXEC_FILE_LOAD = 382 - SYS_STATX = 383 - SYS_PKEY_ALLOC = 384 - SYS_PKEY_FREE = 385 - SYS_PKEY_MPROTECT = 386 - SYS_RSEQ = 387 - SYS_IO_PGETEVENTS = 388 - SYS_SEMTIMEDOP = 392 - SYS_SEMGET = 393 - SYS_SEMCTL = 394 - SYS_SHMGET = 395 - SYS_SHMCTL = 396 - SYS_SHMAT = 397 - SYS_SHMDT = 398 - SYS_MSGGET = 399 - SYS_MSGSND = 400 - SYS_MSGRCV = 401 - SYS_MSGCTL = 402 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 + SYS_RSEQ = 387 + SYS_IO_PGETEVENTS = 388 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 33b33b0834..53a89b2063 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -7,400 +7,403 @@ package unix const ( - SYS_RESTART_SYSCALL = 0 - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_WAITPID = 7 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECVE = 11 - SYS_CHDIR = 12 - SYS_TIME = 13 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LCHOWN = 16 - SYS_BREAK = 17 - SYS_OLDSTAT = 18 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_MOUNT = 21 - SYS_UMOUNT = 22 - SYS_SETUID = 23 - SYS_GETUID = 24 - SYS_STIME = 25 - SYS_PTRACE = 26 - SYS_ALARM = 27 - SYS_OLDFSTAT = 28 - SYS_PAUSE = 29 - SYS_UTIME = 30 - SYS_STTY = 31 - SYS_GTTY = 32 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_FTIME = 35 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_RENAME = 38 - SYS_MKDIR = 39 - SYS_RMDIR = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_PROF = 44 - SYS_BRK = 45 - SYS_SETGID = 46 - SYS_GETGID = 47 - SYS_SIGNAL = 48 - SYS_GETEUID = 49 - SYS_GETEGID = 50 - SYS_ACCT = 51 - SYS_UMOUNT2 = 52 - SYS_LOCK = 53 - SYS_IOCTL = 54 - SYS_FCNTL = 55 - SYS_MPX = 56 - SYS_SETPGID = 57 - SYS_ULIMIT = 58 - SYS_OLDOLDUNAME = 59 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_USTAT = 62 - SYS_DUP2 = 63 - SYS_GETPPID = 64 - SYS_GETPGRP = 65 - SYS_SETSID = 66 - SYS_SIGACTION = 67 - SYS_SGETMASK = 68 - SYS_SSETMASK = 69 - SYS_SETREUID = 70 - SYS_SETREGID = 71 - SYS_SIGSUSPEND = 72 - SYS_SIGPENDING = 73 - SYS_SETHOSTNAME = 74 - SYS_SETRLIMIT = 75 - SYS_GETRLIMIT = 76 - SYS_GETRUSAGE = 77 - SYS_GETTIMEOFDAY = 78 - SYS_SETTIMEOFDAY = 79 - SYS_GETGROUPS = 80 - SYS_SETGROUPS = 81 - SYS_SELECT = 82 - SYS_SYMLINK = 83 - SYS_OLDLSTAT = 84 - SYS_READLINK = 85 - SYS_USELIB = 86 - SYS_SWAPON = 87 - SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 - SYS_MUNMAP = 91 - SYS_TRUNCATE = 92 - SYS_FTRUNCATE = 93 - SYS_FCHMOD = 94 - SYS_FCHOWN = 95 - SYS_GETPRIORITY = 96 - SYS_SETPRIORITY = 97 - SYS_PROFIL = 98 - SYS_STATFS = 99 - SYS_FSTATFS = 100 - SYS_IOPERM = 101 - SYS_SOCKETCALL = 102 - SYS_SYSLOG = 103 - SYS_SETITIMER = 104 - SYS_GETITIMER = 105 - SYS_STAT = 106 - SYS_LSTAT = 107 - SYS_FSTAT = 108 - SYS_OLDUNAME = 109 - SYS_IOPL = 110 - SYS_VHANGUP = 111 - SYS_IDLE = 112 - SYS_VM86 = 113 - SYS_WAIT4 = 114 - SYS_SWAPOFF = 115 - SYS_SYSINFO = 116 - SYS_IPC = 117 - SYS_FSYNC = 118 - SYS_SIGRETURN = 119 - SYS_CLONE = 120 - SYS_SETDOMAINNAME = 121 - SYS_UNAME = 122 - SYS_MODIFY_LDT = 123 - SYS_ADJTIMEX = 124 - SYS_MPROTECT = 125 - SYS_SIGPROCMASK = 126 - SYS_CREATE_MODULE = 127 - SYS_INIT_MODULE = 128 - SYS_DELETE_MODULE = 129 - SYS_GET_KERNEL_SYMS = 130 - SYS_QUOTACTL = 131 - SYS_GETPGID = 132 - SYS_FCHDIR = 133 - SYS_BDFLUSH = 134 - SYS_SYSFS = 135 - SYS_PERSONALITY = 136 - SYS_AFS_SYSCALL = 137 - SYS_SETFSUID = 138 - SYS_SETFSGID = 139 - SYS__LLSEEK = 140 - SYS_GETDENTS = 141 - SYS__NEWSELECT = 142 - SYS_FLOCK = 143 - SYS_MSYNC = 144 - SYS_READV = 145 - SYS_WRITEV = 146 - SYS_GETSID = 147 - SYS_FDATASYNC = 148 - SYS__SYSCTL = 149 - SYS_MLOCK = 150 - SYS_MUNLOCK = 151 - SYS_MLOCKALL = 152 - SYS_MUNLOCKALL = 153 - SYS_SCHED_SETPARAM = 154 - SYS_SCHED_GETPARAM = 155 - SYS_SCHED_SETSCHEDULER = 156 - SYS_SCHED_GETSCHEDULER = 157 - SYS_SCHED_YIELD = 158 - SYS_SCHED_GET_PRIORITY_MAX = 159 - SYS_SCHED_GET_PRIORITY_MIN = 160 - SYS_SCHED_RR_GET_INTERVAL = 161 - SYS_NANOSLEEP = 162 - SYS_MREMAP = 163 - SYS_SETRESUID = 164 - SYS_GETRESUID = 165 - SYS_QUERY_MODULE = 166 - SYS_POLL = 167 - SYS_NFSSERVCTL = 168 - SYS_SETRESGID = 169 - SYS_GETRESGID = 170 - SYS_PRCTL = 171 - SYS_RT_SIGRETURN = 172 - SYS_RT_SIGACTION = 173 - SYS_RT_SIGPROCMASK = 174 - SYS_RT_SIGPENDING = 175 - SYS_RT_SIGTIMEDWAIT = 176 - SYS_RT_SIGQUEUEINFO = 177 - SYS_RT_SIGSUSPEND = 178 - SYS_PREAD64 = 179 - SYS_PWRITE64 = 180 - SYS_CHOWN = 181 - SYS_GETCWD = 182 - SYS_CAPGET = 183 - SYS_CAPSET = 184 - SYS_SIGALTSTACK = 185 - SYS_SENDFILE = 186 - SYS_GETPMSG = 187 - SYS_PUTPMSG = 188 - SYS_VFORK = 189 - SYS_UGETRLIMIT = 190 - SYS_READAHEAD = 191 - SYS_PCICONFIG_READ = 198 - SYS_PCICONFIG_WRITE = 199 - SYS_PCICONFIG_IOBASE = 200 - SYS_MULTIPLEXER = 201 - SYS_GETDENTS64 = 202 - SYS_PIVOT_ROOT = 203 - SYS_MADVISE = 205 - SYS_MINCORE = 206 - SYS_GETTID = 207 - SYS_TKILL = 208 - SYS_SETXATTR = 209 - SYS_LSETXATTR = 210 - SYS_FSETXATTR = 211 - SYS_GETXATTR = 212 - SYS_LGETXATTR = 213 - SYS_FGETXATTR = 214 - SYS_LISTXATTR = 215 - SYS_LLISTXATTR = 216 - SYS_FLISTXATTR = 217 - SYS_REMOVEXATTR = 218 - SYS_LREMOVEXATTR = 219 - SYS_FREMOVEXATTR = 220 - SYS_FUTEX = 221 - SYS_SCHED_SETAFFINITY = 222 - SYS_SCHED_GETAFFINITY = 223 - SYS_TUXCALL = 225 - SYS_IO_SETUP = 227 - SYS_IO_DESTROY = 228 - SYS_IO_GETEVENTS = 229 - SYS_IO_SUBMIT = 230 - SYS_IO_CANCEL = 231 - SYS_SET_TID_ADDRESS = 232 - SYS_FADVISE64 = 233 - SYS_EXIT_GROUP = 234 - SYS_LOOKUP_DCOOKIE = 235 - SYS_EPOLL_CREATE = 236 - SYS_EPOLL_CTL = 237 - SYS_EPOLL_WAIT = 238 - SYS_REMAP_FILE_PAGES = 239 - SYS_TIMER_CREATE = 240 - SYS_TIMER_SETTIME = 241 - SYS_TIMER_GETTIME = 242 - SYS_TIMER_GETOVERRUN = 243 - SYS_TIMER_DELETE = 244 - SYS_CLOCK_SETTIME = 245 - SYS_CLOCK_GETTIME = 246 - SYS_CLOCK_GETRES = 247 - SYS_CLOCK_NANOSLEEP = 248 - SYS_SWAPCONTEXT = 249 - SYS_TGKILL = 250 - SYS_UTIMES = 251 - SYS_STATFS64 = 252 - SYS_FSTATFS64 = 253 - SYS_RTAS = 255 - SYS_SYS_DEBUG_SETCONTEXT = 256 - SYS_MIGRATE_PAGES = 258 - SYS_MBIND = 259 - SYS_GET_MEMPOLICY = 260 - SYS_SET_MEMPOLICY = 261 - SYS_MQ_OPEN = 262 - SYS_MQ_UNLINK = 263 - SYS_MQ_TIMEDSEND = 264 - SYS_MQ_TIMEDRECEIVE = 265 - SYS_MQ_NOTIFY = 266 - SYS_MQ_GETSETATTR = 267 - SYS_KEXEC_LOAD = 268 - SYS_ADD_KEY = 269 - SYS_REQUEST_KEY = 270 - SYS_KEYCTL = 271 - SYS_WAITID = 272 - SYS_IOPRIO_SET = 273 - SYS_IOPRIO_GET = 274 - SYS_INOTIFY_INIT = 275 - SYS_INOTIFY_ADD_WATCH = 276 - SYS_INOTIFY_RM_WATCH = 277 - SYS_SPU_RUN = 278 - SYS_SPU_CREATE = 279 - SYS_PSELECT6 = 280 - SYS_PPOLL = 281 - SYS_UNSHARE = 282 - SYS_SPLICE = 283 - SYS_TEE = 284 - SYS_VMSPLICE = 285 - SYS_OPENAT = 286 - SYS_MKDIRAT = 287 - SYS_MKNODAT = 288 - SYS_FCHOWNAT = 289 - SYS_FUTIMESAT = 290 - SYS_NEWFSTATAT = 291 - SYS_UNLINKAT = 292 - SYS_RENAMEAT = 293 - SYS_LINKAT = 294 - SYS_SYMLINKAT = 295 - SYS_READLINKAT = 296 - SYS_FCHMODAT = 297 - SYS_FACCESSAT = 298 - SYS_GET_ROBUST_LIST = 299 - SYS_SET_ROBUST_LIST = 300 - SYS_MOVE_PAGES = 301 - SYS_GETCPU = 302 - SYS_EPOLL_PWAIT = 303 - SYS_UTIMENSAT = 304 - SYS_SIGNALFD = 305 - SYS_TIMERFD_CREATE = 306 - SYS_EVENTFD = 307 - SYS_SYNC_FILE_RANGE2 = 308 - SYS_FALLOCATE = 309 - SYS_SUBPAGE_PROT = 310 - SYS_TIMERFD_SETTIME = 311 - SYS_TIMERFD_GETTIME = 312 - SYS_SIGNALFD4 = 313 - SYS_EVENTFD2 = 314 - SYS_EPOLL_CREATE1 = 315 - SYS_DUP3 = 316 - SYS_PIPE2 = 317 - SYS_INOTIFY_INIT1 = 318 - SYS_PERF_EVENT_OPEN = 319 - SYS_PREADV = 320 - SYS_PWRITEV = 321 - SYS_RT_TGSIGQUEUEINFO = 322 - SYS_FANOTIFY_INIT = 323 - SYS_FANOTIFY_MARK = 324 - SYS_PRLIMIT64 = 325 - SYS_SOCKET = 326 - SYS_BIND = 327 - SYS_CONNECT = 328 - SYS_LISTEN = 329 - SYS_ACCEPT = 330 - SYS_GETSOCKNAME = 331 - SYS_GETPEERNAME = 332 - SYS_SOCKETPAIR = 333 - SYS_SEND = 334 - SYS_SENDTO = 335 - SYS_RECV = 336 - SYS_RECVFROM = 337 - SYS_SHUTDOWN = 338 - SYS_SETSOCKOPT = 339 - SYS_GETSOCKOPT = 340 - SYS_SENDMSG = 341 - SYS_RECVMSG = 342 - SYS_RECVMMSG = 343 - SYS_ACCEPT4 = 344 - SYS_NAME_TO_HANDLE_AT = 345 - SYS_OPEN_BY_HANDLE_AT = 346 - SYS_CLOCK_ADJTIME = 347 - SYS_SYNCFS = 348 - SYS_SENDMMSG = 349 - SYS_SETNS = 350 - SYS_PROCESS_VM_READV = 351 - SYS_PROCESS_VM_WRITEV = 352 - SYS_FINIT_MODULE = 353 - SYS_KCMP = 354 - SYS_SCHED_SETATTR = 355 - SYS_SCHED_GETATTR = 356 - SYS_RENAMEAT2 = 357 - SYS_SECCOMP = 358 - SYS_GETRANDOM = 359 - SYS_MEMFD_CREATE = 360 - SYS_BPF = 361 - SYS_EXECVEAT = 362 - SYS_SWITCH_ENDIAN = 363 - SYS_USERFAULTFD = 364 - SYS_MEMBARRIER = 365 - SYS_MLOCK2 = 378 - SYS_COPY_FILE_RANGE = 379 - SYS_PREADV2 = 380 - SYS_PWRITEV2 = 381 - SYS_KEXEC_FILE_LOAD = 382 - SYS_STATX = 383 - SYS_PKEY_ALLOC = 384 - SYS_PKEY_FREE = 385 - SYS_PKEY_MPROTECT = 386 - SYS_RSEQ = 387 - SYS_IO_PGETEVENTS = 388 - SYS_SEMTIMEDOP = 392 - SYS_SEMGET = 393 - SYS_SEMCTL = 394 - SYS_SHMGET = 395 - SYS_SHMCTL = 396 - SYS_SHMAT = 397 - SYS_SHMDT = 398 - SYS_MSGGET = 399 - SYS_MSGSND = 400 - SYS_MSGRCV = 401 - SYS_MSGCTL = 402 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAITPID = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_TIME = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BREAK = 17 + SYS_OLDSTAT = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_STIME = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_OLDFSTAT = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_STTY = 31 + SYS_GTTY = 32 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_FTIME = 35 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_PROF = 44 + SYS_BRK = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_LOCK = 53 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_MPX = 56 + SYS_SETPGID = 57 + SYS_ULIMIT = 58 + SYS_OLDOLDUNAME = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SGETMASK = 68 + SYS_SSETMASK = 69 + SYS_SETREUID = 70 + SYS_SETREGID = 71 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRLIMIT = 76 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_GETGROUPS = 80 + SYS_SETGROUPS = 81 + SYS_SELECT = 82 + SYS_SYMLINK = 83 + SYS_OLDLSTAT = 84 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_FCHOWN = 95 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_PROFIL = 98 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_IOPERM = 101 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_OLDUNAME = 109 + SYS_IOPL = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_VM86 = 113 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_MODIFY_LDT = 123 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_SETFSUID = 138 + SYS_SETFSGID = 139 + SYS__LLSEEK = 140 + SYS_GETDENTS = 141 + SYS__NEWSELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_SETRESUID = 164 + SYS_GETRESUID = 165 + SYS_QUERY_MODULE = 166 + SYS_POLL = 167 + SYS_NFSSERVCTL = 168 + SYS_SETRESGID = 169 + SYS_GETRESGID = 170 + SYS_PRCTL = 171 + SYS_RT_SIGRETURN = 172 + SYS_RT_SIGACTION = 173 + SYS_RT_SIGPROCMASK = 174 + SYS_RT_SIGPENDING = 175 + SYS_RT_SIGTIMEDWAIT = 176 + SYS_RT_SIGQUEUEINFO = 177 + SYS_RT_SIGSUSPEND = 178 + SYS_PREAD64 = 179 + SYS_PWRITE64 = 180 + SYS_CHOWN = 181 + SYS_GETCWD = 182 + SYS_CAPGET = 183 + SYS_CAPSET = 184 + SYS_SIGALTSTACK = 185 + SYS_SENDFILE = 186 + SYS_GETPMSG = 187 + SYS_PUTPMSG = 188 + SYS_VFORK = 189 + SYS_UGETRLIMIT = 190 + SYS_READAHEAD = 191 + SYS_PCICONFIG_READ = 198 + SYS_PCICONFIG_WRITE = 199 + SYS_PCICONFIG_IOBASE = 200 + SYS_MULTIPLEXER = 201 + SYS_GETDENTS64 = 202 + SYS_PIVOT_ROOT = 203 + SYS_MADVISE = 205 + SYS_MINCORE = 206 + SYS_GETTID = 207 + SYS_TKILL = 208 + SYS_SETXATTR = 209 + SYS_LSETXATTR = 210 + SYS_FSETXATTR = 211 + SYS_GETXATTR = 212 + SYS_LGETXATTR = 213 + SYS_FGETXATTR = 214 + SYS_LISTXATTR = 215 + SYS_LLISTXATTR = 216 + SYS_FLISTXATTR = 217 + SYS_REMOVEXATTR = 218 + SYS_LREMOVEXATTR = 219 + SYS_FREMOVEXATTR = 220 + SYS_FUTEX = 221 + SYS_SCHED_SETAFFINITY = 222 + SYS_SCHED_GETAFFINITY = 223 + SYS_TUXCALL = 225 + SYS_IO_SETUP = 227 + SYS_IO_DESTROY = 228 + SYS_IO_GETEVENTS = 229 + SYS_IO_SUBMIT = 230 + SYS_IO_CANCEL = 231 + SYS_SET_TID_ADDRESS = 232 + SYS_FADVISE64 = 233 + SYS_EXIT_GROUP = 234 + SYS_LOOKUP_DCOOKIE = 235 + SYS_EPOLL_CREATE = 236 + SYS_EPOLL_CTL = 237 + SYS_EPOLL_WAIT = 238 + SYS_REMAP_FILE_PAGES = 239 + SYS_TIMER_CREATE = 240 + SYS_TIMER_SETTIME = 241 + SYS_TIMER_GETTIME = 242 + SYS_TIMER_GETOVERRUN = 243 + SYS_TIMER_DELETE = 244 + SYS_CLOCK_SETTIME = 245 + SYS_CLOCK_GETTIME = 246 + SYS_CLOCK_GETRES = 247 + SYS_CLOCK_NANOSLEEP = 248 + SYS_SWAPCONTEXT = 249 + SYS_TGKILL = 250 + SYS_UTIMES = 251 + SYS_STATFS64 = 252 + SYS_FSTATFS64 = 253 + SYS_RTAS = 255 + SYS_SYS_DEBUG_SETCONTEXT = 256 + SYS_MIGRATE_PAGES = 258 + SYS_MBIND = 259 + SYS_GET_MEMPOLICY = 260 + SYS_SET_MEMPOLICY = 261 + SYS_MQ_OPEN = 262 + SYS_MQ_UNLINK = 263 + SYS_MQ_TIMEDSEND = 264 + SYS_MQ_TIMEDRECEIVE = 265 + SYS_MQ_NOTIFY = 266 + SYS_MQ_GETSETATTR = 267 + SYS_KEXEC_LOAD = 268 + SYS_ADD_KEY = 269 + SYS_REQUEST_KEY = 270 + SYS_KEYCTL = 271 + SYS_WAITID = 272 + SYS_IOPRIO_SET = 273 + SYS_IOPRIO_GET = 274 + SYS_INOTIFY_INIT = 275 + SYS_INOTIFY_ADD_WATCH = 276 + SYS_INOTIFY_RM_WATCH = 277 + SYS_SPU_RUN = 278 + SYS_SPU_CREATE = 279 + SYS_PSELECT6 = 280 + SYS_PPOLL = 281 + SYS_UNSHARE = 282 + SYS_SPLICE = 283 + SYS_TEE = 284 + SYS_VMSPLICE = 285 + SYS_OPENAT = 286 + SYS_MKDIRAT = 287 + SYS_MKNODAT = 288 + SYS_FCHOWNAT = 289 + SYS_FUTIMESAT = 290 + SYS_NEWFSTATAT = 291 + SYS_UNLINKAT = 292 + SYS_RENAMEAT = 293 + SYS_LINKAT = 294 + SYS_SYMLINKAT = 295 + SYS_READLINKAT = 296 + SYS_FCHMODAT = 297 + SYS_FACCESSAT = 298 + SYS_GET_ROBUST_LIST = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_MOVE_PAGES = 301 + SYS_GETCPU = 302 + SYS_EPOLL_PWAIT = 303 + SYS_UTIMENSAT = 304 + SYS_SIGNALFD = 305 + SYS_TIMERFD_CREATE = 306 + SYS_EVENTFD = 307 + SYS_SYNC_FILE_RANGE2 = 308 + SYS_FALLOCATE = 309 + SYS_SUBPAGE_PROT = 310 + SYS_TIMERFD_SETTIME = 311 + SYS_TIMERFD_GETTIME = 312 + SYS_SIGNALFD4 = 313 + SYS_EVENTFD2 = 314 + SYS_EPOLL_CREATE1 = 315 + SYS_DUP3 = 316 + SYS_PIPE2 = 317 + SYS_INOTIFY_INIT1 = 318 + SYS_PERF_EVENT_OPEN = 319 + SYS_PREADV = 320 + SYS_PWRITEV = 321 + SYS_RT_TGSIGQUEUEINFO = 322 + SYS_FANOTIFY_INIT = 323 + SYS_FANOTIFY_MARK = 324 + SYS_PRLIMIT64 = 325 + SYS_SOCKET = 326 + SYS_BIND = 327 + SYS_CONNECT = 328 + SYS_LISTEN = 329 + SYS_ACCEPT = 330 + SYS_GETSOCKNAME = 331 + SYS_GETPEERNAME = 332 + SYS_SOCKETPAIR = 333 + SYS_SEND = 334 + SYS_SENDTO = 335 + SYS_RECV = 336 + SYS_RECVFROM = 337 + SYS_SHUTDOWN = 338 + SYS_SETSOCKOPT = 339 + SYS_GETSOCKOPT = 340 + SYS_SENDMSG = 341 + SYS_RECVMSG = 342 + SYS_RECVMMSG = 343 + SYS_ACCEPT4 = 344 + SYS_NAME_TO_HANDLE_AT = 345 + SYS_OPEN_BY_HANDLE_AT = 346 + SYS_CLOCK_ADJTIME = 347 + SYS_SYNCFS = 348 + SYS_SENDMMSG = 349 + SYS_SETNS = 350 + SYS_PROCESS_VM_READV = 351 + SYS_PROCESS_VM_WRITEV = 352 + SYS_FINIT_MODULE = 353 + SYS_KCMP = 354 + SYS_SCHED_SETATTR = 355 + SYS_SCHED_GETATTR = 356 + SYS_RENAMEAT2 = 357 + SYS_SECCOMP = 358 + SYS_GETRANDOM = 359 + SYS_MEMFD_CREATE = 360 + SYS_BPF = 361 + SYS_EXECVEAT = 362 + SYS_SWITCH_ENDIAN = 363 + SYS_USERFAULTFD = 364 + SYS_MEMBARRIER = 365 + SYS_MLOCK2 = 378 + SYS_COPY_FILE_RANGE = 379 + SYS_PREADV2 = 380 + SYS_PWRITEV2 = 381 + SYS_KEXEC_FILE_LOAD = 382 + SYS_STATX = 383 + SYS_PKEY_ALLOC = 384 + SYS_PKEY_FREE = 385 + SYS_PKEY_MPROTECT = 386 + SYS_RSEQ = 387 + SYS_IO_PGETEVENTS = 388 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 66c8a8e09e..0db9fbba5f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -7,302 +7,305 @@ package unix const ( - SYS_IO_SETUP = 0 - SYS_IO_DESTROY = 1 - SYS_IO_SUBMIT = 2 - SYS_IO_CANCEL = 3 - SYS_IO_GETEVENTS = 4 - SYS_SETXATTR = 5 - SYS_LSETXATTR = 6 - SYS_FSETXATTR = 7 - SYS_GETXATTR = 8 - SYS_LGETXATTR = 9 - SYS_FGETXATTR = 10 - SYS_LISTXATTR = 11 - SYS_LLISTXATTR = 12 - SYS_FLISTXATTR = 13 - SYS_REMOVEXATTR = 14 - SYS_LREMOVEXATTR = 15 - SYS_FREMOVEXATTR = 16 - SYS_GETCWD = 17 - SYS_LOOKUP_DCOOKIE = 18 - SYS_EVENTFD2 = 19 - SYS_EPOLL_CREATE1 = 20 - SYS_EPOLL_CTL = 21 - SYS_EPOLL_PWAIT = 22 - SYS_DUP = 23 - SYS_DUP3 = 24 - SYS_FCNTL = 25 - SYS_INOTIFY_INIT1 = 26 - SYS_INOTIFY_ADD_WATCH = 27 - SYS_INOTIFY_RM_WATCH = 28 - SYS_IOCTL = 29 - SYS_IOPRIO_SET = 30 - SYS_IOPRIO_GET = 31 - SYS_FLOCK = 32 - SYS_MKNODAT = 33 - SYS_MKDIRAT = 34 - SYS_UNLINKAT = 35 - SYS_SYMLINKAT = 36 - SYS_LINKAT = 37 - SYS_UMOUNT2 = 39 - SYS_MOUNT = 40 - SYS_PIVOT_ROOT = 41 - SYS_NFSSERVCTL = 42 - SYS_STATFS = 43 - SYS_FSTATFS = 44 - SYS_TRUNCATE = 45 - SYS_FTRUNCATE = 46 - SYS_FALLOCATE = 47 - SYS_FACCESSAT = 48 - SYS_CHDIR = 49 - SYS_FCHDIR = 50 - SYS_CHROOT = 51 - SYS_FCHMOD = 52 - SYS_FCHMODAT = 53 - SYS_FCHOWNAT = 54 - SYS_FCHOWN = 55 - SYS_OPENAT = 56 - SYS_CLOSE = 57 - SYS_VHANGUP = 58 - SYS_PIPE2 = 59 - SYS_QUOTACTL = 60 - SYS_GETDENTS64 = 61 - SYS_LSEEK = 62 - SYS_READ = 63 - SYS_WRITE = 64 - SYS_READV = 65 - SYS_WRITEV = 66 - SYS_PREAD64 = 67 - SYS_PWRITE64 = 68 - SYS_PREADV = 69 - SYS_PWRITEV = 70 - SYS_SENDFILE = 71 - SYS_PSELECT6 = 72 - SYS_PPOLL = 73 - SYS_SIGNALFD4 = 74 - SYS_VMSPLICE = 75 - SYS_SPLICE = 76 - SYS_TEE = 77 - SYS_READLINKAT = 78 - SYS_FSTATAT = 79 - SYS_FSTAT = 80 - SYS_SYNC = 81 - SYS_FSYNC = 82 - SYS_FDATASYNC = 83 - SYS_SYNC_FILE_RANGE = 84 - SYS_TIMERFD_CREATE = 85 - SYS_TIMERFD_SETTIME = 86 - SYS_TIMERFD_GETTIME = 87 - SYS_UTIMENSAT = 88 - SYS_ACCT = 89 - SYS_CAPGET = 90 - SYS_CAPSET = 91 - SYS_PERSONALITY = 92 - SYS_EXIT = 93 - SYS_EXIT_GROUP = 94 - SYS_WAITID = 95 - SYS_SET_TID_ADDRESS = 96 - SYS_UNSHARE = 97 - SYS_FUTEX = 98 - SYS_SET_ROBUST_LIST = 99 - SYS_GET_ROBUST_LIST = 100 - SYS_NANOSLEEP = 101 - SYS_GETITIMER = 102 - SYS_SETITIMER = 103 - SYS_KEXEC_LOAD = 104 - SYS_INIT_MODULE = 105 - SYS_DELETE_MODULE = 106 - SYS_TIMER_CREATE = 107 - SYS_TIMER_GETTIME = 108 - SYS_TIMER_GETOVERRUN = 109 - SYS_TIMER_SETTIME = 110 - SYS_TIMER_DELETE = 111 - SYS_CLOCK_SETTIME = 112 - SYS_CLOCK_GETTIME = 113 - SYS_CLOCK_GETRES = 114 - SYS_CLOCK_NANOSLEEP = 115 - SYS_SYSLOG = 116 - SYS_PTRACE = 117 - SYS_SCHED_SETPARAM = 118 - SYS_SCHED_SETSCHEDULER = 119 - SYS_SCHED_GETSCHEDULER = 120 - SYS_SCHED_GETPARAM = 121 - SYS_SCHED_SETAFFINITY = 122 - SYS_SCHED_GETAFFINITY = 123 - SYS_SCHED_YIELD = 124 - SYS_SCHED_GET_PRIORITY_MAX = 125 - SYS_SCHED_GET_PRIORITY_MIN = 126 - SYS_SCHED_RR_GET_INTERVAL = 127 - SYS_RESTART_SYSCALL = 128 - SYS_KILL = 129 - SYS_TKILL = 130 - SYS_TGKILL = 131 - SYS_SIGALTSTACK = 132 - SYS_RT_SIGSUSPEND = 133 - SYS_RT_SIGACTION = 134 - SYS_RT_SIGPROCMASK = 135 - SYS_RT_SIGPENDING = 136 - SYS_RT_SIGTIMEDWAIT = 137 - SYS_RT_SIGQUEUEINFO = 138 - SYS_RT_SIGRETURN = 139 - SYS_SETPRIORITY = 140 - SYS_GETPRIORITY = 141 - SYS_REBOOT = 142 - SYS_SETREGID = 143 - SYS_SETGID = 144 - SYS_SETREUID = 145 - SYS_SETUID = 146 - SYS_SETRESUID = 147 - SYS_GETRESUID = 148 - SYS_SETRESGID = 149 - SYS_GETRESGID = 150 - SYS_SETFSUID = 151 - SYS_SETFSGID = 152 - SYS_TIMES = 153 - SYS_SETPGID = 154 - SYS_GETPGID = 155 - SYS_GETSID = 156 - SYS_SETSID = 157 - SYS_GETGROUPS = 158 - SYS_SETGROUPS = 159 - SYS_UNAME = 160 - SYS_SETHOSTNAME = 161 - SYS_SETDOMAINNAME = 162 - SYS_GETRLIMIT = 163 - SYS_SETRLIMIT = 164 - SYS_GETRUSAGE = 165 - SYS_UMASK = 166 - SYS_PRCTL = 167 - SYS_GETCPU = 168 - SYS_GETTIMEOFDAY = 169 - SYS_SETTIMEOFDAY = 170 - SYS_ADJTIMEX = 171 - SYS_GETPID = 172 - SYS_GETPPID = 173 - SYS_GETUID = 174 - SYS_GETEUID = 175 - SYS_GETGID = 176 - SYS_GETEGID = 177 - SYS_GETTID = 178 - SYS_SYSINFO = 179 - SYS_MQ_OPEN = 180 - SYS_MQ_UNLINK = 181 - SYS_MQ_TIMEDSEND = 182 - SYS_MQ_TIMEDRECEIVE = 183 - SYS_MQ_NOTIFY = 184 - SYS_MQ_GETSETATTR = 185 - SYS_MSGGET = 186 - SYS_MSGCTL = 187 - SYS_MSGRCV = 188 - SYS_MSGSND = 189 - SYS_SEMGET = 190 - SYS_SEMCTL = 191 - SYS_SEMTIMEDOP = 192 - SYS_SEMOP = 193 - SYS_SHMGET = 194 - SYS_SHMCTL = 195 - SYS_SHMAT = 196 - SYS_SHMDT = 197 - SYS_SOCKET = 198 - SYS_SOCKETPAIR = 199 - SYS_BIND = 200 - SYS_LISTEN = 201 - SYS_ACCEPT = 202 - SYS_CONNECT = 203 - SYS_GETSOCKNAME = 204 - SYS_GETPEERNAME = 205 - SYS_SENDTO = 206 - SYS_RECVFROM = 207 - SYS_SETSOCKOPT = 208 - SYS_GETSOCKOPT = 209 - SYS_SHUTDOWN = 210 - SYS_SENDMSG = 211 - SYS_RECVMSG = 212 - SYS_READAHEAD = 213 - SYS_BRK = 214 - SYS_MUNMAP = 215 - SYS_MREMAP = 216 - SYS_ADD_KEY = 217 - SYS_REQUEST_KEY = 218 - SYS_KEYCTL = 219 - SYS_CLONE = 220 - SYS_EXECVE = 221 - SYS_MMAP = 222 - SYS_FADVISE64 = 223 - SYS_SWAPON = 224 - SYS_SWAPOFF = 225 - SYS_MPROTECT = 226 - SYS_MSYNC = 227 - SYS_MLOCK = 228 - SYS_MUNLOCK = 229 - SYS_MLOCKALL = 230 - SYS_MUNLOCKALL = 231 - SYS_MINCORE = 232 - SYS_MADVISE = 233 - SYS_REMAP_FILE_PAGES = 234 - SYS_MBIND = 235 - SYS_GET_MEMPOLICY = 236 - SYS_SET_MEMPOLICY = 237 - SYS_MIGRATE_PAGES = 238 - SYS_MOVE_PAGES = 239 - SYS_RT_TGSIGQUEUEINFO = 240 - SYS_PERF_EVENT_OPEN = 241 - SYS_ACCEPT4 = 242 - SYS_RECVMMSG = 243 - SYS_ARCH_SPECIFIC_SYSCALL = 244 - SYS_WAIT4 = 260 - SYS_PRLIMIT64 = 261 - SYS_FANOTIFY_INIT = 262 - SYS_FANOTIFY_MARK = 263 - SYS_NAME_TO_HANDLE_AT = 264 - SYS_OPEN_BY_HANDLE_AT = 265 - SYS_CLOCK_ADJTIME = 266 - SYS_SYNCFS = 267 - SYS_SETNS = 268 - SYS_SENDMMSG = 269 - SYS_PROCESS_VM_READV = 270 - SYS_PROCESS_VM_WRITEV = 271 - SYS_KCMP = 272 - SYS_FINIT_MODULE = 273 - SYS_SCHED_SETATTR = 274 - SYS_SCHED_GETATTR = 275 - SYS_RENAMEAT2 = 276 - SYS_SECCOMP = 277 - SYS_GETRANDOM = 278 - SYS_MEMFD_CREATE = 279 - SYS_BPF = 280 - SYS_EXECVEAT = 281 - SYS_USERFAULTFD = 282 - SYS_MEMBARRIER = 283 - SYS_MLOCK2 = 284 - SYS_COPY_FILE_RANGE = 285 - SYS_PREADV2 = 286 - SYS_PWRITEV2 = 287 - SYS_PKEY_MPROTECT = 288 - SYS_PKEY_ALLOC = 289 - SYS_PKEY_FREE = 290 - SYS_STATX = 291 - SYS_IO_PGETEVENTS = 292 - SYS_RSEQ = 293 - SYS_KEXEC_FILE_LOAD = 294 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_IO_SETUP = 0 + SYS_IO_DESTROY = 1 + SYS_IO_SUBMIT = 2 + SYS_IO_CANCEL = 3 + SYS_IO_GETEVENTS = 4 + SYS_SETXATTR = 5 + SYS_LSETXATTR = 6 + SYS_FSETXATTR = 7 + SYS_GETXATTR = 8 + SYS_LGETXATTR = 9 + SYS_FGETXATTR = 10 + SYS_LISTXATTR = 11 + SYS_LLISTXATTR = 12 + SYS_FLISTXATTR = 13 + SYS_REMOVEXATTR = 14 + SYS_LREMOVEXATTR = 15 + SYS_FREMOVEXATTR = 16 + SYS_GETCWD = 17 + SYS_LOOKUP_DCOOKIE = 18 + SYS_EVENTFD2 = 19 + SYS_EPOLL_CREATE1 = 20 + SYS_EPOLL_CTL = 21 + SYS_EPOLL_PWAIT = 22 + SYS_DUP = 23 + SYS_DUP3 = 24 + SYS_FCNTL = 25 + SYS_INOTIFY_INIT1 = 26 + SYS_INOTIFY_ADD_WATCH = 27 + SYS_INOTIFY_RM_WATCH = 28 + SYS_IOCTL = 29 + SYS_IOPRIO_SET = 30 + SYS_IOPRIO_GET = 31 + SYS_FLOCK = 32 + SYS_MKNODAT = 33 + SYS_MKDIRAT = 34 + SYS_UNLINKAT = 35 + SYS_SYMLINKAT = 36 + SYS_LINKAT = 37 + SYS_UMOUNT2 = 39 + SYS_MOUNT = 40 + SYS_PIVOT_ROOT = 41 + SYS_NFSSERVCTL = 42 + SYS_STATFS = 43 + SYS_FSTATFS = 44 + SYS_TRUNCATE = 45 + SYS_FTRUNCATE = 46 + SYS_FALLOCATE = 47 + SYS_FACCESSAT = 48 + SYS_CHDIR = 49 + SYS_FCHDIR = 50 + SYS_CHROOT = 51 + SYS_FCHMOD = 52 + SYS_FCHMODAT = 53 + SYS_FCHOWNAT = 54 + SYS_FCHOWN = 55 + SYS_OPENAT = 56 + SYS_CLOSE = 57 + SYS_VHANGUP = 58 + SYS_PIPE2 = 59 + SYS_QUOTACTL = 60 + SYS_GETDENTS64 = 61 + SYS_LSEEK = 62 + SYS_READ = 63 + SYS_WRITE = 64 + SYS_READV = 65 + SYS_WRITEV = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_PREADV = 69 + SYS_PWRITEV = 70 + SYS_SENDFILE = 71 + SYS_PSELECT6 = 72 + SYS_PPOLL = 73 + SYS_SIGNALFD4 = 74 + SYS_VMSPLICE = 75 + SYS_SPLICE = 76 + SYS_TEE = 77 + SYS_READLINKAT = 78 + SYS_FSTATAT = 79 + SYS_FSTAT = 80 + SYS_SYNC = 81 + SYS_FSYNC = 82 + SYS_FDATASYNC = 83 + SYS_SYNC_FILE_RANGE = 84 + SYS_TIMERFD_CREATE = 85 + SYS_TIMERFD_SETTIME = 86 + SYS_TIMERFD_GETTIME = 87 + SYS_UTIMENSAT = 88 + SYS_ACCT = 89 + SYS_CAPGET = 90 + SYS_CAPSET = 91 + SYS_PERSONALITY = 92 + SYS_EXIT = 93 + SYS_EXIT_GROUP = 94 + SYS_WAITID = 95 + SYS_SET_TID_ADDRESS = 96 + SYS_UNSHARE = 97 + SYS_FUTEX = 98 + SYS_SET_ROBUST_LIST = 99 + SYS_GET_ROBUST_LIST = 100 + SYS_NANOSLEEP = 101 + SYS_GETITIMER = 102 + SYS_SETITIMER = 103 + SYS_KEXEC_LOAD = 104 + SYS_INIT_MODULE = 105 + SYS_DELETE_MODULE = 106 + SYS_TIMER_CREATE = 107 + SYS_TIMER_GETTIME = 108 + SYS_TIMER_GETOVERRUN = 109 + SYS_TIMER_SETTIME = 110 + SYS_TIMER_DELETE = 111 + SYS_CLOCK_SETTIME = 112 + SYS_CLOCK_GETTIME = 113 + SYS_CLOCK_GETRES = 114 + SYS_CLOCK_NANOSLEEP = 115 + SYS_SYSLOG = 116 + SYS_PTRACE = 117 + SYS_SCHED_SETPARAM = 118 + SYS_SCHED_SETSCHEDULER = 119 + SYS_SCHED_GETSCHEDULER = 120 + SYS_SCHED_GETPARAM = 121 + SYS_SCHED_SETAFFINITY = 122 + SYS_SCHED_GETAFFINITY = 123 + SYS_SCHED_YIELD = 124 + SYS_SCHED_GET_PRIORITY_MAX = 125 + SYS_SCHED_GET_PRIORITY_MIN = 126 + SYS_SCHED_RR_GET_INTERVAL = 127 + SYS_RESTART_SYSCALL = 128 + SYS_KILL = 129 + SYS_TKILL = 130 + SYS_TGKILL = 131 + SYS_SIGALTSTACK = 132 + SYS_RT_SIGSUSPEND = 133 + SYS_RT_SIGACTION = 134 + SYS_RT_SIGPROCMASK = 135 + SYS_RT_SIGPENDING = 136 + SYS_RT_SIGTIMEDWAIT = 137 + SYS_RT_SIGQUEUEINFO = 138 + SYS_RT_SIGRETURN = 139 + SYS_SETPRIORITY = 140 + SYS_GETPRIORITY = 141 + SYS_REBOOT = 142 + SYS_SETREGID = 143 + SYS_SETGID = 144 + SYS_SETREUID = 145 + SYS_SETUID = 146 + SYS_SETRESUID = 147 + SYS_GETRESUID = 148 + SYS_SETRESGID = 149 + SYS_GETRESGID = 150 + SYS_SETFSUID = 151 + SYS_SETFSGID = 152 + SYS_TIMES = 153 + SYS_SETPGID = 154 + SYS_GETPGID = 155 + SYS_GETSID = 156 + SYS_SETSID = 157 + SYS_GETGROUPS = 158 + SYS_SETGROUPS = 159 + SYS_UNAME = 160 + SYS_SETHOSTNAME = 161 + SYS_SETDOMAINNAME = 162 + SYS_GETRLIMIT = 163 + SYS_SETRLIMIT = 164 + SYS_GETRUSAGE = 165 + SYS_UMASK = 166 + SYS_PRCTL = 167 + SYS_GETCPU = 168 + SYS_GETTIMEOFDAY = 169 + SYS_SETTIMEOFDAY = 170 + SYS_ADJTIMEX = 171 + SYS_GETPID = 172 + SYS_GETPPID = 173 + SYS_GETUID = 174 + SYS_GETEUID = 175 + SYS_GETGID = 176 + SYS_GETEGID = 177 + SYS_GETTID = 178 + SYS_SYSINFO = 179 + SYS_MQ_OPEN = 180 + SYS_MQ_UNLINK = 181 + SYS_MQ_TIMEDSEND = 182 + SYS_MQ_TIMEDRECEIVE = 183 + SYS_MQ_NOTIFY = 184 + SYS_MQ_GETSETATTR = 185 + SYS_MSGGET = 186 + SYS_MSGCTL = 187 + SYS_MSGRCV = 188 + SYS_MSGSND = 189 + SYS_SEMGET = 190 + SYS_SEMCTL = 191 + SYS_SEMTIMEDOP = 192 + SYS_SEMOP = 193 + SYS_SHMGET = 194 + SYS_SHMCTL = 195 + SYS_SHMAT = 196 + SYS_SHMDT = 197 + SYS_SOCKET = 198 + SYS_SOCKETPAIR = 199 + SYS_BIND = 200 + SYS_LISTEN = 201 + SYS_ACCEPT = 202 + SYS_CONNECT = 203 + SYS_GETSOCKNAME = 204 + SYS_GETPEERNAME = 205 + SYS_SENDTO = 206 + SYS_RECVFROM = 207 + SYS_SETSOCKOPT = 208 + SYS_GETSOCKOPT = 209 + SYS_SHUTDOWN = 210 + SYS_SENDMSG = 211 + SYS_RECVMSG = 212 + SYS_READAHEAD = 213 + SYS_BRK = 214 + SYS_MUNMAP = 215 + SYS_MREMAP = 216 + SYS_ADD_KEY = 217 + SYS_REQUEST_KEY = 218 + SYS_KEYCTL = 219 + SYS_CLONE = 220 + SYS_EXECVE = 221 + SYS_MMAP = 222 + SYS_FADVISE64 = 223 + SYS_SWAPON = 224 + SYS_SWAPOFF = 225 + SYS_MPROTECT = 226 + SYS_MSYNC = 227 + SYS_MLOCK = 228 + SYS_MUNLOCK = 229 + SYS_MLOCKALL = 230 + SYS_MUNLOCKALL = 231 + SYS_MINCORE = 232 + SYS_MADVISE = 233 + SYS_REMAP_FILE_PAGES = 234 + SYS_MBIND = 235 + SYS_GET_MEMPOLICY = 236 + SYS_SET_MEMPOLICY = 237 + SYS_MIGRATE_PAGES = 238 + SYS_MOVE_PAGES = 239 + SYS_RT_TGSIGQUEUEINFO = 240 + SYS_PERF_EVENT_OPEN = 241 + SYS_ACCEPT4 = 242 + SYS_RECVMMSG = 243 + SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_WAIT4 = 260 + SYS_PRLIMIT64 = 261 + SYS_FANOTIFY_INIT = 262 + SYS_FANOTIFY_MARK = 263 + SYS_NAME_TO_HANDLE_AT = 264 + SYS_OPEN_BY_HANDLE_AT = 265 + SYS_CLOCK_ADJTIME = 266 + SYS_SYNCFS = 267 + SYS_SETNS = 268 + SYS_SENDMMSG = 269 + SYS_PROCESS_VM_READV = 270 + SYS_PROCESS_VM_WRITEV = 271 + SYS_KCMP = 272 + SYS_FINIT_MODULE = 273 + SYS_SCHED_SETATTR = 274 + SYS_SCHED_GETATTR = 275 + SYS_RENAMEAT2 = 276 + SYS_SECCOMP = 277 + SYS_GETRANDOM = 278 + SYS_MEMFD_CREATE = 279 + SYS_BPF = 280 + SYS_EXECVEAT = 281 + SYS_USERFAULTFD = 282 + SYS_MEMBARRIER = 283 + SYS_MLOCK2 = 284 + SYS_COPY_FILE_RANGE = 285 + SYS_PREADV2 = 286 + SYS_PWRITEV2 = 287 + SYS_PKEY_MPROTECT = 288 + SYS_PKEY_ALLOC = 289 + SYS_PKEY_FREE = 290 + SYS_STATX = 291 + SYS_IO_PGETEVENTS = 292 + SYS_RSEQ = 293 + SYS_KEXEC_FILE_LOAD = 294 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index aea5760cea..378e6ec8b1 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -7,365 +7,368 @@ package unix const ( - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_RESTART_SYSCALL = 7 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECVE = 11 - SYS_CHDIR = 12 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_MOUNT = 21 - SYS_UMOUNT = 22 - SYS_PTRACE = 26 - SYS_ALARM = 27 - SYS_PAUSE = 29 - SYS_UTIME = 30 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_RENAME = 38 - SYS_MKDIR = 39 - SYS_RMDIR = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_BRK = 45 - SYS_SIGNAL = 48 - SYS_ACCT = 51 - SYS_UMOUNT2 = 52 - SYS_IOCTL = 54 - SYS_FCNTL = 55 - SYS_SETPGID = 57 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_USTAT = 62 - SYS_DUP2 = 63 - SYS_GETPPID = 64 - SYS_GETPGRP = 65 - SYS_SETSID = 66 - SYS_SIGACTION = 67 - SYS_SIGSUSPEND = 72 - SYS_SIGPENDING = 73 - SYS_SETHOSTNAME = 74 - SYS_SETRLIMIT = 75 - SYS_GETRUSAGE = 77 - SYS_GETTIMEOFDAY = 78 - SYS_SETTIMEOFDAY = 79 - SYS_SYMLINK = 83 - SYS_READLINK = 85 - SYS_USELIB = 86 - SYS_SWAPON = 87 - SYS_REBOOT = 88 - SYS_READDIR = 89 - SYS_MMAP = 90 - SYS_MUNMAP = 91 - SYS_TRUNCATE = 92 - SYS_FTRUNCATE = 93 - SYS_FCHMOD = 94 - SYS_GETPRIORITY = 96 - SYS_SETPRIORITY = 97 - SYS_STATFS = 99 - SYS_FSTATFS = 100 - SYS_SOCKETCALL = 102 - SYS_SYSLOG = 103 - SYS_SETITIMER = 104 - SYS_GETITIMER = 105 - SYS_STAT = 106 - SYS_LSTAT = 107 - SYS_FSTAT = 108 - SYS_LOOKUP_DCOOKIE = 110 - SYS_VHANGUP = 111 - SYS_IDLE = 112 - SYS_WAIT4 = 114 - SYS_SWAPOFF = 115 - SYS_SYSINFO = 116 - SYS_IPC = 117 - SYS_FSYNC = 118 - SYS_SIGRETURN = 119 - SYS_CLONE = 120 - SYS_SETDOMAINNAME = 121 - SYS_UNAME = 122 - SYS_ADJTIMEX = 124 - SYS_MPROTECT = 125 - SYS_SIGPROCMASK = 126 - SYS_CREATE_MODULE = 127 - SYS_INIT_MODULE = 128 - SYS_DELETE_MODULE = 129 - SYS_GET_KERNEL_SYMS = 130 - SYS_QUOTACTL = 131 - SYS_GETPGID = 132 - SYS_FCHDIR = 133 - SYS_BDFLUSH = 134 - SYS_SYSFS = 135 - SYS_PERSONALITY = 136 - SYS_AFS_SYSCALL = 137 - SYS_GETDENTS = 141 - SYS_SELECT = 142 - SYS_FLOCK = 143 - SYS_MSYNC = 144 - SYS_READV = 145 - SYS_WRITEV = 146 - SYS_GETSID = 147 - SYS_FDATASYNC = 148 - SYS__SYSCTL = 149 - SYS_MLOCK = 150 - SYS_MUNLOCK = 151 - SYS_MLOCKALL = 152 - SYS_MUNLOCKALL = 153 - SYS_SCHED_SETPARAM = 154 - SYS_SCHED_GETPARAM = 155 - SYS_SCHED_SETSCHEDULER = 156 - SYS_SCHED_GETSCHEDULER = 157 - SYS_SCHED_YIELD = 158 - SYS_SCHED_GET_PRIORITY_MAX = 159 - SYS_SCHED_GET_PRIORITY_MIN = 160 - SYS_SCHED_RR_GET_INTERVAL = 161 - SYS_NANOSLEEP = 162 - SYS_MREMAP = 163 - SYS_QUERY_MODULE = 167 - SYS_POLL = 168 - SYS_NFSSERVCTL = 169 - SYS_PRCTL = 172 - SYS_RT_SIGRETURN = 173 - SYS_RT_SIGACTION = 174 - SYS_RT_SIGPROCMASK = 175 - SYS_RT_SIGPENDING = 176 - SYS_RT_SIGTIMEDWAIT = 177 - SYS_RT_SIGQUEUEINFO = 178 - SYS_RT_SIGSUSPEND = 179 - SYS_PREAD64 = 180 - SYS_PWRITE64 = 181 - SYS_GETCWD = 183 - SYS_CAPGET = 184 - SYS_CAPSET = 185 - SYS_SIGALTSTACK = 186 - SYS_SENDFILE = 187 - SYS_GETPMSG = 188 - SYS_PUTPMSG = 189 - SYS_VFORK = 190 - SYS_GETRLIMIT = 191 - SYS_LCHOWN = 198 - SYS_GETUID = 199 - SYS_GETGID = 200 - SYS_GETEUID = 201 - SYS_GETEGID = 202 - SYS_SETREUID = 203 - SYS_SETREGID = 204 - SYS_GETGROUPS = 205 - SYS_SETGROUPS = 206 - SYS_FCHOWN = 207 - SYS_SETRESUID = 208 - SYS_GETRESUID = 209 - SYS_SETRESGID = 210 - SYS_GETRESGID = 211 - SYS_CHOWN = 212 - SYS_SETUID = 213 - SYS_SETGID = 214 - SYS_SETFSUID = 215 - SYS_SETFSGID = 216 - SYS_PIVOT_ROOT = 217 - SYS_MINCORE = 218 - SYS_MADVISE = 219 - SYS_GETDENTS64 = 220 - SYS_READAHEAD = 222 - SYS_SETXATTR = 224 - SYS_LSETXATTR = 225 - SYS_FSETXATTR = 226 - SYS_GETXATTR = 227 - SYS_LGETXATTR = 228 - SYS_FGETXATTR = 229 - SYS_LISTXATTR = 230 - SYS_LLISTXATTR = 231 - SYS_FLISTXATTR = 232 - SYS_REMOVEXATTR = 233 - SYS_LREMOVEXATTR = 234 - SYS_FREMOVEXATTR = 235 - SYS_GETTID = 236 - SYS_TKILL = 237 - SYS_FUTEX = 238 - SYS_SCHED_SETAFFINITY = 239 - SYS_SCHED_GETAFFINITY = 240 - SYS_TGKILL = 241 - SYS_IO_SETUP = 243 - SYS_IO_DESTROY = 244 - SYS_IO_GETEVENTS = 245 - SYS_IO_SUBMIT = 246 - SYS_IO_CANCEL = 247 - SYS_EXIT_GROUP = 248 - SYS_EPOLL_CREATE = 249 - SYS_EPOLL_CTL = 250 - SYS_EPOLL_WAIT = 251 - SYS_SET_TID_ADDRESS = 252 - SYS_FADVISE64 = 253 - SYS_TIMER_CREATE = 254 - SYS_TIMER_SETTIME = 255 - SYS_TIMER_GETTIME = 256 - SYS_TIMER_GETOVERRUN = 257 - SYS_TIMER_DELETE = 258 - SYS_CLOCK_SETTIME = 259 - SYS_CLOCK_GETTIME = 260 - SYS_CLOCK_GETRES = 261 - SYS_CLOCK_NANOSLEEP = 262 - SYS_STATFS64 = 265 - SYS_FSTATFS64 = 266 - SYS_REMAP_FILE_PAGES = 267 - SYS_MBIND = 268 - SYS_GET_MEMPOLICY = 269 - SYS_SET_MEMPOLICY = 270 - SYS_MQ_OPEN = 271 - SYS_MQ_UNLINK = 272 - SYS_MQ_TIMEDSEND = 273 - SYS_MQ_TIMEDRECEIVE = 274 - SYS_MQ_NOTIFY = 275 - SYS_MQ_GETSETATTR = 276 - SYS_KEXEC_LOAD = 277 - SYS_ADD_KEY = 278 - SYS_REQUEST_KEY = 279 - SYS_KEYCTL = 280 - SYS_WAITID = 281 - SYS_IOPRIO_SET = 282 - SYS_IOPRIO_GET = 283 - SYS_INOTIFY_INIT = 284 - SYS_INOTIFY_ADD_WATCH = 285 - SYS_INOTIFY_RM_WATCH = 286 - SYS_MIGRATE_PAGES = 287 - SYS_OPENAT = 288 - SYS_MKDIRAT = 289 - SYS_MKNODAT = 290 - SYS_FCHOWNAT = 291 - SYS_FUTIMESAT = 292 - SYS_NEWFSTATAT = 293 - SYS_UNLINKAT = 294 - SYS_RENAMEAT = 295 - SYS_LINKAT = 296 - SYS_SYMLINKAT = 297 - SYS_READLINKAT = 298 - SYS_FCHMODAT = 299 - SYS_FACCESSAT = 300 - SYS_PSELECT6 = 301 - SYS_PPOLL = 302 - SYS_UNSHARE = 303 - SYS_SET_ROBUST_LIST = 304 - SYS_GET_ROBUST_LIST = 305 - SYS_SPLICE = 306 - SYS_SYNC_FILE_RANGE = 307 - SYS_TEE = 308 - SYS_VMSPLICE = 309 - SYS_MOVE_PAGES = 310 - SYS_GETCPU = 311 - SYS_EPOLL_PWAIT = 312 - SYS_UTIMES = 313 - SYS_FALLOCATE = 314 - SYS_UTIMENSAT = 315 - SYS_SIGNALFD = 316 - SYS_TIMERFD = 317 - SYS_EVENTFD = 318 - SYS_TIMERFD_CREATE = 319 - SYS_TIMERFD_SETTIME = 320 - SYS_TIMERFD_GETTIME = 321 - SYS_SIGNALFD4 = 322 - SYS_EVENTFD2 = 323 - SYS_INOTIFY_INIT1 = 324 - SYS_PIPE2 = 325 - SYS_DUP3 = 326 - SYS_EPOLL_CREATE1 = 327 - SYS_PREADV = 328 - SYS_PWRITEV = 329 - SYS_RT_TGSIGQUEUEINFO = 330 - SYS_PERF_EVENT_OPEN = 331 - SYS_FANOTIFY_INIT = 332 - SYS_FANOTIFY_MARK = 333 - SYS_PRLIMIT64 = 334 - SYS_NAME_TO_HANDLE_AT = 335 - SYS_OPEN_BY_HANDLE_AT = 336 - SYS_CLOCK_ADJTIME = 337 - SYS_SYNCFS = 338 - SYS_SETNS = 339 - SYS_PROCESS_VM_READV = 340 - SYS_PROCESS_VM_WRITEV = 341 - SYS_S390_RUNTIME_INSTR = 342 - SYS_KCMP = 343 - SYS_FINIT_MODULE = 344 - SYS_SCHED_SETATTR = 345 - SYS_SCHED_GETATTR = 346 - SYS_RENAMEAT2 = 347 - SYS_SECCOMP = 348 - SYS_GETRANDOM = 349 - SYS_MEMFD_CREATE = 350 - SYS_BPF = 351 - SYS_S390_PCI_MMIO_WRITE = 352 - SYS_S390_PCI_MMIO_READ = 353 - SYS_EXECVEAT = 354 - SYS_USERFAULTFD = 355 - SYS_MEMBARRIER = 356 - SYS_RECVMMSG = 357 - SYS_SENDMMSG = 358 - SYS_SOCKET = 359 - SYS_SOCKETPAIR = 360 - SYS_BIND = 361 - SYS_CONNECT = 362 - SYS_LISTEN = 363 - SYS_ACCEPT4 = 364 - SYS_GETSOCKOPT = 365 - SYS_SETSOCKOPT = 366 - SYS_GETSOCKNAME = 367 - SYS_GETPEERNAME = 368 - SYS_SENDTO = 369 - SYS_SENDMSG = 370 - SYS_RECVFROM = 371 - SYS_RECVMSG = 372 - SYS_SHUTDOWN = 373 - SYS_MLOCK2 = 374 - SYS_COPY_FILE_RANGE = 375 - SYS_PREADV2 = 376 - SYS_PWRITEV2 = 377 - SYS_S390_GUARDED_STORAGE = 378 - SYS_STATX = 379 - SYS_S390_STHYI = 380 - SYS_KEXEC_FILE_LOAD = 381 - SYS_IO_PGETEVENTS = 382 - SYS_RSEQ = 383 - SYS_PKEY_MPROTECT = 384 - SYS_PKEY_ALLOC = 385 - SYS_PKEY_FREE = 386 - SYS_SEMTIMEDOP = 392 - SYS_SEMGET = 393 - SYS_SEMCTL = 394 - SYS_SHMGET = 395 - SYS_SHMCTL = 396 - SYS_SHMAT = 397 - SYS_SHMDT = 398 - SYS_MSGGET = 399 - SYS_MSGSND = 400 - SYS_MSGRCV = 401 - SYS_MSGCTL = 402 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLONE3 = 435 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_RESTART_SYSCALL = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECVE = 11 + SYS_CHDIR = 12 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_MOUNT = 21 + SYS_UMOUNT = 22 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_RENAME = 38 + SYS_MKDIR = 39 + SYS_RMDIR = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_BRK = 45 + SYS_SIGNAL = 48 + SYS_ACCT = 51 + SYS_UMOUNT2 = 52 + SYS_IOCTL = 54 + SYS_FCNTL = 55 + SYS_SETPGID = 57 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_USTAT = 62 + SYS_DUP2 = 63 + SYS_GETPPID = 64 + SYS_GETPGRP = 65 + SYS_SETSID = 66 + SYS_SIGACTION = 67 + SYS_SIGSUSPEND = 72 + SYS_SIGPENDING = 73 + SYS_SETHOSTNAME = 74 + SYS_SETRLIMIT = 75 + SYS_GETRUSAGE = 77 + SYS_GETTIMEOFDAY = 78 + SYS_SETTIMEOFDAY = 79 + SYS_SYMLINK = 83 + SYS_READLINK = 85 + SYS_USELIB = 86 + SYS_SWAPON = 87 + SYS_REBOOT = 88 + SYS_READDIR = 89 + SYS_MMAP = 90 + SYS_MUNMAP = 91 + SYS_TRUNCATE = 92 + SYS_FTRUNCATE = 93 + SYS_FCHMOD = 94 + SYS_GETPRIORITY = 96 + SYS_SETPRIORITY = 97 + SYS_STATFS = 99 + SYS_FSTATFS = 100 + SYS_SOCKETCALL = 102 + SYS_SYSLOG = 103 + SYS_SETITIMER = 104 + SYS_GETITIMER = 105 + SYS_STAT = 106 + SYS_LSTAT = 107 + SYS_FSTAT = 108 + SYS_LOOKUP_DCOOKIE = 110 + SYS_VHANGUP = 111 + SYS_IDLE = 112 + SYS_WAIT4 = 114 + SYS_SWAPOFF = 115 + SYS_SYSINFO = 116 + SYS_IPC = 117 + SYS_FSYNC = 118 + SYS_SIGRETURN = 119 + SYS_CLONE = 120 + SYS_SETDOMAINNAME = 121 + SYS_UNAME = 122 + SYS_ADJTIMEX = 124 + SYS_MPROTECT = 125 + SYS_SIGPROCMASK = 126 + SYS_CREATE_MODULE = 127 + SYS_INIT_MODULE = 128 + SYS_DELETE_MODULE = 129 + SYS_GET_KERNEL_SYMS = 130 + SYS_QUOTACTL = 131 + SYS_GETPGID = 132 + SYS_FCHDIR = 133 + SYS_BDFLUSH = 134 + SYS_SYSFS = 135 + SYS_PERSONALITY = 136 + SYS_AFS_SYSCALL = 137 + SYS_GETDENTS = 141 + SYS_SELECT = 142 + SYS_FLOCK = 143 + SYS_MSYNC = 144 + SYS_READV = 145 + SYS_WRITEV = 146 + SYS_GETSID = 147 + SYS_FDATASYNC = 148 + SYS__SYSCTL = 149 + SYS_MLOCK = 150 + SYS_MUNLOCK = 151 + SYS_MLOCKALL = 152 + SYS_MUNLOCKALL = 153 + SYS_SCHED_SETPARAM = 154 + SYS_SCHED_GETPARAM = 155 + SYS_SCHED_SETSCHEDULER = 156 + SYS_SCHED_GETSCHEDULER = 157 + SYS_SCHED_YIELD = 158 + SYS_SCHED_GET_PRIORITY_MAX = 159 + SYS_SCHED_GET_PRIORITY_MIN = 160 + SYS_SCHED_RR_GET_INTERVAL = 161 + SYS_NANOSLEEP = 162 + SYS_MREMAP = 163 + SYS_QUERY_MODULE = 167 + SYS_POLL = 168 + SYS_NFSSERVCTL = 169 + SYS_PRCTL = 172 + SYS_RT_SIGRETURN = 173 + SYS_RT_SIGACTION = 174 + SYS_RT_SIGPROCMASK = 175 + SYS_RT_SIGPENDING = 176 + SYS_RT_SIGTIMEDWAIT = 177 + SYS_RT_SIGQUEUEINFO = 178 + SYS_RT_SIGSUSPEND = 179 + SYS_PREAD64 = 180 + SYS_PWRITE64 = 181 + SYS_GETCWD = 183 + SYS_CAPGET = 184 + SYS_CAPSET = 185 + SYS_SIGALTSTACK = 186 + SYS_SENDFILE = 187 + SYS_GETPMSG = 188 + SYS_PUTPMSG = 189 + SYS_VFORK = 190 + SYS_GETRLIMIT = 191 + SYS_LCHOWN = 198 + SYS_GETUID = 199 + SYS_GETGID = 200 + SYS_GETEUID = 201 + SYS_GETEGID = 202 + SYS_SETREUID = 203 + SYS_SETREGID = 204 + SYS_GETGROUPS = 205 + SYS_SETGROUPS = 206 + SYS_FCHOWN = 207 + SYS_SETRESUID = 208 + SYS_GETRESUID = 209 + SYS_SETRESGID = 210 + SYS_GETRESGID = 211 + SYS_CHOWN = 212 + SYS_SETUID = 213 + SYS_SETGID = 214 + SYS_SETFSUID = 215 + SYS_SETFSGID = 216 + SYS_PIVOT_ROOT = 217 + SYS_MINCORE = 218 + SYS_MADVISE = 219 + SYS_GETDENTS64 = 220 + SYS_READAHEAD = 222 + SYS_SETXATTR = 224 + SYS_LSETXATTR = 225 + SYS_FSETXATTR = 226 + SYS_GETXATTR = 227 + SYS_LGETXATTR = 228 + SYS_FGETXATTR = 229 + SYS_LISTXATTR = 230 + SYS_LLISTXATTR = 231 + SYS_FLISTXATTR = 232 + SYS_REMOVEXATTR = 233 + SYS_LREMOVEXATTR = 234 + SYS_FREMOVEXATTR = 235 + SYS_GETTID = 236 + SYS_TKILL = 237 + SYS_FUTEX = 238 + SYS_SCHED_SETAFFINITY = 239 + SYS_SCHED_GETAFFINITY = 240 + SYS_TGKILL = 241 + SYS_IO_SETUP = 243 + SYS_IO_DESTROY = 244 + SYS_IO_GETEVENTS = 245 + SYS_IO_SUBMIT = 246 + SYS_IO_CANCEL = 247 + SYS_EXIT_GROUP = 248 + SYS_EPOLL_CREATE = 249 + SYS_EPOLL_CTL = 250 + SYS_EPOLL_WAIT = 251 + SYS_SET_TID_ADDRESS = 252 + SYS_FADVISE64 = 253 + SYS_TIMER_CREATE = 254 + SYS_TIMER_SETTIME = 255 + SYS_TIMER_GETTIME = 256 + SYS_TIMER_GETOVERRUN = 257 + SYS_TIMER_DELETE = 258 + SYS_CLOCK_SETTIME = 259 + SYS_CLOCK_GETTIME = 260 + SYS_CLOCK_GETRES = 261 + SYS_CLOCK_NANOSLEEP = 262 + SYS_STATFS64 = 265 + SYS_FSTATFS64 = 266 + SYS_REMAP_FILE_PAGES = 267 + SYS_MBIND = 268 + SYS_GET_MEMPOLICY = 269 + SYS_SET_MEMPOLICY = 270 + SYS_MQ_OPEN = 271 + SYS_MQ_UNLINK = 272 + SYS_MQ_TIMEDSEND = 273 + SYS_MQ_TIMEDRECEIVE = 274 + SYS_MQ_NOTIFY = 275 + SYS_MQ_GETSETATTR = 276 + SYS_KEXEC_LOAD = 277 + SYS_ADD_KEY = 278 + SYS_REQUEST_KEY = 279 + SYS_KEYCTL = 280 + SYS_WAITID = 281 + SYS_IOPRIO_SET = 282 + SYS_IOPRIO_GET = 283 + SYS_INOTIFY_INIT = 284 + SYS_INOTIFY_ADD_WATCH = 285 + SYS_INOTIFY_RM_WATCH = 286 + SYS_MIGRATE_PAGES = 287 + SYS_OPENAT = 288 + SYS_MKDIRAT = 289 + SYS_MKNODAT = 290 + SYS_FCHOWNAT = 291 + SYS_FUTIMESAT = 292 + SYS_NEWFSTATAT = 293 + SYS_UNLINKAT = 294 + SYS_RENAMEAT = 295 + SYS_LINKAT = 296 + SYS_SYMLINKAT = 297 + SYS_READLINKAT = 298 + SYS_FCHMODAT = 299 + SYS_FACCESSAT = 300 + SYS_PSELECT6 = 301 + SYS_PPOLL = 302 + SYS_UNSHARE = 303 + SYS_SET_ROBUST_LIST = 304 + SYS_GET_ROBUST_LIST = 305 + SYS_SPLICE = 306 + SYS_SYNC_FILE_RANGE = 307 + SYS_TEE = 308 + SYS_VMSPLICE = 309 + SYS_MOVE_PAGES = 310 + SYS_GETCPU = 311 + SYS_EPOLL_PWAIT = 312 + SYS_UTIMES = 313 + SYS_FALLOCATE = 314 + SYS_UTIMENSAT = 315 + SYS_SIGNALFD = 316 + SYS_TIMERFD = 317 + SYS_EVENTFD = 318 + SYS_TIMERFD_CREATE = 319 + SYS_TIMERFD_SETTIME = 320 + SYS_TIMERFD_GETTIME = 321 + SYS_SIGNALFD4 = 322 + SYS_EVENTFD2 = 323 + SYS_INOTIFY_INIT1 = 324 + SYS_PIPE2 = 325 + SYS_DUP3 = 326 + SYS_EPOLL_CREATE1 = 327 + SYS_PREADV = 328 + SYS_PWRITEV = 329 + SYS_RT_TGSIGQUEUEINFO = 330 + SYS_PERF_EVENT_OPEN = 331 + SYS_FANOTIFY_INIT = 332 + SYS_FANOTIFY_MARK = 333 + SYS_PRLIMIT64 = 334 + SYS_NAME_TO_HANDLE_AT = 335 + SYS_OPEN_BY_HANDLE_AT = 336 + SYS_CLOCK_ADJTIME = 337 + SYS_SYNCFS = 338 + SYS_SETNS = 339 + SYS_PROCESS_VM_READV = 340 + SYS_PROCESS_VM_WRITEV = 341 + SYS_S390_RUNTIME_INSTR = 342 + SYS_KCMP = 343 + SYS_FINIT_MODULE = 344 + SYS_SCHED_SETATTR = 345 + SYS_SCHED_GETATTR = 346 + SYS_RENAMEAT2 = 347 + SYS_SECCOMP = 348 + SYS_GETRANDOM = 349 + SYS_MEMFD_CREATE = 350 + SYS_BPF = 351 + SYS_S390_PCI_MMIO_WRITE = 352 + SYS_S390_PCI_MMIO_READ = 353 + SYS_EXECVEAT = 354 + SYS_USERFAULTFD = 355 + SYS_MEMBARRIER = 356 + SYS_RECVMMSG = 357 + SYS_SENDMMSG = 358 + SYS_SOCKET = 359 + SYS_SOCKETPAIR = 360 + SYS_BIND = 361 + SYS_CONNECT = 362 + SYS_LISTEN = 363 + SYS_ACCEPT4 = 364 + SYS_GETSOCKOPT = 365 + SYS_SETSOCKOPT = 366 + SYS_GETSOCKNAME = 367 + SYS_GETPEERNAME = 368 + SYS_SENDTO = 369 + SYS_SENDMSG = 370 + SYS_RECVFROM = 371 + SYS_RECVMSG = 372 + SYS_SHUTDOWN = 373 + SYS_MLOCK2 = 374 + SYS_COPY_FILE_RANGE = 375 + SYS_PREADV2 = 376 + SYS_PWRITEV2 = 377 + SYS_S390_GUARDED_STORAGE = 378 + SYS_STATX = 379 + SYS_S390_STHYI = 380 + SYS_KEXEC_FILE_LOAD = 381 + SYS_IO_PGETEVENTS = 382 + SYS_RSEQ = 383 + SYS_PKEY_MPROTECT = 384 + SYS_PKEY_ALLOC = 385 + SYS_PKEY_FREE = 386 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLONE3 = 435 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 488ca848d1..58e72b0cb5 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -7,379 +7,382 @@ package unix const ( - SYS_RESTART_SYSCALL = 0 - SYS_EXIT = 1 - SYS_FORK = 2 - SYS_READ = 3 - SYS_WRITE = 4 - SYS_OPEN = 5 - SYS_CLOSE = 6 - SYS_WAIT4 = 7 - SYS_CREAT = 8 - SYS_LINK = 9 - SYS_UNLINK = 10 - SYS_EXECV = 11 - SYS_CHDIR = 12 - SYS_CHOWN = 13 - SYS_MKNOD = 14 - SYS_CHMOD = 15 - SYS_LCHOWN = 16 - SYS_BRK = 17 - SYS_PERFCTR = 18 - SYS_LSEEK = 19 - SYS_GETPID = 20 - SYS_CAPGET = 21 - SYS_CAPSET = 22 - SYS_SETUID = 23 - SYS_GETUID = 24 - SYS_VMSPLICE = 25 - SYS_PTRACE = 26 - SYS_ALARM = 27 - SYS_SIGALTSTACK = 28 - SYS_PAUSE = 29 - SYS_UTIME = 30 - SYS_ACCESS = 33 - SYS_NICE = 34 - SYS_SYNC = 36 - SYS_KILL = 37 - SYS_STAT = 38 - SYS_SENDFILE = 39 - SYS_LSTAT = 40 - SYS_DUP = 41 - SYS_PIPE = 42 - SYS_TIMES = 43 - SYS_UMOUNT2 = 45 - SYS_SETGID = 46 - SYS_GETGID = 47 - SYS_SIGNAL = 48 - SYS_GETEUID = 49 - SYS_GETEGID = 50 - SYS_ACCT = 51 - SYS_MEMORY_ORDERING = 52 - SYS_IOCTL = 54 - SYS_REBOOT = 55 - SYS_SYMLINK = 57 - SYS_READLINK = 58 - SYS_EXECVE = 59 - SYS_UMASK = 60 - SYS_CHROOT = 61 - SYS_FSTAT = 62 - SYS_FSTAT64 = 63 - SYS_GETPAGESIZE = 64 - SYS_MSYNC = 65 - SYS_VFORK = 66 - SYS_PREAD64 = 67 - SYS_PWRITE64 = 68 - SYS_MMAP = 71 - SYS_MUNMAP = 73 - SYS_MPROTECT = 74 - SYS_MADVISE = 75 - SYS_VHANGUP = 76 - SYS_MINCORE = 78 - SYS_GETGROUPS = 79 - SYS_SETGROUPS = 80 - SYS_GETPGRP = 81 - SYS_SETITIMER = 83 - SYS_SWAPON = 85 - SYS_GETITIMER = 86 - SYS_SETHOSTNAME = 88 - SYS_DUP2 = 90 - SYS_FCNTL = 92 - SYS_SELECT = 93 - SYS_FSYNC = 95 - SYS_SETPRIORITY = 96 - SYS_SOCKET = 97 - SYS_CONNECT = 98 - SYS_ACCEPT = 99 - SYS_GETPRIORITY = 100 - SYS_RT_SIGRETURN = 101 - SYS_RT_SIGACTION = 102 - SYS_RT_SIGPROCMASK = 103 - SYS_RT_SIGPENDING = 104 - SYS_RT_SIGTIMEDWAIT = 105 - SYS_RT_SIGQUEUEINFO = 106 - SYS_RT_SIGSUSPEND = 107 - SYS_SETRESUID = 108 - SYS_GETRESUID = 109 - SYS_SETRESGID = 110 - SYS_GETRESGID = 111 - SYS_RECVMSG = 113 - SYS_SENDMSG = 114 - SYS_GETTIMEOFDAY = 116 - SYS_GETRUSAGE = 117 - SYS_GETSOCKOPT = 118 - SYS_GETCWD = 119 - SYS_READV = 120 - SYS_WRITEV = 121 - SYS_SETTIMEOFDAY = 122 - SYS_FCHOWN = 123 - SYS_FCHMOD = 124 - SYS_RECVFROM = 125 - SYS_SETREUID = 126 - SYS_SETREGID = 127 - SYS_RENAME = 128 - SYS_TRUNCATE = 129 - SYS_FTRUNCATE = 130 - SYS_FLOCK = 131 - SYS_LSTAT64 = 132 - SYS_SENDTO = 133 - SYS_SHUTDOWN = 134 - SYS_SOCKETPAIR = 135 - SYS_MKDIR = 136 - SYS_RMDIR = 137 - SYS_UTIMES = 138 - SYS_STAT64 = 139 - SYS_SENDFILE64 = 140 - SYS_GETPEERNAME = 141 - SYS_FUTEX = 142 - SYS_GETTID = 143 - SYS_GETRLIMIT = 144 - SYS_SETRLIMIT = 145 - SYS_PIVOT_ROOT = 146 - SYS_PRCTL = 147 - SYS_PCICONFIG_READ = 148 - SYS_PCICONFIG_WRITE = 149 - SYS_GETSOCKNAME = 150 - SYS_INOTIFY_INIT = 151 - SYS_INOTIFY_ADD_WATCH = 152 - SYS_POLL = 153 - SYS_GETDENTS64 = 154 - SYS_INOTIFY_RM_WATCH = 156 - SYS_STATFS = 157 - SYS_FSTATFS = 158 - SYS_UMOUNT = 159 - SYS_SCHED_SET_AFFINITY = 160 - SYS_SCHED_GET_AFFINITY = 161 - SYS_GETDOMAINNAME = 162 - SYS_SETDOMAINNAME = 163 - SYS_UTRAP_INSTALL = 164 - SYS_QUOTACTL = 165 - SYS_SET_TID_ADDRESS = 166 - SYS_MOUNT = 167 - SYS_USTAT = 168 - SYS_SETXATTR = 169 - SYS_LSETXATTR = 170 - SYS_FSETXATTR = 171 - SYS_GETXATTR = 172 - SYS_LGETXATTR = 173 - SYS_GETDENTS = 174 - SYS_SETSID = 175 - SYS_FCHDIR = 176 - SYS_FGETXATTR = 177 - SYS_LISTXATTR = 178 - SYS_LLISTXATTR = 179 - SYS_FLISTXATTR = 180 - SYS_REMOVEXATTR = 181 - SYS_LREMOVEXATTR = 182 - SYS_SIGPENDING = 183 - SYS_QUERY_MODULE = 184 - SYS_SETPGID = 185 - SYS_FREMOVEXATTR = 186 - SYS_TKILL = 187 - SYS_EXIT_GROUP = 188 - SYS_UNAME = 189 - SYS_INIT_MODULE = 190 - SYS_PERSONALITY = 191 - SYS_REMAP_FILE_PAGES = 192 - SYS_EPOLL_CREATE = 193 - SYS_EPOLL_CTL = 194 - SYS_EPOLL_WAIT = 195 - SYS_IOPRIO_SET = 196 - SYS_GETPPID = 197 - SYS_SIGACTION = 198 - SYS_SGETMASK = 199 - SYS_SSETMASK = 200 - SYS_SIGSUSPEND = 201 - SYS_OLDLSTAT = 202 - SYS_USELIB = 203 - SYS_READDIR = 204 - SYS_READAHEAD = 205 - SYS_SOCKETCALL = 206 - SYS_SYSLOG = 207 - SYS_LOOKUP_DCOOKIE = 208 - SYS_FADVISE64 = 209 - SYS_FADVISE64_64 = 210 - SYS_TGKILL = 211 - SYS_WAITPID = 212 - SYS_SWAPOFF = 213 - SYS_SYSINFO = 214 - SYS_IPC = 215 - SYS_SIGRETURN = 216 - SYS_CLONE = 217 - SYS_IOPRIO_GET = 218 - SYS_ADJTIMEX = 219 - SYS_SIGPROCMASK = 220 - SYS_CREATE_MODULE = 221 - SYS_DELETE_MODULE = 222 - SYS_GET_KERNEL_SYMS = 223 - SYS_GETPGID = 224 - SYS_BDFLUSH = 225 - SYS_SYSFS = 226 - SYS_AFS_SYSCALL = 227 - SYS_SETFSUID = 228 - SYS_SETFSGID = 229 - SYS__NEWSELECT = 230 - SYS_SPLICE = 232 - SYS_STIME = 233 - SYS_STATFS64 = 234 - SYS_FSTATFS64 = 235 - SYS__LLSEEK = 236 - SYS_MLOCK = 237 - SYS_MUNLOCK = 238 - SYS_MLOCKALL = 239 - SYS_MUNLOCKALL = 240 - SYS_SCHED_SETPARAM = 241 - SYS_SCHED_GETPARAM = 242 - SYS_SCHED_SETSCHEDULER = 243 - SYS_SCHED_GETSCHEDULER = 244 - SYS_SCHED_YIELD = 245 - SYS_SCHED_GET_PRIORITY_MAX = 246 - SYS_SCHED_GET_PRIORITY_MIN = 247 - SYS_SCHED_RR_GET_INTERVAL = 248 - SYS_NANOSLEEP = 249 - SYS_MREMAP = 250 - SYS__SYSCTL = 251 - SYS_GETSID = 252 - SYS_FDATASYNC = 253 - SYS_NFSSERVCTL = 254 - SYS_SYNC_FILE_RANGE = 255 - SYS_CLOCK_SETTIME = 256 - SYS_CLOCK_GETTIME = 257 - SYS_CLOCK_GETRES = 258 - SYS_CLOCK_NANOSLEEP = 259 - SYS_SCHED_GETAFFINITY = 260 - SYS_SCHED_SETAFFINITY = 261 - SYS_TIMER_SETTIME = 262 - SYS_TIMER_GETTIME = 263 - SYS_TIMER_GETOVERRUN = 264 - SYS_TIMER_DELETE = 265 - SYS_TIMER_CREATE = 266 - SYS_VSERVER = 267 - SYS_IO_SETUP = 268 - SYS_IO_DESTROY = 269 - SYS_IO_SUBMIT = 270 - SYS_IO_CANCEL = 271 - SYS_IO_GETEVENTS = 272 - SYS_MQ_OPEN = 273 - SYS_MQ_UNLINK = 274 - SYS_MQ_TIMEDSEND = 275 - SYS_MQ_TIMEDRECEIVE = 276 - SYS_MQ_NOTIFY = 277 - SYS_MQ_GETSETATTR = 278 - SYS_WAITID = 279 - SYS_TEE = 280 - SYS_ADD_KEY = 281 - SYS_REQUEST_KEY = 282 - SYS_KEYCTL = 283 - SYS_OPENAT = 284 - SYS_MKDIRAT = 285 - SYS_MKNODAT = 286 - SYS_FCHOWNAT = 287 - SYS_FUTIMESAT = 288 - SYS_FSTATAT64 = 289 - SYS_UNLINKAT = 290 - SYS_RENAMEAT = 291 - SYS_LINKAT = 292 - SYS_SYMLINKAT = 293 - SYS_READLINKAT = 294 - SYS_FCHMODAT = 295 - SYS_FACCESSAT = 296 - SYS_PSELECT6 = 297 - SYS_PPOLL = 298 - SYS_UNSHARE = 299 - SYS_SET_ROBUST_LIST = 300 - SYS_GET_ROBUST_LIST = 301 - SYS_MIGRATE_PAGES = 302 - SYS_MBIND = 303 - SYS_GET_MEMPOLICY = 304 - SYS_SET_MEMPOLICY = 305 - SYS_KEXEC_LOAD = 306 - SYS_MOVE_PAGES = 307 - SYS_GETCPU = 308 - SYS_EPOLL_PWAIT = 309 - SYS_UTIMENSAT = 310 - SYS_SIGNALFD = 311 - SYS_TIMERFD_CREATE = 312 - SYS_EVENTFD = 313 - SYS_FALLOCATE = 314 - SYS_TIMERFD_SETTIME = 315 - SYS_TIMERFD_GETTIME = 316 - SYS_SIGNALFD4 = 317 - SYS_EVENTFD2 = 318 - SYS_EPOLL_CREATE1 = 319 - SYS_DUP3 = 320 - SYS_PIPE2 = 321 - SYS_INOTIFY_INIT1 = 322 - SYS_ACCEPT4 = 323 - SYS_PREADV = 324 - SYS_PWRITEV = 325 - SYS_RT_TGSIGQUEUEINFO = 326 - SYS_PERF_EVENT_OPEN = 327 - SYS_RECVMMSG = 328 - SYS_FANOTIFY_INIT = 329 - SYS_FANOTIFY_MARK = 330 - SYS_PRLIMIT64 = 331 - SYS_NAME_TO_HANDLE_AT = 332 - SYS_OPEN_BY_HANDLE_AT = 333 - SYS_CLOCK_ADJTIME = 334 - SYS_SYNCFS = 335 - SYS_SENDMMSG = 336 - SYS_SETNS = 337 - SYS_PROCESS_VM_READV = 338 - SYS_PROCESS_VM_WRITEV = 339 - SYS_KERN_FEATURES = 340 - SYS_KCMP = 341 - SYS_FINIT_MODULE = 342 - SYS_SCHED_SETATTR = 343 - SYS_SCHED_GETATTR = 344 - SYS_RENAMEAT2 = 345 - SYS_SECCOMP = 346 - SYS_GETRANDOM = 347 - SYS_MEMFD_CREATE = 348 - SYS_BPF = 349 - SYS_EXECVEAT = 350 - SYS_MEMBARRIER = 351 - SYS_USERFAULTFD = 352 - SYS_BIND = 353 - SYS_LISTEN = 354 - SYS_SETSOCKOPT = 355 - SYS_MLOCK2 = 356 - SYS_COPY_FILE_RANGE = 357 - SYS_PREADV2 = 358 - SYS_PWRITEV2 = 359 - SYS_STATX = 360 - SYS_IO_PGETEVENTS = 361 - SYS_PKEY_MPROTECT = 362 - SYS_PKEY_ALLOC = 363 - SYS_PKEY_FREE = 364 - SYS_RSEQ = 365 - SYS_SEMTIMEDOP = 392 - SYS_SEMGET = 393 - SYS_SEMCTL = 394 - SYS_SHMGET = 395 - SYS_SHMCTL = 396 - SYS_SHMAT = 397 - SYS_SHMDT = 398 - SYS_MSGGET = 399 - SYS_MSGSND = 400 - SYS_MSGRCV = 401 - SYS_MSGCTL = 402 - SYS_PIDFD_SEND_SIGNAL = 424 - SYS_IO_URING_SETUP = 425 - SYS_IO_URING_ENTER = 426 - SYS_IO_URING_REGISTER = 427 - SYS_OPEN_TREE = 428 - SYS_MOVE_MOUNT = 429 - SYS_FSOPEN = 430 - SYS_FSCONFIG = 431 - SYS_FSMOUNT = 432 - SYS_FSPICK = 433 - SYS_PIDFD_OPEN = 434 - SYS_CLOSE_RANGE = 436 - SYS_OPENAT2 = 437 - SYS_PIDFD_GETFD = 438 - SYS_FACCESSAT2 = 439 - SYS_PROCESS_MADVISE = 440 - SYS_EPOLL_PWAIT2 = 441 - SYS_MOUNT_SETATTR = 442 + SYS_RESTART_SYSCALL = 0 + SYS_EXIT = 1 + SYS_FORK = 2 + SYS_READ = 3 + SYS_WRITE = 4 + SYS_OPEN = 5 + SYS_CLOSE = 6 + SYS_WAIT4 = 7 + SYS_CREAT = 8 + SYS_LINK = 9 + SYS_UNLINK = 10 + SYS_EXECV = 11 + SYS_CHDIR = 12 + SYS_CHOWN = 13 + SYS_MKNOD = 14 + SYS_CHMOD = 15 + SYS_LCHOWN = 16 + SYS_BRK = 17 + SYS_PERFCTR = 18 + SYS_LSEEK = 19 + SYS_GETPID = 20 + SYS_CAPGET = 21 + SYS_CAPSET = 22 + SYS_SETUID = 23 + SYS_GETUID = 24 + SYS_VMSPLICE = 25 + SYS_PTRACE = 26 + SYS_ALARM = 27 + SYS_SIGALTSTACK = 28 + SYS_PAUSE = 29 + SYS_UTIME = 30 + SYS_ACCESS = 33 + SYS_NICE = 34 + SYS_SYNC = 36 + SYS_KILL = 37 + SYS_STAT = 38 + SYS_SENDFILE = 39 + SYS_LSTAT = 40 + SYS_DUP = 41 + SYS_PIPE = 42 + SYS_TIMES = 43 + SYS_UMOUNT2 = 45 + SYS_SETGID = 46 + SYS_GETGID = 47 + SYS_SIGNAL = 48 + SYS_GETEUID = 49 + SYS_GETEGID = 50 + SYS_ACCT = 51 + SYS_MEMORY_ORDERING = 52 + SYS_IOCTL = 54 + SYS_REBOOT = 55 + SYS_SYMLINK = 57 + SYS_READLINK = 58 + SYS_EXECVE = 59 + SYS_UMASK = 60 + SYS_CHROOT = 61 + SYS_FSTAT = 62 + SYS_FSTAT64 = 63 + SYS_GETPAGESIZE = 64 + SYS_MSYNC = 65 + SYS_VFORK = 66 + SYS_PREAD64 = 67 + SYS_PWRITE64 = 68 + SYS_MMAP = 71 + SYS_MUNMAP = 73 + SYS_MPROTECT = 74 + SYS_MADVISE = 75 + SYS_VHANGUP = 76 + SYS_MINCORE = 78 + SYS_GETGROUPS = 79 + SYS_SETGROUPS = 80 + SYS_GETPGRP = 81 + SYS_SETITIMER = 83 + SYS_SWAPON = 85 + SYS_GETITIMER = 86 + SYS_SETHOSTNAME = 88 + SYS_DUP2 = 90 + SYS_FCNTL = 92 + SYS_SELECT = 93 + SYS_FSYNC = 95 + SYS_SETPRIORITY = 96 + SYS_SOCKET = 97 + SYS_CONNECT = 98 + SYS_ACCEPT = 99 + SYS_GETPRIORITY = 100 + SYS_RT_SIGRETURN = 101 + SYS_RT_SIGACTION = 102 + SYS_RT_SIGPROCMASK = 103 + SYS_RT_SIGPENDING = 104 + SYS_RT_SIGTIMEDWAIT = 105 + SYS_RT_SIGQUEUEINFO = 106 + SYS_RT_SIGSUSPEND = 107 + SYS_SETRESUID = 108 + SYS_GETRESUID = 109 + SYS_SETRESGID = 110 + SYS_GETRESGID = 111 + SYS_RECVMSG = 113 + SYS_SENDMSG = 114 + SYS_GETTIMEOFDAY = 116 + SYS_GETRUSAGE = 117 + SYS_GETSOCKOPT = 118 + SYS_GETCWD = 119 + SYS_READV = 120 + SYS_WRITEV = 121 + SYS_SETTIMEOFDAY = 122 + SYS_FCHOWN = 123 + SYS_FCHMOD = 124 + SYS_RECVFROM = 125 + SYS_SETREUID = 126 + SYS_SETREGID = 127 + SYS_RENAME = 128 + SYS_TRUNCATE = 129 + SYS_FTRUNCATE = 130 + SYS_FLOCK = 131 + SYS_LSTAT64 = 132 + SYS_SENDTO = 133 + SYS_SHUTDOWN = 134 + SYS_SOCKETPAIR = 135 + SYS_MKDIR = 136 + SYS_RMDIR = 137 + SYS_UTIMES = 138 + SYS_STAT64 = 139 + SYS_SENDFILE64 = 140 + SYS_GETPEERNAME = 141 + SYS_FUTEX = 142 + SYS_GETTID = 143 + SYS_GETRLIMIT = 144 + SYS_SETRLIMIT = 145 + SYS_PIVOT_ROOT = 146 + SYS_PRCTL = 147 + SYS_PCICONFIG_READ = 148 + SYS_PCICONFIG_WRITE = 149 + SYS_GETSOCKNAME = 150 + SYS_INOTIFY_INIT = 151 + SYS_INOTIFY_ADD_WATCH = 152 + SYS_POLL = 153 + SYS_GETDENTS64 = 154 + SYS_INOTIFY_RM_WATCH = 156 + SYS_STATFS = 157 + SYS_FSTATFS = 158 + SYS_UMOUNT = 159 + SYS_SCHED_SET_AFFINITY = 160 + SYS_SCHED_GET_AFFINITY = 161 + SYS_GETDOMAINNAME = 162 + SYS_SETDOMAINNAME = 163 + SYS_UTRAP_INSTALL = 164 + SYS_QUOTACTL = 165 + SYS_SET_TID_ADDRESS = 166 + SYS_MOUNT = 167 + SYS_USTAT = 168 + SYS_SETXATTR = 169 + SYS_LSETXATTR = 170 + SYS_FSETXATTR = 171 + SYS_GETXATTR = 172 + SYS_LGETXATTR = 173 + SYS_GETDENTS = 174 + SYS_SETSID = 175 + SYS_FCHDIR = 176 + SYS_FGETXATTR = 177 + SYS_LISTXATTR = 178 + SYS_LLISTXATTR = 179 + SYS_FLISTXATTR = 180 + SYS_REMOVEXATTR = 181 + SYS_LREMOVEXATTR = 182 + SYS_SIGPENDING = 183 + SYS_QUERY_MODULE = 184 + SYS_SETPGID = 185 + SYS_FREMOVEXATTR = 186 + SYS_TKILL = 187 + SYS_EXIT_GROUP = 188 + SYS_UNAME = 189 + SYS_INIT_MODULE = 190 + SYS_PERSONALITY = 191 + SYS_REMAP_FILE_PAGES = 192 + SYS_EPOLL_CREATE = 193 + SYS_EPOLL_CTL = 194 + SYS_EPOLL_WAIT = 195 + SYS_IOPRIO_SET = 196 + SYS_GETPPID = 197 + SYS_SIGACTION = 198 + SYS_SGETMASK = 199 + SYS_SSETMASK = 200 + SYS_SIGSUSPEND = 201 + SYS_OLDLSTAT = 202 + SYS_USELIB = 203 + SYS_READDIR = 204 + SYS_READAHEAD = 205 + SYS_SOCKETCALL = 206 + SYS_SYSLOG = 207 + SYS_LOOKUP_DCOOKIE = 208 + SYS_FADVISE64 = 209 + SYS_FADVISE64_64 = 210 + SYS_TGKILL = 211 + SYS_WAITPID = 212 + SYS_SWAPOFF = 213 + SYS_SYSINFO = 214 + SYS_IPC = 215 + SYS_SIGRETURN = 216 + SYS_CLONE = 217 + SYS_IOPRIO_GET = 218 + SYS_ADJTIMEX = 219 + SYS_SIGPROCMASK = 220 + SYS_CREATE_MODULE = 221 + SYS_DELETE_MODULE = 222 + SYS_GET_KERNEL_SYMS = 223 + SYS_GETPGID = 224 + SYS_BDFLUSH = 225 + SYS_SYSFS = 226 + SYS_AFS_SYSCALL = 227 + SYS_SETFSUID = 228 + SYS_SETFSGID = 229 + SYS__NEWSELECT = 230 + SYS_SPLICE = 232 + SYS_STIME = 233 + SYS_STATFS64 = 234 + SYS_FSTATFS64 = 235 + SYS__LLSEEK = 236 + SYS_MLOCK = 237 + SYS_MUNLOCK = 238 + SYS_MLOCKALL = 239 + SYS_MUNLOCKALL = 240 + SYS_SCHED_SETPARAM = 241 + SYS_SCHED_GETPARAM = 242 + SYS_SCHED_SETSCHEDULER = 243 + SYS_SCHED_GETSCHEDULER = 244 + SYS_SCHED_YIELD = 245 + SYS_SCHED_GET_PRIORITY_MAX = 246 + SYS_SCHED_GET_PRIORITY_MIN = 247 + SYS_SCHED_RR_GET_INTERVAL = 248 + SYS_NANOSLEEP = 249 + SYS_MREMAP = 250 + SYS__SYSCTL = 251 + SYS_GETSID = 252 + SYS_FDATASYNC = 253 + SYS_NFSSERVCTL = 254 + SYS_SYNC_FILE_RANGE = 255 + SYS_CLOCK_SETTIME = 256 + SYS_CLOCK_GETTIME = 257 + SYS_CLOCK_GETRES = 258 + SYS_CLOCK_NANOSLEEP = 259 + SYS_SCHED_GETAFFINITY = 260 + SYS_SCHED_SETAFFINITY = 261 + SYS_TIMER_SETTIME = 262 + SYS_TIMER_GETTIME = 263 + SYS_TIMER_GETOVERRUN = 264 + SYS_TIMER_DELETE = 265 + SYS_TIMER_CREATE = 266 + SYS_VSERVER = 267 + SYS_IO_SETUP = 268 + SYS_IO_DESTROY = 269 + SYS_IO_SUBMIT = 270 + SYS_IO_CANCEL = 271 + SYS_IO_GETEVENTS = 272 + SYS_MQ_OPEN = 273 + SYS_MQ_UNLINK = 274 + SYS_MQ_TIMEDSEND = 275 + SYS_MQ_TIMEDRECEIVE = 276 + SYS_MQ_NOTIFY = 277 + SYS_MQ_GETSETATTR = 278 + SYS_WAITID = 279 + SYS_TEE = 280 + SYS_ADD_KEY = 281 + SYS_REQUEST_KEY = 282 + SYS_KEYCTL = 283 + SYS_OPENAT = 284 + SYS_MKDIRAT = 285 + SYS_MKNODAT = 286 + SYS_FCHOWNAT = 287 + SYS_FUTIMESAT = 288 + SYS_FSTATAT64 = 289 + SYS_UNLINKAT = 290 + SYS_RENAMEAT = 291 + SYS_LINKAT = 292 + SYS_SYMLINKAT = 293 + SYS_READLINKAT = 294 + SYS_FCHMODAT = 295 + SYS_FACCESSAT = 296 + SYS_PSELECT6 = 297 + SYS_PPOLL = 298 + SYS_UNSHARE = 299 + SYS_SET_ROBUST_LIST = 300 + SYS_GET_ROBUST_LIST = 301 + SYS_MIGRATE_PAGES = 302 + SYS_MBIND = 303 + SYS_GET_MEMPOLICY = 304 + SYS_SET_MEMPOLICY = 305 + SYS_KEXEC_LOAD = 306 + SYS_MOVE_PAGES = 307 + SYS_GETCPU = 308 + SYS_EPOLL_PWAIT = 309 + SYS_UTIMENSAT = 310 + SYS_SIGNALFD = 311 + SYS_TIMERFD_CREATE = 312 + SYS_EVENTFD = 313 + SYS_FALLOCATE = 314 + SYS_TIMERFD_SETTIME = 315 + SYS_TIMERFD_GETTIME = 316 + SYS_SIGNALFD4 = 317 + SYS_EVENTFD2 = 318 + SYS_EPOLL_CREATE1 = 319 + SYS_DUP3 = 320 + SYS_PIPE2 = 321 + SYS_INOTIFY_INIT1 = 322 + SYS_ACCEPT4 = 323 + SYS_PREADV = 324 + SYS_PWRITEV = 325 + SYS_RT_TGSIGQUEUEINFO = 326 + SYS_PERF_EVENT_OPEN = 327 + SYS_RECVMMSG = 328 + SYS_FANOTIFY_INIT = 329 + SYS_FANOTIFY_MARK = 330 + SYS_PRLIMIT64 = 331 + SYS_NAME_TO_HANDLE_AT = 332 + SYS_OPEN_BY_HANDLE_AT = 333 + SYS_CLOCK_ADJTIME = 334 + SYS_SYNCFS = 335 + SYS_SENDMMSG = 336 + SYS_SETNS = 337 + SYS_PROCESS_VM_READV = 338 + SYS_PROCESS_VM_WRITEV = 339 + SYS_KERN_FEATURES = 340 + SYS_KCMP = 341 + SYS_FINIT_MODULE = 342 + SYS_SCHED_SETATTR = 343 + SYS_SCHED_GETATTR = 344 + SYS_RENAMEAT2 = 345 + SYS_SECCOMP = 346 + SYS_GETRANDOM = 347 + SYS_MEMFD_CREATE = 348 + SYS_BPF = 349 + SYS_EXECVEAT = 350 + SYS_MEMBARRIER = 351 + SYS_USERFAULTFD = 352 + SYS_BIND = 353 + SYS_LISTEN = 354 + SYS_SETSOCKOPT = 355 + SYS_MLOCK2 = 356 + SYS_COPY_FILE_RANGE = 357 + SYS_PREADV2 = 358 + SYS_PWRITEV2 = 359 + SYS_STATX = 360 + SYS_IO_PGETEVENTS = 361 + SYS_PKEY_MPROTECT = 362 + SYS_PKEY_ALLOC = 363 + SYS_PKEY_FREE = 364 + SYS_RSEQ = 365 + SYS_SEMTIMEDOP = 392 + SYS_SEMGET = 393 + SYS_SEMCTL = 394 + SYS_SHMGET = 395 + SYS_SHMCTL = 396 + SYS_SHMAT = 397 + SYS_SHMDT = 398 + SYS_MSGGET = 399 + SYS_MSGSND = 400 + SYS_MSGRCV = 401 + SYS_MSGCTL = 402 + SYS_PIDFD_SEND_SIGNAL = 424 + SYS_IO_URING_SETUP = 425 + SYS_IO_URING_ENTER = 426 + SYS_IO_URING_REGISTER = 427 + SYS_OPEN_TREE = 428 + SYS_MOVE_MOUNT = 429 + SYS_FSOPEN = 430 + SYS_FSCONFIG = 431 + SYS_FSMOUNT = 432 + SYS_FSPICK = 433 + SYS_PIDFD_OPEN = 434 + SYS_CLOSE_RANGE = 436 + SYS_OPENAT2 = 437 + SYS_PIDFD_GETFD = 438 + SYS_FACCESSAT2 = 439 + SYS_PROCESS_MADVISE = 440 + SYS_EPOLL_PWAIT2 = 441 + SYS_MOUNT_SETATTR = 442 + SYS_LANDLOCK_CREATE_RULESET = 444 + SYS_LANDLOCK_ADD_RULE = 445 + SYS_LANDLOCK_RESTRICT_SELF = 446 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 72887abe55..93a64c188a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -681,6 +681,16 @@ type NdMsg struct { Type uint8 } +const ( + ICMP_FILTER = 0x1 + + ICMPV6_FILTER = 0x1 + ICMPV6_FILTER_BLOCK = 0x1 + ICMPV6_FILTER_BLOCKOTHERS = 0x3 + ICMPV6_FILTER_PASS = 0x2 + ICMPV6_FILTER_PASSONLY = 0x4 +) + const ( SizeofSockFilter = 0x8 ) @@ -1001,7 +1011,7 @@ const ( PERF_COUNT_SW_EMULATION_FAULTS = 0x8 PERF_COUNT_SW_DUMMY = 0x9 PERF_COUNT_SW_BPF_OUTPUT = 0xa - PERF_COUNT_SW_MAX = 0xb + PERF_COUNT_SW_MAX = 0xc PERF_SAMPLE_IP = 0x1 PERF_SAMPLE_TID = 0x2 PERF_SAMPLE_TIME = 0x4 @@ -1773,6 +1783,8 @@ const ( NFPROTO_NUMPROTO = 0xd ) +const SO_ORIGINAL_DST = 0x50 + type Nfgenmsg struct { Nfgen_family uint8 Version uint8 @@ -3434,7 +3446,7 @@ const ( ETHTOOL_MSG_CABLE_TEST_ACT = 0x1a ETHTOOL_MSG_CABLE_TEST_TDR_ACT = 0x1b ETHTOOL_MSG_TUNNEL_INFO_GET = 0x1c - ETHTOOL_MSG_USER_MAX = 0x1c + ETHTOOL_MSG_USER_MAX = 0x20 ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3465,7 +3477,7 @@ const ( ETHTOOL_MSG_CABLE_TEST_NTF = 0x1b ETHTOOL_MSG_CABLE_TEST_TDR_NTF = 0x1c ETHTOOL_MSG_TUNNEL_INFO_GET_REPLY = 0x1d - ETHTOOL_MSG_KERNEL_MAX = 0x1d + ETHTOOL_MSG_KERNEL_MAX = 0x21 ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 235c62e46f..72f2e96f32 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -170,6 +170,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [16]byte +} + const ( SizeofSockaddrNFCLLCP = 0x58 SizeofIovec = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 99b1e5b6ad..d5f018d13d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -173,6 +173,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index cc8bba7918..675446d936 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -176,6 +176,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [16]byte +} + const ( SizeofSockaddrNFCLLCP = 0x58 SizeofIovec = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index fa8fe3a75c..711d0711cd 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -174,6 +174,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index e7fb8d9b7a..c1131c7411 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -175,6 +175,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [16]byte +} + const ( SizeofSockaddrNFCLLCP = 0x58 SizeofIovec = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 2fa61d593b..91d5574ff9 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -174,6 +174,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index 7f36399338..5d721497b7 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -174,6 +174,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index f3c20cb863..a5addd06aa 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -175,6 +175,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [16]byte +} + const ( SizeofSockaddrNFCLLCP = 0x58 SizeofIovec = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index 885d27950d..bb6b03dfcb 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -176,6 +176,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [16]byte +} + const ( SizeofSockaddrNFCLLCP = 0x58 SizeofIovec = 0x8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index a94eb8e180..7637243b7b 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -175,6 +175,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 659e32ebd5..a1a28e525f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -175,6 +175,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index ab8ec604f0..e0a8a13622 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -174,6 +174,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index 3ec08237fd..21d6e56c70 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -173,6 +173,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index 23d474470a..0531e98f64 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -177,6 +177,11 @@ type Cmsghdr struct { Type int32 } +type ifreq struct { + Ifrn [16]byte + Ifru [24]byte +} + const ( SizeofSockaddrNFCLLCP = 0x60 SizeofIovec = 0x10 diff --git a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go index 85effef9c1..ad4aad2796 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go @@ -440,3 +440,43 @@ const ( POLLWRBAND = 0x100 POLLWRNORM = 0x4 ) + +type fileObj struct { + Atim Timespec + Mtim Timespec + Ctim Timespec + Pad [3]uint64 + Name *int8 +} + +type portEvent struct { + Events int32 + Source uint16 + Pad uint16 + Object uint64 + User *byte +} + +const ( + PORT_SOURCE_AIO = 0x1 + PORT_SOURCE_TIMER = 0x2 + PORT_SOURCE_USER = 0x3 + PORT_SOURCE_FD = 0x4 + PORT_SOURCE_ALERT = 0x5 + PORT_SOURCE_MQ = 0x6 + PORT_SOURCE_FILE = 0x7 + PORT_ALERT_SET = 0x1 + PORT_ALERT_UPDATE = 0x2 + PORT_ALERT_INVALID = 0x3 + FILE_ACCESS = 0x1 + FILE_MODIFIED = 0x2 + FILE_ATTRIB = 0x4 + FILE_TRUNC = 0x100000 + FILE_NOFOLLOW = 0x10000000 + FILE_DELETE = 0x10 + FILE_RENAME_TO = 0x20 + FILE_RENAME_FROM = 0x40 + UNMOUNTED = 0x20000000 + MOUNTEDOVER = 0x40000000 + FILE_EXCEPTION = 0x60000070 +) diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index 1f733398ee..17f03312df 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -680,7 +680,7 @@ const ( WTD_CHOICE_CERT = 5 WTD_STATEACTION_IGNORE = 0x00000000 - WTD_STATEACTION_VERIFY = 0x00000010 + WTD_STATEACTION_VERIFY = 0x00000001 WTD_STATEACTION_CLOSE = 0x00000002 WTD_STATEACTION_AUTO_CACHE = 0x00000003 WTD_STATEACTION_AUTO_CACHE_FLUSH = 0x00000004 diff --git a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go index 7e0715eb5a..5efc0a8347 100644 --- a/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go +++ b/vendor/k8s.io/apiserver/pkg/endpoints/metrics/metrics.go @@ -370,7 +370,7 @@ func RecordRequestAbort(req *http.Request, requestInfo *request.RequestInfo) { } scope := CleanScope(requestInfo) - reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), req) + reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), "", req) resource := requestInfo.Resource subresource := requestInfo.Subresource group := requestInfo.APIGroup @@ -393,7 +393,7 @@ func RecordRequestTermination(req *http.Request, requestInfo *request.RequestInf // InstrumentRouteFunc which is registered in installer.go with predefined // list of verbs (different than those translated to RequestInfo). // However, we need to tweak it e.g. to differentiate GET from LIST. - reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), req) + reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), "", req) if requestInfo.IsResourceRequest { requestTerminationsTotal.WithContext(req.Context()).WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component, codeToString(code)).Inc() @@ -415,7 +415,7 @@ func RecordLongRunning(req *http.Request, requestInfo *request.RequestInfo, comp // InstrumentRouteFunc which is registered in installer.go with predefined // list of verbs (different than those translated to RequestInfo). // However, we need to tweak it e.g. to differentiate GET from LIST. - reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), req) + reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), "", req) if requestInfo.IsResourceRequest { g = longRunningRequestGauge.WithContext(req.Context()).WithLabelValues(reportedVerb, requestInfo.APIGroup, requestInfo.APIVersion, requestInfo.Resource, requestInfo.Subresource, scope, component) @@ -434,7 +434,7 @@ func MonitorRequest(req *http.Request, verb, group, version, resource, subresour // InstrumentRouteFunc which is registered in installer.go with predefined // list of verbs (different than those translated to RequestInfo). // However, we need to tweak it e.g. to differentiate GET from LIST. - reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), req) + reportedVerb := cleanVerb(CanonicalVerb(strings.ToUpper(req.Method), scope), verb, req) dryRun := cleanDryRun(req.URL) elapsedSeconds := elapsed.Seconds() @@ -564,8 +564,15 @@ func CleanVerb(verb string, request *http.Request) string { } // cleanVerb additionally ensures that unknown verbs don't clog up the metrics. -func cleanVerb(verb string, request *http.Request) string { +func cleanVerb(verb, suggestedVerb string, request *http.Request) string { reportedVerb := CleanVerb(verb, request) + // CanonicalVerb (being an input for this function) doesn't handle correctly the + // deprecated path pattern for watch of: + // GET /api/{version}/watch/{resource} + // We correct it manually based on the pass verb from the installer. + if suggestedVerb == "WATCH" || suggestedVerb == "WATCHLIST" { + reportedVerb = "WATCH" + } if validRequestMethods.Has(reportedVerb) { return reportedVerb } diff --git a/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go b/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go index 1de20682af..04375d1dd7 100644 --- a/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go +++ b/vendor/k8s.io/apiserver/pkg/server/deprecated_insecure_serving.go @@ -45,6 +45,9 @@ func (s *DeprecatedInsecureServingInfo) Serve(handler http.Handler, shutdownTime Addr: s.Listener.Addr().String(), Handler: handler, MaxHeaderBytes: 1 << 20, + + IdleTimeout: 90 * time.Second, // matches http.DefaultTransport keep-alive timeout + ReadHeaderTimeout: 32 * time.Second, // just shy of requestTimeoutUpperBound } if len(s.Name) > 0 { diff --git a/vendor/k8s.io/apiserver/pkg/server/secure_serving.go b/vendor/k8s.io/apiserver/pkg/server/secure_serving.go index c706afb5f5..5626cb3a90 100644 --- a/vendor/k8s.io/apiserver/pkg/server/secure_serving.go +++ b/vendor/k8s.io/apiserver/pkg/server/secure_serving.go @@ -157,6 +157,9 @@ func (s *SecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Dur Handler: handler, MaxHeaderBytes: 1 << 20, TLSConfig: tlsConfig, + + IdleTimeout: 90 * time.Second, // matches http.DefaultTransport keep-alive timeout + ReadHeaderTimeout: 32 * time.Second, // just shy of requestTimeoutUpperBound } // At least 99% of serialized resources in surveyed clusters were smaller than 256kb. @@ -164,7 +167,9 @@ func (s *SecureServingInfo) Serve(handler http.Handler, shutdownTimeout time.Dur // and small enough to allow a per connection buffer of this size multiplied by `MaxConcurrentStreams`. const resourceBody99Percentile = 256 * 1024 - http2Options := &http2.Server{} + http2Options := &http2.Server{ + IdleTimeout: 90 * time.Second, // matches http.DefaultTransport keep-alive timeout + } // shrink the per-stream buffer and max framesize from the 1MB default while still accommodating most API POST requests in a single frame http2Options.MaxUploadBufferPerStream = resourceBody99Percentile @@ -218,6 +223,9 @@ func (s *SecureServingInfo) ServeWithListenerStopped(handler http.Handler, shutd Handler: handler, MaxHeaderBytes: 1 << 20, TLSConfig: tlsConfig, + + IdleTimeout: 90 * time.Second, // matches http.DefaultTransport keep-alive timeout + ReadHeaderTimeout: 32 * time.Second, // just shy of requestTimeoutUpperBound } // At least 99% of serialized resources in surveyed clusters were smaller than 256kb. @@ -225,7 +233,9 @@ func (s *SecureServingInfo) ServeWithListenerStopped(handler http.Handler, shutd // and small enough to allow a per connection buffer of this size multiplied by `MaxConcurrentStreams`. const resourceBody99Percentile = 256 * 1024 - http2Options := &http2.Server{} + http2Options := &http2.Server{ + IdleTimeout: 90 * time.Second, // matches http.DefaultTransport keep-alive timeout + } // shrink the per-stream buffer and max framesize from the 1MB default while still accommodating most API POST requests in a single frame http2Options.MaxUploadBufferPerStream = resourceBody99Percentile diff --git a/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go b/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go index 5f36b7108d..7f558a5886 100644 --- a/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go +++ b/vendor/k8s.io/apiserver/pkg/storage/etcd3/store.go @@ -230,12 +230,22 @@ func (s *store) conditionalDelete( } // It's possible we're working with stale data. + // Remember the revision of the potentially stale data and the resulting update error + cachedRev := origState.rev + cachedUpdateErr := err + // Actually fetch origState, err = getCurrentState() if err != nil { return err } origStateIsCurrent = true + + // it turns out our cached data was not stale, return the error + if cachedRev == origState.rev { + return cachedUpdateErr + } + // Retry continue } @@ -246,12 +256,22 @@ func (s *store) conditionalDelete( } // It's possible we're working with stale data. + // Remember the revision of the potentially stale data and the resulting update error + cachedRev := origState.rev + cachedUpdateErr := err + // Actually fetch origState, err = getCurrentState() if err != nil { return err } origStateIsCurrent = true + + // it turns out our cached data was not stale, return the error + if cachedRev == origState.rev { + return cachedUpdateErr + } + // Retry continue } @@ -345,12 +365,22 @@ func (s *store) GuaranteedUpdate( } // It's possible we were working with stale data + // Remember the revision of the potentially stale data and the resulting update error + cachedRev := origState.rev + cachedUpdateErr := err + // Actually fetch origState, err = getCurrentState() if err != nil { return err } origStateIsCurrent = true + + // it turns out our cached data was not stale, return the error + if cachedRev == origState.rev { + return cachedUpdateErr + } + // Retry continue } diff --git a/vendor/k8s.io/utils/pointer/pointer.go b/vendor/k8s.io/utils/pointer/pointer.go index 1da6f6664a..2cab2c5800 100644 --- a/vendor/k8s.io/utils/pointer/pointer.go +++ b/vendor/k8s.io/utils/pointer/pointer.go @@ -46,6 +46,24 @@ func AllPtrFieldsNil(obj interface{}) bool { return true } +// Int returns a pointer to an int +func Int(i int) *int { + return &i +} + +var IntPtr = Int // for back-compat + +// IntDeref dereferences the int ptr and returns it if not nil, or else +// returns def. +func IntDeref(ptr *int, def int) int { + if ptr != nil { + return *ptr + } + return def +} + +var IntPtrDerefOr = IntDeref // for back-compat + // Int32 returns a pointer to an int32. func Int32(i int32) *int32 { return &i diff --git a/vendor/modules.txt b/vendor/modules.txt index 5ce7c4a3a8..32ab85daf7 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1,4 +1,4 @@ -# cloud.google.com/go v0.54.0 +# cloud.google.com/go v0.81.0 cloud.google.com/go/compute/metadata # github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 github.com/Azure/go-ansiterm @@ -403,7 +403,7 @@ github.com/mitchellh/go-wordwrap github.com/mitchellh/hashstructure # github.com/mitchellh/hashstructure/v2 v2.0.2 github.com/mitchellh/hashstructure/v2 -# github.com/mitchellh/mapstructure v1.1.2 +# github.com/mitchellh/mapstructure v1.4.1 github.com/mitchellh/mapstructure # github.com/mitchellh/reflectwalk v1.0.1 github.com/mitchellh/reflectwalk @@ -454,7 +454,7 @@ github.com/onsi/ginkgo/reporters/stenographer github.com/onsi/ginkgo/reporters/stenographer/support/go-colorable github.com/onsi/ginkgo/reporters/stenographer/support/go-isatty github.com/onsi/ginkgo/types -# github.com/onsi/gomega v1.13.0 +# github.com/onsi/gomega v1.15.0 github.com/onsi/gomega/gstruct/errors github.com/onsi/gomega/types # github.com/opencontainers/go-digest v1.0.0 @@ -676,7 +676,7 @@ github.com/shurcooL/sanitized_anchor_name github.com/sirupsen/logrus # github.com/spf13/cast v1.3.1 github.com/spf13/cast -# github.com/spf13/cobra v1.1.3 +# github.com/spf13/cobra v1.2.1 ## explicit github.com/spf13/cobra github.com/spf13/cobra/doc @@ -732,7 +732,7 @@ go.etcd.io/etcd/client/v3 go.etcd.io/etcd/client/v3/credentials go.etcd.io/etcd/client/v3/internal/endpoint go.etcd.io/etcd/client/v3/internal/resolver -# go.opencensus.io v0.22.3 +# go.opencensus.io v0.23.0 go.opencensus.io go.opencensus.io/internal go.opencensus.io/trace @@ -807,7 +807,7 @@ go.starlark.net/syntax go.uber.org/atomic # go.uber.org/multierr v1.6.0 go.uber.org/multierr -# go.uber.org/zap v1.17.0 +# go.uber.org/zap v1.19.0 go.uber.org/zap go.uber.org/zap/buffer go.uber.org/zap/internal/bufferpool @@ -858,9 +858,10 @@ golang.org/x/net/internal/timeseries golang.org/x/net/proxy golang.org/x/net/trace golang.org/x/net/websocket -# golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d +# golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602 golang.org/x/oauth2 golang.org/x/oauth2/google +golang.org/x/oauth2/google/internal/externalaccount golang.org/x/oauth2/internal golang.org/x/oauth2/jws golang.org/x/oauth2/jwt @@ -868,7 +869,7 @@ golang.org/x/oauth2/jwt golang.org/x/sync/errgroup golang.org/x/sync/semaphore golang.org/x/sync/singleflight -# golang.org/x/sys v0.0.0-20210616094352-59db8d763f22 +# golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 golang.org/x/sys/cpu golang.org/x/sys/execabs golang.org/x/sys/internal/unsafeheader @@ -891,7 +892,7 @@ golang.org/x/text/unicode/norm golang.org/x/text/width # golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/time/rate -# golang.org/x/tools v0.1.3 +# golang.org/x/tools v0.1.5 golang.org/x/tools/go/ast/astutil golang.org/x/tools/go/ast/inspector golang.org/x/tools/go/gcexportdata @@ -1094,7 +1095,7 @@ helm.sh/helm/v3/pkg/storage helm.sh/helm/v3/pkg/storage/driver helm.sh/helm/v3/pkg/strvals helm.sh/helm/v3/pkg/time -# k8s.io/api v0.22.0 +# k8s.io/api v0.22.1 ## explicit k8s.io/api/admission/v1 k8s.io/api/admission/v1beta1 @@ -1142,7 +1143,7 @@ k8s.io/api/scheduling/v1beta1 k8s.io/api/storage/v1 k8s.io/api/storage/v1alpha1 k8s.io/api/storage/v1beta1 -# k8s.io/apiextensions-apiserver v0.22.0 +# k8s.io/apiextensions-apiserver v0.22.1 k8s.io/apiextensions-apiserver/pkg/apihelpers k8s.io/apiextensions-apiserver/pkg/apis/apiextensions k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install @@ -1165,7 +1166,7 @@ k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensio k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/internalinterfaces k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1 k8s.io/apiextensions-apiserver/pkg/client/listers/apiextensions/v1beta1 -# k8s.io/apimachinery v0.22.0 +# k8s.io/apimachinery v0.22.1 ## explicit k8s.io/apimachinery/pkg/api/equality k8s.io/apimachinery/pkg/api/errors @@ -1227,7 +1228,7 @@ k8s.io/apimachinery/pkg/watch k8s.io/apimachinery/third_party/forked/golang/json k8s.io/apimachinery/third_party/forked/golang/netutil k8s.io/apimachinery/third_party/forked/golang/reflect -# k8s.io/apiserver v0.22.0 +# k8s.io/apiserver v0.22.1 k8s.io/apiserver/pkg/admission k8s.io/apiserver/pkg/admission/configuration k8s.io/apiserver/pkg/admission/initializer @@ -1359,7 +1360,7 @@ k8s.io/apiserver/plugin/pkg/authorizer/webhook k8s.io/cli-runtime/pkg/genericclioptions k8s.io/cli-runtime/pkg/printers k8s.io/cli-runtime/pkg/resource -# k8s.io/client-go v0.22.0 +# k8s.io/client-go v0.22.1 ## explicit k8s.io/client-go/applyconfigurations/admissionregistration/v1 k8s.io/client-go/applyconfigurations/admissionregistration/v1beta1 @@ -1601,7 +1602,7 @@ k8s.io/client-go/util/jsonpath k8s.io/client-go/util/keyutil k8s.io/client-go/util/retry k8s.io/client-go/util/workqueue -# k8s.io/code-generator v0.22.0 +# k8s.io/code-generator v0.22.1 ## explicit k8s.io/code-generator k8s.io/code-generator/cmd/client-gen @@ -1636,7 +1637,7 @@ k8s.io/code-generator/cmd/set-gen k8s.io/code-generator/pkg/namer k8s.io/code-generator/pkg/util k8s.io/code-generator/third_party/forked/golang/reflect -# k8s.io/component-base v0.22.0 +# k8s.io/component-base v0.22.1 k8s.io/component-base/cli/flag k8s.io/component-base/config k8s.io/component-base/config/v1alpha1 @@ -1708,7 +1709,7 @@ k8s.io/kubectl/pkg/util/openapi/validation k8s.io/kubectl/pkg/util/templates k8s.io/kubectl/pkg/util/term k8s.io/kubectl/pkg/validation -# k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9 +# k8s.io/utils v0.0.0-20210802155522-efc7438f0176 ## explicit k8s.io/utils/buffer k8s.io/utils/exec @@ -1723,7 +1724,7 @@ k8s.io/utils/trace # sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22 sigs.k8s.io/apiserver-network-proxy/konnectivity-client/pkg/client sigs.k8s.io/apiserver-network-proxy/konnectivity-client/proto/client -# sigs.k8s.io/controller-runtime v0.9.2 +# sigs.k8s.io/controller-runtime v0.10.0 ## explicit sigs.k8s.io/controller-runtime sigs.k8s.io/controller-runtime/pkg/builder @@ -1766,7 +1767,7 @@ sigs.k8s.io/controller-runtime/pkg/webhook sigs.k8s.io/controller-runtime/pkg/webhook/admission sigs.k8s.io/controller-runtime/pkg/webhook/conversion sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics -# sigs.k8s.io/controller-tools v0.6.1 +# sigs.k8s.io/controller-tools v0.6.2 ## explicit sigs.k8s.io/controller-tools/cmd/controller-gen sigs.k8s.io/controller-tools/pkg/crd diff --git a/vendor/sigs.k8s.io/controller-runtime/FAQ.md b/vendor/sigs.k8s.io/controller-runtime/FAQ.md index cfc2997924..86c7f93369 100644 --- a/vendor/sigs.k8s.io/controller-runtime/FAQ.md +++ b/vendor/sigs.k8s.io/controller-runtime/FAQ.md @@ -55,7 +55,7 @@ to test against a real API server. In our experience, tests using fake clients gradually re-implement poorly-written impressions of a real API server, which leads to hard-to-maintain, complex test code. -### Q: How should I write tests? Any suggestions for getting started? +### Q: How should I write tests? Any suggestions for getting started? - Use the aforementioned [envtest.Environment](https://godoc.org/sigs.k8s.io/controller-runtime/pkg/envtest#Environment) diff --git a/vendor/sigs.k8s.io/controller-runtime/Makefile b/vendor/sigs.k8s.io/controller-runtime/Makefile index f2cd38cad8..36647c697f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/Makefile +++ b/vendor/sigs.k8s.io/controller-runtime/Makefile @@ -40,6 +40,7 @@ TOOLS_BIN_DIR := $(TOOLS_DIR)/bin GOLANGCI_LINT := $(abspath $(TOOLS_BIN_DIR)/golangci-lint) GO_APIDIFF := $(TOOLS_BIN_DIR)/go-apidiff CONTROLLER_GEN := $(TOOLS_BIN_DIR)/controller-gen +ENVTEST_DIR := $(abspath tools/setup-envtest) # The help will print out all targets with their descriptions organized bellow their categories. The categories are represented by `##@` and the target descriptions by `##`. # The awk commands is responsible to read the entire set of makefiles included in this invocation, looking for lines of the file as xyz: ## something, and then pretty-format the target and help. Then, if there's a line with ##@ something, that gets pretty-printed as a category. @@ -97,6 +98,7 @@ lint-fix: $(GOLANGCI_LINT) ## Lint the codebase and run auto-fixers if supported modules: ## Runs go mod to ensure modules are up to date. go mod tidy cd $(TOOLS_DIR); go mod tidy + cd $(ENVTEST_DIR); go mod tidy .PHONY: generate generate: $(CONTROLLER_GEN) ## Runs controller-gen for internal types for config file diff --git a/vendor/sigs.k8s.io/controller-runtime/OWNERS_ALIASES b/vendor/sigs.k8s.io/controller-runtime/OWNERS_ALIASES index d93e1794fb..290dcc192e 100644 --- a/vendor/sigs.k8s.io/controller-runtime/OWNERS_ALIASES +++ b/vendor/sigs.k8s.io/controller-runtime/OWNERS_ALIASES @@ -11,12 +11,12 @@ aliases: # non-admin folks who have write-access and can approve any PRs in the repo controller-runtime-maintainers: - vincepri + - joelanford # non-admin folks who can approve any PRs in the repo controller-runtime-approvers: - gerred - shawn-hurley - - joelanford - alvaroaleman # folks who can review and LGTM any PRs in the repo (doesn't @@ -26,6 +26,7 @@ aliases: - alenkacz - vincepri - alexeldeib + - varshaprasad96 # folks to can approve things in the directly-ported # testing_frameworks portions of the codebase diff --git a/vendor/sigs.k8s.io/controller-runtime/README.md b/vendor/sigs.k8s.io/controller-runtime/README.md index e4cbabb00a..d857d3e76a 100644 --- a/vendor/sigs.k8s.io/controller-runtime/README.md +++ b/vendor/sigs.k8s.io/controller-runtime/README.md @@ -1,4 +1,5 @@ [![Go Report Card](https://goreportcard.com/badge/sigs.k8s.io/controller-runtime)](https://goreportcard.com/report/sigs.k8s.io/controller-runtime) +[![godoc](https://godoc.org/sigs.k8s.io/controller-runtime?status.svg)](https://godoc.org/sigs.k8s.io/controller-runtime) # Kubernetes controller-runtime Project diff --git a/vendor/sigs.k8s.io/controller-runtime/TMP-LOGGING.md b/vendor/sigs.k8s.io/controller-runtime/TMP-LOGGING.md index 9ee4b2a431..b3cfc66517 100644 --- a/vendor/sigs.k8s.io/controller-runtime/TMP-LOGGING.md +++ b/vendor/sigs.k8s.io/controller-runtime/TMP-LOGGING.md @@ -75,7 +75,7 @@ allKubernetesObjectsEverywhere) ``` While it's possible to use higher log levels, it's recommended that you -stick with `V(1)` or V(0)` (which is equivalent to not specifying `V`), +stick with `V(1)` or `V(0)` (which is equivalent to not specifying `V`), and then filter later based on key-value pairs or messages; different numbers tend to lose meaning easily over time, and you'll be left wondering why particular logs lines are at `V(5)` instead of `V(7)`. diff --git a/vendor/sigs.k8s.io/controller-runtime/doc.go b/vendor/sigs.k8s.io/controller-runtime/doc.go index 758662085d..429eb129f9 100644 --- a/vendor/sigs.k8s.io/controller-runtime/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/doc.go @@ -58,7 +58,7 @@ limitations under the License. // // Controllers // -// Controllers (pkg/controller) use events (pkg/events) to eventually trigger +// Controllers (pkg/controller) use events (pkg/event) to eventually trigger // reconcile requests. They may be constructed manually, but are often // constructed with a Builder (pkg/builder), which eases the wiring of event // sources (pkg/source), like Kubernetes API object changes, to event handlers diff --git a/vendor/sigs.k8s.io/controller-runtime/go.mod b/vendor/sigs.k8s.io/controller-runtime/go.mod index 0ce3b6c132..53596f3b14 100644 --- a/vendor/sigs.k8s.io/controller-runtime/go.mod +++ b/vendor/sigs.k8s.io/controller-runtime/go.mod @@ -7,24 +7,22 @@ require ( github.com/fsnotify/fsnotify v1.4.9 github.com/go-logr/logr v0.4.0 github.com/go-logr/zapr v0.4.0 - github.com/googleapis/gnostic v0.5.5 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/imdario/mergo v0.3.12 // indirect github.com/onsi/ginkgo v1.16.4 - github.com/onsi/gomega v1.13.0 + github.com/onsi/gomega v1.15.0 github.com/prometheus/client_golang v1.11.0 github.com/prometheus/client_model v0.2.0 go.uber.org/goleak v1.1.10 - go.uber.org/zap v1.17.0 - golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 - golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 + go.uber.org/zap v1.19.0 + golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 + golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac gomodules.xyz/jsonpatch/v2 v2.2.0 google.golang.org/appengine v1.6.7 // indirect - k8s.io/api v0.21.2 - k8s.io/apiextensions-apiserver v0.21.2 - k8s.io/apimachinery v0.21.2 - k8s.io/client-go v0.21.2 - k8s.io/component-base v0.21.2 - k8s.io/utils v0.0.0-20210527160623-6fdb442a123b + k8s.io/api v0.22.1 + k8s.io/apiextensions-apiserver v0.22.1 + k8s.io/apimachinery v0.22.1 + k8s.io/client-go v0.22.1 + k8s.io/component-base v0.22.1 + k8s.io/utils v0.0.0-20210802155522-efc7438f0176 sigs.k8s.io/yaml v1.2.0 ) diff --git a/vendor/sigs.k8s.io/controller-runtime/go.sum b/vendor/sigs.k8s.io/controller-runtime/go.sum index 12cf1b35ba..82d98e7e53 100644 --- a/vendor/sigs.k8s.io/controller-runtime/go.sum +++ b/vendor/sigs.k8s.io/controller-runtime/go.sum @@ -23,13 +23,14 @@ cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiy cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= +github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA= +github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= @@ -43,10 +44,14 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -55,6 +60,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= @@ -63,18 +70,19 @@ github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWR github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -83,22 +91,27 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.11.0+incompatible h1:glyUF9yIYtMHzn8xaKw5rMhdWcwsYV8dZHIq5567/xs= github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -115,27 +128,27 @@ github.com/go-logr/logr v0.4.0 h1:K7/B1jt6fIBQVd4Owv2MqGQClcgf0R266+7C/QjRcLc= github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/zapr v0.4.0 h1:uc1uML3hRYL9/ZZPdgHS/n8Nzo+eaYL/Efxkkamf7OM= github.com/go-logr/zapr v0.4.0/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aAiEnk= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -155,10 +168,12 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -177,24 +192,22 @@ github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= +github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -210,8 +223,6 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= @@ -225,9 +236,10 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -237,6 +249,7 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -245,18 +258,15 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -270,7 +280,7 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= -github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= +github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -288,20 +298,18 @@ github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak= -github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU= +github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= @@ -334,11 +342,11 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -348,18 +356,18 @@ github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= 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= +github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -367,7 +375,6 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -376,21 +383,37 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= +go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= +go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= +go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= +go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= +go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= +go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= +go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= +go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= +go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -400,14 +423,14 @@ go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/ go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= +go.uber.org/zap v1.19.0 h1:mZQZefskPPCMIBCSEH0v2/iUqqLrYtaeqwD6FUGUnFE= +go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -433,8 +456,9 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -443,7 +467,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -461,7 +485,6 @@ golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -472,10 +495,13 @@ golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210428140749-89ef3d95e781 h1:DzZ89McO9/gWPsQXS/FVKAlG02ZjaQ6AlZRBimEYOd0= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023 h1:ADo5wSpq2gqaCGQWzk7S5vd//0iyyLeAratkEoG5dLE= +golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -490,6 +516,7 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -504,10 +531,8 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -523,18 +548,23 @@ golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 h1:c8PlLMqBbOHoqtjteWm5/kbe6rNY2pbRfbIMVnepueo= +golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -544,18 +574,18 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6 h1:Vv0JUPWTyeqUq42B2WJ1FeIDjjvGKoA2Ss+Ts0lAVbs= -golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= +golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -566,7 +596,6 @@ golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= @@ -594,8 +623,8 @@ golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.2 h1:kRBLX7v7Af8W7Gdbbc908OJcdgtK8bOz9Uaj8/F1ACA= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -638,16 +667,24 @@ google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4 google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -667,7 +704,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= @@ -681,6 +717,7 @@ gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWD gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -699,36 +736,35 @@ honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.21.2 h1:vz7DqmRsXTCSa6pNxXwQ1IYeAZgdIsua+DZU+o+SX3Y= -k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= -k8s.io/apiextensions-apiserver v0.21.2 h1:+exKMRep4pDrphEafRvpEi79wTnCFMqKf8LBtlA3yrE= -k8s.io/apiextensions-apiserver v0.21.2/go.mod h1:+Axoz5/l3AYpGLlhJDfcVQzCerVYq3K3CvDMvw6X1RA= -k8s.io/apimachinery v0.21.2 h1:vezUc/BHqWlQDnZ+XkrpXSmnANSLbpnlpwo0Lhk0gpc= -k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= -k8s.io/apiserver v0.21.2/go.mod h1:lN4yBoGyiNT7SC1dmNk0ue6a5Wi6O3SWOIw91TsucQw= -k8s.io/client-go v0.21.2 h1:Q1j4L/iMN4pTw6Y4DWppBoUxgKO8LbffEMVEV00MUp0= -k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= -k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= -k8s.io/component-base v0.21.2 h1:EsnmFFoJ86cEywC0DoIkAUiEV6fjgauNugiw1lmIjs4= -k8s.io/component-base v0.21.2/go.mod h1:9lvmIThzdlrJj5Hp8Z/TOgIkdfsNARQ1pT+3PByuiuc= +k8s.io/api v0.22.1 h1:ISu3tD/jRhYfSW8jI/Q1e+lRxkR7w9UwQEZ7FgslrwY= +k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY= +k8s.io/apiextensions-apiserver v0.22.1 h1:YSJYzlFNFSfUle+yeEXX0lSQyLEoxoPJySRupepb0gE= +k8s.io/apiextensions-apiserver v0.22.1/go.mod h1:HeGmorjtRmRLE+Q8dJu6AYRoZccvCMsghwS8XTUYb2c= +k8s.io/apimachinery v0.22.1 h1:DTARnyzmdHMz7bFWFDDm22AM4pLWTQECMpRTFu2d2OM= +k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= +k8s.io/apiserver v0.22.1/go.mod h1:2mcM6dzSt+XndzVQJX21Gx0/Klo7Aen7i0Ai6tIa400= +k8s.io/client-go v0.22.1 h1:jW0ZSHi8wW260FvcXHkIa0NLxFBQszTlhiAVsU5mopw= +k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk= +k8s.io/code-generator v0.22.1/go.mod h1:eV77Y09IopzeXOJzndrDyCI88UBok2h6WxAlBwpxa+o= +k8s.io/component-base v0.22.1 h1:SFqIXsEN3v3Kkr1bS6rstrs1wd45StJqbtgbQ4nRQdo= +k8s.io/component-base v0.22.1/go.mod h1:0D+Bl8rrnsPN9v0dyYvkqFfBeAd4u7n77ze+p8CMiPo= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= -k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= -k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210527160623-6fdb442a123b h1:MSqsVQ3pZvPGTqCjptfimO2WjG7A9un2zcpiHkA6M/s= -k8s.io/utils v0.0.0-20210527160623-6fdb442a123b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/klog/v2 v2.9.0 h1:D7HV+n1V57XeZ0m6tdRkfknthUaM06VFbWldOFh8kzM= +k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e h1:KLHHjkdQFomZy8+06csTWZ0m1343QqxZhR2LJ1OxCYM= +k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= +k8s.io/utils v0.0.0-20210707171843-4b05e18ac7d9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176 h1:Mx0aa+SUAcNRQbs5jUzV8lkDlGFU8laZsY9jrcVX5SY= +k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0 h1:C4r9BgJ98vrKnnVCjwCSXcWjWe0NKcUQkmzDXZXGwH8= -sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/doc.go b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/doc.go index 09126576b2..e4df1b709f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/builder/doc.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/builder/doc.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -// Package builder provides wraps other controller-runtime libraries and exposes simple +// Package builder wraps other controller-runtime libraries and exposes simple // patterns for building common Controllers. // // Projects built with the builder package can trivially be rebased on top of the underlying diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go index 6862fd62bd..f89800ca2f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/cache.go @@ -113,6 +113,12 @@ type Options struct { // [1] https://pkg.go.dev/k8s.io/apimachinery/pkg/fields#Selector // [2] https://pkg.go.dev/k8s.io/apimachinery/pkg/fields#Set SelectorsByObject SelectorsByObject + + // UnsafeDisableDeepCopyByObject indicates not to deep copy objects during get or + // list objects per GVK at the specified object. + // Be very careful with this, when enabled you must DeepCopy any object before mutating it, + // otherwise you will mutate the object in the cache. + UnsafeDisableDeepCopyByObject DisableDeepCopyByObject } var defaultResyncTime = 10 * time.Hour @@ -127,7 +133,11 @@ func New(config *rest.Config, opts Options) (Cache, error) { if err != nil { return nil, err } - im := internal.NewInformersMap(config, opts.Scheme, opts.Mapper, *opts.Resync, opts.Namespace, selectorsByGVK) + disableDeepCopyByGVK, err := convertToDisableDeepCopyByGVK(opts.UnsafeDisableDeepCopyByObject, opts.Scheme) + if err != nil { + return nil, err + } + im := internal.NewInformersMap(config, opts.Scheme, opts.Mapper, *opts.Resync, opts.Namespace, selectorsByGVK, disableDeepCopyByGVK) return &informerCache{InformersMap: im}, nil } @@ -136,6 +146,8 @@ func New(config *rest.Config, opts Options) (Cache, error) { // SelectorsByObject // WARNING: if SelectorsByObject is specified. filtered out resources are not // returned. +// WARNING: if UnsafeDisableDeepCopy is enabled, you must DeepCopy any object +// returned from cache get/list before mutating it. func BuilderWithOptions(options Options) NewCacheFunc { return func(config *rest.Config, opts Options) (Cache, error) { if opts.Scheme == nil { @@ -151,6 +163,7 @@ func BuilderWithOptions(options Options) NewCacheFunc { opts.Namespace = options.Namespace } opts.SelectorsByObject = options.SelectorsByObject + opts.UnsafeDisableDeepCopyByObject = options.UnsafeDisableDeepCopyByObject return New(config, opts) } } @@ -189,3 +202,30 @@ func convertToSelectorsByGVK(selectorsByObject SelectorsByObject, scheme *runtim } return selectorsByGVK, nil } + +// DisableDeepCopyByObject associate a client.Object's GVK to disable DeepCopy during get or list from cache. +type DisableDeepCopyByObject map[client.Object]bool + +var _ client.Object = &ObjectAll{} + +// ObjectAll is the argument to represent all objects' types. +type ObjectAll struct { + client.Object +} + +func convertToDisableDeepCopyByGVK(disableDeepCopyByObject DisableDeepCopyByObject, scheme *runtime.Scheme) (internal.DisableDeepCopyByGVK, error) { + disableDeepCopyByGVK := internal.DisableDeepCopyByGVK{} + for obj, disable := range disableDeepCopyByObject { + switch obj.(type) { + case ObjectAll, *ObjectAll: + disableDeepCopyByGVK[internal.GroupVersionKindAll] = disable + default: + gvk, err := apiutil.GVKForObject(obj, scheme) + if err != nil { + return nil, err + } + disableDeepCopyByGVK[gvk] = disable + } + } + return disableDeepCopyByGVK, nil +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go index 5a495693ed..b95af18d78 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go @@ -46,6 +46,11 @@ type CacheReader struct { // scopeName is the scope of the resource (namespaced or cluster-scoped). scopeName apimeta.RESTScopeName + + // disableDeepCopy indicates not to deep copy objects during get or list objects. + // Be very careful with this, when enabled you must DeepCopy any object before mutating it, + // otherwise you will mutate the object in the cache. + disableDeepCopy bool } // Get checks the indexer for the object and writes a copy of it if found. @@ -76,9 +81,13 @@ func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Ob return fmt.Errorf("cache contained %T, which is not an Object", obj) } - // deep copy to avoid mutating cache - // TODO(directxman12): revisit the decision to always deepcopy - obj = obj.(runtime.Object).DeepCopyObject() + if c.disableDeepCopy { + // skip deep copy which might be unsafe + // you must DeepCopy any object before mutating it outside + } else { + // deep copy to avoid mutating cache + obj = obj.(runtime.Object).DeepCopyObject() + } // Copy the value of the item in the cache to the returned value // TODO(directxman12): this is a terrible hack, pls fix (we should have deepcopyinto) @@ -88,7 +97,9 @@ func (c *CacheReader) Get(_ context.Context, key client.ObjectKey, out client.Ob return fmt.Errorf("cache had type %s, but %s was asked for", objVal.Type(), outVal.Type()) } reflect.Indirect(outVal).Set(reflect.Indirect(objVal)) - out.GetObjectKind().SetGroupVersionKind(c.groupVersionKind) + if !c.disableDeepCopy { + out.GetObjectKind().SetGroupVersionKind(c.groupVersionKind) + } return nil } @@ -129,10 +140,10 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli limitSet := listOpts.Limit > 0 runtimeObjs := make([]runtime.Object, 0, len(objs)) - for i, item := range objs { + for _, item := range objs { // if the Limit option is set and the number of items // listed exceeds this limit, then stop reading. - if limitSet && int64(i) >= listOpts.Limit { + if limitSet && int64(len(runtimeObjs)) >= listOpts.Limit { break } obj, isObj := item.(runtime.Object) @@ -150,8 +161,15 @@ func (c *CacheReader) List(_ context.Context, out client.ObjectList, opts ...cli } } - outObj := obj.DeepCopyObject() - outObj.GetObjectKind().SetGroupVersionKind(c.groupVersionKind) + var outObj runtime.Object + if c.disableDeepCopy { + // skip deep copy which might be unsafe + // you must DeepCopy any object before mutating it outside + outObj = obj + } else { + outObj = obj.DeepCopyObject() + outObj.GetObjectKind().SetGroupVersionKind(c.groupVersionKind) + } runtimeObjs = append(runtimeObjs, outObj) } return apimeta.SetList(out, runtimeObjs) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/deleg_map.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/deleg_map.go index 841f1657eb..9bfc8463fd 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/deleg_map.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/deleg_map.go @@ -51,11 +51,12 @@ func NewInformersMap(config *rest.Config, resync time.Duration, namespace string, selectors SelectorsByGVK, + disableDeepCopy DisableDeepCopyByGVK, ) *InformersMap { return &InformersMap{ - structured: newStructuredInformersMap(config, scheme, mapper, resync, namespace, selectors), - unstructured: newUnstructuredInformersMap(config, scheme, mapper, resync, namespace, selectors), - metadata: newMetadataInformersMap(config, scheme, mapper, resync, namespace, selectors), + structured: newStructuredInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy), + unstructured: newUnstructuredInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy), + metadata: newMetadataInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy), Scheme: scheme, } @@ -107,18 +108,18 @@ func (m *InformersMap) Get(ctx context.Context, gvk schema.GroupVersionKind, obj // newStructuredInformersMap creates a new InformersMap for structured objects. func newStructuredInformersMap(config *rest.Config, scheme *runtime.Scheme, mapper meta.RESTMapper, resync time.Duration, - namespace string, selectors SelectorsByGVK) *specificInformersMap { - return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, createStructuredListWatch) + namespace string, selectors SelectorsByGVK, disableDeepCopy DisableDeepCopyByGVK) *specificInformersMap { + return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy, createStructuredListWatch) } // newUnstructuredInformersMap creates a new InformersMap for unstructured objects. func newUnstructuredInformersMap(config *rest.Config, scheme *runtime.Scheme, mapper meta.RESTMapper, resync time.Duration, - namespace string, selectors SelectorsByGVK) *specificInformersMap { - return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, createUnstructuredListWatch) + namespace string, selectors SelectorsByGVK, disableDeepCopy DisableDeepCopyByGVK) *specificInformersMap { + return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy, createUnstructuredListWatch) } // newMetadataInformersMap creates a new InformersMap for metadata-only objects. func newMetadataInformersMap(config *rest.Config, scheme *runtime.Scheme, mapper meta.RESTMapper, resync time.Duration, - namespace string, selectors SelectorsByGVK) *specificInformersMap { - return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, createMetadataListWatch) + namespace string, selectors SelectorsByGVK, disableDeepCopy DisableDeepCopyByGVK) *specificInformersMap { + return newSpecificInformersMap(config, scheme, mapper, resync, namespace, selectors, disableDeepCopy, createMetadataListWatch) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/disabledeepcopy.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/disabledeepcopy.go new file mode 100644 index 0000000000..54bd7eec93 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/disabledeepcopy.go @@ -0,0 +1,35 @@ +/* +Copyright 2021 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package internal + +import "k8s.io/apimachinery/pkg/runtime/schema" + +// GroupVersionKindAll is the argument to represent all GroupVersionKind types. +var GroupVersionKindAll = schema.GroupVersionKind{} + +// DisableDeepCopyByGVK associate a GroupVersionKind to disable DeepCopy during get or list from cache. +type DisableDeepCopyByGVK map[schema.GroupVersionKind]bool + +// IsDisabled returns whether a GroupVersionKind is disabled DeepCopy. +func (disableByGVK DisableDeepCopyByGVK) IsDisabled(gvk schema.GroupVersionKind) bool { + if d, ok := disableByGVK[gvk]; ok { + return d + } else if d, ok = disableByGVK[GroupVersionKindAll]; ok { + return d + } + return false +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/informers_map.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/informers_map.go index bef54d302e..413b048f0c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/informers_map.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/informers_map.go @@ -52,6 +52,7 @@ func newSpecificInformersMap(config *rest.Config, resync time.Duration, namespace string, selectors SelectorsByGVK, + disableDeepCopy DisableDeepCopyByGVK, createListWatcher createListWatcherFunc) *specificInformersMap { ip := &specificInformersMap{ config: config, @@ -65,6 +66,7 @@ func newSpecificInformersMap(config *rest.Config, createListWatcher: createListWatcher, namespace: namespace, selectors: selectors, + disableDeepCopy: disableDeepCopy, } return ip } @@ -129,6 +131,9 @@ type specificInformersMap struct { // selectors are the label or field selectors that will be added to the // ListWatch ListOptions. selectors SelectorsByGVK + + // disableDeepCopy indicates not to deep copy objects during get or list objects. + disableDeepCopy DisableDeepCopyByGVK } // Start calls Run on each of the informers and sets started to true. Blocks on the context. @@ -234,7 +239,12 @@ func (ip *specificInformersMap) addInformerToMap(gvk schema.GroupVersionKind, ob i := &MapEntry{ Informer: ni, - Reader: CacheReader{indexer: ni.GetIndexer(), groupVersionKind: gvk, scopeName: rm.Scope.Name()}, + Reader: CacheReader{ + indexer: ni.GetIndexer(), + groupVersionKind: gvk, + scopeName: rm.Scope.Name(), + disableDeepCopy: ip.disableDeepCopy.IsDisabled(gvk), + }, } ip.informersByGVK[gvk] = i @@ -274,8 +284,9 @@ func createStructuredListWatch(gvk schema.GroupVersionKind, ip *specificInformer ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) { ip.selectors[gvk].ApplyToList(&opts) res := listObj.DeepCopyObject() - isNamespaceScoped := ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot - err := client.Get().NamespaceIfScoped(ip.namespace, isNamespaceScoped).Resource(mapping.Resource.Resource).VersionedParams(&opts, ip.paramCodec).Do(ctx).Into(res) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + isNamespaceScoped := namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot + err := client.Get().NamespaceIfScoped(namespace, isNamespaceScoped).Resource(mapping.Resource.Resource).VersionedParams(&opts, ip.paramCodec).Do(ctx).Into(res) return res, err }, // Setup the watch function @@ -283,8 +294,9 @@ func createStructuredListWatch(gvk schema.GroupVersionKind, ip *specificInformer ip.selectors[gvk].ApplyToList(&opts) // Watch needs to be set to true separately opts.Watch = true - isNamespaceScoped := ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot - return client.Get().NamespaceIfScoped(ip.namespace, isNamespaceScoped).Resource(mapping.Resource.Resource).VersionedParams(&opts, ip.paramCodec).Watch(ctx) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + isNamespaceScoped := namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot + return client.Get().NamespaceIfScoped(namespace, isNamespaceScoped).Resource(mapping.Resource.Resource).VersionedParams(&opts, ip.paramCodec).Watch(ctx) }, }, nil } @@ -313,8 +325,9 @@ func createUnstructuredListWatch(gvk schema.GroupVersionKind, ip *specificInform return &cache.ListWatch{ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) { ip.selectors[gvk].ApplyToList(&opts) - if ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { - return dynamicClient.Resource(mapping.Resource).Namespace(ip.namespace).List(ctx, opts) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + if namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { + return dynamicClient.Resource(mapping.Resource).Namespace(namespace).List(ctx, opts) } return dynamicClient.Resource(mapping.Resource).List(ctx, opts) }, @@ -323,8 +336,9 @@ func createUnstructuredListWatch(gvk schema.GroupVersionKind, ip *specificInform ip.selectors[gvk].ApplyToList(&opts) // Watch needs to be set to true separately opts.Watch = true - if ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { - return dynamicClient.Resource(mapping.Resource).Namespace(ip.namespace).Watch(ctx, opts) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + if namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { + return dynamicClient.Resource(mapping.Resource).Namespace(namespace).Watch(ctx, opts) } return dynamicClient.Resource(mapping.Resource).Watch(ctx, opts) }, @@ -358,8 +372,9 @@ func createMetadataListWatch(gvk schema.GroupVersionKind, ip *specificInformersM return &cache.ListWatch{ ListFunc: func(opts metav1.ListOptions) (runtime.Object, error) { ip.selectors[gvk].ApplyToList(&opts) - if ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { - return client.Resource(mapping.Resource).Namespace(ip.namespace).List(ctx, opts) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + if namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { + return client.Resource(mapping.Resource).Namespace(namespace).List(ctx, opts) } return client.Resource(mapping.Resource).List(ctx, opts) }, @@ -368,8 +383,9 @@ func createMetadataListWatch(gvk schema.GroupVersionKind, ip *specificInformersM ip.selectors[gvk].ApplyToList(&opts) // Watch needs to be set to true separately opts.Watch = true - if ip.namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { - return client.Resource(mapping.Resource).Namespace(ip.namespace).Watch(ctx, opts) + namespace := restrictNamespaceBySelector(ip.namespace, ip.selectors[gvk]) + if namespace != "" && mapping.Scope.Name() != meta.RESTScopeNameRoot { + return client.Resource(mapping.Resource).Namespace(namespace).Watch(ctx, opts) } return client.Resource(mapping.Resource).Watch(ctx, opts) }, @@ -386,3 +402,23 @@ func resyncPeriod(resync time.Duration) func() time.Duration { return time.Duration(float64(resync.Nanoseconds()) * factor) } } + +// restrictNamespaceBySelector returns either a global restriction for all ListWatches +// if not default/empty, or the namespace that a ListWatch for the specific resource +// is restricted to, based on a specified field selector for metadata.namespace field. +func restrictNamespaceBySelector(namespaceOpt string, s Selector) string { + if namespaceOpt != "" { + // namespace is already restricted + return namespaceOpt + } + fieldSelector := s.Field + if fieldSelector == nil || fieldSelector.Empty() { + return "" + } + // check whether a selector includes the namespace field + value, found := fieldSelector.RequiresExactMatch("metadata.namespace") + if found { + return value + } + return "" +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go index 2611a20c64..e21eb22389 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil/apimachinery.go @@ -21,6 +21,7 @@ package apiutil import ( "fmt" + "reflect" "sync" "k8s.io/apimachinery/pkg/api/meta" @@ -163,9 +164,35 @@ func createRestConfig(gvk schema.GroupVersionKind, isUnstructured bool, baseConf // Use our own custom serializer. cfg.NegotiatedSerializer = serializerWithDecodedGVK{serializer.WithoutConversionCodecFactory{CodecFactory: codecs}} } else { - cfg.NegotiatedSerializer = serializer.WithoutConversionCodecFactory{CodecFactory: codecs} + cfg.NegotiatedSerializer = serializerWithTargetZeroingDecode{NegotiatedSerializer: serializer.WithoutConversionCodecFactory{CodecFactory: codecs}} } } return cfg } + +type serializerWithTargetZeroingDecode struct { + runtime.NegotiatedSerializer +} + +func (s serializerWithTargetZeroingDecode) DecoderToVersion(serializer runtime.Decoder, r runtime.GroupVersioner) runtime.Decoder { + return targetZeroingDecoder{upstream: s.NegotiatedSerializer.DecoderToVersion(serializer, r)} +} + +type targetZeroingDecoder struct { + upstream runtime.Decoder +} + +func (t targetZeroingDecoder) Decode(data []byte, defaults *schema.GroupVersionKind, into runtime.Object) (runtime.Object, *schema.GroupVersionKind, error) { + zero(into) + return t.upstream.Decode(data, defaults, into) +} + +// zero zeros the value of a pointer. +func zero(x interface{}) { + if x == nil { + return + } + res := reflect.ValueOf(x).Elem() + res.Set(reflect.Zero(res.Type())) +} diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go index ded8a60d33..f254523b7f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go @@ -419,6 +419,28 @@ func (c *fakeClient) Delete(ctx context.Context, obj client.Object, opts ...clie delOptions := client.DeleteOptions{} delOptions.ApplyOptions(opts) + // Check the ResourceVersion if that Precondition was specified. + if delOptions.Preconditions != nil && delOptions.Preconditions.ResourceVersion != nil { + name := accessor.GetName() + dbObj, err := c.tracker.Get(gvr, accessor.GetNamespace(), name) + if err != nil { + return err + } + oldAccessor, err := meta.Accessor(dbObj) + if err != nil { + return err + } + actualRV := oldAccessor.GetResourceVersion() + expectRV := *delOptions.Preconditions.ResourceVersion + if actualRV != expectRV { + msg := fmt.Sprintf( + "the ResourceVersion in the precondition (%s) does not match the ResourceVersion in record (%s). "+ + "The object might have been modified", + expectRV, actualRV) + return apierrors.NewConflict(gvr.GroupResource(), name, errors.New(msg)) + } + } + return c.deleteObject(gvr, accessor) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go index d73cc5135a..557598727c 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/namespaced_client.go @@ -18,14 +18,11 @@ package client import ( "context" - "errors" "fmt" "k8s.io/apimachinery/pkg/api/meta" - "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/apimachinery/pkg/runtime/schema" - "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" ) // NewNamespacedClient wraps an existing client enforcing the namespace value. @@ -55,49 +52,9 @@ func (n *namespacedClient) RESTMapper() meta.RESTMapper { return n.client.RESTMapper() } -// isNamespaced returns true if the object is namespace scoped. -// For unstructured objects the gvk is found from the object itself. -// TODO: this is repetitive code. Remove this and use ojectutil.IsNamespaced. -func isNamespaced(c Client, obj runtime.Object) (bool, error) { - var gvk schema.GroupVersionKind - var err error - - _, isUnstructured := obj.(*unstructured.Unstructured) - _, isUnstructuredList := obj.(*unstructured.UnstructuredList) - - isUnstructured = isUnstructured || isUnstructuredList - if isUnstructured { - gvk = obj.GetObjectKind().GroupVersionKind() - } else { - gvk, err = apiutil.GVKForObject(obj, c.Scheme()) - if err != nil { - return false, err - } - } - - gk := schema.GroupKind{ - Group: gvk.Group, - Kind: gvk.Kind, - } - restmapping, err := c.RESTMapper().RESTMapping(gk) - if err != nil { - return false, fmt.Errorf("failed to get restmapping: %w", err) - } - scope := restmapping.Scope.Name() - - if scope == "" { - return false, errors.New("scope cannot be identified, empty scope returned") - } - - if scope != meta.RESTScopeNameRoot { - return true, nil - } - return false, nil -} - // Create implements clinet.Client. func (n *namespacedClient) Create(ctx context.Context, obj Object, opts ...CreateOption) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -115,7 +72,7 @@ func (n *namespacedClient) Create(ctx context.Context, obj Object, opts ...Creat // Update implements client.Client. func (n *namespacedClient) Update(ctx context.Context, obj Object, opts ...UpdateOption) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -133,7 +90,7 @@ func (n *namespacedClient) Update(ctx context.Context, obj Object, opts ...Updat // Delete implements client.Client. func (n *namespacedClient) Delete(ctx context.Context, obj Object, opts ...DeleteOption) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -151,7 +108,7 @@ func (n *namespacedClient) Delete(ctx context.Context, obj Object, opts ...Delet // DeleteAllOf implements client.Client. func (n *namespacedClient) DeleteAllOf(ctx context.Context, obj Object, opts ...DeleteAllOfOption) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -164,7 +121,7 @@ func (n *namespacedClient) DeleteAllOf(ctx context.Context, obj Object, opts ... // Patch implements client.Client. func (n *namespacedClient) Patch(ctx context.Context, obj Object, patch Patch, opts ...PatchOption) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -182,7 +139,7 @@ func (n *namespacedClient) Patch(ctx context.Context, obj Object, patch Patch, o // Get implements client.Client. func (n *namespacedClient) Get(ctx context.Context, key ObjectKey, obj Object) error { - isNamespaceScoped, err := isNamespaced(n.client, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, n.Scheme(), n.RESTMapper()) if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -219,7 +176,8 @@ type namespacedClientStatusWriter struct { // Update implements client.StatusWriter. func (nsw *namespacedClientStatusWriter) Update(ctx context.Context, obj Object, opts ...UpdateOption) error { - isNamespaceScoped, err := isNamespaced(nsw.namespacedclient, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, nsw.namespacedclient.Scheme(), nsw.namespacedclient.RESTMapper()) + if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } @@ -237,7 +195,8 @@ func (nsw *namespacedClientStatusWriter) Update(ctx context.Context, obj Object, // Patch implements client.StatusWriter. func (nsw *namespacedClientStatusWriter) Patch(ctx context.Context, obj Object, patch Patch, opts ...PatchOption) error { - isNamespaceScoped, err := isNamespaced(nsw.namespacedclient, obj) + isNamespaceScoped, err := objectutil.IsAPINamespaced(obj, nsw.namespacedclient.Scheme(), nsw.namespacedclient.RESTMapper()) + if err != nil { return fmt.Errorf("error finding the scope of the object: %v", err) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controller.go b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controller.go index c9e07562a3..88ba786717 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controller.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controller.go @@ -52,6 +52,9 @@ type Options struct { // CacheSyncTimeout refers to the time limit set to wait for syncing caches. // Defaults to 2 minutes if not set. CacheSyncTimeout time.Duration + + // RecoverPanic indicates whether the panic caused by reconcile should be recovered. + RecoverPanic bool } // Controller implements a Kubernetes API. A Controller manages a work queue fed reconcile.Requests @@ -133,5 +136,6 @@ func NewUnmanaged(name string, mgr manager.Manager, options Options) (Controller SetFields: mgr.SetFields, Name: name, Log: options.Log.WithName("controller").WithName(name), + RecoverPanic: options.RecoverPanic, }, nil } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil/controllerutil.go b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil/controllerutil.go index 7863c3deec..13f14a7ed3 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil/controllerutil.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/controller/controllerutil/controllerutil.go @@ -207,7 +207,7 @@ func CreateOrUpdate(ctx context.Context, c client.Client, obj client.Object, f M return OperationResultCreated, nil } - existing := obj.DeepCopyObject() //nolint:ifshort + existing := obj.DeepCopyObject() //nolint if err := mutate(f, key, obj); err != nil { return OperationResultNone, err } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go index 224d300b89..87431a438f 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/controller/controller.go @@ -85,6 +85,9 @@ type Controller struct { // Log is used to log messages to users during reconciliation, or for example when a watch is started. Log logr.Logger + + // RecoverPanic indicates whether the panic caused by reconcile should be recovered. + RecoverPanic bool } // watchDescription contains all the information necessary to start a watch. @@ -95,7 +98,17 @@ type watchDescription struct { } // Reconcile implements reconcile.Reconciler. -func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) { +func (c *Controller) Reconcile(ctx context.Context, req reconcile.Request) (_ reconcile.Result, err error) { + if c.RecoverPanic { + defer func() { + if r := recover(); r != nil { + for _, fn := range utilruntime.PanicHandlers { + fn(r) + } + err = fmt.Errorf("panic: %v [recovered]", r) + } + }() + } log := c.Log.WithValues("name", req.Name, "namespace", req.Namespace) ctx = logf.IntoContext(ctx, log) return c.Do.Reconcile(ctx, req) @@ -295,7 +308,7 @@ func (c *Controller) reconcileHandler(ctx context.Context, obj interface{}) { // RunInformersAndControllers the syncHandler, passing it the Namespace/Name string of the // resource to be synced. - result, err := c.Do.Reconcile(ctx, req) + result, err := c.Reconcile(ctx, req) switch { case err != nil: c.Queue.AddRateLimited(req) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go index cb8b7b6d63..46cc1714bd 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/recorder/recorder.go @@ -24,8 +24,7 @@ import ( "github.com/go-logr/logr" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/runtime" - "k8s.io/client-go/kubernetes" - typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1" + corev1client "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/record" ) @@ -45,7 +44,7 @@ type Provider struct { scheme *runtime.Scheme // logger is the logger to use when logging diagnostic event info logger logr.Logger - evtClient typedcorev1.EventInterface + evtClient corev1client.EventInterface makeBroadcaster EventBroadcasterProducer broadcasterOnce sync.Once @@ -98,7 +97,7 @@ func (p *Provider) getBroadcaster() record.EventBroadcaster { p.broadcasterOnce.Do(func() { broadcaster, stop := p.makeBroadcaster() - broadcaster.StartRecordingToSink(&typedcorev1.EventSinkImpl{Interface: p.evtClient}) + broadcaster.StartRecordingToSink(&corev1client.EventSinkImpl{Interface: p.evtClient}) broadcaster.StartEventWatcher( func(e *corev1.Event) { p.logger.V(1).Info(e.Type, "object", e.InvolvedObject, "reason", e.Reason, "message", e.Message) @@ -112,12 +111,12 @@ func (p *Provider) getBroadcaster() record.EventBroadcaster { // NewProvider create a new Provider instance. func NewProvider(config *rest.Config, scheme *runtime.Scheme, logger logr.Logger, makeBroadcaster EventBroadcasterProducer) (*Provider, error) { - clientSet, err := kubernetes.NewForConfig(config) + corev1Client, err := corev1client.NewForConfig(config) if err != nil { - return nil, fmt.Errorf("failed to init clientSet: %w", err) + return nil, fmt.Errorf("failed to init client: %w", err) } - p := &Provider{scheme: scheme, logger: logger, makeBroadcaster: makeBroadcaster, evtClient: clientSet.CoreV1().Events("")} + p := &Provider{scheme: scheme, logger: logger, makeBroadcaster: makeBroadcaster, evtClient: corev1Client.Events("")} return p, nil } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/leaderelection/leader_election.go b/vendor/sigs.k8s.io/controller-runtime/pkg/leaderelection/leader_election.go index 55fd228690..3dedd462f3 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/leaderelection/leader_election.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/leaderelection/leader_election.go @@ -23,7 +23,8 @@ import ( "os" "k8s.io/apimachinery/pkg/util/uuid" - "k8s.io/client-go/kubernetes" + coordinationv1client "k8s.io/client-go/kubernetes/typed/coordination/v1" + corev1client "k8s.io/client-go/kubernetes/typed/core/v1" "k8s.io/client-go/rest" "k8s.io/client-go/tools/leaderelection/resourcelock" "sigs.k8s.io/controller-runtime/pkg/recorder" @@ -84,8 +85,14 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op } id = id + "_" + string(uuid.NewUUID()) - // Construct client for leader election - client, err := kubernetes.NewForConfig(rest.AddUserAgent(config, "leader-election")) + // Construct clients for leader election + rest.AddUserAgent(config, "leader-election") + corev1Client, err := corev1client.NewForConfig(config) + if err != nil { + return nil, err + } + + coordinationClient, err := coordinationv1client.NewForConfig(config) if err != nil { return nil, err } @@ -93,8 +100,8 @@ func NewResourceLock(config *rest.Config, recorderProvider recorder.Provider, op return resourcelock.New(options.LeaderElectionResourceLock, options.LeaderElectionNamespace, options.LeaderElectionID, - client.CoreV1(), - client.CoordinationV1(), + corev1Client, + coordinationClient, resourcelock.ResourceLockConfig{ Identity: id, EventRecorder: recorderProvider.GetEventRecorderFor(id), diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go b/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go index bbd9c9c756..9d73947dac 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/log/deleg.go @@ -76,7 +76,7 @@ func (p *loggerPromise) V(l *DelegatingLogger, level int) *loggerPromise { // Fulfill instantiates the Logger with the provided logger. func (p *loggerPromise) Fulfill(parentLogger logr.Logger) { - var logger = parentLogger + logger := logr.WithCallDepth(parentLogger, 1) if p.name != nil { logger = logger.WithName(*p.name) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/internal.go b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/internal.go index 5f85e10c90..7c25bd3c60 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/internal.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/internal.go @@ -47,7 +47,7 @@ import ( ) const ( - // Values taken from: https://github.com/kubernetes/apiserver/blob/master/pkg/apis/config/v1alpha1/defaults.go + // Values taken from: https://github.com/kubernetes/component-base/blob/master/config/v1alpha1/defaults.go defaultLeaseDuration = 15 * time.Second defaultRenewDeadline = 10 * time.Second defaultRetryPeriod = 2 * time.Second diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go index 903e3e47f9..2d2733f0a6 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/manager/manager.go @@ -37,9 +37,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/config" "sigs.k8s.io/controller-runtime/pkg/config/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/healthz" - logf "sigs.k8s.io/controller-runtime/pkg/internal/log" intrec "sigs.k8s.io/controller-runtime/pkg/internal/recorder" "sigs.k8s.io/controller-runtime/pkg/leaderelection" + "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/metrics" "sigs.k8s.io/controller-runtime/pkg/recorder" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" @@ -572,7 +572,7 @@ func setOptionsDefaults(options Options) Options { } if options.Logger == nil { - options.Logger = logf.RuntimeLog.WithName("manager") + options.Logger = log.Log } return options diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go b/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go index 90754269dd..d32ce25348 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/metrics/client_go_adapter.go @@ -52,7 +52,24 @@ const ( var ( // client metrics. - requestLatency = prometheus.NewHistogramVec(prometheus.HistogramOpts{ + + // RequestLatency reports the request latency in seconds per verb/URL. + // Deprecated: This metric is deprecated for removal in a future release: using the URL as a + // dimension results in cardinality explosion for some consumers. It was deprecated upstream + // in k8s v1.14 and hidden in v1.17 via https://github.com/kubernetes/kubernetes/pull/83836. + // It is not registered by default. To register: + // import ( + // clientmetrics "k8s.io/client-go/tools/metrics" + // clmetrics "sigs.k8s.io/controller-runtime/metrics" + // ) + // + // func init() { + // clmetrics.Registry.MustRegister(clmetrics.RequestLatency) + // clientmetrics.Register(clientmetrics.RegisterOpts{ + // RequestLatency: clmetrics.LatencyAdapter + // }) + // } + RequestLatency = prometheus.NewHistogramVec(prometheus.HistogramOpts{ Subsystem: RestClientSubsystem, Name: LatencyKey, Help: "Request latency in seconds. Broken down by verb and URL.", @@ -127,13 +144,11 @@ func init() { // registerClientMetrics sets up the client latency metrics from client-go. func registerClientMetrics() { // register the metrics with our registry - Registry.MustRegister(requestLatency) Registry.MustRegister(requestResult) // register the metrics with client-go clientmetrics.Register(clientmetrics.RegisterOpts{ - RequestLatency: &latencyAdapter{metric: requestLatency}, - RequestResult: &resultAdapter{metric: requestResult}, + RequestResult: &resultAdapter{metric: requestResult}, }) } @@ -159,11 +174,13 @@ func registerReflectorMetrics() { // copied (more-or-less directly) from k8s.io/kubernetes setup code // (which isn't anywhere in an easily-importable place). -type latencyAdapter struct { +// LatencyAdapter implements LatencyMetric. +type LatencyAdapter struct { metric *prometheus.HistogramVec } -func (l *latencyAdapter) Observe(_ context.Context, verb string, u url.URL, latency time.Duration) { +// Observe increments the request latency metric for the given verb/URL. +func (l *LatencyAdapter) Observe(_ context.Context, verb string, u url.URL, latency time.Duration) { l.metric.WithLabelValues(verb, u.String()).Observe(latency.Seconds()) } diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/conversion/conversion.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/conversion/conversion.go index af9e673ccb..a5b7a282ce 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/conversion/conversion.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/conversion/conversion.go @@ -26,7 +26,7 @@ import ( "fmt" "net/http" - apix "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" + apix "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go index 99b6ae9eb4..d2338d0b77 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/webhook/server.go @@ -28,10 +28,12 @@ import ( "path/filepath" "strconv" "sync" + "time" "k8s.io/apimachinery/pkg/runtime" kscheme "k8s.io/client-go/kubernetes/scheme" "sigs.k8s.io/controller-runtime/pkg/certwatcher" + "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/runtime/inject" "sigs.k8s.io/controller-runtime/pkg/webhook/internal/metrics" ) @@ -87,6 +89,10 @@ type Server struct { // defaultingOnce ensures that the default fields are only ever set once. defaultingOnce sync.Once + // started is set to true immediately before the server is started + // and thus can be used to check if the server has been started + started bool + // mu protects access to the webhook map & setFields for Start, Register, etc mu sync.Mutex } @@ -272,6 +278,9 @@ func (s *Server) Start(ctx context.Context) error { close(idleConnsClosed) }() + s.mu.Lock() + s.started = true + s.mu.Unlock() if err := srv.Serve(listener); err != nil && err != http.ErrServerClosed { return err } @@ -280,6 +289,34 @@ func (s *Server) Start(ctx context.Context) error { return nil } +// StartedChecker returns an healthz.Checker which is healthy after the +// server has been started. +func (s *Server) StartedChecker() healthz.Checker { + config := &tls.Config{ + InsecureSkipVerify: true, // nolint:gosec // config is used to connect to our own webhook port. + } + return func(req *http.Request) error { + s.mu.Lock() + defer s.mu.Unlock() + + if !s.started { + return fmt.Errorf("webhook server has not been started yet") + } + + d := &net.Dialer{Timeout: 10 * time.Second} + conn, err := tls.DialWithDialer(d, "tcp", net.JoinHostPort(s.Host, strconv.Itoa(s.Port)), config) + if err != nil { + return fmt.Errorf("webhook server is not reachable: %v", err) + } + + if err := conn.Close(); err != nil { + return fmt.Errorf("webhook server is not reachable: closing connection: %v", err) + } + + return nil + } +} + // InjectFunc injects the field setter into the server. func (s *Server) InjectFunc(f inject.Func) error { s.setFields = f diff --git a/vendor/sigs.k8s.io/controller-tools/pkg/loader/loader.go b/vendor/sigs.k8s.io/controller-tools/pkg/loader/loader.go index cb34baf234..35c2713357 100644 --- a/vendor/sigs.k8s.io/controller-tools/pkg/loader/loader.go +++ b/vendor/sigs.k8s.io/controller-tools/pkg/loader/loader.go @@ -249,7 +249,7 @@ func (l *loader) typeCheck(pkg *Package) { // it's possible to have a call to check in parallel to a call to this // if one package in the package graph gets its dependency filtered out, - // but another doesn't (so one wants a "dummy" package here, and another + // but another doesn't (so one wants a "placeholder" package here, and another // wants the full check). // // Thus, we need to lock here (at least for the time being) to avoid From 795a24e703dd6bd613c1f8f6cfc32de18a60c006 Mon Sep 17 00:00:00 2001 From: Ankita Thomas Date: Thu, 9 Sep 2021 17:02:35 -0400 Subject: [PATCH 38/45] chore: update manifests --- manifests/0000_50_olm_00-catalogsources.crd.yaml | 2 +- manifests/0000_50_olm_00-clusterserviceversions.crd.yaml | 2 +- manifests/0000_50_olm_00-installplans.crd.yaml | 2 +- manifests/0000_50_olm_00-operatorconditions.crd.yaml | 2 +- manifests/0000_50_olm_00-operatorgroups.crd.yaml | 2 +- manifests/0000_50_olm_00-operators.crd.yaml | 2 +- manifests/0000_50_olm_00-subscriptions.crd.yaml | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifests/0000_50_olm_00-catalogsources.crd.yaml b/manifests/0000_50_olm_00-catalogsources.crd.yaml index 588c39e908..10f0d5106e 100644 --- a/manifests/0000_50_olm_00-catalogsources.crd.yaml +++ b/manifests/0000_50_olm_00-catalogsources.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml index 0ee2f89d5c..e00c809741 100644 --- a/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml +++ b/manifests/0000_50_olm_00-clusterserviceversions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-installplans.crd.yaml b/manifests/0000_50_olm_00-installplans.crd.yaml index 72b3fa5f9c..caca9039dd 100644 --- a/manifests/0000_50_olm_00-installplans.crd.yaml +++ b/manifests/0000_50_olm_00-installplans.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-operatorconditions.crd.yaml b/manifests/0000_50_olm_00-operatorconditions.crd.yaml index 3abef967a6..5a494000ac 100644 --- a/manifests/0000_50_olm_00-operatorconditions.crd.yaml +++ b/manifests/0000_50_olm_00-operatorconditions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-operatorgroups.crd.yaml b/manifests/0000_50_olm_00-operatorgroups.crd.yaml index 14e09284aa..0a1c2d1090 100644 --- a/manifests/0000_50_olm_00-operatorgroups.crd.yaml +++ b/manifests/0000_50_olm_00-operatorgroups.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-operators.crd.yaml b/manifests/0000_50_olm_00-operators.crd.yaml index b33ab1a9ee..05a7736e18 100644 --- a/manifests/0000_50_olm_00-operators.crd.yaml +++ b/manifests/0000_50_olm_00-operators.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" diff --git a/manifests/0000_50_olm_00-subscriptions.crd.yaml b/manifests/0000_50_olm_00-subscriptions.crd.yaml index d619bbfbef..201fa91f60 100644 --- a/manifests/0000_50_olm_00-subscriptions.crd.yaml +++ b/manifests/0000_50_olm_00-subscriptions.crd.yaml @@ -2,7 +2,7 @@ apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: - controller-gen.kubebuilder.io/version: v0.6.1 + controller-gen.kubebuilder.io/version: v0.6.2 include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" From d228595e06c9cdcee65bccfbd5011285f481fe3f Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Wed, 8 Sep 2021 13:15:22 -0400 Subject: [PATCH 39/45] .github/workflows: Separate out the e2e jobs into workflows (#2158) * .github/workflows: Separate out the e2e jobs into workflows Update the .github/workflows/test-scripts.yml GH action workflow and move all the jobs listed there into separate workflows. This allows us to retest a single workflow at a time as a workaround to GH not allowing you to retest individual jobs in a workflow. Signed-off-by: timflannagan * .github/workflows: Add the 'ci' workflow name to all e2e-related jobs Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 966ce43d5bde93848c45e1aaf4c6a5c110c37740 --- .../.github/workflows/build.yml | 19 +++++++ .../.github/workflows/e2e-kind.yml | 28 +++++++++++ .../.github/workflows/e2e-minikube.yml | 27 ++++++++++ .../.github/workflows/e2e-tests.yml | 4 +- .../.github/workflows/test-scripts.yml | 49 ------------------- .../.github/workflows/unit.yml | 2 +- .../.github/workflows/verify.yml | 2 +- 7 files changed, 78 insertions(+), 53 deletions(-) create mode 100644 staging/operator-lifecycle-manager/.github/workflows/build.yml create mode 100644 staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml create mode 100644 staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml delete mode 100644 staging/operator-lifecycle-manager/.github/workflows/test-scripts.yml diff --git a/staging/operator-lifecycle-manager/.github/workflows/build.yml b/staging/operator-lifecycle-manager/.github/workflows/build.yml new file mode 100644 index 0000000000..e8c024b187 --- /dev/null +++ b/staging/operator-lifecycle-manager/.github/workflows/build.yml @@ -0,0 +1,19 @@ +name: ci +on: + pull_request: + paths: + - '**' + - '!doc/contributors/**' + - '!doc/design/**' +jobs: + image: + runs-on: ubuntu-latest + steps: + - name: Check out the repo + uses: actions/checkout@v2 + - name: Build the container image + uses: docker/build-push-action@v1 + with: + repository: operator-framework/olm + dockerfile: ./Dockerfile + push: false diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml new file mode 100644 index 0000000000..a38cf6d188 --- /dev/null +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml @@ -0,0 +1,28 @@ +name: ci +on: + pull_request: + paths: + - '**' + - '!doc/contributors/**' + - '!doc/design/**' + schedule: + - cron: '0 0 * * *' # daily to pick up releases +jobs: + e2e-kind: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: '~1.16' + - name: Install kind + run: | + curl -sLo kind "$(curl -sL https://api.github.com/repos/kubernetes-sigs/kind/releases/latest | jq -r '[.assets[] | select(.name == "kind-linux-amd64")] | first | .browser_download_url')" + chmod +x kind + sudo mv kind /bin/ + - name: Create kind cluster + run: | + kind create cluster + kind export kubeconfig + - name: Run e2e tests + run: make run-local diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml new file mode 100644 index 0000000000..db344264c3 --- /dev/null +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml @@ -0,0 +1,27 @@ +name: ci +on: + pull_request: + paths: + - '**' + - '!doc/contributors/**' + - '!doc/design/**' + schedule: + - cron: '0 0 * * *' # daily to pick up releases +jobs: + e2e-minikube: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: '~1.16' + - name: Install minikube + run: | + sudo apt-get install conntrack + curl -sLo minikube "$(curl -sL https://api.github.com/repos/kubernetes/minikube/releases/latest | jq -r '[.assets[] | select(.name == "minikube-linux-amd64")] | first | .browser_download_url')" + chmod +x minikube + sudo mv minikube /bin/ + - name: Setup minikube + run: minikube config set vm-driver docker + - name: Run e2e tests + run: make run-local diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml index 18b857ae66..da7af5b751 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml @@ -1,4 +1,4 @@ -name: e2e-tests +name: ci on: push: branches: @@ -8,7 +8,7 @@ on: - '**' - '!doc/**' jobs: - run-e2e-tests: + e2e-tests: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 diff --git a/staging/operator-lifecycle-manager/.github/workflows/test-scripts.yml b/staging/operator-lifecycle-manager/.github/workflows/test-scripts.yml deleted file mode 100644 index 1c18d7a9c9..0000000000 --- a/staging/operator-lifecycle-manager/.github/workflows/test-scripts.yml +++ /dev/null @@ -1,49 +0,0 @@ -name: upstream-tests -on: - pull_request: - paths: - - '**' - - '!doc/contributors/**' - - '!doc/design/**' - schedule: - - cron: '0 0 * * *' # daily to pick up releases -jobs: - image-build: - runs-on: ubuntu-latest - steps: - - name: Check out the repo - uses: actions/checkout@v2 - - name: Build the container image - uses: docker/build-push-action@v1 - with: - repository: operator-framework/olm - dockerfile: ./Dockerfile - push: false - run-local-minikube: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 - with: - go-version: '~1.16' - - run: | - sudo apt-get install conntrack - curl -sLo minikube "$(curl -sL https://api.github.com/repos/kubernetes/minikube/releases/latest | jq -r '[.assets[] | select(.name == "minikube-linux-amd64")] | first | .browser_download_url')" - chmod +x minikube - sudo mv minikube /bin/ - minikube config set vm-driver docker - make run-local - run-local-kind: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-go@v2 - with: - go-version: '~1.16' - - run: | - curl -sLo kind "$(curl -sL https://api.github.com/repos/kubernetes-sigs/kind/releases/latest | jq -r '[.assets[] | select(.name == "kind-linux-amd64")] | first | .browser_download_url')" - chmod +x kind - sudo mv kind /bin/ - kind create cluster - kind export kubeconfig - make run-local diff --git a/staging/operator-lifecycle-manager/.github/workflows/unit.yml b/staging/operator-lifecycle-manager/.github/workflows/unit.yml index ff854dee6d..31c84356b1 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/unit.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/unit.yml @@ -1,4 +1,4 @@ -name: unit +name: ci on: push: branches: diff --git a/staging/operator-lifecycle-manager/.github/workflows/verify.yml b/staging/operator-lifecycle-manager/.github/workflows/verify.yml index c2351b4622..eb3550ac5b 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/verify.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/verify.yml @@ -1,4 +1,4 @@ -name: verify +name: ci on: push: branches: From 985a0aeed0bc2b711ecfb3ac4e5c40f389b92795 Mon Sep 17 00:00:00 2001 From: Nick Hale Date: Wed, 8 Sep 2021 16:12:23 -0400 Subject: [PATCH 40/45] doc(readme): add chat badge (#2345) Add a badge that links to the olm-dev channel in the Kubernetes Slack instance. Signed-off-by: Nick Hale Upstream-repository: operator-lifecycle-manager Upstream-commit: 94af95a7580f45f6a0b45bd12d5aa37649b74a47 --- staging/operator-lifecycle-manager/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/staging/operator-lifecycle-manager/README.md b/staging/operator-lifecycle-manager/README.md index 12c246d81f..dbd8dc9134 100644 --- a/staging/operator-lifecycle-manager/README.md +++ b/staging/operator-lifecycle-manager/README.md @@ -3,6 +3,7 @@ [![Container Repository on Quay.io](https://quay.io/repository/operator-framework/olm/status "Container Repository on Quay.io")](https://quay.io/repository/operator-framework/olm) [![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) [![Go Report Card](https://goreportcard.com/badge/github.com/operator-framework/operator-lifecycle-manager)](https://goreportcard.com/report/github.com/operator-framework/operator-lifecycle-manager) +[![Slack Channel](https://img.shields.io/badge/chat-4A154B?logo=slack&logoColor=white "Slack Channel")](https://kubernetes.slack.com/archives/C0181L6JYQ2) ## Documentation @@ -191,4 +192,4 @@ Operator Lifecycle Manager is under Apache 2.0 license. See the [LICENSE][licens [operator-framework-meetings]: https://github.com/operator-framework/community#meetings [contributor-documentation]: https://olm.operatorframework.io/docs/contribution-guidelines/ [olm-getting-started]: https://olm.operatorframework.io/docs/getting-started/ -[installation-guide]: doc/install/install.md \ No newline at end of file +[installation-guide]: doc/install/install.md From a93f2eaca15f6166372c17e3436c1d0e4de142b8 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Wed, 8 Sep 2021 17:34:26 -0400 Subject: [PATCH 41/45] Bump OLM_VERSION to 0.19.0 (#2348) Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 864b58ddc63742b53ecdf21f463e13ac2ce9de7e --- staging/operator-lifecycle-manager/OLM_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staging/operator-lifecycle-manager/OLM_VERSION b/staging/operator-lifecycle-manager/OLM_VERSION index 267d7e011f..1cf0537c34 100644 --- a/staging/operator-lifecycle-manager/OLM_VERSION +++ b/staging/operator-lifecycle-manager/OLM_VERSION @@ -1 +1 @@ -0.18.3 +0.19.0 From f8e2688d3631f1b4ada4b892c14d6431fb93ffb9 Mon Sep 17 00:00:00 2001 From: Ankita Thomas Date: Thu, 9 Sep 2021 17:16:52 -0400 Subject: [PATCH 42/45] chore: update manifests --- pkg/manifests/csv.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/manifests/csv.yaml b/pkg/manifests/csv.yaml index 737a295527..368b6dfcc7 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.18.3 + olm.version: 0.19.0 olm.clusteroperator.name: operator-lifecycle-manager-packageserver annotations: include.release.openshift.io/single-node-developer: "true" @@ -152,7 +152,7 @@ spec: - packageserver topologyKey: "kubernetes.io/hostname" maturity: alpha - version: 0.18.3 + version: 0.19.0 apiservicedefinitions: owned: - group: packages.operators.coreos.com From d529fcf049114dc3a56d2d2a0438233d876eea37 Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Wed, 8 Sep 2021 15:45:26 -0700 Subject: [PATCH 43/45] fix(release): upgrade goreleaser so script requests correct checksum file (#773) Signed-off-by: Eric Stroczynski Upstream-repository: operator-registry Upstream-commit: 1c8557637731bbe28166d854ea8a16fd86c2995e --- staging/operator-registry/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/staging/operator-registry/Makefile b/staging/operator-registry/Makefile index 74aa69f4a9..09780e55f2 100644 --- a/staging/operator-registry/Makefile +++ b/staging/operator-registry/Makefile @@ -136,7 +136,7 @@ export LATEST_IMAGE_OR_EMPTY ?= $(shell \ && echo "$(OPM_IMAGE_REPO):latest" || echo "") release: RELEASE_ARGS ?= release --rm-dist --snapshot release: - ./scripts/fetch goreleaser 0.173.2 && ./bin/goreleaser $(RELEASE_ARGS) + ./scripts/fetch goreleaser 0.177.0 && ./bin/goreleaser $(RELEASE_ARGS) # tagged-or-empty returns $(OPM_IMAGE_REPO):$(1) when HEAD is assigned a non-prerelease semver tag, # otherwise the empty string. An empty string causes goreleaser to skip building From b5332db24deaf91528c110cc41cf9a9c52f57147 Mon Sep 17 00:00:00 2001 From: Tim Flannagan Date: Wed, 8 Sep 2021 19:53:24 -0400 Subject: [PATCH 44/45] .github/workflows: Don't run CI checks for markdown-only updates (#2347) * .github/workflows: Don't run CI checks for markdown-only updates Update the ci-prefixed workflows and ensure that CI isn't running when only markdown files are updated. Signed-off-by: timflannagan * .github/workflows: Use paths-ignore instead of paths for ignoring certain files/paths Signed-off-by: timflannagan * .github/workflows: Remove the need to ignore the root doc/ path The '**/*.md' filter pattern [1] should ignore _all_ markdown extension files anywhere in the repository. [1] https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#patterns-to-match-file-paths Signed-off-by: timflannagan Upstream-repository: operator-lifecycle-manager Upstream-commit: 2fd014019ca8cc86ae859da797e814b72c299257 --- .../operator-lifecycle-manager/.github/workflows/build.yml | 6 ++---- .../.github/workflows/e2e-kind.yml | 6 ++---- .../.github/workflows/e2e-minikube.yml | 6 ++---- .../.github/workflows/e2e-tests.yml | 5 ++--- .../operator-lifecycle-manager/.github/workflows/unit.yml | 5 ++--- .../operator-lifecycle-manager/.github/workflows/verify.yml | 5 ++--- 6 files changed, 12 insertions(+), 21 deletions(-) diff --git a/staging/operator-lifecycle-manager/.github/workflows/build.yml b/staging/operator-lifecycle-manager/.github/workflows/build.yml index e8c024b187..68b4775e9f 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/build.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/build.yml @@ -1,10 +1,8 @@ name: ci on: pull_request: - paths: - - '**' - - '!doc/contributors/**' - - '!doc/design/**' + paths-ignore: + - '**/*.md' jobs: image: runs-on: ubuntu-latest diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml index a38cf6d188..8a573b89ed 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-kind.yml @@ -1,10 +1,8 @@ name: ci on: pull_request: - paths: - - '**' - - '!doc/contributors/**' - - '!doc/design/**' + paths-ignore: + - '**/*.md' schedule: - cron: '0 0 * * *' # daily to pick up releases jobs: diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml index db344264c3..3b3d0f40c4 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-minikube.yml @@ -1,10 +1,8 @@ name: ci on: pull_request: - paths: - - '**' - - '!doc/contributors/**' - - '!doc/design/**' + paths-ignore: + - '**/*.md' schedule: - cron: '0 0 * * *' # daily to pick up releases jobs: diff --git a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml index da7af5b751..42fe6ef038 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/e2e-tests.yml @@ -4,9 +4,8 @@ on: branches: - master pull_request: - paths: - - '**' - - '!doc/**' + paths-ignore: + - '**/*.md' jobs: e2e-tests: runs-on: ubuntu-latest diff --git a/staging/operator-lifecycle-manager/.github/workflows/unit.yml b/staging/operator-lifecycle-manager/.github/workflows/unit.yml index 31c84356b1..c277788a24 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/unit.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/unit.yml @@ -4,9 +4,8 @@ on: branches: - master pull_request: - paths: - - '**' - - '!doc/**' + paths-ignore: + - '**/*.md' jobs: unit: runs-on: ubuntu-latest diff --git a/staging/operator-lifecycle-manager/.github/workflows/verify.yml b/staging/operator-lifecycle-manager/.github/workflows/verify.yml index eb3550ac5b..0fa15aef4c 100644 --- a/staging/operator-lifecycle-manager/.github/workflows/verify.yml +++ b/staging/operator-lifecycle-manager/.github/workflows/verify.yml @@ -4,9 +4,8 @@ on: branches: - master pull_request: - paths: - - '**' - - '!doc/**' + paths-ignore: + - '**/*.md' jobs: verify: runs-on: ubuntu-latest From d234fc0246eb999e43ae15cce9fc975bbfa3083d Mon Sep 17 00:00:00 2001 From: Eric Stroczynski Date: Thu, 9 Sep 2021 12:18:12 -0700 Subject: [PATCH 45/45] feat(opm): fine-grained dependency selection in diffs (#756) Signed-off-by: Eric Stroczynski Upstream-repository: operator-registry Upstream-commit: a3253eb2fa97be52883af0a0c195d4a95500c04a --- .../index-declcfgs/exp-headsonly/index.yaml | 1 + .../testdata/index-declcfgs/latest/index.yaml | 1 + .../testdata/index-declcfgs/old/index.yaml | 1 + .../operator-registry/alpha/declcfg/diff.go | 94 ++++++--- .../alpha/declcfg/diff_include.go | 87 ++++++++ .../alpha/declcfg/diff_include_test.go | 183 +++++++++++++++++ .../alpha/declcfg/diff_test.go | 185 ++++++++++++++++++ .../index-declcfgs/exp-headsonly/index.yaml | 1 + .../testdata/index-declcfgs/latest/index.yaml | 1 + .../testdata/index-declcfgs/old/index.yaml | 1 + .../operator-registry/alpha/declcfg/diff.go | 94 ++++++--- .../alpha/declcfg/diff_include.go | 87 ++++++++ 12 files changed, 692 insertions(+), 44 deletions(-) create mode 100644 staging/operator-registry/alpha/declcfg/diff_include.go create mode 100644 staging/operator-registry/alpha/declcfg/diff_include_test.go create mode 100644 vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff_include.go diff --git a/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml index f3b349d646..6aef07f88e 100644 --- a/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml +++ b/staging/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml @@ -9,6 +9,7 @@ schema: olm.channel entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skips: - bar.v0.1.0 - name: bar.v1.0.0 diff --git a/staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml index 7ef42c6a9b..4b06fbacf6 100644 --- a/staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml +++ b/staging/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml @@ -9,6 +9,7 @@ schema: olm.channel entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skipRange: <0.2.0 skips: - bar.v0.1.0 diff --git a/staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml b/staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml index 4e77597bcb..f3cc41dfd4 100644 --- a/staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml +++ b/staging/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml @@ -9,6 +9,7 @@ name: alpha entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skipRange: <0.2.0 skips: - bar.v0.1.0 diff --git a/staging/operator-registry/alpha/declcfg/diff.go b/staging/operator-registry/alpha/declcfg/diff.go index 37cf72b052..c4f78d660f 100644 --- a/staging/operator-registry/alpha/declcfg/diff.go +++ b/staging/operator-registry/alpha/declcfg/diff.go @@ -1,6 +1,7 @@ package declcfg import ( + "fmt" "reflect" "sort" "sync" @@ -167,7 +168,7 @@ func bundlesEqual(b1, b2 *model.Bundle) (bool, error) { func addAllDependencies(newModel, oldModel, outputModel model.Model) error { // Get every oldModel's bundle's dependencies, and their dependencies, etc. by BFS. - allProvidingBundles := []*model.Bundle{} + providingBundlesByPackage := map[string][]*model.Bundle{} for curr := getBundles(outputModel); len(curr) != 0; { reqGVKs, reqPkgs, err := findDependencies(curr) if err != nil { @@ -183,36 +184,85 @@ func addAllDependencies(newModel, oldModel, outputModel model.Model) error { for _, pkg := range newModel { providingBundles := getBundlesThatProvide(pkg, reqGVKs, reqPkgs) curr = append(curr, providingBundles...) - allProvidingBundles = append(allProvidingBundles, providingBundles...) + + oldPkg, oldHasPkg := oldModel[pkg.Name] + for _, b := range providingBundles { + // If the bundle is not in oldModel, add it to the set. + // outputModel is checked below. + add := true + if oldHasPkg { + if oldCh, oldHasCh := oldPkg.Channels[b.Channel.Name]; oldHasCh { + _, oldHasBundle := oldCh.Bundles[b.Name] + add = !oldHasBundle + } + } + if add { + providingBundlesByPackage[b.Package.Name] = append(providingBundlesByPackage[b.Package.Name], b) + } + } } } // Add the diff between an oldModel dependency package and its new counterpart // or the entire package if oldModel does not have it. - // - // TODO(estroz): add bundles then fill in dependency upgrade graph - // by selecting latest versions, as the EP specifies. - dependencyPkgs := map[string]*model.Package{} - for _, b := range allProvidingBundles { - if _, copied := dependencyPkgs[b.Package.Name]; !copied { - dependencyPkgs[b.Package.Name] = copyPackage(b.Package) - } - } - for _, newDepPkg := range dependencyPkgs { - // newDepPkg is a copy of a newModel pkg, so running diffPackages - // on it and oldPkg, which may have some but not all bundles, - // will produce a set of all bundles that outputModel doesn't have. - // Otherwise, just add the whole package. - if oldPkg, oldHasPkg := oldModel[newDepPkg.Name]; oldHasPkg { - if err := diffPackages(oldPkg, newDepPkg); err != nil { + for pkgName, bundles := range providingBundlesByPackage { + newPkg := newModel[pkgName] + heads := make(map[string]*model.Bundle, len(newPkg.Channels)) + for _, ch := range newPkg.Channels { + var err error + if heads[ch.Name], err = ch.Head(); err != nil { return err } - if len(newDepPkg.Channels) == 0 { - // Skip empty packages. - continue + } + + // Sort by version then channel so bundles lower in the full graph are more likely + // to be included in previous loops. + sort.Slice(bundles, func(i, j int) bool { + if bundles[i].Channel.Name == bundles[j].Channel.Name { + return bundles[i].Version.LT(bundles[j].Version) + } + return bundles[i].Channel.Name < bundles[j].Channel.Name + }) + + for _, b := range bundles { + newCh := b.Channel + + // Continue if b was added in a previous loop iteration. + // Otherwise create a new package/channel for b if they do not exist. + var ( + outputPkg *model.Package + outputCh *model.Channel + + outHasPkg, outHasCh bool + ) + if outputPkg, outHasPkg = outputModel[b.Package.Name]; outHasPkg { + if outputCh, outHasCh = outputPkg.Channels[b.Channel.Name]; outHasCh { + if _, outputHasBundle := outputCh.Bundles[b.Name]; outputHasBundle { + continue + } + } + } else { + outputPkg = copyPackageNoChannels(newPkg) + outputModel[outputPkg.Name] = outputPkg + } + if !outHasCh { + outputCh = copyChannelNoBundles(newCh, outputPkg) + outputPkg.Channels[outputCh.Name] = outputCh + } + + head := heads[newCh.Name] + graph := makeUpgradeGraph(newCh) + intersectingBundles, intersectionFound := findIntersectingBundles(newCh, b, head, graph) + if !intersectionFound { + // This should never happen, since b and head are from the same model. + return fmt.Errorf("channel %s: head %q not reachable from bundle %q", newCh.Name, head.Name, b.Name) + } + for _, ib := range intersectingBundles { + if _, outHasBundle := outputCh.Bundles[ib.Name]; !outHasBundle { + outputCh.Bundles[ib.Name] = copyBundle(ib, outputCh, outputPkg) + } } } - outputModel[newDepPkg.Name] = newDepPkg } return nil diff --git a/staging/operator-registry/alpha/declcfg/diff_include.go b/staging/operator-registry/alpha/declcfg/diff_include.go new file mode 100644 index 0000000000..14a4d5c890 --- /dev/null +++ b/staging/operator-registry/alpha/declcfg/diff_include.go @@ -0,0 +1,87 @@ +package declcfg + +import ( + "github.com/operator-framework/operator-registry/alpha/model" +) + +// makeUpgradeGraph creates a DAG of bundles with map key Bundle.Replaces. +func makeUpgradeGraph(ch *model.Channel) map[string][]*model.Bundle { + graph := map[string][]*model.Bundle{} + for _, b := range ch.Bundles { + b := b + if b.Replaces != "" { + graph[b.Replaces] = append(graph[b.Replaces], b) + } + } + return graph +} + +// findIntersectingBundles finds the intersecting bundle of start and end in the +// replaces upgrade graph graph by traversing down to the lowest graph node, +// then returns every bundle higher than the intersection. It is possible +// to find no intersection; this should only happen when start and end +// are not part of the same upgrade graph. +// Output bundle order is not guaranteed. +// Precondition: start must be a bundle in ch. +// Precondition: end must be ch's head. +func findIntersectingBundles(ch *model.Channel, start, end *model.Bundle, graph map[string][]*model.Bundle) ([]*model.Bundle, bool) { + // The intersecting set is equal to end if start is end. + if start.Name == end.Name { + return []*model.Bundle{end}, true + } + + // Construct start's replaces chain for comparison against end's. + startChain := map[string]*model.Bundle{start.Name: nil} + for curr := start; curr != nil && curr.Replaces != ""; curr = ch.Bundles[curr.Replaces] { + startChain[curr.Replaces] = curr + } + + // Trace end's replaces chain until it intersects with start's, or the root is reached. + var intersection string + if _, inChain := startChain[end.Name]; inChain { + intersection = end.Name + } else { + for curr := end; curr != nil && curr.Replaces != ""; curr = ch.Bundles[curr.Replaces] { + if _, inChain := startChain[curr.Replaces]; inChain { + intersection = curr.Replaces + break + } + } + } + + // No intersection is found, delegate behavior to caller. + if intersection == "" { + return nil, false + } + + // Find all bundles that replace the intersection via BFS, + // i.e. the set of bundles that fill the update graph between start and end. + replacesIntersection := graph[intersection] + replacesSet := map[string]*model.Bundle{} + for _, b := range replacesIntersection { + currName := "" + for next := []*model.Bundle{b}; len(next) > 0; next = next[1:] { + currName = next[0].Name + if _, hasReplaces := replacesSet[currName]; !hasReplaces { + replacers := graph[currName] + next = append(next, replacers...) + replacesSet[currName] = ch.Bundles[currName] + } + } + } + + // Remove every bundle between start and intersection exclusively, + // since these bundles must already exist in the destination channel. + for rep := start; rep != nil && rep.Name != intersection; rep = ch.Bundles[rep.Replaces] { + delete(replacesSet, rep.Name) + } + + // Ensure both start and end are added to the output. + replacesSet[start.Name] = start + replacesSet[end.Name] = end + var intersectingBundles []*model.Bundle + for _, b := range replacesSet { + intersectingBundles = append(intersectingBundles, b) + } + return intersectingBundles, true +} diff --git a/staging/operator-registry/alpha/declcfg/diff_include_test.go b/staging/operator-registry/alpha/declcfg/diff_include_test.go new file mode 100644 index 0000000000..2a5467b0b0 --- /dev/null +++ b/staging/operator-registry/alpha/declcfg/diff_include_test.go @@ -0,0 +1,183 @@ +package declcfg + +import ( + "fmt" + "sort" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/operator-framework/operator-registry/alpha/model" + "github.com/operator-framework/operator-registry/alpha/property" +) + +func TestFindIntersectingBundles(t *testing.T) { + type bundleSpec struct { + name, replaces string + skips []string + } + + inputBundles1 := []bundleSpec{ + {"foo.v0.1.0", "", nil}, + {"foo.v0.1.1", "foo.v0.1.0", nil}, + {"foo.v0.2.0", "foo.v0.1.1", nil}, + {"foo.v0.3.0", "foo.v0.2.0", nil}, + {"foo.v1.0.0", "foo.v0.1.0", []string{"foo.v0.1.1", "foo.v0.2.0", "foo.v0.3.0"}}, + {"foo.v1.1.0", "foo.v1.0.0", nil}, + {"foo.v2.0.0", "foo.v0.1.0", []string{"foo.v0.1.1", "foo.v0.2.0", "foo.v0.3.0", "foo.v1.0.0", "foo.v1.1.0"}}, + {"foo.v2.1.0", "foo.v2.0.0", nil}, + {"foo.v3.0.0", "foo.v1.1.0", []string{"foo.v2.0.0", "foo.v2.1.0"}}, + } + + type spec struct { + name string + pkgName string + channelName string + inputBundles []bundleSpec + start, end bundleSpec + headName string + assertion require.BoolAssertionFunc + expIntersecting []bundleSpec + } + + specs := []spec{ + { + name: "Success/StartEndEqual", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.2.0", "foo.v0.1.1", nil}, + end: bundleSpec{"foo.v0.2.0", "foo.v0.1.1", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: []bundleSpec{{"foo.v0.2.0", "foo.v0.1.1", nil}}, + }, + { + name: "Success/FullGraph", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.1.0", "", nil}, + end: bundleSpec{"foo.v3.0.0", "foo.v1.1.0", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: inputBundles1, + }, + { + name: "Success/SubGraph1", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.2.0", "foo.v0.1.1", nil}, + end: bundleSpec{"foo.v3.0.0", "foo.v1.1.0", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: []bundleSpec{ + {"foo.v0.2.0", "foo.v0.1.1", nil}, + {"foo.v0.3.0", "foo.v0.2.0", nil}, + {"foo.v1.0.0", "foo.v0.1.0", []string{"foo.v0.1.1", "foo.v0.2.0", "foo.v0.3.0"}}, + {"foo.v1.1.0", "foo.v1.0.0", nil}, + {"foo.v2.0.0", "foo.v0.1.0", []string{"foo.v0.1.1", "foo.v0.2.0", "foo.v0.3.0", "foo.v1.0.0", "foo.v1.1.0"}}, + {"foo.v2.1.0", "foo.v2.0.0", nil}, + {"foo.v3.0.0", "foo.v1.1.0", []string{"foo.v2.0.0", "foo.v2.1.0"}}, + }, + }, + { + name: "Success/SubGraph2", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.1.1", "foo.v0.1.0", nil}, + end: bundleSpec{"foo.v0.3.0", "foo.v0.2.0", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: []bundleSpec{ + {"foo.v0.1.1", "foo.v0.1.0", nil}, + {"foo.v0.2.0", "foo.v0.1.1", nil}, + {"foo.v0.3.0", "foo.v0.2.0", nil}, + }, + }, + { + // This case returns inputBundles1 minus foo.v0.1.0, which is the intersection, + // because foo.v2.0.0 is a leaf node (disregarding skips). + name: "Success/SubGraph3", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.1.1", "foo.v0.1.0", nil}, + end: bundleSpec{"foo.v2.0.0", "foo.v0.1.0", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: inputBundles1[1:], + }, + { + // Even though foo.v0.4.0 is not in the channel, it's replaces (foo.v0.1.1) is. + name: "Success/ReplacesInChannel", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.2.0", "foo.v0.1.1", nil}, + end: bundleSpec{"foo.v0.4.0", "foo.v0.1.1", nil}, + headName: "foo.v3.0.0", + assertion: require.True, + expIntersecting: []bundleSpec{ + {"foo.v0.2.0", "foo.v0.1.1", nil}, + {"foo.v0.3.0", "foo.v0.2.0", nil}, + {"foo.v0.4.0", "foo.v0.1.1", nil}, + }, + }, + { + name: "Fail/ReplacesNotInChannel", + inputBundles: inputBundles1, + start: bundleSpec{"foo.v0.2.0", "foo.v0.1.1", nil}, + end: bundleSpec{"foo.v0.4.0", "foo.v0.1.2", nil}, + headName: "foo.v3.0.0", + assertion: require.False, + }, + } + + for _, s := range specs { + t.Run(s.name, func(t *testing.T) { + // Construct test + pkg := &model.Package{Name: "foo"} + ch := &model.Channel{Name: "stable", Bundles: make(map[string]*model.Bundle, len(s.inputBundles))} + ch.Package = pkg + for _, b := range s.inputBundles { + ch.Bundles[b.name] = newReplacingBundle(b.name, b.replaces, b.skips, ch, pkg) + } + expIntersecting := make([]*model.Bundle, len(s.expIntersecting)) + for i, b := range s.expIntersecting { + expIntersecting[i] = newReplacingBundle(b.name, b.replaces, b.skips, ch, pkg) + } + + // Ensure the channel is valid and has the correct head. + require.NoError(t, ch.Validate()) + head, err := ch.Head() + require.NoError(t, err) + require.Equal(t, ch.Bundles[s.headName], head) + + start := newReplacingBundle(s.start.name, s.start.replaces, s.start.skips, ch, pkg) + end := newReplacingBundle(s.end.name, s.end.replaces, s.end.skips, ch, pkg) + graph := makeUpgradeGraph(ch) + intersecting, found := findIntersectingBundles(ch, start, end, graph) + s.assertion(t, found) + // Compare bundle names only, since mismatch output is too verbose. + require.ElementsMatch(t, getBundleNames(expIntersecting), getBundleNames(intersecting)) + }) + } + +} + +func newReplacingBundle(name, replaces string, skips []string, ch *model.Channel, pkg *model.Package) *model.Bundle { + split := strings.SplitN(name, ".", 2) + nameStr, verStr := split[0], split[1] + b := &model.Bundle{ + Name: name, + Replaces: replaces, + Skips: skips, + Channel: ch, + Package: pkg, + Image: fmt.Sprintf("namespace/%s:%s", nameStr, verStr), + Properties: []property.Property{ + property.MustBuildPackage(ch.Package.Name, verStr), + }, + } + return b +} + +func getBundleNames(bundles []*model.Bundle) (names []string) { + for _, b := range bundles { + names = append(names, b.Name) + } + sort.Strings(names) + return names +} diff --git a/staging/operator-registry/alpha/declcfg/diff_test.go b/staging/operator-registry/alpha/declcfg/diff_test.go index 0f0a25fff1..51f92a9083 100644 --- a/staging/operator-registry/alpha/declcfg/diff_test.go +++ b/staging/operator-registry/alpha/declcfg/diff_test.go @@ -1309,6 +1309,191 @@ func TestDiffHeadsOnly(t *testing.T) { }, }, }, + { + name: "HasDiff/SelectDependencies", + newCfg: DeclarativeConfig{ + Packages: []Package{ + {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "bar", DefaultChannel: "stable"}, + }, + Channels: []Channel{ + {Schema: schemaChannel, Name: "stable", Package: "etcd", Entries: []ChannelEntry{ + {Name: "etcd.v0.9.0"}, + {Name: "etcd.v0.9.1", Replaces: "etcd.v0.9.0"}, + {Name: "etcd.v0.9.2", Replaces: "etcd.v0.9.1"}, + {Name: "etcd.v0.9.3", Replaces: "etcd.v0.9.2"}, + {Name: "etcd.v1.0.0", Replaces: "etcd.v0.9.3", Skips: []string{"etcd.v0.9.1", "etcd.v0.9.2", "etcd.v0.9.3"}}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "foo", Entries: []ChannelEntry{ + {Name: "foo.v0.1.0"}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "bar", Entries: []ChannelEntry{ + {Name: "bar.v0.1.0"}, + }}, + }, + Bundles: []Bundle{ + { + Schema: schemaBundle, + Name: "foo.v0.1.0", + Package: "foo", + Image: "reg/foo:latest", + Properties: []property.Property{ + property.MustBuildPackageRequired("etcd", "<0.9.2"), + property.MustBuildPackage("foo", "0.1.0"), + }, + }, + { + Schema: schemaBundle, + Name: "bar.v0.1.0", + Package: "bar", + Image: "reg/bar:latest", + Properties: []property.Property{ + property.MustBuildGVKRequired("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildPackage("bar", "0.1.0"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.0", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.0"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.1", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.1"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.2", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.2"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.3", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildGVK("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.3"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v1.0.0", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildGVK("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildPackage("etcd", "1.0.0"), + }, + }, + }, + }, + g: &DiffGenerator{}, + expCfg: DeclarativeConfig{ + Packages: []Package{ + {Schema: schemaPackage, Name: "bar", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "etcd", DefaultChannel: "stable"}, + {Schema: schemaPackage, Name: "foo", DefaultChannel: "stable"}, + }, + Channels: []Channel{ + {Schema: schemaChannel, Name: "stable", Package: "bar", Entries: []ChannelEntry{ + {Name: "bar.v0.1.0"}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "etcd", Entries: []ChannelEntry{ + {Name: "etcd.v0.9.1", Replaces: "etcd.v0.9.0"}, + {Name: "etcd.v0.9.2", Replaces: "etcd.v0.9.1"}, + {Name: "etcd.v0.9.3", Replaces: "etcd.v0.9.2"}, + {Name: "etcd.v1.0.0", Replaces: "etcd.v0.9.3", Skips: []string{"etcd.v0.9.1", "etcd.v0.9.2", "etcd.v0.9.3"}}, + }}, + {Schema: schemaChannel, Name: "stable", Package: "foo", Entries: []ChannelEntry{ + {Name: "foo.v0.1.0"}, + }}, + }, + Bundles: []Bundle{ + { + Schema: schemaBundle, + Name: "bar.v0.1.0", + Package: "bar", + Image: "reg/bar:latest", + Properties: []property.Property{ + property.MustBuildGVKRequired("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildPackage("bar", "0.1.0"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.1", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.1"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.2", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.2"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v0.9.3", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "0.9.3"), + }, + }, + { + Schema: schemaBundle, + Name: "etcd.v1.0.0", + Package: "etcd", + Image: "reg/etcd:latest", + Properties: []property.Property{ + property.MustBuildGVK("etcd.database.coreos.com", "v1", "EtcdBackup"), + property.MustBuildGVK("etcd.database.coreos.com", "v1beta2", "EtcdBackup"), + property.MustBuildPackage("etcd", "1.0.0"), + }, + }, + { + Schema: schemaBundle, + Name: "foo.v0.1.0", + Package: "foo", + Image: "reg/foo:latest", + Properties: []property.Property{ + property.MustBuildPackage("foo", "0.1.0"), + property.MustBuildPackageRequired("etcd", "<0.9.2"), + }, + }, + }, + }, + }, } for _, s := range specs { diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml index f3b349d646..6aef07f88e 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/exp-headsonly/index.yaml @@ -9,6 +9,7 @@ schema: olm.channel entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skips: - bar.v0.1.0 - name: bar.v1.0.0 diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml index 7ef42c6a9b..4b06fbacf6 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/latest/index.yaml @@ -9,6 +9,7 @@ schema: olm.channel entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skipRange: <0.2.0 skips: - bar.v0.1.0 diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml index 4e77597bcb..f3cc41dfd4 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml +++ b/vendor/github.com/operator-framework/operator-registry/alpha/action/testdata/index-declcfgs/old/index.yaml @@ -9,6 +9,7 @@ name: alpha entries: - name: bar.v0.1.0 - name: bar.v0.2.0 + replaces: bar.v0.1.0 skipRange: <0.2.0 skips: - bar.v0.1.0 diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go index 37cf72b052..c4f78d660f 100644 --- a/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff.go @@ -1,6 +1,7 @@ package declcfg import ( + "fmt" "reflect" "sort" "sync" @@ -167,7 +168,7 @@ func bundlesEqual(b1, b2 *model.Bundle) (bool, error) { func addAllDependencies(newModel, oldModel, outputModel model.Model) error { // Get every oldModel's bundle's dependencies, and their dependencies, etc. by BFS. - allProvidingBundles := []*model.Bundle{} + providingBundlesByPackage := map[string][]*model.Bundle{} for curr := getBundles(outputModel); len(curr) != 0; { reqGVKs, reqPkgs, err := findDependencies(curr) if err != nil { @@ -183,36 +184,85 @@ func addAllDependencies(newModel, oldModel, outputModel model.Model) error { for _, pkg := range newModel { providingBundles := getBundlesThatProvide(pkg, reqGVKs, reqPkgs) curr = append(curr, providingBundles...) - allProvidingBundles = append(allProvidingBundles, providingBundles...) + + oldPkg, oldHasPkg := oldModel[pkg.Name] + for _, b := range providingBundles { + // If the bundle is not in oldModel, add it to the set. + // outputModel is checked below. + add := true + if oldHasPkg { + if oldCh, oldHasCh := oldPkg.Channels[b.Channel.Name]; oldHasCh { + _, oldHasBundle := oldCh.Bundles[b.Name] + add = !oldHasBundle + } + } + if add { + providingBundlesByPackage[b.Package.Name] = append(providingBundlesByPackage[b.Package.Name], b) + } + } } } // Add the diff between an oldModel dependency package and its new counterpart // or the entire package if oldModel does not have it. - // - // TODO(estroz): add bundles then fill in dependency upgrade graph - // by selecting latest versions, as the EP specifies. - dependencyPkgs := map[string]*model.Package{} - for _, b := range allProvidingBundles { - if _, copied := dependencyPkgs[b.Package.Name]; !copied { - dependencyPkgs[b.Package.Name] = copyPackage(b.Package) - } - } - for _, newDepPkg := range dependencyPkgs { - // newDepPkg is a copy of a newModel pkg, so running diffPackages - // on it and oldPkg, which may have some but not all bundles, - // will produce a set of all bundles that outputModel doesn't have. - // Otherwise, just add the whole package. - if oldPkg, oldHasPkg := oldModel[newDepPkg.Name]; oldHasPkg { - if err := diffPackages(oldPkg, newDepPkg); err != nil { + for pkgName, bundles := range providingBundlesByPackage { + newPkg := newModel[pkgName] + heads := make(map[string]*model.Bundle, len(newPkg.Channels)) + for _, ch := range newPkg.Channels { + var err error + if heads[ch.Name], err = ch.Head(); err != nil { return err } - if len(newDepPkg.Channels) == 0 { - // Skip empty packages. - continue + } + + // Sort by version then channel so bundles lower in the full graph are more likely + // to be included in previous loops. + sort.Slice(bundles, func(i, j int) bool { + if bundles[i].Channel.Name == bundles[j].Channel.Name { + return bundles[i].Version.LT(bundles[j].Version) + } + return bundles[i].Channel.Name < bundles[j].Channel.Name + }) + + for _, b := range bundles { + newCh := b.Channel + + // Continue if b was added in a previous loop iteration. + // Otherwise create a new package/channel for b if they do not exist. + var ( + outputPkg *model.Package + outputCh *model.Channel + + outHasPkg, outHasCh bool + ) + if outputPkg, outHasPkg = outputModel[b.Package.Name]; outHasPkg { + if outputCh, outHasCh = outputPkg.Channels[b.Channel.Name]; outHasCh { + if _, outputHasBundle := outputCh.Bundles[b.Name]; outputHasBundle { + continue + } + } + } else { + outputPkg = copyPackageNoChannels(newPkg) + outputModel[outputPkg.Name] = outputPkg + } + if !outHasCh { + outputCh = copyChannelNoBundles(newCh, outputPkg) + outputPkg.Channels[outputCh.Name] = outputCh + } + + head := heads[newCh.Name] + graph := makeUpgradeGraph(newCh) + intersectingBundles, intersectionFound := findIntersectingBundles(newCh, b, head, graph) + if !intersectionFound { + // This should never happen, since b and head are from the same model. + return fmt.Errorf("channel %s: head %q not reachable from bundle %q", newCh.Name, head.Name, b.Name) + } + for _, ib := range intersectingBundles { + if _, outHasBundle := outputCh.Bundles[ib.Name]; !outHasBundle { + outputCh.Bundles[ib.Name] = copyBundle(ib, outputCh, outputPkg) + } } } - outputModel[newDepPkg.Name] = newDepPkg } return nil diff --git a/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff_include.go b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff_include.go new file mode 100644 index 0000000000..14a4d5c890 --- /dev/null +++ b/vendor/github.com/operator-framework/operator-registry/alpha/declcfg/diff_include.go @@ -0,0 +1,87 @@ +package declcfg + +import ( + "github.com/operator-framework/operator-registry/alpha/model" +) + +// makeUpgradeGraph creates a DAG of bundles with map key Bundle.Replaces. +func makeUpgradeGraph(ch *model.Channel) map[string][]*model.Bundle { + graph := map[string][]*model.Bundle{} + for _, b := range ch.Bundles { + b := b + if b.Replaces != "" { + graph[b.Replaces] = append(graph[b.Replaces], b) + } + } + return graph +} + +// findIntersectingBundles finds the intersecting bundle of start and end in the +// replaces upgrade graph graph by traversing down to the lowest graph node, +// then returns every bundle higher than the intersection. It is possible +// to find no intersection; this should only happen when start and end +// are not part of the same upgrade graph. +// Output bundle order is not guaranteed. +// Precondition: start must be a bundle in ch. +// Precondition: end must be ch's head. +func findIntersectingBundles(ch *model.Channel, start, end *model.Bundle, graph map[string][]*model.Bundle) ([]*model.Bundle, bool) { + // The intersecting set is equal to end if start is end. + if start.Name == end.Name { + return []*model.Bundle{end}, true + } + + // Construct start's replaces chain for comparison against end's. + startChain := map[string]*model.Bundle{start.Name: nil} + for curr := start; curr != nil && curr.Replaces != ""; curr = ch.Bundles[curr.Replaces] { + startChain[curr.Replaces] = curr + } + + // Trace end's replaces chain until it intersects with start's, or the root is reached. + var intersection string + if _, inChain := startChain[end.Name]; inChain { + intersection = end.Name + } else { + for curr := end; curr != nil && curr.Replaces != ""; curr = ch.Bundles[curr.Replaces] { + if _, inChain := startChain[curr.Replaces]; inChain { + intersection = curr.Replaces + break + } + } + } + + // No intersection is found, delegate behavior to caller. + if intersection == "" { + return nil, false + } + + // Find all bundles that replace the intersection via BFS, + // i.e. the set of bundles that fill the update graph between start and end. + replacesIntersection := graph[intersection] + replacesSet := map[string]*model.Bundle{} + for _, b := range replacesIntersection { + currName := "" + for next := []*model.Bundle{b}; len(next) > 0; next = next[1:] { + currName = next[0].Name + if _, hasReplaces := replacesSet[currName]; !hasReplaces { + replacers := graph[currName] + next = append(next, replacers...) + replacesSet[currName] = ch.Bundles[currName] + } + } + } + + // Remove every bundle between start and intersection exclusively, + // since these bundles must already exist in the destination channel. + for rep := start; rep != nil && rep.Name != intersection; rep = ch.Bundles[rep.Replaces] { + delete(replacesSet, rep.Name) + } + + // Ensure both start and end are added to the output. + replacesSet[start.Name] = start + replacesSet[end.Name] = end + var intersectingBundles []*model.Bundle + for _, b := range replacesSet { + intersectingBundles = append(intersectingBundles, b) + } + return intersectingBundles, true +}