From dcbfc27eb5168e48e95d16f7f6d130df4acf6a92 Mon Sep 17 00:00:00 2001 From: Waleed Malik Date: Tue, 21 Dec 2021 18:37:38 +0500 Subject: [PATCH] Webhooks for OSM (#106) * Add mutating webhook for OSP and MD * Add validation for OSP Signed-off-by: Waleed Malik * Add validations in OSP * Add vanilla manifests for deployment OSM and webhook * Bump GO to v1.17.6 * Bump GO to v1.17.5 Signed-off-by: Waleed Malik * Use quay.io for images * Add deployment for osm-controller and webhook * Use dedicated client for interactions with seed and user clusters * Refactored code * Update test data * Update generated code Signed-off-by: Waleed Malik * test changes * Fix codegen * Fix path for tls cert * Fix deployments and use external client for osc controller * Remove dependencies from ValidateMachineDeployment method to make it re-usable * Refactored code; handle PR feedback * User worker manager for OSC controller * Handle PR feedback --- Dockerfile | 7 +- README.md | 2 +- cmd/osm-controller/main.go | 131 +++++++-- cmd/webhook/main.go | 96 +++++++ .../crd/crd-operating-system-config.yaml | 24 ++ .../crd/crd-operating-system-profile.yaml | 31 ++ deploy/operating-system-manager-webhook.yaml | 163 +++++++++++ deploy/operating-system-manager.yaml | 188 ++++++++++++ .../osps/default/osp-amzn-linux.yaml | 1 + .../osps/default/osp-centos.yaml | 1 + .../osps/default/osp-flatcar.yaml | 1 + {charts => deploy}/osps/default/osp-rhel.yaml | 1 + {charts => deploy}/osps/default/osp-sles.yaml | 1 + .../osps/default/osp-ubuntu.yaml | 3 +- {charts => deploy}/osps/default_osps.go | 0 go.mod | 89 +++++- go.sum | 270 ------------------ hack/run-operating-system-manager.sh | 4 +- hack/update-codegen.sh | 4 +- hack/update-crds-openapi.sh | 4 +- hack/verify-crds-openapi.sh | 4 +- pkg/admission/admission.go | 134 +++++++++ pkg/admission/machinedeployments.go | 39 +++ pkg/admission/machinedeployments_test.go | 179 ++++++++++++ .../machinedeployments_validation.go | 84 ++++++ pkg/admission/operatingsystemconfigs.go | 45 +++ pkg/admission/operatingsystemconfigs_test.go | 147 ++++++++++ .../operatingsystemconfigs_validation.go | 33 +++ pkg/admission/operatingsystemprofiles.go | 45 +++ pkg/admission/operatingsystemprofiles_test.go | 195 +++++++++++++ .../operatingsystemprofiles_validation.go | 39 +++ pkg/controllers/osc/osc_controller.go | 90 +++--- pkg/controllers/osc/osc_reconciler_test.go | 17 +- .../osc/resources/operating_system_config.go | 10 +- pkg/controllers/osc/resources/secrets.go | 4 + .../secret-flatcar-aws-containerd.yaml | 1 + .../testdata/secret-flatcar-aws-docker.yaml | 1 + .../testdata/secret-rhel-8.x-containerd.yaml | 1 + .../secret-ubuntu-20.04-aws-containerd.yaml | 1 + .../secret-ubuntu-20.04-aws-docker.yaml | 1 + pkg/controllers/osp/osp_controller.go | 6 +- pkg/crd/osm/v1alpha1/common_types.go | 13 +- .../v1alpha1/operatingsystemprofile_types.go | 2 + 43 files changed, 1746 insertions(+), 366 deletions(-) create mode 100644 cmd/webhook/main.go rename {charts => deploy}/crd/crd-operating-system-config.yaml (91%) rename {charts => deploy}/crd/crd-operating-system-profile.yaml (91%) create mode 100644 deploy/operating-system-manager-webhook.yaml create mode 100644 deploy/operating-system-manager.yaml rename {charts => deploy}/osps/default/osp-amzn-linux.yaml (99%) rename {charts => deploy}/osps/default/osp-centos.yaml (99%) rename {charts => deploy}/osps/default/osp-flatcar.yaml (99%) rename {charts => deploy}/osps/default/osp-rhel.yaml (99%) rename {charts => deploy}/osps/default/osp-sles.yaml (99%) rename {charts => deploy}/osps/default/osp-ubuntu.yaml (99%) rename {charts => deploy}/osps/default_osps.go (100%) create mode 100644 pkg/admission/admission.go create mode 100644 pkg/admission/machinedeployments.go create mode 100644 pkg/admission/machinedeployments_test.go create mode 100644 pkg/admission/machinedeployments_validation.go create mode 100644 pkg/admission/operatingsystemconfigs.go create mode 100644 pkg/admission/operatingsystemconfigs_test.go create mode 100644 pkg/admission/operatingsystemconfigs_validation.go create mode 100644 pkg/admission/operatingsystemprofiles.go create mode 100644 pkg/admission/operatingsystemprofiles_test.go create mode 100644 pkg/admission/operatingsystemprofiles_validation.go diff --git a/Dockerfile b/Dockerfile index 67648f9c..27827aa7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,9 +11,10 @@ # 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. + ARG GO_VERSION=1.17.5 FROM golang:${GO_VERSION} AS builder -WORKDIR /go/src/github.com/kubermatic/operating-system-manager +WORKDIR /go/src/k8c.io/operating-system-manager COPY . . RUN make all @@ -22,6 +23,8 @@ FROM alpine:3.12 RUN apk add --no-cache ca-certificates cdrkit COPY --from=builder \ - /go/src/github.com/kubermatic/operating-system-manager/_build/osm-controller \ + /go/src/k8c.io/operating-system-manager/_build/osm-controller \ + /go/src/k8c.io/operating-system-manager/_build/webhook \ /usr/local/bin/ + USER nobody diff --git a/README.md b/README.md index aca00c9e..dcd9a389 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ Simply run `make test` To run OSM locally: - Either use a [kind](https://kind.sigs.k8s.io/docs/user/quick-start/) cluster or actual cluster and make sure that the correct context is loaded -- Run `kubectl apply -f charts/crd` to install CRDs +- Run `kubectl apply -f deploy/crds` to install CRDs - Create relevant OperatingSystemProfile resources. Check [sample](./examples) for reference. - Run `make run` diff --git a/cmd/osm-controller/main.go b/cmd/osm-controller/main.go index 97f22106..ed6264f5 100644 --- a/cmd/osm-controller/main.go +++ b/cmd/osm-controller/main.go @@ -30,15 +30,20 @@ import ( clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" "k8c.io/operating-system-manager/pkg/controllers/osc" "k8c.io/operating-system-manager/pkg/controllers/osp" - "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" "k8c.io/operating-system-manager/pkg/generator" providerconfig "k8c.io/operating-system-manager/pkg/providerconfig/config" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/client-go/kubernetes/scheme" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/homedir" "k8s.io/klog" + ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client/config" + "sigs.k8s.io/controller-runtime/pkg/healthz" "sigs.k8s.io/controller-runtime/pkg/manager" - "sigs.k8s.io/controller-runtime/pkg/manager/signals" ) type options struct { @@ -54,8 +59,24 @@ type options struct { nodePortRange string podCidr string - clusterDNSIPs string - kubeconfig string + clusterDNSIPs string + workerClusterKubeconfig string + kubeconfig string + + healthProbeAddress string + metricsAddress string + workerHealthProbeAddress string + workerMetricsAddress string +} + +const ( + defaultLeaderElectionNamespace = "kube-system" +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme.Scheme)) + utilruntime.Must(osmv1alpha1.AddToScheme(scheme.Scheme)) + utilruntime.Must(clusterv1alpha1.AddToScheme(scheme.Scheme)) } func main() { @@ -66,7 +87,7 @@ func main() { if flag.Lookup("kubeconfig") == nil { flag.StringVar(&opt.kubeconfig, "kubeconfig", "", "Path to a kubeconfig. Only required if out-of-cluster.") } - + flag.StringVar(&opt.workerClusterKubeconfig, "worker-cluster-kubeconfig", "", "Path to kubeconfig of cluster where provisioning secrets are created") flag.IntVar(&opt.workerCount, "worker-count", 10, "Number of workers which process reconciliation in parallel.") flag.StringVar(&opt.clusterName, "cluster-name", "", "The cluster where the OSC will run.") flag.StringVar(&opt.namespace, "namespace", "", "The namespace where the OSC controller will run.") @@ -80,6 +101,11 @@ func main() { flag.StringVar(&opt.podCidr, "pod-cidr", "172.25.0.0/16", "The network ranges from which POD networks are allocated") flag.StringVar(&opt.nodePortRange, "node-port-range", "30000-32767", "A port range to reserve for services with NodePort visibility") + flag.StringVar(&opt.healthProbeAddress, "health-probe-address", "127.0.0.1:8085", "The address on which the liveness check on /healthz and readiness check on /readyz will be available") + flag.StringVar(&opt.metricsAddress, "metrics-address", "127.0.0.1:8080", "The address on which Prometheus metrics will be available under /metrics") + + flag.StringVar(&opt.workerHealthProbeAddress, "worker-health-probe-address", "127.0.0.1:8086", "For worker manager, the address on which the liveness check on /healthz and readiness check on /readyz will be available") + flag.StringVar(&opt.workerMetricsAddress, "worker-metrics-address", "127.0.0.1:8081", "For worker manager, the address on which Prometheus metrics will be available under /metrics") flag.Parse() if len(opt.namespace) == 0 { @@ -102,40 +128,70 @@ func main() { klog.Fatalf("invalid cluster dns specified: %v", err) } - mgr, err := manager.New(config.GetConfigOrDie(), manager.Options{}) + logger, err := zap.NewProduction() if err != nil { - klog.Error(err, "could not create manager") - os.Exit(1) - } - if err = v1alpha1.AddToScheme(mgr.GetScheme()); err != nil { - klog.Fatal(err) - } - // because we watch MachineDeployments - if err = clusterv1alpha1.AddToScheme(mgr.GetScheme()); err != nil { klog.Fatal(err) } - logger, err := zap.NewProduction() + log := logger.Sugar() + + // Create manager with client against in-cluster config + mgr, err := createManager(opt) if err != nil { - klog.Fatal(err) + klog.Fatalf("failed to create runtime manager: %v", err) } - log := logger.Sugar() + // Start with assuming that current cluster will be used as worker cluster + workerMgr := mgr - if err := osp.Add(mgr, log, opt.namespace, opt.workerCount); err != nil { - klog.Fatal(err) + // Handling for worker cluster + if opt.workerClusterKubeconfig != "" { + workerClusterConfig, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig( + &clientcmd.ClientConfigLoadingRules{ExplicitPath: opt.workerClusterKubeconfig}, + &clientcmd.ConfigOverrides{}).ClientConfig() + if err != nil { + klog.Fatal(err) + } + + workerMgr, err = manager.New(workerClusterConfig, manager.Options{ + LeaderElection: true, + LeaderElectionID: "operating-system-manager-worker-manager", + LeaderElectionNamespace: defaultLeaderElectionNamespace, + HealthProbeBindAddress: opt.workerHealthProbeAddress, + MetricsBindAddress: opt.workerMetricsAddress, + Port: 9444, + }) + if err != nil { + klog.Fatal(err) + } + + // "-worker-cluster-kubeconfig" was not empty and a valid kubeconfig was provided, + // point workerClient to the external cluster + // Use workerClusterKubeconfig since the machines will exist on that cluster + opt.kubeconfig = opt.workerClusterKubeconfig + + if err := mgr.Add(workerMgr); err != nil { + klog.Fatal("failed to add workers cluster mgr to main mgr", zap.Error(err)) + } } // Instantiate ConfigVarResolver - providerconfig.SetConfigVarResolver(context.Background(), mgr.GetClient(), opt.namespace) + providerconfig.SetConfigVarResolver(context.Background(), workerMgr.GetClient(), opt.namespace) + + // Setup OSP controller + if err := osp.Add(mgr, log, opt.namespace, opt.workerCount); err != nil { + klog.Fatal(err) + } + // Setup OSC controller if err := osc.Add( - mgr, + workerMgr, log, - osc.CloudInitSettingsNamespace, + mgr.GetClient(), + opt.kubeconfig, + opt.namespace, opt.clusterName, opt.workerCount, parsedClusterDNSIPs, - opt.kubeconfig, generator.NewDefaultCloudConfigGenerator(""), opt.containerRuntime, opt.externalCloudProvider, @@ -149,11 +205,38 @@ func main() { klog.Fatal(err) } - if err := mgr.Start(signals.SetupSignalHandler()); err != nil { + log.Info("starting manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { klog.Fatalf("Failed to start OSC controller: %v", zap.Error(err)) } } +func createManager(opt *options) (manager.Manager, error) { + // Manager options + options := manager.Options{ + LeaderElection: true, + LeaderElectionID: "operating-system-manager", + LeaderElectionNamespace: defaultLeaderElectionNamespace, + HealthProbeBindAddress: opt.healthProbeAddress, + MetricsBindAddress: opt.metricsAddress, + Port: 9443, + } + + mgr, err := manager.New(config.GetConfigOrDie(), options) + if err != nil { + return nil, fmt.Errorf("error building ctrlruntime manager: %v", err) + } + + // Add health endpoints + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + return nil, fmt.Errorf("failed to add health check: %v", err) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + return nil, fmt.Errorf("failed to add readiness check: %v", err) + } + return mgr, nil +} + func parseClusterDNSIPs(s string) ([]net.IP, error) { var ips []net.IP sips := strings.Split(s, ",") diff --git a/cmd/webhook/main.go b/cmd/webhook/main.go new file mode 100644 index 00000000..30bc724e --- /dev/null +++ b/cmd/webhook/main.go @@ -0,0 +1,96 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 main + +import ( + "flag" + + clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" + "k8c.io/operating-system-manager/pkg/admission" + "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + "k8s.io/klog" + ctrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/client/config" +) + +type options struct { + namespace string + + admissionListenAddress string + admissionTLSCertPath string + admissionTLSKeyPath string +} + +var ( + scheme = runtime.NewScheme() +) + +func init() { + utilruntime.Must(v1alpha1.AddToScheme(scheme)) + utilruntime.Must(clusterv1alpha1.AddToScheme(scheme)) +} + +func main() { + klog.InitFlags(nil) + + opt := &options{} + + flag.StringVar(&opt.admissionListenAddress, "listen-address", ":9876", "The address on which the MutatingWebhook will listen on") + flag.StringVar(&opt.admissionTLSCertPath, "tls-cert-path", "/tmp/cert/cert.pem", "The path of the TLS cert for the MutatingWebhook") + flag.StringVar(&opt.admissionTLSKeyPath, "tls-key-path", "/tmp/cert/key.pem", "The path of the TLS key for the MutatingWebhook") + flag.StringVar(&opt.namespace, "namespace", "", "The namespace where the OSC webhook will run.") + flag.Parse() + + if len(opt.namespace) == 0 { + klog.Fatal("-namespace is required") + } + + // Build config for in-cluster cluster + cfg, err := config.GetConfig() + if err != nil { + klog.Fatalf("error building kubeconfig: %v", err) + } + + // Build client against in-cluster config + client, err := ctrlruntimeclient.New(cfg, ctrlruntimeclient.Options{ + Scheme: scheme, + }) + if err != nil { + klog.Fatalf("failed to build seed client: %v", err) + } + + srv, err := admission.New(opt.admissionListenAddress, opt.namespace, client) + if err != nil { + klog.Fatalf("failed to create admission hook: %v", err) + } + + klog.Infof("starting webhook server on %s", opt.admissionListenAddress) + + if err := srv.ListenAndServeTLS(opt.admissionTLSCertPath, opt.admissionTLSKeyPath); err != nil { + klog.Fatalf("failed to start server: %v", err) + } + defer func() { + if err := srv.Close(); err != nil { + klog.Fatalf("failed to shutdown server: %v", err) + } + }() + klog.Infof("Listening on %s", opt.admissionListenAddress) + select {} +} diff --git a/charts/crd/crd-operating-system-config.yaml b/deploy/crd/crd-operating-system-config.yaml similarity index 91% rename from charts/crd/crd-operating-system-config.yaml rename to deploy/crd/crd-operating-system-config.yaml index ef80566b..a5618e6b 100644 --- a/charts/crd/crd-operating-system-config.yaml +++ b/deploy/crd/crd-operating-system-config.yaml @@ -62,6 +62,23 @@ spec: name: description: Name represents the name of the supported cloud provider type: string + enum: + - aws + - azure + - digitalocean + - gce + - hetzner + - kubevirt + - linode + - openstack + - packet + - vsphere + - fake + - alibaba + - anexia + - scaleway + - baremetal + - external spec: description: Spec represents the os/image reference in the supported cloud provider type: object @@ -121,6 +138,13 @@ spec: osName: description: 'OSType represent the operating system name e.g: ubuntu' type: string + enum: + - flatcar + - rhel + - centos + - ubuntu + - sles + - amzn2 osVersion: description: OSVersion the version of the operating system type: string diff --git a/charts/crd/crd-operating-system-profile.yaml b/deploy/crd/crd-operating-system-profile.yaml similarity index 91% rename from charts/crd/crd-operating-system-profile.yaml rename to deploy/crd/crd-operating-system-profile.yaml index 6f433441..21914d99 100644 --- a/charts/crd/crd-operating-system-profile.yaml +++ b/deploy/crd/crd-operating-system-profile.yaml @@ -53,6 +53,7 @@ spec: - osVersion - supportedCloudProviders - supportedContainerRuntimes + - version properties: files: description: Files is a list of files that should exist in the instance @@ -109,6 +110,13 @@ spec: osName: description: 'OSType represent the operating system name e.g: ubuntu' type: string + enum: + - flatcar + - rhel + - centos + - ubuntu + - sles + - amzn2 osVersion: description: OSVersion the version of the operating system type: string @@ -124,6 +132,23 @@ spec: name: description: Name represents the name of the supported cloud provider type: string + enum: + - aws + - azure + - digitalocean + - gce + - hetzner + - kubevirt + - linode + - openstack + - packet + - vsphere + - fake + - alibaba + - anexia + - scaleway + - baremetal + - external spec: description: Spec represents the os/image reference in the supported cloud provider type: object @@ -174,6 +199,9 @@ spec: name: description: Name of the Container runtime type: string + enum: + - docker + - containerd templates: description: Templates to add to the available templates when the containerRuntime is selected type: object @@ -221,3 +249,6 @@ spec: name: description: Name is the name of a unit. type: string + version: + description: Version is the version of the operating System Profile + type: string diff --git a/deploy/operating-system-manager-webhook.yaml b/deploy/operating-system-manager-webhook.yaml new file mode 100644 index 00000000..e37f3851 --- /dev/null +++ b/deploy/operating-system-manager-webhook.yaml @@ -0,0 +1,163 @@ +# Copyright 2021 The Operating System Manager contributors. +# +# 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. + +apiVersion: v1 +kind: Secret +metadata: + name: operating-system-manager-admission-cert + namespace: kube-system +data: + "cert.pem": __admission_cert__ + "key.pem": __admission_key__ +--- +apiVersion: v1 +kind: Service +metadata: + name: operating-system-manager-webhook + namespace: kube-system +spec: + ports: + - name: 443-9876 + port: 443 + protocol: TCP + targetPort: 9876 + selector: + app: operating-system-manager-webhook + type: ClusterIP +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: operating-system-manager-webhook + namespace: kube-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: operating-system-manager-webhook + namespace: kube-system +spec: + replicas: 1 + selector: + matchLabels: + app: operating-system-manager-webhook + template: + metadata: + labels: + app: operating-system-manager-webhook + spec: + serviceAccountName: operating-system-manager-webhook + containers: + - image: quay.io/kubermatic/operating-system-manager:latest + imagePullPolicy: IfNotPresent + name: webhook + command: + - /usr/local/bin/webhook + - -logtostderr + - -v=6 + - -listen-address=0.0.0.0:9876 + - -namespace=kube-system + volumeMounts: + - name: operating-system-manager-admission-cert + mountPath: /tmp/cert + livenessProbe: + httpGet: + path: /healthz + port: 9876 + scheme: HTTPS + initialDelaySeconds: 5 + periodSeconds: 5 + readinessProbe: + httpGet: + path: /healthz + port: 9876 + scheme: HTTPS + periodSeconds: 5 + resources: + requests: + memory: 256Mi + cpu: 100m + limits: + memory: 256Mi + cpu: 100m + volumes: + - name: operating-system-manager-admission-cert + secret: + secretName: operating-system-manager-admission-cert +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + name: operatingsystemmanager.k8c.io +webhooks: + - name: machinedeployments.cluster.k8s.io + failurePolicy: Fail + sideEffects: None + admissionReviewVersions: ["v1", "v1beta1"] + rules: + - apiGroups: + - "cluster.k8s.io" + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - machinedeployments + clientConfig: + service: + namespace: kube-system + name: operating-system-manager-webhook + path: /machinedeployment + caBundle: __admission_ca_cert__ + - name: operatingsystemprofiles.operatingsystemmanager.k8c.io + failurePolicy: Fail + sideEffects: None + admissionReviewVersions: ["v1", "v1beta1"] + rules: + - apiGroups: + - "operatingsystemmanager.k8c.io" + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - operatingsystemprofiles + clientConfig: + service: + namespace: kube-system + name: operating-system-manager-webhook + path: /operatingsystemprofile + caBundle: __admission_ca_cert__ + - name: operatingsystemconfigs.operatingsystemmanager.k8c.io + failurePolicy: Fail + sideEffects: None + admissionReviewVersions: ["v1", "v1beta1"] + rules: + - apiGroups: + - "operatingsystemmanager.k8c.io" + apiVersions: + - v1alpha1 + operations: + - CREATE + - UPDATE + resources: + - operatingsystemconfigs + clientConfig: + service: + namespace: kube-system + name: operating-system-manager-webhook + path: /operatingsystemconfig + caBundle: __admission_ca_cert__ diff --git a/deploy/operating-system-manager.yaml b/deploy/operating-system-manager.yaml new file mode 100644 index 00000000..52b4040a --- /dev/null +++ b/deploy/operating-system-manager.yaml @@ -0,0 +1,188 @@ +# Copyright 2021 The Operating System Manager contributors. +# +# 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. + +--- +apiVersion: v1 +data: + kubeconfig: __user_cluster_kubeconfig__ +kind: Secret +metadata: + name: external-cluster-kubeconfig + namespace: kube-system +type: Opaque +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: operating-system-manager +rules: + - apiGroups: + - "cluster.k8s.io" + resources: + - "machinedeployments" + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: operating-system-manager +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: operating-system-manager +subjects: + - kind: ServiceAccount + name: operating-system-manager + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: operating-system-manager + namespace: kube-system +rules: + - apiGroups: + - operatingsystemmanager.k8c.io + resources: + - operatingsystemprofiles + verbs: + - get + - list + - watch + - apiGroups: + - operatingsystemmanager.k8c.io + resources: + - operatingsystemprofiles/status + verbs: + - get + - apiGroups: + - operatingsystemmanager.k8c.io + resources: + - operatingsystemconfigs + verbs: + - "*" + - apiGroups: + - operatingsystemmanager.k8c.io + resources: + - operatingsystemconfigs/status + verbs: + - get + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - create + - update + - apiGroups: + - "" + resources: + - events + verbs: + - create + - patch + - apiGroups: + - "coordination.k8s.io" + resources: + - leases + verbs: + - "*" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: operating-system-manager + namespace: kube-system +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: operating-system-manager +subjects: + - kind: ServiceAccount + name: operating-system-manager + namespace: kube-system +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: operating-system-manager + namespace: kube-system +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: operating-system-manager + namespace: kube-system +spec: + replicas: 1 + selector: + matchLabels: + app: operating-system-manager + template: + metadata: + annotations: + "prometheus.io/scrape": "true" + "prometheus.io/port": "8080" + "prometheus.io/path": "/metrics" + labels: + app: operating-system-manager + spec: + serviceAccountName: operating-system-manager + containers: + - image: quay.io/kubermatic/operating-system-manager:latest + imagePullPolicy: IfNotPresent + name: operating-system-manager + command: + - /usr/local/bin/osm-controller + - -logtostderr + - -v=3 + - -worker-count=5 + - -cluster-dns=10.10.10.10 + - -metrics-address=0.0.0.0:8080 + - -health-probe-address=0.0.0.0:8085 + - -namespace=kube-system + - -external-cluster-kubeconfig=/etc/kubernetes/kubeconfig/kubeconfig + volumeMounts: + - mountPath: /etc/kubernetes/kubeconfig + name: external-cluster-kubeconfig + readOnly: true + ports: + - containerPort: 8085 + livenessProbe: + httpGet: + path: /readyz + port: 8085 + initialDelaySeconds: 5 + periodSeconds: 5 + readinessProbe: + httpGet: + path: /healthz + port: 8085 + periodSeconds: 5 + resources: + requests: + memory: 256Mi + cpu: 100m + limits: + memory: 256Mi + cpu: 100m + volumes: + - name: external-cluster-kubeconfig + secret: + defaultMode: 420 + secretName: external-cluster-kubeconfig \ No newline at end of file diff --git a/charts/osps/default/osp-amzn-linux.yaml b/deploy/osps/default/osp-amzn-linux.yaml similarity index 99% rename from charts/osps/default/osp-amzn-linux.yaml rename to deploy/osps/default/osp-amzn-linux.yaml index 10efb331..7ea2b305 100644 --- a/charts/osps/default/osp-amzn-linux.yaml +++ b/deploy/osps/default/osp-amzn-linux.yaml @@ -20,6 +20,7 @@ metadata: spec: osName: "amzn2" osVersion: "2.0" + version: "1.0.0" supportedCloudProviders: - name: "aws" supportedContainerRuntimes: diff --git a/charts/osps/default/osp-centos.yaml b/deploy/osps/default/osp-centos.yaml similarity index 99% rename from charts/osps/default/osp-centos.yaml rename to deploy/osps/default/osp-centos.yaml index d895e3ff..43424c88 100644 --- a/charts/osps/default/osp-centos.yaml +++ b/deploy/osps/default/osp-centos.yaml @@ -20,6 +20,7 @@ metadata: spec: osName: "centos" osVersion: "7.7" + version: "1.0.0" supportedCloudProviders: - name: "aws" - name: "azure" diff --git a/charts/osps/default/osp-flatcar.yaml b/deploy/osps/default/osp-flatcar.yaml similarity index 99% rename from charts/osps/default/osp-flatcar.yaml rename to deploy/osps/default/osp-flatcar.yaml index 44f2c8b4..8ef6c0bd 100644 --- a/charts/osps/default/osp-flatcar.yaml +++ b/deploy/osps/default/osp-flatcar.yaml @@ -21,6 +21,7 @@ spec: osName: flatcar ## Flatcar Stable (09/11/2021) osVersion: "2983.2.0" + version: "1.0.0" supportedCloudProviders: - name: aws - name: azure diff --git a/charts/osps/default/osp-rhel.yaml b/deploy/osps/default/osp-rhel.yaml similarity index 99% rename from charts/osps/default/osp-rhel.yaml rename to deploy/osps/default/osp-rhel.yaml index 9b8369dd..4cfcab8f 100644 --- a/charts/osps/default/osp-rhel.yaml +++ b/deploy/osps/default/osp-rhel.yaml @@ -20,6 +20,7 @@ metadata: spec: osName: "rhel" osVersion: "8.4" + version: "1.0.0" supportedCloudProviders: - name: "aws" - name: "azure" diff --git a/charts/osps/default/osp-sles.yaml b/deploy/osps/default/osp-sles.yaml similarity index 99% rename from charts/osps/default/osp-sles.yaml rename to deploy/osps/default/osp-sles.yaml index 0c65bf93..29926804 100644 --- a/charts/osps/default/osp-sles.yaml +++ b/deploy/osps/default/osp-sles.yaml @@ -20,6 +20,7 @@ metadata: spec: osName: sles osVersion: "15-SP-1" + version: "1.0.0" supportedCloudProviders: - name: aws supportedContainerRuntimes: diff --git a/charts/osps/default/osp-ubuntu.yaml b/deploy/osps/default/osp-ubuntu.yaml similarity index 99% rename from charts/osps/default/osp-ubuntu.yaml rename to deploy/osps/default/osp-ubuntu.yaml index ea35c172..61935778 100644 --- a/charts/osps/default/osp-ubuntu.yaml +++ b/deploy/osps/default/osp-ubuntu.yaml @@ -16,10 +16,11 @@ apiVersion: operatingsystemmanager.k8c.io/v1alpha1 kind: OperatingSystemProfile metadata: name: osp-ubuntu - namespace: cluster-x2qc8nrhqf + namespace: cloud-init-settings spec: osName: "ubuntu" osVersion: "20.04" + version: "1.0.0" supportedCloudProviders: - name: "aws" - name: "azure" diff --git a/charts/osps/default_osps.go b/deploy/osps/default_osps.go similarity index 100% rename from charts/osps/default_osps.go rename to deploy/osps/default_osps.go diff --git a/go.mod b/go.mod index 64f674b3..f89455c5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module k8c.io/operating-system-manager -go 1.16 +go 1.17 require ( github.com/Masterminds/semver/v3 v3.1.1 @@ -9,8 +9,7 @@ require ( github.com/kinvolk/container-linux-config-transpiler v0.9.1 github.com/kubermatic/machine-controller v1.36.1 github.com/onsi/ginkgo v1.15.0 - github.com/open-policy-agent/frameworks/constraint v0.0.0-20210802220920-c000ec35322e // indirect - github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 go.uber.org/zap v1.16.0 gopkg.in/yaml.v2 v2.4.0 // indirect @@ -25,7 +24,91 @@ require ( sigs.k8s.io/controller-runtime v0.8.3 sigs.k8s.io/controller-tools v0.4.1 sigs.k8s.io/yaml v1.2.0 +) + +require k8s.io/klog/v2 v2.9.0 +require ( + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/ajeddeloh/go-json v0.0.0-20200220154158-5ae607161559 // indirect + github.com/ajeddeloh/yaml v0.0.0-20170912190910-6b94386aeefd // indirect + github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/coreos/go-semver v0.3.0 // indirect + github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect + github.com/coreos/ignition v0.35.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful v2.11.2+incompatible // indirect + github.com/evanphx/json-patch v4.9.0+incompatible // indirect + github.com/fatih/color v1.10.0 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect + github.com/go-logr/logr v0.4.0 // indirect + github.com/go-logr/zapr v0.3.0 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.5 // indirect + github.com/go-openapi/swag v0.19.15 // indirect + github.com/gobuffalo/flect v0.2.0 // indirect + github.com/gogo/protobuf v1.3.1 // indirect + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.6 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/uuid v1.1.2 // indirect + github.com/googleapis/gnostic v0.5.1 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/huandu/xstrings v1.3.2 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.11 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.8 // indirect + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mitchellh/copystructure v1.0.0 // indirect + github.com/mitchellh/reflectwalk v1.0.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/nxadm/tail v1.4.8 // indirect + github.com/onsi/gomega v1.10.5 // indirect + github.com/prometheus/client_golang v1.10.0 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.25.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/shopspring/decimal v1.2.0 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/cobra v1.1.3 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50 // indirect + go.uber.org/atomic v1.7.0 // indirect + go.uber.org/multierr v1.6.0 // indirect + go4.org v0.0.0-20201209231011-d4a079459e60 // indirect + golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 // indirect + golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect + golang.org/x/mod v0.4.2 // indirect + golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect + golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c // indirect + golang.org/x/sys v0.0.0-20210601080250-7ecdf8ef093b // indirect + golang.org/x/term v0.0.0-20210503060354-a79de5458b56 // indirect + golang.org/x/text v0.3.6 // indirect + golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect + golang.org/x/tools v0.1.2 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + gomodules.xyz/jsonpatch/v2 v2.1.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.26.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + honnef.co/go/tools v0.1.4 // indirect + k8s.io/apiextensions-apiserver v0.20.2 // indirect + k8s.io/component-base v0.20.2 // indirect + k8s.io/gengo v0.0.0-20201113003025-83324d819ded // indirect + k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.1.1 // indirect ) replace k8s.io/client-go => k8s.io/client-go v0.20.2 diff --git a/go.sum b/go.sum index 05039f75..04c6df20 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -4d63.com/gochecknoglobals v0.0.0-20201008074935-acfc0b28355a/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= -bitbucket.org/creachadair/shell v0.0.6/go.mod h1:8Qqi/cYk7vPnsOePHroKXDJYmb5x7ENhtiFtfZq8K+M= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.30.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -17,7 +15,6 @@ cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6 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.60.0/go.mod h1:yw2G51M9IfRboUH61Us8GqCeF1PzPblB823Mn2q2eAU= 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.71.0/go.mod h1:qZfY4Y7AEIQwG/fQYD3xrxLNkQZ0Xzf3HGeqCkA6LVM= @@ -38,8 +35,6 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k 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/pubsub v1.5.0/go.mod h1:ZEwJccE3z93Z2HWvstpri00jOg7oO4UZDtKhwDwqF0w= -cloud.google.com/go/spanner v1.7.0/go.mod h1:sd3K2gZ9Fd0vMPLXzeCrF6fq4i63Q7aTLW/lBIfBkIk= 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= @@ -49,7 +44,6 @@ code.cloudfoundry.org/go-pubsub v0.0.0-20180503211407-becd51dc37cb/go.mod h1:2mo contrib.go.opencensus.io/exporter/ocagent v0.4.12/go.mod h1:450APlNTSR6FrvC3CTRqYosuDstRB9un7SOx2k/9ckA= contrib.go.opencensus.io/exporter/prometheus v0.1.0/go.mod h1:cGFniUXGZlKRjzOyuZJ6mgB+PgBcCIa79kEKR8YCW+A= contrib.go.opencensus.io/exporter/stackdriver v0.12.8/go.mod h1:XyyafDnFOsqoxHJgTFycKZMrRUrPThLh2iYTJF6uoO0= -contrib.go.opencensus.io/exporter/stackdriver v0.13.4/go.mod h1:aXENhDJ1Y4lIg4EUaVTwzvYETVNZk10Pu26tevFKLUc= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= git.apache.org/thrift.git v0.12.0/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= @@ -107,7 +101,6 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= github.com/GoogleCloudPlatform/cloud-builders/gcs-fetcher v0.0.0-20191203181535-308b93ad1f39/go.mod h1:yfGmCjKuUzk9WzubMlW2zwjhCraIc/J+M40cufdemRM= github.com/GoogleCloudPlatform/k8s-cloud-provider v0.0.0-20190822182118-27a4ced34534/go.mod h1:iroGtC8B3tQiqtds1l+mgk/BBOrxbqjH+eUfFQYRc14= github.com/GoogleCloudPlatform/testgrid v0.0.1-alpha.4/go.mod h1:f96W2HYy3tiBNV5zbbRc+NczwYHgG1PHXMQfoEWv680= @@ -116,15 +109,11 @@ github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YH github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= -github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig/v3 v3.1.0/go.mod h1:ONGMf7UfYGAbMXCZmQLy8x3lCDIPrEZE/rU8pmrbihA= github.com/Masterminds/sprig/v3 v3.2.2 h1:17jRggJu518dr3QaafizSXOjKYp94wKfABxUmyxvxX8= github.com/Masterminds/sprig/v3 v3.2.2/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk= @@ -135,7 +124,6 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.7/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= @@ -146,7 +134,6 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdko github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.23.1/go.mod h1:XLH1GYJnLVE0XCr6KdJGVJRTwY30moWNJ4sERjXX6fs= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/Venafi/vcert/v4 v4.11.0/go.mod h1:OE+UZ0cj8qqVUuk0u7R4GIk4ZB6JMSf/WySqnBPNwws= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/a8m/expect v1.0.0/go.mod h1:4IwSCMumY49ScypDnjNbYEjgVeqy1/U2cEs3Lat96eA= @@ -165,16 +152,12 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 h1:AUNCr9CiJuwrRYS3XieqF+Z9B9gNxo/eANAJCF2eiN4= github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= -github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/aliyun/alibaba-cloud-sdk-go v1.61.751/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= -github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andygrunwald/go-gerrit v0.0.0-20190120104749-174420ebee6c/go.mod h1:0iuRQp6WJ44ts+iihy5E/WlPqfg5RNeQxOmzRkxCdtk= github.com/anexia-it/go-anxcloud v0.3.8/go.mod h1:cevqezsbOJ4GBlAWaztfLKl9w4VzxJBt4ipgHORi3gw= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apoydence/onpar v0.0.0-20200406201722-06f95a1c68e8/go.mod h1:maauOJD0kdDqIz4xmkunipFVbBoTM6pFSy0kkWBcIUY= @@ -189,22 +172,17 @@ github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:l github.com/asaskevich/govalidator v0.0.0-20200108200545-475eaeb16496/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535/go.mod h1:oGkLhpf+kjZl6xBf758TQhh5XrAeiJv/7FRz/2spLIg= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/ashanbrown/forbidigo v1.1.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= -github.com/ashanbrown/makezero v0.0.0-20210308000810-4155955488a0/go.mod h1:oG9Dnez7/ESBqc4EdrdNlryeo7d0KcW1ftXHm7nU/UU= github.com/aws/aws-k8s-tester v0.0.0-20190114231546-b411acf57dfe/go.mod h1:1ADF5tAtU1/mVtfMcHAYSm2fPw71DA7fFk0yed64/0I= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= github.com/aws/aws-sdk-go v1.16.18/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.23.20/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.25.37/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 v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.27.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.34.30/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/aws/aws-sdk-go v1.36.2/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= -github.com/aws/aws-sdk-go v1.36.30/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/bazelbuild/buildtools v0.0.0-20190917191645-69366ca98f89/go.mod h1:5JP0TXzWDHXv8qvxRC4InIazwdyDseBDbzESUMKk1yU= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -213,14 +191,11 @@ 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/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= github.com/brancz/gojsontoyaml v0.0.0-20190425155809-e8bd32d46b3d/go.mod h1:IyUJYN1gvWjtLF5ZuygmxbnsAyP3aJS6cHzIuZY50B0= github.com/briandowns/spinner v1.8.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/bwmarrin/snowflake v0.0.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE= -github.com/bytecodealliance/wasmtime-go v0.27.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -231,8 +206,6 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= -github.com/charithe/durationcheck v0.0.6/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= -github.com/chavacava/garif v0.0.0-20210405163807-87a70f3d418b/go.mod h1:Qjyv4H3//PWVzTeCezG2b9IRn6myJxJSr4TD/xo6ojU= 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= @@ -243,7 +216,6 @@ github.com/cloudevents/sdk-go v0.0.0-20190509003705-56931988abe3/go.mod h1:j1nZW github.com/cloudflare/cloudflare-go v0.13.2/go.mod h1:27kfc1apuifUmJhp069y0+hwlKDg4bd8LWlu7oKeZvM= 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/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -269,7 +241,6 @@ github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmf 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/go-systemd v0.0.0-20190620071333-e64a0ec8b42a/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= @@ -287,15 +258,12 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsr 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/cristim/ec2-instances-info v0.0.0-20201110114654-2dfcc09f67d4/go.mod h1:0yCjO4zBzlwWSGh/zGfW2Zq1NX605qCYVBHD1fPXKNs= -github.com/daixiang0/gci v0.2.8/go.mod h1:+4dZ7TISfSmqfAGv59ePaHfNzgGtIkHAhhdKggP1JAc= github.com/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= github.com/daviddengcn/go-colortext v0.0.0-20160507010035-511bcaf42ccd/go.mod h1:dv4zxwHi5C/8AeI+4gX4dCWOIvNi7I6JCSX0HvlKPgE= -github.com/denis-tingajkin/go-header v0.4.2/go.mod h1:eLRHAVXzE5atsKAnNRDB90WHCFFnBUn4RN0nRcs1LJA= github.com/denisenkom/go-mssqldb v0.0.0-20190111225525-2fea367d496d/go.mod h1:xN/JuLBIz4bjkxNmByTiV1IbhfnYb6oo99phBn4Eqhc= github.com/denisenkom/go-mssqldb v0.0.0-20191001013358-cfbb681360f0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= @@ -338,13 +306,9 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF 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.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= -github.com/esimonov/ifshort v1.0.2/go.mod h1:yZqNJUrNn20K8Q9n2CrjTKYyVEmX209Hgu+M1LBpeZE= github.com/etcd-io/gofail v0.0.0-20190801230047-ad7f989257ca/go.mod h1:49H/RkXP8pKaZy4h0d+NW16rSLhyVBt4o6VLJbmOqDE= -github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/evanphx/json-patch v0.0.0-20190203023257-5858425f7550/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.1.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= @@ -359,7 +323,6 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= @@ -370,8 +333,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo 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/fsouza/fake-gcs-server v0.0.0-20180612165233-e85be23bdaa8/go.mod h1:1/HufuJ+eaDf4KTnYdS6HJMGvMRU8d4cYTuu/1QaBbI= -github.com/fullstorydev/grpcurl v1.6.0/go.mod h1:ZQ+ayqbKMJNhzLmbpCiurTVlaK2M/3nqZCxaQ2Ze/sM= -github.com/fzipp/gocyclo v0.3.1/go.mod h1:DJHO6AUmbdqj2ET4Z9iArSuwWgYDRryYt2wASxc7x3E= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v0.0.0-20180820084758-c7ce16629ff4/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -381,7 +342,6 @@ github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aev 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-bindata/go-bindata v3.1.2+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= -github.com/go-critic/go-critic v0.5.6/go.mod h1:cVjj0DfqewQVIlIAGexPCaGaZDAqGE29PYDDADIVNEo= 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= @@ -404,7 +364,6 @@ github.com/go-logr/zapr v0.1.1/go.mod h1:tabnROwaDl0UNxkVeFRbY8bwB37GwRv0P8lg6aA github.com/go-logr/zapr v0.2.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= github.com/go-logr/zapr v0.3.0 h1:iyiCRZ29uPmbO7mWIjOEiYMXrTxZWTyK4tCatLyGpUY= github.com/go-logr/zapr v0.3.0/go.mod h1:qhKdvif7YF5GI9NWEpyxTSSBdGmzkNguibrdCNVPunU= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= @@ -469,7 +428,6 @@ github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8 github.com/go-openapi/spec v0.19.6/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.8/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/spec v0.19.15/go.mod h1:+81FIL1JwC5P3/Iuuozq3pPE9dXdIEGxFutcFKaVbmU= -github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= @@ -488,7 +446,6 @@ github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.7/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.9/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-openapi/swag v0.19.12/go.mod h1:eFdyEBkTdoAf/9RXBvj4cr1nH7GD8Kzo5HTt47gr72M= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/validate v0.17.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= @@ -503,7 +460,6 @@ github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvSc github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-redis/redis v6.15.8+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48/go.mod h1:dZGr0i9PLlaaTD4H/hoZIDjQ+r6xq8mgbRzHZf7f2J8= github.com/go-sql-driver/mysql v0.0.0-20160411075031-7ebe0a500653/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= @@ -517,17 +473,6 @@ github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr6 github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.7 h1:/VSMRlnY/JSyqxQUzQLKVMAskpY/NZKFA5j2P+0pP2M= github.com/go-test/deep v1.0.7/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= -github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ= -github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= -github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= -github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= -github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= @@ -564,7 +509,6 @@ github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY9 github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godror/godror v0.13.3/go.mod h1:2ouUT4kdhUBk7TAkHWD4SN0CdI0pgEQbo8FVHhbSKWg= -github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.0.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -579,7 +523,6 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v0.0.0-20210429001901-424d2337a529/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-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -598,7 +541,6 @@ github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71 github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v0.0.0-20181025225059-d3de96c4c28e/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 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= @@ -618,16 +560,6 @@ 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/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= -github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= -github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8= -github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= -github.com/golangci/golangci-lint v1.40.1/go.mod h1:OyFTr1muxaWeGTcHQcL3B7C4rETnDphTKYenZDgH2/g= -github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= -github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= -github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= -github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5/go.mod h1:LK+zW4MpyytAWQRz0M4xnzEk50lSvqDQKfx304apFkY= -github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= @@ -635,8 +567,6 @@ github.com/gomodule/redigo v1.7.0/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4E github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 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/certificate-transparency-go v1.0.21/go.mod h1:QeJfpSbVSfYc7RgB3gJFj9cbuQMMchQxrWXz8Ruopmg= -github.com/google/certificate-transparency-go v1.1.1/go.mod h1:FDKqPvSXawb2ecErVRrD+nfy23RCzyl7eqVCEmlT1Zs= 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= @@ -670,13 +600,10 @@ 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/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200507031123-427632fa3b1c/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-20201117184057-ae444373da19/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/trillian v1.3.11/go.mod h1:0tPraVHrSDkA3BO6vKX67zgLXs6SsOAbHEivX+9mPgw= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v0.0.0-20170306145142-6a5e28554805/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -696,13 +623,9 @@ github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1a github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1 h1:A8Yhf6EtqTv9RMsU6MQTyrtV1TjWlR6xU9BsZIwuTCM= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/gookit/color v1.3.8/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gophercloud/gophercloud v0.14.0/go.mod h1:VX0Ibx85B60B5XOrZr6kaNwrmPUzcmMpwxvQ1WQIIWM= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gordonklaus/ineffassign v0.0.0-20200309095847-7953dde2c7bf/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU= -github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254/go.mod h1:M9mZEtGIsR1oDaZagNPNG9iq9n2HrhZ17dsXk73V3Lw= -github.com/gorhill/cronexpr v0.0.0-20180427100037-88b0669f7d75/go.mod h1:g2644b03hfBX9Ov0ZBDgXXens4rxSxmqFBbhvKv2yVA= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/csrf v1.6.2/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= @@ -715,24 +638,13 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ github.com/gorilla/sessions v1.1.3/go.mod h1:8KCfur6+4Mqcc6S0FEfKuN15Vl5MgXW92AE8ovaJD0w= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE= -github.com/gostaticanalysis/analysisutil v0.1.0/go.mod h1:dMhHRU9KTiDcuLGdy87/2gTR8WruwYZrKdRq9m1O6uw= -github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0fRgmo1UgHDcbw7F5idXu0= -github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= -github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= -github.com/gostaticanalysis/forcetypeassert v0.0.0-20200621232751-01d4955beaa5/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= -github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20181110185634-c63ab54fda8f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/gregjones/httpcache v0.0.0-20190212212710-3befbb6ad0cc/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= -github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v0.0.0-20190222133341-cfaf5686ec79/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 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.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-prometheus v0.0.0-20170330212424-2500245aa611/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.3.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= @@ -740,7 +652,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.4.1/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpg github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 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.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/grpc-ecosystem/grpc-gateway v1.15.2/go.mod h1:vO11I9oWA+KsxmfFQPhLnnIb1VDE24M+pdxZFiuZcA8= github.com/h2non/gock v1.0.9/go.mod h1:CZMcB0Lg5IWnr9bF79pPMg9WeV6WumxQiUJ1UvdO1iE= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= @@ -757,7 +668,6 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= @@ -790,8 +700,6 @@ github.com/hetznercloud/hcloud-go v1.23.1/go.mod h1:xng8lbDUg+xM1dgc0yGHX5EeqbwI github.com/hetznercloud/hcloud-go v1.25.0/go.mod h1:2C5uMtBiMoFr3m7lBFPf7wXTdh33CevmZpQIIDPGYJI= github.com/howeyc/gopass v0.0.0-20170109162249-bf9dde6d0d2c/go.mod h1:lADxMC39cJJqL93Duh1xhAs4I2Zs8mKS89XWXFGp9cs= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= -github.com/huandu/xstrings v1.2.0/go.mod h1:DvyZB1rfVYsBIigL8HwpZgxHwXozlTgGqn63UyNX5k4= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -800,7 +708,6 @@ github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5N 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.0.0-20171009183408-7fe0c75c13ab/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= @@ -821,22 +728,16 @@ github.com/jedib0t/go-pretty v4.3.0+incompatible/go.mod h1:XemHduiw8R651AF9Pt4Fw github.com/jenkins-x/go-scm v1.5.65/go.mod h1:MgGRkJScE/rJ30J/bXYqduN5sDPZqZFITJopsnZmTOw= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jetstack/cert-manager v1.1.0/go.mod h1:GULIHTGjSc2LjlgBCLhQ8u5WmQ95hk9FAiQbhjMthMk= -github.com/jgautheron/goconst v1.4.0/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= -github.com/jhump/protoreflect v1.6.1/go.mod h1:RZQ/lnuN+zqeRVpQigTwO6o0AJUkxbnSnpuG7toUTG4= -github.com/jingyugao/rowserrcheck v0.0.0-20210315055705-d907ca737bb1/go.mod h1:TOQpc2SLx6huPfoFGK3UOnEG+u02D3C1GeosjupAKCA= github.com/jinzhu/gorm v0.0.0-20170316141641-572d0a0ab1eb/go.mod h1:Vla75njaFJ8clLU1W44h34PjIkijhjHIYnZxMqCdxqo= github.com/jinzhu/inflection v0.0.0-20190603042836-f5c5f50e6090/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.0.0-20141017032234-72f9bd7c4e0c/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jonboulle/clockwork v0.2.0/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= 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= @@ -854,11 +755,8 @@ github.com/jsonnet-bundler/jsonnet-bundler v0.1.0/go.mod h1:YKsSFc9VFhhLITkJS3X2 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/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= 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/julz/importas v0.0.0-20210419104244-841f0c0fe66d/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k8snetworkplumbingwg/network-attachment-definition-client v0.0.0-20191119172530-79f836b90111/go.mod h1:MP2HbArq3QT+oVp8pmtHNZnSnkhdkHtDnc7h6nJXmBU= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= @@ -868,12 +766,9 @@ github.com/kinvolk/container-linux-config-transpiler v0.9.1 h1:LIv3RCbjdFhXn/Fg4 github.com/kinvolk/container-linux-config-transpiler v0.9.1/go.mod h1:pjTzCvFfbXjWuMVNFjA9FdbsdmruK6+vki0hK0lDmnU= 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.6.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/pgzip v1.2.1/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knative/build v0.1.2/go.mod h1:/sU74ZQkwlYA5FwYDJhYTy61i/Kn+5eWfln2jDbw3Qo= @@ -897,26 +792,16 @@ github.com/kubermatic/machine-controller v1.23.1/go.mod h1:mXWbT7SjqpgFhzCFT3yME github.com/kubermatic/machine-controller v1.26.0/go.mod h1:dcJ+GdDSCxCwM0poxwOK8hVO7epiOORDmNMmb2veyw4= github.com/kubermatic/machine-controller v1.36.1 h1:6O8HhUiUPHXSKyXp8OMQ7AhxILGnIMJU05hPtZuVazM= github.com/kubermatic/machine-controller v1.36.1/go.mod h1:6BFZEvEMZi8OT8aHOsS7DXYsF6ZSpmsNxsci7OLTTn8= -github.com/kulti/thelper v0.4.0/go.mod h1:vMu2Cizjy/grP+jmsvOFDx1kYP6+PD1lqg4Yu5exl2U= -github.com/kunwardeep/paralleltest v1.0.2/go.mod h1:ZPqNm1fVHPllh5LPVujzbVz1JN2GhLxSfY+oqUsvG30= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= -github.com/ldez/gomoddirectives v0.2.1/go.mod h1:sGicqkRgBOg//JfpXwkB9Hj0X5RyJ7mlACM5B9f6Me4= -github.com/ldez/tagliatelle v0.2.0/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/letsencrypt/pkcs11key/v4 v4.0.0/go.mod h1:EFUvBDay26dErnNb70Nd0/VW3tJiIbETBPTl9ATXQag= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.1-0.20191011153232-f91d3411e481/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.8.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.9.0/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linode/linodego v0.24.0/go.mod h1:GSBKPpjoQfxEfryoCRcgkuUOCuVtGHWhzI8OMdycNTE= github.com/lithammer/dedent v1.1.0/go.mod h1:jrXYCQtgg0nJiN+StA2KgR7w6CiQNv9Fd/Z9BP0jIOc= -github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= 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= @@ -930,11 +815,9 @@ github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7 github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/maratori/testpackage v1.0.1/go.mod h1:ddKdw+XG0Phzhx8BFDTKgpWP4i7MpApTE5fXSKAqwDU= github.com/markbates/inflect v1.0.4/go.mod h1:1fR9+pO2KHEO9ZRtto13gDwwZaAKstQzferVeWqbgNs= github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= -github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= github.com/mattbaird/jsonpatch v0.0.0-20171005235357-81af80346b1a/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -945,7 +828,6 @@ github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.6/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -954,34 +836,23 @@ github.com/mattn/go-runewidth v0.0.0-20181025052659-b20a3daf6a39/go.mod h1:LwmH8 github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.5/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-sqlite3 v0.0.0-20160514122348-38ee283dabf1/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-sqlite3 v1.12.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/mattn/go-zglob v0.0.1/go.mod h1:9fxibJccNxU2cnpIKLRRFA7zX7qhkJIQWBb449FYHOo= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.0/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 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= github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= -github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.0.6/go.mod h1:Lj5gIVxjBlH8REa3icEOkdfchwYc291nShzZ4QYWyMo= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/miekg/pkcs11 v1.0.2/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/minio-go v6.0.14+incompatible/go.mod h1:7guKYtitv8dktvNUGrhzmNlA5wrAABTQXCoesZdFQO8= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= @@ -994,7 +865,6 @@ github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= @@ -1006,22 +876,15 @@ github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lN github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mozilla/scribe v0.0.0-20180711195314-fb71baf557c1/go.mod h1:FIczTrinKo8VaLxe6PWTPEXRXDIHz2QAwiaBaP5/4a8= -github.com/mozilla/tls-observatory v0.0.0-20210209181001-cf43108d6880/go.mod h1:FUqVoUPHSEdDR0MnFM3Dh8AU0pZHLXUD127SAJGER/s= github.com/munnerz/crd-schema-fuzz v1.0.0/go.mod h1:4z/rcm37JxUkSsExFcLL6ZIT1SgDRdLiu7qq1evdVS0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= -github.com/mwitkow/go-proto-validators v0.2.0/go.mod h1:ZfA1hW+UH/2ZHOWvQ3HnQaU0DtnpXu850MZiy+YUgcc= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= -github.com/nakabonne/nestif v0.3.0/go.mod h1:dI314BppzXjJ4HsCnbo7XzrJHPszZsjnk5wEBSYHI2c= github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk= github.com/nats-io/gnatsd v1.4.1/go.mod h1:nqco77VO78hLCJpIcVfygDP2rPGfsEHkGTUk94uh5DQ= github.com/nats-io/go-nats v1.7.0/go.mod h1:+t7RHT5ApZebkrQdnn6AhQJmhJJiKAvJUio1PiiCtj0= @@ -1035,14 +898,10 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.0/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms= -github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= github.com/nelsam/hel v0.0.0-20200611165952-2d829bae0c66/go.mod h1:Rl/hm4V2s75ScsPmI9cNz87HLNg5MoFAMJwA90fzbkw= github.com/nelsam/hel/v2 v2.3.2/go.mod h1:1ZTGfU2PFTOd5mx22i5O0Lc2GY933lQ2wb/ggy+rL3w= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nishanths/exhaustive v0.1.0/go.mod h1:S1j9110vxV1ECdCudXRkeMnFQ/DQk9ajLT0Uf2MYZQQ= -github.com/nishanths/predeclared v0.0.0-20190419143655-18a43bb90ffc/go.mod h1:62PewwiQTlm/7Rj+cxVYqZvDIUc+JjZq6GHAC1fsObQ= -github.com/nishanths/predeclared v0.2.1/go.mod h1:HvkGJcA3naj4lOwnFXFDkFxVtSqQMB9sbB1usJ+xjQE= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= @@ -1054,14 +913,12 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2/go.mod h1:rSAaSIOAGT9odnlyGlUfAJaoc5w2fSBUmeGDbRWPxyQ= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.4.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/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.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= @@ -1086,13 +943,10 @@ github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWEr github.com/open-policy-agent/cert-controller v0.0.0-20200921224206-24b87bbc4b6e/go.mod h1:/y33mmiq3Cc0N+6cickevrLI/iBbWcUwcEVjSKHA0z0= github.com/open-policy-agent/frameworks/constraint v0.0.0-20200929072634-d96896eff389/go.mod h1:Dr3QxvH+NTQcPPZWSt1ueNOsxW4VwgUltaLL7Ttnrac= github.com/open-policy-agent/frameworks/constraint v0.0.0-20201118071520-0d37681951a4/go.mod h1:vvhkBONv7Uah2fvS/bQ/N1u0rSLvxZOs2ErR6m+4QtQ= -github.com/open-policy-agent/frameworks/constraint v0.0.0-20210802220920-c000ec35322e h1:InUyRqjCWxxUHVNVpUcEIKd+YTRxfiUBMYe+NV0f4TI= -github.com/open-policy-agent/frameworks/constraint v0.0.0-20210802220920-c000ec35322e/go.mod h1:yyVeZWP50/M0U8uxdthjT6TE+xTtIM6/TVLGZ5L1Wmw= github.com/open-policy-agent/gatekeeper v0.0.0-20201111000257-4450f08fa95e/go.mod h1:IseSnWz7MX7IhEpZ4CLhA3NrMazc+T6a5rtSq9pOEc4= github.com/open-policy-agent/opa v0.19.1/go.mod h1:rrwxoT/b011T0cyj+gg2VvxqTtn6N3gp/jzmr3fjW44= github.com/open-policy-agent/opa v0.21.0/go.mod h1:cZaTfhxsj7QdIiUI0U9aBtOLLTqVNe+XE60+9kZKLHw= github.com/open-policy-agent/opa v0.24.0/go.mod h1:qEyD/i8j+RQettHGp4f86yjrjvv+ZYia+JHCMv2G7wA= -github.com/open-policy-agent/opa v0.29.4/go.mod h1:ZCOTD3yyFR8JvF8ETdWdiSPn9WcF1dXeQWOv7VoPorU= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= @@ -1132,7 +986,6 @@ github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bA github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/peterh/liner v0.0.0-20170211195444-bf27d3ba8e1d/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= -github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= @@ -1147,7 +1000,6 @@ github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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/polyfloyd/go-errorlint v0.0.0-20210418123303-74da32850375/go.mod h1:wi9BfjxjF/bwiZ701TzmfKu6UKC357IOAtNr0Td0Lvw= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/poy/onpar v0.0.0-20200406201722-06f95a1c68e8/go.mod h1:nSbFQvMj97ZyhFRSJYtut+msi4sOY6zJDGCdSc+/rZU= github.com/poy/onpar v1.0.1/go.mod h1:6X8FLNoxyr9kkmnlqpK6LSoiOtrO6MICtWwEuWkLjzg= @@ -1208,20 +1060,9 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/prometheus v2.3.2+incompatible/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/prometheus/tsdb v0.8.0/go.mod h1:fSI0j+IUQrDd7+ZtR9WKIGtoYAYAJUKcKhYLG25tN4g= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI= -github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.4/go.mod h1:57FZgMnoo6jqxkYKmVj5Fc8vOt0rVzoE/UNAmFFIPqA= -github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/dsl v0.3.2/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20201231183845-9e62ed36efe1/go.mod h1:7JTjp89EGyU1d6XfBiXihJNG37wB2VRkd125Q1u7Plc= -github.com/quasilyte/go-ruleguard/rules v0.0.0-20210203162857-b223e0831f88/go.mod h1:4cgAphtvu7Ftv7vOT2ZOYhC6CvBxZixcasr8qIOTA50= -github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20190706150252-9beb055b7962/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20200313005456-10cdbea86bc0/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -1231,39 +1072,30 @@ github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtISeXco0L5PKQ= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/rwcarlsen/goexif v0.0.0-20190401172101-9e8deecbddbd/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk= -github.com/ryancurrah/gomodguard v1.2.0/go.mod h1:rNqbC4TOIdUDcVMSIpNNAzTbzXAZa6W5lnUepvuMMgQ= -github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/go-glob v1.0.0/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanposhiho/wastedassign v1.0.0/go.mod h1:LGpq5Hsv74QaqM47WtIsRSF/ik9kqk07kchgv66tLVE= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7/go.mod h1:CJJ5VAbozOl0yEw7nHB9+7BXTJbIn6h7W+f6Gau5IP8= github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/securego/gosec/v2 v2.7.0/go.mod h1:xNbGArrGUspJLuz3LS5XCY1EBW/0vABAl/LWfSklmiM= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sethvargo/go-password v0.2.0 h1:BTDl4CC/gjf/axHMaDQtw507ogrXLci6XRiLc7i/UHI= github.com/sethvargo/go-password v0.2.0/go.mod h1:Ym4Mr9JXLBycr02MFuVQ/0JHidNetSgbzutTr3zsYXE= -github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= -github.com/shirou/gopsutil/v3 v3.21.4/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/githubv4 v0.0.0-20180925043049-51d7b505e2e9/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/githubv4 v0.0.0-20190718010115-4ba037080260/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/githubv4 v0.0.0-20191102174205-af46314aec7b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= -github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= github.com/shurcooL/graphql v0.0.0-20180924043259-e4a3a37e6d42/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/graphql v0.0.0-20181231061246-d48a9a75455f/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -1283,9 +1115,7 @@ github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:s github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.3/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= 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= @@ -1315,9 +1145,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.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= -github.com/ssgreg/nlreturn/v2 v2.1.0/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stormcat24/protodep v0.0.0-20200505140716-b02c9ba62816/go.mod h1:mBd5PI4uI6NkqJpCyiWiYzWyTFs4QRDss/JTMC2b4kc= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= @@ -1327,8 +1155,6 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ 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 v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.1.4/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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= @@ -1337,46 +1163,29 @@ 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/tdakkota/asciicheck v0.0.0-20200416200610-e657995f937b/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= github.com/tektoncd/pipeline v0.10.1/go.mod h1:D2X0exT46zYx95BU7ByM8+erpjoN7thmUBvlKThOszU= github.com/tektoncd/plumbing v0.0.0-20191216083742-847dcf196de9/go.mod h1:QZHgU07PRBTRF6N57w4+ApRu8OgfYLFNqCDlfEZaD9Y= github.com/tektoncd/plumbing/pipelinerun-logs v0.0.0-20191206114338-712d544c2c21/go.mod h1:S62EUWtqmejjJgUMOGB1CCCHRp6C706laH06BoALkzU= github.com/testcontainers/testcontainers-go v0.9.0/go.mod h1:b22BFXhRbg4PJmeMVWh6ftqjyZHgiIl3w274e9r3C2E= -github.com/tetafro/godot v1.4.6/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/timakin/bodyclose v0.0.0-20200424151742-cb6215831a94/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/tinkerbell/tink v0.0.0-20210315140655-1b178daeaeda/go.mod h1:s4k7CORR0OMWd4cYwBqNBFPSJZhnSQxeKdDtMa/aspk= -github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= -github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= 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/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tomarrell/wrapcheck/v2 v2.1.0/go.mod h1:crK5eI4RGSUrb9duDTQ5GqcukbKZvi85vX6nbhsBAeI= -github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce/go.mod h1:o8v6yHRoik09Xen7gje4m9ERNah1d1PPsVq1VEx9vE4= -github.com/tommy-muehle/go-mnd/v2 v2.3.2/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= github.com/toqueteos/webbrowser v1.2.0/go.mod h1:XWoZq4cyp9WeUeak7w7LXRUQf1F1ATJMir8RTqb4ayM= github.com/ugorji/go v1.1.1/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= -github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli v1.18.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.4/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.16.0/go.mod h1:YOKImeEosDdBPnxc0gy7INqi3m1zK6A+xl6TwOBhHCA= -github.com/valyala/quicktemplate v1.6.3/go.mod h1:fwPzK2fHuYEODzJ9pkw0ipCPNHZ2tD5KW4lOuSdPKzY= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= github.com/vdemeester/k8s-pkg-credentialprovider v0.0.0-20200107171650-7c61ffa44238/go.mod h1:JwQJCMWpUDqjZrB5jpw0f5VbN7U95zxFy1ZDpoEarGo= github.com/vdemeester/k8s-pkg-credentialprovider v1.13.12-1/go.mod h1:Fko0rTxEtDW2kju5Ky7yFJNS3IcNvW8IPsp4/e9oev0= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= -github.com/viki-org/dnscache v0.0.0-20130720023526-c70c1f23c5d8/go.mod h1:dniwbG03GafCjFohMDmz6Zc6oCuiqgH6tGNyXTkHzXE= github.com/vincent-petithory/dataurl v0.0.0-20160330182126-9a301d65acbb/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50 h1:uxE3GYdXIOfhMv3unJKETJEhw78gvzuQqRX/rVirc2A= github.com/vincent-petithory/dataurl v0.0.0-20191104211930-d1553a71de50/go.mod h1:FHafX5vmDzyP+1CQATJn7WFKc9CvnvxyvZy6I1MrG/U= @@ -1387,17 +1196,11 @@ github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0B github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= github.com/xdg/stringprep v0.0.0-20180714160509-73f8eece6fdc/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xiang90/probing v0.0.0-20160813154853-07dd2e8dfe18/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/handysort v0.0.0-20150421192137-fb3537ed64a1/go.mod h1:QcJo0QPSfTONNIgpN5RA8prR7fF8nkF6cTWTcNerRO8= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yashtewari/glob-intersection v0.0.0-20180916065949-5c77d914dd0b/go.mod h1:HptNXiXVDcJjXe9SqMd0v2FsL9f8dz4GnXgltU6q/co= -github.com/yeya24/promlinter v0.1.0/go.mod h1:rs5vtZzeBHqqMwXqFScncpCF6u06lezhZepno9AB1Oc= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= 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= @@ -1407,11 +1210,9 @@ github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wK go.etcd.io/bbolt v1.3.1-etcd.7/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 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.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20181031231232-83304cfc808c/go.mod h1:weASp41xM3dk0YHg1s/W8ecdGP5G4teSTMBPpYAaUgA= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.0.0-20200513171258-e048e166ab9c/go.mod h1:xCI7ZzBfRuGgBXyXO6yfWfDmlWd35khcWpUa4L0xI/k= go.etcd.io/etcd v0.5.0-alpha.5.0.20200819165624-17cef6e3e9d5/go.mod h1:skWido08r9w6Lq/w70DO5XYIKMu4QFu1+4VsqLQuJy8= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.etcd.io/etcd/v3 v3.3.0-rc.0.0.20200728214110-6c81b20ec8de/go.mod h1:UENlOa05tkNvLx9VnNziSerG4Ro74upGK6Apd4v6M/Y= @@ -1422,7 +1223,6 @@ go.mongodb.org/mongo-driver v1.3.0/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS go.mongodb.org/mongo-driver v1.3.4/go.mod h1:MSWZXKOynuguX+JSvwP8i+58jYCXxbia8HS3gZBapIE= go.mongodb.org/mongo-driver v1.3.5/go.mod h1:Ual6Gkco7ZGQw8wE1t4tLnvBsf6yVSM60qW6TgOeJ5c= go.mongodb.org/mongo-driver v1.4.3/go.mod h1:WcMNYLx/IlOxLe6JRJiv2uXuCz6zBLndR4SoGjYphSc= -go.mozilla.org/mozlog v0.0.0-20170222151521-4bb13139d403/go.mod h1:jHoPAGnDrCy6kaI2tAze5Prf0Nr0w/oNkROt2lw3n3o= go.opencensus.io v0.17.0/go.mod h1:mp1VrMQxhlqqDpKvH4UcQUa4YwlzNmymAjPrDdfxNpI= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= @@ -1440,13 +1240,11 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= 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 v0.0.0-20180122172545-ddea229ff1df/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1463,7 +1261,6 @@ go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go4.org v0.0.0-20200104003542-c7e774b10ea0/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= go4.org v0.0.0-20201209231011-d4a079459e60 h1:iqAGo78tVOJXELHQFRjR6TMwItrvXH4hrGJ32I/NFF8= go4.org v0.0.0-20201209231011-d4a079459e60/go.mod h1:CIiUVy99QCPfoE13bO4EZaz5GZMZXMSBGhxRdsvzbkg= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180608092829-8ac0e0d97ce4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181015023909-0c41d7ab0a0e/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -1498,7 +1295,6 @@ golang.org/x/crypto v0.0.0-20200709230013-948cd5f35899/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83 h1:/ZScEX8SfEmUGRHs0gxpqteO5nfNW6axyZbBdw9A12g= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1515,7 +1311,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= 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-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1542,7 +1337,6 @@ 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.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= @@ -1585,7 +1379,6 @@ 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-20200421231249-e086a090c8fd/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= @@ -1603,8 +1396,6 @@ golang.org/x/net v0.0.0-20201026091529-146b70c837a4/go.mod h1:sp8m0HH+o8qH0wwXwY 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-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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -1676,7 +1467,6 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190927073244-c990c680b611/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-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1696,13 +1486,11 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w 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-20200420163511-1957bb5e6d1f/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-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1717,8 +1505,6 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w 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-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210228012217-479acdf4ea46/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1738,37 +1524,29 @@ golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5f 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-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/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-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180810170437-e96c4e24768d/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/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-20181011042414-1f849cf54d09/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-20190110163146-51295c7ec13a/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-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/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-20190307163923-6a08e3108db3/go.mod h1:25r3+/G6/xytQM8iWZKq3Hn0kr0rgFKPUNVEL/dr3z4= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/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-20190321232350-e250d351ecad/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190329151228-23e29df326fe/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190416151739-9c9e1878f421/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1787,14 +1565,11 @@ golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDq golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190807223507-b346f7fd45de/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/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-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190930201159-7c411dea38b0/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191004055002-72853e10c5a3/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191010075000-0337d82405ff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191010171213-8abd42400456/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-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1813,7 +1588,6 @@ golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200115165105-de0b1760071a/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-20200117220505-0cba7a3a9ee9/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= @@ -1824,12 +1598,7 @@ golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapK 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-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200324003944-a576cf524670/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200414032229-332987a829c3/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200422022333-3d57cf2e726e/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200426102838-f3a5411a4c3b/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 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= @@ -1837,41 +1606,19 @@ golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200616195046-dc31b401abb5/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-20200622203043-20e05c1c8ffa/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200624225443-88f3c62a19ff/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200625211823-6506e20df31f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200626171337-aa94e735be7f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200630154851-b2d8b0336632/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200706234117-b22de6825cf7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200717024301-6ddee64345a6/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 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-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201017001424-6003fad69a88/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201030143252-cf7a54d06671/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201105220310-78b158585360/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210101214203-2dba1e4ea05c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210104081019-d8d6ddbec6ee/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.2-0.20210512205948-8287d5da45e4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= 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= @@ -1921,12 +1668,10 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID 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-20170731182057-09f6ed296fc6/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20170818010345-ee236bd376b0/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180608181217-32ee49c4dd80/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181016170114-94acd270e44e/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/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-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1938,7 +1683,6 @@ google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98 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-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 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= @@ -1953,15 +1697,12 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG 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-20200626011028-ee7919e894b5/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200707001353-8e8330bf89df/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 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= @@ -1973,8 +1714,6 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D 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-20201203001206-6486ece9c497/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.13.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.15.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= @@ -1995,7 +1734,6 @@ google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 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.0/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 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= @@ -2003,7 +1741,6 @@ google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.32.0/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.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= @@ -2028,7 +1765,6 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8 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/cheggaaa/pb.v1 v1.0.28/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/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= @@ -2074,7 +1810,6 @@ 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.6/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= @@ -2280,10 +2015,6 @@ modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk= modernc.org/mathutil v1.0.0/go.mod h1:wU0vUrJsVWBZ4P6e7xtFJEhFSNsfRLJ8H458uRjg03k= modernc.org/strutil v1.0.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= -mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48= -mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= -mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= -mvdan.cc/unparam v0.0.0-20210104141923-aac4ce9116a7/go.mod h1:hBpJkZE8H/sb+VRFvw2+rBpHNsTBcvSpk61hr8mzXZE= mvdan.cc/xurls/v2 v2.0.0/go.mod h1:2/webFPYOXN9jp/lzuj0zuAVlF+9g4KPFJANH1oJhRU= pack.ag/amqp v0.11.0/go.mod h1:4/cbmt4EJXSKlG6LCfWHoqmN0uFdy5i/+YFz+fTfhV4= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= @@ -2292,7 +2023,6 @@ rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.7/go.mod h1:PHgbrJT7lCHcxMU+mDHEm+nx46H4zuuHZkDP6icnhu0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.9/go.mod h1:dzAXnQbTRyDlZPJX2SUPEqvnB+j7AJjtlox7PEwigU0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= sigs.k8s.io/controller-runtime v0.3.0/go.mod h1:Cw6PkEg0Sa7dAYovGT4R0tRkGhHXpYijwNxYhAnAZZk= sigs.k8s.io/controller-runtime v0.4.0/go.mod h1:ApC79lpY3PHW9xj/w9pj+lYkLgwAAUZwfXkME1Lajns= sigs.k8s.io/controller-runtime v0.6.1/go.mod h1:XRYBPdbf5XJu9kpS84VJiZ7h/u1hF3gEORz0efEja7A= diff --git a/hack/run-operating-system-manager.sh b/hack/run-operating-system-manager.sh index 0963f882..5aa3e85a 100755 --- a/hack/run-operating-system-manager.sh +++ b/hack/run-operating-system-manager.sh @@ -23,6 +23,6 @@ OSM_KUBECONFIG=${MC_KUBECONFIG:-$(dirname $0)/../.kubeconfig} rm -rf $(dirname $0)/../_build/ make -C $(dirname $0)/.. build $(dirname $0)/../_build/osm-controller \ - -kubeconfig=$OSM_KUBECONFIG \ + -worker-cluster-kubeconfig=$OSM_KUBECONFIG \ -namespace=cloud-init-settings \ - -worker-count=50 + -worker-count=50 \ No newline at end of file diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 78a62750..1ed29d81 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -26,9 +26,7 @@ echodate "Creating vendor directory" go mod vendor chmod +x vendor/k8s.io/code-generator/generate-groups.sh -# -trimpath would cause the code generation to fail, so undo the -# Makefile's value and also force mod=readonly here -export "GOFLAGS=-mod=readonly" +export "GOFLAGS=-mod=vendor" echodate "Generating osm:v1alpha1" ./vendor/k8s.io/code-generator/generate-groups.sh deepcopy \ diff --git a/hack/update-crds-openapi.sh b/hack/update-crds-openapi.sh index d3f26486..9681d4a7 100755 --- a/hack/update-crds-openapi.sh +++ b/hack/update-crds-openapi.sh @@ -27,6 +27,6 @@ go mod vendor echodate "Generating OpenAPI 3 schema for CRDs" go run sigs.k8s.io/controller-tools/cmd/controller-gen \ - schemapatch:manifests=./charts/crd \ - output:dir=./charts/crd \ + schemapatch:manifests=./deploy/crd \ + output:dir=./deploy/crd \ paths=./pkg/crd/... diff --git a/hack/verify-crds-openapi.sh b/hack/verify-crds-openapi.sh index 7ecbd8a5..814725ff 100755 --- a/hack/verify-crds-openapi.sh +++ b/hack/verify-crds-openapi.sh @@ -20,8 +20,8 @@ cd $(dirname $0)/.. source hack/lib.sh TEMPDIR=_tmp -DIFFROOT="charts/crd" -TMP_DIFFROOT="$TEMPDIR/charts/crd" +DIFFROOT="deploy/crd" +TMP_DIFFROOT="$TEMPDIR/deploy/crd" cleanup() { rm -rf "$TEMPDIR" diff --git a/pkg/admission/admission.go b/pkg/admission/admission.go new file mode 100644 index 00000000..faabbae2 --- /dev/null +++ b/pkg/admission/admission.go @@ -0,0 +1,134 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "time" + + "github.com/pkg/errors" + + admissionv1 "k8s.io/api/admission/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/klog/v2" + ctrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +type admissionData struct { + client ctrlruntimeclient.Client + namespace string +} + +func New(listenAddress, namespace string, client ctrlruntimeclient.Client) (*http.Server, error) { + mux := http.NewServeMux() + ad := &admissionData{ + client: client, + namespace: namespace, + } + + mux.HandleFunc("/machinedeployment", handleFuncFactory(ad.validateMachineDeployments)) + mux.HandleFunc("/operatingsystemprofile", handleFuncFactory(ad.validateOperatingSystemProfiles)) + mux.HandleFunc("/operatingsystemconfig", handleFuncFactory(ad.validateOperatingSystemConfigs)) + mux.HandleFunc("/healthz", healthZHandler) + + return &http.Server{ + Addr: listenAddress, + Handler: http.TimeoutHandler(mux, 25*time.Second, "timeout"), + }, nil +} + +func healthZHandler(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) +} + +func createAdmissionResponse(resp bool) *admissionv1.AdmissionResponse { + return &admissionv1.AdmissionResponse{ + Allowed: resp, + } +} + +type validator func(admissionv1.AdmissionRequest) (*admissionv1.AdmissionResponse, error) + +func handleFuncFactory(validate validator) func(http.ResponseWriter, *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + review, err := readReview(r) + if err != nil { + klog.Warningf("invalid admission review: %v", err) + + // proper AdmissionReview responses require metadata that is not available + // in broken requests, so we return a basic failure response + w.WriteHeader(http.StatusBadRequest) + if _, err := w.Write([]byte(fmt.Sprintf("invalid request: %v", err))); err != nil { + klog.Errorf("failed to write badRequest: %v", err) + } + return + } + + // run the validation logic + response, err := validate(*review.Request) + if err != nil { + response = &admissionv1.AdmissionResponse{} + response.Result = &metav1.Status{Message: err.Error()} + } + response.UID = review.Request.UID + + resp, err := json.Marshal(&admissionv1.AdmissionReview{ + TypeMeta: metav1.TypeMeta{ + APIVersion: admissionv1.SchemeGroupVersion.String(), + Kind: "AdmissionReview", + }, + Response: response, + }) + if err != nil { + klog.Errorf("failed to marshal admissionResponse: %v", err) + return + } + + if _, err := w.Write(resp); err != nil { + klog.Errorf("failed to write admissionResponse: %v", err) + } + } +} + +func readReview(r *http.Request) (*admissionv1.AdmissionReview, error) { + var body []byte + if r.Body == nil { + return nil, fmt.Errorf("request has no body") + } + body, err := ioutil.ReadAll(r.Body) + if err != nil { + return nil, fmt.Errorf("error reading data from request body: %v", err) + } + + // verify the content type is accurate + if contentType := r.Header.Get("Content-Type"); contentType != "application/json" { + return nil, fmt.Errorf("header Content-Type was %s, expected application/json", contentType) + } + + admissionReview := &admissionv1.AdmissionReview{} + if err := json.Unmarshal(body, admissionReview); err != nil { + return nil, fmt.Errorf("failed to unmarshal request into admissionReview: %v", err) + } + if admissionReview.Request == nil { + return nil, errors.New("invalid admission review: no request defined") + } + + return admissionReview, nil +} diff --git a/pkg/admission/machinedeployments.go b/pkg/admission/machinedeployments.go new file mode 100644 index 00000000..0c7414aa --- /dev/null +++ b/pkg/admission/machinedeployments.go @@ -0,0 +1,39 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "encoding/json" + "fmt" + + clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" + + admissionv1 "k8s.io/api/admission/v1" +) + +func (ad *admissionData) validateMachineDeployments(ar admissionv1.AdmissionRequest) (*admissionv1.AdmissionResponse, error) { + machineDeployment := clusterv1alpha1.MachineDeployment{} + if err := json.Unmarshal(ar.Object.Raw, &machineDeployment); err != nil { + return nil, fmt.Errorf("failed to unmarshal: %v", err) + } + + if errs := ValidateMachineDeployment(machineDeployment, ad.client, ad.namespace); len(errs) > 0 { + return nil, fmt.Errorf("validation failed: %v", errs) + } + + return createAdmissionResponse(true), nil +} diff --git a/pkg/admission/machinedeployments_test.go b/pkg/admission/machinedeployments_test.go new file mode 100644 index 00000000..61686338 --- /dev/null +++ b/pkg/admission/machinedeployments_test.go @@ -0,0 +1,179 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" + clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" + providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types" + "k8c.io/operating-system-manager/pkg/controllers/osc/resources" + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + fakectrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client/fake" +) + +func TestMachineDeploymentValidation(t *testing.T) { + scheme := runtime.NewScheme() + _ = osmv1alpha1.AddToScheme(scheme) + _ = clusterv1alpha1.AddToScheme(scheme) + + osp := getOperatingSystemProfile() + fakeClient := fakectrlruntimeclient. + NewClientBuilder(). + WithScheme(scheme). + WithObjects(osp). + Build() + + ad := admissionData{ + client: fakeClient, + namespace: "default", + } + + tests := []struct { + name string + machineDeployment clusterv1alpha1.MachineDeployment + expectedError string + }{ + { + name: "MachineDeployment with no OSP annotation", + machineDeployment: generateMachineDeployment(t, "", "ubuntu", "aws"), + expectedError: "[]", + }, + { + name: "MachineDeployment with non-existing OSP specified", + machineDeployment: generateMachineDeployment(t, "invalid", "ubuntu", "aws"), + expectedError: `[spec.template.spec.providerSpec.OperatingSystem: Invalid value: "ubuntu": OperatingSystemProfile does not support the OperatingSystem specified in MachineDeployment spec.template.spec.providerSpec.CloudProvider: Invalid value: "aws": OperatingSystemProfile does not support the CloudProvider specified in MachineDeployment]`, + }, + { + name: "MachineDeployment with in-compatible OS", + machineDeployment: generateMachineDeployment(t, "ubuntu", "sles", "aws"), + expectedError: `[spec.template.spec.providerSpec.OperatingSystem: Invalid value: "sles": OperatingSystemProfile does not support the OperatingSystem specified in MachineDeployment]`, + }, + { + name: "MachineDeployment with in-compatible cloud provider", + machineDeployment: generateMachineDeployment(t, "ubuntu", "ubuntu", "azure"), + expectedError: `[spec.template.spec.providerSpec.CloudProvider: Invalid value: "azure": OperatingSystemProfile does not support the CloudProvider specified in MachineDeployment]`, + }, + { + name: "MachineDeployment with compatible OS and cloud provider", + machineDeployment: generateMachineDeployment(t, "ubuntu", "ubuntu", "aws"), + expectedError: "[]", + }, + } + for _, tc := range tests { + tc := tc // scopelint fix + t.Run(tc.name, func(t *testing.T) { + errs := ValidateMachineDeployment(tc.machineDeployment, ad.client, ad.namespace) + if errs != nil && len(tc.expectedError) == 0 { + t.Errorf("didn't expect err but got %v", errs) + return + } + if errs == nil && len(tc.expectedError) > 0 { + t.Errorf("expected err %v but got valid response", tc.expectedError) + return + } + if errs != nil && tc.expectedError != fmt.Sprintf("%v", errs) { + t.Errorf("actual error %v didn't match expected error %v", errs, tc.expectedError) + return + } + }) + } +} + +func getOperatingSystemProfile() *osmv1alpha1.OperatingSystemProfile { + return &osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + OSVersion: "2.0", + Version: "1.0.0", + SupportedCloudProviders: []osmv1alpha1.CloudProviderSpec{ + { + Name: "aws", + }, + }, + SupportedContainerRuntimes: []osmv1alpha1.ContainerRuntimeSpec{ + { + Name: "containerd", + }, + }, + Files: []osmv1alpha1.File{ + { + Path: "/etc/systemd/journald.conf.d/max_disk_use.conf", + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Encoding: "b64", + Data: "test", + }, + }, + }, + }, + }, + } +} + +func generateMachineDeployment(t *testing.T, osp string, os providerconfigtypes.OperatingSystem, cloudprovider string) v1alpha1.MachineDeployment { + pconfig := providerconfigtypes.Config{ + SSHPublicKeys: []string{"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDdOIhYmzCK5DSVLu3c"}, + OperatingSystem: os, + CloudProviderSpec: runtime.RawExtension{Raw: []byte(`{"cloudProvider":"aws", "cloudProviderSpec":"test-provider-spec"}`)}, + CloudProvider: providerconfigtypes.CloudProvider(cloudprovider), + } + mdConfig, err := json.Marshal(pconfig) + if err != nil { + t.Fatalf("failed to generate machine deployment: %v", err) + } + + annotations := make(map[string]string) + if osp != "" { + annotations = map[string]string{ + resources.MachineDeploymentOSPAnnotation: osp, + } + } + + md := clusterv1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "default", + Namespace: "kube-system", + Annotations: annotations, + }, + Spec: clusterv1alpha1.MachineDeploymentSpec{ + Template: clusterv1alpha1.MachineTemplateSpec{ + Spec: clusterv1alpha1.MachineSpec{ + Versions: clusterv1alpha1.MachineVersionInfo{ + Kubelet: "1.22.1", + }, + ProviderSpec: clusterv1alpha1.ProviderSpec{ + Value: &runtime.RawExtension{ + Raw: mdConfig, + }, + }, + }, + }, + }, + } + return md +} diff --git a/pkg/admission/machinedeployments_validation.go b/pkg/admission/machinedeployments_validation.go new file mode 100644 index 00000000..d581e96b --- /dev/null +++ b/pkg/admission/machinedeployments_validation.go @@ -0,0 +1,84 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "context" + "encoding/json" + "fmt" + + clusterv1alpha1 "github.com/kubermatic/machine-controller/pkg/apis/cluster/v1alpha1" + providerconfigtypes "github.com/kubermatic/machine-controller/pkg/providerconfig/types" + "k8c.io/operating-system-manager/pkg/controllers/osc/resources" + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + kerrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/validation/field" + ctrlruntimeclient "sigs.k8s.io/controller-runtime/pkg/client" +) + +func ValidateMachineDeployment(md clusterv1alpha1.MachineDeployment, client ctrlruntimeclient.Client, namespace string) field.ErrorList { + allErrs := field.ErrorList{} + + ospName := md.Annotations[resources.MachineDeploymentOSPAnnotation] + // Ignoring request since no OperatingSystemProfile found + if len(ospName) == 0 { + // Returning an empty list here as MD without this annotation shouldn't be validated + return allErrs + } + + osp := &osmv1alpha1.OperatingSystemProfile{} + err := client.Get(context.TODO(), types.NamespacedName{Name: ospName, Namespace: namespace}, osp) + if err != nil && !kerrors.IsNotFound(err) { + if kerrors.IsNotFound(err) { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations", resources.MachineDeploymentOSPAnnotation), ospName, "OperatingSystemProfile not found")) + } else { + allErrs = append(allErrs, field.Invalid(field.NewPath("metadata", "annotations", resources.MachineDeploymentOSPAnnotation), ospName, err.Error())) + } + // we can't validate further since OSP doesn't exist + return allErrs + } + + // Get providerConfig from machineDeployment + providerConfig := providerconfigtypes.Config{} + err = json.Unmarshal(md.Spec.Template.Spec.ProviderSpec.Value.Raw, &providerConfig) + if err != nil { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "template", "spec", "providerSpec"), md.Spec.Template.Spec.ProviderSpec.Value.Raw, fmt.Sprintf("Failed to decode provider configs: %v", err))) + return allErrs + } + + // Ensure that OSP supports the operating system + if osp.Spec.OSName != osmv1alpha1.OperatingSystem(providerConfig.OperatingSystem) { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "template", "spec", "providerSpec", "OperatingSystem"), providerConfig.OperatingSystem, "OperatingSystemProfile does not support the OperatingSystem specified in MachineDeployment")) + } + + // Ensure that OSP supports the cloud provider + supportedCloudProvider := false + for _, cloudProvider := range osp.Spec.SupportedCloudProviders { + if providerconfigtypes.CloudProvider(cloudProvider.Name) == providerConfig.CloudProvider { + supportedCloudProvider = true + break + } + } + + // Ensure that OSP supports the operating system + if !supportedCloudProvider { + allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "template", "spec", "providerSpec", "CloudProvider"), providerConfig.CloudProvider, "OperatingSystemProfile does not support the CloudProvider specified in MachineDeployment")) + } + return allErrs +} diff --git a/pkg/admission/operatingsystemconfigs.go b/pkg/admission/operatingsystemconfigs.go new file mode 100644 index 00000000..76aeddbb --- /dev/null +++ b/pkg/admission/operatingsystemconfigs.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "encoding/json" + "fmt" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + admissionv1 "k8s.io/api/admission/v1" +) + +func (ad *admissionData) validateOperatingSystemConfigs(ar admissionv1.AdmissionRequest) (*admissionv1.AdmissionResponse, error) { + osc := osmv1alpha1.OperatingSystemConfig{} + if err := json.Unmarshal(ar.Object.Raw, &osc); err != nil { + return nil, fmt.Errorf("failed to unmarshal: %v", err) + } + + // Do not validate the spec if it hasn't changed + if ar.Operation == admissionv1.Update { + var oscOld osmv1alpha1.OperatingSystemConfig + if err := json.Unmarshal(ar.OldObject.Raw, &oscOld); err != nil { + return nil, fmt.Errorf("failed to unmarshal OldObject: %v", err) + } + if errs := ValidateOperatingSystemConfigUpdate(oscOld, osc); errs != nil { + return nil, fmt.Errorf("validation failed for update: %v", errs) + } + } + return createAdmissionResponse(true), nil +} diff --git a/pkg/admission/operatingsystemconfigs_test.go b/pkg/admission/operatingsystemconfigs_test.go new file mode 100644 index 00000000..14d1bfba --- /dev/null +++ b/pkg/admission/operatingsystemconfigs_test.go @@ -0,0 +1,147 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "fmt" + "testing" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" +) + +func TestOpeartingSystemConfigValidation(t *testing.T) { + tests := []struct { + name string + osc osmv1alpha1.OperatingSystemConfig + oscUpdated osmv1alpha1.OperatingSystemConfig + expectedError string + }{ + { + name: "Update OSC spec", + osc: osmv1alpha1.OperatingSystemConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemConfigSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + oscUpdated: osmv1alpha1.OperatingSystemConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemConfigSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service-updated", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + expectedError: "OperatingSystemConfig is immutable and updates are not allowed", + }, + { + name: "Update OSC labels", + osc: osmv1alpha1.OperatingSystemConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemConfigSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + oscUpdated: osmv1alpha1.OperatingSystemConfig{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + Labels: map[string]string{ + "key": "value", + }, + }, + Spec: osmv1alpha1.OperatingSystemConfigSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + expectedError: "", + }, + } + for _, tc := range tests { + tc := tc // scopelint fix + t.Run(tc.name, func(t *testing.T) { + errs := ValidateOperatingSystemConfigUpdate(tc.osc, tc.oscUpdated) + if errs != nil && len(tc.expectedError) == 0 { + t.Errorf("didn't expect err but got %v", errs) + return + } + if errs == nil && len(tc.expectedError) > 0 { + t.Errorf("expected err %v but got valid response", tc.expectedError) + return + } + if errs != nil && tc.expectedError != fmt.Sprintf("%v", errs) { + t.Errorf("actual error %v didn't match expected error %v", errs, tc.expectedError) + return + } + }) + } + +} diff --git a/pkg/admission/operatingsystemconfigs_validation.go b/pkg/admission/operatingsystemconfigs_validation.go new file mode 100644 index 00000000..af3a699d --- /dev/null +++ b/pkg/admission/operatingsystemconfigs_validation.go @@ -0,0 +1,33 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "fmt" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + apiequality "k8s.io/apimachinery/pkg/api/equality" +) + +func ValidateOperatingSystemConfigUpdate(oscOld osmv1alpha1.OperatingSystemConfig, oscNew osmv1alpha1.OperatingSystemConfig) error { + // Updates for OperatingSystemConfig are not allowed + if equal := apiequality.Semantic.DeepEqual(oscOld.Spec, oscNew.Spec); !equal { + return fmt.Errorf("OperatingSystemConfig is immutable and updates are not allowed") + } + return nil +} diff --git a/pkg/admission/operatingsystemprofiles.go b/pkg/admission/operatingsystemprofiles.go new file mode 100644 index 00000000..4332edfc --- /dev/null +++ b/pkg/admission/operatingsystemprofiles.go @@ -0,0 +1,45 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "encoding/json" + "fmt" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + admissionv1 "k8s.io/api/admission/v1" +) + +func (ad *admissionData) validateOperatingSystemProfiles(ar admissionv1.AdmissionRequest) (*admissionv1.AdmissionResponse, error) { + osp := osmv1alpha1.OperatingSystemProfile{} + if err := json.Unmarshal(ar.Object.Raw, &osp); err != nil { + return nil, fmt.Errorf("failed to unmarshal: %v", err) + } + + // Do not validate the spec if it hasn't changed + if ar.Operation == admissionv1.Update { + var ospOld osmv1alpha1.OperatingSystemProfile + if err := json.Unmarshal(ar.OldObject.Raw, &ospOld); err != nil { + return nil, fmt.Errorf("failed to unmarshal OldObject: %v", err) + } + if err := ValidateOperatingSystemProfileUpdate(ospOld, osp); err != nil { + return nil, fmt.Errorf("validation failed for update: %v", err) + } + } + return createAdmissionResponse(true), nil +} diff --git a/pkg/admission/operatingsystemprofiles_test.go b/pkg/admission/operatingsystemprofiles_test.go new file mode 100644 index 00000000..b4f220cf --- /dev/null +++ b/pkg/admission/operatingsystemprofiles_test.go @@ -0,0 +1,195 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "fmt" + "testing" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/pointer" +) + +func TestOpeartingSystemProfileValidation(t *testing.T) { + tests := []struct { + name string + osp osmv1alpha1.OperatingSystemProfile + ospUpdated osmv1alpha1.OperatingSystemProfile + expectedError string + }{ + { + name: "Update OSP spec", + osp: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Version: "1.0.0", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + ospUpdated: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Version: "1.0.0", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service-updated", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + expectedError: "OperatingSystemProfile is immutable. For updates .spec.version needs to be updated", + }, + { + name: "Should update OSP spec with version bump", + osp: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Version: "1.0.0", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + ospUpdated: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Version: "1.0.1", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service-updated", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + expectedError: "", + }, + { + name: "Update osp labels", + osp: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + ospUpdated: osmv1alpha1.OperatingSystemProfile{ + ObjectMeta: metav1.ObjectMeta{ + Name: "ubuntu", + Namespace: "default", + Labels: map[string]string{ + "key": "value", + }, + }, + Spec: osmv1alpha1.OperatingSystemProfileSpec{ + OSName: "ubuntu", + Files: []osmv1alpha1.File{ + { + Path: "/opt/bin/test.service", + Permissions: pointer.Int32Ptr(0700), + Content: osmv1alpha1.FileContent{ + Inline: &osmv1alpha1.FileContentInline{ + Data: " #!/bin/bash\n set -xeuo pipefail\n cloud-init clean\n cloud-init init\n systemctl start provision.service", + }, + }, + }, + }, + }, + }, + expectedError: "", + }, + } + for _, tc := range tests { + tc := tc // scopelint fix + t.Run(tc.name, func(t *testing.T) { + errs := ValidateOperatingSystemProfileUpdate(tc.osp, tc.ospUpdated) + if errs != nil && len(tc.expectedError) == 0 { + t.Errorf("didn't expect err but got %v", errs) + return + } + if errs == nil && len(tc.expectedError) > 0 { + t.Errorf("expected err %v but got valid response", tc.expectedError) + return + } + if errs != nil && tc.expectedError != fmt.Sprintf("%v", errs) { + t.Errorf("actual error %v didn't match expected error %v", errs, tc.expectedError) + return + } + }) + } + +} diff --git a/pkg/admission/operatingsystemprofiles_validation.go b/pkg/admission/operatingsystemprofiles_validation.go new file mode 100644 index 00000000..6e9e8912 --- /dev/null +++ b/pkg/admission/operatingsystemprofiles_validation.go @@ -0,0 +1,39 @@ +/* +Copyright 2021 The Operating System Manager contributors. + +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 admission + +import ( + "fmt" + + osmv1alpha1 "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" + + apiequality "k8s.io/apimachinery/pkg/api/equality" +) + +func ValidateOperatingSystemProfileUpdate(ospOld osmv1alpha1.OperatingSystemProfile, ospNew osmv1alpha1.OperatingSystemProfile) error { + + if equal := apiequality.Semantic.DeepEqual(ospOld.Spec, ospNew.Spec); equal { + // There is no change in spec so no validation is required + return nil + } + + // OSP is immutable by nature and to make modifications a version bump is mandatory + if ospOld.Spec.Version == ospNew.Spec.Version { + return fmt.Errorf("OperatingSystemProfile is immutable. For updates .spec.version needs to be updated") + } + return nil +} diff --git a/pkg/controllers/osc/osc_controller.go b/pkg/controllers/osc/osc_controller.go index 43e7270f..cf09f753 100644 --- a/pkg/controllers/osc/osc_controller.go +++ b/pkg/controllers/osc/osc_controller.go @@ -38,6 +38,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/predicate" "sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/source" ) @@ -52,30 +53,33 @@ const ( type Reconciler struct { client.Client - log *zap.SugaredLogger - namespace string - clusterAddress string - containerRuntime string - externalCloudProvider bool - pauseImage string - initialTaints string - generator generator.CloudConfigGenerator - clusterDNSIPs []net.IP - kubeconfig string - nodeHTTPProxy string - nodeNoProxy string - podCIDR string - nodePortRange string + workerClient client.Client + log *zap.SugaredLogger + + namespace string + clusterAddress string + containerRuntime string + externalCloudProvider bool + pauseImage string + initialTaints string + generator generator.CloudConfigGenerator + clusterDNSIPs []net.IP + workerClusterKubeconfig string + nodeHTTPProxy string + nodeNoProxy string + podCIDR string + nodePortRange string } func Add( mgr manager.Manager, log *zap.SugaredLogger, + client client.Client, + workerClusterKubeconfig string, namespace string, clusterName string, workerCount int, clusterDNSIPs []net.IP, - kubeconfig string, generator generator.CloudConfigGenerator, containerRuntime string, externalCloudProvider bool, @@ -86,21 +90,22 @@ func Add( podCIDR string, nodePortRange string) error { reconciler := &Reconciler{ - Client: mgr.GetClient(), - log: log, - namespace: namespace, - clusterAddress: clusterName, - generator: generator, - kubeconfig: kubeconfig, - clusterDNSIPs: clusterDNSIPs, - containerRuntime: containerRuntime, - pauseImage: pauseImage, - initialTaints: initialTaints, - externalCloudProvider: externalCloudProvider, - nodeHTTPProxy: nodeHTTPProxy, - nodeNoProxy: nodeNoProxy, - podCIDR: podCIDR, - nodePortRange: nodePortRange, + log: log, + workerClient: mgr.GetClient(), + Client: client, + workerClusterKubeconfig: workerClusterKubeconfig, + namespace: namespace, + clusterAddress: clusterName, + generator: generator, + clusterDNSIPs: clusterDNSIPs, + containerRuntime: containerRuntime, + pauseImage: pauseImage, + initialTaints: initialTaints, + externalCloudProvider: externalCloudProvider, + nodeHTTPProxy: nodeHTTPProxy, + nodeNoProxy: nodeNoProxy, + podCIDR: podCIDR, + nodePortRange: nodePortRange, } log.Info("Reconciling OSC resource..") c, err := controller.New(ControllerName, mgr, controller.Options{Reconciler: reconciler, MaxConcurrentReconciles: workerCount}) @@ -108,7 +113,7 @@ func Add( return err } - if err := c.Watch(&source.Kind{Type: &clusterv1alpha1.MachineDeployment{}}, &handler.EnqueueRequestForObject{}); err != nil { + if err := c.Watch(&source.Kind{Type: &clusterv1alpha1.MachineDeployment{}}, &handler.EnqueueRequestForObject{}, filterMachineDeploymentPredicate()); err != nil { return fmt.Errorf("failed to watch MachineDeployments: %v", err) } @@ -120,7 +125,7 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrlruntime.Request) (re log.Info("Reconciling OSC resource..") machineDeployment := &clusterv1alpha1.MachineDeployment{} - if err := r.Get(ctx, req.NamespacedName, machineDeployment); err != nil { + if err := r.workerClient.Get(ctx, req.NamespacedName, machineDeployment); err != nil { if kerrors.IsNotFound(err) { return reconcile.Result{}, nil } @@ -137,15 +142,10 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrlruntime.Request) (re return reconcile.Result{}, nil } - if machineDeployment.Annotations[resources.MachineDeploymentOSPAnnotation] == "" { - r.log.Warnw("Ignoring OSM request: no OperatingSystemProfile found. This could influence the provisioning of the machine") - return reconcile.Result{}, nil - } - // Add finalizer if it doesn't exist if !kuberneteshelper.HasFinalizer(machineDeployment, MachineDeploymentCleanupFinalizer) { kuberneteshelper.AddFinalizer(machineDeployment, MachineDeploymentCleanupFinalizer) - if err := r.Client.Update(ctx, machineDeployment); err != nil { + if err := r.workerClient.Update(ctx, machineDeployment); err != nil { return reconcile.Result{}, fmt.Errorf("failed to add finalizer: %w", err) } } @@ -173,6 +173,7 @@ func (r *Reconciler) reconcile(ctx context.Context, md *clusterv1alpha1.MachineD func (r *Reconciler) reconcileOperatingSystemConfigs(ctx context.Context, md *clusterv1alpha1.MachineDeployment) error { ospName := md.Annotations[resources.MachineDeploymentOSPAnnotation] osp := &osmv1alpha1.OperatingSystemProfile{} + if err := r.Get(ctx, types.NamespacedName{Name: ospName, Namespace: r.namespace}, osp); err != nil { return fmt.Errorf("failed to get OperatingSystemProfile: %v", err) } @@ -181,7 +182,7 @@ func (r *Reconciler) reconcileOperatingSystemConfigs(ctx context.Context, md *cl resources.OperatingSystemConfigCreator( md, osp, - r.kubeconfig, + r.workerClusterKubeconfig, r.clusterDNSIPs, r.containerRuntime, r.externalCloudProvider, @@ -202,7 +203,7 @@ func (r *Reconciler) reconcileOperatingSystemConfigs(ctx context.Context, md *cl func (r *Reconciler) reconcileSecrets(ctx context.Context, md *clusterv1alpha1.MachineDeployment) error { oscName := fmt.Sprintf(resources.MachineDeploymentSubresourceNamePattern, md.Name, resources.ProvisioningCloudConfig) osc := &osmv1alpha1.OperatingSystemConfig{} - if err := r.Get(ctx, types.NamespacedName{Namespace: CloudInitSettingsNamespace, Name: oscName}, osc); err != nil { + if err := r.Get(ctx, types.NamespacedName{Namespace: r.namespace, Name: oscName}, osc); err != nil { return fmt.Errorf("failed to list OperatingSystemConfigs: %v", err) } @@ -213,7 +214,7 @@ func (r *Reconciler) reconcileSecrets(ctx context.Context, md *clusterv1alpha1.M if err := reconciling.ReconcileSecrets(ctx, []reconciling.NamedSecretCreatorGetter{ resources.CloudConfigSecretCreator(md.Name, resources.ProvisioningCloudConfig, provisionData), - }, r.namespace, r.Client); err != nil { + }, CloudInitSettingsNamespace, r.workerClient); err != nil { return fmt.Errorf("failed to reconcile provisioning secrets: %v", err) } r.log.Infof("successfully generated provisioning secret: %v", fmt.Sprintf(resources.MachineDeploymentSubresourceNamePattern, md.Name, resources.ProvisioningCloudConfig)) @@ -277,3 +278,10 @@ func (r *Reconciler) deleteGeneratedSecrets(ctx context.Context, md *clusterv1al } return nil } + +// filterMachineDeploymentPredicate will filter machine deployments based on the presence of OSP annotation +func filterMachineDeploymentPredicate() predicate.Predicate { + return predicate.NewPredicateFuncs(func(o client.Object) bool { + return o.GetAnnotations()[resources.MachineDeploymentOSPAnnotation] != "" + }) +} diff --git a/pkg/controllers/osc/osc_reconciler_test.go b/pkg/controllers/osc/osc_reconciler_test.go index 1431b1b9..9a510601 100644 --- a/pkg/controllers/osc/osc_reconciler_test.go +++ b/pkg/controllers/osc/osc_reconciler_test.go @@ -425,13 +425,14 @@ func loadFile(obj runtime.Object, name string) error { func buildReconciler(fakeClient client.Client, config testConfig) Reconciler { return Reconciler{ - Client: fakeClient, - log: testUtil.DefaultLogger, - generator: generator.NewDefaultCloudConfigGenerator(""), - namespace: config.namespace, - clusterAddress: config.clusterAddress, - kubeconfig: kubeconfigPath, - containerRuntime: config.containerRuntime, - clusterDNSIPs: config.clusterDNSIPs, + Client: fakeClient, + workerClient: fakeClient, + log: testUtil.DefaultLogger, + generator: generator.NewDefaultCloudConfigGenerator(""), + namespace: config.namespace, + clusterAddress: config.clusterAddress, + workerClusterKubeconfig: kubeconfigPath, + containerRuntime: config.containerRuntime, + clusterDNSIPs: config.clusterDNSIPs, } } diff --git a/pkg/controllers/osc/resources/operating_system_config.go b/pkg/controllers/osc/resources/operating_system_config.go index 1797311f..1aad1fe5 100644 --- a/pkg/controllers/osc/resources/operating_system_config.go +++ b/pkg/controllers/osc/resources/operating_system_config.go @@ -54,7 +54,7 @@ const ( func OperatingSystemConfigCreator( md *v1alpha1.MachineDeployment, osp *osmv1alpha1.OperatingSystemProfile, - kubeconfig string, + workerClusterKubeconfig string, clusterDNSIPs []net.IP, containerRuntime string, externalCloudProvider bool, @@ -88,12 +88,12 @@ func OperatingSystemConfigCreator( } } - CACert, err := resources.GetCACert(kubeconfig) + CACert, err := resources.GetCACert(workerClusterKubeconfig) if err != nil { return nil, err } - kubeconfigStr, err := resources.StringifyKubeconfig(kubeconfig) + kubeconfigStr, err := resources.StringifyKubeconfig(workerClusterKubeconfig) if err != nil { return nil, err } @@ -237,7 +237,7 @@ func selectAdditionalFiles(osp *osmv1alpha1.OperatingSystemProfile, containerRun filesToAdd := make([]osmv1alpha1.File, 0) // select container runtime files for _, cr := range osp.Spec.SupportedContainerRuntimes { - if cr.Name == containerRuntime { + if cr.Name == osmv1alpha1.ContainerRuntime(containerRuntime) { filesToAdd = append(filesToAdd, cr.Files...) break } @@ -251,7 +251,7 @@ func selectAdditionalTemplates(osp *osmv1alpha1.OperatingSystemProfile, containe // select container runtime scripts for _, cr := range osp.Spec.SupportedContainerRuntimes { - if cr.Name == containerRuntime { + if cr.Name == osmv1alpha1.ContainerRuntime(containerRuntime) { for name, temp := range cr.Templates { templatesToRender[name] = temp } diff --git a/pkg/controllers/osc/resources/secrets.go b/pkg/controllers/osc/resources/secrets.go index 9edd38d2..2a33922d 100644 --- a/pkg/controllers/osc/resources/secrets.go +++ b/pkg/controllers/osc/resources/secrets.go @@ -22,6 +22,7 @@ import ( "k8c.io/operating-system-manager/pkg/resources/reconciling" corev1 "k8s.io/api/core/v1" + "k8s.io/utils/pointer" ) // CloudConfigSecretCreator returns a function to create a secret that contains the cloud-init or ignition configurations. @@ -33,6 +34,9 @@ func CloudConfigSecretCreator(mdName string, oscType CloudConfigSecret, data []b sec.Data = map[string][]byte{} } sec.Data["cloud-config"] = data + + // Cloud config secret is immutable + sec.Immutable = pointer.Bool(true) return sec, nil } } diff --git a/pkg/controllers/osc/testdata/secret-flatcar-aws-containerd.yaml b/pkg/controllers/osc/testdata/secret-flatcar-aws-containerd.yaml index 0844b5a7..b4eed87a 100644 --- a/pkg/controllers/osc/testdata/secret-flatcar-aws-containerd.yaml +++ b/pkg/controllers/osc/testdata/secret-flatcar-aws-containerd.yaml @@ -1,6 +1,7 @@ apiVersion: v1 data: cloud-config: eyJpZ25pdGlvbiI6eyJjb25maWciOnt9LCJzZWN1cml0eSI6eyJ0bHMiOnt9fSwidGltZW91dHMiOnt9LCJ2ZXJzaW9uIjoiMi4zLjAifSwibmV0d29ya2QiOnt9LCJwYXNzd2QiOnsidXNlcnMiOlt7Im5hbWUiOiJjb3JlIiwic3NoQXV0aG9yaXplZEtleXMiOlsic3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFEZE9JaFltekNLNURTVkx1M2MiXX1dfSwic3RvcmFnZSI6eyJmaWxlcyI6W3siZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9zeXN0ZW1kL2pvdXJuYWxkLmNvbmYuZC9tYXhfZGlza191c2UuY29uZiIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCU1QkpvdXJuYWwlNUQlMEFTeXN0ZW1NYXhVc2UlM0Q1RyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL29wdC9sb2FkLWtlcm5lbC1tb2R1bGVzLnNoIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRnVzciUyRmJpbiUyRmVudiUyMGJhc2glMEFzZXQlMjAtZXVvJTIwcGlwZWZhaWwlMEElMEFtb2Rwcm9iZSUyMGlwX3ZzJTBBbW9kcHJvYmUlMjBpcF92c19yciUwQW1vZHByb2JlJTIwaXBfdnNfd3JyJTBBbW9kcHJvYmUlMjBpcF92c19zaCUwQSUwQWlmJTIwbW9kaW5mbyUyMG5mX2Nvbm50cmFja19pcHY0JTIwJTI2JTNFJTIwJTJGZGV2JTJGbnVsbCUzQiUyMHRoZW4lMEElMjAlMjBtb2Rwcm9iZSUyMG5mX2Nvbm50cmFja19pcHY0JTBBZWxzZSUwQSUyMCUyMG1vZHByb2JlJTIwbmZfY29ubnRyYWNrJTBBZmklMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMvc3lzY3RsLmQvazhzLmNvbmYiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyUyMCUzRCUyMDElMEFuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwdGFibGVzJTIwJTNEJTIwMSUwQWtlcm5lbC5wYW5pY19vbl9vb3BzJTIwJTNEJTIwMSUwQWtlcm5lbC5wYW5pYyUyMCUzRCUyMDEwJTBBbmV0LmlwdjQuaXBfZm9yd2FyZCUyMCUzRCUyMDElMEF2bS5vdmVyY29tbWl0X21lbW9yeSUyMCUzRCUyMDElMEFmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXMlMjAlM0QlMjAxMDQ4NTc2JTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvb3B0L2Jpbi9zZXR1cF9uZXRfZW52LnNoIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRnVzciUyRmJpbiUyRmVudiUyMGJhc2glMEFlY2hvZGF0ZSgpJTIwJTdCJTBBJTIwJTIwZWNobyUyMCUyMiU1QiUyNChkYXRlJTIwLUlzKSU1RCUyMiUyMCUyMiUyNCU0MCUyMiUwQSU3RCUwQSUwQSUyMyUyMGdldCUyMHRoZSUyMGRlZmF1bHQlMjBpbnRlcmZhY2UlMjBJUCUyMGFkZHJlc3MlMEFERUZBVUxUX0lGQ19JUCUzRCUyNChpcCUyMC1vJTIwJTIwcm91dGUlMjBnZXQlMjAxJTIwJTdDJTIwZ3JlcCUyMC1vUCUyMCUyMnNyYyUyMCU1Q0slNUNTJTJCJTIyKSUwQSUwQWlmJTIwJTVCJTIwLXolMjAlMjIlMjQlN0JERUZBVUxUX0lGQ19JUCU3RCUyMiUyMCU1RCUwQXRoZW4lMEElMjAlMjBlY2hvZGF0ZSUyMCUyMkZhaWxlZCUyMHRvJTIwZ2V0JTIwSVAlMjBhZGRyZXNzJTIwZm9yJTIwdGhlJTIwZGVmYXVsdCUyMHJvdXRlJTIwaW50ZXJmYWNlJTIyJTBBJTIwJTIwZXhpdCUyMDElMEFmaSUwQSUwQSUyMyUyMGdldCUyMHRoZSUyMGZ1bGwlMjBob3N0bmFtZSUwQUZVTExfSE9TVE5BTUUlM0QlMjQoaG9zdG5hbWUlMjAtZiklMEElMjMlMjBpZiUyMCUyRmV0YyUyRmhvc3RuYW1lJTIwaXMlMjBub3QlMjBlbXB0eSUyMHRoZW4lMjB1c2UlMjB0aGUlMjBob3N0bmFtZSUyMGZyb20lMjB0aGVyZSUwQWlmJTIwJTVCJTIwLXMlMjAlMkZldGMlMkZob3N0bmFtZSUyMCU1RCUzQiUyMHRoZW4lMEElMjAlMjAlMjAlMjBGVUxMX0hPU1ROQU1FJTNEJTI0KGNhdCUyMCUyRmV0YyUyRmhvc3RuYW1lKSUwQWZpJTBBJTBBJTIzJTIwd3JpdGUlMjB0aGUlMjBub2RlaXBfZW52JTIwZmlsZSUwQSUyMyUyMHdlJTIwbmVlZCUyMHRoZSUyMGxpbmUlMjBiZWxvdyUyMGJlY2F1c2UlMjBmbGF0Y2FyJTIwaGFzJTIwdGhlJTIwc2FtZSUyMHN0cmluZyUyMCUyMmNvcmVvcyUyMiUyMGluJTIwdGhhdCUyMGZpbGUlMEFpZiUyMGdyZXAlMjAtcSUyMGNvcmVvcyUyMCUyRmV0YyUyRm9zLXJlbGVhc2UlMEF0aGVuJTBBJTIwJTIwZWNobyUyMC1lJTIwJTIyS1VCRUxFVF9OT0RFX0lQJTNEJTI0JTdCREVGQVVMVF9JRkNfSVAlN0QlNUNuS1VCRUxFVF9IT1NUTkFNRSUzRCUyNCU3QkZVTExfSE9TVE5BTUUlN0QlMjIlMjAlM0UlMjAlMkZldGMlMkZrdWJlcm5ldGVzJTJGbm9kZWlwLmNvbmYlMEFlbGlmJTIwJTVCJTIwISUyMC1kJTIwJTJGZXRjJTJGc3lzdGVtZCUyRnN5c3RlbSUyRmt1YmVsZXQuc2VydmljZS5kJTIwJTVEJTBBdGhlbiUwQSUyMCUyMGVjaG9kYXRlJTIwJTIyQ2FuJ3QlMjBmaW5kJTIwa3ViZWxldCUyMHNlcnZpY2UlMjBleHRyYXMlMjBkaXJlY3RvcnklMjIlMEElMjAlMjBleGl0JTIwMSUwQWVsc2UlMEElMjAlMjBlY2hvJTIwLWUlMjAlMjIlNUJTZXJ2aWNlJTVEJTVDbkVudmlyb25tZW50JTNEJTVDJTIyS1VCRUxFVF9OT0RFX0lQJTNEJTI0JTdCREVGQVVMVF9JRkNfSVAlN0QlNUMlMjIlNUNuRW52aXJvbm1lbnQlM0QlNUMlMjJLVUJFTEVUX0hPU1ROQU1FJTNEJTI0JTdCRlVMTF9IT1NUTkFNRSU3RCU1QyUyMiUyMiUyMCUzRSUyMCUyRmV0YyUyRnN5c3RlbWQlMkZzeXN0ZW0lMkZrdWJlbGV0LnNlcnZpY2UuZCUyRm5vZGVpcC5jb25mJTBBZmklMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9vcHQvYmluL2NvbmZpZ3VyZV9zdGF0aWNfbmV0d29yay5zaCIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCUyMyElMkZ1c3IlMkZiaW4lMkZlbnYlMjBiYXNoJTBBc2V0JTIwLXhldW8lMjBwaXBlZmFpbCUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0OTN9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL29wdC9iaW4vZG93bmxvYWQuc2giLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlMjMhJTJGdXNyJTJGYmluJTJGZW52JTIwYmFzaCUwQXNldCUyMC14ZXVvJTIwcGlwZWZhaWwlMEFvcHRfYmluJTNEJTJGb3B0JTJGYmluJTBBdXNyX2xvY2FsX2JpbiUzRCUyRnVzciUyRmxvY2FsJTJGYmluJTBBY25pX2Jpbl9kaXIlM0QlMkZvcHQlMkZjbmklMkZiaW4lMEFta2RpciUyMC1wJTIwJTJGZXRjJTJGY25pJTJGbmV0LmQlMjAlMkZldGMlMkZrdWJlcm5ldGVzJTJGZHluYW1pYy1jb25maWctZGlyJTIwJTJGZXRjJTJGa3ViZXJuZXRlcyUyRm1hbmlmZXN0cyUyMCUyMiUyNG9wdF9iaW4lMjIlMjAlMjIlMjRjbmlfYmluX2RpciUyMiUwQWFyY2glM0QlMjQlN0JIT1NUX0FSQ0gtJTdEJTBBaWYlMjAlNUIlMjAteiUyMCUyMiUyNGFyY2glMjIlMjAlNUQlMEF0aGVuJTBBY2FzZSUyMCUyNCh1bmFtZSUyMC1tKSUyMGluJTBBeDg2XzY0KSUwQSUyMCUyMCUyMCUyMGFyY2glM0QlMjJhbWQ2NCUyMiUwQSUyMCUyMCUyMCUyMCUzQiUzQiUwQWFhcmNoNjQpJTBBJTIwJTIwJTIwJTIwYXJjaCUzRCUyMmFybTY0JTIyJTBBJTIwJTIwJTIwJTIwJTNCJTNCJTBBKiklMEElMjAlMjAlMjAlMjBlY2hvJTIwJTIydW5zdXBwb3J0ZWQlMjBDUFUlMjBhcmNoaXRlY3R1cmUlMkMlMjBleGl0aW5nJTIyJTBBJTIwJTIwJTIwJTIwZXhpdCUyMDElMEElMjAlMjAlMjAlMjAlM0IlM0IlMEFlc2FjJTBBZmklMEFDTklfVkVSU0lPTiUzRCUyMiUyNCU3QkNOSV9WRVJTSU9OJTNBLXYwLjguNyU3RCUyMiUwQWNuaV9iYXNlX3VybCUzRCUyMmh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmNvbnRhaW5lcm5ldHdvcmtpbmclMkZwbHVnaW5zJTJGcmVsZWFzZXMlMkZkb3dubG9hZCUyRiUyNENOSV9WRVJTSU9OJTIyJTBBY25pX2ZpbGVuYW1lJTNEJTIyY25pLXBsdWdpbnMtbGludXgtJTI0YXJjaC0lMjRDTklfVkVSU0lPTi50Z3olMjIlMEFjdXJsJTIwLUxmbyUyMCUyMiUyNGNuaV9iaW5fZGlyJTJGJTI0Y25pX2ZpbGVuYW1lJTIyJTIwJTIyJTI0Y25pX2Jhc2VfdXJsJTJGJTI0Y25pX2ZpbGVuYW1lJTIyJTBBY25pX3N1bSUzRCUyNChjdXJsJTIwLUxmJTIwJTIyJTI0Y25pX2Jhc2VfdXJsJTJGJTI0Y25pX2ZpbGVuYW1lLnNoYTI1NiUyMiklMEFjZCUyMCUyMiUyNGNuaV9iaW5fZGlyJTIyJTBBc2hhMjU2c3VtJTIwLWMlMjAlM0MlM0MlM0MlMjIlMjRjbmlfc3VtJTIyJTBBdGFyJTIweHZmJTIwJTIyJTI0Y25pX2ZpbGVuYW1lJTIyJTBBcm0lMjAtZiUyMCUyMiUyNGNuaV9maWxlbmFtZSUyMiUwQWNkJTIwLSUwQUtVQkVfVkVSU0lPTiUzRCUyMiUyNCU3QktVQkVfVkVSU0lPTiUzQS12MS4yMi4xJTdEJTIyJTBBa3ViZV9kaXIlM0QlMjIlMjRvcHRfYmluJTJGa3ViZXJuZXRlcy0lMjRLVUJFX1ZFUlNJT04lMjIlMEFrdWJlX2Jhc2VfdXJsJTNEJTIyaHR0cHMlM0ElMkYlMkZzdG9yYWdlLmdvb2dsZWFwaXMuY29tJTJGa3ViZXJuZXRlcy1yZWxlYXNlJTJGcmVsZWFzZSUyRiUyNEtVQkVfVkVSU0lPTiUyRmJpbiUyRmxpbnV4JTJGJTI0YXJjaCUyMiUwQWt1YmVfc3VtX2ZpbGUlM0QlMjIlMjRrdWJlX2RpciUyRnNoYTI1NiUyMiUwQW1rZGlyJTIwLXAlMjAlMjIlMjRrdWJlX2RpciUyMiUwQSUzQSUyMCUzRSUyMiUyNGt1YmVfc3VtX2ZpbGUlMjIlMEElMEFmb3IlMjBiaW4lMjBpbiUyMGt1YmVsZXQlMjBrdWJlYWRtJTIwa3ViZWN0bCUzQiUyMGRvJTBBJTIwJTIwJTIwJTIwY3VybCUyMC1MZm8lMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUyMCUyMiUyNGt1YmVfYmFzZV91cmwlMkYlMjRiaW4lMjIlMEElMjAlMjAlMjAlMjBjaG1vZCUyMCUyQnglMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUwQSUyMCUyMCUyMCUyMHN1bSUzRCUyNChjdXJsJTIwLUxmJTIwJTIyJTI0a3ViZV9iYXNlX3VybCUyRiUyNGJpbi5zaGEyNTYlMjIpJTBBJTIwJTIwJTIwJTIwZWNobyUyMCUyMiUyNHN1bSUyMCUyMCUyNGt1YmVfZGlyJTJGJTI0YmluJTIyJTIwJTNFJTNFJTIyJTI0a3ViZV9zdW1fZmlsZSUyMiUwQWRvbmUlMEFzaGEyNTZzdW0lMjAtYyUyMCUyMiUyNGt1YmVfc3VtX2ZpbGUlMjIlMEElMEFmb3IlMjBiaW4lMjBpbiUyMGt1YmVsZXQlMjBrdWJlYWRtJTIwa3ViZWN0bCUzQiUyMGRvJTBBJTIwJTIwJTIwJTIwbG4lMjAtc2YlMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUyMCUyMiUyNG9wdF9iaW4lMjIlMkYlMjRiaW4lMEFkb25lJTBBJTBBaWYlMjAlNUIlNUIlMjAhJTIwLXglMjAlMkZvcHQlMkZiaW4lMkZoZWFsdGgtbW9uaXRvci5zaCUyMCU1RCU1RCUzQiUyMHRoZW4lMEElMjAlMjAlMjAlMjBjdXJsJTIwLUxmbyUyMCUyRm9wdCUyRmJpbiUyRmhlYWx0aC1tb25pdG9yLnNoJTIwaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGa3ViZXJtYXRpYyUyRm1hY2hpbmUtY29udHJvbGxlciUyRjc5NjdhMGFmMmI3NWYyOWFkMmFiMjI3ZWVhYTI2ZWE3YjBmMmZiZGUlMkZwa2clMkZ1c2VyZGF0YSUyRnNjcmlwdHMlMkZoZWFsdGgtbW9uaXRvci5zaCUwQSUyMCUyMCUyMCUyMGNobW9kJTIwJTJCeCUyMCUyRm9wdCUyRmJpbiUyRmhlYWx0aC1tb25pdG9yLnNoJTBBZmklMEElMEFzeXN0ZW1jdGwlMjBkaXNhYmxlJTIwZG93bmxvYWQtc2NyaXB0LnNlcnZpY2UlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9vcHQvYmluL3NldHVwIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRmJpbiUyRmJhc2glMEFzZXQlMjAteGV1byUyMHBpcGVmYWlsJTBBY2F0JTIwJTNDJTNDJTIwRU9GJTIwJTdDJTIwdGVlJTIwJTJGZXRjJTJGcG9sa2l0LTElMkZydWxlcy5kJTJGNjAtbm9yZWJvb3Rfbm9yZXN0YXJ0LnJ1bGVzJTBBcG9sa2l0LmFkZFJ1bGUoZnVuY3Rpb24oYWN0aW9uJTJDJTIwc3ViamVjdCklMjAlN0IlMEElMjAlMjBpZiUyMChhY3Rpb24uaWQlMjAlM0QlM0QlMjAlMjJvcmcuZnJlZWRlc2t0b3AubG9naW4xLnJlYm9vdCUyMiUyMCU3QyU3QyUwQSUyMCUyMCUyMCUyMCUyMCUyMGFjdGlvbi5pZCUyMCUzRCUzRCUyMCUyMm9yZy5mcmVlZGVza3RvcC5sb2dpbjEucmVib290LW11bHRpcGxlLXNlc3Npb25zJTIyKSUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwKHN1YmplY3QudXNlciUyMCUzRCUzRCUyMCUyMmNvcmUlMjIpJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwcG9sa2l0LlJlc3VsdC5ZRVMlM0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlN0QlMjBlbHNlJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwcG9sa2l0LlJlc3VsdC5BVVRIX0FETUlOJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTdEJTBBJTdEKSUzQiUwQUVPRiUwQXN5c3RlbWN0bCUyMHN0b3AlMjBkb2NrZXIlMEFzeXN0ZW1jdGwlMjBkaXNhYmxlJTIwZG9ja2VyJTBBJTBBc3lzdGVtY3RsJTIwZW5hYmxlJTIwLS1ub3clMjBrdWJlbGV0JTBBc3lzdGVtY3RsJTIwZW5hYmxlJTIwLS1ub3clMjAtLW5vLWJsb2NrJTIwa3ViZWxldC1oZWFsdGhjaGVjay5zZXJ2aWNlJTBBc3lzdGVtY3RsJTIwZGlzYWJsZSUyMHNldHVwLnNlcnZpY2UlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMva3ViZXJuZXRlcy9ib290c3RyYXAta3ViZWxldC5jb25mIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosYXBpVmVyc2lvbiUzQSUyMHYxJTBBY2x1c3RlcnMlM0ElMEEtJTIwY2x1c3RlciUzQSUwQSUyMCUyMCUyMCUyMGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhJTNBJTIwTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVVlhha05EUVRCTFowRjNTVUpCWjBsS1FVeG1VbXhYYzBrNFdWRklUVUV3UjBOVGNVZFRTV0l6UkZGRlFrSlJWVUZOU0hONFEzcEJTa0puVGxZS1FrRlpWRUZzVmxSTlVYTjNRMUZaUkZaUlVVbEZkMHBFVVZSRlYwMUNVVWRCTVZWRlFuaE5UbFV5Um5WSlJWcDVXVmMxYW1GWVRtcGlla1ZWVFVKSlJ3cEJNVlZGUTJoTlRGRnVTbWhhUjFwd1pFaHdjR0p0VFhoRmFrRlJRbWRPVmtKQlRWUkRWM2gyV1RKR2MyRkhPWHBrUkVWa1RVSnpSME5UY1VkVFNXSXpDa1JSUlVwQlVsbFBXVzVLYUZwRlFtdFpWelZ1V1ZNMWFtSXlNSGRJYUdOT1RWUlJkMDU2UlRGTmFrRXdUbXBCTVZkb1kwNU5WR04zVGxSQk1FMXFRVEFLVG1wQk1WZHFRamROVVhOM1ExRlpSRlpSVVVkRmQwcFdWWHBGVEUxQmEwZEJNVlZGUTBKTlExRXdSWGhHYWtGVlFtZE9Wa0pCWTFSRVZrNW9ZbWxDUndwamJVWjFXVEpzZWxreU9IaEdSRUZUUW1kT1ZrSkJiMVJETUVwNVdWZFNiV0ZZVWpaaFZ6VnFUVkpKZDBWQldVUldVVkZFUlhkc2MySXlUbWhpUjJoMkNtTXpVWGhJVkVGaVFtZHJjV2hyYVVjNWR6QkNRMUZGVjBSdFNubFpWMUpCV2tkR2RWb3lSWFZaTWpsMFRVbEpRa2xxUVU1Q1oydHhhR3RwUnpsM01FSUtRVkZGUmtGQlQwTkJVVGhCVFVsSlFrTm5TME5CVVVWQmREVm1RV3B3TkdaVVkyVnJWMVZVWm5wemNEQnJlV2xvTVU5WlluTkhUREJMV0RGbFVtSlRVd3BTT0U5a01DczVVVFl5U0hsdWVTdEhSbmROVkdJMFFTOUxWVGh0YzNOdlNIWmpZMlZUUVVGaWQyWmllRVpMTHl0ek5URlViMkp4Vlc1UFVscHlUMjlVQ2xwcWExVjVaMko1V0VSVFN6azVXVUppWTFJeFVHbHdPSFozVFZSdE5GaExkVXgwUTJsblpVSkNaR3BxUVZGa1oxVlBNamhNUlU1SGJITk5ibTFsV1dzS1NtWlBSRlpIYmxadGNqVk1kR0k1UVU1Qk9FbExlVlJtYzI1SVNqUnBUME5UTDFCc1VHSlZhakp4TjFsdWIxWk1jRzl6VlVKTmJHZFZZaTlEZVd0WU13cHRUMjlNWWpSNVNrcFJlVUV2YVZOVU5scDRhVWxGYWpNMlJEUjVWMW8xYkdjM1dVcHNLMVZwYVVKUlNFZERibEJrUjNscGNIRldNRFpsZURCb1pWbFhDbU5oYVZjNFRGZGFVMVZST1ROcVVTdFhWa05JT0doVU4wUlJUekZrYlhOMlZXMVliSEV2U21WQmJIZFJMMUZKUkVGUlFVSnZORWhuVFVsSVpFMUNNRWNLUVRGVlpFUm5VVmRDUWxKalFWSlBkR2hUTkZBMFZUZDJWR1pxUW5sRE5UWTVVamRGTmtSRFFuSlJXVVJXVWpCcVFrbEhiRTFKUjJsblFsSmpRVkpQZEFwb1V6UlFORlUzZGxSbWFrSjVRelUyT1ZJM1JUWkxSaTl3U0RCM1pYcEZURTFCYTBkQk1WVkZRbWhOUTFaV1RYaERla0ZLUW1kT1ZrSkJaMVJCYTA1Q0NrMVNXWGRHUVZsRVZsRlJTRVYzTVZSWlZ6Um5VbTVLYUdKdFRuQmpNazUyVFZKUmQwVm5XVVJXVVZGTFJYZDBRMk50Um10YWJXd3daVzFzZFZsNlJWTUtUVUpCUjBFeFZVVkJlRTFLWWtjNWFsbFhlRzlpTTA0d1RWSXdkMGQzV1VwTGIxcEphSFpqVGtGUmEwSkdaelZwWTIxR2ExRkhVbWhpYldSb1RHMU9kZ3BpV1VsS1FVeG1VbXhYYzBrNFdWRklUVUYzUjBFeFZXUkZkMUZHVFVGTlFrRm1PSGRFVVZsS1MyOWFTV2gyWTA1QlVVVkdRbEZCUkdkblJVSkJSelpvQ2xVNVpqbHpUa2d3THpadlFtSkhSM2t5UlZaVk1GVm5TVlJWVVVseVJsZHZPWEpHYTNKWE5Xc3ZXR3RFYWxGdEt6TnNlbXBVTUdsSFVqUkplRVV2UVc4S1pWVTJjMUZvZFdFM2QzSlhaVVpGYmpRM1IwdzVPR3h1UTNOS1pFUTNiMXBPYUVadFVUazFWR0l2VEc1RVZXcHpOVmxxT1dKeVVEQk9WM3BZWmxsVk5BcFZTekphYmtsT1NsSmpTbkJDT0dsU1EyRkRlRVU0UkdSalZVWXdXSEZKUlhFMmNFRXlOekp6Ym05TWJXbFlURTEyVG13emExbEZaRzByYW1VMmRtOUVDalU0VTA1V1JWVnplblI2VVhsWWJVcEZhRU53ZDFaSk1FRTJVVU5xZWxocUszRjJjRzEzTTFwYVNHazRTbmRZWldrNFdscENURlJUUmtKcmFUaGFOMjRLYzBnNVFrSklNemd2VTNwVmJVRk9ORkZJVTFCNU1XZHFjVzB3TUU5QlJUaE9ZVmxFYTJndllucEZOR1EzYlV4SFIwMVhjQzlYUlROTFVGTjFPREpJUmdwclVHVTJXRzlUWW1sTWJTOXJlR3N6TWxRd1BRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdCUwQSUyMCUyMCUyMCUyMHNlcnZlciUzQSUyMGh0dHBzJTNBJTJGJTJGc2VydmVyJTNBNDQzJTBBJTIwJTIwbmFtZSUzQSUyMCUyMiUyMiUwQWNvbnRleHRzJTNBJTIwbnVsbCUwQWN1cnJlbnQtY29udGV4dCUzQSUyMCUyMiUyMiUwQWtpbmQlM0ElMjBDb25maWclMEFwcmVmZXJlbmNlcyUzQSUyMCU3QiU3RCUwQXVzZXJzJTNBJTBBLSUyMG5hbWUlM0ElMjAlMjIlMjIlMEElMjAlMjB1c2VyJTNBJTBBJTIwJTIwJTIwJTIwdG9rZW4lM0ElMjBteS10b2tlbiUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjozODR9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9rdWJlcm5ldGVzL3BraS9jYS5jcnQiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwtLS0tLUJFR0lOJTIwQ0VSVElGSUNBVEUtLS0tLSUwQU1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYlMEFCQVlUQWxWVE1Rc3dDUVlEVlFRSUV3SkRRVEVXTUJRR0ExVUVCeE1OVTJGdUlFWnlZVzVqYVhOamJ6RVVNQklHJTBBQTFVRUNoTUxRbkpoWkdacGRIcHBibU14RWpBUUJnTlZCQU1UQ1d4dlkyRnNhRzl6ZERFZE1Cc0dDU3FHU0liMyUwQURRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAlMEFOakExV2pCN01Rc3dDUVlEVlFRR0V3SlZVekVMTUFrR0ExVUVDQk1DUTBFeEZqQVVCZ05WQkFjVERWTmhiaUJHJTBBY21GdVkybHpZMjh4RkRBU0JnTlZCQW9UQzBKeVlXUm1hWFI2YVc1ak1SSXdFQVlEVlFRREV3bHNiMk5oYkdodiUwQWMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIlMEFBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUF0NWZBanA0ZlRjZWtXVVRmenNwMGt5aWgxT1lic0dMMEtYMWVSYlNTJTBBUjhPZDAlMkI5UTYySHlueSUyQkdGd01UYjRBJTJGS1U4bXNzb0h2Y2NlU0FBYndmYnhGSyUyRiUyQnM1MVRvYnFVbk9SWnJPb1QlMEFaamtVeWdieVhEU0s5OVlCYmNSMVBpcDh2d01UbTRYS3VMdENpZ2VCQmRqakFRZGdVTzI4TEVOR2xzTW5tZVlrJTBBSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTJTJGUGxQYlVqMnE3WW5vVkxwb3NVQk1sZ1ViJTJGQ3lrWDMlMEFtT29MYjR5SkpReUElMkZpU1Q2WnhpSUVqMzZENHlXWjVsZzdZSmwlMkJVaWlCUUhHQ25QZEd5aXBxVjA2ZXgwaGVZVyUwQWNhaVc4TFdaU1VROTNqUSUyQldWQ0g4aFQ3RFFPMWRtc3ZVbVhscSUyRkplQWx3USUyRlFJREFRQUJvNEhnTUlIZE1CMEclMEFBMVVkRGdRV0JCUmNBUk90aFM0UDRVN3ZUZmpCeUM1NjlSN0U2RENCclFZRFZSMGpCSUdsTUlHaWdCUmNBUk90JTBBaFM0UDRVN3ZUZmpCeUM1NjlSN0U2S0YlMkZwSDB3ZXpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ1RBa05CJTBBTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcGMyTnZNUlF3RWdZRFZRUUtFd3RDY21Ga1ptbDBlbWx1WXpFUyUwQU1CQUdBMVVFQXhNSmJHOWpZV3hvYjNOME1SMHdHd1lKS29aSWh2Y05BUWtCRmc1aWNtRmtRR1JoYm1kaExtTnYlMEFiWUlKQUxmUmxXc0k4WVFITUF3R0ExVWRFd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnRUJBRzZoJTBBVTlmOXNOSDAlMkY2b0JiR0d5MkVWVTBVZ0lUVVFJckZXbzlyRmtyVzVrJTJGWGtEalFtJTJCM2x6alQwaUdSNEl4RSUyRkFvJTBBZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIlMkZMbkRVanM1WWo5YnJQME5XelhmWVU0JTBBVUsyWm5JTkpSY0pwQjhpUkNhQ3hFOERkY1VGMFhxSUVxNnBBMjcyc25vTG1pWExNdk5sM2tZRWRtJTJCamU2dm9EJTBBNThTTlZFVXN6dHpReVhtSkVoQ3B3VkkwQTZRQ2p6WGolMkJxdnBtdzNaWkhpOEp3WGVpOFpaQkxUU0ZCa2k4WjduJTBBc0g5QkJIMzglMkZTelVtQU40UUhTUHkxZ2pxbTAwT0FFOE5hWURraCUyRmJ6RTRkN21MR0dNV3AlMkZXRTNLUFN1ODJIRiUwQWtQZTZYb1NiaUxtJTJGa3hrMzJUMCUzRCUwQS0tLS0tRU5EJTIwQ0VSVElGSUNBVEUtLS0tLSUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlNUJVbml0JTVEJTBBQWZ0ZXIlM0Rjb250YWluZXJkLnNlcnZpY2UlMEFSZXF1aXJlcyUzRGNvbnRhaW5lcmQuc2VydmljZSUwQSUwQURlc2NyaXB0aW9uJTNEa3ViZWxldCUzQSUyMFRoZSUyMEt1YmVybmV0ZXMlMjBOb2RlJTIwQWdlbnQlMEFEb2N1bWVudGF0aW9uJTNEaHR0cHMlM0ElMkYlMkZrdWJlcm5ldGVzLmlvJTJGZG9jcyUyRmhvbWUlMkYlMEElMEElNUJTZXJ2aWNlJTVEJTBBUmVzdGFydCUzRGFsd2F5cyUwQVN0YXJ0TGltaXRJbnRlcnZhbCUzRDAlMEFSZXN0YXJ0U2VjJTNEMTAlMEFDUFVBY2NvdW50aW5nJTNEdHJ1ZSUwQU1lbW9yeUFjY291bnRpbmclM0R0cnVlJTBBJTBBRW52aXJvbm1lbnQlM0QlMjJQQVRIJTNEJTJGb3B0JTJGYmluJTNBJTJGYmluJTNBJTJGdXNyJTJGbG9jYWwlMkZzYmluJTNBJTJGdXNyJTJGbG9jYWwlMkZiaW4lM0ElMkZ1c3IlMkZzYmluJTNBJTJGdXNyJTJGYmluJTNBJTJGc2JpbiUyRiUyMiUwQUVudmlyb25tZW50RmlsZSUzRC0lMkZldGMlMkZlbnZpcm9ubWVudCUwQUVudmlyb25tZW50RmlsZSUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZub2RlaXAuY29uZiUwQSUwQUV4ZWNTdGFydFByZSUzRCUyRmJpbiUyRmJhc2glMjAlMkZvcHQlMkZsb2FkLWtlcm5lbC1tb2R1bGVzLnNoJTBBRXhlY1N0YXJ0UHJlJTNEJTJGYmluJTJGYmFzaCUyMCUyRm9wdCUyRmJpbiUyRnNldHVwX25ldF9lbnYuc2glMEFFeGVjU3RhcnQlM0QlMkZvcHQlMkZiaW4lMkZrdWJlbGV0JTIwJTI0S1VCRUxFVF9FWFRSQV9BUkdTJTIwJTVDJTBBJTIwJTIwLS1ib290c3RyYXAta3ViZWNvbmZpZyUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZib290c3RyYXAta3ViZWxldC5jb25mJTIwJTVDJTBBJTIwJTIwLS1rdWJlY29uZmlnJTNEJTJGdmFyJTJGbGliJTJGa3ViZWxldCUyRmt1YmVjb25maWclMjAlNUMlMEElMjAlMjAtLWNvbmZpZyUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZrdWJlbGV0LmNvbmYlMjAlNUMlMEElMjAlMjAtLW5ldHdvcmstcGx1Z2luJTNEY25pJTIwJTVDJTBBJTIwJTIwLS1jZXJ0LWRpciUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZwa2klMjAlNUMlMEElMjAlMjAtLWNsb3VkLXByb3ZpZGVyJTNEYXdzJTIwJTVDJTBBJTIwJTIwLS1jbG91ZC1jb25maWclM0QlMkZldGMlMkZrdWJlcm5ldGVzJTJGY2xvdWQtY29uZmlnJTIwJTVDJTBBJTIwJTIwLS1keW5hbWljLWNvbmZpZy1kaXIlM0QlMkZldGMlMkZrdWJlcm5ldGVzJTJGZHluYW1pYy1jb25maWctZGlyJTIwJTVDJTBBJTIwJTIwLS1mZWF0dXJlLWdhdGVzJTNERHluYW1pY0t1YmVsZXRDb25maWclM0R0cnVlJTIwJTVDJTBBJTIwJTIwLS1leGl0LW9uLWxvY2stY29udGVudGlvbiUyMCU1QyUwQSUyMCUyMC0tbG9jay1maWxlJTNEJTJGdG1wJTJGa3ViZWxldC5sb2NrJTIwJTVDJTBBJTIwJTIwLS1jb250YWluZXItcnVudGltZSUzRHJlbW90ZSUyMCU1QyUwQSUyMCUyMC0tY29udGFpbmVyLXJ1bnRpbWUtZW5kcG9pbnQlM0R1bml4JTNBJTJGJTJGJTJGcnVuJTJGY29udGFpbmVyZCUyRmNvbnRhaW5lcmQuc29jayUyMCU1QyUwQSUyMCUyMC0tbm9kZS1pcCUyMCUyNCU3QktVQkVMRVRfTk9ERV9JUCU3RCUwQSUwQSU1Qkluc3RhbGwlNUQlMEFXYW50ZWRCeSUzRG11bHRpLXVzZXIudGFyZ2V0JTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL2t1YmVybmV0ZXMvY2xvdWQtY29uZmlnIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTVCZ2xvYmFsJTVEJTBBWm9uZSUzRCUyMiUyMiUwQVZQQyUzRCUyMiUyMiUwQVN1Ym5ldElEJTNEJTIydGVzdC1zdWJuZXQlMjIlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6MjU2fSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMva3ViZXJuZXRlcy9rdWJlbGV0LmNvbmYiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixhcGlWZXJzaW9uJTNBJTIwa3ViZWxldC5jb25maWcuazhzLmlvJTJGdjFiZXRhMSUwQWtpbmQlM0ElMjBLdWJlbGV0Q29uZmlndXJhdGlvbiUwQWF1dGhlbnRpY2F0aW9uJTNBJTBBJTIwJTIwYW5vbnltb3VzJTNBJTBBJTIwJTIwJTIwJTIwZW5hYmxlZCUzQSUyMGZhbHNlJTBBJTIwJTIwd2ViaG9vayUzQSUwQSUyMCUyMCUyMCUyMGVuYWJsZWQlM0ElMjB0cnVlJTBBJTIwJTIweDUwOSUzQSUwQSUyMCUyMCUyMCUyMGNsaWVudENBRmlsZSUzQSUyMCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZwa2klMkZjYS5jcnQlMEFhdXRob3JpemF0aW9uJTNBJTBBJTIwJTIwbW9kZSUzQSUyMFdlYmhvb2slMEFjZ3JvdXBEcml2ZXIlM0ElMjBzeXN0ZW1kJTBBY2x1c3RlckROUyUzQSUwQS0lMjAxMC4wLjAuMCUwQWNsdXN0ZXJEb21haW4lM0ElMjBjbHVzdGVyLmxvY2FsJTBBZmVhdHVyZUdhdGVzJTNBJTBBJTIwJTIwUm90YXRlS3ViZWxldFNlcnZlckNlcnRpZmljYXRlJTNBJTIwdHJ1ZSUwQXByb3RlY3RLZXJuZWxEZWZhdWx0cyUzQSUyMHRydWUlMEFyZWFkT25seVBvcnQlM0ElMjAwJTBBcm90YXRlQ2VydGlmaWNhdGVzJTNBJTIwdHJ1ZSUwQXNlcnZlclRMU0Jvb3RzdHJhcCUzQSUyMHRydWUlMEFzdGF0aWNQb2RQYXRoJTNBJTIwJTJGZXRjJTJGa3ViZXJuZXRlcyUyRm1hbmlmZXN0cyUwQWt1YmVSZXNlcnZlZCUzQSUwQSUyMCUyMGNwdSUzQSUyMDIwMG0lMEElMjAlMjBlcGhlbWVyYWwtc3RvcmFnZSUzQSUyMDFHaSUwQSUyMCUyMG1lbW9yeSUzQSUyMDIwME1pJTBBc3lzdGVtUmVzZXJ2ZWQlM0ElMEElMjAlMjBjcHUlM0ElMjAyMDBtJTBBJTIwJTIwZXBoZW1lcmFsLXN0b3JhZ2UlM0ElMjAxR2klMEElMjAlMjBtZW1vcnklM0ElMjAyMDBNaSUwQXRsc0NpcGhlclN1aXRlcyUzQSUwQS0lMjBUTFNfQUVTXzEyOF9HQ01fU0hBMjU2JTBBLSUyMFRMU19BRVNfMjU2X0dDTV9TSEEzODQlMEEtJTIwVExTX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiUwQS0lMjBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYlMEEtJTIwVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0JTBBLSUyMFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1JTBBLSUyMFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYlMEEtJTIwVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCUwQS0lMjBUTFNfRUNESEVfUlNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUlMEF2b2x1bWVQbHVnaW5EaXIlM0ElMjAlMkZ2YXIlMkZsaWIlMkZrdWJlbGV0JTJGdm9sdW1lcGx1Z2lucyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlNUJVbml0JTVEJTBBUmVxdWlyZXMlM0RrdWJlbGV0LnNlcnZpY2UlMEFBZnRlciUzRGt1YmVsZXQuc2VydmljZSUwQSUwQSU1QlNlcnZpY2UlNUQlMEFFeGVjU3RhcnQlM0QlMkZvcHQlMkZiaW4lMkZoZWFsdGgtbW9uaXRvci5zaCUyMGt1YmVsZXQlMEElMEElNUJJbnN0YWxsJTVEJTBBV2FudGVkQnklM0RtdWx0aS11c2VyLnRhcmdldCUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pY19vbl9vb3BzIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosMSUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pYyIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LDEwJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvcHJvYy9zeXMvdm0vb3ZlcmNvbW1pdF9tZW1vcnkiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwxJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL3NzaC9zc2hkX2NvbmZpZyIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCUyMyUyMFVzZSUyMG1vc3QlMjBkZWZhdWx0cyUyMGZvciUyMHNzaGQlMjBjb25maWd1cmF0aW9uLiUwQVN1YnN5c3RlbSUyMHNmdHAlMjBpbnRlcm5hbC1zZnRwJTBBQ2xpZW50QWxpdmVJbnRlcnZhbCUyMDE4MCUwQVVzZUROUyUyMG5vJTBBVXNlUEFNJTIweWVzJTBBUHJpbnRMYXN0TG9nJTIwbm8lMjAlMjMlMjBoYW5kbGVkJTIwYnklMjBQQU0lMEFQcmludE1vdGQlMjBubyUyMCUyMyUyMGhhbmRsZWQlMjBieSUyMFBBTSUwQVBhc3N3b3JkQXV0aGVudGljYXRpb24lMjBubyUwQUNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24lMjBubyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjozODR9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9jb250YWluZXJkL2NvbmZpZy50b21sIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosdmVyc2lvbiUyMCUzRCUyMDIlMEElMEElNUJtZXRyaWNzJTVEJTBBYWRkcmVzcyUyMCUzRCUyMCUyMjEyNy4wLjAuMSUzQTEzMzglMjIlMEElMEElNUJwbHVnaW5zJTVEJTBBJTVCcGx1Z2lucy4lMjJpby5jb250YWluZXJkLmdycGMudjEuY3JpJTIyJTVEJTBBJTVCcGx1Z2lucy4lMjJpby5jb250YWluZXJkLmdycGMudjEuY3JpJTIyLmNvbnRhaW5lcmQlNUQlMEElNUJwbHVnaW5zLiUyMmlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmklMjIuY29udGFpbmVyZC5ydW50aW1lcyU1RCUwQSU1QnBsdWdpbnMuJTIyaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSUyMi5jb250YWluZXJkLnJ1bnRpbWVzLnJ1bmMlNUQlMEFydW50aW1lX3R5cGUlMjAlM0QlMjAlMjJpby5jb250YWluZXJkLnJ1bmMudjIlMjIlMEElNUJwbHVnaW5zLiUyMmlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmklMjIuY29udGFpbmVyZC5ydW50aW1lcy5ydW5jLm9wdGlvbnMlNUQlMEFTeXN0ZW1kQ2dyb3VwJTIwJTNEJTIwdHJ1ZSUwQSU1QnBsdWdpbnMuJTIyaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSUyMi5yZWdpc3RyeSU1RCUwQSU1QnBsdWdpbnMuJTIyaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSUyMi5yZWdpc3RyeS5taXJyb3JzJTVEJTBBJTVCcGx1Z2lucy4lMjJpby5jb250YWluZXJkLmdycGMudjEuY3JpJTIyLnJlZ2lzdHJ5Lm1pcnJvcnMuJTIyZG9ja2VyLmlvJTIyJTVEJTBBZW5kcG9pbnQlMjAlM0QlMjAlNUIlMjJodHRwcyUzQSUyRiUyRnJlZ2lzdHJ5LTEuZG9ja2VyLmlvJTIyJTVEJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL3N5c3RlbWQvc3lzdGVtL2NvbnRhaW5lcmQuc2VydmljZS5kLzEwLWN1c3RvbS5jb25mIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTVCU2VydmljZSU1RCUwQVJlc3RhcnQlM0RhbHdheXMlMEFFbnZpcm9ubWVudEZpbGUlM0QtJTJGZXRjJTJGZW52aXJvbm1lbnQlMEFFbnZpcm9ubWVudEZpbGUlM0QlMkZydW4lMkZtZXRhZGF0YSUyRnRvcmN4JTBBRW52aXJvbm1lbnQlM0RDT05UQUlORVJEX0NPTkZJRyUzRCUyRmV0YyUyRmNvbnRhaW5lcmQlMkZjb25maWcudG9tbCUwQUV4ZWNTdGFydCUzRCUwQUV4ZWNTdGFydCUzRCUyRnVzciUyRmJpbiUyRmVudiUyMFBBVEglM0QlMjQlN0JUT1JDWF9CSU5ESVIlN0QlM0ElMjQlN0JQQVRIJTdEJTIwJTI0JTdCVE9SQ1hfQklORElSJTdEJTJGY29udGFpbmVyZCUyMC0tY29uZmlnJTIwJTI0JTdCQ09OVEFJTkVSRF9DT05GSUclN0QlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDIwfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMvY3JpY3RsLnlhbWwiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixydW50aW1lLWVuZHBvaW50JTNBJTIwdW5peCUzQSUyRiUyRiUyRnJ1biUyRmNvbnRhaW5lcmQlMkZjb250YWluZXJkLnNvY2slMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDIwfV19LCJzeXN0ZW1kIjp7InVuaXRzIjpbeyJjb250ZW50cyI6IltJbnN0YWxsXVxuV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcblxuW1VuaXRdXG5SZXF1aXJlcz1kb3dubG9hZC1zY3JpcHQuc2VydmljZVxuUmVxdWlyZXM9bm9kZWlwLnNlcnZpY2VcbkFmdGVyPWRvd25sb2FkLXNjcmlwdC5zZXJ2aWNlXG5BZnRlcj1ub2RlaXAuc2VydmljZVxuXG5bU2VydmljZV1cblR5cGU9b25lc2hvdFxuUmVtYWluQWZ0ZXJFeGl0PXRydWVcbkVudmlyb25tZW50RmlsZT0tL2V0Yy9lbnZpcm9ubWVudFxuRXhlY1N0YXJ0PS9vcHQvYmluL3NldHVwXG4iLCJlbmFibGVkIjp0cnVlLCJuYW1lIjoic2V0dXAuc2VydmljZSJ9LHsiY29udGVudHMiOiJbSW5zdGFsbF1cbldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0XG5cbltVbml0XVxuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5UeXBlPW9uZXNob3RcblJlbWFpbkFmdGVyRXhpdD10cnVlXG5FbnZpcm9ubWVudEZpbGU9LS9ldGMvZW52aXJvbm1lbnRcbkV4ZWNTdGFydD0vb3B0L2Jpbi9kb3dubG9hZC5zaFxuIiwiZW5hYmxlZCI6dHJ1ZSwibmFtZSI6ImRvd25sb2FkLXNjcmlwdC5zZXJ2aWNlIn0seyJjb250ZW50cyI6IltVbml0XVxuRGVzY3JpcHRpb249U2V0dXAgS3ViZWxldCBOb2RlIElQIEVudlxuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5FeGVjU3RhcnQ9L29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaFxuUmVtYWluQWZ0ZXJFeGl0PXllc1xuVHlwZT1vbmVzaG90XG5bSW5zdGFsbF1cbldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0XG4iLCJlbmFibGVkIjp0cnVlLCJuYW1lIjoibm9kZWlwLnNlcnZpY2UifSx7ImNvbnRlbnRzIjoiW1VuaXRdXG5EZXNjcmlwdGlvbj1TZXR1cCBTdGF0aWMgTmV0d29ya2luZ1xuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5FeGVjU3RhcnQ9L29wdC9iaW4vY29uZmlndXJlX3N0YXRpY19uZXR3b3JrLnNoXG5SZW1haW5BZnRlckV4aXQ9eWVzXG5UeXBlPW9uZXNob3RcbltJbnN0YWxsXVxuV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcbiIsImVuYWJsZWQiOnRydWUsIm5hbWUiOiJzdGF0aWMtbmV0d29yay1zY3JpcHQuc2VydmljZSJ9XX19 +immutable: true kind: Secret metadata: creationTimestamp: null diff --git a/pkg/controllers/osc/testdata/secret-flatcar-aws-docker.yaml b/pkg/controllers/osc/testdata/secret-flatcar-aws-docker.yaml index e7fbc9ca..5ed4f617 100644 --- a/pkg/controllers/osc/testdata/secret-flatcar-aws-docker.yaml +++ b/pkg/controllers/osc/testdata/secret-flatcar-aws-docker.yaml @@ -1,6 +1,7 @@ apiVersion: v1 data: cloud-config: eyJpZ25pdGlvbiI6eyJjb25maWciOnt9LCJzZWN1cml0eSI6eyJ0bHMiOnt9fSwidGltZW91dHMiOnt9LCJ2ZXJzaW9uIjoiMi4zLjAifSwibmV0d29ya2QiOnt9LCJwYXNzd2QiOnsidXNlcnMiOlt7Im5hbWUiOiJjb3JlIiwic3NoQXV0aG9yaXplZEtleXMiOlsic3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFEZE9JaFltekNLNURTVkx1M2MiXX1dfSwic3RvcmFnZSI6eyJmaWxlcyI6W3siZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9zeXN0ZW1kL2pvdXJuYWxkLmNvbmYuZC9tYXhfZGlza191c2UuY29uZiIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCU1QkpvdXJuYWwlNUQlMEFTeXN0ZW1NYXhVc2UlM0Q1RyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL29wdC9sb2FkLWtlcm5lbC1tb2R1bGVzLnNoIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRnVzciUyRmJpbiUyRmVudiUyMGJhc2glMEFzZXQlMjAtZXVvJTIwcGlwZWZhaWwlMEElMEFtb2Rwcm9iZSUyMGlwX3ZzJTBBbW9kcHJvYmUlMjBpcF92c19yciUwQW1vZHByb2JlJTIwaXBfdnNfd3JyJTBBbW9kcHJvYmUlMjBpcF92c19zaCUwQSUwQWlmJTIwbW9kaW5mbyUyMG5mX2Nvbm50cmFja19pcHY0JTIwJTI2JTNFJTIwJTJGZGV2JTJGbnVsbCUzQiUyMHRoZW4lMEElMjAlMjBtb2Rwcm9iZSUyMG5mX2Nvbm50cmFja19pcHY0JTBBZWxzZSUwQSUyMCUyMG1vZHByb2JlJTIwbmZfY29ubnRyYWNrJTBBZmklMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMvc3lzY3RsLmQvazhzLmNvbmYiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyUyMCUzRCUyMDElMEFuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwdGFibGVzJTIwJTNEJTIwMSUwQWtlcm5lbC5wYW5pY19vbl9vb3BzJTIwJTNEJTIwMSUwQWtlcm5lbC5wYW5pYyUyMCUzRCUyMDEwJTBBbmV0LmlwdjQuaXBfZm9yd2FyZCUyMCUzRCUyMDElMEF2bS5vdmVyY29tbWl0X21lbW9yeSUyMCUzRCUyMDElMEFmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXMlMjAlM0QlMjAxMDQ4NTc2JTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvb3B0L2Jpbi9zZXR1cF9uZXRfZW52LnNoIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRnVzciUyRmJpbiUyRmVudiUyMGJhc2glMEFlY2hvZGF0ZSgpJTIwJTdCJTBBJTIwJTIwZWNobyUyMCUyMiU1QiUyNChkYXRlJTIwLUlzKSU1RCUyMiUyMCUyMiUyNCU0MCUyMiUwQSU3RCUwQSUwQSUyMyUyMGdldCUyMHRoZSUyMGRlZmF1bHQlMjBpbnRlcmZhY2UlMjBJUCUyMGFkZHJlc3MlMEFERUZBVUxUX0lGQ19JUCUzRCUyNChpcCUyMC1vJTIwJTIwcm91dGUlMjBnZXQlMjAxJTIwJTdDJTIwZ3JlcCUyMC1vUCUyMCUyMnNyYyUyMCU1Q0slNUNTJTJCJTIyKSUwQSUwQWlmJTIwJTVCJTIwLXolMjAlMjIlMjQlN0JERUZBVUxUX0lGQ19JUCU3RCUyMiUyMCU1RCUwQXRoZW4lMEElMjAlMjBlY2hvZGF0ZSUyMCUyMkZhaWxlZCUyMHRvJTIwZ2V0JTIwSVAlMjBhZGRyZXNzJTIwZm9yJTIwdGhlJTIwZGVmYXVsdCUyMHJvdXRlJTIwaW50ZXJmYWNlJTIyJTBBJTIwJTIwZXhpdCUyMDElMEFmaSUwQSUwQSUyMyUyMGdldCUyMHRoZSUyMGZ1bGwlMjBob3N0bmFtZSUwQUZVTExfSE9TVE5BTUUlM0QlMjQoaG9zdG5hbWUlMjAtZiklMEElMjMlMjBpZiUyMCUyRmV0YyUyRmhvc3RuYW1lJTIwaXMlMjBub3QlMjBlbXB0eSUyMHRoZW4lMjB1c2UlMjB0aGUlMjBob3N0bmFtZSUyMGZyb20lMjB0aGVyZSUwQWlmJTIwJTVCJTIwLXMlMjAlMkZldGMlMkZob3N0bmFtZSUyMCU1RCUzQiUyMHRoZW4lMEElMjAlMjAlMjAlMjBGVUxMX0hPU1ROQU1FJTNEJTI0KGNhdCUyMCUyRmV0YyUyRmhvc3RuYW1lKSUwQWZpJTBBJTBBJTIzJTIwd3JpdGUlMjB0aGUlMjBub2RlaXBfZW52JTIwZmlsZSUwQSUyMyUyMHdlJTIwbmVlZCUyMHRoZSUyMGxpbmUlMjBiZWxvdyUyMGJlY2F1c2UlMjBmbGF0Y2FyJTIwaGFzJTIwdGhlJTIwc2FtZSUyMHN0cmluZyUyMCUyMmNvcmVvcyUyMiUyMGluJTIwdGhhdCUyMGZpbGUlMEFpZiUyMGdyZXAlMjAtcSUyMGNvcmVvcyUyMCUyRmV0YyUyRm9zLXJlbGVhc2UlMEF0aGVuJTBBJTIwJTIwZWNobyUyMC1lJTIwJTIyS1VCRUxFVF9OT0RFX0lQJTNEJTI0JTdCREVGQVVMVF9JRkNfSVAlN0QlNUNuS1VCRUxFVF9IT1NUTkFNRSUzRCUyNCU3QkZVTExfSE9TVE5BTUUlN0QlMjIlMjAlM0UlMjAlMkZldGMlMkZrdWJlcm5ldGVzJTJGbm9kZWlwLmNvbmYlMEFlbGlmJTIwJTVCJTIwISUyMC1kJTIwJTJGZXRjJTJGc3lzdGVtZCUyRnN5c3RlbSUyRmt1YmVsZXQuc2VydmljZS5kJTIwJTVEJTBBdGhlbiUwQSUyMCUyMGVjaG9kYXRlJTIwJTIyQ2FuJ3QlMjBmaW5kJTIwa3ViZWxldCUyMHNlcnZpY2UlMjBleHRyYXMlMjBkaXJlY3RvcnklMjIlMEElMjAlMjBleGl0JTIwMSUwQWVsc2UlMEElMjAlMjBlY2hvJTIwLWUlMjAlMjIlNUJTZXJ2aWNlJTVEJTVDbkVudmlyb25tZW50JTNEJTVDJTIyS1VCRUxFVF9OT0RFX0lQJTNEJTI0JTdCREVGQVVMVF9JRkNfSVAlN0QlNUMlMjIlNUNuRW52aXJvbm1lbnQlM0QlNUMlMjJLVUJFTEVUX0hPU1ROQU1FJTNEJTI0JTdCRlVMTF9IT1NUTkFNRSU3RCU1QyUyMiUyMiUyMCUzRSUyMCUyRmV0YyUyRnN5c3RlbWQlMkZzeXN0ZW0lMkZrdWJlbGV0LnNlcnZpY2UuZCUyRm5vZGVpcC5jb25mJTBBZmklMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9vcHQvYmluL2NvbmZpZ3VyZV9zdGF0aWNfbmV0d29yay5zaCIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCUyMyElMkZ1c3IlMkZiaW4lMkZlbnYlMjBiYXNoJTBBc2V0JTIwLXhldW8lMjBwaXBlZmFpbCUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0OTN9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL29wdC9iaW4vZG93bmxvYWQuc2giLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlMjMhJTJGdXNyJTJGYmluJTJGZW52JTIwYmFzaCUwQXNldCUyMC14ZXVvJTIwcGlwZWZhaWwlMEFvcHRfYmluJTNEJTJGb3B0JTJGYmluJTBBdXNyX2xvY2FsX2JpbiUzRCUyRnVzciUyRmxvY2FsJTJGYmluJTBBY25pX2Jpbl9kaXIlM0QlMkZvcHQlMkZjbmklMkZiaW4lMEFta2RpciUyMC1wJTIwJTJGZXRjJTJGY25pJTJGbmV0LmQlMjAlMkZldGMlMkZrdWJlcm5ldGVzJTJGZHluYW1pYy1jb25maWctZGlyJTIwJTJGZXRjJTJGa3ViZXJuZXRlcyUyRm1hbmlmZXN0cyUyMCUyMiUyNG9wdF9iaW4lMjIlMjAlMjIlMjRjbmlfYmluX2RpciUyMiUwQWFyY2glM0QlMjQlN0JIT1NUX0FSQ0gtJTdEJTBBaWYlMjAlNUIlMjAteiUyMCUyMiUyNGFyY2glMjIlMjAlNUQlMEF0aGVuJTBBY2FzZSUyMCUyNCh1bmFtZSUyMC1tKSUyMGluJTBBeDg2XzY0KSUwQSUyMCUyMCUyMCUyMGFyY2glM0QlMjJhbWQ2NCUyMiUwQSUyMCUyMCUyMCUyMCUzQiUzQiUwQWFhcmNoNjQpJTBBJTIwJTIwJTIwJTIwYXJjaCUzRCUyMmFybTY0JTIyJTBBJTIwJTIwJTIwJTIwJTNCJTNCJTBBKiklMEElMjAlMjAlMjAlMjBlY2hvJTIwJTIydW5zdXBwb3J0ZWQlMjBDUFUlMjBhcmNoaXRlY3R1cmUlMkMlMjBleGl0aW5nJTIyJTBBJTIwJTIwJTIwJTIwZXhpdCUyMDElMEElMjAlMjAlMjAlMjAlM0IlM0IlMEFlc2FjJTBBZmklMEFDTklfVkVSU0lPTiUzRCUyMiUyNCU3QkNOSV9WRVJTSU9OJTNBLXYwLjguNyU3RCUyMiUwQWNuaV9iYXNlX3VybCUzRCUyMmh0dHBzJTNBJTJGJTJGZ2l0aHViLmNvbSUyRmNvbnRhaW5lcm5ldHdvcmtpbmclMkZwbHVnaW5zJTJGcmVsZWFzZXMlMkZkb3dubG9hZCUyRiUyNENOSV9WRVJTSU9OJTIyJTBBY25pX2ZpbGVuYW1lJTNEJTIyY25pLXBsdWdpbnMtbGludXgtJTI0YXJjaC0lMjRDTklfVkVSU0lPTi50Z3olMjIlMEFjdXJsJTIwLUxmbyUyMCUyMiUyNGNuaV9iaW5fZGlyJTJGJTI0Y25pX2ZpbGVuYW1lJTIyJTIwJTIyJTI0Y25pX2Jhc2VfdXJsJTJGJTI0Y25pX2ZpbGVuYW1lJTIyJTBBY25pX3N1bSUzRCUyNChjdXJsJTIwLUxmJTIwJTIyJTI0Y25pX2Jhc2VfdXJsJTJGJTI0Y25pX2ZpbGVuYW1lLnNoYTI1NiUyMiklMEFjZCUyMCUyMiUyNGNuaV9iaW5fZGlyJTIyJTBBc2hhMjU2c3VtJTIwLWMlMjAlM0MlM0MlM0MlMjIlMjRjbmlfc3VtJTIyJTBBdGFyJTIweHZmJTIwJTIyJTI0Y25pX2ZpbGVuYW1lJTIyJTBBcm0lMjAtZiUyMCUyMiUyNGNuaV9maWxlbmFtZSUyMiUwQWNkJTIwLSUwQUtVQkVfVkVSU0lPTiUzRCUyMiUyNCU3QktVQkVfVkVSU0lPTiUzQS12MS4yMi4xJTdEJTIyJTBBa3ViZV9kaXIlM0QlMjIlMjRvcHRfYmluJTJGa3ViZXJuZXRlcy0lMjRLVUJFX1ZFUlNJT04lMjIlMEFrdWJlX2Jhc2VfdXJsJTNEJTIyaHR0cHMlM0ElMkYlMkZzdG9yYWdlLmdvb2dsZWFwaXMuY29tJTJGa3ViZXJuZXRlcy1yZWxlYXNlJTJGcmVsZWFzZSUyRiUyNEtVQkVfVkVSU0lPTiUyRmJpbiUyRmxpbnV4JTJGJTI0YXJjaCUyMiUwQWt1YmVfc3VtX2ZpbGUlM0QlMjIlMjRrdWJlX2RpciUyRnNoYTI1NiUyMiUwQW1rZGlyJTIwLXAlMjAlMjIlMjRrdWJlX2RpciUyMiUwQSUzQSUyMCUzRSUyMiUyNGt1YmVfc3VtX2ZpbGUlMjIlMEElMEFmb3IlMjBiaW4lMjBpbiUyMGt1YmVsZXQlMjBrdWJlYWRtJTIwa3ViZWN0bCUzQiUyMGRvJTBBJTIwJTIwJTIwJTIwY3VybCUyMC1MZm8lMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUyMCUyMiUyNGt1YmVfYmFzZV91cmwlMkYlMjRiaW4lMjIlMEElMjAlMjAlMjAlMjBjaG1vZCUyMCUyQnglMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUwQSUyMCUyMCUyMCUyMHN1bSUzRCUyNChjdXJsJTIwLUxmJTIwJTIyJTI0a3ViZV9iYXNlX3VybCUyRiUyNGJpbi5zaGEyNTYlMjIpJTBBJTIwJTIwJTIwJTIwZWNobyUyMCUyMiUyNHN1bSUyMCUyMCUyNGt1YmVfZGlyJTJGJTI0YmluJTIyJTIwJTNFJTNFJTIyJTI0a3ViZV9zdW1fZmlsZSUyMiUwQWRvbmUlMEFzaGEyNTZzdW0lMjAtYyUyMCUyMiUyNGt1YmVfc3VtX2ZpbGUlMjIlMEElMEFmb3IlMjBiaW4lMjBpbiUyMGt1YmVsZXQlMjBrdWJlYWRtJTIwa3ViZWN0bCUzQiUyMGRvJTBBJTIwJTIwJTIwJTIwbG4lMjAtc2YlMjAlMjIlMjRrdWJlX2RpciUyRiUyNGJpbiUyMiUyMCUyMiUyNG9wdF9iaW4lMjIlMkYlMjRiaW4lMEFkb25lJTBBJTBBaWYlMjAlNUIlNUIlMjAhJTIwLXglMjAlMkZvcHQlMkZiaW4lMkZoZWFsdGgtbW9uaXRvci5zaCUyMCU1RCU1RCUzQiUyMHRoZW4lMEElMjAlMjAlMjAlMjBjdXJsJTIwLUxmbyUyMCUyRm9wdCUyRmJpbiUyRmhlYWx0aC1tb25pdG9yLnNoJTIwaHR0cHMlM0ElMkYlMkZyYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tJTJGa3ViZXJtYXRpYyUyRm1hY2hpbmUtY29udHJvbGxlciUyRjc5NjdhMGFmMmI3NWYyOWFkMmFiMjI3ZWVhYTI2ZWE3YjBmMmZiZGUlMkZwa2clMkZ1c2VyZGF0YSUyRnNjcmlwdHMlMkZoZWFsdGgtbW9uaXRvci5zaCUwQSUyMCUyMCUyMCUyMGNobW9kJTIwJTJCeCUyMCUyRm9wdCUyRmJpbiUyRmhlYWx0aC1tb25pdG9yLnNoJTBBZmklMEElMEFzeXN0ZW1jdGwlMjBkaXNhYmxlJTIwZG93bmxvYWQtc2NyaXB0LnNlcnZpY2UlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDkzfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9vcHQvYmluL3NldHVwIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosJTIzISUyRmJpbiUyRmJhc2glMEFzZXQlMjAteGV1byUyMHBpcGVmYWlsJTBBY2F0JTIwJTNDJTNDJTIwRU9GJTIwJTdDJTIwdGVlJTIwJTJGZXRjJTJGcG9sa2l0LTElMkZydWxlcy5kJTJGNjAtbm9yZWJvb3Rfbm9yZXN0YXJ0LnJ1bGVzJTBBcG9sa2l0LmFkZFJ1bGUoZnVuY3Rpb24oYWN0aW9uJTJDJTIwc3ViamVjdCklMjAlN0IlMEElMjAlMjBpZiUyMChhY3Rpb24uaWQlMjAlM0QlM0QlMjAlMjJvcmcuZnJlZWRlc2t0b3AubG9naW4xLnJlYm9vdCUyMiUyMCU3QyU3QyUwQSUyMCUyMCUyMCUyMCUyMCUyMGFjdGlvbi5pZCUyMCUzRCUzRCUyMCUyMm9yZy5mcmVlZGVza3RvcC5sb2dpbjEucmVib290LW11bHRpcGxlLXNlc3Npb25zJTIyKSUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMGlmJTIwKHN1YmplY3QudXNlciUyMCUzRCUzRCUyMCUyMmNvcmUlMjIpJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwcG9sa2l0LlJlc3VsdC5ZRVMlM0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlN0QlMjBlbHNlJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwcmV0dXJuJTIwcG9sa2l0LlJlc3VsdC5BVVRIX0FETUlOJTNCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTdEJTBBJTIwJTIwJTdEJTBBJTdEKSUzQiUwQUVPRiUwQXN5c3RlbWN0bCUyMHN0b3AlMjBjb250YWluZXJkJTBBc3lzdGVtY3RsJTIwZGlzYWJsZSUyMGNvbnRhaW5lcmQlMEElMEFzeXN0ZW1jdGwlMjBlbmFibGUlMjAtLW5vdyUyMGt1YmVsZXQlMEFzeXN0ZW1jdGwlMjBlbmFibGUlMjAtLW5vdyUyMC0tbm8tYmxvY2slMjBrdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UlMEFzeXN0ZW1jdGwlMjBkaXNhYmxlJTIwc2V0dXAuc2VydmljZSUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0OTN9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9rdWJlcm5ldGVzL2Jvb3RzdHJhcC1rdWJlbGV0LmNvbmYiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixhcGlWZXJzaW9uJTNBJTIwdjElMEFjbHVzdGVycyUzQSUwQS0lMjBjbHVzdGVyJTNBJTBBJTIwJTIwJTIwJTIwY2VydGlmaWNhdGUtYXV0aG9yaXR5LWRhdGElM0ElMjBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VWWGFrTkRRVEJMWjBGM1NVSkJaMGxLUVV4bVVteFhjMGs0V1ZGSVRVRXdSME5UY1VkVFNXSXpSRkZGUWtKUlZVRk5TSE40UTNwQlNrSm5UbFlLUWtGWlZFRnNWbFJOVVhOM1ExRlpSRlpSVVVsRmQwcEVVVlJGVjAxQ1VVZEJNVlZGUW5oTlRsVXlSblZKUlZwNVdWYzFhbUZZVG1waWVrVlZUVUpKUndwQk1WVkZRMmhOVEZGdVNtaGFSMXB3WkVod2NHSnRUWGhGYWtGUlFtZE9Wa0pCVFZSRFYzaDJXVEpHYzJGSE9YcGtSRVZrVFVKelIwTlRjVWRUU1dJekNrUlJSVXBCVWxsUFdXNUthRnBGUW10WlZ6VnVXVk0xYW1JeU1IZElhR05PVFZSUmQwNTZSVEZOYWtFd1RtcEJNVmRvWTA1TlZHTjNUbFJCTUUxcVFUQUtUbXBCTVZkcVFqZE5VWE4zUTFGWlJGWlJVVWRGZDBwV1ZYcEZURTFCYTBkQk1WVkZRMEpOUTFFd1JYaEdha0ZWUW1kT1ZrSkJZMVJFVms1b1ltbENSd3BqYlVaMVdUSnNlbGt5T0hoR1JFRlRRbWRPVmtKQmIxUkRNRXA1V1ZkU2JXRllValpoVnpWcVRWSkpkMFZCV1VSV1VWRkVSWGRzYzJJeVRtaGlSMmgyQ21NelVYaElWRUZpUW1kcmNXaHJhVWM1ZHpCQ1ExRkZWMFJ0U25sWlYxSkJXa2RHZFZveVJYVlpNamwwVFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVJS1FWRkZSa0ZCVDBOQlVUaEJUVWxKUWtOblMwTkJVVVZCZERWbVFXcHdOR1pVWTJWclYxVlVabnB6Y0RCcmVXbG9NVTlaWW5OSFREQkxXREZsVW1KVFV3cFNPRTlrTUNzNVVUWXlTSGx1ZVN0SFJuZE5WR0kwUVM5TFZUaHRjM052U0haalkyVlRRVUZpZDJaaWVFWkxMeXR6TlRGVWIySnhWVzVQVWxweVQyOVVDbHBxYTFWNVoySjVXRVJUU3prNVdVSmlZMUl4VUdsd09IWjNUVlJ0TkZoTGRVeDBRMmxuWlVKQ1pHcHFRVkZrWjFWUE1qaE1SVTVIYkhOTmJtMWxXV3NLU21aUFJGWkhibFp0Y2pWTWRHSTVRVTVCT0VsTGVWUm1jMjVJU2pScFQwTlRMMUJzVUdKVmFqSnhOMWx1YjFaTWNHOXpWVUpOYkdkVllpOURlV3RZTXdwdFQyOU1ZalI1U2twUmVVRXZhVk5VTmxwNGFVbEZhak0yUkRSNVYxbzFiR2MzV1Vwc0sxVnBhVUpSU0VkRGJsQmtSM2xwY0hGV01EWmxlREJvWlZsWENtTmhhVmM0VEZkYVUxVlJPVE5xVVN0WFZrTklPR2hVTjBSUlR6RmtiWE4yVlcxWWJIRXZTbVZCYkhkUkwxRkpSRUZSUVVKdk5FaG5UVWxJWkUxQ01FY0tRVEZWWkVSblVWZENRbEpqUVZKUGRHaFRORkEwVlRkMlZHWnFRbmxETlRZNVVqZEZOa1JEUW5KUldVUldVakJxUWtsSGJFMUpSMmxuUWxKalFWSlBkQXBvVXpSUU5GVTNkbFJtYWtKNVF6VTJPVkkzUlRaTFJpOXdTREIzWlhwRlRFMUJhMGRCTVZWRlFtaE5RMVpXVFhoRGVrRktRbWRPVmtKQloxUkJhMDVDQ2sxU1dYZEdRVmxFVmxGUlNFVjNNVlJaVnpSblVtNUthR0p0VG5Cak1rNTJUVkpSZDBWbldVUldVVkZMUlhkMFEyTnRSbXRhYld3d1pXMXNkVmw2UlZNS1RVSkJSMEV4VlVWQmVFMUtZa2M1YWxsWGVHOWlNMDR3VFZJd2QwZDNXVXBMYjFwSmFIWmpUa0ZSYTBKR1p6VnBZMjFHYTFGSFVtaGliV1JvVEcxT2RncGlXVWxLUVV4bVVteFhjMGs0V1ZGSVRVRjNSMEV4VldSRmQxRkdUVUZOUWtGbU9IZEVVVmxLUzI5YVNXaDJZMDVCVVVWR1FsRkJSR2RuUlVKQlJ6Wm9DbFU1WmpselRrZ3dMelp2UW1KSFIza3lSVlpWTUZWblNWUlZVVWx5Umxkdk9YSkdhM0pYTldzdldHdEVhbEZ0S3pOc2VtcFVNR2xIVWpSSmVFVXZRVzhLWlZVMmMxRm9kV0UzZDNKWFpVWkZialEzUjB3NU9HeHVRM05LWkVRM2IxcE9hRVp0VVRrMVZHSXZURzVFVldwek5WbHFPV0p5VURCT1YzcFlabGxWTkFwVlN6SmFia2xPU2xKalNuQkNPR2xTUTJGRGVFVTRSR1JqVlVZd1dIRkpSWEUyY0VFeU56SnpibTlNYldsWVRFMTJUbXd6YTFsRlpHMHJhbVUyZG05RUNqVTRVMDVXUlZWemVuUjZVWGxZYlVwRmFFTndkMVpKTUVFMlVVTnFlbGhxSzNGMmNHMTNNMXBhU0drNFNuZFlaV2s0V2xwQ1RGUlRSa0pyYVRoYU4yNEtjMGc1UWtKSU16Z3ZVM3BWYlVGT05GRklVMUI1TVdkcWNXMHdNRTlCUlRoT1lWbEVhMmd2WW5wRk5HUTNiVXhIUjAxWGNDOVhSVE5MVUZOMU9ESklSZ3ByVUdVMldHOVRZbWxNYlM5cmVHc3pNbFF3UFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0JTBBJTIwJTIwJTIwJTIwc2VydmVyJTNBJTIwaHR0cHMlM0ElMkYlMkZzZXJ2ZXIlM0E0NDMlMEElMjAlMjBuYW1lJTNBJTIwJTIyJTIyJTBBY29udGV4dHMlM0ElMjBudWxsJTBBY3VycmVudC1jb250ZXh0JTNBJTIwJTIyJTIyJTBBa2luZCUzQSUyMENvbmZpZyUwQXByZWZlcmVuY2VzJTNBJTIwJTdCJTdEJTBBdXNlcnMlM0ElMEEtJTIwbmFtZSUzQSUyMCUyMiUyMiUwQSUyMCUyMHVzZXIlM0ElMEElMjAlMjAlMjAlMjB0b2tlbiUzQSUyMG15LXRva2VuJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjM4NH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL2t1YmVybmV0ZXMvcGtpL2NhLmNydCIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LC0tLS0tQkVHSU4lMjBDRVJUSUZJQ0FURS0tLS0tJTBBTUlJRVdqQ0NBMEtnQXdJQkFnSUpBTGZSbFdzSThZUUhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ic3hDekFKQmdOViUwQUJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeVlXNWphWE5qYnpFVU1CSUclMEFBMVVFQ2hNTFFuSmhaR1pwZEhwcGJtTXhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkREVkTUJzR0NTcUdTSWIzJTBBRFFFSkFSWU9ZbkpoWkVCa1lXNW5ZUzVqYjIwd0hoY05NVFF3TnpFMU1qQTBOakExV2hjTk1UY3dOVEEwTWpBMCUwQU5qQTFXakI3TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFZOaGJpQkclMEFjbUZ1WTJselkyOHhGREFTQmdOVkJBb1RDMEp5WVdSbWFYUjZhVzVqTVJJd0VBWURWUVFERXdsc2IyTmhiR2h2JTBBYzNReEhUQWJCZ2txaGtpRzl3MEJDUUVXRG1KeVlXUkFaR0Z1WjJFdVkyOXRNSUlCSWpBTkJna3Foa2lHOXcwQiUwQUFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXQ1ZkFqcDRmVGNla1dVVGZ6c3Awa3lpaDFPWWJzR0wwS1gxZVJiU1MlMEFSOE9kMCUyQjlRNjJIeW55JTJCR0Z3TVRiNEElMkZLVThtc3NvSHZjY2VTQUFid2ZieEZLJTJGJTJCczUxVG9icVVuT1Jack9vVCUwQVpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWslMEFKZk9EVkduVm1yNUx0YjlBTkE4SUt5VGZzbkhKNGlPQ1MlMkZQbFBiVWoycTdZbm9WTHBvc1VCTWxnVWIlMkZDeWtYMyUwQW1Pb0xiNHlKSlF5QSUyRmlTVDZaeGlJRWozNkQ0eVdaNWxnN1lKbCUyQlVpaUJRSEdDblBkR3lpcHFWMDZleDBoZVlXJTBBY2FpVzhMV1pTVVE5M2pRJTJCV1ZDSDhoVDdEUU8xZG1zdlVtWGxxJTJGSmVBbHdRJTJGUUlEQVFBQm80SGdNSUhkTUIwRyUwQUExVWREZ1FXQkJSY0FST3RoUzRQNFU3dlRmakJ5QzU2OVI3RTZEQ0JyUVlEVlIwakJJR2xNSUdpZ0JSY0FST3QlMEFoUzRQNFU3dlRmakJ5QzU2OVI3RTZLRiUyRnBIMHdlekVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkIlMEFNUll3RkFZRFZRUUhFdzFUWVc0Z1JuSmhibU5wYzJOdk1SUXdFZ1lEVlFRS0V3dENjbUZrWm1sMGVtbHVZekVTJTBBTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdiUwQWJZSUpBTGZSbFdzSThZUUhNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFHNmglMEFVOWY5c05IMCUyRjZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWslMkZYa0RqUW0lMkIzbHpqVDBpR1I0SXhFJTJGQW8lMEFlVTZzUWh1YTd3cldlRkVuNDdHTDk4bG5Dc0pkRDdvWk5oRm1ROTVUYiUyRkxuRFVqczVZajliclAwTld6WGZZVTQlMEFVSzJabklOSlJjSnBCOGlSQ2FDeEU4RGRjVUYwWHFJRXE2cEEyNzJzbm9MbWlYTE12Tmwza1lFZG0lMkJqZTZ2b0QlMEE1OFNOVkVVc3p0elF5WG1KRWhDcHdWSTBBNlFDanpYaiUyQnF2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24lMEFzSDlCQkgzOCUyRlN6VW1BTjRRSFNQeTFnanFtMDBPQUU4TmFZRGtoJTJGYnpFNGQ3bUxHR01XcCUyRldFM0tQU3U4MkhGJTBBa1BlNlhvU2JpTG0lMkZreGszMlQwJTNEJTBBLS0tLS1FTkQlMjBDRVJUSUZJQ0FURS0tLS0tJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL3N5c3RlbWQvc3lzdGVtL2t1YmVsZXQuc2VydmljZSIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCU1QlVuaXQlNUQlMEFBZnRlciUzRGRvY2tlci5zZXJ2aWNlJTBBUmVxdWlyZXMlM0Rkb2NrZXIuc2VydmljZSUwQSUwQURlc2NyaXB0aW9uJTNEa3ViZWxldCUzQSUyMFRoZSUyMEt1YmVybmV0ZXMlMjBOb2RlJTIwQWdlbnQlMEFEb2N1bWVudGF0aW9uJTNEaHR0cHMlM0ElMkYlMkZrdWJlcm5ldGVzLmlvJTJGZG9jcyUyRmhvbWUlMkYlMEElMEElNUJTZXJ2aWNlJTVEJTBBUmVzdGFydCUzRGFsd2F5cyUwQVN0YXJ0TGltaXRJbnRlcnZhbCUzRDAlMEFSZXN0YXJ0U2VjJTNEMTAlMEFDUFVBY2NvdW50aW5nJTNEdHJ1ZSUwQU1lbW9yeUFjY291bnRpbmclM0R0cnVlJTBBJTBBRW52aXJvbm1lbnQlM0QlMjJQQVRIJTNEJTJGb3B0JTJGYmluJTNBJTJGYmluJTNBJTJGdXNyJTJGbG9jYWwlMkZzYmluJTNBJTJGdXNyJTJGbG9jYWwlMkZiaW4lM0ElMkZ1c3IlMkZzYmluJTNBJTJGdXNyJTJGYmluJTNBJTJGc2JpbiUyRiUyMiUwQUVudmlyb25tZW50RmlsZSUzRC0lMkZldGMlMkZlbnZpcm9ubWVudCUwQUVudmlyb25tZW50RmlsZSUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZub2RlaXAuY29uZiUwQSUwQUV4ZWNTdGFydFByZSUzRCUyRmJpbiUyRmJhc2glMjAlMkZvcHQlMkZsb2FkLWtlcm5lbC1tb2R1bGVzLnNoJTBBRXhlY1N0YXJ0UHJlJTNEJTJGYmluJTJGYmFzaCUyMCUyRm9wdCUyRmJpbiUyRnNldHVwX25ldF9lbnYuc2glMEFFeGVjU3RhcnQlM0QlMkZvcHQlMkZiaW4lMkZrdWJlbGV0JTIwJTI0S1VCRUxFVF9FWFRSQV9BUkdTJTIwJTVDJTBBJTIwJTIwLS1ib290c3RyYXAta3ViZWNvbmZpZyUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZib290c3RyYXAta3ViZWxldC5jb25mJTIwJTVDJTBBJTIwJTIwLS1rdWJlY29uZmlnJTNEJTJGdmFyJTJGbGliJTJGa3ViZWxldCUyRmt1YmVjb25maWclMjAlNUMlMEElMjAlMjAtLWNvbmZpZyUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZrdWJlbGV0LmNvbmYlMjAlNUMlMEElMjAlMjAtLW5ldHdvcmstcGx1Z2luJTNEY25pJTIwJTVDJTBBJTIwJTIwLS1jZXJ0LWRpciUzRCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZwa2klMjAlNUMlMEElMjAlMjAtLWNsb3VkLXByb3ZpZGVyJTNEYXdzJTIwJTVDJTBBJTIwJTIwLS1jbG91ZC1jb25maWclM0QlMkZldGMlMkZrdWJlcm5ldGVzJTJGY2xvdWQtY29uZmlnJTIwJTVDJTBBJTIwJTIwLS1keW5hbWljLWNvbmZpZy1kaXIlM0QlMkZldGMlMkZrdWJlcm5ldGVzJTJGZHluYW1pYy1jb25maWctZGlyJTIwJTVDJTBBJTIwJTIwLS1mZWF0dXJlLWdhdGVzJTNERHluYW1pY0t1YmVsZXRDb25maWclM0R0cnVlJTIwJTVDJTBBJTIwJTIwLS1leGl0LW9uLWxvY2stY29udGVudGlvbiUyMCU1QyUwQSUyMCUyMC0tbG9jay1maWxlJTNEJTJGdG1wJTJGa3ViZWxldC5sb2NrJTIwJTVDJTBBJTIwJTIwLS1jb250YWluZXItcnVudGltZSUzRGRvY2tlciUyMCU1QyUwQSUyMCUyMC0tY29udGFpbmVyLXJ1bnRpbWUtZW5kcG9pbnQlM0R1bml4JTNBJTJGJTJGJTJGdmFyJTJGcnVuJTJGZG9ja2Vyc2hpbS5zb2NrJTIwJTVDJTBBJTIwJTIwLS1ub2RlLWlwJTIwJTI0JTdCS1VCRUxFVF9OT0RFX0lQJTdEJTBBJTBBJTVCSW5zdGFsbCU1RCUwQVdhbnRlZEJ5JTNEbXVsdGktdXNlci50YXJnZXQlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDIwfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMva3ViZXJuZXRlcy9jbG91ZC1jb25maWciLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlNUJnbG9iYWwlNUQlMEFab25lJTNEJTIyJTIyJTBBVlBDJTNEJTIyJTIyJTBBU3VibmV0SUQlM0QlMjIlMjIlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6MjU2fSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMva3ViZXJuZXRlcy9rdWJlbGV0LmNvbmYiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOixhcGlWZXJzaW9uJTNBJTIwa3ViZWxldC5jb25maWcuazhzLmlvJTJGdjFiZXRhMSUwQWtpbmQlM0ElMjBLdWJlbGV0Q29uZmlndXJhdGlvbiUwQWF1dGhlbnRpY2F0aW9uJTNBJTBBJTIwJTIwYW5vbnltb3VzJTNBJTBBJTIwJTIwJTIwJTIwZW5hYmxlZCUzQSUyMGZhbHNlJTBBJTIwJTIwd2ViaG9vayUzQSUwQSUyMCUyMCUyMCUyMGVuYWJsZWQlM0ElMjB0cnVlJTBBJTIwJTIweDUwOSUzQSUwQSUyMCUyMCUyMCUyMGNsaWVudENBRmlsZSUzQSUyMCUyRmV0YyUyRmt1YmVybmV0ZXMlMkZwa2klMkZjYS5jcnQlMEFhdXRob3JpemF0aW9uJTNBJTBBJTIwJTIwbW9kZSUzQSUyMFdlYmhvb2slMEFjZ3JvdXBEcml2ZXIlM0ElMjBzeXN0ZW1kJTBBY2x1c3RlckROUyUzQSUwQS0lMjAxMC4wLjAuMCUwQWNsdXN0ZXJEb21haW4lM0ElMjBjbHVzdGVyLmxvY2FsJTBBZmVhdHVyZUdhdGVzJTNBJTBBJTIwJTIwUm90YXRlS3ViZWxldFNlcnZlckNlcnRpZmljYXRlJTNBJTIwdHJ1ZSUwQXByb3RlY3RLZXJuZWxEZWZhdWx0cyUzQSUyMHRydWUlMEFyZWFkT25seVBvcnQlM0ElMjAwJTBBcm90YXRlQ2VydGlmaWNhdGVzJTNBJTIwdHJ1ZSUwQXNlcnZlclRMU0Jvb3RzdHJhcCUzQSUyMHRydWUlMEFzdGF0aWNQb2RQYXRoJTNBJTIwJTJGZXRjJTJGa3ViZXJuZXRlcyUyRm1hbmlmZXN0cyUwQWt1YmVSZXNlcnZlZCUzQSUwQSUyMCUyMGNwdSUzQSUyMDIwMG0lMEElMjAlMjBlcGhlbWVyYWwtc3RvcmFnZSUzQSUyMDFHaSUwQSUyMCUyMG1lbW9yeSUzQSUyMDIwME1pJTBBc3lzdGVtUmVzZXJ2ZWQlM0ElMEElMjAlMjBjcHUlM0ElMjAyMDBtJTBBJTIwJTIwZXBoZW1lcmFsLXN0b3JhZ2UlM0ElMjAxR2klMEElMjAlMjBtZW1vcnklM0ElMjAyMDBNaSUwQXRsc0NpcGhlclN1aXRlcyUzQSUwQS0lMjBUTFNfQUVTXzEyOF9HQ01fU0hBMjU2JTBBLSUyMFRMU19BRVNfMjU2X0dDTV9TSEEzODQlMEEtJTIwVExTX0NIQUNIQTIwX1BPTFkxMzA1X1NIQTI1NiUwQS0lMjBUTFNfRUNESEVfRUNEU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYlMEEtJTIwVExTX0VDREhFX0VDRFNBX1dJVEhfQUVTXzI1Nl9HQ01fU0hBMzg0JTBBLSUyMFRMU19FQ0RIRV9FQ0RTQV9XSVRIX0NIQUNIQTIwX1BPTFkxMzA1JTBBLSUyMFRMU19FQ0RIRV9SU0FfV0lUSF9BRVNfMTI4X0dDTV9TSEEyNTYlMEEtJTIwVExTX0VDREhFX1JTQV9XSVRIX0FFU18yNTZfR0NNX1NIQTM4NCUwQS0lMjBUTFNfRUNESEVfUlNBX1dJVEhfQ0hBQ0hBMjBfUE9MWTEzMDUlMEF2b2x1bWVQbHVnaW5EaXIlM0ElMjAlMkZ2YXIlMkZsaWIlMkZrdWJlbGV0JTJGdm9sdW1lcGx1Z2lucyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlNUJVbml0JTVEJTBBUmVxdWlyZXMlM0RrdWJlbGV0LnNlcnZpY2UlMEFBZnRlciUzRGt1YmVsZXQuc2VydmljZSUwQSUwQSU1QlNlcnZpY2UlNUQlMEFFeGVjU3RhcnQlM0QlMkZvcHQlMkZiaW4lMkZoZWFsdGgtbW9uaXRvci5zaCUyMGt1YmVsZXQlMEElMEElNUJJbnN0YWxsJTVEJTBBV2FudGVkQnklM0RtdWx0aS11c2VyLnRhcmdldCUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pY19vbl9vb3BzIiwiY29udGVudHMiOnsic291cmNlIjoiZGF0YTosMSUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjo0MjB9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL3Byb2Mvc3lzL2tlcm5lbC9wYW5pYyIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LDEwJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvcHJvYy9zeXMvdm0vb3ZlcmNvbW1pdF9tZW1vcnkiLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwxJTBBIiwidmVyaWZpY2F0aW9uIjp7fX0sIm1vZGUiOjQyMH0seyJmaWxlc3lzdGVtIjoicm9vdCIsInBhdGgiOiIvZXRjL3NzaC9zc2hkX2NvbmZpZyIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCUyMyUyMFVzZSUyMG1vc3QlMjBkZWZhdWx0cyUyMGZvciUyMHNzaGQlMjBjb25maWd1cmF0aW9uLiUwQVN1YnN5c3RlbSUyMHNmdHAlMjBpbnRlcm5hbC1zZnRwJTBBQ2xpZW50QWxpdmVJbnRlcnZhbCUyMDE4MCUwQVVzZUROUyUyMG5vJTBBVXNlUEFNJTIweWVzJTBBUHJpbnRMYXN0TG9nJTIwbm8lMjAlMjMlMjBoYW5kbGVkJTIwYnklMjBQQU0lMEFQcmludE1vdGQlMjBubyUyMCUyMyUyMGhhbmRsZWQlMjBieSUyMFBBTSUwQVBhc3N3b3JkQXV0aGVudGljYXRpb24lMjBubyUwQUNoYWxsZW5nZVJlc3BvbnNlQXV0aGVudGljYXRpb24lMjBubyUwQSIsInZlcmlmaWNhdGlvbiI6e319LCJtb2RlIjozODR9LHsiZmlsZXN5c3RlbSI6InJvb3QiLCJwYXRoIjoiL2V0Yy9kb2NrZXIvZGFlbW9uLmpzb24iLCJjb250ZW50cyI6eyJzb3VyY2UiOiJkYXRhOiwlN0IlMjJleGVjLW9wdHMlMjIlM0ElNUIlMjJuYXRpdmUuY2dyb3VwZHJpdmVyJTNEc3lzdGVtZCUyMiU1RCUyQyUyMnN0b3JhZ2UtZHJpdmVyJTIyJTNBJTIyb3ZlcmxheTIlMjIlMkMlMjJsb2ctZHJpdmVyJTIyJTNBJTIyanNvbi1maWxlJTIyJTJDJTIybG9nLW9wdHMlMjIlM0ElN0IlMjJtYXgtZmlsZSUyMiUzQSUyMjUlMjIlMkMlMjJtYXgtc2l6ZSUyMiUzQSUyMjEwMG0lMjIlN0QlN0QlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDIwfSx7ImZpbGVzeXN0ZW0iOiJyb290IiwicGF0aCI6Ii9ldGMvc3lzdGVtZC9zeXN0ZW0vZG9ja2VyLnNlcnZpY2UuZC8xMC1jdXN0b20uY29uZiIsImNvbnRlbnRzIjp7InNvdXJjZSI6ImRhdGE6LCU1QlNlcnZpY2UlNUQlMEFFbnZpcm9ubWVudEZpbGUlM0QtJTJGZXRjJTJGZW52aXJvbm1lbnQlMEEiLCJ2ZXJpZmljYXRpb24iOnt9fSwibW9kZSI6NDIwfV19LCJzeXN0ZW1kIjp7InVuaXRzIjpbeyJjb250ZW50cyI6IltJbnN0YWxsXVxuV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcblxuW1VuaXRdXG5SZXF1aXJlcz1kb3dubG9hZC1zY3JpcHQuc2VydmljZVxuUmVxdWlyZXM9bm9kZWlwLnNlcnZpY2VcbkFmdGVyPWRvd25sb2FkLXNjcmlwdC5zZXJ2aWNlXG5BZnRlcj1ub2RlaXAuc2VydmljZVxuXG5bU2VydmljZV1cblR5cGU9b25lc2hvdFxuUmVtYWluQWZ0ZXJFeGl0PXRydWVcbkVudmlyb25tZW50RmlsZT0tL2V0Yy9lbnZpcm9ubWVudFxuRXhlY1N0YXJ0PS9vcHQvYmluL3NldHVwXG4iLCJlbmFibGVkIjp0cnVlLCJuYW1lIjoic2V0dXAuc2VydmljZSJ9LHsiY29udGVudHMiOiJbSW5zdGFsbF1cbldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0XG5cbltVbml0XVxuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5UeXBlPW9uZXNob3RcblJlbWFpbkFmdGVyRXhpdD10cnVlXG5FbnZpcm9ubWVudEZpbGU9LS9ldGMvZW52aXJvbm1lbnRcbkV4ZWNTdGFydD0vb3B0L2Jpbi9kb3dubG9hZC5zaFxuIiwiZW5hYmxlZCI6dHJ1ZSwibmFtZSI6ImRvd25sb2FkLXNjcmlwdC5zZXJ2aWNlIn0seyJjb250ZW50cyI6IltVbml0XVxuRGVzY3JpcHRpb249U2V0dXAgS3ViZWxldCBOb2RlIElQIEVudlxuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5FeGVjU3RhcnQ9L29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaFxuUmVtYWluQWZ0ZXJFeGl0PXllc1xuVHlwZT1vbmVzaG90XG5bSW5zdGFsbF1cbldhbnRlZEJ5PW11bHRpLXVzZXIudGFyZ2V0XG4iLCJlbmFibGVkIjp0cnVlLCJuYW1lIjoibm9kZWlwLnNlcnZpY2UifSx7ImNvbnRlbnRzIjoiW1VuaXRdXG5EZXNjcmlwdGlvbj1TZXR1cCBTdGF0aWMgTmV0d29ya2luZ1xuUmVxdWlyZXM9bmV0d29yay1vbmxpbmUudGFyZ2V0XG5BZnRlcj1uZXR3b3JrLW9ubGluZS50YXJnZXRcblxuW1NlcnZpY2VdXG5FeGVjU3RhcnQ9L29wdC9iaW4vY29uZmlndXJlX3N0YXRpY19uZXR3b3JrLnNoXG5SZW1haW5BZnRlckV4aXQ9eWVzXG5UeXBlPW9uZXNob3RcbltJbnN0YWxsXVxuV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXRcbiIsImVuYWJsZWQiOnRydWUsIm5hbWUiOiJzdGF0aWMtbmV0d29yay1zY3JpcHQuc2VydmljZSJ9XX19 +immutable: true kind: Secret metadata: creationTimestamp: null diff --git a/pkg/controllers/osc/testdata/secret-rhel-8.x-containerd.yaml b/pkg/controllers/osc/testdata/secret-rhel-8.x-containerd.yaml index c87e7dae..a4cd7af4 100644 --- a/pkg/controllers/osc/testdata/secret-rhel-8.x-containerd.yaml +++ b/pkg/controllers/osc/testdata/secret-rhel-8.x-containerd.yaml @@ -1,6 +1,7 @@ apiVersion: v1 data: cloud-config: I2Nsb3VkLWNvbmZpZwoKc3NoX3B3YXV0aDogbm8Kc3NoX2F1dGhvcml6ZWRfa2V5czoKLSAnc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFEZE9JaFltekNLNURTVkx1M2MnCndyaXRlX2ZpbGVzOgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvam91cm5hbGQuY29uZi5kL21heF9kaXNrX3VzZS5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBbSm91cm5hbF0KICAgIFN5c3RlbU1heFVzZT01RwogICAgCgotIHBhdGg6ICcvb3B0L2xvYWQta2VybmVsLW1vZHVsZXMuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS91c3IvYmluL2VudiBiYXNoCiAgICBzZXQgLWV1byBwaXBlZmFpbAogICAgCiAgICBtb2Rwcm9iZSBpcF92cwogICAgbW9kcHJvYmUgaXBfdnNfcnIKICAgIG1vZHByb2JlIGlwX3ZzX3dycgogICAgbW9kcHJvYmUgaXBfdnNfc2gKICAgIAogICAgaWYgbW9kaW5mbyBuZl9jb25udHJhY2tfaXB2NCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrX2lwdjQKICAgIGVsc2UKICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrCiAgICBmaQogICAgCgotIHBhdGg6ICcvZXRjL3N5c2N0bC5kL2s4cy5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyA9IDEKICAgIG5ldC5icmlkZ2UuYnJpZGdlLW5mLWNhbGwtaXB0YWJsZXMgPSAxCiAgICBrZXJuZWwucGFuaWNfb25fb29wcyA9IDEKICAgIGtlcm5lbC5wYW5pYyA9IDEwCiAgICBuZXQuaXB2NC5pcF9mb3J3YXJkID0gMQogICAgdm0ub3ZlcmNvbW1pdF9tZW1vcnkgPSAxCiAgICBmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXMgPSAxMDQ4NTc2CiAgICAKCi0gcGF0aDogJy9ldGMvc2VsaW51eC9jb25maWcnCiAgY29udGVudDogfC0KICAgICMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4IG9uIHRoZSBzeXN0ZW0uCiAgICAjIFNFTElOVVg9IGNhbiB0YWtlIG9uZSBvZiB0aGVzZSB0aHJlZSB2YWx1ZXM6CiAgICAjICAgICBlbmZvcmNpbmcgLSBTRUxpbnV4IHNlY3VyaXR5IHBvbGljeSBpcyBlbmZvcmNlZC4KICAgICMgICAgIHBlcm1pc3NpdmUgLSBTRUxpbnV4IHByaW50cyB3YXJuaW5ncyBpbnN0ZWFkIG9mIGVuZm9yY2luZy4KICAgICMgICAgIGRpc2FibGVkIC0gTm8gU0VMaW51eCBwb2xpY3kgaXMgbG9hZGVkLgogICAgU0VMSU5VWD1wZXJtaXNzaXZlCiAgICAjIFNFTElOVVhUWVBFPSBjYW4gdGFrZSBvbmUgb2YgdGhyZWUgdHdvIHZhbHVlczoKICAgICMgICAgIHRhcmdldGVkIC0gVGFyZ2V0ZWQgcHJvY2Vzc2VzIGFyZSBwcm90ZWN0ZWQsCiAgICAjICAgICBtaW5pbXVtIC0gTW9kaWZpY2F0aW9uIG9mIHRhcmdldGVkIHBvbGljeS4gT25seSBzZWxlY3RlZCBwcm9jZXNzZXMgYXJlIHByb3RlY3RlZC4KICAgICMgICAgIG1scyAtIE11bHRpIExldmVsIFNlY3VyaXR5IHByb3RlY3Rpb24uCiAgICBTRUxJTlVYVFlQRT10YXJnZXRlZAogICAgCgotIHBhdGg6ICcvb3B0L2Jpbi9zZXR1cCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL2Jpbi9iYXNoCiAgICBzZXQgLXhldW8gcGlwZWZhaWwKICAgIAogICAgc2V0ZW5mb3JjZSAwIHx8IHRydWUKICAgIHN5c3RlbWN0bCByZXN0YXJ0IHN5c3RlbWQtbW9kdWxlcy1sb2FkLnNlcnZpY2UKICAgIHN5c2N0bCAtLXN5c3RlbQogICAgc2VkIC1pLm9yaWcgJy8uKnN3YXAuKi9kJyAvZXRjL2ZzdGFiCiAgICBzd2Fwb2ZmIC1hCiAgICAKICAgIAogICAgeXVtIGluc3RhbGwgLXkgXAogICAgICBkZXZpY2UtbWFwcGVyLXBlcnNpc3RlbnQtZGF0YSBcCiAgICAgIGx2bTIgXAogICAgICBlYnRhYmxlcyBcCiAgICAgIGV0aHRvb2wgXAogICAgICBuZnMtdXRpbHMgXAogICAgICBiYXNoLWNvbXBsZXRpb24gXAogICAgICBzdWRvIFwKICAgICAgc29jYXQgXAogICAgICB3Z2V0IFwKICAgICAgY3VybCBcCiAgICAgIGlwdnNhZG0KICAgIHl1bSBpbnN0YWxsIC15IHl1bS11dGlscwogICAgeXVtLWNvbmZpZy1tYW5hZ2VyIC0tYWRkLXJlcG89aHR0cHM6Ly9kb3dubG9hZC5kb2NrZXIuY29tL2xpbnV4L2NlbnRvcy9kb2NrZXItY2UucmVwbwogICAgeXVtLWNvbmZpZy1tYW5hZ2VyIC0tc2F2ZSAtLXNldG9wdD1kb2NrZXItY2Utc3RhYmxlLm1vZHVsZV9ob3RmaXhlcz10cnVlCiAgICAKICAgIGNhdCA8PEVPRiB8IHRlZSAvZXRjL2NyaWN0bC55YW1sCiAgICBydW50aW1lLWVuZHBvaW50OiB1bml4Oi8vL3J1bi9jb250YWluZXJkL2NvbnRhaW5lcmQuc29jawogICAgRU9GCiAgICAKICAgIG1rZGlyIC1wIC9ldGMvc3lzdGVtZC9zeXN0ZW0vY29udGFpbmVyZC5zZXJ2aWNlLmQKICAgIGNhdCA8PEVPRiB8IHRlZSAvZXRjL3N5c3RlbWQvc3lzdGVtL2NvbnRhaW5lcmQuc2VydmljZS5kL2Vudmlyb25tZW50LmNvbmYKICAgIFtTZXJ2aWNlXQogICAgUmVzdGFydD1hbHdheXMKICAgIEVudmlyb25tZW50RmlsZT0tL2V0Yy9lbnZpcm9ubWVudAogICAgRU9GCiAgICAKICAgIHl1bSBpbnN0YWxsIC15IGNvbnRhaW5lcmQuaW8tMS40KiB5dW0tcGx1Z2luLXZlcnNpb25sb2NrCiAgICB5dW0gdmVyc2lvbmxvY2sgYWRkIGNvbnRhaW5lcmQuaW8KICAgIAogICAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKICAgIHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgY29udGFpbmVyZAogICAgb3B0X2Jpbj0vb3B0L2JpbgogICAgY25pX2Jpbl9kaXI9L29wdC9jbmkvYmluCiAgICBta2RpciAtcCAvZXRjL2NuaS9uZXQuZCAvZXRjL2t1YmVybmV0ZXMvZHluYW1pYy1jb25maWctZGlyIC9ldGMva3ViZXJuZXRlcy9tYW5pZmVzdHMgIiRvcHRfYmluIiAiJGNuaV9iaW5fZGlyIgogICAgYXJjaD0ke0hPU1RfQVJDSC19CiAgICBpZiBbIC16ICIkYXJjaCIgXQogICAgdGhlbgogICAgY2FzZSAkKHVuYW1lIC1tKSBpbgogICAgeDg2XzY0KQogICAgICAgIGFyY2g9ImFtZDY0IgogICAgICAgIDs7CiAgICBhYXJjaDY0KQogICAgICAgIGFyY2g9ImFybTY0IgogICAgICAgIDs7CiAgICAqKQogICAgICAgIGVjaG8gInVuc3VwcG9ydGVkIENQVSBhcmNoaXRlY3R1cmUsIGV4aXRpbmciCiAgICAgICAgZXhpdCAxCiAgICAgICAgOzsKICAgIGVzYWMKICAgIGZpCiAgICBDTklfVkVSU0lPTj0iJHtDTklfVkVSU0lPTjotdjAuOC43fSIKICAgIGNuaV9iYXNlX3VybD0iaHR0cHM6Ly9naXRodWIuY29tL2NvbnRhaW5lcm5ldHdvcmtpbmcvcGx1Z2lucy9yZWxlYXNlcy9kb3dubG9hZC8kQ05JX1ZFUlNJT04iCiAgICBjbmlfZmlsZW5hbWU9ImNuaS1wbHVnaW5zLWxpbnV4LSRhcmNoLSRDTklfVkVSU0lPTi50Z3oiCiAgICBjdXJsIC1MZm8gIiRjbmlfYmluX2Rpci8kY25pX2ZpbGVuYW1lIiAiJGNuaV9iYXNlX3VybC8kY25pX2ZpbGVuYW1lIgogICAgY25pX3N1bT0kKGN1cmwgLUxmICIkY25pX2Jhc2VfdXJsLyRjbmlfZmlsZW5hbWUuc2hhMjU2IikKICAgIGNkICIkY25pX2Jpbl9kaXIiCiAgICBzaGEyNTZzdW0gLWMgPDw8IiRjbmlfc3VtIgogICAgdGFyIHh2ZiAiJGNuaV9maWxlbmFtZSIKICAgIHJtIC1mICIkY25pX2ZpbGVuYW1lIgogICAgY2QgLQogICAgS1VCRV9WRVJTSU9OPSIke0tVQkVfVkVSU0lPTjotdjEuMjIuMX0iCiAgICBrdWJlX2Rpcj0iJG9wdF9iaW4va3ViZXJuZXRlcy0kS1VCRV9WRVJTSU9OIgogICAga3ViZV9iYXNlX3VybD0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2t1YmVybmV0ZXMtcmVsZWFzZS9yZWxlYXNlLyRLVUJFX1ZFUlNJT04vYmluL2xpbnV4LyRhcmNoIgogICAga3ViZV9zdW1fZmlsZT0iJGt1YmVfZGlyL3NoYTI1NiIKICAgIG1rZGlyIC1wICIka3ViZV9kaXIiCiAgICA6ID4iJGt1YmVfc3VtX2ZpbGUiCiAgICAKICAgIGZvciBiaW4gaW4ga3ViZWxldCBrdWJlYWRtIGt1YmVjdGw7IGRvCiAgICAgICAgY3VybCAtTGZvICIka3ViZV9kaXIvJGJpbiIgIiRrdWJlX2Jhc2VfdXJsLyRiaW4iCiAgICAgICAgY2htb2QgK3ggIiRrdWJlX2Rpci8kYmluIgogICAgICAgIHN1bT0kKGN1cmwgLUxmICIka3ViZV9iYXNlX3VybC8kYmluLnNoYTI1NiIpCiAgICAgICAgZWNobyAiJHN1bSAgJGt1YmVfZGlyLyRiaW4iID4+IiRrdWJlX3N1bV9maWxlIgogICAgZG9uZQogICAgc2hhMjU2c3VtIC1jICIka3ViZV9zdW1fZmlsZSIKICAgIAogICAgZm9yIGJpbiBpbiBrdWJlbGV0IGt1YmVhZG0ga3ViZWN0bDsgZG8KICAgICAgICBsbiAtc2YgIiRrdWJlX2Rpci8kYmluIiAiJG9wdF9iaW4iLyRiaW4KICAgIGRvbmUKICAgIAogICAgaWYgW1sgISAteCAvb3B0L2Jpbi9oZWFsdGgtbW9uaXRvci5zaCBdXTsgdGhlbgogICAgICAgIGN1cmwgLUxmbyAvb3B0L2Jpbi9oZWFsdGgtbW9uaXRvci5zaCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20va3ViZXJtYXRpYy9tYWNoaW5lLWNvbnRyb2xsZXIvNzk2N2EwYWYyYjc1ZjI5YWQyYWIyMjdlZWFhMjZlYTdiMGYyZmJkZS9wa2cvdXNlcmRhdGEvc2NyaXB0cy9oZWFsdGgtbW9uaXRvci5zaAogICAgICAgIGNobW9kICt4IC9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoCiAgICBmaQogICAgCiAgICBta2RpciAtcCAvZXRjL3N5c3RlbWQvc3lzdGVtL2t1YmVsZXQuc2VydmljZS5kLwogICAgIyBzZXQga3ViZWxldCBub2RlaXAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgIC9vcHQvYmluL3NldHVwX25ldF9lbnYuc2gKICAgIAogICAgc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyBrdWJlbGV0CiAgICBzeXN0ZW1jdGwgZW5hYmxlIC0tbm93IC0tbm8tYmxvY2sga3ViZWxldC1oZWFsdGhjaGVjay5zZXJ2aWNlCiAgICAKCi0gcGF0aDogJy9vcHQvYmluL3N1cGVydmlzZS5zaCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL2Jpbi9iYXNoCiAgICBzZXQgLXhldW8gcGlwZWZhaWwKICAgIHdoaWxlICEgIiRAIjsgZG8KICAgICAgc2xlZXAgMQogICAgZG9uZQogICAgCgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvc3lzdGVtL2t1YmVsZXQuc2VydmljZScKICBjb250ZW50OiB8LQogICAgW1VuaXRdCiAgICBBZnRlcj1jb250YWluZXJkLnNlcnZpY2UKICAgIFJlcXVpcmVzPWNvbnRhaW5lcmQuc2VydmljZQogICAgCiAgICBEZXNjcmlwdGlvbj1rdWJlbGV0OiBUaGUgS3ViZXJuZXRlcyBOb2RlIEFnZW50CiAgICBEb2N1bWVudGF0aW9uPWh0dHBzOi8va3ViZXJuZXRlcy5pby9kb2NzL2hvbWUvCiAgICAKICAgIFtTZXJ2aWNlXQogICAgUmVzdGFydD1hbHdheXMKICAgIFN0YXJ0TGltaXRJbnRlcnZhbD0wCiAgICBSZXN0YXJ0U2VjPTEwCiAgICBDUFVBY2NvdW50aW5nPXRydWUKICAgIE1lbW9yeUFjY291bnRpbmc9dHJ1ZQogICAgCiAgICBFbnZpcm9ubWVudD0iUEFUSD0vb3B0L2JpbjovYmluOi91c3IvbG9jYWwvc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL3NiaW46L3Vzci9iaW46L3NiaW4vIgogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICAKICAgIEV4ZWNTdGFydFByZT0vYmluL2Jhc2ggL29wdC9sb2FkLWtlcm5lbC1tb2R1bGVzLnNoCiAgICBFeGVjU3RhcnRQcmU9L2Jpbi9iYXNoIC9vcHQvYmluL3NldHVwX25ldF9lbnYuc2gKICAgIEV4ZWNTdGFydD0vb3B0L2Jpbi9rdWJlbGV0ICRLVUJFTEVUX0VYVFJBX0FSR1MgXAogICAgICAtLWJvb3RzdHJhcC1rdWJlY29uZmlnPS9ldGMva3ViZXJuZXRlcy9ib290c3RyYXAta3ViZWxldC5jb25mIFwKICAgICAgLS1rdWJlY29uZmlnPS92YXIvbGliL2t1YmVsZXQva3ViZWNvbmZpZyBcCiAgICAgIC0tY29uZmlnPS9ldGMva3ViZXJuZXRlcy9rdWJlbGV0LmNvbmYgXAogICAgICAtLW5ldHdvcmstcGx1Z2luPWNuaSBcCiAgICAgIC0tY2VydC1kaXI9L2V0Yy9rdWJlcm5ldGVzL3BraSBcCiAgICAgIC0tY2xvdWQtcHJvdmlkZXI9YXdzIFwKICAgICAgLS1jbG91ZC1jb25maWc9L2V0Yy9rdWJlcm5ldGVzL2Nsb3VkLWNvbmZpZyBcCiAgICAgIC0tZHluYW1pYy1jb25maWctZGlyPS9ldGMva3ViZXJuZXRlcy9keW5hbWljLWNvbmZpZy1kaXIgXAogICAgICAtLWZlYXR1cmUtZ2F0ZXM9RHluYW1pY0t1YmVsZXRDb25maWc9dHJ1ZSBcCiAgICAgIC0tZXhpdC1vbi1sb2NrLWNvbnRlbnRpb24gXAogICAgICAtLWxvY2stZmlsZT0vdG1wL2t1YmVsZXQubG9jayBcCiAgICAgIC0tY29udGFpbmVyLXJ1bnRpbWU9cmVtb3RlIFwKICAgICAgLS1jb250YWluZXItcnVudGltZS1lbmRwb2ludD11bml4Oi8vL3J1bi9jb250YWluZXJkL2NvbnRhaW5lcmQuc29jayBcCiAgICAgIC0tbm9kZS1pcCAke0tVQkVMRVRfTk9ERV9JUH0KICAgIAogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgCgotIHBhdGg6ICcvZXRjL2t1YmVybmV0ZXMvY2xvdWQtY29uZmlnJwogIHBlcm1pc3Npb25zOiAnMDYwMCcKICBjb250ZW50OiB8LQogICAgW2dsb2JhbF0KICAgIFpvbmU9IiIKICAgIFZQQz0iIgogICAgU3VibmV0SUQ9InRlc3Qtc3VibmV0IgogICAgCiAgICAKCi0gcGF0aDogJy9vcHQvYmluL3NldHVwX25ldF9lbnYuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS91c3IvYmluL2VudiBiYXNoCiAgICBlY2hvZGF0ZSgpIHsKICAgICAgZWNobyAiWyQoZGF0ZSAtSXMpXSIgIiRAIgogICAgfQogICAgCiAgICAjIGdldCB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgSVAgYWRkcmVzcwogICAgREVGQVVMVF9JRkNfSVA9JChpcCAtbyAgcm91dGUgZ2V0IDEgfCBncmVwIC1vUCAic3JjIFxLXFMrIikKICAgIAogICAgaWYgWyAteiAiJHtERUZBVUxUX0lGQ19JUH0iIF0KICAgIHRoZW4KICAgICAgZWNob2RhdGUgIkZhaWxlZCB0byBnZXQgSVAgYWRkcmVzcyBmb3IgdGhlIGRlZmF1bHQgcm91dGUgaW50ZXJmYWNlIgogICAgICBleGl0IDEKICAgIGZpCiAgICAKICAgICAjIGdldCB0aGUgZnVsbCBob3N0bmFtZQogICAgRlVMTF9IT1NUTkFNRT0kKGhvc3RuYW1lIC1mKQogICAgCiAgICAjIHdyaXRlIHRoZSBub2RlaXBfZW52IGZpbGUKICAgICMgd2UgbmVlZCB0aGUgbGluZSBiZWxvdyBiZWNhdXNlIGZsYXRjYXIgaGFzIHRoZSBzYW1lIHN0cmluZyAiY29yZW9zIiBpbiB0aGF0IGZpbGUKICAgIGlmIGdyZXAgLXEgY29yZW9zIC9ldGMvb3MtcmVsZWFzZQogICAgdGhlbgogICAgICBlY2hvICJLVUJFTEVUX05PREVfSVA9JHtERUZBVUxUX0lGQ19JUH1cbktVQkVMRVRfSE9TVE5BTUU9JHtGVUxMX0hPU1ROQU1FfSIgPiAvZXRjL2t1YmVybmV0ZXMvbm9kZWlwLmNvbmYKICAgIGVsaWYgWyAhIC1kIC9ldGMvc3lzdGVtZC9zeXN0ZW0va3ViZWxldC5zZXJ2aWNlLmQgXQogICAgdGhlbgogICAgICBlY2hvZGF0ZSAiQ2FuJ3QgZmluZCBrdWJlbGV0IHNlcnZpY2UgZXh0cmFzIGRpcmVjdG9yeSIKICAgICAgZXhpdCAxCiAgICBlbHNlCiAgICAgIGVjaG8gLWUgIltTZXJ2aWNlXVxuRW52aXJvbm1lbnQ9XCJLVUJFTEVUX05PREVfSVA9JHtERUZBVUxUX0lGQ19JUH1cIlxuRW52aXJvbm1lbnQ9XCJLVUJFTEVUX0hPU1ROQU1FPSR7RlVMTF9IT1NUTkFNRX1cIiIgPiAvZXRjL3N5c3RlbWQvc3lzdGVtL2t1YmVsZXQuc2VydmljZS5kL25vZGVpcC5jb25mCiAgICBmaQogICAgCgotIHBhdGg6ICcvZXRjL2t1YmVybmV0ZXMvYm9vdHN0cmFwLWt1YmVsZXQuY29uZicKICBwZXJtaXNzaW9uczogJzA2MDAnCiAgY29udGVudDogfC0KICAgIGFwaVZlcnNpb246IHYxCiAgICBjbHVzdGVyczoKICAgIC0gY2x1c3RlcjoKICAgICAgICBjZXJ0aWZpY2F0ZS1hdXRob3JpdHktZGF0YTogTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVVlhha05EUVRCTFowRjNTVUpCWjBsS1FVeG1VbXhYYzBrNFdWRklUVUV3UjBOVGNVZFRTV0l6UkZGRlFrSlJWVUZOU0hONFEzcEJTa0puVGxZS1FrRlpWRUZzVmxSTlVYTjNRMUZaUkZaUlVVbEZkMHBFVVZSRlYwMUNVVWRCTVZWRlFuaE5UbFV5Um5WSlJWcDVXVmMxYW1GWVRtcGlla1ZWVFVKSlJ3cEJNVlZGUTJoTlRGRnVTbWhhUjFwd1pFaHdjR0p0VFhoRmFrRlJRbWRPVmtKQlRWUkRWM2gyV1RKR2MyRkhPWHBrUkVWa1RVSnpSME5UY1VkVFNXSXpDa1JSUlVwQlVsbFBXVzVLYUZwRlFtdFpWelZ1V1ZNMWFtSXlNSGRJYUdOT1RWUlJkMDU2UlRGTmFrRXdUbXBCTVZkb1kwNU5WR04zVGxSQk1FMXFRVEFLVG1wQk1WZHFRamROVVhOM1ExRlpSRlpSVVVkRmQwcFdWWHBGVEUxQmEwZEJNVlZGUTBKTlExRXdSWGhHYWtGVlFtZE9Wa0pCWTFSRVZrNW9ZbWxDUndwamJVWjFXVEpzZWxreU9IaEdSRUZUUW1kT1ZrSkJiMVJETUVwNVdWZFNiV0ZZVWpaaFZ6VnFUVkpKZDBWQldVUldVVkZFUlhkc2MySXlUbWhpUjJoMkNtTXpVWGhJVkVGaVFtZHJjV2hyYVVjNWR6QkNRMUZGVjBSdFNubFpWMUpCV2tkR2RWb3lSWFZaTWpsMFRVbEpRa2xxUVU1Q1oydHhhR3RwUnpsM01FSUtRVkZGUmtGQlQwTkJVVGhCVFVsSlFrTm5TME5CVVVWQmREVm1RV3B3TkdaVVkyVnJWMVZVWm5wemNEQnJlV2xvTVU5WlluTkhUREJMV0RGbFVtSlRVd3BTT0U5a01DczVVVFl5U0hsdWVTdEhSbmROVkdJMFFTOUxWVGh0YzNOdlNIWmpZMlZUUVVGaWQyWmllRVpMTHl0ek5URlViMkp4Vlc1UFVscHlUMjlVQ2xwcWExVjVaMko1V0VSVFN6azVXVUppWTFJeFVHbHdPSFozVFZSdE5GaExkVXgwUTJsblpVSkNaR3BxUVZGa1oxVlBNamhNUlU1SGJITk5ibTFsV1dzS1NtWlBSRlpIYmxadGNqVk1kR0k1UVU1Qk9FbExlVlJtYzI1SVNqUnBUME5UTDFCc1VHSlZhakp4TjFsdWIxWk1jRzl6VlVKTmJHZFZZaTlEZVd0WU13cHRUMjlNWWpSNVNrcFJlVUV2YVZOVU5scDRhVWxGYWpNMlJEUjVWMW8xYkdjM1dVcHNLMVZwYVVKUlNFZERibEJrUjNscGNIRldNRFpsZURCb1pWbFhDbU5oYVZjNFRGZGFVMVZST1ROcVVTdFhWa05JT0doVU4wUlJUekZrYlhOMlZXMVliSEV2U21WQmJIZFJMMUZKUkVGUlFVSnZORWhuVFVsSVpFMUNNRWNLUVRGVlpFUm5VVmRDUWxKalFWSlBkR2hUTkZBMFZUZDJWR1pxUW5sRE5UWTVVamRGTmtSRFFuSlJXVVJXVWpCcVFrbEhiRTFKUjJsblFsSmpRVkpQZEFwb1V6UlFORlUzZGxSbWFrSjVRelUyT1ZJM1JUWkxSaTl3U0RCM1pYcEZURTFCYTBkQk1WVkZRbWhOUTFaV1RYaERla0ZLUW1kT1ZrSkJaMVJCYTA1Q0NrMVNXWGRHUVZsRVZsRlJTRVYzTVZSWlZ6Um5VbTVLYUdKdFRuQmpNazUyVFZKUmQwVm5XVVJXVVZGTFJYZDBRMk50Um10YWJXd3daVzFzZFZsNlJWTUtUVUpCUjBFeFZVVkJlRTFLWWtjNWFsbFhlRzlpTTA0d1RWSXdkMGQzV1VwTGIxcEphSFpqVGtGUmEwSkdaelZwWTIxR2ExRkhVbWhpYldSb1RHMU9kZ3BpV1VsS1FVeG1VbXhYYzBrNFdWRklUVUYzUjBFeFZXUkZkMUZHVFVGTlFrRm1PSGRFVVZsS1MyOWFTV2gyWTA1QlVVVkdRbEZCUkdkblJVSkJSelpvQ2xVNVpqbHpUa2d3THpadlFtSkhSM2t5UlZaVk1GVm5TVlJWVVVseVJsZHZPWEpHYTNKWE5Xc3ZXR3RFYWxGdEt6TnNlbXBVTUdsSFVqUkplRVV2UVc4S1pWVTJjMUZvZFdFM2QzSlhaVVpGYmpRM1IwdzVPR3h1UTNOS1pFUTNiMXBPYUVadFVUazFWR0l2VEc1RVZXcHpOVmxxT1dKeVVEQk9WM3BZWmxsVk5BcFZTekphYmtsT1NsSmpTbkJDT0dsU1EyRkRlRVU0UkdSalZVWXdXSEZKUlhFMmNFRXlOekp6Ym05TWJXbFlURTEyVG13emExbEZaRzByYW1VMmRtOUVDalU0VTA1V1JWVnplblI2VVhsWWJVcEZhRU53ZDFaSk1FRTJVVU5xZWxocUszRjJjRzEzTTFwYVNHazRTbmRZWldrNFdscENURlJUUmtKcmFUaGFOMjRLYzBnNVFrSklNemd2VTNwVmJVRk9ORkZJVTFCNU1XZHFjVzB3TUU5QlJUaE9ZVmxFYTJndllucEZOR1EzYlV4SFIwMVhjQzlYUlROTFVGTjFPREpJUmdwclVHVTJXRzlUWW1sTWJTOXJlR3N6TWxRd1BRb3RMUzB0TFVWT1JDQkRSVkpVU1VaSlEwRlVSUzB0TFMwdAogICAgICAgIHNlcnZlcjogaHR0cHM6Ly9zZXJ2ZXI6NDQzCiAgICAgIG5hbWU6ICIiCiAgICBjb250ZXh0czogbnVsbAogICAgY3VycmVudC1jb250ZXh0OiAiIgogICAga2luZDogQ29uZmlnCiAgICBwcmVmZXJlbmNlczoge30KICAgIHVzZXJzOgogICAgLSBuYW1lOiAiIgogICAgICB1c2VyOgogICAgICAgIHRva2VuOiBteS10b2tlbgogICAgCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9wa2kvY2EuY3J0JwogIGNvbnRlbnQ6IHwtCiAgICAtLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KICAgIE1JSUVXakNDQTBLZ0F3SUJBZ0lKQUxmUmxXc0k4WVFITUEwR0NTcUdTSWIzRFFFQkJRVUFNSHN4Q3pBSkJnTlYKICAgIEJBWVRBbFZUTVFzd0NRWURWUVFJRXdKRFFURVdNQlFHQTFVRUJ4TU5VMkZ1SUVaeVlXNWphWE5qYnpFVU1CSUcKICAgIEExVUVDaE1MUW5KaFpHWnBkSHBwYm1NeEVqQVFCZ05WQkFNVENXeHZZMkZzYUc5emRERWRNQnNHQ1NxR1NJYjMKICAgIERRRUpBUllPWW5KaFpFQmtZVzVuWVM1amIyMHdIaGNOTVRRd056RTFNakEwTmpBMVdoY05NVGN3TlRBME1qQTAKICAgIE5qQTFXakI3TVFzd0NRWURWUVFHRXdKVlV6RUxNQWtHQTFVRUNCTUNRMEV4RmpBVUJnTlZCQWNURFZOaGJpQkcKICAgIGNtRnVZMmx6WTI4eEZEQVNCZ05WQkFvVEMwSnlZV1JtYVhSNmFXNWpNUkl3RUFZRFZRUURFd2xzYjJOaGJHaHYKICAgIGMzUXhIVEFiQmdrcWhraUc5dzBCQ1FFV0RtSnlZV1JBWkdGdVoyRXVZMjl0TUlJQklqQU5CZ2txaGtpRzl3MEIKICAgIEFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXQ1ZkFqcDRmVGNla1dVVGZ6c3Awa3lpaDFPWWJzR0wwS1gxZVJiU1MKICAgIFI4T2QwKzlRNjJIeW55K0dGd01UYjRBL0tVOG1zc29IdmNjZVNBQWJ3ZmJ4RksvK3M1MVRvYnFVbk9SWnJPb1QKICAgIFpqa1V5Z2J5WERTSzk5WUJiY1IxUGlwOHZ3TVRtNFhLdUx0Q2lnZUJCZGpqQVFkZ1VPMjhMRU5HbHNNbm1lWWsKICAgIEpmT0RWR25WbXI1THRiOUFOQThJS3lUZnNuSEo0aU9DUy9QbFBiVWoycTdZbm9WTHBvc1VCTWxnVWIvQ3lrWDMKICAgIG1Pb0xiNHlKSlF5QS9pU1Q2WnhpSUVqMzZENHlXWjVsZzdZSmwrVWlpQlFIR0NuUGRHeWlwcVYwNmV4MGhlWVcKICAgIGNhaVc4TFdaU1VROTNqUStXVkNIOGhUN0RRTzFkbXN2VW1YbHEvSmVBbHdRL1FJREFRQUJvNEhnTUlIZE1CMEcKICAgIEExVWREZ1FXQkJSY0FST3RoUzRQNFU3dlRmakJ5QzU2OVI3RTZEQ0JyUVlEVlIwakJJR2xNSUdpZ0JSY0FST3QKICAgIGhTNFA0VTd2VGZqQnlDNTY5UjdFNktGL3BIMHdlekVMTUFrR0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFrTkIKICAgIE1SWXdGQVlEVlFRSEV3MVRZVzRnUm5KaGJtTnBjMk52TVJRd0VnWURWUVFLRXd0Q2NtRmtabWwwZW1sdVl6RVMKICAgIE1CQUdBMVVFQXhNSmJHOWpZV3hvYjNOME1SMHdHd1lKS29aSWh2Y05BUWtCRmc1aWNtRmtRR1JoYm1kaExtTnYKICAgIGJZSUpBTGZSbFdzSThZUUhNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFHNmgKICAgIFU5ZjlzTkgwLzZvQmJHR3kyRVZVMFVnSVRVUUlyRldvOXJGa3JXNWsvWGtEalFtKzNsempUMGlHUjRJeEUvQW8KICAgIGVVNnNRaHVhN3dyV2VGRW40N0dMOThsbkNzSmREN29aTmhGbVE5NVRiL0xuRFVqczVZajliclAwTld6WGZZVTQKICAgIFVLMlpuSU5KUmNKcEI4aVJDYUN4RThEZGNVRjBYcUlFcTZwQTI3MnNub0xtaVhMTXZObDNrWUVkbStqZTZ2b0QKICAgIDU4U05WRVVzenR6UXlYbUpFaENwd1ZJMEE2UUNqelhqK3F2cG13M1paSGk4SndYZWk4WlpCTFRTRkJraThaN24KICAgIHNIOUJCSDM4L1N6VW1BTjRRSFNQeTFnanFtMDBPQUU4TmFZRGtoL2J6RTRkN21MR0dNV3AvV0UzS1BTdTgySEYKICAgIGtQZTZYb1NiaUxtL2t4azMyVDA9CiAgICAtLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCiAgICAKCi0gcGF0aDogJy9ldGMvc3lzdGVtZC9zeXN0ZW0vc2V0dXAuc2VydmljZScKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgY29udGVudDogfC0KICAgIFtJbnN0YWxsXQogICAgV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKICAgIAogICAgW1VuaXRdCiAgICBSZXF1aXJlcz1uZXR3b3JrLW9ubGluZS50YXJnZXQKICAgIEFmdGVyPW5ldHdvcmstb25saW5lLnRhcmdldAogICAgCiAgICBbU2VydmljZV0KICAgIFR5cGU9b25lc2hvdAogICAgUmVtYWluQWZ0ZXJFeGl0PXRydWUKICAgIEVudmlyb25tZW50RmlsZT0tL2V0Yy9lbnZpcm9ubWVudAogICAgRXhlY1N0YXJ0PS9vcHQvYmluL3N1cGVydmlzZS5zaCAvb3B0L2Jpbi9zZXR1cAogICAgCgotIHBhdGg6ICcvZXRjL3Byb2ZpbGUuZC9vcHQtYmluLXBhdGguc2gnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICBleHBvcnQgUEFUSD0iL29wdC9iaW46JFBBVEgiCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9rdWJlbGV0LmNvbmYnCiAgY29udGVudDogfC0KICAgIGFwaVZlcnNpb246IGt1YmVsZXQuY29uZmlnLms4cy5pby92MWJldGExCiAgICBraW5kOiBLdWJlbGV0Q29uZmlndXJhdGlvbgogICAgYXV0aGVudGljYXRpb246CiAgICAgIGFub255bW91czoKICAgICAgICBlbmFibGVkOiBmYWxzZQogICAgICB3ZWJob29rOgogICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgeDUwOToKICAgICAgICBjbGllbnRDQUZpbGU6IC9ldGMva3ViZXJuZXRlcy9wa2kvY2EuY3J0CiAgICBhdXRob3JpemF0aW9uOgogICAgICBtb2RlOiBXZWJob29rCiAgICBjZ3JvdXBEcml2ZXI6IHN5c3RlbWQKICAgIGNsdXN0ZXJETlM6CiAgICAtICIxMC4wLjAuMCIKICAgIGNsdXN0ZXJEb21haW46IGNsdXN0ZXIubG9jYWwKICAgIGZlYXR1cmVHYXRlczoKICAgICAgUm90YXRlS3ViZWxldFNlcnZlckNlcnRpZmljYXRlOiB0cnVlCiAgICBwcm90ZWN0S2VybmVsRGVmYXVsdHM6IHRydWUKICAgIHJlYWRPbmx5UG9ydDogMAogICAgcm90YXRlQ2VydGlmaWNhdGVzOiB0cnVlCiAgICBzZXJ2ZXJUTFNCb290c3RyYXA6IHRydWUKICAgIHN0YXRpY1BvZFBhdGg6IC9ldGMva3ViZXJuZXRlcy9tYW5pZmVzdHMKICAgIGt1YmVSZXNlcnZlZDoKICAgICAgY3B1OiAyMDBtCiAgICAgIGVwaGVtZXJhbC1zdG9yYWdlOiAxR2kKICAgICAgbWVtb3J5OiAyMDBNaQogICAgc3lzdGVtUmVzZXJ2ZWQ6CiAgICAgIGNwdTogMjAwbQogICAgICBlcGhlbWVyYWwtc3RvcmFnZTogMUdpCiAgICAgIG1lbW9yeTogMjAwTWkKICAgIHZvbHVtZVBsdWdpbkRpcjogL3Zhci9saWIva3ViZWxldC92b2x1bWVwbHVnaW5zCiAgICAKCi0gcGF0aDogJy9ldGMvc3lzdGVtZC9zeXN0ZW0va3ViZWxldC1oZWFsdGhjaGVjay5zZXJ2aWNlJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBjb250ZW50OiB8LQogICAgW1VuaXRdCiAgICBSZXF1aXJlcz1rdWJlbGV0LnNlcnZpY2UKICAgIEFmdGVyPWt1YmVsZXQuc2VydmljZQogICAgCiAgICBbU2VydmljZV0KICAgIEV4ZWNTdGFydD0vb3B0L2Jpbi9oZWFsdGgtbW9uaXRvci5zaCBrdWJlbGV0CiAgICAKICAgIFtJbnN0YWxsXQogICAgV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKICAgIAoKLSBwYXRoOiAnL2V0Yy9jb250YWluZXJkL2NvbmZpZy50b21sJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBjb250ZW50OiB8LQogICAgdmVyc2lvbiA9IDIKICAgIAogICAgW21ldHJpY3NdCiAgICBhZGRyZXNzID0gIjEyNy4wLjAuMToxMzM4IgogICAgCiAgICBbcGx1Z2luc10KICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIl0KICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5jb250YWluZXJkXQogICAgW3BsdWdpbnMuImlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmkiLmNvbnRhaW5lcmQucnVudGltZXNdCiAgICBbcGx1Z2lucy4iaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSIuY29udGFpbmVyZC5ydW50aW1lcy5ydW5jXQogICAgcnVudGltZV90eXBlID0gImlvLmNvbnRhaW5lcmQucnVuYy52MiIKICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5jb250YWluZXJkLnJ1bnRpbWVzLnJ1bmMub3B0aW9uc10KICAgIFN5c3RlbWRDZ3JvdXAgPSB0cnVlCiAgICBbcGx1Z2lucy4iaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSIucmVnaXN0cnldCiAgICBbcGx1Z2lucy4iaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSIucmVnaXN0cnkubWlycm9yc10KICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5yZWdpc3RyeS5taXJyb3JzLiJkb2NrZXIuaW8iXQogICAgZW5kcG9pbnQgPSBbImh0dHBzOi8vcmVnaXN0cnktMS5kb2NrZXIuaW8iXQogICAgCgpib290Y21kOgotIG1vZHByb2JlIGlwX3RhYmxlcwo= +immutable: true kind: Secret metadata: creationTimestamp: null diff --git a/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-containerd.yaml b/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-containerd.yaml index 1acdf2b5..2dd5ffed 100644 --- a/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-containerd.yaml +++ b/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-containerd.yaml @@ -1,6 +1,7 @@ apiVersion: v1 data: cloud-config: I2Nsb3VkLWNvbmZpZwoKc3NoX3B3YXV0aDogbm8Kc3NoX2F1dGhvcml6ZWRfa2V5czoKLSAnc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFEZE9JaFltekNLNURTVkx1M2MnCndyaXRlX2ZpbGVzOgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvam91cm5hbGQuY29uZi5kL21heF9kaXNrX3VzZS5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBbSm91cm5hbF0KICAgIFN5c3RlbU1heFVzZT01RwogICAgCgotIHBhdGg6ICcvb3B0L2xvYWQta2VybmVsLW1vZHVsZXMuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS91c3IvYmluL2VudiBiYXNoCiAgICBzZXQgLWV1byBwaXBlZmFpbAogICAgCiAgICBtb2Rwcm9iZSBpcF92cwogICAgbW9kcHJvYmUgaXBfdnNfcnIKICAgIG1vZHByb2JlIGlwX3ZzX3dycgogICAgbW9kcHJvYmUgaXBfdnNfc2gKICAgIAogICAgaWYgbW9kaW5mbyBuZl9jb25udHJhY2tfaXB2NCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrX2lwdjQKICAgIGVsc2UKICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrCiAgICBmaQogICAgCgotIHBhdGg6ICcvZXRjL3N5c2N0bC5kL2s4cy5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyA9IDEKICAgIG5ldC5icmlkZ2UuYnJpZGdlLW5mLWNhbGwtaXB0YWJsZXMgPSAxCiAgICBrZXJuZWwucGFuaWNfb25fb29wcyA9IDEKICAgIGtlcm5lbC5wYW5pYyA9IDEwCiAgICBuZXQuaXB2NC5pcF9mb3J3YXJkID0gMQogICAgdm0ub3ZlcmNvbW1pdF9tZW1vcnkgPSAxCiAgICBmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXMgPSAxMDQ4NTc2CiAgICAKCi0gcGF0aDogJy9ldGMvZGVmYXVsdC9ncnViLmQvNjAtc3dhcC1hY2NvdW50aW5nLmNmZycKICBjb250ZW50OiB8LQogICAgIyBBZGRlZCBieSBrdWJlcm1hdGljIG1hY2hpbmUtY29udHJvbGxlcgogICAgIyBFbmFibGUgY2dyb3VwcyBtZW1vcnkgYW5kIHN3YXAgYWNjb3VudGluZwogICAgR1JVQl9DTURMSU5FX0xJTlVYPSJjZ3JvdXBfZW5hYmxlPW1lbW9yeSBzd2FwYWNjb3VudD0xIgogICAgCgotIHBhdGg6ICcvb3B0L2Jpbi9zZXR1cCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL2Jpbi9iYXNoCiAgICBzZXQgLXhldW8gcGlwZWZhaWwKICAgIGlmIHN5c3RlbWN0bCBpcy1hY3RpdmUgdWZ3OyB0aGVuIHN5c3RlbWN0bCBzdG9wIHVmdzsgZmkKICAgIHN5c3RlbWN0bCBtYXNrIHVmdwogICAgc3lzdGVtY3RsIHJlc3RhcnQgc3lzdGVtZC1tb2R1bGVzLWxvYWQuc2VydmljZQogICAgc3lzY3RsIC0tc3lzdGVtCiAgICBzZWQgLWkub3JpZyAnLy4qc3dhcC4qL2QnIC9ldGMvZnN0YWIKICAgIHN3YXBvZmYgLWEKICAgIAogICAgYXB0LWdldCB1cGRhdGUKICAgIAogICAgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLW8gRHBrZzo6T3B0aW9uczo6PSItLWZvcmNlLWNvbmZkZWYiIC1vIERwa2c6Ok9wdGlvbnM6Oj0iLS1mb3JjZS1jb25mb2xkIiBpbnN0YWxsIC15IFwKICAgICAgY3VybCBcCiAgICAgIGNhLWNlcnRpZmljYXRlcyBcCiAgICAgIGNlcGgtY29tbW9uIFwKICAgICAgY2lmcy11dGlscyBcCiAgICAgIGNvbm50cmFjayBcCiAgICAgIGUyZnNwcm9ncyBcCiAgICAgIGVidGFibGVzIFwKICAgICAgZXRodG9vbCBcCiAgICAgIGdsdXN0ZXJmcy1jbGllbnQgXAogICAgICBpcHRhYmxlcyBcCiAgICAgIGpxIFwKICAgICAga21vZCBcCiAgICAgIG9wZW5zc2gtY2xpZW50IFwKICAgICAgbmZzLWNvbW1vbiBcCiAgICAgIHNvY2F0IFwKICAgICAgdXRpbC1saW51eCBcCiAgICAgIGlwdnNhZG0KICAgIGFwdC1nZXQgdXBkYXRlCiAgICBhcHQtZ2V0IGluc3RhbGwgLXkgYXB0LXRyYW5zcG9ydC1odHRwcyBjYS1jZXJ0aWZpY2F0ZXMgY3VybCBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBsc2ItcmVsZWFzZQogICAgY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGFwdC1rZXkgYWRkIC0KICAgIGFkZC1hcHQtcmVwb3NpdG9yeSAiZGViIGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9saW51eC91YnVudHUgJChsc2JfcmVsZWFzZSAtY3MpIHN0YWJsZSIKICAgIAogICAgY2F0IDw8RU9GIHwgdGVlIC9ldGMvY3JpY3RsLnlhbWwKICAgIHJ1bnRpbWUtZW5kcG9pbnQ6IHVuaXg6Ly8vcnVuL2NvbnRhaW5lcmQvY29udGFpbmVyZC5zb2NrCiAgICBFT0YKICAgIAogICAgbWtkaXIgLXAgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9jb250YWluZXJkLnNlcnZpY2UuZAogICAgY2F0IDw8RU9GIHwgdGVlIC9ldGMvc3lzdGVtZC9zeXN0ZW0vY29udGFpbmVyZC5zZXJ2aWNlLmQvZW52aXJvbm1lbnQuY29uZgogICAgW1NlcnZpY2VdCiAgICBSZXN0YXJ0PWFsd2F5cwogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICBFT0YKICAgIAogICAgYXB0LWdldCBpbnN0YWxsIC15IC0tYWxsb3ctZG93bmdyYWRlcyBjb250YWluZXJkLmlvPTEuNCoKICAgIGFwdC1tYXJrIGhvbGQgY29udGFpbmVyZC5pbwogICAgCiAgICBzeXN0ZW1jdGwgZGFlbW9uLXJlbG9hZAogICAgc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyBjb250YWluZXJkCiAgICBvcHRfYmluPS9vcHQvYmluCiAgICBjbmlfYmluX2Rpcj0vb3B0L2NuaS9iaW4KICAgIG1rZGlyIC1wIC9ldGMvY25pL25ldC5kIC9ldGMva3ViZXJuZXRlcy9keW5hbWljLWNvbmZpZy1kaXIgL2V0Yy9rdWJlcm5ldGVzL21hbmlmZXN0cyAiJG9wdF9iaW4iICIkY25pX2Jpbl9kaXIiCiAgICBhcmNoPSR7SE9TVF9BUkNILX0KICAgIGlmIFsgLXogIiRhcmNoIiBdCiAgICB0aGVuCiAgICBjYXNlICQodW5hbWUgLW0pIGluCiAgICB4ODZfNjQpCiAgICAgICAgYXJjaD0iYW1kNjQiCiAgICAgICAgOzsKICAgIGFhcmNoNjQpCiAgICAgICAgYXJjaD0iYXJtNjQiCiAgICAgICAgOzsKICAgICopCiAgICAgICAgZWNobyAidW5zdXBwb3J0ZWQgQ1BVIGFyY2hpdGVjdHVyZSwgZXhpdGluZyIKICAgICAgICBleGl0IDEKICAgICAgICA7OwogICAgZXNhYwogICAgZmkKICAgIENOSV9WRVJTSU9OPSIke0NOSV9WRVJTSU9OOi12MC44Ljd9IgogICAgY25pX2Jhc2VfdXJsPSJodHRwczovL2dpdGh1Yi5jb20vY29udGFpbmVybmV0d29ya2luZy9wbHVnaW5zL3JlbGVhc2VzL2Rvd25sb2FkLyRDTklfVkVSU0lPTiIKICAgIGNuaV9maWxlbmFtZT0iY25pLXBsdWdpbnMtbGludXgtJGFyY2gtJENOSV9WRVJTSU9OLnRneiIKICAgIGN1cmwgLUxmbyAiJGNuaV9iaW5fZGlyLyRjbmlfZmlsZW5hbWUiICIkY25pX2Jhc2VfdXJsLyRjbmlfZmlsZW5hbWUiCiAgICBjbmlfc3VtPSQoY3VybCAtTGYgIiRjbmlfYmFzZV91cmwvJGNuaV9maWxlbmFtZS5zaGEyNTYiKQogICAgY2QgIiRjbmlfYmluX2RpciIKICAgIHNoYTI1NnN1bSAtYyA8PDwiJGNuaV9zdW0iCiAgICB0YXIgeHZmICIkY25pX2ZpbGVuYW1lIgogICAgcm0gLWYgIiRjbmlfZmlsZW5hbWUiCiAgICBjZCAtCiAgICBLVUJFX1ZFUlNJT049IiR7S1VCRV9WRVJTSU9OOi12MS4yMi4xfSIKICAgIGt1YmVfZGlyPSIkb3B0X2Jpbi9rdWJlcm5ldGVzLSRLVUJFX1ZFUlNJT04iCiAgICBrdWJlX2Jhc2VfdXJsPSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20va3ViZXJuZXRlcy1yZWxlYXNlL3JlbGVhc2UvJEtVQkVfVkVSU0lPTi9iaW4vbGludXgvJGFyY2giCiAgICBrdWJlX3N1bV9maWxlPSIka3ViZV9kaXIvc2hhMjU2IgogICAgbWtkaXIgLXAgIiRrdWJlX2RpciIKICAgIDogPiIka3ViZV9zdW1fZmlsZSIKICAgIAogICAgZm9yIGJpbiBpbiBrdWJlbGV0IGt1YmVhZG0ga3ViZWN0bDsgZG8KICAgICAgICBjdXJsIC1MZm8gIiRrdWJlX2Rpci8kYmluIiAiJGt1YmVfYmFzZV91cmwvJGJpbiIKICAgICAgICBjaG1vZCAreCAiJGt1YmVfZGlyLyRiaW4iCiAgICAgICAgc3VtPSQoY3VybCAtTGYgIiRrdWJlX2Jhc2VfdXJsLyRiaW4uc2hhMjU2IikKICAgICAgICBlY2hvICIkc3VtICAka3ViZV9kaXIvJGJpbiIgPj4iJGt1YmVfc3VtX2ZpbGUiCiAgICBkb25lCiAgICBzaGEyNTZzdW0gLWMgIiRrdWJlX3N1bV9maWxlIgogICAgCiAgICBmb3IgYmluIGluIGt1YmVsZXQga3ViZWFkbSBrdWJlY3RsOyBkbwogICAgICAgIGxuIC1zZiAiJGt1YmVfZGlyLyRiaW4iICIkb3B0X2JpbiIvJGJpbgogICAgZG9uZQogICAgCiAgICBpZiBbWyAhIC14IC9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIF1dOyB0aGVuCiAgICAgICAgY3VybCAtTGZvIC9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rdWJlcm1hdGljL21hY2hpbmUtY29udHJvbGxlci83OTY3YTBhZjJiNzVmMjlhZDJhYjIyN2VlYWEyNmVhN2IwZjJmYmRlL3BrZy91c2VyZGF0YS9zY3JpcHRzL2hlYWx0aC1tb25pdG9yLnNoCiAgICAgICAgY2htb2QgK3ggL29wdC9iaW4vaGVhbHRoLW1vbml0b3Iuc2gKICAgIGZpCiAgICAKICAgICMgc2V0IGt1YmVsZXQgbm9kZWlwIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAvb3B0L2Jpbi9zZXR1cF9uZXRfZW52LnNoCiAgICAKICAgIHN5c3RlbWN0bCBlbmFibGUgLS1ub3cga3ViZWxldAogICAgc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyAtLW5vLWJsb2NrIGt1YmVsZXQtaGVhbHRoY2hlY2suc2VydmljZQogICAgCgotIHBhdGg6ICcvb3B0L2Jpbi9zdXBlcnZpc2Uuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS9iaW4vYmFzaAogICAgc2V0IC14ZXVvIHBpcGVmYWlsCiAgICB3aGlsZSAhICIkQCI7IGRvCiAgICAgIHNsZWVwIDEKICAgIGRvbmUKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UnCiAgY29udGVudDogfC0KICAgIFtVbml0XQogICAgQWZ0ZXI9Y29udGFpbmVyZC5zZXJ2aWNlCiAgICBSZXF1aXJlcz1jb250YWluZXJkLnNlcnZpY2UKICAgIAogICAgRGVzY3JpcHRpb249a3ViZWxldDogVGhlIEt1YmVybmV0ZXMgTm9kZSBBZ2VudAogICAgRG9jdW1lbnRhdGlvbj1odHRwczovL2t1YmVybmV0ZXMuaW8vZG9jcy9ob21lLwogICAgCiAgICBbU2VydmljZV0KICAgIFJlc3RhcnQ9YWx3YXlzCiAgICBTdGFydExpbWl0SW50ZXJ2YWw9MAogICAgUmVzdGFydFNlYz0xMAogICAgQ1BVQWNjb3VudGluZz10cnVlCiAgICBNZW1vcnlBY2NvdW50aW5nPXRydWUKICAgIAogICAgRW52aXJvbm1lbnQ9IlBBVEg9L29wdC9iaW46L2JpbjovdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluLyIKICAgIEVudmlyb25tZW50RmlsZT0tL2V0Yy9lbnZpcm9ubWVudAogICAgCiAgICBFeGVjU3RhcnRQcmU9L2Jpbi9iYXNoIC9vcHQvbG9hZC1rZXJuZWwtbW9kdWxlcy5zaAogICAgRXhlY1N0YXJ0UHJlPS9iaW4vYmFzaCAvb3B0L2Jpbi9zZXR1cF9uZXRfZW52LnNoCiAgICBFeGVjU3RhcnQ9L29wdC9iaW4va3ViZWxldCAkS1VCRUxFVF9FWFRSQV9BUkdTIFwKICAgICAgLS1ib290c3RyYXAta3ViZWNvbmZpZz0vZXRjL2t1YmVybmV0ZXMvYm9vdHN0cmFwLWt1YmVsZXQuY29uZiBcCiAgICAgIC0ta3ViZWNvbmZpZz0vdmFyL2xpYi9rdWJlbGV0L2t1YmVjb25maWcgXAogICAgICAtLWNvbmZpZz0vZXRjL2t1YmVybmV0ZXMva3ViZWxldC5jb25mIFwKICAgICAgLS1uZXR3b3JrLXBsdWdpbj1jbmkgXAogICAgICAtLWNlcnQtZGlyPS9ldGMva3ViZXJuZXRlcy9wa2kgXAogICAgICAtLWNsb3VkLXByb3ZpZGVyPWF3cyBcCiAgICAgIC0tY2xvdWQtY29uZmlnPS9ldGMva3ViZXJuZXRlcy9jbG91ZC1jb25maWcgXAogICAgICAtLWR5bmFtaWMtY29uZmlnLWRpcj0vZXRjL2t1YmVybmV0ZXMvZHluYW1pYy1jb25maWctZGlyIFwKICAgICAgLS1mZWF0dXJlLWdhdGVzPUR5bmFtaWNLdWJlbGV0Q29uZmlnPXRydWUgXAogICAgICAtLWV4aXQtb24tbG9jay1jb250ZW50aW9uIFwKICAgICAgLS1sb2NrLWZpbGU9L3RtcC9rdWJlbGV0LmxvY2sgXAogICAgICAtLWNvbnRhaW5lci1ydW50aW1lPXJlbW90ZSBcCiAgICAgIC0tY29udGFpbmVyLXJ1bnRpbWUtZW5kcG9pbnQ9dW5peDovLy9ydW4vY29udGFpbmVyZC9jb250YWluZXJkLnNvY2sgXAogICAgICAtLW5vZGUtaXAgJHtLVUJFTEVUX05PREVfSVB9CiAgICAKICAgIFtJbnN0YWxsXQogICAgV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UuZC9leHRyYXMuY29uZicKICBjb250ZW50OiB8LQogICAgW1NlcnZpY2VdCiAgICBFbnZpcm9ubWVudD0iS1VCRUxFVF9FWFRSQV9BUkdTPS0tcmVzb2x2LWNvbmY9L3J1bi9zeXN0ZW1kL3Jlc29sdmUvcmVzb2x2LmNvbmYiCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9jbG91ZC1jb25maWcnCiAgcGVybWlzc2lvbnM6ICcwNjAwJwogIGNvbnRlbnQ6IHwtCiAgICBbZ2xvYmFsXQogICAgWm9uZT0iIgogICAgVlBDPSIiCiAgICBTdWJuZXRJRD0idGVzdC1zdWJuZXQiCiAgICAKICAgIAoKLSBwYXRoOiAnL29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL3Vzci9iaW4vZW52IGJhc2gKICAgIGVjaG9kYXRlKCkgewogICAgICBlY2hvICJbJChkYXRlIC1JcyldIiAiJEAiCiAgICB9CiAgICAKICAgICMgZ2V0IHRoZSBkZWZhdWx0IGludGVyZmFjZSBJUCBhZGRyZXNzCiAgICBERUZBVUxUX0lGQ19JUD0kKGlwIC1vICByb3V0ZSBnZXQgMSB8IGdyZXAgLW9QICJzcmMgXEtcUysiKQogICAgCiAgICBpZiBbIC16ICIke0RFRkFVTFRfSUZDX0lQfSIgXQogICAgdGhlbgogICAgICBlY2hvZGF0ZSAiRmFpbGVkIHRvIGdldCBJUCBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCByb3V0ZSBpbnRlcmZhY2UiCiAgICAgIGV4aXQgMQogICAgZmkKICAgIAogICAgICMgZ2V0IHRoZSBmdWxsIGhvc3RuYW1lCiAgICBGVUxMX0hPU1ROQU1FPSQoaG9zdG5hbWUgLWYpCiAgICAKICAgICMgd3JpdGUgdGhlIG5vZGVpcF9lbnYgZmlsZQogICAgIyB3ZSBuZWVkIHRoZSBsaW5lIGJlbG93IGJlY2F1c2UgZmxhdGNhciBoYXMgdGhlIHNhbWUgc3RyaW5nICJjb3Jlb3MiIGluIHRoYXQgZmlsZQogICAgaWYgZ3JlcCAtcSBjb3Jlb3MgL2V0Yy9vcy1yZWxlYXNlCiAgICB0aGVuCiAgICAgIGVjaG8gIktVQkVMRVRfTk9ERV9JUD0ke0RFRkFVTFRfSUZDX0lQfVxuS1VCRUxFVF9IT1NUTkFNRT0ke0ZVTExfSE9TVE5BTUV9IiA+IC9ldGMva3ViZXJuZXRlcy9ub2RlaXAuY29uZgogICAgZWxpZiBbICEgLWQgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UuZCBdCiAgICB0aGVuCiAgICAgIGVjaG9kYXRlICJDYW4ndCBmaW5kIGt1YmVsZXQgc2VydmljZSBleHRyYXMgZGlyZWN0b3J5IgogICAgICBleGl0IDEKICAgIGVsc2UKICAgICAgZWNobyAtZSAiW1NlcnZpY2VdXG5FbnZpcm9ubWVudD1cIktVQkVMRVRfTk9ERV9JUD0ke0RFRkFVTFRfSUZDX0lQfVwiXG5FbnZpcm9ubWVudD1cIktVQkVMRVRfSE9TVE5BTUU9JHtGVUxMX0hPU1ROQU1FfVwiIiA+IC9ldGMvc3lzdGVtZC9zeXN0ZW0va3ViZWxldC5zZXJ2aWNlLmQvbm9kZWlwLmNvbmYKICAgIGZpCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9ib290c3RyYXAta3ViZWxldC5jb25mJwogIHBlcm1pc3Npb25zOiAnMDYwMCcKICBjb250ZW50OiB8LQogICAgYXBpVmVyc2lvbjogdjEKICAgIGNsdXN0ZXJzOgogICAgLSBjbHVzdGVyOgogICAgICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VWWGFrTkRRVEJMWjBGM1NVSkJaMGxLUVV4bVVteFhjMGs0V1ZGSVRVRXdSME5UY1VkVFNXSXpSRkZGUWtKUlZVRk5TSE40UTNwQlNrSm5UbFlLUWtGWlZFRnNWbFJOVVhOM1ExRlpSRlpSVVVsRmQwcEVVVlJGVjAxQ1VVZEJNVlZGUW5oTlRsVXlSblZKUlZwNVdWYzFhbUZZVG1waWVrVlZUVUpKUndwQk1WVkZRMmhOVEZGdVNtaGFSMXB3WkVod2NHSnRUWGhGYWtGUlFtZE9Wa0pCVFZSRFYzaDJXVEpHYzJGSE9YcGtSRVZrVFVKelIwTlRjVWRUU1dJekNrUlJSVXBCVWxsUFdXNUthRnBGUW10WlZ6VnVXVk0xYW1JeU1IZElhR05PVFZSUmQwNTZSVEZOYWtFd1RtcEJNVmRvWTA1TlZHTjNUbFJCTUUxcVFUQUtUbXBCTVZkcVFqZE5VWE4zUTFGWlJGWlJVVWRGZDBwV1ZYcEZURTFCYTBkQk1WVkZRMEpOUTFFd1JYaEdha0ZWUW1kT1ZrSkJZMVJFVms1b1ltbENSd3BqYlVaMVdUSnNlbGt5T0hoR1JFRlRRbWRPVmtKQmIxUkRNRXA1V1ZkU2JXRllValpoVnpWcVRWSkpkMFZCV1VSV1VWRkVSWGRzYzJJeVRtaGlSMmgyQ21NelVYaElWRUZpUW1kcmNXaHJhVWM1ZHpCQ1ExRkZWMFJ0U25sWlYxSkJXa2RHZFZveVJYVlpNamwwVFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVJS1FWRkZSa0ZCVDBOQlVUaEJUVWxKUWtOblMwTkJVVVZCZERWbVFXcHdOR1pVWTJWclYxVlVabnB6Y0RCcmVXbG9NVTlaWW5OSFREQkxXREZsVW1KVFV3cFNPRTlrTUNzNVVUWXlTSGx1ZVN0SFJuZE5WR0kwUVM5TFZUaHRjM052U0haalkyVlRRVUZpZDJaaWVFWkxMeXR6TlRGVWIySnhWVzVQVWxweVQyOVVDbHBxYTFWNVoySjVXRVJUU3prNVdVSmlZMUl4VUdsd09IWjNUVlJ0TkZoTGRVeDBRMmxuWlVKQ1pHcHFRVkZrWjFWUE1qaE1SVTVIYkhOTmJtMWxXV3NLU21aUFJGWkhibFp0Y2pWTWRHSTVRVTVCT0VsTGVWUm1jMjVJU2pScFQwTlRMMUJzVUdKVmFqSnhOMWx1YjFaTWNHOXpWVUpOYkdkVllpOURlV3RZTXdwdFQyOU1ZalI1U2twUmVVRXZhVk5VTmxwNGFVbEZhak0yUkRSNVYxbzFiR2MzV1Vwc0sxVnBhVUpSU0VkRGJsQmtSM2xwY0hGV01EWmxlREJvWlZsWENtTmhhVmM0VEZkYVUxVlJPVE5xVVN0WFZrTklPR2hVTjBSUlR6RmtiWE4yVlcxWWJIRXZTbVZCYkhkUkwxRkpSRUZSUVVKdk5FaG5UVWxJWkUxQ01FY0tRVEZWWkVSblVWZENRbEpqUVZKUGRHaFRORkEwVlRkMlZHWnFRbmxETlRZNVVqZEZOa1JEUW5KUldVUldVakJxUWtsSGJFMUpSMmxuUWxKalFWSlBkQXBvVXpSUU5GVTNkbFJtYWtKNVF6VTJPVkkzUlRaTFJpOXdTREIzWlhwRlRFMUJhMGRCTVZWRlFtaE5RMVpXVFhoRGVrRktRbWRPVmtKQloxUkJhMDVDQ2sxU1dYZEdRVmxFVmxGUlNFVjNNVlJaVnpSblVtNUthR0p0VG5Cak1rNTJUVkpSZDBWbldVUldVVkZMUlhkMFEyTnRSbXRhYld3d1pXMXNkVmw2UlZNS1RVSkJSMEV4VlVWQmVFMUtZa2M1YWxsWGVHOWlNMDR3VFZJd2QwZDNXVXBMYjFwSmFIWmpUa0ZSYTBKR1p6VnBZMjFHYTFGSFVtaGliV1JvVEcxT2RncGlXVWxLUVV4bVVteFhjMGs0V1ZGSVRVRjNSMEV4VldSRmQxRkdUVUZOUWtGbU9IZEVVVmxLUzI5YVNXaDJZMDVCVVVWR1FsRkJSR2RuUlVKQlJ6Wm9DbFU1WmpselRrZ3dMelp2UW1KSFIza3lSVlpWTUZWblNWUlZVVWx5Umxkdk9YSkdhM0pYTldzdldHdEVhbEZ0S3pOc2VtcFVNR2xIVWpSSmVFVXZRVzhLWlZVMmMxRm9kV0UzZDNKWFpVWkZialEzUjB3NU9HeHVRM05LWkVRM2IxcE9hRVp0VVRrMVZHSXZURzVFVldwek5WbHFPV0p5VURCT1YzcFlabGxWTkFwVlN6SmFia2xPU2xKalNuQkNPR2xTUTJGRGVFVTRSR1JqVlVZd1dIRkpSWEUyY0VFeU56SnpibTlNYldsWVRFMTJUbXd6YTFsRlpHMHJhbVUyZG05RUNqVTRVMDVXUlZWemVuUjZVWGxZYlVwRmFFTndkMVpKTUVFMlVVTnFlbGhxSzNGMmNHMTNNMXBhU0drNFNuZFlaV2s0V2xwQ1RGUlRSa0pyYVRoYU4yNEtjMGc1UWtKSU16Z3ZVM3BWYlVGT05GRklVMUI1TVdkcWNXMHdNRTlCUlRoT1lWbEVhMmd2WW5wRk5HUTNiVXhIUjAxWGNDOVhSVE5MVUZOMU9ESklSZ3ByVUdVMldHOVRZbWxNYlM5cmVHc3pNbFF3UFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0CiAgICAgICAgc2VydmVyOiBodHRwczovL3NlcnZlcjo0NDMKICAgICAgbmFtZTogIiIKICAgIGNvbnRleHRzOiBudWxsCiAgICBjdXJyZW50LWNvbnRleHQ6ICIiCiAgICBraW5kOiBDb25maWcKICAgIHByZWZlcmVuY2VzOiB7fQogICAgdXNlcnM6CiAgICAtIG5hbWU6ICIiCiAgICAgIHVzZXI6CiAgICAgICAgdG9rZW46IG15LXRva2VuCiAgICAKICAgIAoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL3BraS9jYS5jcnQnCiAgY29udGVudDogfC0KICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRVdqQ0NBMEtnQXdJQkFnSUpBTGZSbFdzSThZUUhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ic3hDekFKQmdOVgogICAgQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwogICAgQTFVRUNoTUxRbkpoWkdacGRIcHBibU14RWpBUUJnTlZCQU1UQ1d4dlkyRnNhRzl6ZERFZE1Cc0dDU3FHU0liMwogICAgRFFFSkFSWU9ZbkpoWkVCa1lXNW5ZUzVqYjIwd0hoY05NVFF3TnpFMU1qQTBOakExV2hjTk1UY3dOVEEwTWpBMAogICAgTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwogICAgY21GdVkybHpZMjh4RkRBU0JnTlZCQW9UQzBKeVlXUm1hWFI2YVc1ak1SSXdFQVlEVlFRREV3bHNiMk5oYkdodgogICAgYzNReEhUQWJCZ2txaGtpRzl3MEJDUUVXRG1KeVlXUkFaR0Z1WjJFdVkyOXRNSUlCSWpBTkJna3Foa2lHOXcwQgogICAgQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwogICAgUjhPZDArOVE2Mkh5bnkrR0Z3TVRiNEEvS1U4bXNzb0h2Y2NlU0FBYndmYnhGSy8rczUxVG9icVVuT1Jack9vVAogICAgWmprVXlnYnlYRFNLOTlZQmJjUjFQaXA4dndNVG00WEt1THRDaWdlQkJkampBUWRnVU8yOExFTkdsc01ubWVZawogICAgSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwogICAgbU9vTGI0eUpKUXlBL2lTVDZaeGlJRWozNkQ0eVdaNWxnN1lKbCtVaWlCUUhHQ25QZEd5aXBxVjA2ZXgwaGVZVwogICAgY2FpVzhMV1pTVVE5M2pRK1dWQ0g4aFQ3RFFPMWRtc3ZVbVhscS9KZUFsd1EvUUlEQVFBQm80SGdNSUhkTUIwRwogICAgQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdAogICAgaFM0UDRVN3ZUZmpCeUM1NjlSN0U2S0YvcEgwd2V6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgogICAgTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcGMyTnZNUlF3RWdZRFZRUUtFd3RDY21Ga1ptbDBlbWx1WXpFUwogICAgTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgogICAgYllJSkFMZlJsV3NJOFlRSE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUc2aAogICAgVTlmOXNOSDAvNm9CYkdHeTJFVlUwVWdJVFVRSXJGV285ckZrclc1ay9Ya0RqUW0rM2x6alQwaUdSNEl4RS9BbwogICAgZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNAogICAgVUsyWm5JTkpSY0pwQjhpUkNhQ3hFOERkY1VGMFhxSUVxNnBBMjcyc25vTG1pWExNdk5sM2tZRWRtK2plNnZvRAogICAgNThTTlZFVXN6dHpReVhtSkVoQ3B3VkkwQTZRQ2p6WGorcXZwbXczWlpIaThKd1hlaThaWkJMVFNGQmtpOFo3bgogICAgc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgogICAga1BlNlhvU2JpTG0va3hrMzJUMD0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9zZXR1cC5zZXJ2aWNlJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBjb250ZW50OiB8LQogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgCiAgICBbVW5pdF0KICAgIFJlcXVpcmVzPW5ldHdvcmstb25saW5lLnRhcmdldAogICAgQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CiAgICAKICAgIFtTZXJ2aWNlXQogICAgVHlwZT1vbmVzaG90CiAgICBSZW1haW5BZnRlckV4aXQ9dHJ1ZQogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICBFeGVjU3RhcnQ9L29wdC9iaW4vc3VwZXJ2aXNlLnNoIC9vcHQvYmluL3NldHVwCiAgICAKCi0gcGF0aDogJy9ldGMvcHJvZmlsZS5kL29wdC1iaW4tcGF0aC5zaCcKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgY29udGVudDogfC0KICAgIGV4cG9ydCBQQVRIPSIvb3B0L2JpbjokUEFUSCIKICAgIAoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZicKICBjb250ZW50OiB8LQogICAgYXBpVmVyc2lvbjoga3ViZWxldC5jb25maWcuazhzLmlvL3YxYmV0YTEKICAgIGtpbmQ6IEt1YmVsZXRDb25maWd1cmF0aW9uCiAgICBhdXRoZW50aWNhdGlvbjoKICAgICAgYW5vbnltb3VzOgogICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICAgIHdlYmhvb2s6CiAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAgICB4NTA5OgogICAgICAgIGNsaWVudENBRmlsZTogL2V0Yy9rdWJlcm5ldGVzL3BraS9jYS5jcnQKICAgIGF1dGhvcml6YXRpb246CiAgICAgIG1vZGU6IFdlYmhvb2sKICAgIGNncm91cERyaXZlcjogc3lzdGVtZAogICAgY2x1c3RlckROUzoKICAgIC0gIjEwLjAuMC4wIgogICAgY2x1c3RlckRvbWFpbjogY2x1c3Rlci5sb2NhbAogICAgZmVhdHVyZUdhdGVzOgogICAgICBSb3RhdGVLdWJlbGV0U2VydmVyQ2VydGlmaWNhdGU6IHRydWUKICAgIHByb3RlY3RLZXJuZWxEZWZhdWx0czogdHJ1ZQogICAgcmVhZE9ubHlQb3J0OiAwCiAgICByb3RhdGVDZXJ0aWZpY2F0ZXM6IHRydWUKICAgIHNlcnZlclRMU0Jvb3RzdHJhcDogdHJ1ZQogICAgc3RhdGljUG9kUGF0aDogL2V0Yy9rdWJlcm5ldGVzL21hbmlmZXN0cwogICAga3ViZVJlc2VydmVkOgogICAgICBjcHU6IDIwMG0KICAgICAgZXBoZW1lcmFsLXN0b3JhZ2U6IDFHaQogICAgICBtZW1vcnk6IDIwME1pCiAgICBzeXN0ZW1SZXNlcnZlZDoKICAgICAgY3B1OiAyMDBtCiAgICAgIGVwaGVtZXJhbC1zdG9yYWdlOiAxR2kKICAgICAgbWVtb3J5OiAyMDBNaQogICAgdm9sdW1lUGx1Z2luRGlyOiAvdmFyL2xpYi9rdWJlbGV0L3ZvbHVtZXBsdWdpbnMKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICBbVW5pdF0KICAgIFJlcXVpcmVzPWt1YmVsZXQuc2VydmljZQogICAgQWZ0ZXI9a3ViZWxldC5zZXJ2aWNlCiAgICAKICAgIFtTZXJ2aWNlXQogICAgRXhlY1N0YXJ0PS9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIGt1YmVsZXQKICAgIAogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgCgotIHBhdGg6ICcvZXRjL2NvbnRhaW5lcmQvY29uZmlnLnRvbWwnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICB2ZXJzaW9uID0gMgogICAgCiAgICBbbWV0cmljc10KICAgIGFkZHJlc3MgPSAiMTI3LjAuMC4xOjEzMzgiCiAgICAKICAgIFtwbHVnaW5zXQogICAgW3BsdWdpbnMuImlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmkiXQogICAgW3BsdWdpbnMuImlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmkiLmNvbnRhaW5lcmRdCiAgICBbcGx1Z2lucy4iaW8uY29udGFpbmVyZC5ncnBjLnYxLmNyaSIuY29udGFpbmVyZC5ydW50aW1lc10KICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5jb250YWluZXJkLnJ1bnRpbWVzLnJ1bmNdCiAgICBydW50aW1lX3R5cGUgPSAiaW8uY29udGFpbmVyZC5ydW5jLnYyIgogICAgW3BsdWdpbnMuImlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmkiLmNvbnRhaW5lcmQucnVudGltZXMucnVuYy5vcHRpb25zXQogICAgU3lzdGVtZENncm91cCA9IHRydWUKICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5yZWdpc3RyeV0KICAgIFtwbHVnaW5zLiJpby5jb250YWluZXJkLmdycGMudjEuY3JpIi5yZWdpc3RyeS5taXJyb3JzXQogICAgW3BsdWdpbnMuImlvLmNvbnRhaW5lcmQuZ3JwYy52MS5jcmkiLnJlZ2lzdHJ5Lm1pcnJvcnMuImRvY2tlci5pbyJdCiAgICBlbmRwb2ludCA9IFsiaHR0cHM6Ly9yZWdpc3RyeS0xLmRvY2tlci5pbyJdCiAgICAKCmJvb3RjbWQ6Ci0gZWNobyBoZWxsbwotIGVjaG8gd29ybGQKCnJoX3N1YnNjcmlwdGlvbjoKICAgIHBhc3N3b3JkOiBwYXNzd29yZAogICAgdXNlcm5hbWU6IHVzZXJuYW1l +immutable: true kind: Secret metadata: creationTimestamp: null diff --git a/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-docker.yaml b/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-docker.yaml index 7a2d08ad..5c96f37b 100644 --- a/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-docker.yaml +++ b/pkg/controllers/osc/testdata/secret-ubuntu-20.04-aws-docker.yaml @@ -1,6 +1,7 @@ apiVersion: v1 data: cloud-config: I2Nsb3VkLWNvbmZpZwoKc3NoX3B3YXV0aDogbm8Kc3NoX2F1dGhvcml6ZWRfa2V5czoKLSAnc3NoLXJzYSBBQUFBQjNOemFDMXljMkVBQUFBREFRQUJBQUFDQVFEZE9JaFltekNLNURTVkx1M2MnCndyaXRlX2ZpbGVzOgotIHBhdGg6ICcvZXRjL3N5c3RlbWQvam91cm5hbGQuY29uZi5kL21heF9kaXNrX3VzZS5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBbSm91cm5hbF0KICAgIFN5c3RlbU1heFVzZT01RwogICAgCgotIHBhdGg6ICcvb3B0L2xvYWQta2VybmVsLW1vZHVsZXMuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS91c3IvYmluL2VudiBiYXNoCiAgICBzZXQgLWV1byBwaXBlZmFpbAogICAgCiAgICBtb2Rwcm9iZSBpcF92cwogICAgbW9kcHJvYmUgaXBfdnNfcnIKICAgIG1vZHByb2JlIGlwX3ZzX3dycgogICAgbW9kcHJvYmUgaXBfdnNfc2gKICAgIAogICAgaWYgbW9kaW5mbyBuZl9jb25udHJhY2tfaXB2NCAmPiAvZGV2L251bGw7IHRoZW4KICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrX2lwdjQKICAgIGVsc2UKICAgICAgbW9kcHJvYmUgbmZfY29ubnRyYWNrCiAgICBmaQogICAgCgotIHBhdGg6ICcvZXRjL3N5c2N0bC5kL2s4cy5jb25mJwogIGNvbnRlbnQ6IHwtCiAgICBuZXQuYnJpZGdlLmJyaWRnZS1uZi1jYWxsLWlwNnRhYmxlcyA9IDEKICAgIG5ldC5icmlkZ2UuYnJpZGdlLW5mLWNhbGwtaXB0YWJsZXMgPSAxCiAgICBrZXJuZWwucGFuaWNfb25fb29wcyA9IDEKICAgIGtlcm5lbC5wYW5pYyA9IDEwCiAgICBuZXQuaXB2NC5pcF9mb3J3YXJkID0gMQogICAgdm0ub3ZlcmNvbW1pdF9tZW1vcnkgPSAxCiAgICBmcy5pbm90aWZ5Lm1heF91c2VyX3dhdGNoZXMgPSAxMDQ4NTc2CiAgICAKCi0gcGF0aDogJy9ldGMvZGVmYXVsdC9ncnViLmQvNjAtc3dhcC1hY2NvdW50aW5nLmNmZycKICBjb250ZW50OiB8LQogICAgIyBBZGRlZCBieSBrdWJlcm1hdGljIG1hY2hpbmUtY29udHJvbGxlcgogICAgIyBFbmFibGUgY2dyb3VwcyBtZW1vcnkgYW5kIHN3YXAgYWNjb3VudGluZwogICAgR1JVQl9DTURMSU5FX0xJTlVYPSJjZ3JvdXBfZW5hYmxlPW1lbW9yeSBzd2FwYWNjb3VudD0xIgogICAgCgotIHBhdGg6ICcvb3B0L2Jpbi9zZXR1cCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL2Jpbi9iYXNoCiAgICBzZXQgLXhldW8gcGlwZWZhaWwKICAgIGlmIHN5c3RlbWN0bCBpcy1hY3RpdmUgdWZ3OyB0aGVuIHN5c3RlbWN0bCBzdG9wIHVmdzsgZmkKICAgIHN5c3RlbWN0bCBtYXNrIHVmdwogICAgc3lzdGVtY3RsIHJlc3RhcnQgc3lzdGVtZC1tb2R1bGVzLWxvYWQuc2VydmljZQogICAgc3lzY3RsIC0tc3lzdGVtCiAgICBzZWQgLWkub3JpZyAnLy4qc3dhcC4qL2QnIC9ldGMvZnN0YWIKICAgIHN3YXBvZmYgLWEKICAgIAogICAgYXB0LWdldCB1cGRhdGUKICAgIAogICAgREVCSUFOX0ZST05URU5EPW5vbmludGVyYWN0aXZlIGFwdC1nZXQgLW8gRHBrZzo6T3B0aW9uczo6PSItLWZvcmNlLWNvbmZkZWYiIC1vIERwa2c6Ok9wdGlvbnM6Oj0iLS1mb3JjZS1jb25mb2xkIiBpbnN0YWxsIC15IFwKICAgICAgY3VybCBcCiAgICAgIGNhLWNlcnRpZmljYXRlcyBcCiAgICAgIGNlcGgtY29tbW9uIFwKICAgICAgY2lmcy11dGlscyBcCiAgICAgIGNvbm50cmFjayBcCiAgICAgIGUyZnNwcm9ncyBcCiAgICAgIGVidGFibGVzIFwKICAgICAgZXRodG9vbCBcCiAgICAgIGdsdXN0ZXJmcy1jbGllbnQgXAogICAgICBpcHRhYmxlcyBcCiAgICAgIGpxIFwKICAgICAga21vZCBcCiAgICAgIG9wZW5zc2gtY2xpZW50IFwKICAgICAgbmZzLWNvbW1vbiBcCiAgICAgIHNvY2F0IFwKICAgICAgdXRpbC1saW51eCBcCiAgICAgIGlwdnNhZG0KICAgIGFwdC1nZXQgdXBkYXRlCiAgICBhcHQtZ2V0IGluc3RhbGwgLXkgYXB0LXRyYW5zcG9ydC1odHRwcyBjYS1jZXJ0aWZpY2F0ZXMgY3VybCBzb2Z0d2FyZS1wcm9wZXJ0aWVzLWNvbW1vbiBsc2ItcmVsZWFzZQogICAgY3VybCAtZnNTTCBodHRwczovL2Rvd25sb2FkLmRvY2tlci5jb20vbGludXgvdWJ1bnR1L2dwZyB8IGFwdC1rZXkgYWRkIC0KICAgIGFkZC1hcHQtcmVwb3NpdG9yeSAiZGViIGh0dHBzOi8vZG93bmxvYWQuZG9ja2VyLmNvbS9saW51eC91YnVudHUgJChsc2JfcmVsZWFzZSAtY3MpIHN0YWJsZSIKICAgIAogICAgbWtkaXIgLXAgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9jb250YWluZXJkLnNlcnZpY2UuZCAvZXRjL3N5c3RlbWQvc3lzdGVtL2RvY2tlci5zZXJ2aWNlLmQKICAgIAogICAgY2F0IDw8RU9GIHwgdGVlIC9ldGMvc3lzdGVtZC9zeXN0ZW0vY29udGFpbmVyZC5zZXJ2aWNlLmQvZW52aXJvbm1lbnQuY29uZiAvZXRjL3N5c3RlbWQvc3lzdGVtL2RvY2tlci5zZXJ2aWNlLmQvZW52aXJvbm1lbnQuY29uZgogICAgW1NlcnZpY2VdCiAgICBSZXN0YXJ0PWFsd2F5cwogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICBFT0YKICAgIAogICAgYXB0LWdldCBpbnN0YWxsIC15IFwKICAgICAgICBjb250YWluZXJkLmlvPTEuNC4zKiBcCiAgICAgICAgZG9ja2VyLWNlPTU6MTkuMDMuMTMqIFwKICAgICAgICBkb2NrZXItY2UtY2xpPTU6MTkuMDMuMTMqCiAgICBhcHQtbWFyayBob2xkIGRvY2tlci1jZSBkb2NrZXItY2UtY2xpIGNvbnRhaW5lcmQuaW8KICAgIAogICAgc3lzdGVtY3RsIGRhZW1vbi1yZWxvYWQKICAgIHN5c3RlbWN0bCBlbmFibGUgLS1ub3cgZG9ja2VyCiAgICBvcHRfYmluPS9vcHQvYmluCiAgICBjbmlfYmluX2Rpcj0vb3B0L2NuaS9iaW4KICAgIG1rZGlyIC1wIC9ldGMvY25pL25ldC5kIC9ldGMva3ViZXJuZXRlcy9keW5hbWljLWNvbmZpZy1kaXIgL2V0Yy9rdWJlcm5ldGVzL21hbmlmZXN0cyAiJG9wdF9iaW4iICIkY25pX2Jpbl9kaXIiCiAgICBhcmNoPSR7SE9TVF9BUkNILX0KICAgIGlmIFsgLXogIiRhcmNoIiBdCiAgICB0aGVuCiAgICBjYXNlICQodW5hbWUgLW0pIGluCiAgICB4ODZfNjQpCiAgICAgICAgYXJjaD0iYW1kNjQiCiAgICAgICAgOzsKICAgIGFhcmNoNjQpCiAgICAgICAgYXJjaD0iYXJtNjQiCiAgICAgICAgOzsKICAgICopCiAgICAgICAgZWNobyAidW5zdXBwb3J0ZWQgQ1BVIGFyY2hpdGVjdHVyZSwgZXhpdGluZyIKICAgICAgICBleGl0IDEKICAgICAgICA7OwogICAgZXNhYwogICAgZmkKICAgIENOSV9WRVJTSU9OPSIke0NOSV9WRVJTSU9OOi12MC44Ljd9IgogICAgY25pX2Jhc2VfdXJsPSJodHRwczovL2dpdGh1Yi5jb20vY29udGFpbmVybmV0d29ya2luZy9wbHVnaW5zL3JlbGVhc2VzL2Rvd25sb2FkLyRDTklfVkVSU0lPTiIKICAgIGNuaV9maWxlbmFtZT0iY25pLXBsdWdpbnMtbGludXgtJGFyY2gtJENOSV9WRVJTSU9OLnRneiIKICAgIGN1cmwgLUxmbyAiJGNuaV9iaW5fZGlyLyRjbmlfZmlsZW5hbWUiICIkY25pX2Jhc2VfdXJsLyRjbmlfZmlsZW5hbWUiCiAgICBjbmlfc3VtPSQoY3VybCAtTGYgIiRjbmlfYmFzZV91cmwvJGNuaV9maWxlbmFtZS5zaGEyNTYiKQogICAgY2QgIiRjbmlfYmluX2RpciIKICAgIHNoYTI1NnN1bSAtYyA8PDwiJGNuaV9zdW0iCiAgICB0YXIgeHZmICIkY25pX2ZpbGVuYW1lIgogICAgcm0gLWYgIiRjbmlfZmlsZW5hbWUiCiAgICBjZCAtCiAgICBLVUJFX1ZFUlNJT049IiR7S1VCRV9WRVJTSU9OOi12MS4yMi4xfSIKICAgIGt1YmVfZGlyPSIkb3B0X2Jpbi9rdWJlcm5ldGVzLSRLVUJFX1ZFUlNJT04iCiAgICBrdWJlX2Jhc2VfdXJsPSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20va3ViZXJuZXRlcy1yZWxlYXNlL3JlbGVhc2UvJEtVQkVfVkVSU0lPTi9iaW4vbGludXgvJGFyY2giCiAgICBrdWJlX3N1bV9maWxlPSIka3ViZV9kaXIvc2hhMjU2IgogICAgbWtkaXIgLXAgIiRrdWJlX2RpciIKICAgIDogPiIka3ViZV9zdW1fZmlsZSIKICAgIAogICAgZm9yIGJpbiBpbiBrdWJlbGV0IGt1YmVhZG0ga3ViZWN0bDsgZG8KICAgICAgICBjdXJsIC1MZm8gIiRrdWJlX2Rpci8kYmluIiAiJGt1YmVfYmFzZV91cmwvJGJpbiIKICAgICAgICBjaG1vZCAreCAiJGt1YmVfZGlyLyRiaW4iCiAgICAgICAgc3VtPSQoY3VybCAtTGYgIiRrdWJlX2Jhc2VfdXJsLyRiaW4uc2hhMjU2IikKICAgICAgICBlY2hvICIkc3VtICAka3ViZV9kaXIvJGJpbiIgPj4iJGt1YmVfc3VtX2ZpbGUiCiAgICBkb25lCiAgICBzaGEyNTZzdW0gLWMgIiRrdWJlX3N1bV9maWxlIgogICAgCiAgICBmb3IgYmluIGluIGt1YmVsZXQga3ViZWFkbSBrdWJlY3RsOyBkbwogICAgICAgIGxuIC1zZiAiJGt1YmVfZGlyLyRiaW4iICIkb3B0X2JpbiIvJGJpbgogICAgZG9uZQogICAgCiAgICBpZiBbWyAhIC14IC9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIF1dOyB0aGVuCiAgICAgICAgY3VybCAtTGZvIC9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9rdWJlcm1hdGljL21hY2hpbmUtY29udHJvbGxlci83OTY3YTBhZjJiNzVmMjlhZDJhYjIyN2VlYWEyNmVhN2IwZjJmYmRlL3BrZy91c2VyZGF0YS9zY3JpcHRzL2hlYWx0aC1tb25pdG9yLnNoCiAgICAgICAgY2htb2QgK3ggL29wdC9iaW4vaGVhbHRoLW1vbml0b3Iuc2gKICAgIGZpCiAgICAKICAgICMgc2V0IGt1YmVsZXQgbm9kZWlwIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAvb3B0L2Jpbi9zZXR1cF9uZXRfZW52LnNoCiAgICAKICAgIHN5c3RlbWN0bCBlbmFibGUgLS1ub3cga3ViZWxldAogICAgc3lzdGVtY3RsIGVuYWJsZSAtLW5vdyAtLW5vLWJsb2NrIGt1YmVsZXQtaGVhbHRoY2hlY2suc2VydmljZQogICAgCgotIHBhdGg6ICcvb3B0L2Jpbi9zdXBlcnZpc2Uuc2gnCiAgcGVybWlzc2lvbnM6ICcwNzU1JwogIGNvbnRlbnQ6IHwtCiAgICAjIS9iaW4vYmFzaAogICAgc2V0IC14ZXVvIHBpcGVmYWlsCiAgICB3aGlsZSAhICIkQCI7IGRvCiAgICAgIHNsZWVwIDEKICAgIGRvbmUKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UnCiAgY29udGVudDogfC0KICAgIFtVbml0XQogICAgQWZ0ZXI9ZG9ja2VyLnNlcnZpY2UKICAgIFJlcXVpcmVzPWRvY2tlci5zZXJ2aWNlCiAgICAKICAgIERlc2NyaXB0aW9uPWt1YmVsZXQ6IFRoZSBLdWJlcm5ldGVzIE5vZGUgQWdlbnQKICAgIERvY3VtZW50YXRpb249aHR0cHM6Ly9rdWJlcm5ldGVzLmlvL2RvY3MvaG9tZS8KICAgIAogICAgW1NlcnZpY2VdCiAgICBSZXN0YXJ0PWFsd2F5cwogICAgU3RhcnRMaW1pdEludGVydmFsPTAKICAgIFJlc3RhcnRTZWM9MTAKICAgIENQVUFjY291bnRpbmc9dHJ1ZQogICAgTWVtb3J5QWNjb3VudGluZz10cnVlCiAgICAKICAgIEVudmlyb25tZW50PSJQQVRIPS9vcHQvYmluOi9iaW46L3Vzci9sb2NhbC9zYmluOi91c3IvbG9jYWwvYmluOi91c3Ivc2JpbjovdXNyL2Jpbjovc2Jpbi8iCiAgICBFbnZpcm9ubWVudEZpbGU9LS9ldGMvZW52aXJvbm1lbnQKICAgIAogICAgRXhlY1N0YXJ0UHJlPS9iaW4vYmFzaCAvb3B0L2xvYWQta2VybmVsLW1vZHVsZXMuc2gKICAgIEV4ZWNTdGFydFByZT0vYmluL2Jhc2ggL29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaAogICAgRXhlY1N0YXJ0PS9vcHQvYmluL2t1YmVsZXQgJEtVQkVMRVRfRVhUUkFfQVJHUyBcCiAgICAgIC0tYm9vdHN0cmFwLWt1YmVjb25maWc9L2V0Yy9rdWJlcm5ldGVzL2Jvb3RzdHJhcC1rdWJlbGV0LmNvbmYgXAogICAgICAtLWt1YmVjb25maWc9L3Zhci9saWIva3ViZWxldC9rdWJlY29uZmlnIFwKICAgICAgLS1jb25maWc9L2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZiBcCiAgICAgIC0tbmV0d29yay1wbHVnaW49Y25pIFwKICAgICAgLS1jZXJ0LWRpcj0vZXRjL2t1YmVybmV0ZXMvcGtpIFwKICAgICAgLS1jbG91ZC1wcm92aWRlcj1hd3MgXAogICAgICAtLWNsb3VkLWNvbmZpZz0vZXRjL2t1YmVybmV0ZXMvY2xvdWQtY29uZmlnIFwKICAgICAgLS1keW5hbWljLWNvbmZpZy1kaXI9L2V0Yy9rdWJlcm5ldGVzL2R5bmFtaWMtY29uZmlnLWRpciBcCiAgICAgIC0tZmVhdHVyZS1nYXRlcz1EeW5hbWljS3ViZWxldENvbmZpZz10cnVlIFwKICAgICAgLS1leGl0LW9uLWxvY2stY29udGVudGlvbiBcCiAgICAgIC0tbG9jay1maWxlPS90bXAva3ViZWxldC5sb2NrIFwKICAgICAgLS1jb250YWluZXItcnVudGltZT1kb2NrZXIgXAogICAgICAtLWNvbnRhaW5lci1ydW50aW1lLWVuZHBvaW50PXVuaXg6Ly8vdmFyL3J1bi9kb2NrZXJzaGltLnNvY2sgXAogICAgICAtLW5vZGUtaXAgJHtLVUJFTEVUX05PREVfSVB9CiAgICAKICAgIFtJbnN0YWxsXQogICAgV2FudGVkQnk9bXVsdGktdXNlci50YXJnZXQKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UuZC9leHRyYXMuY29uZicKICBjb250ZW50OiB8LQogICAgW1NlcnZpY2VdCiAgICBFbnZpcm9ubWVudD0iS1VCRUxFVF9FWFRSQV9BUkdTPS0tcmVzb2x2LWNvbmY9L3J1bi9zeXN0ZW1kL3Jlc29sdmUvcmVzb2x2LmNvbmYiCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9jbG91ZC1jb25maWcnCiAgcGVybWlzc2lvbnM6ICcwNjAwJwogIGNvbnRlbnQ6IHwtCiAgICBbZ2xvYmFsXQogICAgWm9uZT0iIgogICAgVlBDPSIiCiAgICBTdWJuZXRJRD0idGVzdC1zdWJuZXQiCiAgICAKICAgIAoKLSBwYXRoOiAnL29wdC9iaW4vc2V0dXBfbmV0X2Vudi5zaCcKICBwZXJtaXNzaW9uczogJzA3NTUnCiAgY29udGVudDogfC0KICAgICMhL3Vzci9iaW4vZW52IGJhc2gKICAgIGVjaG9kYXRlKCkgewogICAgICBlY2hvICJbJChkYXRlIC1JcyldIiAiJEAiCiAgICB9CiAgICAKICAgICMgZ2V0IHRoZSBkZWZhdWx0IGludGVyZmFjZSBJUCBhZGRyZXNzCiAgICBERUZBVUxUX0lGQ19JUD0kKGlwIC1vICByb3V0ZSBnZXQgMSB8IGdyZXAgLW9QICJzcmMgXEtcUysiKQogICAgCiAgICBpZiBbIC16ICIke0RFRkFVTFRfSUZDX0lQfSIgXQogICAgdGhlbgogICAgICBlY2hvZGF0ZSAiRmFpbGVkIHRvIGdldCBJUCBhZGRyZXNzIGZvciB0aGUgZGVmYXVsdCByb3V0ZSBpbnRlcmZhY2UiCiAgICAgIGV4aXQgMQogICAgZmkKICAgIAogICAgICMgZ2V0IHRoZSBmdWxsIGhvc3RuYW1lCiAgICBGVUxMX0hPU1ROQU1FPSQoaG9zdG5hbWUgLWYpCiAgICAKICAgICMgd3JpdGUgdGhlIG5vZGVpcF9lbnYgZmlsZQogICAgIyB3ZSBuZWVkIHRoZSBsaW5lIGJlbG93IGJlY2F1c2UgZmxhdGNhciBoYXMgdGhlIHNhbWUgc3RyaW5nICJjb3Jlb3MiIGluIHRoYXQgZmlsZQogICAgaWYgZ3JlcCAtcSBjb3Jlb3MgL2V0Yy9vcy1yZWxlYXNlCiAgICB0aGVuCiAgICAgIGVjaG8gIktVQkVMRVRfTk9ERV9JUD0ke0RFRkFVTFRfSUZDX0lQfVxuS1VCRUxFVF9IT1NUTkFNRT0ke0ZVTExfSE9TVE5BTUV9IiA+IC9ldGMva3ViZXJuZXRlcy9ub2RlaXAuY29uZgogICAgZWxpZiBbICEgLWQgL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LnNlcnZpY2UuZCBdCiAgICB0aGVuCiAgICAgIGVjaG9kYXRlICJDYW4ndCBmaW5kIGt1YmVsZXQgc2VydmljZSBleHRyYXMgZGlyZWN0b3J5IgogICAgICBleGl0IDEKICAgIGVsc2UKICAgICAgZWNobyAtZSAiW1NlcnZpY2VdXG5FbnZpcm9ubWVudD1cIktVQkVMRVRfTk9ERV9JUD0ke0RFRkFVTFRfSUZDX0lQfVwiXG5FbnZpcm9ubWVudD1cIktVQkVMRVRfSE9TVE5BTUU9JHtGVUxMX0hPU1ROQU1FfVwiIiA+IC9ldGMvc3lzdGVtZC9zeXN0ZW0va3ViZWxldC5zZXJ2aWNlLmQvbm9kZWlwLmNvbmYKICAgIGZpCiAgICAKCi0gcGF0aDogJy9ldGMva3ViZXJuZXRlcy9ib290c3RyYXAta3ViZWxldC5jb25mJwogIHBlcm1pc3Npb25zOiAnMDYwMCcKICBjb250ZW50OiB8LQogICAgYXBpVmVyc2lvbjogdjEKICAgIGNsdXN0ZXJzOgogICAgLSBjbHVzdGVyOgogICAgICAgIGNlcnRpZmljYXRlLWF1dGhvcml0eS1kYXRhOiBMUzB0TFMxQ1JVZEpUaUJEUlZKVVNVWkpRMEZVUlMwdExTMHRDazFKU1VWWGFrTkRRVEJMWjBGM1NVSkJaMGxLUVV4bVVteFhjMGs0V1ZGSVRVRXdSME5UY1VkVFNXSXpSRkZGUWtKUlZVRk5TSE40UTNwQlNrSm5UbFlLUWtGWlZFRnNWbFJOVVhOM1ExRlpSRlpSVVVsRmQwcEVVVlJGVjAxQ1VVZEJNVlZGUW5oTlRsVXlSblZKUlZwNVdWYzFhbUZZVG1waWVrVlZUVUpKUndwQk1WVkZRMmhOVEZGdVNtaGFSMXB3WkVod2NHSnRUWGhGYWtGUlFtZE9Wa0pCVFZSRFYzaDJXVEpHYzJGSE9YcGtSRVZrVFVKelIwTlRjVWRUU1dJekNrUlJSVXBCVWxsUFdXNUthRnBGUW10WlZ6VnVXVk0xYW1JeU1IZElhR05PVFZSUmQwNTZSVEZOYWtFd1RtcEJNVmRvWTA1TlZHTjNUbFJCTUUxcVFUQUtUbXBCTVZkcVFqZE5VWE4zUTFGWlJGWlJVVWRGZDBwV1ZYcEZURTFCYTBkQk1WVkZRMEpOUTFFd1JYaEdha0ZWUW1kT1ZrSkJZMVJFVms1b1ltbENSd3BqYlVaMVdUSnNlbGt5T0hoR1JFRlRRbWRPVmtKQmIxUkRNRXA1V1ZkU2JXRllValpoVnpWcVRWSkpkMFZCV1VSV1VWRkVSWGRzYzJJeVRtaGlSMmgyQ21NelVYaElWRUZpUW1kcmNXaHJhVWM1ZHpCQ1ExRkZWMFJ0U25sWlYxSkJXa2RHZFZveVJYVlpNamwwVFVsSlFrbHFRVTVDWjJ0eGFHdHBSemwzTUVJS1FWRkZSa0ZCVDBOQlVUaEJUVWxKUWtOblMwTkJVVVZCZERWbVFXcHdOR1pVWTJWclYxVlVabnB6Y0RCcmVXbG9NVTlaWW5OSFREQkxXREZsVW1KVFV3cFNPRTlrTUNzNVVUWXlTSGx1ZVN0SFJuZE5WR0kwUVM5TFZUaHRjM052U0haalkyVlRRVUZpZDJaaWVFWkxMeXR6TlRGVWIySnhWVzVQVWxweVQyOVVDbHBxYTFWNVoySjVXRVJUU3prNVdVSmlZMUl4VUdsd09IWjNUVlJ0TkZoTGRVeDBRMmxuWlVKQ1pHcHFRVkZrWjFWUE1qaE1SVTVIYkhOTmJtMWxXV3NLU21aUFJGWkhibFp0Y2pWTWRHSTVRVTVCT0VsTGVWUm1jMjVJU2pScFQwTlRMMUJzVUdKVmFqSnhOMWx1YjFaTWNHOXpWVUpOYkdkVllpOURlV3RZTXdwdFQyOU1ZalI1U2twUmVVRXZhVk5VTmxwNGFVbEZhak0yUkRSNVYxbzFiR2MzV1Vwc0sxVnBhVUpSU0VkRGJsQmtSM2xwY0hGV01EWmxlREJvWlZsWENtTmhhVmM0VEZkYVUxVlJPVE5xVVN0WFZrTklPR2hVTjBSUlR6RmtiWE4yVlcxWWJIRXZTbVZCYkhkUkwxRkpSRUZSUVVKdk5FaG5UVWxJWkUxQ01FY0tRVEZWWkVSblVWZENRbEpqUVZKUGRHaFRORkEwVlRkMlZHWnFRbmxETlRZNVVqZEZOa1JEUW5KUldVUldVakJxUWtsSGJFMUpSMmxuUWxKalFWSlBkQXBvVXpSUU5GVTNkbFJtYWtKNVF6VTJPVkkzUlRaTFJpOXdTREIzWlhwRlRFMUJhMGRCTVZWRlFtaE5RMVpXVFhoRGVrRktRbWRPVmtKQloxUkJhMDVDQ2sxU1dYZEdRVmxFVmxGUlNFVjNNVlJaVnpSblVtNUthR0p0VG5Cak1rNTJUVkpSZDBWbldVUldVVkZMUlhkMFEyTnRSbXRhYld3d1pXMXNkVmw2UlZNS1RVSkJSMEV4VlVWQmVFMUtZa2M1YWxsWGVHOWlNMDR3VFZJd2QwZDNXVXBMYjFwSmFIWmpUa0ZSYTBKR1p6VnBZMjFHYTFGSFVtaGliV1JvVEcxT2RncGlXVWxLUVV4bVVteFhjMGs0V1ZGSVRVRjNSMEV4VldSRmQxRkdUVUZOUWtGbU9IZEVVVmxLUzI5YVNXaDJZMDVCVVVWR1FsRkJSR2RuUlVKQlJ6Wm9DbFU1WmpselRrZ3dMelp2UW1KSFIza3lSVlpWTUZWblNWUlZVVWx5Umxkdk9YSkdhM0pYTldzdldHdEVhbEZ0S3pOc2VtcFVNR2xIVWpSSmVFVXZRVzhLWlZVMmMxRm9kV0UzZDNKWFpVWkZialEzUjB3NU9HeHVRM05LWkVRM2IxcE9hRVp0VVRrMVZHSXZURzVFVldwek5WbHFPV0p5VURCT1YzcFlabGxWTkFwVlN6SmFia2xPU2xKalNuQkNPR2xTUTJGRGVFVTRSR1JqVlVZd1dIRkpSWEUyY0VFeU56SnpibTlNYldsWVRFMTJUbXd6YTFsRlpHMHJhbVUyZG05RUNqVTRVMDVXUlZWemVuUjZVWGxZYlVwRmFFTndkMVpKTUVFMlVVTnFlbGhxSzNGMmNHMTNNMXBhU0drNFNuZFlaV2s0V2xwQ1RGUlRSa0pyYVRoYU4yNEtjMGc1UWtKSU16Z3ZVM3BWYlVGT05GRklVMUI1TVdkcWNXMHdNRTlCUlRoT1lWbEVhMmd2WW5wRk5HUTNiVXhIUjAxWGNDOVhSVE5MVUZOMU9ESklSZ3ByVUdVMldHOVRZbWxNYlM5cmVHc3pNbFF3UFFvdExTMHRMVVZPUkNCRFJWSlVTVVpKUTBGVVJTMHRMUzB0CiAgICAgICAgc2VydmVyOiBodHRwczovL3NlcnZlcjo0NDMKICAgICAgbmFtZTogIiIKICAgIGNvbnRleHRzOiBudWxsCiAgICBjdXJyZW50LWNvbnRleHQ6ICIiCiAgICBraW5kOiBDb25maWcKICAgIHByZWZlcmVuY2VzOiB7fQogICAgdXNlcnM6CiAgICAtIG5hbWU6ICIiCiAgICAgIHVzZXI6CiAgICAgICAgdG9rZW46IG15LXRva2VuCiAgICAKICAgIAoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL3BraS9jYS5jcnQnCiAgY29udGVudDogfC0KICAgIC0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQogICAgTUlJRVdqQ0NBMEtnQXdJQkFnSUpBTGZSbFdzSThZUUhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1Ic3hDekFKQmdOVgogICAgQkFZVEFsVlRNUXN3Q1FZRFZRUUlFd0pEUVRFV01CUUdBMVVFQnhNTlUyRnVJRVp5WVc1amFYTmpiekVVTUJJRwogICAgQTFVRUNoTUxRbkpoWkdacGRIcHBibU14RWpBUUJnTlZCQU1UQ1d4dlkyRnNhRzl6ZERFZE1Cc0dDU3FHU0liMwogICAgRFFFSkFSWU9ZbkpoWkVCa1lXNW5ZUzVqYjIwd0hoY05NVFF3TnpFMU1qQTBOakExV2hjTk1UY3dOVEEwTWpBMAogICAgTmpBMVdqQjdNUXN3Q1FZRFZRUUdFd0pWVXpFTE1Ba0dBMVVFQ0JNQ1EwRXhGakFVQmdOVkJBY1REVk5oYmlCRwogICAgY21GdVkybHpZMjh4RkRBU0JnTlZCQW9UQzBKeVlXUm1hWFI2YVc1ak1SSXdFQVlEVlFRREV3bHNiMk5oYkdodgogICAgYzNReEhUQWJCZ2txaGtpRzl3MEJDUUVXRG1KeVlXUkFaR0Z1WjJFdVkyOXRNSUlCSWpBTkJna3Foa2lHOXcwQgogICAgQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdDVmQWpwNGZUY2VrV1VUZnpzcDBreWloMU9ZYnNHTDBLWDFlUmJTUwogICAgUjhPZDArOVE2Mkh5bnkrR0Z3TVRiNEEvS1U4bXNzb0h2Y2NlU0FBYndmYnhGSy8rczUxVG9icVVuT1Jack9vVAogICAgWmprVXlnYnlYRFNLOTlZQmJjUjFQaXA4dndNVG00WEt1THRDaWdlQkJkampBUWRnVU8yOExFTkdsc01ubWVZawogICAgSmZPRFZHblZtcjVMdGI5QU5BOElLeVRmc25ISjRpT0NTL1BsUGJVajJxN1lub1ZMcG9zVUJNbGdVYi9DeWtYMwogICAgbU9vTGI0eUpKUXlBL2lTVDZaeGlJRWozNkQ0eVdaNWxnN1lKbCtVaWlCUUhHQ25QZEd5aXBxVjA2ZXgwaGVZVwogICAgY2FpVzhMV1pTVVE5M2pRK1dWQ0g4aFQ3RFFPMWRtc3ZVbVhscS9KZUFsd1EvUUlEQVFBQm80SGdNSUhkTUIwRwogICAgQTFVZERnUVdCQlJjQVJPdGhTNFA0VTd2VGZqQnlDNTY5UjdFNkRDQnJRWURWUjBqQklHbE1JR2lnQlJjQVJPdAogICAgaFM0UDRVN3ZUZmpCeUM1NjlSN0U2S0YvcEgwd2V6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWtOQgogICAgTVJZd0ZBWURWUVFIRXcxVFlXNGdSbkpoYm1OcGMyTnZNUlF3RWdZRFZRUUtFd3RDY21Ga1ptbDBlbWx1WXpFUwogICAgTUJBR0ExVUVBeE1KYkc5allXeG9iM04wTVIwd0d3WUpLb1pJaHZjTkFRa0JGZzVpY21Ga1FHUmhibWRoTG1OdgogICAgYllJSkFMZlJsV3NJOFlRSE1Bd0dBMVVkRXdRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUc2aAogICAgVTlmOXNOSDAvNm9CYkdHeTJFVlUwVWdJVFVRSXJGV285ckZrclc1ay9Ya0RqUW0rM2x6alQwaUdSNEl4RS9BbwogICAgZVU2c1FodWE3d3JXZUZFbjQ3R0w5OGxuQ3NKZEQ3b1pOaEZtUTk1VGIvTG5EVWpzNVlqOWJyUDBOV3pYZllVNAogICAgVUsyWm5JTkpSY0pwQjhpUkNhQ3hFOERkY1VGMFhxSUVxNnBBMjcyc25vTG1pWExNdk5sM2tZRWRtK2plNnZvRAogICAgNThTTlZFVXN6dHpReVhtSkVoQ3B3VkkwQTZRQ2p6WGorcXZwbXczWlpIaThKd1hlaThaWkJMVFNGQmtpOFo3bgogICAgc0g5QkJIMzgvU3pVbUFONFFIU1B5MWdqcW0wME9BRThOYVlEa2gvYnpFNGQ3bUxHR01XcC9XRTNLUFN1ODJIRgogICAga1BlNlhvU2JpTG0va3hrMzJUMD0KICAgIC0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9zZXR1cC5zZXJ2aWNlJwogIHBlcm1pc3Npb25zOiAnMDY0NCcKICBjb250ZW50OiB8LQogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgCiAgICBbVW5pdF0KICAgIFJlcXVpcmVzPW5ldHdvcmstb25saW5lLnRhcmdldAogICAgQWZ0ZXI9bmV0d29yay1vbmxpbmUudGFyZ2V0CiAgICAKICAgIFtTZXJ2aWNlXQogICAgVHlwZT1vbmVzaG90CiAgICBSZW1haW5BZnRlckV4aXQ9dHJ1ZQogICAgRW52aXJvbm1lbnRGaWxlPS0vZXRjL2Vudmlyb25tZW50CiAgICBFeGVjU3RhcnQ9L29wdC9iaW4vc3VwZXJ2aXNlLnNoIC9vcHQvYmluL3NldHVwCiAgICAKCi0gcGF0aDogJy9ldGMvcHJvZmlsZS5kL29wdC1iaW4tcGF0aC5zaCcKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgY29udGVudDogfC0KICAgIGV4cG9ydCBQQVRIPSIvb3B0L2JpbjokUEFUSCIKICAgIAoKLSBwYXRoOiAnL2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZicKICBjb250ZW50OiB8LQogICAgYXBpVmVyc2lvbjoga3ViZWxldC5jb25maWcuazhzLmlvL3YxYmV0YTEKICAgIGtpbmQ6IEt1YmVsZXRDb25maWd1cmF0aW9uCiAgICBhdXRoZW50aWNhdGlvbjoKICAgICAgYW5vbnltb3VzOgogICAgICAgIGVuYWJsZWQ6IGZhbHNlCiAgICAgIHdlYmhvb2s6CiAgICAgICAgZW5hYmxlZDogdHJ1ZQogICAgICB4NTA5OgogICAgICAgIGNsaWVudENBRmlsZTogL2V0Yy9rdWJlcm5ldGVzL3BraS9jYS5jcnQKICAgIGF1dGhvcml6YXRpb246CiAgICAgIG1vZGU6IFdlYmhvb2sKICAgIGNncm91cERyaXZlcjogc3lzdGVtZAogICAgY2x1c3RlckROUzoKICAgIC0gIjEwLjAuMC4wIgogICAgY2x1c3RlckRvbWFpbjogY2x1c3Rlci5sb2NhbAogICAgZmVhdHVyZUdhdGVzOgogICAgICBSb3RhdGVLdWJlbGV0U2VydmVyQ2VydGlmaWNhdGU6IHRydWUKICAgIHByb3RlY3RLZXJuZWxEZWZhdWx0czogdHJ1ZQogICAgcmVhZE9ubHlQb3J0OiAwCiAgICByb3RhdGVDZXJ0aWZpY2F0ZXM6IHRydWUKICAgIHNlcnZlclRMU0Jvb3RzdHJhcDogdHJ1ZQogICAgc3RhdGljUG9kUGF0aDogL2V0Yy9rdWJlcm5ldGVzL21hbmlmZXN0cwogICAga3ViZVJlc2VydmVkOgogICAgICBjcHU6IDIwMG0KICAgICAgZXBoZW1lcmFsLXN0b3JhZ2U6IDFHaQogICAgICBtZW1vcnk6IDIwME1pCiAgICBzeXN0ZW1SZXNlcnZlZDoKICAgICAgY3B1OiAyMDBtCiAgICAgIGVwaGVtZXJhbC1zdG9yYWdlOiAxR2kKICAgICAgbWVtb3J5OiAyMDBNaQogICAgdm9sdW1lUGx1Z2luRGlyOiAvdmFyL2xpYi9rdWJlbGV0L3ZvbHVtZXBsdWdpbnMKICAgIAoKLSBwYXRoOiAnL2V0Yy9zeXN0ZW1kL3N5c3RlbS9rdWJlbGV0LWhlYWx0aGNoZWNrLnNlcnZpY2UnCiAgcGVybWlzc2lvbnM6ICcwNjQ0JwogIGNvbnRlbnQ6IHwtCiAgICBbVW5pdF0KICAgIFJlcXVpcmVzPWt1YmVsZXQuc2VydmljZQogICAgQWZ0ZXI9a3ViZWxldC5zZXJ2aWNlCiAgICAKICAgIFtTZXJ2aWNlXQogICAgRXhlY1N0YXJ0PS9vcHQvYmluL2hlYWx0aC1tb25pdG9yLnNoIGt1YmVsZXQKICAgIAogICAgW0luc3RhbGxdCiAgICBXYW50ZWRCeT1tdWx0aS11c2VyLnRhcmdldAogICAgCgotIHBhdGg6ICcvZXRjL2RvY2tlci9kYWVtb24uanNvbicKICBwZXJtaXNzaW9uczogJzA2NDQnCiAgY29udGVudDogfC0KICAgIHsiZXhlYy1vcHRzIjpbIm5hdGl2ZS5jZ3JvdXBkcml2ZXI9c3lzdGVtZCJdLCJzdG9yYWdlLWRyaXZlciI6Im92ZXJsYXkyIiwibG9nLWRyaXZlciI6Impzb24tZmlsZSIsImxvZy1vcHRzIjp7Im1heC1maWxlIjoiNSIsIm1heC1zaXplIjoiMTAwbSJ9fQoKYm9vdGNtZDoKLSBlY2hvIGhlbGxvCi0gZWNobyB3b3JsZAoKcmhfc3Vic2NyaXB0aW9uOgogICAgcGFzc3dvcmQ6IHBhc3N3b3JkCiAgICB1c2VybmFtZTogdXNlcm5hbWU= +immutable: true kind: Secret metadata: creationTimestamp: null diff --git a/pkg/controllers/osp/osp_controller.go b/pkg/controllers/osp/osp_controller.go index b82c51f7..e02b2613 100644 --- a/pkg/controllers/osp/osp_controller.go +++ b/pkg/controllers/osp/osp_controller.go @@ -21,10 +21,11 @@ import ( "fmt" "io/fs" "path/filepath" + "strings" "go.uber.org/zap" - "k8c.io/operating-system-manager/charts/osps" + "k8c.io/operating-system-manager/deploy/osps" "k8c.io/operating-system-manager/pkg/crd/osm/v1alpha1" "k8c.io/operating-system-manager/pkg/resources/reconciling" @@ -114,6 +115,9 @@ func (r *Reconciler) reconcile(ctx context.Context) error { return fmt.Errorf("failed to parse osp %s: %v", name, err) } + // Remove file extension .yaml from the OSP name + name = strings.ReplaceAll(name, ".yaml", "") + ospCreators = append(ospCreators, ospCreator(name, osp)) } diff --git a/pkg/crd/osm/v1alpha1/common_types.go b/pkg/crd/osm/v1alpha1/common_types.go index ed898979..ff1a8f8b 100644 --- a/pkg/crd/osm/v1alpha1/common_types.go +++ b/pkg/crd/osm/v1alpha1/common_types.go @@ -21,6 +21,7 @@ import ( ) // OperatingSystem represents supported operating system. +// +kubebuilder:validation:Enum=flatcar;rhel;centos;ubuntu;sles;amzn2 type OperatingSystem string const ( @@ -33,6 +34,7 @@ const ( ) // CloudProvider represents supported cloud provider. +// +kubebuilder:validation:Enum=aws;azure;digitalocean;gce;hetzner;kubevirt;linode;openstack;packet;vsphere;fake;alibaba;anexia;scaleway;baremetal;external type CloudProvider string const ( @@ -54,6 +56,15 @@ const ( CloudProviderExternal CloudProvider = "external" ) +// ContainerRuntime represents supported container runtime +// +kubebuilder:validation:Enum=docker;containerd +type ContainerRuntime string + +const ( + ContainerRuntimeDocker ContainerRuntime = "docker" + ContainerRuntimeContainerd ContainerRuntime = "containerd" +) + // CloudProviderSpec contains the os/image reference for a specific supported cloud provider type CloudProviderSpec struct { // Name represents the name of the supported cloud provider @@ -100,7 +111,7 @@ type File struct { // ContainerRuntimeSpec aggregates information about a specific container runtime type ContainerRuntimeSpec struct { // Name of the Container runtime - Name string `json:"name"` + Name ContainerRuntime `json:"name"` // Files to add to the main files list when the containerRuntime is selected Files []File `json:"files"` // Templates to add to the available templates when the containerRuntime is selected diff --git a/pkg/crd/osm/v1alpha1/operatingsystemprofile_types.go b/pkg/crd/osm/v1alpha1/operatingsystemprofile_types.go index a49565b4..1e3c39a2 100644 --- a/pkg/crd/osm/v1alpha1/operatingsystemprofile_types.go +++ b/pkg/crd/osm/v1alpha1/operatingsystemprofile_types.go @@ -46,6 +46,8 @@ type OperatingSystemProfileSpec struct { OSName OperatingSystem `json:"osName"` // OSVersion the version of the operating system OSVersion string `json:"osVersion"` + // Version is the version of the operating System Profile + Version string `json:"version"` // SupportedCloudProviders represent the cloud providers that support the given operating system version SupportedCloudProviders []CloudProviderSpec `json:"supportedCloudProviders"` // SupportedContainerRuntimes represents the container runtimes supported by the given OS