From 7c38de47529d9fd09580c97f894dd4047994c6ce Mon Sep 17 00:00:00 2001 From: Jason DeTiberus Date: Thu, 6 Jun 2019 21:09:59 -0400 Subject: [PATCH] Backports (#986) * Adding steps for how to use existing cluster as bootstrap cluster. (#877) * Add proposals template (#879) Signed-off-by: Vince Prignano * Clarify how to use kuebconfig. (#869) * Add discuss link to README (#885) Signed-off-by: Vince Prignano * Fix a broken link to Cluster API KEP (#900) * Add Cluster API project scope and objectives (#882) Signed-off-by: Vince Prignano * Fix API group name written in kubebuilder's annotation comments (#883) * Update github org for the baremetal provider. (#911) The github org was renamed, so use the new URL for the location of the bare metal cluster-api provider. * Add Talos to list of providers (#915) * Add reference use cases for Cluster API (#903) Signed-off-by: Vince Prignano * Add missing bullet point to staging-use-cases.md (#920) * Added IBM Cloud to Cluster API README. (#928) * Update documentation links to published content (#927) * Add Cluster API logos from CNCF (#916) * Adding Reference Use Cases to README. (#931) * Updating release docs for branching approach now that we are 0.x (#862) I think the previous approach was for pre-versioned branches, but now we probably want to start maintaining release branches - even if in practice we would cut 0.2.0 instead of 0.1.1 * Used doctoc generated toc. (#932) * Update to go 1.12.5 (#937) * Attempt to fix integration tests (#942) - Use specific versions of kind and kustomize instead of installing with `go get` - Update golang version for example provider * Update README.md (#941) * Add shortnames for crds. (#943) * Fix machine object pivoting to the target cluster (#944) * [docs] Update RBAC annotations for example provider (#947) * Remove workstreams from scope and objectives (#948) Signed-off-by: Vince Prignano * Added ibm cloud to architecture diagram. (#946) * Added comment about cluster API vs cloud providers to readme (#954) * Quit MachineSet reconcile early if DeletionTimestamp is set (#956) Signed-off-by: Vince Prignano * Cleanup controllers (#958) Signed-off-by: Vince Prignano * updates Google Cloud branding to mach other usages (#973) * Cannot retrieve machine name (#960) Signed-off-by: clyang82 * Allow to use foregroundDeletion for MachineDeployments and MachineSets (#953) * Rename controllers test files (#968) Signed-off-by: Vince Prignano * make cluster-api-manager container run with a non-root user (#955) * Update Gitbook release process (#659) * Remove mermaid module because it is currently unused and does not always install cleanly. * Introduce npm-shrinkwrap so that npm installations are reproducable. * Update gitbook release documentation. * Clarify verification instructions. * Update GitBook. * Remove rendered Gitbook from repo in preparation for using firebase instead. * Install gitbook cli. * Update documentation for netlify. * Add Netlify configuration toml. * Update link to homepage so that it points to the book and not the GitHub repository. * Remove base from netlify.toml. The build script already accounts for the correct location... * Remove reference to no longer existent KEP. :( * Disable redirects until the cluster-api.sigs.k8s.io domain has been created. * Reenable netlify redirects now that the cluster-api.sigs.k8s.io domain exists. * Add versioning and releases to README (#967) Signed-off-by: Vince Prignano * Add more log for cluster deletion failure (#978) * Update dependencies (#982) Signed-off-by: Vince Prignano --- Dockerfile | 5 +- Gopkg.lock | 32 +- Gopkg.toml | 2 +- README.md | 28 +- WORKSPACE | 6 +- cmd/clusterctl/README.md | 23 +- .../clusterclient/clusterclient.go | 10 + .../clusterdeployer/clusterdeployer.go | 6 +- cmd/clusterctl/phases/pivot.go | 7 + ...create-cluster-no-args-invalid-flag.golden | 2 +- .../testdata/create-cluster-no-args.golden | 2 +- .../create-no-args-invalid-flag.golden | 2 +- cmd/clusterctl/testdata/create-no-args.golden | 2 +- ...delete-cluster-no-args-invalid-flag.golden | 2 +- .../testdata/delete-cluster-no-args.golden | 2 +- .../delete-no-args-invalid-flag.golden | 2 +- cmd/clusterctl/testdata/delete-no-args.golden | 2 +- .../testdata/no-args-invalid-flag.golden | 2 +- cmd/clusterctl/testdata/no-args.golden | 2 +- ...lidate-cluster-no-args-invalid-flag.golden | 2 +- .../validate-no-args-invalid-flag.golden | 2 +- .../testdata/validate-no-args.golden | 2 +- config/crds/cluster_v1alpha1_cluster.yaml | 2 + config/crds/cluster_v1alpha1_machine.yaml | 2 + .../crds/cluster_v1alpha1_machineclass.yaml | 2 + .../cluster_v1alpha1_machinedeployment.yaml | 2 + config/crds/cluster_v1alpha1_machineset.yaml | 2 + config/rbac/rbac_role.yaml | 18 +- docs/book/README.md | 2 +- docs/book/RELEASE | 44 +- docs/book/SUMMARY.md | 4 - docs/book/book.json | 2 +- docs/book/common_code/architecture.md | 4 +- docs/book/common_code/architecture.svg | 26 +- docs/book/npm-shrinkwrap.json | 1034 +++++++++++++++++ docs/book/package.json | 32 + .../create_actuators.md | 5 +- .../register_controllers.md | 4 +- docs/developer/releasing.md | 25 +- ...pi-proposal.md => 20181121-machine-api.md} | 0 docs/proposals/YYYYMMDD-template.md | 240 ++++ docs/scope-and-objectives.md | 145 +++ docs/staging-use-cases.md | 229 ++++ hack/build-gitbook.sh | 30 + logos/LICENSE.md | 13 + logos/README.md | 15 + logos/kubernetes-cluster-logos_1.pdf | Bin 0 -> 319325 bytes logos/kubernetes-cluster-logos_2.pdf | Bin 0 -> 162451 bytes logos/kubernetes-cluster-logos_final-01.svg | 1 + logos/kubernetes-cluster-logos_final-02.svg | 1 + netlify.toml | 24 + pkg/apis/cluster/v1alpha1/cluster_types.go | 1 + pkg/apis/cluster/v1alpha1/machine_types.go | 1 + .../cluster/v1alpha1/machineclass_types.go | 1 + .../v1alpha1/machinedeployment_types.go | 1 + pkg/apis/cluster/v1alpha1/machineset_types.go | 1 + pkg/controller/BUILD.bazel | 2 +- pkg/controller/cluster/BUILD.bazel | 6 +- .../{controller.go => cluster_controller.go} | 0 ...st.go => cluster_reconciler_suite_test.go} | 0 ...ler_test.go => cluster_reconciler_test.go} | 0 pkg/controller/machine/BUILD.bazel | 6 +- pkg/controller/machine/controller_test.go | 193 --- .../{controller.go => machine_controller.go} | 2 +- .../machine/machine_controller_test.go | 197 +++- ...st.go => machine_reconciler_suite_test.go} | 0 .../machine/machine_reconciler_test.go | 76 ++ pkg/controller/machinedeployment/BUILD.bazel | 7 +- .../machinedeployment/controller_test.go | 349 ------ ...ler.go => machinedeployment_controller.go} | 150 +-- .../machinedeployment_controller_test.go | 533 +++++---- ...achinedeployment_reconciler_suite_test.go} | 0 .../machinedeployment_reconciler_test.go | 323 +++++ pkg/controller/machinedeployment/rolling.go | 1 + pkg/controller/machinedeployment/sync.go | 17 +- pkg/controller/machineset/BUILD.bazel | 6 +- pkg/controller/machineset/controller_test.go | 264 ----- pkg/controller/machineset/delete_policy.go | 7 +- ...controller.go => machineset_controller.go} | 103 +- .../machineset/machineset_controller_test.go | 306 +++-- ...go => machineset_reconciler_suite_test.go} | 0 .../machineset/machineset_reconciler_test.go | 142 +++ pkg/controller/node/BUILD.bazel | 4 +- ..._test.go => node_reconciler_suite_test.go} | 0 ...roller_test.go => node_reconciler_test.go} | 0 .../{controller.go => noderef_controller.go} | 0 pkg/provider/example/container/Dockerfile | 2 +- scripts/ci-integration.sh | 35 +- vendor/github.com/google/uuid/node.go | 1 + vendor/github.com/onsi/ginkgo/.travis.yml | 8 +- vendor/github.com/onsi/ginkgo/CHANGELOG.md | 11 + .../github.com/onsi/ginkgo/config/config.go | 2 +- vendor/github.com/onsi/ginkgo/ginkgo_dsl.go | 4 +- .../onsi/ginkgo/internal/spec/specs.go | 45 +- vendor/github.com/onsi/gomega/.travis.yml | 10 +- vendor/github.com/onsi/gomega/CHANGELOG.md | 11 + vendor/github.com/onsi/gomega/Makefile | 6 + vendor/github.com/onsi/gomega/gomega_dsl.go | 282 ++--- .../gomega/matchers/have_occurred_matcher.go | 2 +- .../onsi/gomega/matchers/match_xml_matcher.go | 4 +- vendor/k8s.io/klog/klog.go | 196 +++- .../pkg/cache/internal/BUILD.bazel | 1 + .../pkg/cache/internal/cache_reader.go | 30 +- .../pkg/client/fake/BUILD.bazel | 2 + .../pkg/client/fake/client.go | 27 +- .../pkg/client/typed_client.go | 1 - .../pkg/internal/objectutil/BUILD.bazel | 14 + .../pkg/internal/objectutil/filter.go | 42 + 108 files changed, 3814 insertions(+), 1674 deletions(-) create mode 100644 docs/book/npm-shrinkwrap.json create mode 100644 docs/book/package.json rename docs/proposals/{machine-api-proposal.md => 20181121-machine-api.md} (100%) create mode 100644 docs/proposals/YYYYMMDD-template.md create mode 100644 docs/scope-and-objectives.md create mode 100644 docs/staging-use-cases.md create mode 100755 hack/build-gitbook.sh create mode 100644 logos/LICENSE.md create mode 100644 logos/README.md create mode 100644 logos/kubernetes-cluster-logos_1.pdf create mode 100644 logos/kubernetes-cluster-logos_2.pdf create mode 100644 logos/kubernetes-cluster-logos_final-01.svg create mode 100644 logos/kubernetes-cluster-logos_final-02.svg create mode 100644 netlify.toml rename pkg/controller/cluster/{controller.go => cluster_controller.go} (100%) rename pkg/controller/cluster/{cluster_controller_suite_test.go => cluster_reconciler_suite_test.go} (100%) rename pkg/controller/cluster/{cluster_controller_test.go => cluster_reconciler_test.go} (100%) delete mode 100644 pkg/controller/machine/controller_test.go rename pkg/controller/machine/{controller.go => machine_controller.go} (99%) rename pkg/controller/machine/{machine_controller_suite_test.go => machine_reconciler_suite_test.go} (100%) create mode 100644 pkg/controller/machine/machine_reconciler_test.go delete mode 100644 pkg/controller/machinedeployment/controller_test.go rename pkg/controller/machinedeployment/{controller.go => machinedeployment_controller.go} (87%) rename pkg/controller/machinedeployment/{machinedeployment_controller_suite_test.go => machinedeployment_reconciler_suite_test.go} (100%) create mode 100644 pkg/controller/machinedeployment/machinedeployment_reconciler_test.go delete mode 100644 pkg/controller/machineset/controller_test.go rename pkg/controller/machineset/{controller.go => machineset_controller.go} (89%) rename pkg/controller/machineset/{machineset_controller_suite_test.go => machineset_reconciler_suite_test.go} (100%) create mode 100644 pkg/controller/machineset/machineset_reconciler_test.go rename pkg/controller/node/{node_controller_suite_test.go => node_reconciler_suite_test.go} (100%) rename pkg/controller/node/{node_controller_test.go => node_reconciler_test.go} (100%) rename pkg/controller/{controller.go => noderef_controller.go} (100%) create mode 100644 vendor/github.com/onsi/gomega/Makefile create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/BUILD.bazel create mode 100644 vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go diff --git a/Dockerfile b/Dockerfile index bca982033017..5816d9011ff3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -13,10 +13,10 @@ # limitations under the License. # Build the manager binary -FROM golang:1.12.3 as builder +FROM golang:1.12.5 as builder # Copy in the go src -WORKDIR $GOPATH/src/sigs.k8s.io/cluster-api +WORKDIR ${GOPATH}/src/sigs.k8s.io/cluster-api COPY pkg/ pkg/ COPY cmd/ cmd/ COPY vendor/ vendor/ @@ -28,4 +28,5 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-st FROM gcr.io/distroless/static:latest WORKDIR / COPY --from=builder /go/src/sigs.k8s.io/cluster-api/manager . +USER nobody ENTRYPOINT ["/manager"] diff --git a/Gopkg.lock b/Gopkg.lock index dad988a85475..7a856203927c 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -179,12 +179,12 @@ revision = "24818f796faf91cd76ec7bddd72458fbced7a6c1" [[projects]] - digest = "1:236d7e1bdb50d8f68559af37dbcf9d142d56b431c9b2176d41e2a009b664cda8" + digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" name = "github.com/google/uuid" packages = ["."] pruneopts = "UT" - revision = "9b3b1e0f5f99ae461456d768e7d301a7acdaa2d8" - version = "v1.1.0" + revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" + version = "v1.1.1" [[projects]] digest = "1:65c4414eeb350c47b8de71110150d0ea8a281835b1f386eacaa3ad7325929c21" @@ -315,7 +315,7 @@ version = "1.0.1" [[projects]] - digest = "1:5f4b78246f0bcb105b1e3b2b9e22b52a57cd02f57a8078572fe27c62f4a75ff7" + digest = "1:e9c3bb68a6c9470302b8046d4647e0612a2ea6037b9c6a47de60c0a90db504f8" name = "github.com/onsi/ginkgo" packages = [ ".", @@ -338,11 +338,11 @@ "types", ] pruneopts = "UT" - revision = "2e1be8f7d90e9d3e3e58b0ce470f2f14d075406f" - version = "v1.7.0" + revision = "eea6ad008b96acdaa524f5b409513bf062b500ad" + version = "v1.8.0" [[projects]] - digest = "1:b4764603c54d74435f246901248aefb2b9d430bb7b160afde1afc41d89d48f1a" + digest = "1:029c6999f3efa5f1cd3f8b9e02a8bc4276cc439d2dc8dc73cd98e4efd5c76cba" name = "github.com/onsi/gomega" packages = [ ".", @@ -361,8 +361,8 @@ "types", ] pruneopts = "UT" - revision = "65fb64232476ad9046e57c26cd0bff3d3a8dc6cd" - version = "v1.4.3" + revision = "90e289841c1ed79b7a598a7cd9959750cb5e89e2" + version = "v1.5.0" [[projects]] digest = "1:e5d0bd87abc2781d14e274807a470acd180f0499f8bf5bb18606e9ec22ad9de9" @@ -1104,12 +1104,12 @@ revision = "f8a0810f38afb8478882b3835a615aebfda39afa" [[projects]] - digest = "1:c696379ad201c1e86591785579e16bf6cf886c362e9a7534e8eb0d1028b20582" + digest = "1:fa0be820e3b9d58b99264b0ca771ceeb36c7293f8409f70455d4a1e5253a87a0" name = "k8s.io/klog" packages = ["."] pruneopts = "UT" - revision = "e531227889390a39d9533dde61f590fe9f4b0035" - version = "v0.3.0" + revision = "78315d914a8af2453db4864e69230b647b1ff711" + version = "v0.3.2" [[projects]] branch = "master" @@ -1120,7 +1120,7 @@ revision = "ced9eb3070a5f1c548ef46e8dfe2a97c208d9f03" [[projects]] - digest = "1:b27154c2a91d1d3adf28894c60eae5650d1f1e9e1bcba6e943623c6c2beccb24" + digest = "1:723a0b3f18d8042f63570d2478cda739bc547d4c94ba787786ce5bb6b6ccb603" name = "sigs.k8s.io/controller-runtime" packages = [ "pkg/cache", @@ -1136,6 +1136,7 @@ "pkg/handler", "pkg/internal/controller", "pkg/internal/controller/metrics", + "pkg/internal/objectutil", "pkg/internal/recorder", "pkg/leaderelection", "pkg/manager", @@ -1161,8 +1162,8 @@ "pkg/webhook/types", ] pruneopts = "UT" - revision = "12d98582e72927b6cd0123e2b4e819f9341ce62c" - version = "v0.1.10" + revision = "477bf4f046c31c351b46fa00262bc814ac0bbca1" + version = "v0.1.11" [[projects]] digest = "1:992675a6714d511089a0b7ffb7063d36e5423089cda610642de7a0cfbbf673ab" @@ -1235,6 +1236,7 @@ "k8s.io/apimachinery/pkg/util/json", "k8s.io/apimachinery/pkg/util/rand", "k8s.io/apimachinery/pkg/util/runtime", + "k8s.io/apimachinery/pkg/util/sets", "k8s.io/apimachinery/pkg/util/validation/field", "k8s.io/apimachinery/pkg/util/wait", "k8s.io/apimachinery/pkg/util/yaml", diff --git a/Gopkg.toml b/Gopkg.toml index 253e16e7d4e2..f2be59abd2f3 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -24,7 +24,7 @@ required = [ [[constraint]] name="sigs.k8s.io/controller-runtime" - version="v0.1.10" + version="v0.1.11" [[constraint]] name="sigs.k8s.io/controller-tools" diff --git a/README.md b/README.md index 226ddd374e2f..90d3a7a89967 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,20 @@ API design. Because of this, all of the prototype code is rapidly changing. ![Cluster API Architecture](./docs/book/common_code/architecture.svg "Cluster API Architecture") -To learn more, see the [Cluster API KEP][cluster-api-kep]. +Learn more about the project's [scope, objectives, goals and requirements](./docs/scope-and-objectives.md), [feature proposals](./docs/proposals/) and [reference use cases](./docs/staging-use-cases.md). + +### How does Cluster API compare to [Kubernetes Cloud Providers](https://kubernetes.io/docs/concepts/cluster-administration/cloud-providers/)? + +Cloud Providers and the Cluster API work in concert to provide a rich Kubernetes experience in cloud environments. +The Cluster API initializes new nodes and clusters using available [providers](#Provider-Implementations). +Running clusters can then use Cloud Providers to provision support infrastructure like +[load balancers](https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/) +and [persistent volumes](https://kubernetes.io/docs/concepts/storage/persistent-volumes/). ## Get involved! +* Join the [Cluster API discuss forum](https://discuss.kubernetes.io/c/contributors/cluster-api). + * Join the [sig-cluster-lifecycle](https://groups.google.com/forum/#!forum/kubernetes-sig-cluster-lifecycle) Google Group for access to documents and calendars. @@ -38,10 +48,13 @@ are also sponsored by SIG-cluster-lifecycle: * AWS, https://github.com/kubernetes-sigs/cluster-api-provider-aws * Azure, https://github.com/kubernetes-sigs/cluster-api-provider-azure * Baidu Cloud, https://github.com/baidu/cluster-api-provider-baiducloud - * Bare Metal, https://github.com/metalkube/cluster-api-provider-baremetal + * Bare Metal, https://github.com/metal3-io/cluster-api-provider-baremetal * DigitalOcean, https://github.com/kubernetes-sigs/cluster-api-provider-digitalocean - * GCE, https://github.com/kubernetes-sigs/cluster-api-provider-gcp + * Exoscale, https://github.com/exoscale/cluster-api-provider-exoscale + * GCP, https://github.com/kubernetes-sigs/cluster-api-provider-gcp + * IBM Cloud, https://github.com/kubernetes-sigs/cluster-api-provider-ibmcloud * OpenStack, https://github.com/kubernetes-sigs/cluster-api-provider-openstack + * Talos, https://github.com/talos-systems/cluster-api-provider-talos * Tencent Cloud, https://github.com/TencentCloud/cluster-api-provider-tencent * vSphere, https://github.com/kubernetes-sigs/cluster-api-provider-vsphere @@ -53,6 +66,14 @@ Following are the implementations managed by third-parties adopting the standard * Machine API Operator, https://github.com/openshift/machine-api-operator/tree/master * Machine-controller-manager, https://github.com/gardener/machine-controller-manager/tree/cluster-api +## Versioning, Maintenance, and Compatibility + +- We follow [Semantic Versioning (semver)](https://semver.org/). +- Cluster API release cadence is Kubernetes Release + 6 weeks. +- The cadence is subject to change if necessary, refer to the [Milestones](https://github.com/kubernetes-sigs/cluster-api/milestones) page for up-to-date information. +- The _master_ branch is where development happens, this might include breaking changes. +- The _release-X_ branches contain stable, backward compatible code. A new _release-X_ branch is created at every major (X) release. + ## Getting Started ### Resources @@ -63,7 +84,6 @@ Following are the implementations managed by third-parties adopting the standard * `kubectl` is required, see [here](http://kubernetes.io/docs/user-guide/prereqs/). * `clusterctl` is a SIG-cluster-lifecycle sponsored tool to manage Cluster API clusters. See [here](cmd/clusterctl) -[cluster-api-kep]: https://github.com/kubernetes/enhancements/blob/master/keps/sig-cluster-lifecycle/0003-cluster-api.md [notes]: https://docs.google.com/document/d/1Ys-DOR5UsgbMEeciuG0HOgDQc8kZsaWIWJeKJ1-UfbY/edit [recordings]: https://www.youtube.com/playlist?list=PL69nYSiGNLP29D0nYgAGWt1ZFqS9Z7lw4 [zoomMeeting]: https://zoom.us/j/861487554 diff --git a/WORKSPACE b/WORKSPACE index c442a2afb10c..d4409ad2b917 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -3,8 +3,8 @@ load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") http_archive( name = "io_bazel_rules_go", - sha256 = "86ae934bd4c43b99893fc64be9d9fc684b81461581df7ea8fc291c816f5ee8c5", - url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.3/rules_go-0.18.3.tar.gz", + sha256 = "3743a20704efc319070957c45e24ae4626a05ba4b1d6a8961e87520296f1b676", + url = "https://github.com/bazelbuild/rules_go/releases/download/0.18.4/rules_go-0.18.4.tar.gz", ) http_archive( @@ -18,7 +18,7 @@ load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_depe go_rules_dependencies() go_register_toolchains( - go_version = "1.12.3", + go_version = "1.12.5", ) load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository") diff --git a/cmd/clusterctl/README.md b/cmd/clusterctl/README.md index e9ef1f4372c6..5b3147030417 100644 --- a/cmd/clusterctl/README.md +++ b/cmd/clusterctl/README.md @@ -13,8 +13,11 @@ this repository.** ### Prerequisites -1. Install [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) or [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/). [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage) is preferred. -2. If you are using kind, go to step 3; If you are using minikube, install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md) for minikube. For Linux, we recommend kvm2. For MacOS, we recommend VirtualBox. +1. Cluster API runs its operations in Kubernetes. A pre-existing or temporary bootstrap cluster is required. Currently, we support multiple methods to bootstrap Cluster API: `kind` (preferred), `minikube` or any pre-existing cluster. + - If you want to use container, install [kind](https://github.com/kubernetes-sigs/kind#installation-and-usage). This is preferred. + - If you want to use VM, install [minikube](https://kubernetes.io/docs/tasks/tools/install-minikube/), version 0.30.0 or greater. + - If you want to use existing Kubernetes cluster, prepare your kubeconfig. +2. If you are using `kind` or existing Kubernetes cluster, go to step 3. If you are using `minikube`, install a [driver](https://github.com/kubernetes/minikube/blob/master/docs/drivers.md). For Linux, we recommend `kvm2`. For MacOS, we recommend VirtualBox. 2. Build the `clusterctl` tool ```bash @@ -40,13 +43,21 @@ https://github.com/kubernetes-sigs/cluster-api/issues/158 and https://github.com 1. Create a cluster: + - __Bootstrap Cluster__: Use `bootstrap-type`, currently only `kind` and `minikube` are supported. + ```shell - ./clusterctl create cluster --provider --bootstrap-type -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml + ./clusterctl create cluster --provider --bootstrap-type -c cluster.yaml \ + -m machines.yaml -p provider-components.yaml -a addons.yaml ``` -Currently two `bootstrap-type` options are supported - `kind` and `minikube`. + If you are using minikube, to choose a specific minikube driver, please use the `--bootstrap-flags vm-driver=xxx` command line parameter. For example to use the kvm2 driver with clusterctl you woud add `--bootstrap-flags vm-driver=kvm2`. -If you are using minikube, to choose a specific minikube driver, please use the `--bootstrap-flags vm-driver=xxx` command line parameter. For example to use the kvm2 driver with clusterctl you woud add `--bootstrap-flags vm-driver=kvm2`. + - __Existing Cluster__: Use `bootstrap-cluster-kubeconfig`. This flag is used when you have an existing Kubernetes cluster. + + ```shell + ./clusterctl create cluster --provider --bootstrap-cluster-kubeconfig \ + -c cluster.yaml -m machines.yaml -p provider-components.yaml -a addons.yaml + ``` Additional advanced flags can be found via help. @@ -74,6 +85,8 @@ $ kubectl --kubeconfig kubeconfig get machines $ kubectl --kubeconfig kubeconfig get machines -o yaml ``` +**NOTE:** There is no need to specify `--kubeconfig` if your `kubeconfig` was located in the default directory under `$HOME/.kube/config` or if you have already exposed env variable `KUBECONFIG`. + #### Scaling your cluster You can scale your cluster by adding additional individual Machines, or by adding a MachineSet or MachineDeployment diff --git a/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go b/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go index 3511982c82c4..810b04f89bdb 100644 --- a/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go +++ b/cmd/clusterctl/clusterdeployer/clusterclient/clusterclient.go @@ -754,43 +754,53 @@ func (c *client) WaitForResourceStatuses() error { klog.V(2).Info("Waiting for Cluster API resources to have statuses...") clusters, err := c.clientSet.ClusterV1alpha1().Clusters("").List(metav1.ListOptions{}) if err != nil { + klog.V(10).Infof("retrying: failed to list clusters: %v", err) return false, nil } for _, cluster := range clusters.Items { if reflect.DeepEqual(clusterv1.ClusterStatus{}, cluster.Status) { + klog.V(10).Info("retrying: cluster status is empty") return false, nil } if cluster.Status.ProviderStatus == nil { + klog.V(10).Info("retrying: cluster.Status.ProviderStatus is not set") return false, nil } } machineDeployments, err := c.clientSet.ClusterV1alpha1().MachineDeployments("").List(metav1.ListOptions{}) if err != nil { + klog.V(10).Infof("retrying: failed to list machine deployment: %v", err) return false, nil } for _, md := range machineDeployments.Items { if reflect.DeepEqual(clusterv1.MachineDeploymentStatus{}, md.Status) { + klog.V(10).Info("retrying: machine deployment status is empty") return false, nil } } machineSets, err := c.clientSet.ClusterV1alpha1().MachineSets("").List(metav1.ListOptions{}) if err != nil { + klog.V(10).Infof("retrying: failed to list machinesets: %v", err) return false, nil } for _, ms := range machineSets.Items { if reflect.DeepEqual(clusterv1.MachineSetStatus{}, ms.Status) { + klog.V(10).Info("retrying: machineset status is empty") return false, nil } } machines, err := c.clientSet.ClusterV1alpha1().Machines("").List(metav1.ListOptions{}) if err != nil { + klog.V(10).Infof("retrying: failed to list machines: %v", err) return false, nil } for _, m := range machines.Items { if reflect.DeepEqual(clusterv1.MachineStatus{}, m.Status) { + klog.V(10).Info("retrying: machine status is empty") return false, nil } if m.Status.ProviderStatus == nil { + klog.V(10).Info("retrying: machine.Status.ProviderStatus is not set") return false, nil } } diff --git a/cmd/clusterctl/clusterdeployer/clusterdeployer.go b/cmd/clusterctl/clusterdeployer/clusterdeployer.go index f3263b508c7d..499c33c71113 100644 --- a/cmd/clusterctl/clusterdeployer/clusterdeployer.go +++ b/cmd/clusterctl/clusterdeployer/clusterdeployer.go @@ -89,12 +89,12 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster cluster.Namespace = bootstrapClient.GetContextNamespace() } - klog.Infof("Creating control plane %v in namespace %q", controlPlaneMachines[0].Name, cluster.Namespace) + klog.Infof("Creating control plane machine in namespace %q", cluster.Namespace) if err := phases.ApplyMachines(bootstrapClient, cluster.Namespace, []*clusterv1.Machine{controlPlaneMachines[0]}); err != nil { return errors.Wrap(err, "unable to create control plane machine") } - klog.Infof("Updating bootstrap cluster object for cluster %v in namespace %q with control plane endpoint running on %s", cluster.Name, cluster.Namespace, controlPlaneMachines[0].Name) + klog.Infof("Updating bootstrap cluster object for cluster %v in namespace %q with control plane endpoint running on machine", cluster.Name, cluster.Namespace) if err := d.updateClusterEndpoint(bootstrapClient, provider, cluster.Name, cluster.Namespace); err != nil { return errors.Wrap(err, "unable to update bootstrap cluster endpoint") } @@ -130,7 +130,7 @@ func (d *ClusterDeployer) Create(cluster *clusterv1.Cluster, machines []*cluster // For some reason, endpoint doesn't get updated in bootstrap cluster sometimes. So we // update the target cluster endpoint as well to be sure. - klog.Infof("Updating target cluster object with control plane endpoint running on %s", controlPlaneMachines[0].Name) + klog.Info("Updating target cluster object with control plane endpoint running on machine") if err := d.updateClusterEndpoint(targetClient, provider, cluster.Name, cluster.Namespace); err != nil { return errors.Wrap(err, "unable to update target cluster endpoint") } diff --git a/cmd/clusterctl/phases/pivot.go b/cmd/clusterctl/phases/pivot.go index 5ed4105760e8..d83ee6bd42a0 100644 --- a/cmd/clusterctl/phases/pivot.go +++ b/cmd/clusterctl/phases/pivot.go @@ -369,11 +369,18 @@ func moveMachineSet(from sourceClient, to targetClient, ms *clusterv1.MachineSet func moveMachines(from sourceClient, to targetClient, machines []*clusterv1.Machine) error { machineNames := make([]string, 0, len(machines)) for _, m := range machines { + if m.DeletionTimestamp != nil { + klog.V(4).Infof("Skipping to move deleted machine: %q", m.Name) + continue + } machineNames = append(machineNames, m.Name) } klog.V(4).Infof("Preparing to move Machines: %v", machineNames) for _, m := range machines { + if m.DeletionTimestamp != nil { + continue + } if err := moveMachine(from, to, m); err != nil { return errors.Wrapf(err, "failed to move Machine %s:%s", m.Namespace, m.Name) } diff --git a/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden index 4e89d69d1b59..ee7a56a873dd 100644 --- a/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden @@ -27,7 +27,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/create-cluster-no-args.golden b/cmd/clusterctl/testdata/create-cluster-no-args.golden index c3b2f2d266bd..c6b350a274f1 100644 --- a/cmd/clusterctl/testdata/create-cluster-no-args.golden +++ b/cmd/clusterctl/testdata/create-cluster-no-args.golden @@ -27,7 +27,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/create-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/create-no-args-invalid-flag.golden index b6ca97cd1b0d..626fd1196c60 100644 --- a/cmd/clusterctl/testdata/create-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/create-no-args-invalid-flag.golden @@ -19,7 +19,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/create-no-args.golden b/cmd/clusterctl/testdata/create-no-args.golden index 5369b32f3122..ad5118511257 100644 --- a/cmd/clusterctl/testdata/create-no-args.golden +++ b/cmd/clusterctl/testdata/create-no-args.golden @@ -20,7 +20,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden index 4c2c40b13d9a..153050588b96 100644 --- a/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/delete-cluster-no-args-invalid-flag.golden @@ -24,7 +24,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/delete-cluster-no-args.golden b/cmd/clusterctl/testdata/delete-cluster-no-args.golden index 82e0add99b9f..91edb26dc316 100644 --- a/cmd/clusterctl/testdata/delete-cluster-no-args.golden +++ b/cmd/clusterctl/testdata/delete-cluster-no-args.golden @@ -26,7 +26,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/delete-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/delete-no-args-invalid-flag.golden index 54ed0e0ebcc8..9344b377cda6 100644 --- a/cmd/clusterctl/testdata/delete-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/delete-no-args-invalid-flag.golden @@ -19,7 +19,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/delete-no-args.golden b/cmd/clusterctl/testdata/delete-no-args.golden index 86cc1d355e84..f914826e224d 100644 --- a/cmd/clusterctl/testdata/delete-no-args.golden +++ b/cmd/clusterctl/testdata/delete-no-args.golden @@ -20,7 +20,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/no-args-invalid-flag.golden b/cmd/clusterctl/testdata/no-args-invalid-flag.golden index cbe4f8e4efd6..cd0b38b4c85b 100644 --- a/cmd/clusterctl/testdata/no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/no-args-invalid-flag.golden @@ -22,7 +22,7 @@ Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/no-args.golden b/cmd/clusterctl/testdata/no-args.golden index 005a7c359f89..812f19afdbc0 100644 --- a/cmd/clusterctl/testdata/no-args.golden +++ b/cmd/clusterctl/testdata/no-args.golden @@ -23,7 +23,7 @@ Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/validate-cluster-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/validate-cluster-no-args-invalid-flag.golden index 9ca44dee7cab..7dc93adbab7c 100644 --- a/cmd/clusterctl/testdata/validate-cluster-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/validate-cluster-no-args-invalid-flag.golden @@ -19,7 +19,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/validate-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/validate-no-args-invalid-flag.golden index 943573942336..b0dd25c4f154 100644 --- a/cmd/clusterctl/testdata/validate-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/validate-no-args-invalid-flag.golden @@ -19,7 +19,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/cmd/clusterctl/testdata/validate-no-args.golden b/cmd/clusterctl/testdata/validate-no-args.golden index e88396b0321c..b053749dcad4 100644 --- a/cmd/clusterctl/testdata/validate-no-args.golden +++ b/cmd/clusterctl/testdata/validate-no-args.golden @@ -20,7 +20,7 @@ Global Flags: --logtostderr log to standard error instead of files (default true) --master string The address of the Kubernetes API server. Overrides any value in kubeconfig. Only required if out-of-cluster. --skip-headers If true, avoid header prefixes in the log messages - --skip-log-headers If true, avoid headers when openning log files + --skip-log-headers If true, avoid headers when opening log files --stderrthreshold severity logs at or above this threshold go to stderr (default 2) -v, --v Level number for the log level verbosity --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging diff --git a/config/crds/cluster_v1alpha1_cluster.yaml b/config/crds/cluster_v1alpha1_cluster.yaml index 28df23947919..5a346c63a6d8 100644 --- a/config/crds/cluster_v1alpha1_cluster.yaml +++ b/config/crds/cluster_v1alpha1_cluster.yaml @@ -10,6 +10,8 @@ spec: names: kind: Cluster plural: clusters + shortNames: + - cl scope: Namespaced subresources: status: {} diff --git a/config/crds/cluster_v1alpha1_machine.yaml b/config/crds/cluster_v1alpha1_machine.yaml index ecc0f00fac60..61fd671cb028 100644 --- a/config/crds/cluster_v1alpha1_machine.yaml +++ b/config/crds/cluster_v1alpha1_machine.yaml @@ -24,6 +24,8 @@ spec: names: kind: Machine plural: machines + shortNames: + - ma scope: Namespaced subresources: status: {} diff --git a/config/crds/cluster_v1alpha1_machineclass.yaml b/config/crds/cluster_v1alpha1_machineclass.yaml index 149b5ab36aa1..33a9281d4b99 100644 --- a/config/crds/cluster_v1alpha1_machineclass.yaml +++ b/config/crds/cluster_v1alpha1_machineclass.yaml @@ -10,6 +10,8 @@ spec: names: kind: MachineClass plural: machineclasses + shortNames: + - mc scope: Namespaced validation: openAPIV3Schema: diff --git a/config/crds/cluster_v1alpha1_machinedeployment.yaml b/config/crds/cluster_v1alpha1_machinedeployment.yaml index 85322534479f..4a1b0854dd86 100644 --- a/config/crds/cluster_v1alpha1_machinedeployment.yaml +++ b/config/crds/cluster_v1alpha1_machinedeployment.yaml @@ -10,6 +10,8 @@ spec: names: kind: MachineDeployment plural: machinedeployments + shortNames: + - md scope: Namespaced subresources: scale: diff --git a/config/crds/cluster_v1alpha1_machineset.yaml b/config/crds/cluster_v1alpha1_machineset.yaml index 73fda8c33586..29b5e8d91a04 100644 --- a/config/crds/cluster_v1alpha1_machineset.yaml +++ b/config/crds/cluster_v1alpha1_machineset.yaml @@ -10,6 +10,8 @@ spec: names: kind: MachineSet plural: machinesets + shortNames: + - ms scope: Namespaced subresources: scale: diff --git a/config/rbac/rbac_role.yaml b/config/rbac/rbac_role.yaml index 90cbd805e01b..2c69c905a849 100644 --- a/config/rbac/rbac_role.yaml +++ b/config/rbac/rbac_role.yaml @@ -16,15 +16,6 @@ rules: - update - patch - delete -- apiGroups: - - "" - resources: - - events - verbs: - - get - - list - - watch - - create - apiGroups: - cluster.k8s.io resources: @@ -100,3 +91,12 @@ rules: - update - patch - delete +- apiGroups: + - "" + resources: + - events + verbs: + - get + - list + - watch + - create diff --git a/docs/book/README.md b/docs/book/README.md index 3e09655e3ae7..15a44e267bc0 100644 --- a/docs/book/README.md +++ b/docs/book/README.md @@ -53,7 +53,7 @@ Including the ability to: - Create reproducible Kubernetes clusters. - Create hybrid cloud environments which optimize for cost, performance, and -reliability. +reliability. ## Resources diff --git a/docs/book/RELEASE b/docs/book/RELEASE index 873f593e5e31..8f1fc4a0acc2 100644 --- a/docs/book/RELEASE +++ b/docs/book/RELEASE @@ -1,11 +1,37 @@ -To push the docs you must be an admin until we have proper CI around this. - +# Overview + +The Cluster API documentation is currently written in [Markdown][markdown] +and rendered into static HTML/CSS/JavaScript using [GitBook][gitbook] and various +[plugins][plugins]. It is automatically built using a [script](../../hack/build-gitbook.sh) +and continuously deployed using a shared Netlify account. + +# Making changes + +The GitBook source is located in [./docs/book](../../docs/book) and the static +content is generated into [./docs/book/_book](../../docs/book/_book) but not +checked into version control. Netlify will automatically rebuild the +documentation on each merge to master. + +## Testing locally + ``` -cd docs/book/ -gitbook install -gitbook build -cd ../../ -git add docs/book/_book -git commit -git subtree push --prefix docs/book/_book origin gh-pages +hack/build-gitbook.sh ``` + +## Verify the contents of the GitBook are correct by viewing the pages which +should include new or changed content and: + +0) Ensuring the expected changes are there. +1) They are rendered as expected. + +``` +cd docs/book +gitbook serve +# open localhost:4000 in a web browser +``` + +## Finally submit a PR + +[markdown]: https://toolchain.gitbook.com/syntax/markdown.html +[gitbook]: https://toolchain.gitbook.com/ +[plugins]: https://toolchain.gitbook.com/plugins/ diff --git a/docs/book/SUMMARY.md b/docs/book/SUMMARY.md index 30ada6bdf0c8..d0cd5238e3a2 100644 --- a/docs/book/SUMMARY.md +++ b/docs/book/SUMMARY.md @@ -26,7 +26,3 @@ * [Register Controllers](provider_implementations/register_controllers.md) * [Building, Running, and Testing](provider_implementations/building_running_and_testing.md) -## Appendices - -* [Cluster API KEP](appendices/keps/0003-cluster-api.md) - diff --git a/docs/book/book.json b/docs/book/book.json index 80ca328923b9..bcf86e71409d 100644 --- a/docs/book/book.json +++ b/docs/book/book.json @@ -1,6 +1,6 @@ { "plugins": ["theme-api", "panel", "sequence-diagrams", "ga", "codegroup", - "mermaid", "include-codeblock"], + "include-codeblock"], "pluginsConfig": { "theme-api": { "split": true diff --git a/docs/book/common_code/architecture.md b/docs/book/common_code/architecture.md index cc88459c1716..658ad54d2370 100644 --- a/docs/book/common_code/architecture.md +++ b/docs/book/common_code/architecture.md @@ -4,8 +4,8 @@ It may be useful to read at least the following chapters of the Kubebuilder book in order to better understand this section. -- [What is a Resource](https://github.com/kubernetes-sigs/kubebuilder/blob/master/docs/book/basics/what_is_a_resource.md) -- [What is a Controller](https://github.com/kubernetes-sigs/kubebuilder/blob/master/docs/book/basics/what_is_a_controller.md) +- [What is a Resource](https://book.kubebuilder.io/basics/what_is_a_resource.html) +- [What is a Controller](https://book.kubebuilder.io/basics/what_is_a_controller.html) {% endpanel %} {% panel style="warning", title="Architecture Diagram" %} diff --git a/docs/book/common_code/architecture.svg b/docs/book/common_code/architecture.svg index 04ee410d97bc..5cb18bd68224 100644 --- a/docs/book/common_code/architecture.svg +++ b/docs/book/common_code/architecture.svg @@ -1 +1,25 @@ -KubernetesClusterBKubernetesClusterABootstrappingCLI,WebPortal,etc.AutoscalingUpgradetriggercluster.yamlmachines.yamlBootstrappingMachineCRDsControlPlaneMachinesWorkerMachinesManageClustersandMachineskubeadmkubeadmControlPlaneMachinesWorkerMachinesControllerManagerMachineControllerProviderConfigProviderMachineActuatorProvisionsBootstrappingMachineStatusUpdatesCreates,Upgrades,DeletesCluster/MachinesBareMetalInfrastructureProvidersProviderconfigMachineCRsOptionalPivotCRDsCRskubeadmkubeadm \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/book/npm-shrinkwrap.json b/docs/book/npm-shrinkwrap.json new file mode 100644 index 000000000000..77981dc1d6e5 --- /dev/null +++ b/docs/book/npm-shrinkwrap.json @@ -0,0 +1,1034 @@ +{ + "name": "book", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, + "requires": { + "acorn": "^2.1.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha1-jSR136tVO7M+d7VOWeiAu4ziMTY=", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha1-8OAD2cqef1nHpQiUXXsu+aBKVC8=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", + "integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==", + "requires": { + "hoek": "6.x.x" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" + }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha1-LR0kMXr7ir6V1tLAsHtXgTU52Cg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", + "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", + "requires": { + "boom": "7.x.x" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", + "integrity": "sha1-wIdtnQSAkn19SSDc1yrzWVZJVU0=" + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha1-jNUuijrP1o067TjuCmQBd9L515c=" + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.2.1.tgz", + "integrity": "sha1-V4VY7yO++sBDoauw2wdjVQk5NHk=" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=" + }, + "es6-promise": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==" + }, + "escodegen": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha1-snqTiUgdW/1b7Hb3ux6z+PRVZYk=", + "optional": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "optional": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "optional": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "optional": true + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo=" + }, + "extract-zip": { + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", + "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.1", + "yauzl": "2.4.1" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "optional": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "requires": { + "pend": "~1.2.0" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha1-3M5SwF9kTymManq5Nr1yTO/786Y=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "gitbook-plugin-ga": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-ga/-/gitbook-plugin-ga-1.0.1.tgz", + "integrity": "sha1-yF17jAFkDEuz3DsjGrn+dKpuUhs=" + }, + "gitbook-plugin-panel": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-panel/-/gitbook-plugin-panel-0.0.1.tgz", + "integrity": "sha1-y2hnL+milXMblt7nS0nK6TtCbZs=" + }, + "gitbook-plugin-search": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/gitbook-plugin-search/-/gitbook-plugin-search-2.2.1.tgz", + "integrity": "sha1-bSW1p3aZD6mP39+jfeMx944PaxM=" + }, + "gitbook-plugin-sequence-diagrams": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gitbook-plugin-sequence-diagrams/-/gitbook-plugin-sequence-diagrams-1.1.0.tgz", + "integrity": "sha1-heZolyEgwYpiXwfugloSWjrevfo=", + "requires": { + "phantom": "^2.0.0", + "q": "^1.4.1" + } + }, + "gitbook-plugin-theme-api": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gitbook-plugin-theme-api/-/gitbook-plugin-theme-api-1.1.2.tgz", + "integrity": "sha1-jBRaS61JoSE8AlApC5vZtyrqiPw=", + "requires": { + "cheerio": "0.20.0", + "gitbook-plugin-search": ">=2.0.0", + "lodash": "4.12.0", + "q": "1.4.1", + "q-plus": "0.0.8" + }, + "dependencies": { + "lodash": { + "version": "4.12.0", + "resolved": "http://registry.npmjs.org/lodash/-/lodash-4.12.0.tgz", + "integrity": "sha1-K9bcRqBA9Z5obJcu0h2T3FkFMlg=" + } + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha1-RGV/VoiiLP1LckhugbOj+xF0LCk=", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "requires": { + "is-stream": "^1.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "hoek": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz", + "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=" + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "linerstream": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/linerstream/-/linerstream-0.1.4.tgz", + "integrity": "sha1-Xee/afqisPnYXoMyCZtw5BmoRdU=" + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha1-C2oM5v2+lXbiXx8tL96IMNwK0Ng=" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha1-KJlaoey3cHQv5q5+WPkYHHRLP5Y=", + "requires": { + "mime-db": "~1.37.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha1-sr0pXDfj3VijvwcAN2Zjuk2c8Fw=", + "requires": { + "boolbase": "~1.0.0" + } + }, + "nwmatcher": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz", + "integrity": "sha1-IoVjHzSpXw0Dlc2QDJbtObWPNG4=", + "optional": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU=" + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phantom": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/phantom/-/phantom-2.1.21.tgz", + "integrity": "sha1-drd5D/Ys8J++kiroRLn7dFzouyg=", + "requires": { + "linerstream": "^0.1.4", + "phantomjs-prebuilt": "^2.1.4", + "winston": "^2.2.0" + } + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "requires": { + "es6-promise": "^4.0.3", + "extract-zip": "^1.6.5", + "fs-extra": "^1.0.0", + "hasha": "^2.2.0", + "kew": "^0.7.0", + "progress": "^1.1.8", + "request": "^2.81.0", + "request-progress": "^2.0.1", + "which": "^1.2.10" + } + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=" + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha1-YPWA02AXC7cip5fMcEQR5tqFDGc=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "q-plus": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/q-plus/-/q-plus-0.0.8.tgz", + "integrity": "sha1-TMZssZvRRbQ+nhtUAjYUI3e2Hqs=", + "requires": { + "q": "^1.1.2" + } + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY=" + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha1-nC/KT301tZLv5Xx/ClXoEFIST+8=", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "requires": { + "throttleit": "^1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=", + "optional": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", + "optional": true + }, + "sshpk": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", + "integrity": "sha1-t5oImnMuNGxuBxSDDzYoXNOBkaI=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "optional": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha1-U/Nto/R3g7CSWvoG/587FlKA94E=", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "optional": true + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "winston": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", + "integrity": "sha1-oB5NHQoQPPTq2m/B+IazEQ1xw0s=", + "requires": { + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "stack-trace": "0.0.x" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "optional": true + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "optional": true + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "requires": { + "fd-slicer": "~1.0.1" + } + } + } +} diff --git a/docs/book/package.json b/docs/book/package.json new file mode 100644 index 000000000000..4928ca3569e0 --- /dev/null +++ b/docs/book/package.json @@ -0,0 +1,32 @@ +{ + "name": "book", + "private": true, + "version": "1.0.0", + "description": "**Note:** Impatient readers head straight to [Quick Start](quick_start.md).", + "main": "index.js", + "dependencies": { + "cryptiles": "^4.1.2", + "gitbook-plugin-ga": "^1.0.1", + "gitbook-plugin-panel": "^0.0.1", + "gitbook-plugin-sequence-diagrams": "^1.1.0", + "gitbook-plugin-theme-api": "^1.1.2", + "phantomjs-prebuilt": "^2.1.16" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "sig-cluster-lifecycle", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "git+https://github.com/kubernetes-sigs/cluster-api.git" + }, + "keywords": [ + "cluster-api" + ], + "bugs": { + "url": "https://github.com/kubernetes-sigs/cluster-api/issues" + }, + "homepage": "https://kubernetes-sigs-cluster-api.netlify.com" +} diff --git a/docs/book/provider_implementations/create_actuators.md b/docs/book/provider_implementations/create_actuators.md index 196af87ce3c7..f2ee2babd935 100644 --- a/docs/book/provider_implementations/create_actuators.md +++ b/docs/book/provider_implementations/create_actuators.md @@ -36,7 +36,7 @@ import ( ) // Add RBAC rules to access cluster-api resources -//+kubebuilder:rbac:groups=cluster.k8s.io,resources=clusters;clusters/status,verbs=get;list;watch +//+kubebuilder:rbac:groups=cluster.k8s.io,resources=clusters;clusters/status,verbs=get;list;watch;update;patch // Actuator is responsible for performing cluster reconciliation type Actuator struct { @@ -106,7 +106,8 @@ const ( ) // Add RBAC rules to access cluster-api resources -//+kubebuilder:rbac:groups=cluster.k8s.io,resources=machines;machines/status;machinedeployments;machinedeployments/status;machinesets;machinesets/status;machineclasses,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=cluster.k8s.io,resources=machines;machines/status,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=cluster.k8s.io,resources=machineClasses,verbs=get;list;watch //+kubebuilder:rbac:groups=cluster.k8s.io,resources=clusters;clusters/status,verbs=get;list;watch //+kubebuilder:rbac:groups="",resources=nodes;events,verbs=get;list;watch;create;update;patch;delete diff --git a/docs/book/provider_implementations/register_controllers.md b/docs/book/provider_implementations/register_controllers.md index b72032423c34..aba469542dc7 100644 --- a/docs/book/provider_implementations/register_controllers.md +++ b/docs/book/provider_implementations/register_controllers.md @@ -28,7 +28,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" ) -//+kubebuilder:rbac:groups=solas.k8s.io,resources=solasclusterproviderspecs;solasclusterproviderstatuses,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=solas.cluster.k8s.io,resources=solasclusterproviderspecs;solasclusterproviderstatuses,verbs=get;list;watch;create;update;patch;delete func init() { // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. AddToManagerFuncs = append(AddToManagerFuncs, func(m manager.Manager) error { @@ -68,7 +68,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/manager" ) -//+kubebuilder:rbac:groups=solas.k8s.io,resources=solasmachineproviderspecs;solasmachineproviderstatuses,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=solas.cluster.k8s.io,resources=solasmachineproviderspecs;solasmachineproviderstatuses,verbs=get;list;watch;create;update;patch;delete func init() { // AddToManagerFuncs is a list of functions to create controllers and add them to a manager. AddToManagerFuncs = append(AddToManagerFuncs, func(m manager.Manager) error { diff --git a/docs/developer/releasing.md b/docs/developer/releasing.md index 979d82f76b4d..d6c2bee64a84 100644 --- a/docs/developer/releasing.md +++ b/docs/developer/releasing.md @@ -16,18 +16,25 @@ ## Process -1. Create a pull request that contains two changes: +For version 0.x.y: + +1. We will target a branch called `release-0.x`. If this is `0.x.0` then we'll + create a branch from master using `git push origin master:release-0.x`, otherwise + simply checkout the existing branch `git checkout release-0.x` +2. Make two changes: 1. Change [the cluster api controller manager image tag][managerimg] from `:latest` to whatever version is being released - 2. Change the `CONTROLLER_IMAGE` variable in the [Makefile][makefile] to the + 2. Change the `CONTROLLER_IMG` variable in the [Makefile][makefile] to the version being released -2. Get the pull request merged -3. From the commit in step 1 (that is now in the master branch), build and push - the container image with `make docker-push` -4. Create a tag from this same commit and push the tag to the github repository -5. Revert the commit made in step 1 -6. Open a pull request with the revert change -7. Get that pull request merged + (Note that we do not release the example-provider image, so we don't tag that) +3. Commit it using `git commit -m "Release 0.x.y"` +4. Submit a PR to the `release-0.x` branch, e.g. `git push $USER; hub pull-request -b release-0.x` +5. Get the pull request merged +6. Switch to the release branch and update to pick up the commit. (e.g. `git + checkout release 0.x && git pull`). From there build and push the container + images and fat manifest with `make all-push` (on the 0.1 release branch, we + do `make docker-push`) +7. Create a tag from this same commit `git tag 0.x.y` and push the tag to the github repository `git push origin 0.x.y` 8. Create a release in github based on the tag created above 9. Manually create the release notes by going through the merged PRs since the last release diff --git a/docs/proposals/machine-api-proposal.md b/docs/proposals/20181121-machine-api.md similarity index 100% rename from docs/proposals/machine-api-proposal.md rename to docs/proposals/20181121-machine-api.md diff --git a/docs/proposals/YYYYMMDD-template.md b/docs/proposals/YYYYMMDD-template.md new file mode 100644 index 000000000000..5bc6a579b4ea --- /dev/null +++ b/docs/proposals/YYYYMMDD-template.md @@ -0,0 +1,240 @@ +--- +title: proposal Template +authors: + - "@janedoe" +reviewers: + - "@janedoe" +creation-date: yyyy-mm-dd +last-updated: yyyy-mm-dd +status: provisional|implementable|implemented|deferred|rejected|withdrawn|replaced +see-also: + - "/docs/proposals/20190101-we-heard-you-like-proposals.md" + - "/docs/proposals/20190102-everyone-gets-a-proposal.md" +replaces: + - "/docs/proposals/20181231-replaced-proposal.md" +superseded-by: + - "/docs/proposals/20190104-superceding-proposal.md" +--- + +# Title + +This is the title of the proposal. +Keep it simple and descriptive. +A good title can help communicate what the proposal is and should be considered as part of any review. + +The title should be lowercased and spaces/punctuation should be replaced with `-`. + +To get started with this template: +1. **Make a copy of this template.** + Copy this template into `docs/enhacements` and name it `YYYYMMDD-my-title.md`, where `YYYYMMDD` is the date the proposal was first drafted. +1. **Fill out the "overview" sections.** + This includes the Summary and Motivation sections. +1. **Create a PR.** +1. **Merge early.** + Avoid getting hung up on specific details and instead aim to get the goal of the proposal merged quickly. + The best way to do this is to just start with the "Overview" sections and fill out details incrementally in follow on PRs. + View anything marked as a `provisional` as a working document and subject to change. + Aim for single topic PRs to keep discussions focused. + If you disagree with what is already in a document, open a new PR with suggested changes. + +The canonical place for the latest set of instructions (and the likely source of this file) is [here](/proposals/YYYYMMDD-proposal-template.md). + +The `Metadata` section above is intended to support the creation of tooling around the proposal process. +This will be a YAML section that is fenced as a code block. +See the proposal process for details on each of these items. + +## Table of Contents + +A table of contents is helpful for quickly jumping to sections of a proposal and for highlighting any additional information provided beyond the standard proposal template. +[Tools for generating][] a table of contents from markdown are available. + +- [Title](#title) + - [Table of Contents](#table-of-contents) + - [Summary](#summary) + - [Motivation](#motivation) + - [Goals](#goals) + - [Non-Goals](#non-goals) + - [Proposal](#proposal) + - [User Stories [optional]](#user-stories-optional) + - [Story 1](#story-1) + - [Story 2](#story-2) + - [Implementation Details/Notes/Constraints [optional]](#implementation-detailsnotesconstraints-optional) + - [Risks and Mitigations](#risks-and-mitigations) + - [Design Details](#design-details) + - [Test Plan](#test-plan) + - [Graduation Criteria](#graduation-criteria) + - [Examples](#examples) + - [Alpha -> Beta Graduation](#alpha---beta-graduation) + - [Beta -> GA Graduation](#beta---ga-graduation) + - [Removing a deprecated flag](#removing-a-deprecated-flag) + - [Upgrade / Downgrade Strategy](#upgrade--downgrade-strategy) + - [Version Skew Strategy](#version-skew-strategy) + - [Implementation History](#implementation-history) + - [Drawbacks [optional]](#drawbacks-optional) + - [Alternatives [optional]](#alternatives-optional) + - [Infrastructure Needed [optional]](#infrastructure-needed-optional) + +[Tools for generating]: https://github.com/ekalinin/github-markdown-toc + +## Summary + +The `Summary` section is incredibly important for producing high quality user-focused documentation such as release notes or a development roadmap. +It should be possible to collect this information before implementation begins in order to avoid requiring implementors to split their attention between writing release notes and implementing the feature itself. + +A good summary is probably at least a paragraph in length. + +## Motivation + +This section is for explicitly listing the motivation, goals and non-goals of this proposal. +Describe why the change is important and the benefits to users. +The motivation section can optionally provide links to [experience reports][] to demonstrate the interest in a proposal within the wider Kubernetes community. + +[experience reports]: https://github.com/golang/go/wiki/ExperienceReports + +### Goals + +List the specific goals of the proposal. +How will we know that this has succeeded? + +### Non-Goals + +What is out of scope for this proposal? +Listing non-goals helps to focus discussion and make progress. + +## Proposal + +This is where we get down to the nitty gritty of what the proposal actually is. + +### User Stories [optional] + +Detail the things that people will be able to do if this proposal is implemented. +Include as much detail as possible so that people can understand the "how" of the system. +The goal here is to make this feel real for users without getting bogged down. + +#### Story 1 + +#### Story 2 + +### Implementation Details/Notes/Constraints [optional] + +What are the caveats to the implementation? +What are some important details that didn't come across above. +Go in to as much detail as necessary here. +This might be a good place to talk about core concepts and how they releate. + +### Risks and Mitigations + +What are the risks of this proposal and how do we mitigate. +Think broadly. +For example, consider both security and how this will impact the larger kubernetes ecosystem. + +How will security be reviewed and by whom? +How will UX be reviewed and by whom? + +Consider including folks that also work outside the SIG or subproject. + +## Design Details + +### Test Plan + +**Note:** *Section not required until targeted at a release.* + +Consider the following in developing a test plan for this enhancement: +- Will there be e2e and integration tests, in addition to unit tests? +- How will it be tested in isolation vs with other components? + +No need to outline all of the test cases, just the general strategy. +Anything that would count as tricky in the implementation and anything particularly challenging to test should be called out. + +All code is expected to have adequate tests (eventually with coverage expectations). +Please adhere to the [Kubernetes testing guidelines][testing-guidelines] when drafting this test plan. + +[testing-guidelines]: https://git.k8s.io/community/contributors/devel/sig-testing/testing.md + +### Graduation Criteria + +**Note:** *Section not required until targeted at a release.* + +Define graduation milestones. + +These may be defined in terms of API maturity, or as something else. Initial proposal should keep +this high-level with a focus on what signals will be looked at to determine graduation. + +Consider the following in developing the graduation criteria for this enhancement: +- [Maturity levels (`alpha`, `beta`, `stable`)][maturity-levels] +- [Deprecation policy][deprecation-policy] + +Clearly define what graduation means by either linking to the [API doc definition](https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-versioning), +or by redefining what graduation means. + +In general, we try to use the same stages (alpha, beta, GA), regardless how the functionality is accessed. + +[maturity-levels]: https://git.k8s.io/community/contributors/devel/sig-architecture/api_changes.md#alpha-beta-and-stable-versions +[deprecation-policy]: https://kubernetes.io/docs/reference/using-api/deprecation-policy/ + +#### Examples + +These are generalized examples to consider, in addition to the aforementioned [maturity levels][maturity-levels]. + +##### Alpha -> Beta Graduation + +- Gather feedback from developers and surveys +- Complete features A, B, C +- Tests are in Testgrid and linked in proposal + +##### Beta -> GA Graduation + +- N examples of real world usage +- N installs +- More rigorous forms of testing e.g., downgrade tests and scalability tests +- Allowing time for feedback + +**Note:** Generally we also wait at least 2 releases between beta and GA/stable, since there's no opportunity for user feedback, or even bug reports, in back-to-back releases. + +##### Removing a deprecated flag + +- Announce deprecation and support policy of the existing flag +- Two versions passed since introducing the functionality which deprecates the flag (to address version skew) +- Address feedback on usage/changed behavior, provided on GitHub issues +- Deprecate the flag + +**For non-optional features moving to GA, the graduation criteria must include [conformance tests].** + +[conformance tests]: https://github.com/kubernetes/community/blob/master/contributors/devel/conformance-tests.md + +### Upgrade / Downgrade Strategy + +If applicable, how will the component be upgraded and downgraded? Make sure this is in the test plan. + +Consider the following in developing an upgrade/downgrade strategy for this enhancement: +- What changes (in invocations, configurations, API use, etc.) is an existing cluster required to make on upgrade in order to keep previous behavior? +- What changes (in invocations, configurations, API use, etc.) is an existing cluster required to make on upgrade in order to make use of the enhancement? + +### Version Skew Strategy + +If applicable, how will the component handle version skew with other components? What are the guarantees? Make sure +this is in the test plan. + +Consider the following in developing a version skew strategy for this enhancement: +- Does this enhancement involve coordinating behavior in the control plane and in the kubelet? How does an n-2 kubelet without this feature available behave when this feature is used? +- Will any other components on the node change? For example, changes to CSI, CRI or CNI may require updating that component before the kubelet. + +## Implementation History + +Major milestones in the life cycle of a proposal should be tracked in `Implementation History`. +Major milestones might include + +- the `Summary` and `Motivation` sections being merged signaling acceptance +- the `Proposal` section being merged signaling agreement on a proposed design +- the date implementation started +- the first Kubernetes release where an initial version of the proposal was available +- the version of Kubernetes where the proposal graduated to general availability +- when the proposal was retired or superseded + +## Drawbacks [optional] + +Why should this proposal _not_ be implemented. + +## Alternatives [optional] + +Similar to the `Drawbacks` section the `Alternatives` section is used to highlight and record other possible approaches to delivering the value proposed by a proposal. diff --git a/docs/scope-and-objectives.md b/docs/scope-and-objectives.md new file mode 100644 index 000000000000..adc7e6177efc --- /dev/null +++ b/docs/scope-and-objectives.md @@ -0,0 +1,145 @@ +--- +title: Cluster API Scope and Objectives +authors: + - "@vincepri" + - "@ncdc" + - "@detiber" +reviewers: + - "@timothysc" + - "@justinsb" +creation-date: 2019-04-08 +last-updated: 2019-04-08 +--- + +# Cluster API Scope and Objectives + +This is a living document that is refined over time. It serves as guard rails for what is in and out of scope for Cluster API. As new ideas or designs take shape over time, this document can and should be updated. + +## Table of Contents + +* [Statement and Objectives](#cluster-api-statement-and-objectives) + * [Metadata](#metadata) + * [Table of Contents](#table-of-contents) + * [Summary](#summary) + * [Glossary](#glossary) + * [Motivation](#motivation) + * [Goals](#goals) + * [Non\-goals](#non-goals) + * [Requirements](#requirements) + * [Workstreams](#workstreams) + +## Summary + +We are building a set of Kubernetes cluster management APIs to enable common cluster lifecycle operations (create, scale, upgrade, destroy) across infrastructure providers. + +#### What is Cluster API? + +- An API definition for managing Kubernetes Clusters declaratively. +- A reference implementation for the core logic. +- An API definition for cluster lifecycle management action extension points. + +## Glossary + +- __Cluster API__: Unless otherwise specified, this refers to the project as a whole. +- __Infrastructure provider__: Refers to the source of computational resources (e.g. machines, networking, etc.). Examples for cloud include AWS, Azure, Google, etc.; for bare metal include VMware, MAAS, etc. When there is more than one way to obtain resources from the same infrastructure provider (e.g. EC2 vs. EKS) each way is referred to as a variant. +- __Provider implementation__: Existing Cluster API implementations consist of generic and infrastructure provider-specific logic. The infrastructure provider-specific logic is currently maintained in infrastructure provider repositories. +- __Kubernetes-conformant__: A cluster that passes the Kubernetes conformance tests. +- __Scaling__: Unless otherwise specified, this refers to horizontal scaling. +- __Control plane__: + - __Self-provisioned__: A Kubernetes control plane consisting of pods or machines wholly managed by a single Cluster API deployment. + - __External__: A control plane offered and controlled by some system other than Cluster API (e.g., GKE, AKS, EKS, IKS). +- __Core Add-ons__: Addons that are required to deploy a Kubernetes-conformant cluster: DNS, kube-proxy, CNI. +- __Additional Add-ons__: Addons that are not required for a Kubernetes-conformant cluster (e.g. metrics/Heapster, Dashboard). +- __Management cluster__: The cluster where one or more Cluster API providers run, and where resources (e.g. Machines) are stored. +- __Workload cluster__: A cluster whose lifecycle is managed by the Management cluster. +- __Operating system__: A generically understood combination of a kernel and system-level userspace interface, such as Linux or Windows, as opposed to a particular distribution. +- __Manage a cluster__: Create, scale, upgrade, destroy. +- __Default implementation__: A feature implementation offered as part of Cluster API project, infrastructure providers can swap it out for a different one. + +## Motivation + +Kubernetes has a common set of APIs (see the [Kubernetes API Conventions](https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md)) to orchestrate containers regardless of deployment mechanism or cloud provider. Kubernetes also has APIs for handling some infrastructure, like load-balancers, ingress rules, or persistent volumes, but not for creating new machines. +As a result, existing popular deployment mechanisms that manage Kubernetes clusters each have unique APIs and implementations for how to handle lifecycle events like cluster creation or deletion, control plane upgrades, and node upgrades. + +### Goals + +- To manage the lifecycle (create, scale, upgrade, destroy) of Kubernetes-conformant clusters using a declarative API. +- To work in different environments, both on-premises and in the cloud. +- To define common operations, provide a default implementation, and provide the ability to swap out implementations for alternative ones. +- To reuse and integrate existing ecosystem components rather than duplicating their functionality (e.g. node-problem-detector, cluster autoscaler, SIG-Multi-cluster). +- To provide a transition path for Kubernetes lifecycle products to adopt Cluster API incrementally. Specifically, existing cluster lifecycle management tools should be able to adopt Cluster API in a staged manner, over the course of multiple releases, or even adopting a subset of Cluster API. + +### Non-goals + +- To add these APIs to Kubernetes core (kubernetes/kubernetes). + - This API should live in a namespace outside the core and follow the best practices defined by api-reviewers, but is not subject to core-api constraints. +- To manage the lifecycle of infrastructure unrelated to the running of Kubernetes-conformant clusters. +- To force all Kubernetes lifecycle products (kops, kubespray, GKE, AKS, EKS, IKS etc.) to support or use these APIs. +- To manage non-Cluster API provisioned Kubernetes-conformant clusters. +- To manage a single cluster spanning multiple infrastructure providers. +- To configure a machine at any time other than create or upgrade. +- To duplicate functionality that exists or is coming to other tooling, e.g., updating kubelet configuration (c.f. dynamic kubelet configuration), or updating apiserver, controller-manager, scheduler configuration (c.f. component-config effort) after the cluster is deployed. + +## Requirements + +#### Foundation + +- Cluster API MUST be able to be deployed and run on Kubernetes. + +- Cluster API MUST provide runtime and state isolation between providers within the same Management Cluster + +- Cluster API MUST support multiple infrastructure providers, including both on-prem and cloud providers. + +- Cluster API MUST be able to manage groups/sets of Kubernetes nodes that support scaling and orchestrated upgrades. + +- Cluster API, through a single installation, MUST be able to manage (create, scale, upgrade, destroy) clusters on multiple providers. + +- Cluster API SHOULD support all operating systems in scope for Kubernetes conformance. + +#### User Experience + +- Cluster API MUST be able to provide the versions of Kubernetes and related components of a Node that it manages. + +- Cluster API MUST be able to provide sufficient information for a consumer to directly use the API server of the provisioned workload cluster. + +#### Organization + +- Cluster API MUST NOT have code specific to a particular provider within the main repository, defined as sigs.k8s.io/cluster-api. + +#### Validation + +- Cluster API MUST enable infrastructure providers to validate configuration data. + +- Cluster API MUST test integrations that it claims will work. + +- Cluster API MUST deploy clusters that pass Kubernetes conformance tests. + +- Cluster API MUST document how to bootstrap itself and MAY provide tooling to do so. + +- Cluster API MUST document requirements for machine images and SHOULD reference default tools to prepare machine images. + +- Cluster API MUST have conformance tests to ensure that Cluster API and a given provider fulfill the expectations of users/automation. + +#### Extension + +- Cluster API SHOULD allow default implementations to be pluggable/extensible. + - Cluster API SHOULD offer default implementations for generic operations. + - Users MAY use different provider implementations for different sets of operations. + +- 🔌 Cluster API MUST be able to provide information as to which versions of Kubernetes it can install. + +- 🔌 Cluster API MUST be able to bootstrap a new Kubernetes control plane. + +- 🔌 Cluster API MUST provide a generic image lookup mechanism that can filter on characteristics such as kubernetes version, container runtime, kernel version, etc. + +- 🔌 Cluster API MUST be able to provide a consistent (across providers) way to prepare, configure, and join nodes to a cluster. + +- 🔌 Cluster API MUST be able to scale a self-provisioned control plane up from and down to one replica. + +- 🔌 Cluster API MUST provide high-level orchestration for Kubernetes upgrades (control plane and non-control plane). + +- 🔌 Cluster API MUST define and document configuration elements that it exclusively manages and take corrective actions if these elements are modified by external actors. + +- 🔌 Cluster API MUST provide the ability to receive the health status of a Kubernetes Node from an external source. + +- 🔌 Cluster API provider implementations SHOULD allow customization of machine, node, or operating system image. diff --git a/docs/staging-use-cases.md b/docs/staging-use-cases.md new file mode 100644 index 000000000000..577c58fbaaeb --- /dev/null +++ b/docs/staging-use-cases.md @@ -0,0 +1,229 @@ +--- +title: Cluster API Reference Use Cases +creation-date: 2019-04-16 +last-updated: 2019-04-16 +--- + + + +**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* + +- [Cluster API Reference Use Cases](#cluster-api-reference-use-cases) + - [Role Glossary](#role-glossary) + - [Icon Glossary](#icon-glossary) + - [Operator of Workload Cluster](#operator-of-workload-cluster) + - [Creating Clusters](#creating-clusters) + - [Staged Adoption of Cluster API By Operators](#staged-adoption-of-cluster-api-by-operators) + - [Deleting Clusters](#deleting-clusters) + - [Scaling](#scaling) + - [Configuration Updates](#configuration-updates) + - [Security](#security) + - [Upgrades](#upgrades) + - [Monitoring](#monitoring) + - [Adoption](#adoption) + - [Multitenancy Management](#multitenancy-management) + - [Disaster Recovery](#disaster-recovery) + - [Operator of Management Cluster](#operator-of-management-cluster) + - [Versioning and Upgrades](#versioning-and-upgrades) + - [Removing Cluster API](#removing-cluster-api) + - [Cross-cluster Metrics](#cross-cluster-metrics) + - [Specific Architecture Approaches](#specific-architecture-approaches) + - [Multitenancy Management](#multitenancy-management-1) + - [Multi-cluster/Multi-provider](#multi-clustermulti-provider) + - [Managing Providers](#managing-providers) + - [Creating Workload Clusters](#creating-workload-clusters) + - [Provider Implementors](#provider-implementors) + + + +# Cluster API Reference Use Cases + +This is a living document that serves as a reference and a staging area for use cases collected from the community during post-v1alpha1 project redesign. + +## Role Glossary +- __User__: consumer of a Kubernetes-conformant cluster created by the Cluster API. + - Does not use Cluster API. +- __Operator__: Administrator responsible for creating and managing a Kubernetes cluster deployed by Cluster API. + - Uses Cluster API. +- __Multi-cluster operator__: An operator responsible for multiple Kubernetes clusters deployed by Cluster API. + - Uses Cluster API. + - Cares about keeping config similar between many clusters. + + +## Icon Glossary +- 🔭 Out of Scope for Cluster API itself, but should be possible via higher level tool. + - These are use-cases that we should take care not to prevent. + +## Operator of Workload Cluster + +### Creating Clusters + +- As an operator, given that I have a cluster running Cluster API, I want to be able to use declarative APIs to manage another Kubernetes cluster (create, upgrade, scale, delete). + +- As an operator, given that I have a cluster running Cluster API, I want to be able to use declarative APIs to manage a vendor’s Kubernetes conformant cluster (create, upgrade, scale, delete). + +- As an operator, when I create a new cluster using Cluster API, I want Cluster API to automatically create and manage any supporting provider infrastructure needed for my new cluster to function. + +- As an operator, when I create a new cluster using Cluster API, I want to be able to use existing infrastructure (e.g. VPC’s, SecurityGroups, veth, GPUs). + +- 🔭 As an operator, when I create a new cluster using Cluster API, I want to be able to take advantage of resource aware topology (e.g. compute, device availability, etc.) to place machines. + +- As an operator, I need to have a way to make minor customizations before kubelet starts while using a standard node image and standard boot script. Example: write a file, disable hyperthreading, load a kernel module. + +- As an operator, I need to have a way to apply labels to Nodes created through ClusterAPI. This will allow me to partition workloads across Nodes/Machines and MachineDeployments. Examples of labels include datacenter, subnet, and hypervisor, which applications can use in affinity policies. + +- As an operator, I want to be able to provision the nodes of a workload cluster on an existing vnet that I don’t have admin control of. + +### Staged Adoption of Cluster API By Operators + +- As an operator, I would like to use some features of Cluster API without using all features of Cluster API. + +- As an operator, given that I have a management cluster and a pre-existing control plane, I would like to manage the lifecycle of a group of worker nodes without managing the control plane those nodes join. + +### Deleting Clusters + +- As an operator, when I delete a Cluster object, I want Cluster API to delete all the infrastructure it created for that cluster. + +- As an operator, when I delete a Machine object, I want Cluster API to gracefully shutdown (drain) that Node and delete all the infrastructure it created for that Machine. + +### Scaling + +- As an operator, given that I have deployed a cluster using Cluster API, I want to configure the cluster-autoscaler to drive scaling operations. + +- As an operator, given that I have a management cluster and a workload cluster, I want to retrieve, set, and change the number of worker Nodes or control plane Nodes in my workload cluster. + +- As an operator, given I have a management cluster and a workload cluster, I want to control the sizing, scaling, and optimizing of the workload cluster’s control plane in terms of Kubernetes primitives (e.g. HPA, VPA, resource limits, etc). I would like to import the best practices, sizing metrics and knowledge from e.g. the specialized SIG Scalability; the information should be expressed uniformly in Kubernetes terms. + +- As an operator, I expect the Cluster API to maintain the number and type of Nodes that I have currently requested as members of the cluster. + +### Configuration Updates + +- As an operator, given that I have a management cluster and a workload cluster, I want to update the IaaS credentials used to lifecycle manage my workload cluster because the correct credentials have changed. + +- As an operator, given I have a management cluster and a workload cluster, I want to apply configuration changes before kubelet starts. + +- As an operator, given that I have deployed a workload cluster via Cluster API, I want to change config in my workload cluster for which Cluster API is authoritative and have a Cluster API controller manage the deployment of that new configuration over the workload cluster. + +- As an operator, given that I have deployed a workload cluster via Cluster API and used Cluster API controller to manage the deployment of a new (broken) configuration, I want to revert to the previous working configuration. + +- As an operator, I want to declare the attributes (os, kernel, CRI) of the nodes I want my workload to run on. The CAPI provider/controller should select an appropriate image that satisfies my constraints/attributes. + - If the provider does not support the attributes I have specified or find an appropriate image it should fail with an appropriate error. + +### Security + +- As an operator, given I have a management cluster and a workload cluster, I want to know when my cluster’s/machines’ certificates will expire, so that I can plan to rotate them. + +- As an operator, given I have a management cluster and a workload cluster, I want to automatically, periodically repave all the nodes of my cluster to reduce the risk of unauthorized software running on my machines. + +- As an operator, I want an external CA to sign certificates for the workload cluster control plane. + +- 🔭As an operator, given I have a management cluster and a workload cluster, I want to rotate all the certificates and credentials my machines are using. + - Some certificates might get rotated as part of machine upgrade, but are otherwise the above is out of scope. + +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to rotate/change the CA used to sign certificates for my workload cluster. + +- 🔭 As an operator, I want an external CA to sign certificates for workload cluster kubelets. + +### Upgrades +- As an operator, given I have a management cluster and a workload cluster, I want to patch the OS running on all of my machines (e.g. for a CVE). + +- As an operator, given I have a management cluster and a workload cluster, I want to upgrade my workload cluster (control plane and nodes) to a new version of kubernetes. I want the workload cluster control plane to be available during the upgrade. + +- As an operator, given I have a management cluster and a workload cluster, I want to upgrade my workload cluster control plane to a new version of Kubernetes and also update my etcd version at the same time. I want to know in advance if the upgrade will require control plane downtime. + +- As an operator, given I have a management cluster and a workload cluster, I want to upgrade the version of CNI plugin and network daemon that my workload cluster is using. I want to know in advance if the upgrade could cause application downtime. + +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to upgrade my workload cluster to a new version of etcd without upgrading the Kubernetes control plane. I want to know in advance if the upgrade will require control plane downtime. + +### Monitoring +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to retrieve metrics about the underlying machines (e.g. CPU usage, memory) in the workload cluster. + +- 🔭 As an operator, given I have a management cluster, a workload cluster, and permission to open interactive shells on that workload cluster, I want to open an interactive shell on the machines in my workload cluster. + +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to monitor the cleanup of persistent disks/volumes used by my workload cluster. + +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to monitor the cleanup of created by my workload cluster. + +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to ensure the etcd database in my workload cluster is backed up. +Multitenancy Management +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to setup roles, role bindings, users, and usage quotas on my workload cluster. + +### Adoption +- 🔭 As an operator, given I have created a Kubernetes-conformant cluster without ClusterAPI, I want to use ClusterAPI to manage it. In order to do so, I need to know the requirements for adopting/importing this cluster in terms of required CRD’s and operators (e.g Machine and Cluster objects). + +### Multitenancy Management +- 🔭 As an operator, given I have a management cluster and a workload cluster, I want to setup roles, role bindings, users, and usage quotas on my workload cluster. + + +### Disaster Recovery +- 🔭As an operator, I want to be able to recover from the complete loss of all the control plane replicas of a workload cluster. This excludes etcd. + +- 🔭As an operator, I want to be able to recover the etcd cluster of a workload cluster from an irrecoverable failure. I will provide the etcd snapshot required by the recovery mechanism. + +## Operator of Management Cluster + +- As an operator, given I have a Kubernetes-conformant cluster, I would like to install Cluster API and a provider on it in a straight-forward process. + +- As an operator, given I have a management cluster that was deployed by Cluster API (via the pivot workflow), I want to manage the lifecycle of my management cluster using Cluster API. + +- As an operator, given I am following the instructions in the Cluster API (/provider) README, I expect the instructions to work and that I will end up with a working management cluster. + +### Versioning and Upgrades +- As an operator, when I choose a version of Cluster API and provider to use, I want to know what version(s) of Kubernetes and other software (CNI, docker, OS, etc) can be managed by a specific Cluster API and/or provider version. + +- As an operator of a management cluster, given that I have a cluster running Cluster API, I would like to upgrade the Cluster API and provider(s) without the users of Cluster API noticing (e.g. due to their API requests not working). + +- As an operator of a management cluster, I want to know what versions of kubelet, control plane, OS, etc, all of the associated workload clusters are running, so that I can plan upgrades to the management cluster that will not break anyone’s ability to manage their workload clusters. + +### Removing Cluster API +- As an operator of a management cluster, given that I have a management cluster that I have used to deploy several workload clusters, I want to remove the Cluster/Machine objects representing one workload cluster from my management cluster without deprovisioning workload cluster. + +- As an operator of a management cluster, given that I have a management cluster that I have used to deploy several workload clusters, I want to uninstall Cluster API from my management cluster without deprovisioning my workload clusters. + +- As an operator of a management cluster, given that I have a management cluster, I want to use it to manage workload clusters that were created by a different management cluster. + +### Cross-cluster Metrics +- As an operator of a management cluster, I want to query my resource allocation on an infrastructure. For example, in an on-prem case, I do not have an infinite capacity cloud, so I need to be able to determine my reservation before deploying a workload cluster. + +### Specific Architecture Approaches +- As an operator of a management cluster, given that I give operators of workload clusters access to my management cluster, they can launch new workload clusters with control planes that run in the management cluster while the nodes of those workload clusters run elsewhere. + +- As a multi-cluster operator, I would like to provide an EKS-like experience in which the workload control plane nodes are joined to the management cluster and the control plane config isn’t exposed to the consumer of the workload cluster. This enables me as an operator to manage the control plane nodes for all clusters using tooling like prometheus and fluentd. I can also control the configuration of the workload control plane in accordance with business policy. + +### Multitenancy Management +- As an operator of a management cluster, I want to control which users of management cluster can deploy new workload clusters, how many clusters they can deploy, and how many nodes/resources those clusters can use. + +- As an operator of a management cluster, I want to ensure that only the user who creates a new workload cluster (and some specific other users) can manage and access the workload cluster. + +- As an operator of a management cluster, I want the user who creates a new workload cluster to be able to give permission to other users to manage that cluster. + +- As an operator of a management cluster, I want to configure whether operators of workload clusters are allowed to open interactive shells onto those clusters machines. + +## Multi-cluster/Multi-provider + +### Managing Providers +- As an operator, given I have a management cluster with at least one provider, I would like to install a new provider. + +- As an operator, given I have a management cluster with at least one provider, I would like to remove one of those providers and orphan any clusters provisioned by that provider. + +- As a multi-cluster operator, given that I have a single management cluster and that I have installed multiple providers and that one of those providers is malicious, I want that provider not to see IaaS secrets provided to any of the other providers. + +- As an operator, if I have a management cluster running a particular Cluster API version and a particular set of providers, then I want to plan an upgrade of Cluster API and the providers so that I upgrade one at a time and always end up with a compatible set of versions. + +### Creating Workload Clusters +- As a multi-cluster operator, given that I have a management cluster, I want to create workload clusters across multiple providers with a consistent interface. For example, if I can create clusters on AWS without any manual intervention, I should have the same level of automation and lack of gotchas when using the VSphere provider. + +- As a multi-cluster operator, given that I have a management cluster, I want to create workload clusters across multiple providers that are all similarly configured. + +- As a multi-cluster operator, given that I have deployed my clusters via Cluster API, I want to find general information (name, status, access details) about my clusters across multiple providers. + +- As a multi-cluster operator, I want to know what versions of Kubernetes all of my workload clusters are running across multiple providers. + +- As a multi-cluster operator, given that I deploy workload clusters via several providers, I want to see a health and status summary from different providers. The detailed information can be provider specific, but a general, common status for generic phases must be given. + +- As a multi-cluster operator, given that I have deployed my clusters via Cluster API, I want to view the configuration of all my clusters across multiple providers. + +- As a multi-cluster operator, given that I have a single management cluster and that I have installed multiple providers, I want to lifecycle manage multiple workload clusters on each installed provider. + +### Provider Implementors +- As a provider, I want the machine controller to reconcile a Machine in response to an event from some other resource in the cluster. This is the sort of thing that other controllers do on a regular basis, so that's nothing particularly interesting. But having made a machine actuator, there's not an easy way to get access to the machine controller object in order to call its Watch method. diff --git a/hack/build-gitbook.sh b/hack/build-gitbook.sh new file mode 100755 index 000000000000..8eee619ddb07 --- /dev/null +++ b/hack/build-gitbook.sh @@ -0,0 +1,30 @@ +#!/usr/bin/env bash +# Copyright 2018 The Kubernetes Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -o errexit +set -o nounset +set -o pipefail + +export KUBE_ROOT=$(dirname "${BASH_SOURCE}")/.. + +cd $KUBE_ROOT + +pushd docs/book/ +npm install gitbook-cli -g +npm install phantomjs-prebuilt +npm ci +gitbook install +gitbook build +popd diff --git a/logos/LICENSE.md b/logos/LICENSE.md new file mode 100644 index 000000000000..e172d6864a16 --- /dev/null +++ b/logos/LICENSE.md @@ -0,0 +1,13 @@ +All artwork in this repo is made available under the Linux Foundation trademark +usage [guidelines](https://www.linuxfoundation.org/trademark-usage/). + +This text from those guidelines, and the correct and incorrect usage examples, are +particularly helpful: + +> Certain marks of The Linux Foundation have been created to enable you to +> communicate compatibility or interoperability of software or products. +> In addition to the requirement that any use of a mark to make an assertion +> of compatibility must, of course, be accurate, the use of these marks must +> avoid confusion regarding The Linux Foundation’s association with the product. +> The use of the mark cannot imply that The Linux Foundation or its projects are +> sponsoring or endorsing the product. diff --git a/logos/README.md b/logos/README.md new file mode 100644 index 000000000000..040a6224207e --- /dev/null +++ b/logos/README.md @@ -0,0 +1,15 @@ +# Cluster API related logos and artwork + +## Cluster API - It's Kubernetes all the way down + +![Cluster API - It's Kubernetes all the way down](kubernetes-cluster-logos_final-02.svg) + +[Pantone color reference](kubernetes-cluster-logos_2.pdf) + +## Cluster API - Clusters as Cattle + +![Cluster API - Clusters as Cattle](kubernetes-cluster-logos_final-01.svg) + +[Pantone color reference](kubernetes-cluster-logos_1.pdf) + +Use of any trademark or logo is subject to the trademark policy available at https://www.linuxfoundation.org/trademark-usage \ No newline at end of file diff --git a/logos/kubernetes-cluster-logos_1.pdf b/logos/kubernetes-cluster-logos_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53045d04c3df64506f5dfa858727489594613006 GIT binary patch literal 319325 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%0DK;L}wM`B8&~C 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


KgTSZLtTg%zY)sSTrOnD3_=->Pg@4 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%0A%%q$D@`7 zt;Q^yFakOcv9YVDiqO@A&4LEo%c6ht`l&ufmLa4sky+7|mj&44^HH+vQplj9;Vr7a zM^m*bfzWmk=q{{;0^dJhEmnVR_*|aU(?E2?e)%cz1eVAP<1zmS1xGKy^%&Pw~CtI^ZQg+`tgj z|K+dgS0ohqvYuJj6OD`zjn{PmU!Gspmje>~DvTjmdEw>fVQQ5o?3sm)1k zS@R#c?npHxO@r_u9-B_Bz_X(g+NH`W37jpX$Uvg=F3j(Bxo@_**R~0FvuzDABO{ zkX#}?fV4V-$7(f6UwGsA7=AQEmU}ZCB0S=t`wRBzu_&L$7zyp!&zl7?ioBGn14CLg zd!+25gu@U$rF1H+A^C!YhB18H*)M8&3RelAAN>{^$KHmUOJigW$7R^&J;@)abq0-gU}HK$=u7qpaM)kWHR{&%-%}j~qXyaf5CN_k zB!ZQ7|7ATQGATkqTMms9r+BL5p~ob9Q}C$oZ=#?Jdd zEZadvAUX>gmK2L#w%^s z^RN7LZQrA_LHcr=r^ux9! zPLp#jgsPq3VOiavx!`8I7Y4jR4kP7tj|fsU9jz$9HwKW}>_Ve@9)+GcGJ-^u3K1yS zBu{&blc)@jaCmIEMu_1Tq#~L1{?SveT^(2IS2WlDvSFY)4iQ0$65Qoje4-LA@trRh zkv()#u~K|x6^V2FQgjsD>2^<+O$!oVZK%8>eey@p(oVB3&~pbt$_ znn&9JIhKSCoP%#ktJee~ap=JO2ZQ}2uTWs)fycV7#H95qA1l+s7unt(#MGD_GH}Z9G8=WOArUe|sB8f_rps3T@b3I@x8qsK>!+jBB z8!4LkI%2c{FW^7Y0K@69o^TqQc+8e}0XRkx*z>&Uu;yr(X~Zjl+MPJqh!L}EL;-*p ztQAA$PL)*IjLIP=I=b3vf+fHmu0>{t_{_f{wgU^D`IvWe7q9w1#}2ZjsRyhPurbbu z!_@J%6G-b{5#pLKS>?t%0$~2#Fx>zWWP@HT;78#GhD?;GLD;ZT&jT1*b#9v`jNux) z36o22<)BVpi;+e;i^(^m46Qed?K>>1u4Q~@K8J%hi(wE;1uuUWmrT6?M?kp0{#G?S zbvpxKvV|!WPEV9ej?w#kBLQ|`5AJLtpR}7OmjPw|i@3o!EIFut8q!{*BZNN|fVY+N z`CJc~huq(KM52;fqCiuWeN11Yk-hrMOF}KNL)5d)Uew%S?WA<4!a6!I2u?-FhT{bh zf791dKxUJ-CqqL5U4$K4=qokh(+ZX=2|yWAf58DiD~>V_F*xblVYi-&PWEEM zr|Q-4he}*NJBa*^@v?7CH>T&ab63}xdvi@Vi0Kw0;;NquIHkwIQJN~_s1XFT~;WSy?EeytGS?z&{Hy`Q$q;i6BR4-NXHY zqu%1|YM9k7mV5NAFm{yV+YUS=7(OQ7qxr zLLo#0g3J|`_nOT&bl6Ss1wG2#?ZwvF0RB${&ZWeP4*m*9ZKWpnm4~vi8pN0e+2F=E zBFU&aY07B7F;|dVw)ygAC*2)i|->_T)bC&(E|MnhzU0OS~}fS3D8xnRwJ zhqW%Fy`Ud9Y{^q|+-7J87VdJxA2yUC%j zabBYqn*x{lxn+yQhyp|jiYX&VfC1o`BYZ^Rdm~UaWkDM)wC7uM3zYym5Ou1>SkDfRsn;Z{GGbb(!Q9{}VLnX=)?QDoes6<3N|85!OdF{iv zlN$@*#GW=ti2chca|UUhrblOs4#I-41`z9S02FJu3l{mb0OtwhK)SchVcB#G^U0afCc>0~BX^+i2F9qc-#At%P^JL_>XEG4X?xk`txJ@8lyFKk>62}!q` zJQ{&m2|M)(OG7@+0xT&c%!Fx8kv%kzw7Qtp-NrI;9g6+^&5YIPBX#89oBowb2>8N- z9=SIFAhSB8MvQx%kq}Lm7s)v>mgV{w)6t3yR}h;tvTE#PhU zLzSTY*;~=c1nHtmLEXu<*_okl@rY+gVJGDgnr3hmPg+bhTxVXk1F18yK(Iti)uoK{ zqF5kSBP7*N$k>FT?|sv`a*&%Hck>(H_w91cpqO)fnZoAKwe{J5k(oq}wOg!<0w4j+ zyFgvpj!?88apY9_*pLN6s#zlj;XyYq)Yqw?Gl#_zHBSI!LzUJlW(00FM&K5QCfJ{R z-lZ5*Jb#>Bw1cTlV?@V%Vdy3m~ZV_3aK`Oo3lad}l z(>}31;;|bcbo3ouHk7CKPqG9By%hE4eInp*R-*DRJ|^!Tiz%F1!d_ScB!Yz1pOvm^ zY7r`2zd|B0gL4~fYZjB&4lTvIh~Lt&22esmoYZ7WwM^=d3-14_+Vl74Rq2g5SsH+0 zq~j4Jtb-bJjfZKZwB0^{zKX&|Cx&dnn1j#g&~c-DPUxoFX904Vh1!v28uTcX`x0uQ z-G)ge)`r>jY9ZA?&1DKRkBhhKqO zqcXB3E}vHPgsiA{u)vn%al*EwxlvN zWb91`_D8GMn9WA1E>w5SwW2m#v=N8*2dA z@11QqXCq!xhr-$Cj`>i^7(}|w>2eovkSD3prcbh2z!Ohok&OB6 zH~&X5DiEYEE{EG94i^@*TxnT`Z@fmFv~CW{^ojKQ#{%5Ht;c;I=boC;6LEFoSB2rf z=yT%l_+xVlPeD=JGBOlB%%#%s-~W;@)I(P{Wz4to_>a_%pc>5A zm!G|*Tys;C==CD8K*+Epzq(Hd2eM+SDx5qG((E7*6G@~hq%@CWcY><7TKFR><1zOY zqjMLwB%%Y+EOnUqe!}LW1hoaIXABzUeWv{2;#{PS-ktMEDE#iN7^$g4z=(%*1;%gF z0JNIWP7hS~!n2BFHJB)WOR5=l#rCR>t&sM;8;24NMm*z>n79Ein$Y)l}T@_MelEKtbVHugnyCaq6sf3U~6LVequt?-#U^+wFOiJMt zONtd4?{ddNcV&3kEjkI?0dqEo#1h%1=niH3F_#bZdyoWrD^gWP?BEe`RRk>l^HZj% zBG`sIx0NiXo%?WIun;py{`r~VR>`a1pO{hZVFX}Mj8vQkN>Wp{lNc?kN3Oon`H?Dx zEw+asD+GV~mG=DMn+<<^iAf*M%P7tiH5hC2PdsR&{lFv&HPc@`d@$&XqWRP@rI&`6 zJiRhm+=xI2B~cA>DqzTLV5Ql^v(++sQ$oh!EK?+$yQe;>QMuH6|1937bivtg&aiPklokNj8ALJy2fP>mScTdaePM_9vfLCY z@&>Za%9b<>W#2IMD~r0gOx2y&QU@(0i*YA1oxK-;ImgYP2mDnXr*-zBOAEzos%PZ!8lX-9Fd0-+)Cgo@3Js+?$8Tc?Y6U)9(U z4%%)L_{`x6Cc$;+IL==~K7mQVIUTlm%}*n}ahOoB+jLlM5FhCc%60Bbq*7(7m&9kM zB7{m+l@X9tPR63><)gfkB2mrHBS%%xQCb@CMwh-z#qxYG+c2Y}(#ef9d=w<6ADxi< zb&g1PFk@{hkMJ*Qk=Wj8#NYo?A^X?)Zc}?(w1YNB>0hdaQ(?d;m^5Ik;Dsdl;`1Cv zSQ|z1_V)9&VY`g|P~KWX=fUSQxQ@$!6zn09ai3-&%Ur*(njYGtdTm%m^9L2Lg=0R$Uv!1{ zqhc3fz22J8hU|tRaVPsAWcO7O;&CV+z#BOs^M!UNIsHB2?axf;^hH7Pa=E+zA#eyT zrd&M8uI~e<_#@_>;12G;0H7oLcT|cgt-5Gr8Ha(u39A@=Y|c=wD-2vwA}>D93G0&^ zM{HxXqkIgE1!4ZI?n^=XM2$=xEfz8Jw=G3EjJRvF{uH=S3~8v&p=hrXG%;!U$QfO( z2#WwtC&tvVL;895>ZsY)N9BzlvaZ>; zkm2|ho~|<7+bDUSBC`#&&%bSr^m)KDmH!kk@l4Yt7}`L z_yqD*TIFmTFUN`o5Mj#`N{Mpw;Q)HZ%S@w$uzu<=$kF@|OI-lMd*ro8L=S-C9x5&nA99YS;m{*$ShEOuPRfMHI&h`Lt@OJIB*t z-0(>tcp}03ug3gg`)Z}?E(DuOSP_quP&jcV0#|RITbrNUbo&eUsH)e^-(=tRvS|3< zj~$7Knsk(DbxIhtcjFVF(~m{@;gW#L?NMUZZy;^C0<@^^+WG0xg&y2EpUVnkP&e(0 zKk*p6NcXq8Gy=bmi>qMm03v|LMr`GzX>dPNPm7b@s#IcD*fbd9)Ota(Q821Cxz zl``a_`)8=j&z29Wq_U6zM8Ul0I!M(mj@C#NyTs0bIZt6}noYFs&X$=K^hhuRCn#=# zEQ8k(Y6CcB!pY=d>^53N60Tzk9d2+cFLk{7qWPj<0SW#jts3wN-b43z5?Vu!!FLDR zAvmC-&w#Qa3Y^(oJhO5>`Rq*>hN?`(o7KyBZ)l{JXjfT7%fpK-NrE;|zLJvyNEEK!2^J21F1QzI_g(gjD?+u@ z`kDk_EOY1HKoYr2c8L89)J&GU8;h67?k3qQ#0N=~*9hxY#h7i#cwmP}o~RX}^qr}Xn+U5WDJ7TL>8oyEQ+I#a^n{6Wa_gRT_Vn=`^pDULXzfS+8c7T%s14QB# zrzU|5A#Lk=IRr22B*LcS!ml@94Io{9!i-IvxeGSjg%Q0vDCVV z#-}{#i*~4t>M)8f3R=4>EJKw;LO-=L9)Yj-ht=(W4S0e#>qM?qZfAfPrQ%r)*#1jc z88Ww}ZQ90!D*y6Ht>)Y%1JtXLYsE|(oO|zWxB=cZElfCCc(cjj82-dkYiu*3kUtnI zCAhT=jfreW7%!k@B3UgYmZ;}pwAg-ut3b@qO|#+){*7#7gfCHO<2u0YX~EKq5(y3u zAL#0anD@Uhc%;l$R-{dg@IlM*cVCHhPSK@Wx(#$NU$>F_103k{Z3Fru2(-~h55-&X zWx#Pl=)UV#sU^)55)1?=Q~O@`D`5mN4Ec=aG!61ksb!>Xa+82TFw=01z!yhrf28>` zTi6QHCYW1TX%x|=riqLd(`3paxcx<;9*dpOoo?}M0O?o!E!d+G;m4$Fpg1Nc?Ew<= zv+zdeVNlf=f*qSJ&_0v)?Ocaixve>D1P=d=_UcsGo$Tfwu|QpL_u8h>5KO;T6bLW~ zAZ1(g=dbt;)iRadQ8DDOe2}h+rPFB2^(wDQh$eE0o4NTd8*ZbJh*Xe@pc4NggdO7Y z`#Kv$1Zw$RQa(eRFu1C+TrJx`g1kuf7#R;&%l=IKqe``pg z!gvfdiGRxr9wMmqrH0Q>z{_;lREpKD#-eDJIiQygx?Z#!y)n|qS2U;#kMpRrIl~2& zb#fqBuvmu1u;gndX8JM6S`0?9s4njPbT$UeAUpbM%dv-NzaK=E!Vl5z>S~w z8;W(B1?ZuKv@#a#*gMSxvvIRn2R%`27r*J)=Ee{~B*kd|3!t>p)OAxAc}-H~6-#*| z#6WbjJp3yLabMe!?te%NiHD=8DuFV@M*zf9HpuI<(wItNP``X2W_?Kjg%SHRVDa5n zbm0>&)vR}yfxllH0R)evO1k$>_!XtSP{Z;+0M{0%#V+%Ab=%PTPPi0Cq&J$~k&0>r zdYLI)C^-AUP7yr`Pd3I3oTe?9Wj799*&9T0g5cG4V`oc>FQG{v;ruC;$U<%GH-I&2 z8_?(H-M|=puua=&c67R#%_hB;shup;?w%cOa*H10rT~O!5n6I5fP9Pvmv(#+R1^wf z3NTbeeN=ZnHteGQ2f}aI{H6&lB!Q;jXBF#evU$p+MXdjVnn3E^QYN4ctA4S!X=qQV zfVK#?Ay;A6R9;JDpo2u(AwJ^~NBt23oJV(plu!yTiB19F1(}ebk#{5tQC>e$<)%`O z%S(?pD-s)J@W9zS4#cx&rQ!s87V`Sj#wbLrux5wYJ?g;{zI+JW$63prSNB9&UdIqQ z&Wq6wzS0JdO1V{MHH8q2-yyV$FO9b+5VNnzM6h)?xx2^MCRJajNbfz^jnbaS*kBq| z9CGJS;re6iY~Mz+DFY!_3gl7v{*@}t>`*VcQ7W9Q0MXXixM~qbMd;s9V=3rn+=QSi{ixD^ z2QB>=1i_)h(psy`jB*LEB`gs5Sy|tJIlG~kc<21eU05R$Vk@IkOghy12~8mLAadG6 z(qA%;fOb>Q?r$X_3u?(sV1bOM0V-ob_;j&~fbstb`#@`>yO7cdMIQ4%qVf2=p!vT- z57fyHBCScobI+_&4kLCbPBC@{1lC3**ep=l!`ECn6hgo9BAiymduSVfldZ7wNemM} zD-FMa#*X{i;#%$B-2Coaa!x_GK_`zKFJUx=$R;69QN0sNfKzvIL{#c4{t1GJw?NAF zLhdMbZg%krm}=dzk&9C~#|Z$mMhK%M=T++!;7*EK*~yk?m68W*1T?mOgaBZ^;62_5 zlA44X7W6k8`J|Js`?q94TTVZJE7i4^#4CUbP=u{xt7@zt!6lNW*!xoNs%iTKCcz_a z#x18@Ka5JDAGAcm#iTJa84jWWDg84@(9*`ht7PdL8jTbkr?e8n!-4AV`Fi-&IzZeU z;~AB>kN)jQLSe`m`{!wJ>3eDmd3&iI-WAOmsTEAA37SOcKZoGtm-}VeixTY2vWhws zP=ZT%h)@w(FJL4Z@En*c(84m|p!o-iM;Jn?{?AgmQ*j|*r$~v^n{>B|BM5)MdBWF1 zMWy}n=>o&!LU*PlLl4?4nntBqGg)|$2W^&a!8){zY1Q4$a0TCjPQj{7?*L|@qP36` z4oz&~K^mynFjkk-4by+61RPL~jhn!EMc{UE9 zDNf6ENW_nIWeu^QrB>=&ix1PsF< zM0sktzoeh&%2-xl4cURmmr?mLZ24c;292${>BEJ+3r>Y2LL@;NSxLy#hO(O8+PWc1 zNfXIC0{>+yIML8nWYvBbsBnY007v^>EaFwACFJcBOdvXc_amHB!-eEYm%$yH1V5Y{ zU*>){c>ZeK_?3`j$%9BnI)bj?Hg9YTk4qgJ*Ly|mpkK<*xdzn@FL!#OJdC|g_MShL zUMUz!*U*R(kbhrVO; zlnGkNBD+Sw$i1J_o|ig6;jfk#^~&T#>+85@^u6dZlrJw zpp2}8OD7xk8$(HB7QypN`k&V)Xk)}Z&E901fPYE#d{@w$eCM@-k(8izb%#{P=k6Rm zui;H}j(*si|J+@&kt=)bdZk_jGUjNnGpKd{wVfIu%5a9Z_2*rD4b*nsBGf2i1Ig z>FLrd%z%vFD4!RAKOp`!%CdsUf>i1zr5KT602D&#Itfo2A+^~wC55Dj!5mutLjQ3m z0Xu>xdDKK}@0Z~&evqnn2*QxBI;jS9g*(+H9@@x+yQOu(XSl$FaqNp46YXnAcrl~jdL^wz@%q;)bbq3|d*@FxW z-xBek8TmgW(Bm{3U8zZh$x)?3Nl$j!WmMu`G z5DH+|Z$=Xy$MJcAv)*@Nfp`5ZOu}e*3rAMY+tag%{{lQ`HDp`Njw8P?fW7-K%lzY! zNmvk6$%-N`k(Pj)jQFFw$RbDNY;SXY!z=(W{)#q<<&vLo8}^+r?O?wL_4EEx#hh2# z`HY}i`m>oFaZb+)p-!vo!`gX5t3t7(;7~i9co~6!$Xf;yIlI;JBF?!ExWzRhCRmhV z3$fKq3Io+9i7rJ8vC2z{?5%`|89og#GD8kmBNlTDIVMRiQzI_F(Is*PL0=Z5i|47DsyaN;jghnhn(1pKUQ%P~{yGa%a3G~g zID!Nk0u>RW_U49C;gy4oDH<%55Vz#Dfeoo?rfnVKJWZClvsJo$pl+!`ANoTz0$k}7 zklUs*D*BIT{)1DMHgI!g`v3MGXAF=j`Av1>0ochxHq7@)75H(JWNHM`WUC}I zohL!@xH3>l?lfu^VzNgAkX#xu=G~!-K__XcRc*xjmM%-!l`?>#BU4Z(-DgNy zzCLl83FfvMiDi!ld?4NVd(3G;Kx^0&PDvSId5?jvjGSUb_KFgDNK7(GU zYW7>W`aP}5=FcA&KP1+;on8^?Q1nZPTzW|PDF zb!=bVqN^o^k5r@Ij=Dfe39Q9+khCr314e+rze}|%PZi!*2D7iufnn3+x%X>Xf}#zX z$0nk|BNob-;lc2?u2VR5Pg<1Q#fW3Zi8r{B4Z`+bXcZe=>9RW&AnAkwlkcX1sx^Tg zI#t_bXWlXROm9rP6aru`G>ADu5U0|ki~!2A9H`NwC0bi3Gt$=sDhcpPu_x$BK2NG; zaGfSAfR8E4;t^5dalxMvNc|iM3&u3rRHRd&06ETtU8`6jwTS)Yvb;64G*^NI6o?`G z5O5L$Wtj8Ftj85p=0l?-*k4FH!ByO72V1)f--K$If#zDp*r`Cxr>SEaFgwS7~ke~y7@H}Px z=8#~AZ(3(QmNl|qFMhVsXu4xOIN+!sQ^KhM-I#w{Ylsn`uQ_Q|s=jF)N&?OeyLpgX zG3xg2_-{F2fXzGEa&uP9`9I7Yk|#U;-PD?tiXu$VRJ)cT4XC-9r-}?sC_UVeXxR>F zNj{GAD*Sf1+xru5TSw$66p7<@?Rs*L-D9f>$0BrhZ!ozvFHpf;;I2@_wtT8^;C$2* zF20g!zEhyk`ahO5I?``@<3gx6G1tM*Rk(&@bz3C(jGJy&^LQjR zl4=)2ytr26hA2gYWl2r{g#&mu%=Kg#ZT$|-MDRAHw8I}0VMgE!4%aP z1S!8lfsj^o7s7@{-aY*Ze`*UgsQTFhhN_j2{IT56Z}Nbq;zRrDOZ5N@S3XjH~a?3IrmFmSYVp2u59bPG7 zQnSb0yrn8E2qZO~%nx%8Ss4h8@Vw3s7*hyH0&2w=VwUlS7wj?j1jH=X)>;sn=Woa5 z0W~bZQx+_MP3|aVG$)773dqTd*6GM4}~O zg>A2YX4j7Z6f4z|T|mRaH>9Pc`9bN`x(nSraKIN-?$oz=8$iZ2;GI<8263xxd{!Dw8^ETAusAmC1kq|EONN#wpA>WjCk#jm{_) zr6mE(r5Yz=x?xNbTZQmD9$_8K!32%jRwy3O8Yba{s&_M?At@q7f zLX!45Z9eu^wzRYh;HY_1rG$2RN9eqf%q?|FgN5)Jer;7InLGsGgK(hTuUNe^oqo6z zu+uX|sw`H0AF>7%@xD2Tj)2ar|EG<%D1|Y0ff0hL-qnAP*OV0{ytymh?4O3h7Dg<~ zm^x{Oo)@HRL+bl&ntCS2EV1b72mX>}_5Gm0m`1lGFW{&hei{IBIbT8iNUeN2*A0Pb zsd(}eNIOr}K}Xo?VKsR|rv|9gAqzG2>4*}jP4416ed}19FD$)H!4S#MLbZeu8>t0k_W&M(BW);j-3zWd z!;-i|G!JRhiD(Dd8#wwkjg3)h%M4mxA6uRjca|Gi!|WVC>iJWYf{y^o6Kb-&-sZvW5m+cv2I00Uzpd_X~P;^1I$2WN8cJie4TAko`rdcRT$hgb!aJJ zL-3cWs^_~Z;AoJ9`{@BaVM~>+Z&#r2x3EJ6i*%P9rJIlzMpaO7PNgWi3RUl;mWGHl z+DKsQ-_L@TlU$vsA8ZVuad)7t&GszCzhYCTLw^N&zOJ&TKp1y1fZo-I!T3q0_UXAI zZh9r_4I%6MG<2wI=%CpZe6VE$OqhXIVjUaqVL$ICM9_Lt9Bxww-U&iv3}7>2?V zAJY$r#x_vB?+GTY@-x2^l4<0d>@&LwQ*WjSnLn;aJRS8UUo@`Pg zcJUGU_UbN#gT4asa}x;AV*=V(T(f`jeqFNwAb|R*Gwk}vK~PS#LOApW@rqzEc}web z-$zP&Q@bLiU^2mxx6B!iM|3}gw>Z=9>H@t7Ap*c{LC{dK$bFRO>$>>4iSvD>vI< zN%H;g^DSo?LlrNe!!~(tGFRr<giA<3UCnjCQ0gqticlS-d=o%v7@Cd^KO+ft3 z%6(Eeoh_3?<6gR$Pz8Yjk)1?A04y9N(Dmkln#UdeFr*&ye5)iq_y0GU+}K&WDVuu^ zhV#M{5f>ROpK)y(b$v`Cuf+j#`m7P-7 zn-MIOl?`@AaHr*kY2y*p<(O`V1Obq1mlIB!iYbR!Kav@IP-04zo%L;~g-T#Z9@=sY zs~to{7*5GF4Z3<5QR3J{rT)G!OWJc8Q~^VbS0+dZoWK&n#Aq0$y_dasjnYOaUtsZ2 z!jc6XZOt@RZL;725JH_evqUW31^-hn){LH)Fdli)yW7n?40iVD@VH4Hle zNVJ(k!1EGPJHZ6K?lfG1mnG9M`iCVSS z#7?cFSd?9#v!v}Dv%gx_ddR%3aj>ciN7FF#sYE3sad)cYB}y zqnk3~r0;}Y+YMvk0Zrjgj{e|~l!W0h|IJ~Y8OGnFoWLN&Y^s znoBhDELy1-jZN9f)1V#GK<>V-G8zmNJZfJGpuL$k#hnx0$8x0^(i09-iKgO*jJCE7 zfjAa#9y>G3WOF1a&k1Wr4b$j*vtkJlfJAT1L^Gr+dU!wHZ5q(aJOU_&r2@LZZ|Vk> z61zpr=30M(?nKzF)}~Hd#)xndo{Bo%p8I`LER6#LxSqsfI7u1t`2z(TfpoYV&fJ5$ zb>HA8Jqsa&Ee1@v@$Kj|46N7EX9ymFFsES(&MWA6BPK^orznbE2F?eUqG~mjc(okX zw8Mj>;@?PYia6DhsG*q8DKP%Zm>^sA84{4pG*@K*Ic!jHA;P!BK|_3B2YSIE$et_z zwKzbk`l@9ClAK~2ehAV)#o(sbx84BvSO9waoQoW>fr~Er^br=2eDM6?U;Uzr@4-`( zj08guA4+*Isf&2<20@)A5+7%dT5rt#rV$i&?~$(;qcoV5w0*R^=!@(>i(vfyLY}PHOP)ku1Dro6c zbC2+jhL^=2+YC_Yt2eS4!A;z|MA>a5GaRDgNIX4bsyOV3*zGXDIjJUcmxqMtoOJ7q!w28kAb+5;=fm z3Y7SA4Grafl;W+6?uZ!*&}ga{%SR2pA3jV7jG1{ub*H8?8CsEuk)x!iX&_dO%UQu< zhrk7wt|VZ_)28LJ}dAIG@idsdZHA7ypHpKz0@23q%~%1>BlqCSYd<>IN6 zmjOzurH5+!i%9__koAMEnto({gtWhoD|It#X!ef6WH_0PMW~a~vg_!Fp>|NS0>*}e zlr#0sW;K!lMQ z+D=MBc-Y*+!`g!KNMj+o(IZ`vOx`FChzCcMkVkfpTKqB~ z&be`cL_w3E@{&#cwtUp)Ob0@VeTqHKFjY6mvgI>uQ!(myICRU8;W6z5;^x;X-;e{K zCb8djH3K1^?Uvf=%p=76BqJWu_gMJV*Ak997rkHxJXr%eS)$s}J>2e>?52#T0LM!F z_IB4O=8!g?Q4%aVWnc|VkrMPUYy+fPPvjJc*$uza#6||(2dJMFm_WCA8+K%NvFJ40u5{w#y-*E zhJgrtr25T*_q~6+#4XW}AT9r?`)&DIjPtrWPWxHV4^^3B3&;ubx%Ts#EC8dzi!SDf z1TSztGr>|g4$9Rf;gjfhfc{C%Cpw)-h^P0X#U_cHR{y*<9#o&!*MMUT>ZU5>;I*@-&dcmnJy{yWlJNl%9B|-0C8*zr zWeR*Fyn;|aRh^LT{z)iVcx{yNZPKiyKj#|V0s^qN3o9+&gLO7gYfHr94quEWj6c9M zLqG|40)?caf?UR{;CRna+NYswzwM#$St{MFghRB5456b^J`iFhRT@%KW7djbD5uK(*Xk-p%Sto-{R%gK2s`Q`h@U1R1b3Z zbJ9M}fLX;~s3qB6Q}8-@h8~^OO>&`zib)TY9!u)7VF!trkbTxo zQG0vW!6O2zz@{P(a?ucvPY1WAZ`eTG1u%6-$C1x71$8|Z;RNU}I(c-W7@+KB1z8@F zHz5AB2{TCzLH3>c>gpM&A(TilnnZVrqS6w+J00Zrz%fS@1?a9FLe>drxa?tQ)g|0w z%kw&qrEqWJ>?to5g-wV(z|Ko63|9owNT>u`5LMh4Wyy8;oIrYojFZOPOB=Sa3#9%| z02kOD#ym(7))^A|yjdC;0aRfGpxg$rGMFBJG;&41KBALYff{(zJc^umJdIL{PmNMS z_7$nqG>JvlxvkHmQnn0i>nhwnKFA@yy>Y!TDy+Oz>39A>s1rG@X$)u^47co@KS-Xq z=IJ&i$SkE=X=MF#*rDKLqklg>9T)esepEdE>oH1sdp7wns+qw~7H4wrWN1C^1JmRL z9QO>b3lLKwggn*5r2_GGXdN|_B0J@<6NVB4A%hTahGsa0yM)-?5etPcP!93(H_^)t zfYOSnNwFQ3h~o_X-*O$y6EeDd$l|gps<2{aUSgJ2f(^(BL=OcfD<^`Y=N;nyIYCp! zWUU;7ujtPp$XKHXzy^u157TQche2ci*gQ4GBeKodoY)$H{6l1K9)Te{j8M!5T4@D18XEX|9+O-(f?7Ep1*;{C+uq>=jO@cNga-g%JnoGxST5RM zOtsWZIZ#FpN)L9Q>^KC5l7tZf7^xS|HoBXq+dWq2+*|W0a8mPjYel6 zI`5`T#$%SfoMpo{M{A>11#Nt_cpkEw`2=sR4fX3G%h(HJi2?ZS!*|mnX&UPN2%?7O zD+WkTd7DPa$q$_KiOY0JW!Zv)908mSdWu^x951mUZ2~rK*){7|`tW&f7g+3PA0SUt-VovGN9hU6+2yKwL4^6H zOq*Ntbx?E+l-*L>VE>8{+Oep|fyr$SD1L*x9mR>Zo3gPo>gdi7Lr zrQtDy_w$gUM@dN|Dz)TIh0%>=z_s+q6M?{W1RU5qy3_T4+#K=;Q;xkLWugqV?NuDCso&^CiN&^pS%fBI9e#tvHn1e3nx71 z3;-*h=3(gUHA*QPztb*e-I8%HbqrI+nm~sj4ur5Z(+TjDT%`#hL73dki@d4|xAC{G zQ}325mjF#A8sm4{zNunP*{Y=;B?V(phR8EmLJq&T`QucgJ*Q$ppS$1tefrB`W#>YW zm!AxNbj0Z0hv;(54CDxm7j7BdjP0vA)MGtnn1q3FsOWZl6jhqEp# z;Z^=^(<)p&SplyEakL=<0mF4-MyqgiYcnugE7w`4y|H?OOQBlI^&%%@t0pAq-(k7ylddW|wa zN}8o;1hfcXaIN-8^I$d~OK-)PEhOr~p;eJu;Ej?6Dv@{Tg6h`^ z+=V_e^7FJOdON0Z-Z-PadM->hc5(ze;mP^6sR{Oi+C+n20tG&n>X_vJ&*$@_#dFB7 zw`8+*BdExVrAkybi0ptxN&PUa9XpNlDCRICAQwLKo$CYW2~w_)V=F0iv|@u0F1Lzh zp1;6m8{MA*AH*YQAnsQUYf5i$DofvCb0^onXMgb_N$dU|xhfKejNPqI!)rs*4T4M! zRBYn%z1=G}-e{J~#!Qz1rrkf8=w<`VJ41sItr2PmXM8_Z$Ob(nB{>bCvJcS4PlH$> zpX4)btOCXzEFj?ypl_eHZ?0=3_0Ur5h z$d>V^=;vegX#|FScZwU^I*m^Xu7OdQM9lZE2|V9Q*%FaHX91ZXhVWC8t}2vm>SW;! z*kqT>j|h%$0>kqXY&ZfLAvJN{$?I;F?55_;+_3~L;XAp*&ayhRkFEO9W3+q0X(3~t zwi14A!iO*m24-kE4Pb}h%}cShW4%&v1 zve>9(9y2ru-p5?YYj0w{FEJ0ysfELFBq%JKbY)JD)@wxfIR9<;0}SoZUdNiC+&0r4 zu>P>gwE~H`Z`?<-WeIZzwgtsRBg*7y2It{!N>4FdyxwhZjm%n!Q1A#-TvO6at&qNy zV8S(#qPi$+wuOdFh6c|F30g)p;nK7HLHvsL8WNI6k=;{mL|xc|!q7)W1R~%^;03{Y zA7^d@!bcO!ZDBZtdl|&>6#G!hdNhE}4ibdKerU^ej$tagZ3d1j)fpXgyp#>jq!QRh zp9et?2rUltsu2seMt(*Q@GDv>#XdbP3Z?+cIEm%cOUDbd-z^o}#yA}f3Ng=VZnEFy zMAuGTL13vVWo!s*nrj9KI%)QO`*op3ynYnJvs_P*=22>edR6y-Pph0*S&kPcFCm+P z!SkmOM(d9EVfP|{8DR#lv8)Yt;BzS|Guoi|H7H zH1$rUeZ*Xy{Ls?(I6(<~j#9UgD1{`t(7IyZGhG5kt$hQIB~ha3#0A>#ic$k)3CKCt zlG~%ycOtDTZ?3;)TO;EeWp-s~*q@%-HuUNrF4zZ`K?duBz`* z^{Oj7Mo$2x2|->;$kIS(8=HPJiDI{eZ7 zLi)NevAknsS_UrygUMRols;V`RavJX*vtpwZ{#C{&@X0QLOnvU(-<~?ml-`aDq&6a zCnN{>Pm_Po^AR_sQ;#~)cyM^62S;k@|LZkq?A=3d0V?v{>F^)xV}M0g{*IUc6^EJr zNXwxx(Y~6ZN#dF{Zy^~`%Lgxo5qo8&rOoR#&Ql;i@7ajTd&;q{Dq-4xmY&QlDlmeE ze}@gNr!lJ*b7Ow8dO>^EKq9j&#G@{`e}6~+A*VeV0tef!$P|-%GoZVKd_rSsgngP1+e@H>w zWd)_ghb#68CNo%%3hg8g^E@jD-uhULhjWxz-VeDA$+=p`V{T%O^KdbvDGeex$ z-3ajgMpCV?cWemnIbSyiBUBEEpmF~m&NEYKYN?ztB5|lg>FSa|a#4TR2=qrB_^PW| zis2haW~>ok(q_bvYGk*z=KA{{gD0MyWp?p_5}Oc=v5U+~6h=FQ7u00~vULDa`h=Y2 z5YHb0sVY7^Cj(rs7<~(M;QZ)|5Cu$sMXqdi9`b?wDG-*0K8 z$pd69^)1{%#HNm^{>`+qVjK*&&QFMllS0VC+$mS$TLabzD$L7<^%O-N>PaTuS4(rP zyJJ~?TpA*)5960m6_O%Tv4evmd=e!9ly9I9bOwVQ1Cap~E*;1pI+*U+mVksPJ|F>x zc-5|{r}0h7NwM;`g$;ajq~#gCg1>lVX^tX$=w?c(6Zl5&nZu81k8ZvN8lCFcyqX8} zzD)RNL#;(X8bbg;;>??@_eBJM6`4O&r6TXcGM?%T6WY&&+_?!RFVw!KGt>%<$oSaP zvJXS|cqrOT$OQ~BiI^%%Z6C(PGH z9l#>{;bS|Tj!=Y>JR6sjZkiDuQ2bht&v9(k_Z8c_qTa0nCv}c{$7gp7Que==DW1iJ z=X0pJJ&v~jp|ZhztmpO_IWhn3M?mPYZtyDy&iyi-M@gvPq|EXW_(TXP@4`+5O_3vx zm`dNAq;vLEU~SeA#Vnv@ngJW&(Mu~r0(I%t$lr^Pd4iI?AJ41*28HHKCy}F|F(M*G zNKhoaI=1JDpE}4z0*&y@1`Hl50aoP&zz9D?pUdH+Y*pw(Mbn=&x% zpGu3i*cOSsV`;Np!%C%8^9mPBQD`a;?gcJNq9)MpDK^Q!{f@Ui8vZP9oeN}3+B^u19_Ii71e znD2>XQj$+$2e3Wv0j4G!j}^jz_TS=Am>F>Ut?YJcUi6HjfS=XqCh&-uEBjy*v;TAK zbQu90e%p0mKv}ZKh$&EWgxC^6Q4hEldo9O&rAM<*g&%~`p@>+8XK?8By!Zc6ljFQ8 zZxyah!(hQxeF}(mpd5rpXLQO_m#m4Qa+)w;BPrMoQ7gmJIXi=+j$=~+UKSKgkmPpULm%+HDr12ncy*5 zI%_YxpYe6`H?m0n#~<-{w=4AkQ9!Q0Q5xN47Q`ksj&OQ2O4W-pX-zT7a*CTkO>Z8k zT}@(`a}wlj0rbuEdf?NHVBVtWVp#8x2DKcpfc;2WN9Zc^ia!T2!#%hPB-Irvy|{%8 zP|y25C_GFw9M}V}W@KwXmf$U_LSh0+Sz$G#tK&aX%>cSlUUBFl{v{hdCHMkrllw#? zxuR>ZzlD#}h?Mw0rjfN80n#WY377}YvO%4 z1+=W zJ5gE+P9U(=2~|N2HrB7_X3yZH9rpD_In}XcprPJ-GtJ=6S=!4*QaXU^Zu>n_?-ByN z7#Nw3sJ^gEEc;we5U;Z;s3`>^L2-vFnz6q{kkoB~B1#OYR6o<+R16lZPV~%%xC|ND zpIAPbpAx%uRz%%pWJ7P4PM1M{@`-S1u5KolZePtK0-9!mUhR}dkZN~wPZ@z~n`5ZU zvGnxwX(fqokPI8yw{Sl=B|c{_{L!DucJp^WMU=hjS{2N<5DzR(9BhcDqZC~uYi^gu z0e(LkTr*X8m#0@)1TTiU>)P_tW>_Ymk@PP?tvUErKDe^^G*Kq|gIU*Oq1HVvR6W5V zH>ZtGiV3ZTaKpMaioobcIIj6JAtSm)3wmL6ytC;4E zw3oaJSQ4k1Jsaw;ppo%EFBV{7`9opglvbX%uSII?ZFB<^fzU*95WGaCzx1TG6@%{1?9*} zK|6Sk-NG4R5pVTWiV#fFO?|aHZqAb>K|Zr?3X-n_ta5iQDPx9Xm3e5`dLq?38sI3+ zsD*g}WXyuvtJscYbvO1!+n>2vuZz*t2uNz3iys`^AHD)e`L#<1b- z^Wf3ckh(DBK-I=jp)CXgU$r3c8u&ige@BkcmhhIw&!N~!-)-$ZRUc|X+3V2+p{r6fHZ%45rj8(oWFx&oRKg;uFoDRVKCSVyaP z2lQOCdm$F*j5!?}v62>lHF3J7T$I`TVbou!up7N66|sN*W_{qE2V?IRTYvtmP|9je zyjrB}V!6VLX27!T3;1NN2-3~Iypeq!yT1;2p>z`DutSprw2*m zb3$WOXrtx5$(*= zSCu9?+ATOGzFML06!A4xKs$iT$~$KO`catBD(e6EEp`aVGJ_#QxroTuB2Dqs&)NSB zn|d%+DDqS+3=3q{@hT27MCR_ujY(ns7LwEG;#qYsF3R)T=YU1J8JDR2V9Ie_hd z8RI)~S5`1Im7!$0fzXUtQc92LD25woE_wP*-t_RY&G82%hQ>?=z@;&(ta0Vb)OBjZ15oEkwtbltZ ze!@bk6dJN}ngbqiK%tCICwp&%JB`;dQY~fYeVe^WBMPF2e1Pif=y!vvBkP%{(8DIv zAHT^Dip^YJa|L@niWSQ2l4^u@B0CC%Yf@xNrfA&4Aj$~3nU_{X49287CFe!h;3%%N zcKgnxT%cfkp`2pP?MEg@w^%90WFU}mqnklNk%MWRH605=kFu7si z=Girn)@7W%D(?SZ6q-jV^ZQkc6al6zK6U@LdGHAtrCgDnUIu*VH;`Qtg~s8utcoz+ z8kVXk4XP(BsxCP^MMtVAPW!4(gk7{R17-7o(*@KJ*fQ=74_P}gJbV+dJO`Wa_?NvE zl*melRr0hbQ(6p=^^}0IZ)2WBLw@p0UBw=XoQ4LC$p$BXaop%jGvFRYJec%LejmjL z_M+{YCHI!^OL8KNMZ76tt5s?5G1U14cj7 z*|)Apj!LBu9wQyklA^KMyQ+T#JBF1(^V;KR7w8{=16$<5EK290j1>Nux47YnND&7j zW=sEIuA^?y)_&grUs$%-@O@5_paNp_OUz+2>|xc<2o&o6P&eM&!zpbTs_AcnTLbdT zbG)iVq^9LGP+eFk=8t-8v1n+_-Rmj`p56VIgiJ-g?yFcLO__Q;s7TlZk`(-E+0ok6 zMfJ!p#TNp?1bL|#+@DrcBknJD_^KsAieOk$!g3Po=n(Rrlkv`Pw0!&XDPTOOsRW}pm6j}wb5`ovdu>Z|F5!(5k^S)2YlwG zY}$|x92Eu`v5Nwsri-XzP79V^7_Y~FNbjG=WouG-aE3U*qH1k zqY21zf;@oRQ0)q@Kg$l?5B5S%J*5AK<{;Cu)LN`XGQ$uGyDTs1TkCNYTgC=dpI|jG z;|w}aD#XTC7(>+oeluGhzh8@G7L|t-?Xk0%rc)n5kFs@GhE7VV2CyZMjA@UcR<~B5 zI9M*8o3q1jg+dLf+x#aX&{1J3?@f!J*3>tlm=SaySYz~(E4*$HhYqBX{SA{Cb?!#K z_v5R+k5=NOoxH5+St}ZjUd-jytX+W>#ttb`&gDFP4(3b1z;;II8AqEC4SEF$&5tPS zAL4oJHK=@SxfRS>sfh(fV<_$Gq(nFs5F7VAxEvn7q7q_n-r!IpU4}--HVMwsiWEof zD!AcIogL>(@kI*E`x!rnT+co66_vkvXqXw)YjFQTBMJw(y}Mca`O?qnc=z6Ov&KMS z*l(mW4H+?53j#;x5#X&H*{cCCHJ(U0(6*k9CFl2kfczNxJ<|(d!s%xS7&?y)rJjdX z!K_#a722JJ2{uQ7R2rGMe5&R(gkE)$=IG$(y|X<2MxDH2gb)v7g$zAf`|eHF;&Zyx zn~n`qs`#U{VOQ$)RTBqu7}^f5p~nvs@gAxw=N8_X5{Fqv03WtYLze_C`*T`d8Zd;K z94Z27M17zdl-TkyhTcHM13#VZi7e&zoE00lRx={j2LqTnd%?68>(^77CcY+fce%|a z1BFO}3P$r!jnVPmA9Kvy? zX)GxM&PcMR6g3`B2gTDp*jIIoLui|lL+gYZqgmY@s4w65eh(&7UaQe@c zL+`YA07a;QVR8`$wkY!iKOd;Zj6iJVY_zazVJa{ve) zDEYlLwM~VzuqkKvoSjMoW@O)0Gosi?afo5fhXw6^8r>6;VD-37#YyYuJFb;X@Jm-? z1E5{QqrRNqFa8ACUnK;DN_$`{1Hsm%K8@L5vl%$xiVWQ-l2=?j;d8J{M#a#zA*JAz zaMM=lTj^XxC@dA5zMts%5!IvcXCgAZofeshBNXlr9Wa0!Rbj~K&vw^_*l67}LE2hb zHqu9~c}DE>f8$9x;4E6A=o@I#YEEI&lcsky-eoi5j)k%NoemRXn!U5K)LcOB-HLe}<7nR8@FBgdh2 zjScDW8td;4R45UnM~!^J(bV2k#K6@fTEGw{+H(8+S4#K!pLg|k<~4xGl%r*}Ec#XA zB(JK>f=|B?6~LgM@!*OU<}FL%l%X7tlB}G^d30%J`^o(E=jc5u;d0^k0+)l37kI;> z9;gjq$ybErtZ}Q?bQZ!|=_`V)<0An4yYoBHy104otYl`WdP4x|9PfENI>{cvtk|Up z8n$&4I}yiW#}n=uJb%U!(*1))u)?~aqXMn4RJ`l+UwI{2MpuDEm=QnAcSU^_fKuN- z8j@`+7n}Thc*t(!+edy1uO}Hy8AItNE_-ve_e@9_oHWnp2*S0jpBI*Dh_rb2bV3M1 zMRkIQK894H8(b-`JA0ht(qsfpJ#?8aX$Y;*10?-8f|vvv$v+>jZ3@w=;zbG4p)(j( z<6P4lp0e6;4Ma913YDAB-hgWDO+^b~wEjlog;hrTJmLzX;&0oAEgD6*Ck)E+)bC%K zkCojQMS;kgC>rz-8Viw+q!gP$m|;0^U&Vd)l}{f^WAH+~$07CG_j%CO-el)A9JNtn z9%zac>!HmwCzFXcai&orMsv zNR$q+iM}d3Nr))Zd0rCoQ_u;ufFN~TEvr5B&w(f(CJFx>j0ByANJ#B!rCd%NBY<-d zc669^O`QC_Q5@C#-i0rB&*I1W)p#E(d*v>Pr$!*Zftst@JfH%0(FAD;)i@z1wKwg= zN)9k4H_b#pX0Mg|Su}OBS*BQ~j z;=NryTLEeb4lufEJa2DiP3R|<67MlH#VZJN6kAMePcW$y+IcsI7F@BzedLv z1)l1D4sZ*QU_N|Bs6OydqfTc%6&)r-YPNCWeua{F0f>BC4%)5ddtHHpI5SPY9}bOu zz7<1tBk^FB)92Sb%+z-R$?~ax%pLA#2W4nMU z0aJpQ^>Msogo45riJ_0W; zVrXY{b>;plVRH#u*%P_vSt9@m&65YJ5u!ny97%e|EdNrkq#4dumb=%`=awd+s5roTbklw}$FR$3Mdkuks zNm8H&WVW_Bw!>;p%I@Kf(08Rs!#zDugW8irDPPz_MSO%Ih>m+2mV`V2Zp*s;X2r@W z+|Hs)M$qP`A|XfjcbAs0gfu&%aPB7-$&5=ML$$hBVyy-=E(Fftwpz2z-V-EDBGm-- zd$8*{BhDW~jB#Z3_$Q+<2NY4Xn_z^y=}t#gDg`&Ao}xV?aGklF;J<+}i~X)ztMNHZ z4%r}6b?*0!1S;vRk#UxL?etHUyBz<$6uer0sZO{0IB*g*1CAVVa;xjULOm-+$vQQS zA#*d5lr*A)3JyHBMyx6em5!0@Yo3D_4beowR|%wZ+5^ZEJ;bJsnM>IR?8PH+ixGql z9Uhrpb)e4^N-9z9D;>irUs0hW6BH1PRCsP7RNS!*27zx=%dV_o( zk=3};YA41Ce!s$dV<6Rkgp&+7jWhWLWPU6kWT6M!5vs(XZT^chC~=`jul&ndR$Bw= z^7t!QzD!7I$_{5UE34;E$&`3Nxoz&BQfLC?#?$o}*4==ET(oZGU5Dlu+E$OKZrx4LVAhKD@Nmoy{I5k$rQ{z1yfGZPC zBNz5_qLRqdP7s-{2#vBDq;%N^;5ed%R>{lndeic^raUygOfRTHW)F+Bqs38X`(2@u> zMV^o`al75Lv;{n7c(;M}uf?X)e8yh91`VK`0V*dM6?uk?m|EoN-lu5zOQQ)NHfo%f znV|}rCn?nd=Z)&4UqF^$b`9y)%eg(|`hwxpK|*piCg*6q@XYtD!qI*pd&s~3Mm2}o zk8|oNPcZ`N+EnMuwftVS%vyUV{a4oZ%BDl^4ZN(vOz?Pr&wc~0fx#JFm2EtvM0eUP zzpxZZgJl#x%@|@8q>d3IaZ&z%E^k;z94_MriA)*L`&C=x^sZ???OR$8|DO@fK69hj zbPPi77KhuU=v#hJOnox?>{$Z##Hmdz&Kja`Msm^qvJ37cDWFZcL{#+%c|WCYdOjHf zHT!7o^!|lMdT&ybG9teJiN{`1bHYp$-@5|(qk1m%`-t@X`5T&hTE63A+>|IkL>(T} zY{jModJ=0QP@b*f;$VO{ME<`vKh1H-N9g&=J0`U!gy?jaCy(I)lh9dqKe(|N)>3bQ z5M@70mtk-D0a{VETkIJf#3JuvmBM6yy%8US$LoahX0wkgt+1@(P8e9QL)`Ri+6cIM zCW$9AJQcD=L~NJ5vJ^!)L>Rw9A(Q43aVM+D?5m(x%r9HP5^kpIGYq;aA?gCLMg z?RlG`Ax&o^=RfM5#?sMsh4;9ZVt*5S8|i|9xUwvr*m|ZUY5ZoSs5I#fIvR@A%39cM zd{yzN-(^A1+x}Aix=D7GL-W4$Rwh=YwR#}=nDjS0oi0)UI&|OyVTYQ=>KIhdUrC>a z+a|0`e@%K_youUQFo{3sp#|Pflr*9)08}Z?l;VNn616_uoZkd=6kea60-V|CGEeb{ zw{-6tx(c34R0PKCf2Uk_31bKiKUoqQLA+o(-YAX0e}h|bIo|+zNWD}ojo2p!2w&BZ z2XSI)I?k6{45NV9T~3L5stMiAI0Bx?VnJj1vKD_ihgvj2O2r#bE*K^ueh;yQbcTOw z3@z!Q_9VZFBxH~-M?TebQ&F&lP_Ihi&sigMUQ`iV{Wv7!&)`LW5Qey(EHWSuX&c$G zx$AdlDL-oK1-m$7IX*Qtz8QPFrv91xetRSCq(<4jri!El?!*+Rh@EGAC~`|z8;l)< zX}{Zo`Di~H%~TGFkuEB>9k(2(%W0GiGB(olmez#6EwXCPbpA@#I_xRE z=vD5NqAV(8yF}&DdQNN+J->Z4e+br$lOUuD-%=b1r_;ysVi9FU7eWV13^Fxi$b&ip zL$XJx(Z#@s5y~40^t45iCD^Ucsa6VScD6*)Vzy5~2SSMo7bVFAN`8^e1 zVb$h2y4ZUrbn=gHU}cvfiKaag2&LtUe$VDL(N}FN<^5-kx=OLgKLv~X@H)Bj6 zv7G8*qwTrhk`dT5zAgK%qoyTD9ZVk0X}BU%toMSLulg8?ZPetc^Tv zkLh+lJ!Bs`O+bDOU)mRs_P%=)fIA43~z;>aS;Y#ew zO(9AiLeh2yg@Mag%V)l%y=BB2+LIb>bNCd>dK%}Tl?8DH5izR+b%b}h0U5H~)!%J@ zrTsJgITYQV77@N&6ouc7fRbr}rJ8fpvI@NZjO+97;kiNa>&@mK!!nLWUz>eK;B0*l z!605JS+;O3YwMzvC5P^qV5sA*a$NK=h{9rtazHt~XgFU}!XsaM>XEKBdW3x4b;{xr z`^HOyvr7?w#X@Ms9Qornul27=-(w)a1AOSk=y}9ak&-t&0u_?ZDmmD&WFOt|7)DT_ zePflB$;ICK;!p&;d<0$AXPdQfJ(LAzz1_TKjk;L4$5mPHvf zsBf=D19G`(iJFKgPmls?HORt+@f!0yf=r>abGAt>6G1tn9HKE?d7W-p7xoDK=M@PklFT8i7>e z_=fbB<7N%F&Y1=dcjxb?f$x7}s&I#%9j)DG{5mMdfsy^`kehNAH_p(HTF3;Am%y&7 z0DlNIZaZ}CS{`#>*g1TqsWXD-j&(nzh23q2f|a!Tk3bcJ8}6z%Lb*Pk+gxM>zhZ$h zUd7S6M0wdoQ}j*QD)!TJaF-d+SPt5WnnqN}_kHgX2U30q3jVA^GJPb%VeW_$u(NmB zf(4S32M;yp>Dqp`P>%cqpD1gjV>X;cTr2$%_W$o>v(O@t;~E7fsSgiKNBZt1In>^z zlM5fbO;oEA_BbX{Z9i$7bBl9^N=xGgL#o)fr!+0JCHDVl!h$L05zM3H>>d9uTg*zs z2B-p)zf{ZXbaXA zgthE~FO7wZCt<+ec3p$LMzG)8Z{o?2&C+)t^_p)mj}+DUCrtVr_3?HDDNmCra8#d{ zqqmrQKj96kJX7RSDY(>*pIh zqe5(v9=D!cHFi7gr5G`SRAoxQS_f>O=u=5|F{d$xwj&X32D-CNob1sb*KVl@%Pm2b zcUX^DfN&eJ<}acUu2STvjYjwU=p?NCJA6Ohi|D5}s+jw6sF7U0P>Sg0$C?EmmdCUz zL(JWYFWL5CQ{5ZtQCx-*h609Zi(G3NF3W3y@*mmz`+~gNa)?6q%icDdo~;q=r`Wnx z!%3WhDR#S$X8atmycCrbd7&?I9i}We)VFcN(1FuZ&+&q?=sxaQo5lzV{4Hu0KP28L zWE&jVikKLSW-;3{8R@DJp7q2>c?5OFkMKO2XvCh@%G)tSGF;C6d;B>xj=72k zV&RdwbY{K3vfxszoAHb=O}0Q4$1Fgp$Z1*M|HMq8GbAUs`UV9H@K^L8QF>Ce4MRGy z#>3JJ!BH`$D9S|v9XO33gN#$EM)U$+CegBWyI+KWl!Cq%oyx4!$kt%TgF7HOLZ^J_nRVJjir$nEF3+_$0FFZT+a>-=I{;^c zR_TQQ&4~R-6e!fjgc6_1NnVZxONgMLc~cX75UYQC;mf!Qs4OgPz#@%}DdpO)p|MT{ zo>3$|XGo^*;>bCtqo{COB55o;g5YHIC39nG(h+bZk&ELJq=t=e(v?IZ=H4jhh`*oJ z&!>PXlPDAV?Qy$e{tV8mjB6Mss|@Ae;^jf~8|s>Pc?vVpdP^gJ^nz(sUtK=t3+<3a z0u3qW#wyq%L!zNB2$yYi0Dc}5iFKGEv*SQ0rCSG>EyYIZaopLDY!lfd<`KGX2w~kZ zUl_!1(ZZSn;M#Z|ELvVRbJW+##%56av2Ys$j<|_T;pLe$FalFE@$p_`jGxP$e-iN`=L+4a;__1&KOh~#Y%9N#UeiH z47qv#UAp+|N)UKwjho5J2=tG-B-jOhsM`w0h3>etO)~D$eY#aac;Wjhw`dxAYXs}~ z5Olp>b>=RI!C1?IaI2Nm*-ykejdVFQqNq~Bh%hB73~=$C%Doil39C*wvQ`TxeaU`$ z)B~d%(D6`+_|~*nsNjU~gcVxC7k8lhl2Xs$D?MoYMF$d>4XXLY^K4*n|NZ$a1>t(d zcKOj2mYVu7oT|krY(Clu)u!O&ICQ$dj??Cd5Z;Fy!9hV*tQ-^*EnhWDH1;^0!aQ0^ zjpZXCjGjmVC3HBx>_TZ>JO>7bpBVY%evt%?+c!g9FgF>Jb<-HBLTbWPu>K~3fQE-+ z+X$7)UKQE;T&bjR?TY0Na|$D9HKF6>=Jd|IIeOkhyK>G)KOa}%)yt0Vj6RcIa2qz7g#JWVJ2_qJ+ zKGS61OJTmhAiHc(M8E_XNB+1P^xT&b6Wbk7oDeg(bL-wC7~nQ%Pi597`eGhD_z?IaYLsT_cH zQ_As-@CJ?Gn0HH${w6nj()~3up7B+3bc^3pzUBiEYtIs?jU$%%}NO9BL-C+|rkr+D+DnBmbNtU-`>12lb>1Ulv2pd$4@@$;BgBjrIgroe#h^<^%}DcLi$!#8@hP zZ&DOY@XkBh2GHO*kJ|&hYZUvv!$wi6l(xZIcu~P&G1kt&?4d7x;Bq2#&?U)^Qd;yx}5jzMM`u{0~}0i}!Gz z-FzJ<1jLVYB4IH{Yv7l!sC^Xc_eC4u^{W(7FBs_}$JDi$QN&>h*T)_MMpSZEmF%># z%y!J4{wsxk;iB;oBWS!jOS3DO2A?mPIr9)ec()Vaw-X10DF!jz>y$-;1YEFz|N|L{43>=nv@3|IRWE^lc0<#$w{8n-pk?HFPuSS=I z%^V9uWH4*)g5O*03FhMO`2j{UMZbM?C16Brh}bB ztE~oY&0~mj*vF08TwVfK-0Pu_^BAB>h%W1S+UhWy@$VkC?|Xo%7;yRky>M)M z1mvVbU#H}FCQa;pChtfW*qNUX3`XZ@31xXK(qjb*;kM_W_hi+N{{s52y>A(q z$){Hzq_m32m5bRbvck*T&$*Ppat~=I92C&n1SRn}m2^U2xxG#Cf1&ka+Rj1(*DjwW z=>V1?;37>hph~3ERP}cO{;6K3kHPEINdOGyyu?(lU)0EY&e+y#q!@{Rn^e}C_95+S z0ukz3HAVboQ-4Wl$OV=*fJTS?`sR4%p@0+=WUoK{D`)lKdfD%IGi?D52auCRFs7A#gS#g0r{yQuU&?MOC( zMimJy?VYGrd5y+SNNZ#bc$Izg~ z_^xII^v&6n3T)TDo}s<9-H(Wq9I;L!GlocPFO;9MXr7I~f6Bi9i6>F@4SwUJua_>d z#K&XqK^M#i3eXq%^ppfi>NC#7)Kht~t0qf%T%^Z({c~K}Y z&pU64X$%kbW-FlDTCyz#M`Tei6iOnD!R&A4JBzhee`Bw3>)2rS^)F&CJop*pj?@_X zWB2Vta@Fbw^j{~JjtQMW@#9v<&U9=-H&)p7M%h{VDjktvb8|!xeGI; zRLcagXKg^>$_p5%>l(1IJ;UB6_;)=7@D7NrF>jfI485QI2AVv?qr?~UPSrp$x{&?U z7UE%hV>;qt6Dd=im+yb#fz)G5rC@z{ve`*OTqe+!&XLo@H~uF z@j184!m+b(Je2!O!8KALF#ug^xj@mYa}- zO@Bp)|APkRyH*+%lnrbt`qd--J-W=F(oScA0uw4v58}KUnW|$)0k=ya`czrbr}xDd zPZQJ|SYV??ewIja@a0byqZ9!cIEbok={SQC7IVaW0v1dX8Pd)s;SBrpf?st>Mr=$1 zRt#258`W9)$ON3x)#Go_@0a*G?BNs|$a;*p1+ zdR$>=V2e1-v&DzyMBI-;QM#lKPY`N*yvD-f;1!n%^RbPA34Vn9HkGgU$O9HAqX*`_%`3 zLv5~XR~71?^i2qNy(bZ-iLrqNMwIa4Pr*IZVQvI~kCPRJ6vv0gRfAs^S%{SpQXMWg z>x%9UG{J}?(g4~GvZmN%L3@j1O;H1NzqORLIno`H3a3U!Nr2uQ53Plu}feC z!0USSQ!J|umAt04LPfza}(sO+%!0a{CSq?*AGqK*hsS7&F* zFBiGJ1vX z%2BMsoS)mFiewKFl&wz5B23z52l`Tl*{58EI(|sW+H~LLGFTb`CXE@+vnT^H!ZN32 z_-{P4*~2L)z(hxls$5omPoRZ3AGPh~Lx90T{fwM+RY;Jrbf4DsMZrNF@jW#VN>NK0 zGI%ilg&T7yZzV3-AKyG3j4%Qsf5BdBQ9GCz-5eNUF9E6{s*`wAretUz z#PdmECP+_9Z-@^>+I>|A!@PxXk!npM#G;w4!aI=+kVD<;P*dg_F>=3@L%2;?e7T+hyuMg zvjh?)9-p}KKRxE)gT!MbPN+e>bk;I(1$3K1oOULWtM8W-0qdJ!`=f>P2n2H|AZM_? zk-zglshw z;8^Q&;EnN^$eT2sd&FUk3Y~#~L_BcZbDhg05JS-ij;LiJ)zrfksd#S8X}A9Ujrsm3Zk}rw5PfmjK>#XFQS5`S*9` z`=7Xbb}bY=rp!Waxnik>c|~H$ zF_pOXBJ8$L{~3Bf#2Ba#R{-w8TnZD#A3Xw28-=BD8G1GP68p}e3V@yQ(__{_JJo1^ zz=W6oGF#nQbUSCJpmk6g30J(D8aMLx3@~IrlVF;^D$% z98G99NS0Qj5}*$WQ9r6&(mdeQpp-&2_eY3T-w@W~M;H%5Q6EwNe1Bp;c|wd}3D_3^ zOMoBHAU0XmLg5)Z3kkUG2x8BbxAsCLsMc@lch_}heu~5T#bqz5J2@DyvUERnUI7gwfbZ_rxdl~ROvG{RL-HEX`yng2T#GubY+QrM z+ed6@NyZtInKYtdorHFjRlfo1-S z4?z?SQhd%IKPZ2RHuYYApLtUC1g#*3`k+gGI<$+vWDC@?W^A&k@FyxrNkXa7qJ82S z8y}J|xATb`pClP{@T>;RAvq)9pC7W2)c*0XXbk<7N2$HOBl!bqKq zKyLHD`VYVTZ~y6E|KI=Ppa1QD`SH*H<-h&czy6Q^`R(8A|7v{u*Z=Q-{pWB0`@j2- z|IdH=cmLmC|NDRb_y6<1|L6bX+yA-$(f_so_qXTUzx@q40jWxCFZW!r_k!S;fUvTy zo|w=0Z>ES|Y!``i{q}sLX-k2MgoC}0-%mQtQ96umC+`6aY}%(; zu6PxwDi@U_`5C5kEI85`~n|+Y)B?_~57_iRJK&p_vt`Y9WbE3Lixc$P9ZjGf|Dt ze0m5^rjfjE#IBr{U^xtN-hY(}1>sO9kaoht;6I0{@}cyNUMZ%UA95pO(6}pTLdDhB zOE6uMJ9jz+Ce!PZ?WZqCcnc%IfL{sM{$DZ;c#rM3vgw(KqO0If&OlAdb){^j-@ljS zb>cmfG}F&>mVsYB04#m~&=btbE0vEBI5Cv4xxzW47Of`=X)bhxy+ zlm<*=ywmzjiYi8_2b2(07;LCLBBM!twR=b-h~ie+U|1is{|d7gl5;ucfm;&xA`&d$ zg>RCOk{bQ8zTqE`H$1VE&^PI5w2nKVexrRuSgvCJn&S`i5T$QTnKm202Nvwxchw2L zx9i;f22JB3WpTwbya#Y2Ze4&%3T3#$ABxs3QQ1pE2=`RkRj|}4Gp4Z+XXRU#8wp9h zMco%|5YC7{ygmQ$o#zDtQ(Yo(B-+tXm9m}oKYzp0kNqvmSJh2zYQ`~q~WMi`g(Wx~%7V=y_?IdbYaCLZ22FF)4zYS*!@3g^f{ z<5pqV(OE>nL$X14EKGY+|UwSuKU8Gg^ZGsospfxv4VL9G+W5&`s3nzG_ zGNMB;EAEFjthdXdaYjGyP0%8(^gQfW6U-Q25!6;ioJ3x83O^aCC__|*?WsXLbrH z;C#$Spa>&)87@5Rm)Gkbz7=e4>Ze(OLN!Q}dCG5wBLIWs;!b98cLVQmcx0n{+u(=-OXO|b&q zL9aYbw3ygJmxz6T=#;LYf*^;5GPhsM;2k|O{T<+&^TRmf7p|na8qWNpZrd;`%VVIn0d_>vi%}jVMhi(3bbpOsUeu zl;G=&Dmx*>xn}%BtrDi7{f>tblAJm8S~YUG)m>s!+HWpA-u?u5@@?7-D$lXy(+Kcy zw=U-P5*_UR@_MzBM=9!9Cm zxnj@^_kl1lITU}`AP0uj?~Hmbhq_JlJ7W59{xc9y=LcWyFL@L0v-!Fj930}mC zR!f*@hAM=?c;QR6uyks~BI<6Doh>GlNF4i)N0C=C2RH(c#V(fNVFZjy#R^OK%2A$b z4z%0bm^4NyOayOEm+dqCT;G)^b_Tq{r!DAmW8JtSj>XDxb1aWeIpgE~_*+&z{|_h5Ew3d zF^{M|Z6~_8`<@Cw5ZyC`Gw0+58pAFY7PZ&77f;;ga&^{VM*%b-^;HN3@KmzqA(fLelVE}rr=Y(GYVgmE6%jmo-A^ z$Y?s{K~JFjFmU;=VOGcUU`4Z+0@0#AE-dj}GQ)VuVJ4t>vLf`6Yl5xx#M1e5CaI=* zoQn^1f&fE6yuXq`8HSTkh2d~utE|QCA6c97gmIucNN^khtfn`C`@5E%{TjAxjJ9bj z;FN~UtEyAbKK~HX;l=NOk4spp@uv||eyFM*fzf7PS{MNP8A#F?Ok$)WC@25U>dQXv z5i~75N_}<;biiY#^2reY(O}_kAY15h$Y+G0#!tk~YlN5(2UoBFq70-y%#c-ogZ&fr z9jWAGO<=dwNAU}s*gx!rIv<@rUW~D)=n=9_J|{5+kFpNyo=9D~Fewu97*R+6=%#7} zinuCn&mMtADO*{S<8$`0mB_Lb*>?N!LXsZmj5dLf&o~LMpwAm7S~%iV^=UEKe!)*rh#!ec)(yE&(j!$~t!9CXz%_xwgKxT0syhq@(eIi~|u^(7-ZY)p&mkGH1B2f2N`4D%A zR|mC95T=mn+mgog>(L9TkI^$Ig$V#>X-8TgSXfT9B;HX|Uu`+*1>sBK($ z5}Tvo`5fd(<3$YE3x?EYPYNSYz|`7r4~P-$xsoKbtg(DovR~$@C8Lr|iidXYGM^(Y zL_TU2*W@yS_!J}wu*ID3gvFMesOX5gj`IOd^K|q@XvO%hkGkll?C?4CqaNNCizt2d zk**xLb0(0JoU8M0X!gJj5^ilq;C(sCt||euUA;#tK1Y~~a)XB`qF5H#WIUb$k2PWhsrnLb#)2O6d(uSniH;DSA?}*e*e$ zwj;NNvZjrAf3OzbG9H*M_Ef0w5v1rn#p-8;{(j!bqTHLe({pSB9DugIY4GHEEb+8L zT+gh7I2O50q}MBHgM~PU)eT|7zVtLY70lX%Y7of81wB*;lxfu?!^K9)1PNCJj(ZX% zVmw83>wXNXjLfJ^!Yn1Z^Q^Q2oqJb#oidF&D%Mg+;B}zS8R*H1DyB1)PrNuY1m2us z%83#Y&1ERoz~4m)tNSpJQe+q)FxyLdF>g11&&irrff0RuL+Hlq;Lf}aX}c0GJIT@$~iv?n8YTv~tfv&aIl>YV{7 zuAj${Zw55MvV^kA!nWh7dzzf`gG;j5dhTaZM{o8y;GLbQqaaO+Cuo?ELnTetiGwxb z*~ow+>So^qNk;tGrzVkVMVG){sUxK4ctFs|P)Ck2xvq2rf#9N|y(PgjQ7B4uMnQQM z&F9~URuLCqbU(4|Y7nPJUdeuUfY9vCNSxigZ^sO)`lC+=I_%VsF*-lwKv}Vra(w7W zU|X}VQsttFbEEsAUXSb%d%hfZ&S4CV?dfP6=D$Q;#9+n8XBjk2`8j_D5&*>O&k?Jd z)2!kro(gOldxdCGuIKmQ-;N~j^i4ojj(hv2E}!1W?3>5@;Pwxdtv#iHJJ84MdvUwN zYW`NZ(*!lR?Ie2f5u!-7n-oNbx+UyfHWj?au#W)j{gknuXhf#IGJwuoQl;nN?()g z#v|OOwZ-IlF;$dBps${YBuSy!Vn1ekxqO~J3cXos9^_R>y?m}lcsU|wA%$%BGp5_= zoiLnEZH2uOEZI|`QGp!qNQx~tBT&-r>E{JrW8%8Wu(qp%KuPOh?IA7Ab&g%O%@bjL zJeB$r<@0FHG`Enerng=wbYr`(AC0;~(=bOGI3qHh=To5p*nmN;o;R4^3&v5AMB4Y! z(ItxtwZfry(>R`YLxy#NEyf59fyzzvyq+EMo@&=8MrJnw$W zP%*ryK_v;|xsh#8{~Q@EIbq5yuL!xpJO{m0sm031J5LDU5_$_fWc@w>Jx9$F8J~Iz zJTaModp)c`L<=SsYa{6fsBz1l!!K{rd1Ai}TKZHThX%znQtZG{CIM}-3sRuQzSo(G z6*a{rfr+)BF~_B-me29=tyul4XY`ME2BCH_VfENWEZX)3)$Ej_{O51(En^DMO!sXy zty9lqOWM*z0KD!ImwxX9b)Khlsiec)HQS)EQIy91!_21AxAl~*hWP#)V;=Uxdk)gE ze(46i-I=|%?mc%uRb>4Uus(=!E!s=F*YYR!dWEDCB7oZSsA4MBT_w9~i2UadN-`;HI3a>4 z_LHMEs%9Z?If^fh!2Pw38GxPhW6tkr(dTp&=za`TVjhBqC)Rp-mNlg*Kcha*AtP?@ zNvEW)W2UGOm_J>yt4`%;%jihc0hoWs8>9rjC+WBt8zx3jp`1xPp3W9gf!f1PizHFN z{_%O9*mpLOq?LDSgQ00)47<5gC{e8Lo)^>EylKS#lli2S^4@cnLN;fui^7Nym_(nU zvU%my-RH42Y7Fz_wB@wwp=pFY+b{YT4T(HyZ6kqL4wO47wyQ}SzCG0jj+UL-zAw)a z_*y+e^DT#n&70NF-MM)Pz|}#7sv<671kPg&_Ac#C57IqLzIA8V1y_oqt3flnzaAmEBF8{B|wFOcVQ=7R^D7 zm7*ScK?j=Tcw@0YJFc@m-)Eex9B$JcvQoqMVlv#4uAb-iN5#pAdA5~(Ug+&B7~ zJXnH?NG~G*eYFIN1jxBOEjh*6Y;d*g3~}`gr?wYvOa`)>tfe_+<~(gb{;@J*wss zMB%;6gO(L8X^K>MefuF9uyjcdup~SR$q;#}2feBdEyPC(kIqF#BDlhrB~hibYAFIa z#QxEwThRGZ+|dX!!&eRJAeT)%w)QTov?uD)5mSCR_;X~IU7KNI7lE~xgD85Zy*X!j zc{SeX`jo~Q3BdjsiYO!-dsDQZ(1oNTV@IT``VdL8FKs?~7Hsf9&Yw~x-=0SzonYNU ztR^|gOJG)AGsqS)mb+C{DOBz|DV6emmlXH##Rw%q0H)XJZZ9#ypy?uZd@1_~3JhEV z!7TRYWN@zOsGW?+A|?wFVkbs3Nj9QgQZzj%&4TMx*kkhg2T_NHOBVKcQA&E!sSfh$ z(6A>NnaXkY7(#9U*a^JF0*NOwj>p67sKqN`*(}T7JOm^+&$vc>&&%@WJtq*Z2K~lk z)v#a=}hVrgiT`n_3r${ua4us2qLQPM$C5W)83(~+tUDxY|+XRuW= z*4bO0cjJo%U%U+STI)c&IXg!Y*#V!pphUy5R<6d+U4Vfw}|9-Ht)kPf=?1>yt zcz)oZR+aiRf>T5YM*TTNULfmK?t0P~P}7>XQz2pW@7d4dJujZ*YxULp?3Pmxm{o^|D-{!&C=z)~D~&0Q`O4X`8bLJPI&>9p zf)O5&+wJ0eCB-DG3OoE)xPdCdW^J~0p6Kv1hVni&V$c4xfSX0A3UGzWt-@cA$6zn_ zfyKQ=nf+RWI>QT!Jk9x?&T7Zk*-e(FOL37N9MgJBR`LOw}Jpz zQW(8n@G|y-dE%=W;Yz5;0Kx?(QXmUQd=1kW+;Q``|E!sp@G^W*?1kB)t?0xuVo_uQ z$&Ai}5n6)}+s0E4_}KX{=O@1#`~OZKXD;Oo-ZKUR&~nOOB||hd5s*VbOO)o0S@Rm; znLW`iMpH8TYp9gU7F5m*!YMzqs&zr=!WP=f%Nsh_eN%0#ssW_fbF@?MGv?@Q_yVPF zU3R#nSJlHr&(d%^QXDTJBg&H`89W@pY$vraMKD#7Qwp7_56OazdUNCXhfm%NrkQitwO0 zfvgDZqj`hW9lcl1CKV)N1rC%l&X3{w^R1C)F7HYDxLdMjMvNv);be?piXUPKYQs)U zD2X8@7BSdcAeZ!Is+Q!Jd1Pr@44Y$UpQs zY_;#nUC&V!^Gq8)Uy{Vzf}W34fL>nYuOl{|glH0ff?QX}Nk+6J*T8)UsNcbzk#xdu z1>b)E%lrSyKhot{jFX?gi69GE8NW#*z-V$dwpfwhgRN8h?0!B68u4i(`JpCcTSlPd zGg)}}kIa*PND-Q&`pQCWdgi-1l^7MoV_?O8=yQlda-i4ad46w*U|tG{=$$n<_GMdx zi(K?&==h2pLf;I49_1drp^Rvl6(SJohfblcovoPC7?U94S9gRpf_~{#%CWym{*wN| z2zonHq?+vC0}l{YR*lW)l&~i@<=)`zJ0b15&L0A2WZA1MQ<7$x+J*TpfzC+lMWtvC zXL*UruRkWsJ)UEou2p%!>14R-bDpD(O)jWT3T+3)#7DCA+}jqEO)A>Przk%lqQMyhTyQZj>&R9l zsA|d?$St-|Q)Oxw)EU9T@J@{s8Q1}H(u;h^lElD_WFv!Zr1}A!#1lXS1pg#TNghDc zthnA`-9)|V?|#ra%c+i1%Rgr?IXko=(WDG&?m zA>Qu#6m77N^sYv+@k3*CM>oFe~BI1io6-{}Erf6aUp@PoM`5~_G-&FV2 zeN?k`=~Rv8No&UH6?+rxDX{K` z@WfTLvl2~s9WH2|-+3H4$^?gNz_iXmS+aw5UmW`MwDQab_i2j2rhVV@`IPi1?BeVg zCtWnEe3s-SB}C9b$PqZq2w|~^qg|S$MIqxSI_kt@*m(mU>+-Xao6$cwlzbCFt9L#U zAN!LrsdF85vFDsYiM&W`3X939x+YK>W{$~(KeE5u%@NX`5JACnDallj1yIy$?q`js zz8SC^pM$_6(l*?T!f8sXreLv**iYR@WGyZBp|*FVXCXSsIZmm1rn6)t?ey_~s6u`? z1+~>m~pjTR8XRR(OU)_^|eh<*}eU4}{7Wi{Wd8NZ-At;N% z0^<`&zZ!9g+_Bqcce;PCptK%=m49!Xyq7}rL20T*A<3VEI1?AMxtW!aH0sK-`sj~< zc1Wg~*YL@}E_!?{08N+FNOQ?+KP4PCi`3K3E2YN1oWv7fL@Vl|KNqv3QW~D11jP9t z?*$bg!?YipHYYUmd{{>RM(boeV|C1`lmcm%*$VEd8ixx)Bb)*o1|sydUyeFjW%gwc z;kg%#MTo}xu!#v>#JRNjM{p{zWz&0tsuSXVYsPuCI4=>cuqRIi0aWF^9n6DAKmg^4 zb<&SH3*=KW(K!<~ea3SWs~Z}uN{RDqqzsy7CHH(&1^!7fm3T&C&klxHH~5D>hHSIw ze|vGm^bSoXorB9GOM7Z}lZ!oUtx#I%UE)?rj&mLp<#Nmj(&PEu-@8B7ru!uxfYl@V zQ8fiHm%SRy(F7OZWD)CD7E#B zA4|1sM0>AETS8TYt{M?z%Ev^Xun}~CouC%|H$WBQVUVswBiOTtIK}0QJ@G4M8%vo+ zR0WJI%UAS1mU3GU-;B?vk$;%dDp1<@lh0q7+{^IFdIW`rsIbPH1Wcs)*Z6a=Lf3Kv zkhwcTqsP%(BZAZs3tJhgznA8TVz5IOT-_KrEo`%@2#xsJ*Q_gu=Kh+&bV^k=-)jOe zTjDq08%pZb$oh<5!`AD9j&l6GLBZgi)}}C0ijJ+ZfWqXbqaTPp>?d!R(%)piTW#NF zg8~?FFYAog0@JK88gbQdQ0;~4h~ac91901-60a%VBFMR(36T(^Xoj0%$fKD;ni+-ldk}IK+tg9umJrakz^g9{YA3=<8`Sy9`~ytDe%y zU-VtrCcZ{(1SZr!2mY+$$t=^htkq5x8VO*J=;7=5#>;|D3!c!@?jte(aT43Fdyi?h zs4=@|o@MQpTqg9RtVQ%|i6Z|-onr`63fnk1MpmIc2Ykh86GlXyr;NfS{NFYQ0@q2Qq)D~v{LrlvXr z-|F}b(dB&OCfQO5x{zm$~p-R z+*FYH98zCGl*e>2&a?J@)|@Q5j$!lC7{tECfQUP0$~heYxr`zI305LUV~;^I)vm-6 zl_KuqE*-}CJDBYt-`NN)+KHl;|BJ>91cf7+2fU<{(SpxXwrmW+*nM^g zKt7oFRKgV1hiJmR`ce239S~K88jsGkZ}D9?>y2fDDP!oQz5ok<7f$9Uc|sxy>fH_o ze(D)hl*i*~Y*|Rj;jSp2_Ajb~kWnki{S|@3e)aJ(O$Voo z-bStBL~ZsQF|rOx`8zhnzP~4x0Tjll6}& z8efqxyVBOF)~&UdztU*xP-2Wj35}oUtse0=u=_u53AqoDfft#j7V+Nhd1zn*&5Pf83C@C^6>3T z=n6%ZP7CMS^KJx*0o{|<{$3FPNp3t&JH9S1C=g|tPXDSAP>h>v(PwDEEK??M7p20o zongO5vdehT_5gGU>M>iDQS>iW)rGQ^k&M`TlW`F~W6!7B9;9%V4OOS98SX<4^4Le! zc%a5lSg1tfL~yjE@UNiJFz*A6$i9Uygf}J;?y(^B9#2?+y zm{H4MeMxbefbK;P@$B2A&r^CrWYg)1efW!;oWpd4 zF?<5`3Bop~S8R)o8effSrBs@EMdqQ-cP zHdT-^4pQ1ooL`Bz{N(Kj7eH>*ailN$N2C;+RA^2YjzPq`q4j0oz=S-4X>VRCmAZXg zwaybfYNtvQr+yTsXruO(maU!rKAE9#x~;w=cZl}hLz;Zx4zav_c7@qGv60-rq)Q^L z#8sd+zznA(nsn9I?N~rvs81L}g7$&St{+?yAHx~~jHZT^cT#g|EUO{%1KdTGvD^{F zP_BzH*T)R@XKom20L3Oef2v^o(8r)xy(u`1DIA}#REg6cjUcRM@kcm84dR*6w@r+a5GO11<&FBR*_wTLYfl5ZGlb{ zLE{Qet;42-T(6Q)3>&bA+L0~v-o%l;E>>Y-^z({DxG2O?DiF>W2@U`T`lpM3As^9Z zKFp(v3LmH(tB;b5DAF$FC}s}wpP99%w^|F84U}F=TTe2hhyr2D;|L)Z)gz{b>bF>9 zxFos?`W&Qqlrv_K0U1F{ryooTBQknRP8-c}6I?ODSlsu(+q4(IbWIG(;CRnVoj*cl zFo*lh7#!G^*8|5Qgkd^171e6sy#muG>7LifHA7zUI3}?gX2leI>Pw5F53td6Gg0>o zNq4;>@~bH_%P^RT&R;ZQZwUzIFit>`WJ&pR*B1y7Yf|XyPEu5wm|p3l;sm@^GUu`3 zZ^E3FKP`LgYGEz!d5m^BDusjf;<>3sji6g)ce?H3cf8MF5!gbYUM3ftiqJD_Z)MGJE0n5?<_p-x00 z<+14!x5yICq8m`A{c%_KT+7HFLn1X6vd6q57Bp!c@WOcn&+wjHRV-Vy4e7O>tP8%z z-jU13F@pxpduo-xG7SY`9Ozh4KJ!Qdhr^0erb|HleiC+&>rB&qbohLbCOUOKNx!pq zAS??#hllcP6&*s6_LMRAT=zuZMO?mzI$5L)L(<70Y>ovyet`ZWT0*b^;3k1||} z;I1fAjOU<7oliZN5oHkBqG0!APzV}$De#|2JgM@-fHvvzIp7dEE~}@hF~~On%RF+_ z2^I3RtoU&HDoWa52aO%DReuuaEQ$r{-!Nj~5IE^a8UgZr*a4^%4bEzOefI0|T_{N2 z)0nb2_EL+c5Pyumi(+bOKk5aCt*|6xh$?~k;H-SgJNql}>`$H*8mJzzH~@u5ISZPw zk|`|D0h{nnlb0j*rN%%S+V9L>($9Bc-+gv`9@B^HhUQ0QCD$C74u55U$w4_m-~5c& z577a_Fal8MAs)ncL1!7Y!tOCt1x<)f`Yw$oNF?_v*@0pODv+8vg`F`2yJCP7G^Q)X zPkqH0gZ=mPp0oJ74~Y`k<&vm9m!aYugNfXSQU&`pkDxG7PZc4HCXN#lC6X_%phF)< zv#cDe3Mi~_#@{a|q^%O<61Krp+SdN!%G!P`X{McBMV3JbsQ}>&+Ij355OUb_9C%Zn zf;tQZBhWbE70(#QPPQH+vW^$jSCsdHDC5vGm?-DeQKz-AACN190%4zZD2wVgvJ=L- zqgR3-*s0S3fr%Opzh}WBCA)P-HU;bOQPb}cJ+_j!LA|%;oPGci%80qgu)T);aFBF8 zeGPkI1ob)Ev-=I78bN&~vNiTSo@!R?eaaXy$?c!a>Yh&!fQF#UkqbPgJ)Xe3L)}ly z?_xOY*JZynzHEe9l1ULim`Q@Wz)3RcvSD*eht|*Qz&@8s-az!a*N@yfe6A<;d7 zt=q@!MUd^9?h0o`DI?Nr;sxqs9y&8DZSD(al3Z}Kk=3=IXk@tBs3>JKQ+?{>j8ui* zYXHWJeK3d&E4Z;_G4XhhY{(l4P86Dh#>2}+Ll{6AMR1YgYW;w^D+Pw;C~LVE3K^aQ zb;T|!%W3vF6fJrEanRh`v*)RKXv@~5WFf)Tn2q*T$!h-aS2$bI%}!2=qCfXUItw!c ziPTxCeVBPn^r11*fTvDLvAN+3A51-qGM4Y >dhEsr~8i8S6S*pluZar9cGo?>C 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 literal 0 HcmV?d00001 diff --git a/logos/kubernetes-cluster-logos_2.pdf b/logos/kubernetes-cluster-logos_2.pdf new file mode 100644 index 0000000000000000000000000000000000000000..96d03e4ab41bb71b540d447b8f663db33f057bfa GIT binary patch literal 162451 zcma&OS+eU$mM!*QW;KVfc=lwHL7C{gP-Z*>2@ril03@1c?*lE-_W%J*O&=P9J~RVq z0GfjQl2MtFsjR9z*Uq`;kie!l+qdt%)^hw;i@*H={UiCW|Mma=fBw(^>tFu`{R#Q0 zkE?(E)1P2HTcR{tqMtDEnhl#*YwCw=TFPt&@ABZ=H2ypFoEWK|MBau;4X3g?IQ4(6}__gC;W4ndkh(T1@@c%_3N+ynsw=q&;9XPzkR-zb+4uP z38PVrf}J&9e%#>e8vMEQ-&*(Uuk$ixQTwm|@~8i{4^dKQ%TICkD!V`b{Qv&%|Hsci zmFb^<_DCJkhig`p(m7?$X}HN*Cv5ujfBW@c{EX(i<48Py+Kfdul_R|YSS(b$n z492iOfGhqmAKen|f9U4_@-^~rcKB>grgB)yzWeEi-6-zY<ec%o7aX9=J_W|DVC(y57u3+&j{p9w2 z^Xu2W<)&G|n)>nTPuJ^D82(4(r~g@xlCoR+x%glH1pobQe;xC`TFm%p$$kZkf&BwQ z`~f3eg!u)>fBF3R3xfR4$oI;>v!VBCnIHd*jo)4Q_cnfuU;mVq-(UN8cHClZ<1Q+j z`LllivaCJ}nQNB6ef7t<{#c1k`B{)dG|kx$Fa7h+b~g9xlw`l3g1;L3;bUN>{qio; zrT7&ism~Do?xnxB>i>UJk(IAv0mDuF^{(Gu`;TtR`>BnVUlmIb|9anVFaAgOl`V+l zzrt(<6C8JU>QJ#?+=Y7y7mX8Uj^kna&dm?8*iw-_BawZ}yuRujN8Ibi;2?zid|fzj z{f{q!`=9>H&i!xP{m0GV>&{(Zh~W78R>zpqaH9Kpnakmrlfj#>yKvzi!sYe2U0$_# zxd+Pi{Sq&)m&S9wdVTlm#~^>1zhiNq6KQAizkI(1 z>GDnto+x-v1c<%Z0zc>7V=^WpFYW~0<=%q*?J_6Z++DXp*90z- ze{@p0q*S`@(TI*_QYFQxFAAD3d^V=z~~Xc5lCz*5zaHu}Fo!hb42hkJlzN z_tSRkQ9T0Ox*CsrS5xL`6zLSa0z*b+VlQPV|2 z-@7%DhwiE0uwIB2L)0#F?2%i5+i2RQMCK24E}>A4n?eypQYp7;NgPJiL)V&gp3RU2 zZTK-b#+`y?9jR7>>a_z^4&%7aQ$%gO&2cj5zRX|lz+LWva0Lz#{}|gs;4fFf(I3L? zVH<_~3inqi93O*yEWK~KWD|~Yy*-sO*@RQ!ZT?k6&g1aPfYz=T+;WUe5ng-xsNb(o zmz65KiDg=+w+GIQ=J`He!^a>3S!ba*^`g5E(z2U0@Sa2L-_XoQ?Ivu~KJtbs7ST1v z{GLK_?bM+0ucU4?R25|W6)}>yTe@1e7M414^7_Aa|U54Y?0?<9vjnO?hF=Zt7v68YDz6S%W-lr zIfKCMNzN!?aWhVtvo~5FgCjaRLzrJkYguUaLWc-e)6$zrDPl-T_(4s^6rLD)QR&>< z%)HT_V&xI5c4ZzivTUkzzrT6ytg^BD7!26GwYAF&)wSNKaG2A)In-O#*I%0pt2oJE z0(`}p-NRAmPK)gF_DhBFDm=}5GVBeXwhj@JaZ>skWMEnfhzxn9L)qYD1GnX9->Hy{ zwnsX(7OHg*Eq(8{Xk5ffW1AB~vL4DEE9^qw%sfl0d6xFEVuC&`6pgz{Qk$Wfiqx6(=8quCU0G zpY~!xFVDQZFWYPrVV|Z0aa2TY+Y-v9c<$qyoxal9Iq~X{P`)8IS4U2ipPy+t{r2Ny z@UMUV6TfBmyd%kK({fg#l;~V;l3AU2DLb3tWZ$(MEiT)R+k!)t*|ObYi2kjX*QJ0u zmLFGS9&R>&s{9d7%}HjiADc#eAkpJ}*mvP@cb&hBj?M=L_FXBy0c(ChkU3vx0-C`x zM69dW)j@K{dCkyaW%bOn+;T&l?vW%Jcl&NWqeqSOgQl0o7CcXn%&>PTn%_ye98acG zi{6;p?AGKR&CIcOUdW*W#~(HLqa-Ni+$zAkc%-me4yzy_E@aAZYw z?xno&T;@Bb^FIbFC*?!PvSdqcNOjayn_hJ6g$rcuP%-a z3rw;VR`%9*%f{tn)Ps27-M%f1RARExy28D?1O>WEP6`rLUH=&D@A5sfuG<^sEMa1_>=uzP{t>2EzU)MzrDP12@Z#XB zVpKZ;u}{}O3-XFo&sPJ+_1bXdX)a9;nym57$Si}39Hedg3 zr=mYy{>#SopS#(()M-Fqbxf<=oYxosdI<-|KOAJvCJJKEk3l-QA`ZNI^{NeTUkI9H zKAR_Qs3hfZNoMvXB${vbJW%E_DdWL5uvWRS0^%V$9c&mC%7l-j0>=NF&KYsmmsPcw z<59!6#cyyiS+K4~C5hKmt3YRihH{1r=-k%G?zJ>##z zcLTy!Y0r*GTtZXPlC6vyPXTCv=7dQSka`X2_yX|H8!{F0pvXPq@!AY^>#w)jptt}+jh|0oAWX`gbrbmIGxPu9{?^)|_wF`6W65%nG zgO;__BBEVt>=zB?zb#Y|J(?-x(graXzaY^IgQ#P6UJQ9f6$uDV;7fJ&wD;g}gsp|d zPS(hFkFOEW^3iH|ulByu*^A+A@zcVEn=VI0qF!^5$_rBXm(0)$DtbZyJDEb!&|QrZ zyn&$F!|n85t>wJz`$*e!*<23L6fzD^YZ1as`xq2_DwAs3o!@+6V(j){ND_;Gzd8OB zyWww_d<=p;HMw7}SM@~;5{P6C6y;=YkrAppX*{zT}DP6J^m6B?mERIC53g6zU}snnqAet0*Acq zv-fy6`$eKi5=W~CeL!77MDcC>8U*<^K2!UoK1VKe{hEYibXxqZeGtZlmqghb^~|uEM3)ZB}9p(7#%x%gv9utE98!$;W#MNK^!9+d*J4s}7Pg(^uZl=me? zHQ(gT%niSzLHK)C0hJp(A7aLrKM4shrc3=$ePcLeHNT z{w{g?=lx@H*HS*$_w#nqbob8jNnI27@1#6Qk{n=jJJ3PNaO5pLr#&iXHwkXmrrnv1 zEqR8)y_&urq(MTZg~1vdzrq!fZLFe7Ci{_X^JK?->y)NOuO#7xvWh)q;$F7IXdI}; z^qtuuU5H5+R%ZPyi^mxoyPE9cH6YuBpn}X_j1qPI)Iu=eNju(ry1d^wq`x`VBhh9a z$B*toy48NPm;8G5GF7_C{HBIKnh?*M*0n8#tS6}B@ak%IpiFo;V8z#E6Fn*NW3Xbo zX!P={a@=k+>dD~ae|#s1yg8|dN=^)E55w#td?g%LQWxIo`yUz5s~Y(xi+Ksev|1~@ zhthrwDszHQT@y1sT{ z7Ee>xUa3Y$_mO3oDQ>n&A3rUGp!f5|0S{e3s}Fl@rXHd=*v(M1Kn@fS=R$QR((U@79yn zB0t?SZ#MAQRN{=V!yvp-dR2~feosg$;e}Qq3)<6P--sPNld{3ob$|Y|Kgb=*+WElz z##HyBR-LFaWs>9X-$@bm8!o|@BmqgA$hoIz!-a&wCGN95sTO_)|j?xD@wJ%@wunDWM`qSmPWQh0vY(lVAD&h5LyF8Co!y4x-@HtF8m9pVb z`B7S$U(+W~)}8J(-q6^*;}J0-*AvX~W;#M|{9}-vi*bp|_m%93^g+x5Q?PP2LeK5c zfcI5l)QskM^*p3;a%#DV_aV}m1|YRB94lZ|C-En{F`Ohm44OAASmkrqjkoOtyQ{~(luW2uwSB25e7tlD#Lk{bV5CFSom{6g@-nM6>K2)t zZ-8~s2&(4PT(C7>z3r-)>w9z@010Hush(jU5X|GeN5NgM?zr0J*o_=mQVadrF4kTo zj@@v^ZgOM3`gHlQJHaXAi>)eUWEmqG)xA``jwm@1=I! zJr){dg<$UhsJKj@7VcayxFtD8x2&I*P6fbE&NOnU>#I~^6O&3Y6>9`Rge67ID}zy0 z0#Z4(tPZ><+Ug|<>I+Wq>gDm>0uGg@Du{%dilA_t*vA>CvD9Zyk{=+W)6T|kziRc1&w&km4 z!&95d-@b~pk>^>XwA0AK5N;GgURISp*lD97r3M*^{kn+kfZ}V;*%cVQjhDsGzxy(K z6SJ-JJb!qZK8QHg2mq;o%B&tldeLXu6lX~z!|S45r{Yu$HR9$|9E{67L@`Se1shZe z{17_&ccp~n_=uD67Qf}=Q3Qc=dleR;1Vl|9`t6ZA3Hl)F_C;9=NLnuD#Mu%{y>6i@ ztQI!%ac%%elazWYe|);!`bgIw`7xdfxgkow1Nd<04@)$r=nleCx?j$#327k25H#y%9a6Z?c6ub*?ME z^)Yyd&crXMj02@dMxWjYs&x?e0=kV5D}#^mwZIxqM!2^f!%=r$#?+uVH{=7(t>5+Q6*e3;!~73!eCXWm{jY8k8Q!;{~OOH8}PWfo=3 zim?fB!C29DC8OG4Qr28@@0C??xF6Bq+(u<)D4>sXW1Rw;mxwFn%Spwm>s7Bjx+P+V zV*W+gU(u4ZT~W&lJ`^}v=j{+jHxYV4{wh&+B@M3o8AJI(r6Z>%0tW#<;QQ^w&M0kD zu({>J0lVK~0ysJ-Uz6OA+bKPAx4rC)04r!-W>WLTzG@n2 z$vK!jMJDfWt{+)nvEtI8p!exTom4kEW}&%(K+`)6NuEkiW@}jw)~2J%?*Q6|pFz8j zxvPJ3o6d8~YVX-AGrwq)Rk^f4DRM~TQ7*0GZqT?4AQ4Np!tBIDiHwv^qsY8s@*Bms zQ`Y`2Gyja?U+~V~z45!(#w)r#o(OJF^h2b)TBtENM-Yw6T~|v)0EW~7e3sn%aEPxT z*6c~%QVjg7o~@z@>;a00=JjCaYB8COVn>HzO@tyhVcNC#{cu#CxHT7!BHbD_Es1^f zJ4=T9?tBx@j6Rk!qIQZWXT9L+v@)4(Gb~Sti(2NzYCLpl-R~ zh_0B@%iIUeP+=uMtgmCMQxcU-Lmh&!CC62jg&5|<2blR&(il8$`y;kTYrQp7(d$Wi zu7`ULJ&KYgGvHZAg{gMa(!MC#uVYIH?$@H)G-Q6I=s0{)lBtV<1CkX|?DtOLN(Iaj z7IChWK~j5{-Ebc{tmj?5nKVC|>m!|Fuw%;;h02%hZOGy!w*2@ zxp|AutQ0?ZUxO``##kjhwD&GoLPm1{EL6@;Uxy>KraH`+6)nn2syX3(6!YJ>zp$Nm z=1mQ~)Hv?L_*V3_@I+?BxnNIUx|I>FUvnw=Rb%fQqg~L&I|jDyZfHV9O&54F|pQPr3+uI=e~bbsr?V zM0vL64Ffx|ynNrw;5u0ui4~~M6msqN-%Vmns2kuQiyAAAomPSagPg&4vp|~T( z<0(JdHeqN*@D?-%Wsn4r&BMPfdY^$D^hKG|wGTb7|GJG;>d(|jFa&^6hFZrs4>jC0 z-}Jh>b%e~b!>a1&1-qE)*#4-GIDc#Tdn_{5JmHVYL$|PwJQZuZ??zuWnQ?c{vC>8L zrA9Tsl;hPsQBuy(dPTsP2k3A;?9=BqE!lhKrPy9#?U(q4av6}fj26rZWWRxJ;NyqL z$;uv1Ic>#8>drgJkh@R+hhW590>M;YaiR=4>J%IcX zpUzWb71(gkcragf^i7rq`VELVW^>kyFtl8N%7A-FPgF%&25sZH;_CwdLWhfNF`HxS zlLz?3PTW};R?d^nC`>yYBV4P*r#>yrx5;}_m#*w@sqwOADc^B+M)Eihk>u&_WzSSJ z9z^`3P4_y*n~p3ZD~W8fUun@}K(#U52*m@8+x{^qlH;u&J$2pgFWBl6N}6$yUkd6#-pk50(X-`iavD;DE&ZIbIAQS5HZh#*Z@TY~*<>(Ad zD-@y6$~)vA;TuKXYD2yD_<)Cn9<$Y3J1W(v=bkthd1zw8bv)J&hvQ`VyNJR8DB^!ZFyj|2eSvbITug+qRN zKn-Wzjl*nV`OBIC^wodQ0cVYwx5F(2rMd`XrwzVVdf&P$Ct`fF2<~#(JHekOzxC%Xt?*}EHv2P&FK>PgEw}ZiEc9q zP=Ki@aLkX=22WN%&2*|s{63z2#t>kz!3D}BSiL$R+UPb9&E%TBb0(Bl?Zx&m?(ey| zrf=#(?eJNV@Q$S(Ocn$TDdd?i63j`7l>uD%V{oG?x*Po#Kj@r7pt3!-7GW22gQt2q z1^LtkX!M1fTo^Y?@HDrgBZNR{kqBm{R48VlE(0YJwUgbRw zKRWcKWhyZ^oE%S>D8IQyIV~Ejnk=%hSH}aPuI?yRY}^B@5`d;{@i$olg?z?z{Pjjz za@dEr9AqSwq?M6$dm=vRf;wkIGuj6W78<~M5igm&JU#vqOkl>hI#Ql&u-o&?n_izT zH`pc6?w6;Fbj)C+vt=yX7;N$r!LTii%M&CWjxsr@aax)b?J7E`@L);$xYh~du(myN z#CS};@f$b#rV4VHLv)ERo5n86C2{NXxZ`!r@V6e%nnjfysrDS*(VpuB_Ca;XGw5j< zZzOwQQIu*EG~$nDpT4yoX{c1z+~ln<#iKSB>psLt`NS*6Q|mc-deM!%pc7!E>um6t zIbDWW6rBil=vBFocPd$G?HNdwr+nk#v`_MKIEuEvbTwjQG$)GkA#Ow7`o7x_r81seEwrFQA0%; z(<2++{WFfxbpl+F=G{oLo%XVPtb4Bl>BBXt)S%RqUJ;!1H5~RP0+dmG)c3}>i~Fkz zUN81zkg55MxZlxo+(2avhEGJv#KARNmWj4WJGH+$x5w<>ubV61_q}3eZd(CVZ|S25 zswnn~SPvsXJsded23-PvtZ^}3*JJGQ5VOLkNCNOVBnY5=Snnahgq>DM27AvQn~HUi zm);8G0Qqgjq`PU`p!T-PbR+ohS~g~&zip?cJH%uw$P36e3(>T$LOyyU6%T2T;-hg& z5q9KJ(*&vtaTBUAm&Vj?mZBA?WqA-s#Kvay-2=*3rCFoV^_sXPdwtFCG{*Ixd z!N=qt5@2pU4~Gcwe**TE2jCYtOM60(JwNZQSY^*#!^-1u0NHJObv+iLSY0jwhjND7 znE8`T`cDf-;9zZL@mC2cYxET3zmU6s%j@pic|xICWe?O5LvLm6#_w+7USCU=Ln?8* zxY)-arm!>Sy=eW2x+JzGpLI(htl9T0%p@qWPL# z0Ah)*C9UmIo_sObgFdL(8cEWqj$ml_B>cdHlmXot%7)VL5j=IYQA_D9X9kSQ36cY> zm^Cf+4m%_q4se!VDxf8Dzq4$RG&-Puc}Z?6AE%t4K=tJ7_`DiXB(0I*#mB+Y;(X%L zXNPm)BP9{kKZgA9(*lsj)KMq|Szms`9C+`QJb<9du*5aU7DP8}sc14h!3o3GgqX*= z`*ya>5>>=Sjg#I$DT6+@lA*-iZ2MjK2s zRYLE^y`wGN#A%g|jwlLdu(Gxtw*puNRE*}c*JW{^mID-49`Uj~GrT_QJBnjLp0)#; zb&T|_0)k`*kd#?b`@p=9w@{#NtcPn_j?XM~>>(D!f}D^&ePT!S1|pBr8lC*?=(A+< z{h$$+8P?MmSjYXMA{^D>d&*+G+$IyJa~P_G9_)h+9( zMQCP*7r*YEHjetb zZhO)^pDq+N6e0+W6GI`u`tMe zP`7rOrvgep|7Kr(D8J@9>MIb@IQLOAkuVNqO3@Pnf!r~~ZhPPvLr*Mcn)?JPWr;f~ z*Tbx5_1#|>E*V+xf?@bG{7yBA-478m zK3EMoj}UsUFX%au69kIvb=v#tc6Ms=zBQQVI~Vb0gJ-%8D#APn8p~2zd$6kjvBp8ZP!EHM08Vhpr=U z5uJ#C%f9s68LvXuz5q&Ph#Q8m=(9Dm&!cICUYM&59GlS%onmiJ{&w? zEi+hUM}NH#bC(|B7e8FoZD8=;pM`-^flv}~=8*UdiR5v$lpfVhO_KTXdXhT%*!bgF zAM^5Pp2?&=p5c$5j~#$iArI6lzoo><;@(*=eRlB@<90tD&~aQ}31ouGbkAG;$wSP} zY^IgcJCZSMW1{SKX)|BL^BJPL*^CStPzyu&-K46ju93Z|9xHC-#Y5;A-G8$4U7v59 z7xMx<8uSkqoatcBfZZDjG72rs$$6_EfJ^rn=DC}pi~$k*SL!woQVt?4AmV`bE?EJ< z31ErXL(cbR2z7!dk0mFwFgnU_GRV*oql}t zh;PK!x`qN02~TopNA;-2A=g28mCqsUJJvD1djUjJ7URt6J7t~`=)M8@`Gk0V-mfRL zy>qw)ZKudqr;GOyz|v1-*^#ymx$cg zgJjrtg_vsZ!SRA~4kfcsL?JjWd$^xW?NX1Zd`y)G)CqPNW(Dfbt-U%$a&qTvGuf&u;wTWRBlL(S&V9R!l?pC?guGT(br~Gwt@&wJcFXV-$8h8<)s(wKqD8?itSb#tfq-0uYykW_}Aj{$({OhZ8 zFfccJSO*Q5U+jbo}h|r?l+(khY#%J&@J-(M{Se*Dm_;Bh0MAK z`&$r_8*F{ah5fXm49r0Nbe{1;c{@D4+jO4cc(@oh+QLjt&tDb-3cxe5EUZEb26@9u zd|Cj!fBV_uQd_pA*V}K3al1!vPgf2>NO`C|v^Q4VHhU1f1sP4@J~l3GryqKiE2;%B zVJ3?$ZR?Vq0+iz|S}r$P3*U2XPY>zq*xqG$OxOS@wP&xJxr>`ddv0j7grh<*?T)$l zVL+f7n{>wOB2-w4Q5dfGvv(H=+h>@_C6LQFce0+6ayv} zQ^PFWj+~hRr9wsZ>3CpS;z>H+9}+MHQ@bhQkw?|0J-thCcVL7C>nU; zDQd;>F&M2qsl;Yx$_T)V(L3N9pR#DG_evL-*S!Pa)nV)FU0&|Yf*E)iC9>8*3_ss{ zBjVV3q3`GY2u;=cF1?ms{Kx$aS5;DLkmV3@c_EaB-<=;j)Y}Yny(na-I{9h#BF_vu zsg?SU48aKlylW7^W|8&Es*TZpGuSGRGULhL*KG5Q2C6}gTV3T=*`YQdwhEQbJcJG- zFzkUi!?@kj_TQD@e!Bd5_boAW`hW(=9s(}1@^kkHCgK3V18~SQVT)kZ9vpn$T?lA8 z0A%M*63_~z37sO^{LB`()=2*w54)9~&RZgj9%`Y{F{(%tMhDoE9V0a90q^6=GI&~NN5LAE z0+}HjS5bGr0;Ia!U`0Fj$t%5fTE?Yk2PFY=1aWRpU4F5E#%d>8lD{y^3Y@8F_?LCN zTRm{dj=dc=a0E9pa^dlguuLEj9Y<=fgsN5Ew*9&BQ|IH23TnV zup@U2oFoE3LUv87+T+6o=RqBP)nCt;BV?T6;U{avsKdZMRi`EKs}&Y#|R2- zC{S!T6*K&vNrrs);7fCOE4BwaI{FZmKetd6dP?_kc+e2QIIzwaxA|M_lr_Erj%sh*}M4``41B8%tsU4Qtq#iJdEYM>a zq!6gehDjn^U5U#la4vbjfCHSo$w;w0rOL4PwVYyzdz#N03-G{?$%W{vQsqX=iSAvryO(8S~>yTGlbyQf8@ zi2wsfb1FJdlB!q=F20Z8KeyGGxPrRUX_&4{#R*)J;KYQLcF1p#tzaNyzZ7Tw?d35EF?pe~S$=7t-(o{6RL^Fm~0{{$y`3jjs4 zm|cDxn=lLsr~-0Y>eARMkEV3Sa~43s9K2MZt9CMQ`Zp91Vp3uk2&=3H-C4_?ip+P> z`)uJ*{}|efwYctAe@LDZ4kx6LDviY`xeWvtw$?eDx>UoBIe-|RQA$vtWy->xY$gTVD^AN102jry9_j=;0Gbym#39 zPatuIb)Q)S%V3@}&?nA7F2$D$1Xdc~xO?)vU<5cqv9%!xnP~D{>AQUfUb^ngx6$&lY z>ubEkU3YBsa_@3_et}jO)G7jqSJU<+S*9zOGs~v9R1-(TWjH((kDVd8 zZ{Olk*oUJE%q2jr0U0e`E3j_7fK%qvras%Z{%S%az2 zUb}hUMzu7zi)Vh^=56>Fe5j!#_4!Ln3{0s)WHssf43x9yLfE53=2>c3Mcu87yb48e zi9Gu$l;aPldT241x?K=JNczoSbwnu-3Y-rmUd$Z9$28L0G<7=<+l*}6jp;+@htm0t-|-5Q|Abnb%)k| zy+aMEfySIQwv1dWWDO4J)e1`mo?jwTQRW-q1P=wokZUP^q5CqXpLhyDC5tRXd$?LP zUmL(*Fc~-_biZ{Z?ydv`igFOTgd9W>x*Kx9=YZ79)fYGey9)Ze+minL<~IBL1xJGV zjGBxVnu_LQVkpuu02ei*-RZ*8@9l*IbflmK{VE8jBf1{1xDvVvj zcx1YD*k}p}mqUvUF->CJZb0Nxzh4gisH<>E2XLHs0EZJ6m;?L8U`XKE3Lk^Fr)KMt z*E4E$Y4$R41!lMc-IK5iuc`+!gj>h3fR!f&8AL+fwVmp)Cu%ONtf+hoXF+@1ykNegH$NH%{H&pq zy@0(-zVyIoLUj*b&`io?rYxAOQ|XOuY{qNpj?bo?m`C!B*tA*517h7F5qeOY>%2pr zW32_CY5idfFA)2U^>t7@I0ntC_2l4<)q?|sw!u8&+$qGA?b*8yPIm6-cMLJs?-Iy* zwZZlTAWxaAEE{7pw1Jb)wQ&r^8~}0@9Lr)hX;^JL9{}iZF7R`&f9z@^I2lh{Gkv|A z@;8IMXx90F_0tC;X%lNHaHKQ7d)Kjf2k(IdV+2&|{M^f4SNVE1ck?D`JfQ!uFxe86 zI-iF?mC>LQ+xgAD7!(HK6|7M$B03<|_5kfDO0tl&w)z$#+SzjDEbO@3e(xJ}Uxb0G>=$>MPHeIOaTMbELJ z2M_4>dQ9&I|2cvaQ8_LJ)p|8ba3+?)R1=UXTK(ftlXCgAP|_`MZV4s9Ipr+3G^Ey% z$UJ)imE6wo>{2$lY>oPHzP3uJe9}Pko}vwj~Q$nNgJ8L z(c|GHBxgqZs4AjkEs5h9>AC`HECL)>(B7v)A~emVf?%3PMhCl=zktI!r*CP=-NC+@ z!xTRkT2ukIYYlyh6Z2)I^BXhrOXsIGm6_U=yI$Qjf+ZVSXF$BOkZ;!#c>{RPt()|< zX|G=F#!T`}I6>4rc2_n!z(qbipKw_*@B#H#X`+H%R1i)!+B^h@$cn6i05pUlE?|s` zc>y|0T*NBY%)oIz0luwY;RIN!%jG#jK;?&+4gEL*{n6VL!00eDcI?9yD&+2y6(D^A z2sjpOv#*CaJ3FI!I6zXlM!njo_~s<+H`WZ+wCps`Fe>w#MwtUB7}%J9QhiX|p@AU} zz)(4cBJY`fcqs-75C9c{^UvV1Di`FU;y-G;7J5Z4`#qo1Li0&`voc1kDB}ZD-~c7W zM&k0`A@F1%+Ce)GJY@|9yA;cTCt^g)jZ~MZL5U+OG%#sfLDj_-X5{gUv>#T)Y&cn( zkGl-ZR=~D_UA^t{l#GC+|H%`sV*!r-4CBWSZ;cW9wR3vQyQtbS?w_W+lghnTY(vmP zTPVPpomM(YQeRKQy-z%z~a8%jTLYl7|41we=q1On9X6 zk3nlBg46aqfR@J_P^Rz2hKvCJa2yqgN`#m@FPpbjT?!sCBmhc?glxrx4f}AUVEpcStd39)v|hv&3Gh09ODssA&0bUu7Mz-i zwkOYD&y&)(X7Qk57})m3dQ_-6ScT(R0H}|-Gx(y}L-U)#g7QToEQ{hL%^Gcx1LBA_ zWZj!ehh`WUi$$aR{#KYCy}sb0)58S(I4r%zQ4bJ!9N(A86q=t?DW5U?r_QHTa917q z|Hs}}M^*K0ZIc3mAR%3XfP&=V&>`I%xEe_qGHamL`Bc<+flc90g)(q78IF)k7~ zL(zk~LG%smt#y=@cm-9#Kz4+Mwyw3Ly|k);sMx9H?87ix+$!jeK0#bIhHQZbwJbc{puJ(5P>K^uTP#rCi1ngQMYH%A51;JlFSPO1o@u%kK3Ly2ULfkzBG}Yk1@?T8{ z0sy)Q@Y$)mb3p_Z6r9vR%7SWcUb38a(tux91;F$&cNTE9<+QhhS|~U;s9OjsL4NI* zfp3W|kYy$S<+T9vq%6F6IaQR|bUiJ+v;^$9ENtbyTou%10i}`2du!Xn~4(@Dva0e-{vnHQ{lP4HReQoi(kT zc@0#MN`SvaRSxJr<{AR-0>9#5Wt3c$EaVjcH=&fWj*E)94A_j@6(lGJSJME#m`*C1 zf=Zmq(w=rsFaXg)4heOX0FWer-MF5Mv!)iCpss?8JPbI{F)*-3{A#ki69hO&ah2D0 z2OMISaAg33#7@v1&IW{=szB^5wUqg+1!cXo+}QrtVd?T~N&G+Mq=EbiFc2wfZEeAe z5R~TQ_TV%Jf|j}69L#L^)cASqED&A>f)1SaNC6ud;2GtIIRLS!mYm>Up>9Ynq_Q&L z6VR4-lIG&%;@7f6@>w`)JMshTYal|$3!%X2pac?7=C=UW^mc5T0zh(+Bb%-sr;;m@ z%Z-yyo(+JHwczsNljr-TkQ1q<$!R7i=iqLk2Ba~&>Z$7SII=-`)%4s2$yaKaiIQ9Dzf)el|(d*-IH%mu6qk<8&3q(90+I7v+@7| z5KBlP43OX1nimNG0tv{%-JAqK4j!CfZAm@{PI+ffXHHK+b0{|(AAlLksi%bG1-{Mt zZh)B-lz&aI7Emt>PghP$GcHax7?ceGQ?p@n0@CmR7q5geFDDRiD=PZ?^ve4 zuKpe3^rt4Fe~O9v1N{|%`xR3C3G*z*{ZsTW7yc~tcS(7`rC{x1Z3cutIYS*>0I*az z5Tqg|3$=5B|MB#{5c+r8AV|2gqcZ?l`!7}fDe*t`s6ah_v_R9^3;rKsxQhJ5Di(4V z;}+lmb93|j0J#1A(x3W&K*RpJY9+?a%K_ry72p;8UC`P?p_YG<{sk}le+6Ru6KYw=0w_imY7ZBa zL%3Q&?b#&}2-_bO2Vj{0y!U72|Ae#sQ$!YOZ*AxKn}WYS``eBG?P+tk*guvk3k>4_ z(aK-1=nsp_S_9D~|6p|vgsa70oAHOtKdSn7{z{9FA3!T)<}f41W9D*qow8!+9<30eNY z+W-09rQsG(H#=AQU&Yh^EdOVP|0?v4FaC#V|J3udoBsmm{_UZE+VTG{4E8TcSVIlOhY5(;8Ut0O=zBIzz?FUf2g0z^Mn>9>`8*F9{0*C?F!Ge4s zc0m}g1-k&8kDna`;)Qba^K$`6U%&9bfwKSd?ElcK-~hl?IGDqK*DJ`+1w?>D`Pq3v zeBA6X81GNzJnUv*3oaP1IgpYM=KtA|0KI>C_Ah#YMhOAz5HL4$xbtr)@&K;{y`8n0 zGt}9Wo*N9zhax}T>Yq}-J^jnlf1xq>IbeQW1xOMAeg@7z2paxAmVUk9|NsC0*{uKn zy8qDl-$MQ{#eeeSzvlW+tn`P>f6euWDgKim|25ZtVx>Q1{%fv3O!1%m_^-MC6D$28 z^Y6^{7m6ofX(h_w4iGr~AddQt0Sfr_gF5O5z0_|MQc?&v2UmJ-zyk_%F%|nt2nm||uurmf!Xj%bke-es` z0slCE`jP0le`5r5wzmJbE&H(<`N<*nCtuhP+y3_EfXywigy#f^MO@+1aB~C<&iMz0 z7!M!UpG0Bu;jX$}(MFww^{2Y^bZebOMm9AOd_FvQ5?Gt66GQ$a^f+AeP43dL|oytAFa%kk7I*k6b*^_hFWRwV>7G60%hmIi# zO5WDFuSS>ymOt|DukO9t;p0eIa%e00E;3uXr#uavsOu1Ib;_GzBX*v4SsL${d5!ag zy%Z92%2u6&s2AqkMS6E$*v}2$Z;Kebds>$-aUv|Y7wrz*t@J)Bd1;MQcgSfMEonTZ z@owtMpxxCKGsjGf9#=HkO*@o>u)aqTpZ25*Oi_%ApnMySJk89wkX9x=k)Ez0 zZ)(JI3as@%>wAtGqUq_$cV^mR)wEADxU~~Dd&+Z)HM`ucp}JRpH$jYfmMf{u!DtJ# z+xN+rQxjd_rvAL`EY-@fVAl75RD)e&uV&24Xs*S8T{1D-yWd7y?F?Ba$(h<1v9ZPu zRXXnM>Ns}pP4zXVd#?7KLIai9r+so;Pog|jPptMt9A?UjmqNZ1^QFsBH2Yg;1^G6T zUY{k>+Iua;Jf5AszS=O@&~=ygz!>4JOT5+43bYh*hVtri>(mMfzQYm}4t~gfy=%Cm zHF94_@qn)yGa!p&tAxP#Lap4_D12IN1X^k=-yOuUr*^RBxPH98k4Oq(QNOL?7G-mT zp*aYlrJMHXP`TcE&Sn;Y(oL){kaaT^ryAWEQ}@#4x<63b zTwnEl=yIde&tut?o&kMeHGxhRHzdFBCcz?#^@Wo@N@<3N#NfM|_?w6X0_$b1jgc8= za-V^2&9Z>SwdG`4Z9fU)sVJzl4NAtkp1FGM;)f)ij`=;KBEdbBR)*K(QMQ97cEcJT z0ku?UEh6n4A82+$Ejm(AQUjZ)WI<5>$pV3^?5zwdBjEFj263OmI+>?De|A{f z>+ZC-8l8R1kbHDcEZ6Lp&tHfgM5Sy5ffIW<0C4qL3OR(;U@SHS<%xCM`+FVDzF8!J z*HcdJTZULkY}Gu)ink!|Qp5)L>mE3$xgRQ$?3lhny&!$5P;IyNx-jO=+mQN;k~t8x7LUKz_6x+e7BlfZiyYk4A?8s@8+ z+65T}mrU%*+Iv|A?nq8%`f}`5`%uMhm-GoXO$AF?xXO{KBxED9|67`n?nMgZPL38+ z{+9qmLgo?$Iai z?RSa8c%C)juthn^8mTnEwHg)*RovU$46jg|%DXWMMNQY$!6M_&Q_I-YG|8k_aA2rr zi&YG1J8^QO5)OV-Vur&wTV@a`0z#hd;a8eoR4_|T|I9yXq&{a8NP(&t?TPt9ikH|*`>|eoDnK>6V7!$Hi^q7wFt10Bq2*`mNUBMog7$WNc}on7 zM(=%;miw4g7^6r4jzR-jVOy-!S~!}y6Hm%mVWSxMd6;9hthS=lz1T&ww=Kvv=X*`+ zxGedSGj)Y+RnA7jMvT0{1N%9wQ$}x{K4qyn6`NgL$za5hW!)pW8y`ehPp7ZP5>GaH zs;Sv`bNA!@@R#MtFdqSP6Mkx2iW&98uIWmt=N-rn5+XdU{{1%gv32eoX39Gbcds*% zTPLAYjY&)o?|s02k%(MV-Tat~EhCd+*x?z#LI1VNINp_%#)K(~%=U@C=qFh_>W*5J zyOmNRsgwr3mS+TvP&t{IDtj!vP3e{?j*$Q#R=mcT?5}sVZm?Dk=X$yMnW*%Rv6abO z`4f0f&_hWNOg<8=8{>L5$(vDZExs|8y7#hHOopIy!5@&Wrou^#2Li>wx8b90n7M-%=8~HE0Kiw@4ITM!FP0f=}GWg6< z_03vsJCcvuXl$H>`K9(LDoLt;N5p>l++aEVlg}Md+4_pcA8LykhI?f@+#_zIKg+|x zcT>lkewI8idvACxG&iAikSQsq#fa{JCjYg8XRK=iLnu01(PMVEaF4_bnXG*s@EyLX z$qCkab;#~y%z868iQc+AK*GaozB8vVpaV4dw!1PS9SuZ9ThF=w|^rA#r z{LAM|D-MO%2SU7L3*u7ueQCiZ+Yv2h4mTb+s_(Wq`Aa;dVjHJTt)iLOF za~i^Ac!$yyb}GbuB4BQ{5!GuWX+n?Kw2!xMh(o-oRsi3`)X}+F0stM{@;-TwE+fPK zb`tN6#@-hNCm5EFbOFxW(1)^Q2R!V&yejGxrDWLe)(ojbKgYxHXfHcEhV^^0W%chX zch}$?fAc`E-S^A0&dw%rTQlt127#A8{;HW5MqRrE8S_>3MMao{ zSUm7P(<7?Oot*NLXN$0X7G_2{w#^kZil}&otWOJ#FT+Q!>iL*e)EPh2Zs6v{B?TUa zb(*i!ykQ}n3UQxLDBP;QmNVt*^F49Am{kA%cnIC@0f_?CXSZTYNBLdsW|fYqHKutN z)hK&bACZ33LLX(q<#+M#-@cpKjMH(FNUo{$oN22tZ#fvIyF!w&)uGXSgGvI)I+6Oi z^!~^AUP296Mbm=dksSAP02|DzUS9EY0!>}9gCp0%1dKv zVHWbK9L%2g$}!lLD3fdBbCbG)diQ)V121o9Rtby?zqNAtyVv4x_G^j>@W zV8aU`ePD4gLx*vzzdF0W*cC+1{YZogjKu+&HRFk0bh-F`G}4D45cNt|3o1QCr}oh? z-O<2h6%E*RfNPLv+*FXi==HD|E3b?mZ`M(V`%Hg{wa&blsK-Lcii51;!`0!zn4)n) z(H*nhT(qK=8H^ADY@yli)ojMhbj?N+(Z{764sl>_B^;(VyO=9Rc|0x{9(VEl!S&02 zR@zL|QloliJoMujG&J!ZYh`9W;yYmUlqiBy`P~X1HCAymd&>J?O0#tj@e^YP6o}e< zRb?5}@u)aTifgg?viv|RZ6t54zYy0+$FB?Uw%-&wY)?T&SGODSb>(d4TlqM3CY zes-0$pwkPLcy!cj9=!CG0@ta3qO^4Wn4z(cS}TmCwha1I>o#7DT|i1G)|PL*m`YbQ z>arU#JEQ1y5P7wi16+)Ci6ox>%%&MnB(+~RDs^tT($$C(qBP~E*J${#Lp zu(K=u%(=Rp%T=`aC~p;{`Kp_!qcXobJh!=N+E5r%)%VVsf6FxE&Onde)=AfNZwTrX z8y1-Z?F%J#_u=nsXfo;?UT?p6Zf*I-ED;c&i*kJ_L98^~ax*(I@Y@+%q0&l@*ifV2 z7)hs>V)a?<88i2_dY{cPPsxAZ99>vl2P^dkYZ(IcGEeo?E?mcic$+BD2-Gl^b%YV| zLTQE4ystyKJ*QhkL$$4>`ryqhqw}Q_-jS#A{sJgu_~We2r8+hKo4&!q0B&@8`v;>e z-&)w(p4cMl!DoXW$C6^u6C&y-2ghH8JSLY^sjSW%0Pr>iic=j zdbf-z*$Z8Un1sQEW&6Pk+;m&P&RgC^t*5uXf8+9KkB)Nuwi{CtupF%7F3^*Lq73cT zU{~WTm8J0LP0$HKj!t}%$oyhf(O^J3+8rQ}!ufpn)J0+`qf5s*1p4?Z<{hHYfI*O;DShXe6!XZr;`?vgz zD6ggKZ;0-O9qM+)SUOsUH5*N(_TMi*u+YXWl?uKxaYX~C;^Iip1x_u^fxwxf3YK#7 z>qD@ngc}IT#78IZgin%tkqoLM+3nn1Iy80qcW-!#VmOestf&KuDhT|}Eo<-4tjuGv&Kf)-Y zRzkE@-+e}3U4|*PC6g|_k|HO#I=wO&m!Q=VIxesEbt873)_t7lwqBmPOsclO(dzcy zW<48xJru^!#@UwH3idn?IIV#!f7KG>8f>L#-@Nw(h09Uc-NL)z@;1mY@f2Go3?V*F zu#q{bES+OyxI=ySW|av@NTW7=<||Ie2+@aQB7BJT%hnye+-+aO*NG@}EeT2d_w3vY z&V}Ezyq|Izb!rp!sasroIRHI>Q%%eBKH>YcZj60psiz({RmHmniAKGEb1hC~Xde9D zAq8Zv;8x1)`?T5@H&U+-7AFKJl3JP~drz?hQjF*yCkQ1rvERCFR-2$}eH(jJX=_}N z!cZhZ_OXk*T*6B^p?ULqM~fL z;-1#am7Q^vsU^*^sc|uutU?OLCGAqzqfHCmJDQf_JjXZFw@V8iY8yi_mr{i(dL_q< z55MX)`mB9NMj=L7AE{Be<7@{tt%S{aG7jQsfG1-TN?FOq>Fq%r<6DzLiJ-?~TTi{) z&l?>@)$W#!R{PyqvLhO~7rD1j&^-8BkDiJ7`Av(2i@Gk%$dQWNNSdU*CvLb24{m?8 zGH{!YksaSeoX-#Htb0DN?fqW=L8WK=)j(s>o2gghcU(LpGspC7pw*!9A`#ALbzxqWE@-{nC<%ln;d#!|Z39CT#>M}rD^Yaxy1lxujArWm;|yI!MU zJ)NJMl+^2MALQhiS9X@wg8d4-Y#ld=e|3ZrmGHS*#lfYgj$L_dem}42W5(&L?x}hi zr>|d`JNPOVM3D*!rx;A{%PjG`X)B+;3H_Eljeqa9CjY~uwLV{C0Yn{tNuO&5&UMN%qMyqqytd6)WpcHddLz!amR(GwRac&FNn>Ao zN^ZN3bhD$HjTO$eJ#;@=ybGl!^K}S&E`RDvGxR~b#qUPQ-CR^KS`#G;%2|OdGW*$p zV41p*(xmmmd8fO#G)8YKas=N)wpB01r^EA+p_?5P5e=mP7V?Fp3J0fOwAROu zZz-lUU$dTXxsgoGcMuGg#+q7_Qtg|GPbtmIe1^q2C$jO;Y8x(aN8J-dGAmsrZt!%K zQOgCai9ra-ZZ|7rdqj#!p*M6J99{7rr`NpqljLA1EcJKguR?vTdPIbBhqO}tD#um@ zWU0+5I4Dz`&Zjt1yURQ<6LR z8MNaVUXEdgIIuGCI#*p$BzKcu1%i;(b-@oy$c#f&&E~vKuAN~CM8=E3{5dolY=*+U z%FZ|X#iAF&!qG3TYrE})R)MSw?_!<&pU>JnHx)Ud4{p`8x9qk2F7G-MXx64Js zAJDmb86mTda-fE6!TJx_OKFkGt5e^MuC8cw>Rij9sN1d;_%FM;nweLNiNz@`a%Q)8 z3mj<&stcZISJ(rk8oVOojHEnZ19gAqAtjKSMQ?=dA z5hFQ!98maie#x;;5hp!yDJS6As#E7f5XS(BDhUZq*B=#t)3Aqz7fu~ zgksWU+auN@jA!?5|H*7Mejt^spT@iNkdA;UW&aw-P~?}>5-Pi7SZVmCnVfulOQ>v! zg>1@NhaQA-`68r^j6isix#KkG#(H0fPN}c~+mrsmyr^5W7mB!F$|mpoxfQsfB_Mp7 zF1)G9{pNIiTktk%3`*1a@q2JCkz?iE+boJ=c}5!A<#Z2^32p|Cb+d~THj}z&cA8wj zk65Ew1z{$HSI%;2F+6{Ab3N}?KiIu}Lij^|M0?`*H;8_6tqi}Ht_d0nm)V+!9r`O& zQl19EalIX@pS*?-ZTb)_*$q5ctXoe)cX+Hr8AHBhrX)&5`JM^rNH`#bC0sFcq$E#+k9V7$EqwLK?fG`fmw5kmt@ z?4%WI()Xg}2P>Z>am%aXF66%Ai*y#>4L6RCQM^}}_^YrL{Rp927mihjC&(naL3VF22(Cs?xbkI6 zR9DeiJ@rCGWjRN8KyH&R$*o{_2sRJfCd10|dN${LDCI?8`S((_a%Dn2jq|gL z%?>wzn-&IAc~dM^;Bn_%hDYbno{MEq_4zwDS_ae@R_AmjAYL?SQ6Vd_mPB_Qq)yem~-k z__J5t+x7I$qr&*cJFdQ6Y(8&f@^^^jELzFG66g4^>ZpYl6_jWS9qAGAj>nt%C4CG{ zDFx}I6>z=BjaX@?%aPzauKp7Etk*7&q)I)yNC<00t>$JM z2+bWZoqT}69=+o^TJ42k9$2uEF7j=b6HKns{sz;f_z;)$m}wZ>%@oIG3tDU$ z&P|fC(a(5~@H5Wk7wfbI;7>#;G&7HGY6M3T6KorN>oJ|f9=xCCQuMMb)$yaVg3Ja| z<(9^{Z+d|6!OMP=7*ak zYLFA*h{|?B*T)m_huX+s7o@01?58n8KJmO+Op4_Q+GR#@*Z4Dv3eWF=APl$(TZn8V+CQz2#{!cQw+4rv0rO>eSyt+e_c50l0V3&Xj({1?U}Xn|!vSYu}lT zMh%JjLql?5hIl`}zzLnXYF@X=DVMUNdr2M!`cTK+%NFoyA>^g~{G@*(PZt{7_MBuUF5DkXljh3%;U2^I?Ax7c;xXrfVZ}5( zQ48D;eyDIa*`dJ5SnrSfn<}1!yWZ|YbHz4xx*&AMsc9UOXSMAGN+-#>PlRv+EILVof5YS!=@(d`uQ+m_QlHl_n7tF9Q-%`&jxRR^PW6@&$m}C{Bk7|~Z&6ucybZkGVI)u^P@NyCBzMg0rhwTX%s0ax? z={ex`GAPn~&>=Armwi9;jE2E*oTAb0y2{ z#*O+G>vZDu*vt6NxyaXtF1FZJN2d-W`AX?^Ju>$?c&-&2jp6iwCOoo6 zNUSW|=|Su3;I6~+>YR@R-)=DGC>*d#)dXl~02FhUy?guvF5_kxGmp$e33@FuwV<%& zyGcpuOM||Uhq`IG27zSw(6*1=QAzi52#H}h;+^EzH^W&5lj9)LRAw9Zk^sNh0{T{nbZ5pd7L?_^De z!1>WETN8$DmAfS$vsta)G2OlApO!XvM+a|7Xl~c-p|k4FYd=V|eWo8!`$)rxbDG*CG?0w$O^(cj6B}MClD1ie;H2GKLvx&Kl z*5NLzeWo{`MtBUvHpcDXgvSSJ3a)0UZB;po%vjtm({+9sefj4i}b%ug3?Sl%N}o??`0alw`_|NH@*%30ny>A9BN50_KiXuc@V(haXb-c=1s^|8ABEq9cBr%KTrl6lPjGisT`fPY z4Xr&Fx5kx)ZdT=k`pmG56}iy%#@O8kuPM`E)Kib!yq&#R_nken3+C%L8qU{rp4?!d zigfcP->*vP)tTVO(ZCHI=`kZv<%?j9NzBFQYYPv6l_y9>_0+$pSIp@P;q~HcTroF( zcrTp@HQm3QM)s6%(%jmJ~^#jl!O zH=28JNYHSI)zVY)p4`12k7!?trzNzv?1R%i%7Ul3hH5=d%gzlao}{(MshpQH53($) zl?^jJ4mLW>+*xmKP~{6GTu)W((vjqNt(_K_o)~TG8LwM8EkboO`1`YKsEpTq7javK zF^PD0a{z-7S6PW9r2)K6>4_fo0DMQA-#1n*F#zoz;MnD!5Z2V|%9Lb--;3%9Bj0Dc0NZN&~T+@(7tOlCPBM zq{8g{CRtBas~tnrS?@>j7el{lD&uEXMFV&yA61=>OH{FKeFc*HHW9)WADhR?bYI6Y zTIu^5uD^+ip(me;^yW9h=aDGm2W8<7Bvs=chBE}2g~$mP5RF1d^l1dYY+|$&Nx_6x z&TiABmr02n3qMf3XxB?7Q`yzu^E031&B`#_^W{$cNLnpr4|^m{=RqHqL;bCap(6+` zG5o|TAmEM9p}_5yRbH3_qk+iiE%x>isH>3U8GNc1jIhV#kY#@~56k`lx6@T03Q5Zi zH+vzCO>0B69q%ZCCM4hQgZ6a0?K`+DWm401X!cxxxLc6 zqT&~rOHVRZLU^=;zCH7_cmv4 z+)2JMEM*_9(CN;(m@fMvr1P=I743DK_vP*`>Z2u+6uge%@oPd9>2=D!g?vROt@MJc za29?epZ^oIUM-P5ErU-c@Q)P}j;4HLlr^4r&^oc+ zzByp|8jkV$hG$htn%nk6Hfor-#Jg7?H0f}bH5TYgGtID!@?}`k4d9n3_Z<) z+~e^;2`nwPp&A$YhR|MB?sviax)apbDv^<;7;WF^UwOkFTHD?b+8?MMY8nhMhNU4E zl-i|e2zlL_anMbC$1K*~g>4T7b&KFPpgrA?CZ*EWk!h!UHCW~OAfo~-9yExl@{BXG}Tn5#^H!zl}#^Sh2?sDEk-{yS}d|9y-GU`hg!4Y%2sxp5#~zT z%?Xa&7kc?#GdK4$9=8^9q!iUJhTvfzoyZBW55K`0po?}<%i`PiKpN0p?jX)4HS)*HvqwAkFq)8fv3*+l`CKBQ-Jt-5&LCa1G_f}Hw+fnZv$Kc3$1_Zv*u$=XO<2!f@~tX)3n2RoAql!_<0?r-UYF3+vBXmpWg+^s)I2R>h7E$oOQ2Ki1^;P-nB)SrJ>?j4!0@e^q0!mT*0> zdZoep7NsC6VeK5^_=a)3%HhbwU|}((vb_{pY*`W@akKY+(K#|%s^@whg{5APBb=b~ zVX}lGy%I;K*p!TC#O6^&clyzu&)O+|ahppsqIPyt2Gpg<+ucq4wIDVvrpRw~JKt(H z!CO?0X;%Ju5t}?d=7}P0@py()_em9HvX1%nwbuFd6|SaTU3atgH&k&O&xtqNOfoHz ztyjefo}xk9NBpQ{BgXl+zBk^qh*HJ2v?oPQz9~wVrp$S(?_Qz4tb(VZb2RAOu!@xz z^?oY8i0JI0(bru$&OM4IRr>qco(L`?8E;lB7?)f-F?$rfn#9b?|&?eN_30_vHJ}z7;$f_%bL}q^rzE*L z4=E1(>p8%9kKBotjAK}_10>he;0$@gx#e`%zF(GdyvuXy1V*79^kbqjRMbz4pPDMF zkML;b1-22$*rseb4WC{Nz^d1W3Mlp8#{`e;sTz?gsB>C89}UcXU&a=dSO3^x14Uos z_$`jZ3|N?R_P~zZ{etz#zm^GKqffO8VU$9^C%d-&QKnBJ^g}6sS?9o#(AC998-`Uf zEJneM{TKTdo|g+)Ho~6I)&*kMYhG1ud4=e!jW5Jm$_y`tX#4DYM=>mz?lbOrJ{`O- zlS6o;Oz!)`_LOW}R7h&f@ST3u2y{Ag(2588@l>Hcie^f<41L_zwbn<6mJTytvhrtA zD)h_+_B}h?ObH9~_C6}_=?TPH&{y_3K@4-a3?D50)R>n^gLx@=zJ;o18Tu?`;1aeY z-08k5&B{3liTh1*_4QQnd@5a5PrltAnYw!VJ~vOoAug$FLNNMKBw5sxkj)L+gueQ5 z?yA~-v2q55wJC=%P(+%4Em9hXBv2!bWsrS!nmz21_DRE>Q1eVe1Exz;^C9)gvmt@VPwEJo`F^M)>y^APY;^I|jov z!i&;y(e!yIooD$^y}TyQ6kXyX1v%?oC>`9{y^eC8Hl;zRlO=Bz$27geJ!?CIk{`v} zexeqS#9`ItrbP@e!^Sih2dwWW_=lk}2N*FAC1}k}>l-8Q@{Zur6YmU_e0@z2YtQ9C zNiMm@Iu(e`^WNs!DKDa4FueVxnl^2SXo7!k^^%aTiKXC4u@~4I6SuYb9%3n*P7bVZ zvl<{qrzquzx>W9w2k{tv4`K)A|0@sYa^8UCv`k?BK<|n9?qa+$@p4oC_Hkvzq~FGE z(7SYmE7dpE-MO`D!c3cYx$Wo*^r7TQ*lClrZt2H$d_{de1?L`-^hZjSSs*;Re#fe- zK@;v& zcc2fsn)z}GGY%QkW6Z!~!6%RDl0%nT$89F*R(<3~ZFU@%nHi;;-$bWh*?CBruPkk` zw-rTmN8wM9XK-Ra+R8?}you5Wa1jm`m%)76mRwuO-Qa~%&l23cs zzM8G$S=4M$5|SN_;zmD9-boByJ&16+ts0CzhSVg^xem9T&V58U+S84Jjq&P45ErM8 zhTnBoDBbsl4pxat0aFOh)#k*Gjzjh?Rg8OU|Cxz;2KK?q3`6BwaIpAs0QACh2fcMc zGW0`G2ZB9vY?shLkDlc{l6c|72{OH?JlVTTu0JOrC^+->9a3^_a0){7zD)pyd0~U} z!EqkeEem0gqq6~dTe3xEeepBn!p`dR=nHij+ncUOWPG{nWJOPjPxg^0T_vUw<`_NW za{c1Gea@^ijrs*bF|FGxT30fCyrodBr`u#lF$kRIV`O3I$YFQNB zyMaYq&~1nB!4D+_@;nA~Pq3L#ARgj@G;6Z)LC!UecfEjkw#rTaOHl@9XFhCyWw@&?LE^PNAEOQS^l-gsHNT=D%q=rT9qM`-=H%DKGoC z7gI>w4h!3Z#~^{!9)Vjiq47|{Tzt01()MRgsdaNp=3}yX&544_0`6}+ZE%^iO6dwd z?Osr2=0hVc+l#TKPwJe|H^ql#bxP|2tAoJdBrXs*U}t*m8AP zlWkLUlMQ*4H*w?ipu5+V#TCyqi){dlMPI*FWt@ z2*49hZ;_jgI(3_P5xTXjf$(|GN6J`hyMr0yM*K`CpgXbSYM<@Ig6@`aN+tJ2^&80nO=-y#8TmE!(RR97B%Ej%1R<~G&6!+iKj=qX-om;z^PsL~YXvFcl zObe2q2l26=h>W1R2Vpez&oSEgbkqG37uSY1YXG#w)ZC{y+E%G)to3DtBkE02#A%}{ z23N?G)VFUrR%6cm&tx}82_0x&%b7JjUdRsmup!o`FpxgP&63;Xw$t(MB#06moL^s8 zWilI}a_)PZhp;KwcXmeU6@qb+MmRSh%%_&qck2tKk9Ua-ieFVVCNG3K^Kc!SUB zIC@+~Nc4pG6Wq}CxNX6nv)LzP->zx|B)tS&k0N*bM#(l08>gydvl|c$Y*#b4tY1`K zipgsnqYxsuUAm{(a12@Fyzj_vlKWpVDoYDCg|FpK)QlB4META&yb(4ZbE#U|S>v^? z7{Cj7gd64?rn+fG{gi6NF;UiNLpiw1e+6Zdwkpq4k{;Z>NpYV~KP_8rB7osL(GvzqOF_oR-S z^+>wV88RPl-XbFlU26}@oz`lx^Q~_7#6dhpR6=v@l$Y97>!}>i=>92@NV-C!|Q}SP;zE*Rc$=+qTQHOys6&o+f_E1vL6O+*{3k!B}^4D-0k*X3nAF$4|y1lSDU z?IJs$PPsJ;a*EmKVtqA3XON&-IMzOO+uw&{Y7; z+qbv5%g?o1rQ^{8rcR+=Nthk73#Q2>cC<%UtlCYb_R!xIF3~2zEbxNimPF;k|$ghL_HYSk!8rDRI)L#zsfQ z=;B&|e3d%D((Ip$?#f!JNNh$EtJ6&mi;SNPC5E30hRb0Whmcc|i`myrC)uF!f=oM9 zRGLO7W;GrZXHsuvlRo0u#7X@>jJ*X^9Lu-xizc``1a})?aCdiiA7F6TV8LC2Ly+L^ zZV8^?794^HhoFG~Z^$|4p8vhy{oZ@4*J7>SrM>sAs$KMS{eo@>C=j1%P$3%J*cE`LP;NY_tTmhl0(jN?g+ z5#6`;MqKAa`A(Kc9kORp>aMoyL~Y9LqEw=8B7^+jjj4|RSPveGf5#jDAbeZ+D0~q# zL=q#6<77I)sHn)fiauYVv?4{^^|~TPiX=D0@uFyINR7|n!SZ2tHpo#8j7r=QWppPg zQo1C4tC#lceOP-OqknO@0J_%|GMAIr!>ki!_AuWJ@&U9M{cn*4P@-LHJnZx@qd@~P z(=QD)EQJdg`7%!->(51#48Q0Wq=QyvmXm23beUPn)7tZ+EzGRoR$67@Cw5e z1AKN4elb-J}e^=+|g|xoglB6_$of5TVa)y8D^J^)4N}B zgtuPHV1e|EplPIoH)T0usGc&fYNvP56P1{eA|>E9xdMdmsYVPx`Va_?S-@l^MYVDh zMRfsu6nL=7-7d?)2>W?fNYLKsN-d zN)mrJ&|>(cpn{4jT6&U=Uj}P+%4UK;DtS!ORfpiv%o5&7u^r#?jK-nS&8rGrYm8|T zPz0!fDtH=YBxhkgPTjNhE&u(|(Lm_^XlgN>y${z=5C2xcYOOrlvTcTXU^86u+GtOZ z+*svM!+^(in4>l-HZ=%h%i0)_(jzbDLrs&O{xxp*5l&cb<==ydvH%czpT zvbHbuo<~`%3@7UCevVy2X@pQv#4tH(g}l(R5ADu3MI-Z{MSsLldbaDY2`ymo1Jb5<3Kp41N^hi|8Z{9QCZ)r_Qk z614h`4SqNk7Nb5r37#Cel|=^J^B)}y48h|ic>F4U&i7OJ_}J85GfQ=ooNX8YTbJ}c z-2D?_bumNZm6=K21pN?xA`2|(8)XqoWJ+4_`<3&W*3D zbY%M9T9+m^-qbd0=dwT(NVL!&=qZWSA{u`FaA|K9mo5Qwq^3Up?G?_f@@<}?2~4Wp z*CQF5m}`~SM=O*XJ-vD^Xn-cwd{=I|VWIBnH6FkFQ8UnD=$=Z60F3`fD!-muUFLm7 zGJD&vhEE5k{-t$t*l%abdB>GUG>0f^CQ2}4C^k#`=egF9$ES*SmG^7LtK>|IsiY9B zjN&G)(O(~xr(o;T9j)Y;jZ7haAtzAJ?D!auP%!9V63^7M_6fYhq|3x%f6W21fl*a; zsM{yh_T@E1pLQ(ADGsBSn&mSMVr^x7O-(qQzmZq!Kj^t!Oz&q`aPT-PiK^Q`@y zuB^w_2%*qlk=u)s!F@$VkvqUXIDxB0DvAD;e!QlyYiV+3S_JBTq7BOumPyOpw@tA? z#`}{Cf=@iTX+F?#L_JKMnG`J!U#c4>4X51%g^n2Utm?(aJp8$I%xa^U3sfG}xy~<& zYmL!7^Y{e;l=-A3(6-eV$q@@>in!bt1BeDb}g zrH);wYBJ?*emVKgVSPjp>O`)t;2RwhY!8hr%c+Kbm$D-JA-^Cs&9d?MStnCSxaI-* z9Kz6VXXh|p+!cQaOzExwS=k)l2Jn4jh!>Sx`-HS;5eqNu)0P{9gA}#WH|2!xcLmHj z)?wmrK%1?O6I7Q$%WmyR)@a_@*=^qDM}1*{XczP5XOM#_ zNg9-f7EO+_@EmF`n7rK<>*r5zbaPWL(z)Ig_}THgfN{+)D~!1uh`vo!)cOx82{YE(%)e+>HT)oLq7I2o$gu4ljmV#B)hA(Z5!k*nQWg z$sXn{j#*$Xuq8hV@USbW4%|BUh9A8FEwe`PbAC`m8jkzZ+As}+zh8}Pl2XNnE$vuc z8Tp_vl*y|gS%#q?k89+lEO$WTtf;`i))pLGXsH{N|JG=D)586!k26SMJslIqJu`is+-QqWst0 z4reXo9iXiR<&jQi7D(4zkj>_9Z-zY+N{5APf=o!0xF3*ID(wy*hPKXR&oZm7n>GWt z)ZmX0o1)KZ$Iu$*Wfy9)ar>9j+2Eb?6)*hsHqOmcl9KKLvYmY zn-_|Yc-mb)TG=nc=csYT$H*8!rtzT=SKiyY35v3)1J0KIV0VU_4-+LuG8i{MGYq0@ zH|%zr9>ei&4){!yz?Ykq7O6+0R0H2F{a#zEkp7TZ!wl(UAP&1w<#c;Uw)%NfWzILZ zq_J!a-?G7eT4;&RRiK9u(nFH_ZdoLbeA-4~3+EvTSD>Hpb&hLx46uhJ#)Bhi4O!H{ z68!=6!_O@0%|K>y9FXT6p<_o-AmWyPKL6ZGh1i+aMJ%-!VXi0d7H@-8*=*?~Jblt( zB7!T`zELhg9Mu|-HCIo6x2yNbCf+bayt-gjSVu%d*6v~4F?bE`_d?InG3m5tCjl7& z4B^x*?fK!1v`ogB3nNM5f4fE@*_L{h(Dm5m| z+Br6Wmja(QVb^v zu8rDjIyZV~s!h23;9Uq`k*(6gX6-3iD#IU7R{$R(347~qXjP9WN%FxdkG8fblEfkI zlCTo)R^{Q|VukwW4fxtTcVIX|=o{vUumj$E_|qkIyLGCh)+Dzw4X6ne_2A|74-)Um zwk7k~N`lQ9&aE}JDzp}6BF5Dt!)qzuz1}>Ws2?n?LzgbxMT(zVn>8+&ps;!0vntjp zL%BVjdosLy24Z<^(CZkLQ>&OorE4%{j6th4yvv+`V)b86H!b|ujGlp4>nHT zJ878mOYRM>Ewz%xZ*Zn~gaqnz^%9)on#3vkL&u4&s23PlV+dBX(;Ie089gJjJ@+Q{ z)K3*_F&p)>m0=?xw(*#ozx_%=r(PhRc5SY-U*dcxyJ|s2;ARvNrP|4~Jm3bxN=V1F<$rJGG zT6G=G04R2R7FpS?Vfx|%rxw^_9$-4)D`E)!&i-Ba4-?s=C(BAUtDucy@3PU#DSPqo5)=Lg5H&K=!7_H;*Jw*6R^T8o1drJ zA{;BNBnMyhiLUK$vWizxYWKF;)xP>bo}{lt&`^;pXgY#4vdHn0G`qam1e> z6D3sljXaHap5dYBr+yw`m%e*wJ`=M895{^jLH0`@jckTCnwUh*E3|yg*0;&VYNXoN zby)A$X=HW8Hf5>eMDw!4fa_hz0dv>2-_~rEg^GzMCgRzQQGW&}0TopmQs_q+$Q~F( zpkln7s(HVgN6K8WAfGh7Q$VAU7qphL;KJnfR?o6>=ZPT=#{M|i=rhyKbv@{7A*M(s zBiP{52uE~&y`>gKTq(Yy&G1oiK+>Ytl^nx9W6; zC=sZKCAYVnItkk?>h806Cg=qTWleW)mY!+%tX^v?66{Lh5ZI?VnsyXpLS{@ z7Y0{TSrpNNN1h1xnsN;F)6B$PFJ74H#KVcM)lq`>rz4fgs5l<#>IBc!rEj+rkzYLxm|HcU1@I58&4*6I&BqdT0ic#DgIXX!v-HEkR(N zy{O@tcq9$p%^O?9Hp3xjTZ*tzIS(ycO>&#}DP(LtDL%?iDhjay<&?MzWT)b|L;U*~ z-5s5QsL(#G13&CKVyV=Mk1>yQX%hzZ%me1m!NZvN{g~m*t;85@T^2w16e(NB(E=*0 z(|!tX&0=9UmB}K+>*nNwWNT*ixuI&?cPBR88V3-r+fs8Jpa-R%XF{bc6jP)RKshHk z4DI@82H!atV>dIQ)2eo7l4>*=9JGG5$8X&?k+h7h0sQVCV)nZUdPz}wck|>}sP|SR z+KLb4XdDPs7Zz2&{&Ex+xR@TJHBeA#t3j`JL*$ja!W(rYl^___2)Q3uP~3A2mzbbl z`#{6|Sv#_&YZoV zP>`ZKnPI^7(V3mZY|1W5{GbC%4czvAi^v%8jFx+QOa&RMX|!lx2WkXvsAaU(b&Q)b z()RCfbXL=BI$mGHA;+Pn1RGthSfzG#p zBMH0DC_JoV_a1ry%Gb(X)=*WK-M1G0WvNy8rJoJZ%Igsb3a=66vtk$(q;s-26DgP) zz<1M7Uce%hN^)^_>)#c@ch_x%Xz;#~BpoSV-@A}*B}V`QYrq9NQr&Ion?OPx)u@6~ zJ@Zu3XHL)HP$(nUjg-`xbZSI#4=$2#q}dOpJEvFS6D}H`49C!l3GbRcu#+mqZ0TlV zO!UNquarI_pKD|0(8TAYN`JwRtBlz^Cjg<0n#Gh<50zJ>6|gr9;ACTG@3%kqJBNl+ zIpucGOS*Us4}XL@ZBLBcSHI{a5U)n`?{OlJtME(v$hF`cD5QIY?g%DI)o>Wx&U7R} z3Vn}ugq#(Iq4+3GU3z%hVWo@Gx z-e|9@zu)Vl%#V8b+iYc_bBg22)k4#VWGFyqR4vK z1wC=A=(`#z_$tOQfIClW?L2uSA_ZT&g=-fWvf6P=K+#?)e$Ex}wsJd;c!xTkQ`wWg z902h$RZl5plI{vdC*{%{>%Gb2<9Q+tZjEH-HP<|an|CeZq-h34$-!%-Os~akY4yT? zNyL0@Cz?Aa7a$(?+yFBi%H{i_eJn>(*L`n&JfHty*4V$hrcpLmK|;y6?*8h@g>@;A z>&FQ>T-UE|Xb8~{Wp#v-d7&s!=;`A3?RM)hdf+pIP~fj^weM7oC&k{>PY;GMjJV|8 z-%Ru3nlM*uof3MVe*fMqHJQCkFv$yi`1NahTSi&&Enp!0qw8)cOV@h%#`A$eh|lNu zrcj!g^Un`}jW@qeGEbnWdP3UXX_ha;@3|HPY(D3jVmZEteU%4g%NYZwv3aIklNmH5 z)WMg8jZ`889a+^Yu#qbn5+)exFIJr)i0b6i*0UD7m<|_VD~0v7SBvdD4EE|O2D*Rg z=fTkhKl<-0wOQ+Qmb{iW1nJ2?gX&K(5jfS!(0p@V(F8X~=*?U9QQ^%?3% z9bR-vbfg(423SpVB>2%XIOT`c-UBNYonwNn9r|tW zV%{c@j*CBgn;s#2; zBQsfKsQrZUf*kIm?K}84bLZ*koe@k7jFA!)&p2jUQJQg4C4nVfzQga6^@0-2t0@ak zpow<~#G%ew;FxIrmpYgD6BB=UXve|qO%=~9D}?cPu3A3Pb0Sd=&+YZmG*A*q36B2) z_s6xf(Cewx>wQ(5kEO)LGIISTGCrpXyJeo@F0a^uZa8^(<2ZaU%o0ky7uSlJ{1I0R zG@>Ea10j%BxMmr9j=$<_hCZ$I zy=_59v@Lh1x%E-F>if3>|j)u$+$GPsOIC1 z&uriqRww2a2lB{0{lN_=kMBfQLh?9WOMw*~^WWbV+LT<#!q{j?-x_J!4@eC~>3$|* z&+1>MmeE|OqE%MiJwhE!6YzUgTj25&N87SU+C!#C_bL|6dym7;7VsuOv&E~Hk&GV6 z7G9;$6ff~L%3;83OmbgJIya(xcSI%Y2=SZ`Qnc~V@`2`1KHx zT)=b@P&(|g=--<=!xbO7D?;`MBfYd+-kMW?OG=yD??gxKT1Zj{3L?21$ptP}A%RCf zh9LKj?J%VGXC12%O(`_-kp49Lp+6cc7Ts~&f|ucJIan4ub|x-7Wq63bd{GpCK--!s*%7y20MhrjuY#7-faa`UZOylh{?}5 zy>Nz%u+Cs=OBXS@ZvD=1e0Eq@f#2t=7LQS2$vM=)LS4q^aC%VlIqPcFDMtAmFQ1JeMl0 z?+`5RtLDz`>96?Ct9VBEH9d%HIEf(dMjjArWX`DIH)hDs$MZ5bB_aJ_`=_9s4(B8m&V!GE^SKf}+ zL@&pBXK6^eJXt(xa_+w7C53v0vziDz4>Ztc|UjG@ek}?TRXa4)2i>s$R5A&{GhY`d2$>#*jNrq z(>Z)~pC#AYs8C1G#}nx*h5L06J4-TXJA8Yme|DCW<=vYWlAd4N=!f@;Z|xj3P3!AU%g8598v#0HKWGY$s^tT5P3Rtco;-f z|1qoIg4xmD&~8Ox=REMw*Sgz;&#K5}6mTcI*^W9{mlosJzcj|>r|hYiX!z$gruzsn<5_mT|L|7;5BtAvK z78e^&pG=e4x=K`CI0}?VPk!pZ2)Ff26O-N;G1CHJVNm&vs<3+*9s zy!Jd2F3d=$upu{&V@+3AO1GhzbUm&cSokbg4_3Qt(AGAkV{t75F0`b-)tv5mJx%9c{Z$^Z_vQKd+$YUna#HtD6w>!7UtVvF}CkguIlh}Fa!FfJ`S@s2?@E50lsisKH{4g?ZGg|kskqyflY)FIv?h*n8 zeiaj)!5|6J?FhF-Cn;bG750H?dJL9iLVd&P7AfyHJS4#A&`5t#H*6q z6HaXvY&J@Y`NC83!Zl&18x-RSphV+dE*0&?H9laD&MVGTw9Cg82TNZztlZhe(+A4a zaF>b#p`c>t3pU{3)fCIp_b(>|A?>lVxu=6#ao#8*T7}*3dBfwf2BW@lUZiT@I?eNH zGlV|wv!Vc$;bDt}l;xS=h)@bS*`T=vJ6i6w{aCOs8_+2Gn;NL^KdFUR>sBy!<=)tN z8bbDPk?S5-ebqI1YSv6EN=s62JYi7mTlw0e^_IVsprxFRggYihMb1Al(u+6z>MAu* z)m~Gr5gv#WuT47(O!%(op1m3;FfUvA{E<#%dLl@-|<_UJO_{Z4guX7u&X z)ZYXW&s3t7aU%Fi&2fAFbu9gc#JL;cc}#oNlVD=z4ngy@WUWiSoEYtW4;}x3`9R zz!|(m;y^j5pu_*0!gTGiS<05I-k;BBit3}5P4F|&Q0;710UycRMR)zXGhLg=$z0l8 zzvNce5E>X!4LbYg-QoQfEzR-a5yr9c(PBGZA%DQzh|I9F2#=Ht{&6p8Y?-oNr2T;Y z1Gb6V?EzgBnIhSRA={n}N~TNUxYy1TGXr==V}uSZbq4tEL&Lk77;dUbZFoG6-6Uqo zh7*uaqidX;eDH!2tVG3_P@w6%)z`aJPm_W&inhNQd=pPxrXb# zWzJ{}qy#57oKMAWD$R*{*5o^Iob&PnKQ5~dpI~!pvMYV;RhRZ^2o?2_YKmQ)NHsZk zJ6icmQ2NTXUq?j)+C?Xzm8U5tkwV_}T_ttEH|icAdB5!_V_sxNjEnB)%(7i~OpH9# zGa4RFgqbS{OaTTsxWW zU7%R)?D^}$`;r0%u|@ItRu7Y&#Wd5$imkdb*F0hufm7r)u#+NBREc@ccW1PtpoS__x9 zha=-iU!Mh|t^sA#%=l$k2y6$H2T!f7(d!fA9qdB0^A@k3m9tU`2*-;1%1MMd+hk;r z&r?s`+g9Y;=K?iXnesPzoMBpm7FZ;DYBBqU*=hOS8iwaYv?0RX*QM}N(45E)}r#vyPql{aVy%5 zmf}MV=jNj>cm96i&-E?>iYJhl`3XlHaxF*P?|%HQeL2I=zY(Q27_;H^%%}C|Pd*$M zvTC0rCw1D|+R9jg3XaCB=|k703X2U$CR?IQGcTblHLKf{L8D>V4S2&?@T%s1Dc<_VJQIk$xsmo6 zKPkb;bdwZiaLo>pJY`Z)T69F)x@Z|u7Wv5JhYW=w&HZlC?e3J^=TA%p&l4y7pd430 zVRd*IbY$lhrgB*_jJq$%3OsB9CuO-(*He6=d>F z@n;!OuW;ueZW$^~-WIE=K0`%1pN>Kt_TvzHkm`0+Ctk-J2ea?gN`xKQ z8|pJBF{%POSz0Lzqd}{EdCsVHI!y|39nno3JZwcwq$-Zrz$$z0ybdTvp?p+2WkaqN z5!JeawP5EnQ-_7S|I)?@cGjbIw2$QetB=xP^tcCfj8Wvv&&%F)%WtGhyGi2)a-&L! z5QR0sp2bpe3#750d);^=+=x>>bQuDeuSdIh?);;snLr;j+)wUo>Ylw9-0T^FEX&YK9=dL?)nTjYI)drKszWFN3a9MXQn;g6f7mcE_- ztopFI=3lR;>Ajm)uT`MCt!7cBmFLsYp8D3#L^41F&4ieKw;D7uy-hJ`0EJL1xZ7eW z&mNT5v}7(_H?)2jFX3zNYv38xQsDec@vHygOoO56?AXQQQ9^B?Kkg(HQbuBd?)T@j z4U^|b?OxnR4V)|GLLMTP9!!`({|nhbcwOJ(inJ@G`NjYRBQ5M)0!v<_r(S|apUr!( z+XG+y3>Mi=8}+-31%m@Uu~HIhBjDk+_>OW39(mcQ1URy3V7`@QU4tY>+MuSDR*%gG z_wG!sZb$z0H!?h^+ofNjUZ%ylBU&^T!bz_v-@K~Nvg73uLKqY(^tNM&^zq|}J8u4w z?HGjXJO=Zm@wBnd1Qg*tePdB{+5bRVb79=tbbE99)rt1|Z7z*F%RA%Ozw|?F#ExUT zX2jW7?KVjss$+6C)4z|LW-HOh!^`V?q9Z6p2_f`Bz4lJa9yB{X25w5kDIysYPlFRmBa3H|+@ODBCY6{ic+~6Rk`@yg9 zPM1EvCmX@s_ezSn#Cx;HyLhnD4A!4o|PrznsKAgM}ac$ohZ`?>)IN`=J+oCNc+mvh;J zj9S&dW2VCtRFu*QE_7JSf1YT-vl;n)jf(X;-dl^#55v;y5+&S_sKk>+)Ry^&G>Q;j z0!uQSVsc{05rUr!Y3;5X6p?y@akX~noom2zonKlkD1xXJWxiyS4M#~k9;Q`PTF`20>##p`=XjQV z&k86*Q!mSAdeFh*`ONFeMs7@t&E(Bd9sR9Nxc+%lKN|Np8@Pvy_PSR_+#^mk`!&g_T?G@$Pvbt;95e-bX}1j>q9-v+=8}@A0DU zm8MzKsgW$CGO+OpD)ZxpuDdj$;d~4mRz%nYwTdKt!Pl58b{RhNy6i1Ai2fV!W5bBTQkXqE>DI+4%zxGC0wvPeUOXJ$nO$|xV^pUW> zz&rwl+*yX9v!|W00?qJF8LJObfJfNM;|B*Tn;3p*VG?KA^jcaKcn8iVdS3UVEc`M# z%iGt?-DP1B!&xizGdKDl`z=@4rTE!-lVRZOQzkf|p>y`>Y!R(>f}noVngw&kRJ z1NG@YTL2CUU|nL(wGKTJRDQ+d_`*(YtWN*_C@)U(;{pl~?UtAWyE9OT4D51ObbD$x9EhxV+LQHaXO^73ke9x#nmM+fgqx{urzdSjjCHcm ztN-D^?j7-cu??;lsa+J~tT}<9-tVq_3)TQj?KH4_;7@ab4ey zRU)1r1*EJQHgtG8UG1OMmv7C2DcvzLv!qV2l_d9Ip(y379kKJUp!M!mi9R=yR&OO1 zgXD)_?w|d>YPEKK%T|mfE-dTULXGrott;i<)HL|kdl~q4e4Bs&+JcZbq4Jem8Qh)+ zrF{jQb~GT?WOo6EJ(n8eqV`bMOdLLDX}9a7;sn0zn_yacOwYvF+;z2-fA_dl0EbSF z;qDJ&B6r`Yc3k?+lf%4hr(ze_?-%w=Dp;>z^&VzJF&d3FSMIs9RL>2=wm+73P{xHb z+EexJWh1pRzPfka=8$zy?&+pYGE9v>Wb%m6vK+j>5TA7qiCD?^5NO} zX2ekqS?7s-DHL1S_1)UTWPjACMM~wN$6}U~viY02j4hye&%(+$?guQi(JRS5_maG? zC#iZ@)2WhU6<@v}%&DW6c^DNd&{ue$QXM(m6)dagpm+`<7oScQkmE4SReniF`>6e9 z9$soh+w{|=8RX@ds2Qn|JX!JiBg;~L+;K>k;CX{USyDYL9#^ZyI`(x;oH^iSlH;ln@|0dci@64Oq50_gfimO`1X z3ldyjJcV{@QHK@P`juZX;e#rc&Q5$#ra<#uYGZy?bKeuRvoQS&KLU(ba_X`a_r+Z7 zFQgshv^&v!e^qH&8xyCgS^>Dh4L3;9`4ITZFuQr>-Gks@z36`a#) z)oWI1;!U6Rr2ecWj$vC=ZN8D4LIP;{aB(xk)M3E$>M8Hc6+B%S*>~O(CB3fj^fbZ(y+D^OU=y@jBh6SzB+WMGIaC<*E$9!>L|Xm7CR0nvvmV%iZ4C& zSC2u$wiqJwkyAB$v#g9n&%6c1O1k9I`dV9NLz?@w%dgz6HU-%th&kcR*;@1$4_( z7qGFCS&{p7y6={LZDNyVmR^Uwofd6PLA>o~s+M*8KHLWoz;HT+v@^E-P5dk_@!Tg% zB~=%^W>A^Gk`iXr#?=0f%dU>WyoHeyP_MKv>5KdkHcfKoTT~SktX|y@Qe;0&mj3+E9$A0DUG)u zrGuuA$~+!(IR!6J2DA;K2nIdcyGzt7b&p{#56(!)KQ?C1Y`U@A%)jnwJu^_;MZlee zobMW7KJ^+nC>CPb(E&>xoBGO;K369v_|Q`kZLma#9EMYAzfN7~tw~KvyN)kv9^VZs zH07Z#WB%gUdN8pQqnTv$;OG8tGB8v19MIIVNRkvoMwh74d1F*1eBx3?(rN4c3>kQ8 zjJwf1`ms^ku2D^Kc={lAEG(P_6b4{Od~@UbE7<|WRN6!%%j|%FPXqHIH;#)#&4#%?@Ro=|zmVaZZgf;EtTFXG_>_T9 zJ<>t^A^aael5)I3WeTLyn45~%8+Jdi-%N1HlubEjWGz%W8 z;tHx;7)C`u^1jnv)R`zTiKtr&PIGn-6V-T1q2Ndvjpid(a;ayZA2H- zk3mJyk2!R*F{(;DH$sj94dB4}?C*)UuqW<~Z<6(ibG2em!t4b4c^(z%^DpV8LsV4& zEx%U&wu=x&Xq@KHR4P0I#cTaiW5LpKfP&wT5|vZg#%((H`6?r>H`hq=q+hbEW1HW9 ziNJsR&3LM&<3q%_wQ*=8d?0=ZKJw=VsWnCS>+!r0=hXaF4h6yPZ^pV=PaK6`a7_-= zT;YF`b6z=U6;4yCPyz2#^&*vJx>K0kKQ*Y$7^5=gw5XgdbvBXQ)8vJ*c9ZPN@2Dk_ zGz8sUdkgn0OzNmagl~5}Km5M%e!NCM_do=>3!Nys(_e?Xyl$+%J0d zRK(u3CspPYYt2k?vMID5Tud?-Y(g5fe1qpI$M4eVeDi!<@P)&p#LP7y31R;2+<#xlt7 z_f3r5rJrtl^u9_uJ@5N7x$f+yIraLxkv=1^L7}|0hW|ftWq;sTeW`qb8e~Bp)*+HJuZ? znUfKI*($q{x(AR^5r4-KFxjh(J0n}eRI0!T(tmzPe&*p-S?OU=Qao<&dE znM1+Q!Wyh0!YOD20*ce~>I+CANm$uyxJj$iaxAScKw zsA0w|1K`lt;iuKNRSWoEzb@V5U~r~Vt}#>v6^pB}7hq#`Wk0zqKW(W#h-(tt!of9P4U}HUNF`$qUtE{B1G^;wby_}*brL#Pflqx+98wYtAA;nP{SDlP1!uFoTBPot!$ zXUHmIDXip(#7(2d;iPA!tS(JW&7`6%$Yi9hCGQ}?CMRfXugL183wF~N(9qK|0Ps)= z(gJy0E$r14TtM<5DrPNd9(8MTb|h_O9ccwCVMj@QP8CfzHVq0lGZ|qS83iqSHAXcN zPA+~4Ia*G6Iuj0CL6Ez=oP;e8h{sV?$y`WxmBgBHYQNh>AD zO2=R&rS1x_XJXW0W^gfay}!1B9t{6Vt^?7OeIL!?ISBH540sid(Vvg=$F?+C?8@ZL4y&LF1 z=DmNN2qJWHg^(QoK`yfYgjU8c(li<^ysiXJ_~ei>V?Z1JH6a zvxclSf1s8B*7B#!OEm@nZ7|3SViPy8wd21-`9C;}60RV~xw@`@Lnr^fqZfk=c@X)3 zA}Be4tZWPb4G(j7h!Fq~?xvTMtKAC~@}K$PWw!Xo7G`ds7YHRlN?S}@R+CA_$=$}x zfkoWO$qpd(Vh#vh60*QKiaEN0|La~F?CRz&VPob>4&?ZQu>1!z?&M0&@rQp2Ifei4 z9PI4e|J9WjJF@?!kUwqySvcJcfNU>i{=Y6RK0b2pKWjQSgmVco7&(O2PRc?0yqL7*%)4&^HUMQOR|hluKiPHu z3W|UnTmU(DGkdUwn4`5lh@1_e;SO@pCgQ8Fu0JvFrQBX=GDTP|=jnEI4g?H}cr6xZ|uwf&D0iTTcJY#PiOH zrk!Ag*Cq>{2taQFg}Yw;WLZFR`RU?gG_{0Owadc945OKzS|moXdO4g?xv?zphl1x( z+`F0UBJwX@ z*R2M`M=DM~$>=fQ94WA&q(dlhW9gq@*zNhkY0Pzz!amzX4Q}3yWc9B{94ziqA*2%9pVwu&61v zFkg~%I#>nYpD~cjbPCkOx=^L%EbeUCQ)ouT7cwUQ`nrQrjU_E2{prnnn71Y>?^@Ll zZ^XO-<~@4_Fv4_xR?W8F;)OzGo7w1JDsiT^+nG{Lrs~U=Ds>!enyoIg94z}zUay$4 z4!;GvesU17MBfZT@8d#TWeE;376~78JnvK(N_tM)f^80a3)DsEJ3Jq z>rd?m$Vv7vzj|7Ivb85AAiq<;gBo1}1NXe>Yp;_|vbl{T_f%i?P3bo&5WP!#%9yL( zy$s~i;cYMUgco>|Vd_U8EPc}NWV{U2zDQ1V_aL8~Yu4=ju>Hxb{)`LYLCYZyMUw)09QtTL(r?ljit9sE-Zx3ah z1X{~uCdtw#?jLCa>s&x!jR76ae7Roa9-*!c5mrQm^NNsoY#Ouq@bW1dgPUVAAvlw! zfFwH6s;+MNWQj2Y);032Im^t=&ksUHTzpTA=6srwX$1sV!7C+iFy3j4l1^SVYf5y( z-iM#>vtp7_j`SnMl4xWz#}pBpuorWDlTgAa zP>+lAIylcLz#oTSW|8}@Ntu1#Z+BUWrc=Zb?v;(5!^1?(?_#X+)+ocS8qWl2AK~|c zUfa@cWISshh|5=Hcup2wI6g=qr#p#-4p^=Erk?%i}$LZN?NNwrK-~`YCxv^#v_d;uG+4Hy2I# z7N4Wn)UQ2DqnZoWxb!%^n-|pikeGd7NF1R4CC9!T@ABA#>!%#us(ZtP9OQT}wOQ@a z{_^-LRZ$_DUeu1#b)HxFcKq!WqZs-gU=UbMB9#>_i;v`dTYf)J71Z!l6>)gwM*6z6JwuW zkpz1X8#1|=KIJXza`1p%+N+^|0E_E~ezxfgUqb9990I7Q{+*(tsssUoYl!`c3jrERW^Q(ntd5|+Cjb8; zU;`}7{*-fa{;S--bN?T5_TO{=|3756D&!}=5GFM_$KTxRf8v`z_x~)wa!Md~Gf6Xd zGjfi&MPKCXa23b$10jzbvC>4u1k$_J5`S7W!8$e|r6o zT0oB0kbgC>b8zzgyWr7KsA{nMi2_+5fgd?44b9(O;3xk-Vncd$26A>DRyIf`F*#n7 z|K3-Ah=y3%SUDhx(oU}Yd$`4st_!c0&eMH&5%AVt*QfCJA}K=0?|7! zKM+VRru34<%+b@#%?<1e$-vGH7lakh2T7C#LlEo# zBgY@MJR3JR7bhn-#0&m{%>O^Uy>~oS{~tJRq(n&B3ek|2aWD5;*)tJJHpvW`S(Q*3 zStX^iS9UT&q9n8IRYuB+5)m0uzt`)Wd!zT~{r-M`kKZ4^^M2p+I_Gs>ujgK`*SWb8 zSTT$kK#3C}{@T2-2v!{E7X8h6aV%a!9ETSd2QZb+TX{Nxf(`x#yS2MJvPa}D$))IH z>CB}C%6Fh{E<?eYvJ?Pd;T9C^mM~X$0?FpkU>1SOe}xR^LrOjKAH zi^Yh5`V#=cO9+c&M1^s990mh6$Z$ep;$j$a2|ONy!Q#O#8eT|P6woMv7l9f1geC(i!aXNpfLe7akR~7FbU@0@L|3 zA1RiJqJ$9+fPrUpfWD=ht+fX*tMiVYP`Z*_I3fn1NMuO|5FpU-=Grb`OYb~fv`KOa zVsTg@yf_XkEG!1Ht~gj8h)W2G3FE{iFnBS%I0!I8I6M|7h7}RRVXzY75)#13L79#R zWj7K`gt>5{To@RkP?{iBK=|;C(gx8%WJD@}Jsr>iMx*U!Z)@)?DJUX>!*B_T0i_G! zM8!lT#PAp~4Db_ZU8-*OXE%&XLX-=~g`5!9g#eH65D~$P3gbn=y66904<0!r#DPhP zU_b;04E|qwATfAzxSiV z!s1|Y4*UYdRT`@Q|6>P~v%Vd0cV|m`XmX+;TnU2!2bfU+4(kk44blzttOnw$f)5Cu zGzXyM#lQ+!7(^|2#^d2xQIXgy1`c=)pNfgWr($C0Qxz3B8=WOC4o8WD1D@e1ad9|G zTwFzk2osNoWAGr*!80D125jLdJRXjMSMUr+DJsHIii!}DA~@g~j!{v8PgPW4u!Jpq zuA+j@K`BP*Md?8?qEF#WI2WG9Kx~I+I12Iv&v2BO7#syL6Q4nj;58frIf7@%H&GJk zT*wpbfp?H2c!rQ5-9*TcBX|w@hAkWgd4f3MD3m_P8N7y&P`*^a0V#sAgyU!qz!sG> zDoa#W=uG$o@&V5%?I>+1c1Sro6MY8H=mAGT{@@uxLN$nTjXpy)2A{xDkUye^QK_JF zA%CzR-a+nA{lha#IqZRVa1`VZo>47AD}ekFF{3s@v;jytqz3jv{)m*pD|ij@qH=@M zfzaU-hzp*f%wdaC2k}8H=uCKqBZvna1GytwCgcvzM!80xLjGV69EI99*qGwL!|^9UO&P1mq9W0{b9;M7rP=yhib&a)XpZ zDp1ZLKKMcDf-M|HgpSTfpTl0r9h{ANCgcy*C(1QEqhlb4sQp5|h|++NX%4_ykT=K^ zJj3UxoKR@67g_`y134mE2dXi6hvI~zpvK@Cj)EM)Gb(G8A~Ejqk?gV(!|>Q>vB)6-Hs0W| z(Mli(j*tOii{i!+4taTW#zrfT9103(|3<5T95e@%l+Y&|trBu5E2I4ztuk_;z3>e6 z4bSK`lnr_X`_MbI1^kI(6fsy8B@qP`6|6i~K}-Y(?u2nFD)M-6CoCo*CN7UxQ4$Bw z<#9-lh_JF4@}W5(p$x`iRa7KYfN>~`DT-j=2defsl0u0~)85|Fx zi%Ec4N@9u_Q4tJ+2|R_kg>mRSIA4N*5zdGG63T#b1@HvU6-Thji^z)!1H2f(2f(_4 z4PJvj3l4;DAn1=|KDvD#AEa!f?JYkPFhcS!3d0v;-C``xK#tLI_yc1Mxs! zpxwY0+AX97)e^K+0!IY<1@Z^dKrBrj8KQy6zh?GFC+-xHom^aPapa$BVk~q{HkN_MDC?`Vwj}~$z zjLd+ZrJ{rd`Gm+3%J;uv`nwO&fRZqf4T2X&K!6QKCIli7FtDTz-v6QmN}mAjuYM4> zft*p@LYn|q4WYvL1neJ183Z=88#Ee2tbZi2K{<#Rh#hQxN~9k42`j_6fk1~|0b>TJ z!@(KGAaP(#N>~sF(WrsI|BFfh3Ax|Q#UI@N90{pIqX{9>BC#IYni3XRAGE;@FCo%M zY!O^L}HL092VH9#J^x7 z&e+TisEuIEhaV6-l&~;D{)q}=5)wepgiI!kL|#H}1-?zRRK!E!93n>0ZsawX-%$97 zR)FFO@dM6>wg#;Pjmc1=!id$uJcEn_FriN)w)Q{N1C2qA5Mw-|5e$qaM9W0%3hEeo z1_}p8CFsF0Dx&doBYL6nV}pN!MxeCNoP=luW&sf}TTEO<31a&@wjz-Tjf;P%fb_#r zP(FYf@D$C01o(gJl;|ml%m6MGG#_J>5MM%S3V<8o41otIfCpAySQ(W+yhCFk)Eo37 zcmQ1RKQNCt8{UB#i02Ue24-9pw2FcFfSmrO4b&&VzkxmgH^9D7-JzTTk4HE|o^8a$ zzjcPjHAQG`2xk&Nf&dTnAe1%&Uoa1X1Lg&IK<&Z2hDZ%?LewOP*l5=HV|hd@eqU`oOwSNfePkq=$eT;g@J_5+EMHQP2t@4#c0pHRO2{hv;mg zq>%bU6!1l)iy$vpNh0`&8bN&&SP#Grtp&}n$SMKwkH!_$%TNet#Ref0{TtGRW&F;sE!1LT{?8E6s3K&|5>l;m-+ z!iHV}XvZMl0X+oXZ=AssI8p*e6wtzF5=zJwh`!Lr&}a;CqBaWXBzPk1L-_~rfW$%0 zfslcfq4GeahV-B_Hfk|A3-St06!kQs4mM&GSdRfZu%f_7L}80wLr&lo{EtX2Pg0sO`;K?ZEsEmj!6x4oUjSc%@JR!V*gith5jg;K~E`ZPYDr4F(UQtq|yeb_ARj_M;MqSHx!$AREB`%}>C1 zF#3Np2gHX)bs}wue{Zs5gd$iS0{i%<Kna-Pobr3_HE(}q!L9v53F?Hx&#Yy33>%BS`=CzA>I+`{L>QY_=`^jH?ikmM<7*? z5*A2uBQg=``CrPx6R>XD;Dk8xpDkQT0ZTr&UK}ho!HXxPl?VF_e`yjzCh7>`dxPIi zH7ODQpOG88U#eb~jKQu$sEv%pr@BM2WGW)L{qBTI>g9rvISP+mm=@F@D(R;`@y3Q2_ z+@jhfSQ@Akp$1W2;CX{Xq7G>e5VHmBA#g>=*c)7HAdn3p7ip8&C}+c>-7>$|-84kRx~na|x=0Eu)@QZjV zMikvohN}dkX5pJG$S;T>K*Il*cn0=6kR4B?QUP4Tl_ZScz%MuX;6JqbXAMoz23&JM zs^B_w!@~gOaD@Ra8t8%OU9d%>8;I_IWPxxCaU*?yB!kqvKyZZojZlPo$e#>KkQ}sr zG^YNC9}waik_7-oIC=R^A1En^do#y>_H|)|0@)0q1&J)MQijJy?TiCak!bnIqkljG z`?Z9MEXhAa{q#Pcwk|FG&LFIl|_?l41o{_OW4T7Z&*Yf|82Fv~%?0BWF| zkjff~plD?X?TZ*u!B}u0nFoP_*xDa>8!{qN2jewCM#Q*{C+-M{A$ytx%lONG2)oCK zhaxo;;VB}DKehz2AkZvAJtD157QY#q1dz_ZL{`Msh%zFyP%C19!#}q9hcnc!P&q*@ zp}1i$DiKt2=qMm+BqndvrGI-O5?eM!!42I(|3h@CLX3pa+95?KWCYG%wF6ue5-Jpe zhodqg?o%S(0@xzV2XcXS4(^B&5<&MKH`744{)cSfj)WNUwuShXVG~WL%^s@8`6bR+qeUJMStZJM3euhO@UOvI~`Oia7UCdnDd;s%L?Fl@b_zc8CAS1$OqizucYS>u2Z{h}UhOkStP$W{L zv_agUGDTJr&|;u9{VhSFeE)`r#y@B+#3%&h3}*hZ8fZPrATEOa7}Re5$d||kVO>I? zjMxilMLipN(~43F=mOz|NCB)|k-Fu-)^9KxAyFH)@crr^|0Bo@?#=ch;ESlPfP~N$8(}Z)KYSFz0dgT^e^fd^8YmTz67)?1l2Zv5K$Hl| zGw^Jf{gq&K4BsBYT?u#%A{DZZ-IN)Kn%by)U_1eKE~W@ZA^W6A{)RQrKXeGQG2BxF zuz_}v8iKH&hv0^Na0d(Zpuc2dUG(MuW25P;3vIQb5gkMCX zL<~fGk_Y)4l?n8Oe?(0%7qKb{u($zMfB~q9^I;1$0{KSm1ZolWrpq2?7j}A>;(5g}6IR)CwvqpfQju;IY|iHp3@egLev0 zcM$uACI7*_naV#g1?mv>X2ebioT1pzH82r3LECV|Uyz9Rpb}I9TquDTs)W4ur}Frx zyoCS2#G#>W^KKkVHt=h7mu%zB15zvf=WGHjSP5ZZ z)`DL?A!y)#cp~COY!=Di1j_z%B$$C@a&#Sv0g(@63S|BG$6Eg43Q8a90$D{PoWr}# zo{LK1@7bFwI^>N#2GkmxEcl<)!RUa*U^K!2Ndb+v{55Os0cI!u>Do<5cvZ$A*?^NZ0bj( zhEyJ?#}lX|jv%%oV1)-PfoOa1?b?RyH)IYi8shn{tdBxRMi6R=O?zAjf16fw$eI>@ zHv!E?U@nmw&_XMQ{Qx(dx9Q2oJ$x_qul$H(z}F=qKVUYZC%E_aZ{D!kLkW;JX@P+I zzaqn*Y!Blx*fm5jY|!(6qWr%&+USRr6YD4RT{jl4reQS(bnw5l{@n*=|8EZ2JZsZB z2;E!2q7faD^`F`QD)kK-|5Yo%)&Sjb{~X#AFmmW8pn&;5TKWdH1gUMNm3WP=QU2_h zz={V(RRlI+C*%JU<>-5IKrc!;!Rx>`HUMl;qX62F`e1{`4OtU)0b3OJ<{re>A-%*8 zQV+v#tDulK`Tk$)?+y6>ixc<+;;BRlqb;Ny$QsGbkY*%GK_*f#?f75`NnS(LT|FAsi4{ zHc>~U2zj$d{4Np1jzn=}ZxDQo?vLCy>m1}^m?N+-cB1b?|Dp!cf@CRB0|Qz8gAyns zB+e_r8UX#qAb{gBR0RDi!-fL7S>du&i@$hsEF8Germv`AeG!XJDm z4l88%fp2cX_vSzZg0hC+41nK(g7F-F*AT*i|8@rcW0QaTcQc#*@&nCA{)7w_5-$r8zv$2I%MuQUWqJ37YiX5tzMS7#Eg z{Jw_kyPRWe$V)#l^hsto@`8w3{^yy`8m2=%j8Q%8_Y`d3-U5HKHAH1(?iROZOv2tf}Sml{zumzjXP`abHpC)%#D*T61ZSxn@Qrzt+f+=IyF5x`W-HS+Cz`C%n> zk!DKA+e}K{-fydJHAL<*yvfWPIC}c}M_#ICTh==hhWAraGy<-c-4i%+YfFtd_C%F|CXI^^kT_^F`H6bI-NJSGUu4t`DKHWw=w^MmhgKFU(&08F0rAsNJ%R@WVy9^^IPT%LIyko6aPJTW_x<-UyUkF*P5}rxr zMjC4*v+{MzI$q5X!@xjs2cDdlm|&e>J+Z%=RojBe4eQ+H?_u;;&#(mQ9PK$|(3O}s zxZ|mvH;ad+KK&)}=|&me^Uut`s&iWHjZI(4W-7mPo6d*qEPh(+P+Z!Us;w-IdQ)ZL zS)uy;Up@*tTU}>-o7cEqK)zi-%iZMm=(2zo<({^Xl17me-25SVa>e@vg$3H? zq=mO1Qc?~J*WKeBET_!cZ^vqXIfq8BC#8Ae6p2jT7dZ^G#!{M8qpg~*MJg-XRvCUB zOj8%PqFAbiDK=w3B=p9^)WFq%%EW83ss8&9>t0n0wVVxE=4>NXzqx~PA~H;ZC9p|} z!_Iq)%Hae<%B03bY_e^v{6ow%k0c8Zo{Zrri46&ThOAii=%H_`9t=KV?Pq5EB)8n# zTIlPhKjy|6wxAh#>vlB1$I~J*?fQy9vMBeACxcTze02-BOCRpWd&!bI$GS87K31El z_g2)sp~hl#+`)^HtHWz&0lrBft@?=N2dBN|;ltr$XBSVto6m84)_=0bt4GvS^IpLT zn=3V{Zi=PTI)YLqxA(GH2RrCxI&@?kc{ngdjAg34i(Hu7$6rB<(YfR9^umkwa1h7m zy3@`)2OCQ>s}iM~BKA{QS}fcPl349b?)pr6he05m#OP2TN91L4k;}*3xZ)*6cd6n_ zX;eJl)wp!t9Cp8^F>_`xrap;&w3o75=ebne{c8))pO4EI9QAx3`Q~=lZ`#<_${op1 z$yqPWYL5OW3BEi@vA_IL&o7zShOC%`kLE$~YhIOy7Uv9-3!IHV*HG6R&vI!$4SHvD z@k;z`)A~N%-lfnL&AKg<_h%>QNUEO?DvaU*{hWN0O!0uNkMZ7+>h4oJtAZwK>e9t+C}T5D zMn;awJ`AE$zxTth(}V0HW%Cq&-<=Otjh+;m4nN9$WVSNeI0!urt<$$|=ioLz#OY*o zjPe0~?slzgq1(~nlNyJ4%UbNUXcF7c2cA-Q<2 znynuwM7%og9!&=G7fyS(Zq1HpT;UCD`RIF|D$1eRMN*RO86D5| zp3AZn@1t_sQkVC=eYwoBF#9NFp5kbfWYJk8SHo;6jnzQMi%l^<9`4S%;N@DF%*I%i z{Y~;$_HUZYl>*NdWhTCS9%}w@caS|&z@o>k=G$i(d#=MOvmR#y74kK&`0VE5>I4XT|O+yY;J_l&X#M5oSSlfhkvqRqpMi*`jE7^>+88dvi1b7CsDT%0>2G zXt+dPw0L~)oOZku#LDkT$ThpaFXg=WqV~6-=k5K%vW0cMPL(G|=LfUeRvoJ?134C7 z+-7C($vUdlt`?ZJq(JA#@Mgw}`Hk49w@#l(LstZF`$4^7Z)H-Kw>} zC@XkVBed=JTiNt!ito50pxbaN;&zkLq@AlphXFQycTHTQ>TZdkfbMPEms5r`RBX-% zJWWfjqkUt4SxIB!Ik(BG`8wZep#{xXzx~XwQ3_=R>ej@T{_e1)`2EPN_x$9&MK8m1 zyY!hzvjQ*7EsuPwyA!v|sgk!`Z9thJw=V1}AM1vdWDLdMf1DGv*h1$uQ3|2&+9hjGHo5yIooV0Tc*o})!vrILz z)N~9OH@uT!7?`aT$IT18nTVa&)b8)V4Edb}*=)N;#ygyJhso!Na$> z_>@9M7%9%yOF!gPJx^#_Mv=$!nJ zQ?y0%tOt@xl zQs?iR^~zZWTS87$@ztN~6-t;2>pv+hbfR+0*O7=DH=AWH91B> zQF@DWv~lbeu~aW64?Gq)^~xdOimVRB(-#bsG2jazC5O)RLR=$;*?=VLJ5u6wx*r8Wp#C%REhDd<^qmfG?RN zR6x6E2hTj$xx+hKa#UkJvL+iYYbyn^4|C(fY)>mNP#UGH(N@S7OSg$g*HDou7vFBY z(tIGzhW@+~q5ev=$y| zm9R;@`dRAll=_eVfAc*ExlkNBiFPx-+xPy_`nlcz{6A_yN$97v(&G019g-_UF%35d zn=F?5NPdS*@Pxj!z^SRYf3o0L?z(A`Ho&=fcKtAY6^Wx8w_=c7>XyXJ?U5=~r8@0!|B&Qr+K3-c`xaTEFe|6I?Y0Xr@Xo1iC)@%Mplo!_1l@@+Utl_R7Ir_2J zTsWkoc(RL{{_BgcKlx3*Rqt-fuH?PI-C<&QIrw?xW$7AI`~C;dmc8nWtZwT+aJ@E3 z!F!XNwPgJ^J)UVXc-tIhkYdpu@;g-3;E(G>%3Hm0OO@2!@j3|m>XyX_%h2Jgv+PqH z64K7XuO_m5@*dn*G{5URf0lccqt}>!CdQo^TmNC*pIfXl_sdtcDm%=n^Ig(ge5pR< zrQw69O}KXM6=J-3byaOBJn+Suf4>vSSosvG$+_I>siy*3`#=1S|HU4%WBv1pQ_!t> z8w=>XQbV8rtRj_eRf`GjbkaIBkK0~CtxO%pz20`^H0edn>>sveeJ92O zjIM`GM3RWr>n(_^M2K%oei+(PQ@*09TQBwENyPSkDZ3-9nxC~6iza`)P1|$-OLkq! zop7h;zwVydcD8sAnMjr8PtBRDHQ{EW>uo=Bd+IC&&W2Qzx?;wf@H0v-zwBs!Y3AKE+n)_Cj;FW|2kcZzw6Nco)J64+Id0o&A@S>a8G@r+ zi~fVMB!WM*B~p%Pr_;u1zJ8);QndHW-j<{E*V6^AIXz8vQJU|l_rU0m&Eb5P-X%14 z+%PW^RiNEfD!^|MdUe2IJBz}{Zmo2dFqIg)uutAmw|d^YWSLCG=!YHfaCT*qR&v#@ ztx367r{0_EqCT^zAs6SXCzCSr`G|^crPPYd4KnW4f_kgh8XmZWWZb(+@6;X7cbK_5 z_^{7n$KI!44$}>&@(M3xN!M!+m3Q;{NIGiDU{Xr&lroj8WFE>n$?mkMPyJfQpD{A0 z%S_u#*S^90h2A2?%TAfrP8oaQDU}Q}gHB%+ztkNcnG!I<)NM4TyH{pk$iJ|;>bZlZ zEucyv%{;c>ja2#Zwisq1bG@?(70=iMH2aO{)t(%@R!nxYr_WZsw|FrtE%y1Lt(Ekb z^Tku#?O2B%Wi=h;$S4r(O}0_)4mK@`YmXNkB-w>gHTbIj_|WSFZt+#;44=w~0lTjf zJl?eAl69n$<%4^*)8&nGRk@VO^!e0xbGfl3(-!V+6bNOC{ve_19$;ID1@EcxC=^1W#=e`%XQ$KuhMK2b2HK>U+H6OuCc9-5dSiYq&cJX?0 z{(%z#2P=Ho0<#&*wx~<;znhobE!m%{wj7>pj>Adx-|{^;?u&gs^d&O&>pr)~YkQR& zly)qti_y0fZlQmx#wu4sCtdA4`jOwrW!AZJ)H!#6+%>pd@q&R}vTyh}o%gNWH5oR( z-RVJ8R>|3Op=$%rWvxz|=6?63_Imvj8!#Fna-B5c?sXB`2?aJudDVnT4jRe%;hqA~ zAE`fmlwbpO& zb?mrTf7Ja3rW8i2o%2qGS3P64d&h*c<@zqah_~yp=#jjIiOH&Hmb z7jM|5UUhk6xpYuVAS>Iaz)Q)h*8)70~9KWOxIm?U!` zG}5%?v}lfYSgI+@?r6z&S=J+#_BM2NI)Ps7hj&gUL>~~W+AeU8J9I%{V&K7}n!-cWT?xuq~hgHng*xR2L_&=(7(eQEn7GGxR%gJad^1S2KpGCZ%GzHZ?)7PR-i;*Nx z?i!#96JQjsYaNCHS*HC zC)&u}K25WAz_UB%a*}#jJCed4tOoX0KYGao{|Z&*_el;?l+k#k*M zS`RwKp|5x+?M3eeCZ#b_irHhsr(epkeKPC)toT;G#gQ&Ha_}BwTF2mu%Nak%o!VAh z5i_!tGAoYD)WC&0$GQ&dCs^0dZ<8%)QMRb;y_$X4c6G^ZQmNdxA}muZh<3*{@~+6# z{d^8Cr#k8Qg2Kq|j&xpdxRCqX=%z~AmB8`~7h5e(=+;-4j;7Mi-ZDQ?sy$R=;6k30 z95OS;lzK1%S8!C`MY-dILX0-P{{;T1WH0Tz8^0D0)1_K%k1)_@I~~OwQC+L1k|FXm ze{aEw0=Ab}_9|AZ=x_Ghe)!=c0;O4$bOB4n z$0%1aZs!$9rFkOyh+1@-SjtnUo+~Wc9djC^lO4$dQI(wJyTgqJNYu_!<+E2m=<#ak znEF8dHScw+#=)|i+uEHnq>AnxCVk~)?fQ1*mIkL3yZoCibYEiE0$zQ=IkM~XV;${x zo~_Z6YtT&nej-rQjDM&)qqJV2^Mv?XcxTL!leN2i*yj#EvJ1KCn@ty>=JAl}V_$di zzBtOH=E5U)0}gfzk{qw?KEKm5_k}_WW9*n_ry6$W)2FkyX}Pv0J3LVSsP}9uTa)8A zb%P{>=;{QgW5zGCCkOlaU&%k+cAq+nGU1DZn5A?u`F^tZI+W*Go}@i0)NT0Pf9B!! zNhxlY!V`~xXlLU*wZcC2*@9qpg=P5r|<#COa`Epf>TwheS$1P|0 z=I391z4AE!^T!;rk4)X)$B#war9AYuBq9H~mb<{%4QmgT36dKY4-S8Nr}~<@_t&+& z;zWtGQt$SS|T5j%vK@dv0ILGb;Ym zd-h}aIrH@xH9f-VOiP2S5`DuUvSMXT{gy3#keaZlOZ`ChS?hBA9Of!HYbevTP0v9p{WzsvUjL<&mb6(Eg$)ZuclnSqeu4Lw;P_PC3^6 z3r?rin>{U3;;p+5AMw3YH1o{!&|%(gWt;O)Y>%~&Qyuph=zr+xpk9|Z_%Oo3kl!b@ z>%DxWXKMa%M-f?O*vQc>l+7=4NNxEYq+BLUd3Rd#Wu;hukE9b;eSB|UL&i6%tmj!@ zEQTMyrpn3Xa<+fqPkul=(SNxwPvgg9zDxybqXCyUKb}53OE0l{*Ul=qYfFB>Pm67_ z;D=$EG@>(3>=`#QnmQXyB}$!Pc%#+u+uoAzpLABDjGCReLp35wdhkb$UX)%wdnr_# z|NH9^9?v6K6?Rh3(*fg`SC(7{ITqI@;vMe&u$WeTrDJo(E7Ny@u0H!vMBrR$J~iJjjX)rwzpb2{zO$;@BQ z5BtE~7&)~n6#C&z*!a$XWQ~sWGV46f>%yl3OK#+Ud)1kdT*S0@_e)CA2lT0h*^_~< z`F_z>EY<8Em|D3ZUHV4Nhm&?~Y%ia9;uDX{9>xW%5h-cU&vIJr(I|P^sJkdA8hv!X zyL+%|%9E+W?Y!GQ+kBwQRedr?74zuzw&sYV8MMs>W7Inqgywx{lAY>blq(e9bu-2Z;}z}=H2tOUSV&T__4#L#=ryffal0df7Pkv6%I+<>#H%5g z=0jTlk!kxksZNXJ*&psnw?}m4V?r(rpD{X6Z%}$>Axn2e?dGVcey{bzn9=c@;7{KV zZKY^Vp1M1GXXg&p#qqMA&o7BzJxxV>C~0+1yKIlpWSwA)Q&p#)y>!P=jH-3;mvmR- z%DeGqxbjdFUI&}|@0b@BQhyw*4Vw4#VcOMy(uYj!gkRbRQln}Wc||7Mw3VGn$yNo= zbSHMp9PQun>?wCy4yW?lc}^ z@>w9J|95=*BzxUj`J1l#Ak9(s%Y}-w=GtN7UXOoxmR~OAj~xyTmKi-9+g~*zYZaOs zaZErjnf<1>K0vbdFEpOxhJa3 z6h<`=Aev@X-rl9*u!t~%xqZSUq3F% zw?VrhOd;Yx_uYn9t^y~2zQ1umQc3)d{q%6XsKRwQ)5=KeFuFILrZ--JA9oVJc3G<} znf>dHwTa|PQ>#O^+r}F{JCRE&>3=`MJf5=L+sM#e;3>}8tdhY~Zt&%6XfXRx5yztW zwUgMbuGDvLyjoIe;^bL-a;nVZWOsGd-q}&+;tG+UG{bCZ_qf~JAM5Nj(c3;}NuG0P z8&f*>E}g^%PKEu68QRzE9Ud_aU_?kQuCZMzEB+P9o`Zd_wAi|Q!slJK`A&RhN@}N( zeZ)nZnWNfWHW@d|Gy3mFjilIS>{%3J{+?5k@oYlZYbG|4Ip*f_YD<>a=U(swH2ek& zISVecw>Sr%8Z_^p)sy;qL#$YL@`mA8qs7>{yxUn!+O*PqdI4T)Fyq-|}&v#F>OtjhN!J``*b( zzGrvwSzkY{>x)0&vCv!gWKXQhh`_-4$TtpOW5r|dw$+rXW^CKlU?8E^r(wP{T<}K2 z(quaAsr;b}i9`JB^nR?5{F@DCV$JT{@*8Gf*DKQ?wUVk@OH?(lSX`W);+Zu&{QaAf zzV_vAQ-0IjA9Xl)v+7r|WcBgsm}w5bQ{We)_VqpEiw*4`UrjU4xQQ!l*-QVsc}P6j z=W zugYn|Y?o6$P8BD^&We6t)-YKR67F(r)Aub}^uE3|Ke%XK6RT_N7php9nf-9Sc6;MleJ9^jHKw0N zn1_n_vlc9-r|ritD%r&z|Di`K&vHooK3|v4k(f1+0*0Q{?ID_}x)s@}8pV+su~Wv< zPYxVf-j-D&>8XFezr}i{TVtsyCOoaP^vmcMe#e?#--TZ-Q`s&04|bfR+_k#T-@^K73R6_x;k%_iC!gv+ILK*{6iECrbmikKYHk>Dlmn@phyPS% zhk_5sf>=3~Z~she(>t2gRn*p%kejnU)hH=;w)3shGtsYO#ae47N%s?IE$@u!CnDuXAk9Qd>FkmwN0GCgr+uKW_fGE_8`GHhGFeF zk8SO9ziRV!+qe337VD;JI3~SYs4g{%oB3wY#2lr;nJB|gQR}VbcZzCF*VzBr+$4Wl zwP$zp<;mDy-(C&>SGRgK?$uvstn$25G_~G3G4Yh5#&|7LJ+mZV_lMZMxBj0iKnyaM z=BGG!F`v)yWMP%AwAZ(++s3Ny!4d%ceVdFNPs^`gjGThL7cjK!mFATQDuxr`S3@Ir?{=0Ih|&I7TBO}Q0r^SpoZokF!jZ7_eoc+WAP zfQuU8b>`MqgMz_jw%U0^ceC;@jZmgstB)&Hi+kN|_Vm`1i?>Aw4p`;T>4v^9S6V7K z=1i7e)THl)HLt-w2vm;|Zol$Ca`3Iv)~_DMkL0k)rBnj>+2}# znx=05TS<(LUESJyvjYW}(%Y^(T$0twiIjQ3aAH6)^L!&_)w{^oaXL~Xd|_Q_{8hjL z>+MmxscOg8rk<7R;^2k))+T$M-|edH%TDBgcfMZSI*i_u4wTox%Im()&~)nmiGhOQgN6aW8&gez6 zW?8{7f#At(=~<@-soNX^W*HxT6Ing_$xb?*k(~_dZFkU_S=LRaGMml1xI8!c-ttZD zbN9Ohqo-}{$-TB~7hKHOInp%}dbpgtLf3QOQxCz>F%2us#8m&~U-JT#9p{@`LYkG$ zPIItIPxR&XH)V>i3cWJ(5whiWE$g`No@c>lm*K9shTs3@;A;8&PN7GPBMByclmRT- zB^H8rIPeQ4TAIwe+1^bjjxR*!((W_ZqgSUo_m-6Er{zmh_iqU$r!?Q4yxbG><;6r& z)T~i=xBq_kp~Z`A{&u2;Oan@y@2&}_mrmUOeT9wF;MAcXJDl_%?+AZYb!G3)`LTl% zT}4a@3wC|1cBW z!Zvz_>G!UKzrvcFE)Eq^YWXL8K9v-FhU%P5PrO@y_MIy(JmPgjy z6)d@?T|D;m27i!kZFo{`a`C`gj@C!p@5T+<;lX>4CYWE0_IzM?p9K>UeuW}V+FhsD zsg<<(w4dn~md6_5H*;UHluCwoytX{1_nIvw!}d@CXRwm3W)ALZbV}VsVPy8mC0n-M zAS=hhkI6GpWa22)JI%>8Cv@!zH;A9oI_ZQ0r|vOXMg%c zDwgi?m;MO-?uxj9LE&*1H{&wn1I<*0%X&?LPwvh&?0=y+lEpO@P?@AUF(%pFZDdRL zQ;4ke#BieI`~0@|TA~zJ`Ys+#Cn3??x1&~Bpjz}i={HezN1?8x?$y7)hrEAYCHsJL zs+jlpj_$_eIg5qkQQrbB-u}uqJ2y+e|9x5Y?5A(Gix9KBq z?Vndlk?9NCxHmubY;mqR(q5{zN3vmm;EAta-cNE$^%PYZ-1Mg0wk=-l#Xa_xwhd-jVXs?`G@W_UbCO2$`sse55|YBtm#(r1Z8;O@ z^lo=>>i5hsohJfDc`tuTHE7~{*~u>MjhL!*Pk5-){xalAdULUw}}W6fB?3{u`^-t0ZuvGT#&HJP2ER@W`4 zcueEkR*HqhC&O++EuU!LRLf3UntGEKSJriio_}e1KGo0Azcuvg55IjDuL3{Y*qDW0 zaoToR;S*cZAwG8U@a7M$kA>WSYLpCo%u@>TQ%f~WA5XorWhCNQd-)b)_l$d5jNdgd zH@0z*O3{emxASy-ke7K-SMm5Y9iv32EY}8kG3v_UQ{E%nym9h5m z!2FYpyPEEM8-|z)>Ed4R=vT0MlA-9uZ++G}w(P7!uf%2lFHcA+-zMhv*V+}>m;CJK zXKN>EVliqYWYsxE6-eXO#LoHpUY6eJP)AE{3F3m@?Z+VitG}r_8 zycRq<${)a0v1DM8^3|_wh@k+(q`|InF28-+YKhlKb#eYaLLFb%mduxeKuenb3OlK<}HhZ)`a7fVt+ zzvzd&A5L?%?+E4)EKcn_t9B$xc{`s|9oa-gvVN+y($zF& z*=LtSH0DZDpUsGW3QN&kQEAVX`g%7i<$F|et!+*o*Y(z;fwZedw^$^9Q$AI@h!yep zMeh-5S98s3a*b!Q{T^R#2psz$l*vRG8JjfpI1mn&#QtzvK`xwZ9((La_^bqWe-7URvc8YilWuU0b@B|KM~{yy6I(p^d?U(9bum*Y_#Ze0x?Ta+*=b zXS%ki)m)*oM%d1M*zvc38HHb3;(D!;qC``XzvJQbZGHt8SL!6}g!CKZj~CRpS{@0^ zm*zaI>AP;mpLN9DaqHYWhV|&sYu^{PRz{?pquZwt8gJ_UDy;g{TEtRxjdSZY|D}ZJ zfEs6aXA0LSb(8*+*G9W8I{o?e%jhcxL(^@$+0xNYqU9(=5$2N`PLD6 z!}|EbYqf(>Jc;rQmLo61Ut%3E_^_FNub-os7Ea`e)ZP)|FQ5K^vSYvd!?f2N%O6I0 z9kq;>9B*Ok`35QbW#YbHXX+nap5}OC=q|jljF*lpcrw1{#hSK!ySyQ$h*S9Y&U-H| z+{;ZR5wI{=mrf|DG`RaJuIUc0T6dHm z`;lpRZzusvo;J?CPcDz5H084PNYsnQhLQEMqh7%Y(|aWk`U%+%#l^^Y=}iltmM$kN zREw+qPJI0Gq)eXcH@z7$;lW?OtOXo)lD(zpgyNcHs(@npo9322y!ht>dxUh3H7!LH-k_tduWj)%8%~{bDLAK| zak8OSP|GT1A^kp*_y9vTU4lpn6}Sw(tY9=G+?5$H6Kor z(&srVZIb1#b|*5}J^Tg}Ju|M_y}lOj(7`=&$F%n_zLnoh+RQPrZeJ3l2a<9AQhaW_bR_4*kWo0JlERfjJR|8aLj#Z7RK@sQ*$m{nojK&)^PQzq=dAr1SnB z?#Y9^+>6c!=(D}}!_=ybPbhsJ0^?^*xOHWs0%+arV{M`Wo;aPBdl1e&w{sx;n79Xi zD_h-}q2=?<)RhAlnsjgvnJRztq_`A}7R~FFt4)Uf6ism{X8E~0#l>&*a)h(wnU*d7q`1(!N^ODlie1OI>-!D)L5O0pAwKcdvHW zA8z5jEcizLdWu3_d~4H--SRS^Vy|X(IT*dYS&D7F#%sH+?09lw*O!C?T+n6v41jG?CsZ@VqLk}05 zzL@Z1TfokW#o4~*^=tlk?98HGnsiHUU|?h-HLafhQs;h~C`{gQ)8hU2jGcp8b&HJ) zTd}D!@uGa*etM14rxx>bf(H)sPW2t*$XywY7<_P6B7l6!MDVtHYs+fg?Ps0G+={8_ zt(&Qv_cQO(t~TCZI~y$T)A2;+p^4DX)wS={f{9A4V%Op=YX#Uu%Xi0}pjfqimo(j# zb;X1{K&x{>)7-78JboQ{P80X;BZ>A5t|TT*Ro}Oes3rUQb%qbFIQS*_jD)!Gyagw z;wz#a&3wX4cDq}H9!Gb0d=!4-h)L*?NNeacEPd;cIyHD^%0zTrkX7r`))&<;E5qz0 z%T7!7#of#Rj~s1h!?)g0=`ti?`I02-qs$zh>CV3IQOqIcsLZa)a}gQTi3Y9gTA!}( zSc+Y;Mqo|ggBq6N$O2iLK3evA1&OTMRI|5I9+c7pMLdm*s-7Cc3vYMv1!RU$&1Y{&V~4{ z!3wK4Hz%D#*LOMGuUwfA7q~wmWb!1>x@*w#@^%dmX7T7&_aLR^^`_V96~)sP^T$0T zg6}rVv?TavZjW-Ja(`H%r`<-Y<{@EwzcTvM%LLr|R_eOEy1lE`A8A4se$jApFJn2j zTY4l3RMDBsq)AnT$w?+91Y0f{)y5s6*FPIN5-yme&GGxqg3W#aEXCt+UQj z`%c7JhH%9d&ME1-Q_q%^sWPaykes1>IH}{3-0Jyy`uL+IgK~DNEBVe6`c=<8j0~Gyd&Go%~d-jeKYDt!)`pV$+qhStTRk+ZcBVJ=@-*W zlwcQ%{wVb3uz+YOGhR6BkmM5~H+lsHG2zi~DyvEbfIzuS+wB+&d$c(K zn=6PZ0At*$=9Ms(x8WzL9)j!MKZptKgq$Oc2{mbft$$WI=8SPI-allVF|N+78Q}~= zw|so9@#@k&KH%;Bo+~5s#<&*mzq~iiYPoAe$GAFAKn`~_mHRnY0BjOsViUrKdBD3j zR+TBwe*q^FC&I+IqKtHlrF(Qcg9sY6igb^r!Hzc9o{nAjkZ7hK3R8-0pX`u0NDqbe zHDc*z=Q_51UEt8Sx)$4a(qxI;{THt(p55V>wQ=TdTYKzO!aE*LsOJbPKJ97lwl;<% ztD@5*r?j}FL~G;f%PY~HZ^pS-@5n!*TI4QlvsXuG+JN3^dd2>|`cztrv2K+D#?(A) zHRZwRt1}F5{hOOUdxfU?#KQ@f2l~uHCnalWT56|vbM8?o`?-B^w>|O-!gG!M!}(q@ zfWuw+IrIuR*51F;)yJp{~y_kROAw8PQujP>=wenmJGj9%z z0n|Lp-e(Yni2@9J2yG40VgW8Km6At3`?SKQ`jj(=Ih4wKn5IT_WDmxn8*>#)4vb=E7LO z%H@0*3(9dkM<->cjIdyACS2HiGCOZZy+}O#jA-$UdInc66a{E&gHH^gVT~^o1sFC4 z(AA$DItnms44`iY_P{8>;F<50M_kf8QGi}l;*0@w*{L!|6ku3_4Dslz}Zlt^ZNOBXccEe z;c&#|&xQ(-*Ux{?iX$d*;k*pJF7cx6Ta9+Qqcc_NS>lY@za{0V|26kMt`pr=Cf_eS+e6#v_ z*<!!hLMqQCAK#K3 zm~zSL=e1%rZ(cwDZEhZU6P$6lfqDJhILDl+8Rw8Jnb*&MQ-LmFmd)#DL*-0XKhKrK zIrIA2YMIIE=jVspeB6UPo7Hde ze0(d&VW!5n%0e8VKuk@)g#i1Xf-Gu1OV*Q|aE=Hr{wo8_60 zZ_d1a9#Awl^fG&{ta<%h+}V~5HIXoZSRwNI1)ZI~n!JAgel7D9n&tBP`DgWWXt9O! z`uR`WRqJB;yng=Eb}Lsdlh@BbtKTy7N^4%fF!Rdg^ZJE~;#^70lXq4>T+0gb`su-J z?pgh`)8?1X>*pZ~v_%#?`YXum=f7g3VQfVXWUs7#i`g)iH zCSESSPKcLD_8$7uJjx7+x9zJq@%H02sVL`}EoEGI;gs=k^GKQICr{(`QSm)Xp9)hg zvh!nD-{ZDoXE((-#V4dKxxRk;c)hnVP;%8xifNv2y*2W}+Vycele(_fw}6r_f5=?Q z2nF0al%FdZ{&e#v3`wer!rn45rTdbLUv$r|u(|KT_SWdqWVa{AQa$F2Hqw1_lWBCU6rV<59^V*G8XPSIF{514!ut8 z<}x@N<(e9kSgHKXDdXqi4!XDQFxXWtG1+HtcVtN|fQ<=5S5l{F z=nqfFg_FCx*Hk$jpH>rxM@KOK>_1nV$)^+G=m!>A92-c&q=DksGwRG~k9{7apE+ZW z%pPuO;+Q>5pd5ZZ&>tM6%?F^~PWSW&)vV>g%k=d?e{f1z zYq2(|YPE>Ifz` zvPnEGBytZ&cr2lo61k&Q`f!oOwa`U@7Ix&<1tGe@L%jcRLzob`o85e=aI?AdR{G>mMuqFb;0|*WReaihRp~d`zV9CFoW>L& zuWQ;MuQ%)HwoXk_k+7wd?Ze%xEJ9Hlh4CcSZ_?Ur27d#jH@4Mp#Yg%OG5Z6M(vKtj zO&i$O2aEXy>l`BYb(2MY4-!UA*up#R)-wRRkWjx#8>L;XJzo-Kw5J6X-0bTQKA38S zIzx>6$QpfV(fc=5G&g#K2i#+(oRfZR=065oH<5VtM}_(6;C-ZSFEv-W`mt&A)={TF zth6|J%Apn_YAbB3-zv|?DfJs_btJBr{Gjn&s`!wqINHNK_78jI_xSkw;K%+wQ#iRN zKxDEnEJ%~f1g1}Vvm4*6w7eLvHS)2gkAW_vivW*awXag0uq?_Wm%o{k^Wt9$k<_7+X*1GV5%hG4_SL zt+JUx8mSHcG`eSq z_;?_%gCQ29NTLyd&#Q05`$&eetrKK%ovX+s54lqlwmL#&>ouNnn27d?-KNc|dmdZu zZbpDn7{kL|-$@*XU2isDd{3smxG8|(NR4eahiLmLRYgK@9brE=ZYYnd+Gb_gmvpmpjBX^=G~QryoX65swG>Nk7t^tfka1Wf1m-){q_f&b zn7ODe_520xtc9}y;+%}`g(H$10zr&#<%8Rk-J@!AaviI@aTlM}X8LfwaPjfuv~XQ! zHp=gp<11`=k7F-eWug-wl)(mnTzAf#?3J1srL}5pm6iv^i~7M!wal__h3lQ4iSp4C zcU)*p6Kf#Rs##+m@QsBmo)P3e;{yfAxxvhOdwe@=shMgww-0unKbz(3)tgd!-yO6< zbQdgG++hTfDz`88?KHNj8G-fP6e1uk#W|We8S-ui42KDrM%7K_;CAc&`(SveJUD6w z-uFZ`s+le*vGQUyUzXoDN9%dIRBlD$73r4&9Z>_BB%Jp$2)qVUdT;JX)JF=*JK~H0!{P*G2X+@H@vX#fq+9&2k z+e~d7cZ{=T9eDwKhsCyfqR!#oO>?_K78)v`hp!tqaWDyr3oz(pR4Qkj#FUp zkVnR}@4>ndWD}#>xjk-z)DWWtGDhxHF`Bwu+d&faBDOWU*-)(%5S|-IzBZ7dvS+bY zU|OG!rDJdS6q@_5+f_5WgW{2$Y-9Fi#0=oQ@^vuy&b>kPR}bb0z+5bd*@x++Wm_a3 zqQgteHdXQmbl9c4KxnrcXp#GBf(+WNEOS`g@~j!3L9~KFM#8M_$!pHYls_Y8v{=z) z#CixF9)iYZwD`O=-^xH^f5K?-*J8^UEk20Gp5CAihwZK_q0Q{JU3QQ?`3mn-GC8Zz zUy8=OtTmvq`Q-|l`@*bDnmCpZte)ll4?h1=KNAaw9CrY<9CAO3#kceIb9_Ur2ve%Y zPRT~)uGly|$W8W73SjyxrI+J!qgbI1QIU4KqP*r`cOFj%d$r!}{WBDKA`Wun(I@s~ zTaNmI`QVm%f^G_X54E$_s?C(?^HzN`>-p2GgM3Bq7QYgS%gSNBOCEd|a)t6yzdNp$ zdt_1fM$Y}w4Pw}7c(5^Qe~=j5k_~1u%0}zjV1rW_zv6WMYY&` zO4LSUt1wwzQ4VvlmDmsd>Ko1Y!Ygo>nnTIg70tvC_wuEuV|{A2d*#6U0<)w!?KV`s zVJD*otXQkK&%~iBzHVW(?~VSc9qGvLb^C4ZRd8F)EETf^1zO|bypSFd2Zi?Kc@=8e zPqD{^^zeo#Po>X0P%>}l2k+OTor?0(y4cw#Z-w%DXId%mZ&&E*^*;abhxE&$0zenH zIqUlV3a6_<`en(9^2P?})bD4+f53XB*JrF)!L|&gT74W7e?Y%1rrD5f8Q5X>?t+BL z3^GD5gfk`*U*RBwP#~kbO7ke$(aZF?3 z*(->-@cNSUO*oXhXr&7h0KSM8?=^pGsJxT4d(kC6Ry zb7ZR(J$ug8pIB8wyzl1=T+JK`t%)z>id@tOyTFQvmp#3Je{2!YoTKK2{A2SBJf28c zeXt?AzDgf#!2C`3kA1Bz>>uOkWF}jBITkM9=X-trxr!T?V~pAOeE(|uxo~~+^EDKU z<8Rew3~f4WsVdeoUDN4YKSwc;(F)b(S8uyo=t)0A$Ts{<-LM(keH<<>VaP3cQu^dy zZ) z%sk`kKf3B(>*dGSzq^t6YQ{J8iq%r%>)%~OW2+cn|L#WOs~O+<{K-p@^UKKL;W8%( zdYpythHRs?3EQM1JG3GY$4uz2!K5N_XgjOZB~V@enHt#kq2X!4_`qVrlgO`-uk#-)q&X z#S9?iH8$q}aerSg7$CX{+ZH<*cy-4l+MZW=-pSCLJ5MCc)5|EruJ)Q$W4`cR(C4>V z_1??4NvF^TJ$>tAbK=y#xPL#Wk4s~h{)@RmKef}oI79m~*RY2qX-hw(Z-zCp7D-y_ zo3~xcWZYz8|LFx9%GBTinYEDx9!@+i(-^8Wrtj`x#!s7u0>4*-171iS`#)`?4 zlpZ*7_>x`wd4p*hD$Sz(mi3|0nqI_0wQ3x-iiGmGVasD>AYuA+fsvrM#)5*B1qDwE z-O^EzCnIqS5=xJqR~-piTNbQ0UU48{76scI78LB4zK8ZXa-yuLNI=!5Y>A{KPb4^x zL&TNR{Kc1s0%}T{D1cfFN^qfroJrXCv0<*FB0(uWJeep!S;L+^=s-KEO3N>{9sdz~ zb0Z~R5J}5G_yWLQYgZ84VL^BSunA>#6Vhl!L}{-Xs#PS2=H~W2G@)5MBfliq0{O z+p}0Vs1R)c8uM!f9o&XPX7{X=QUNG?ENuforED5`5lm3&ux-#a@@y-XA}R#HqRK!c zFT(Lu7~{qiTSy~21s6s5(`9fQNc&I9p(`l|+8EnUHf{fDM-gkUip@E=k|pfV?M-1R z`%imASVu!_nONThr>+$2O%ZZt7%)sO55_o%%j%ijyXsc2_w$bxj zPZWs5T7&-BQWp26UP{@+=54@!ejnr}M71hzFpqeXMoMI|W9qSf%~Jc!&o%D+;Ifjk z#HG&$vD;>RXkM)^nZf)`4RPCjP$Tt>u*GdX3a&BI!&~!7Gm;BBzC-1@d-um`a#5Jp zVV@Fvp4I2yr+Mug@)qE#-t&naBe1`y#}Zl-j=F4D`BvM2qwZ#WO7Hor1G0A0DPpI9 z8e~c&vNGmjEPS9TzmuOKTud+@$`FdH90v)WCrUctsM0 zg<0JG^|c4omlQ^Uj!L`~OQnIvvRgRrHN9mG0ZZ=ek*TkI9uPQU>CGRP*SXK(ZpApE zzNp0>OW$|as@{e*92INXPf)zNJ=1r0*dK|94^wosQ6Wjz$ZDQUpT1@>t3b`wBANc& zU{tS(N@(jp61nbrN+eq!DU8J}Ag_xe^_IMEnq9**hCBBlTKP_$UL5yv=(7>-ey@_D zjzvrdRgKrw!}gT8rE&7)NTfHFAv$}o@?6`dl27!Bc48Y^d)=E%Ce+(q>;UMXkx%XK zu@|<#h(R1bw7$v1OqD_5w3K>SS^M#c)c{Nq4-ULX;(+<{i(I$WKOt+QJWrgI z#zo?|epLXpwRreO?yASP08Ky6j+*UVxwXp^?`PZR^!`o$hxsnz7nV#IL8eJNs#E9; zxQu~nl1y)XS`Wuisn&KFhs%RYtM4LEdXW>dC>D8YeIUg`NG}r}^7Q^G>1E2U$RCtm zrtHEwQvZH!z^%QRKKqK~}=2_iXD%BhiK zHX(GSo~mKegzmN99e$Z7T4;o3ldAmBt;0Rz$gnkQ<7#*5T(^Ezrkc|$8gn$rWKDdc z<;~g$mLXe6X6?`$d1ePh7`29+vowrl1B}-PSwWH4EVSkpezubv`bk{RW0#0&u)4l3 zD#+7&Gh*n?*#2p*`|x^1wnijNw&UAngr^HNc->WmRf;uuL#mSLQAq?5b|8S@x;UU- zCW$abed}9# z5I=lF=WgL%;h$QZJe$X7F>K*DdH8vdQGdRSWqiiR7QOM~$D4ZK!29dLhaN9~qBb)U zR~wop25-irZA%Z*rFhGDkhVU!Av?x{to6ai?z{1Tu+`!?3;?eP)K1qV<6g=F2Lx{0 zc#yF^80FEd zZrHSex^wNyILu+wc9I^z$t?)S4u!C;@#WUXk@%0)&5pwD-7x0`{-u*prAhL!5z}b( z;mJIV7Bf@kOfsf+(i@DJC%~D^5YSy<{H>Q5u(~*Lgn5KrG1+|y{bDo zDoLrSeWN~D1cFsTG#?KT#7FpOQA4WPJ0;Y2L4=X&HxOVjN7mc(NLkwRw$u4(JYX!R zrkH&JYprBT-C{5Mv0bRQ-%raYN3n*f$}pF!=k=A0(?2&YhdUaFkkRq!k*rtxl2dtl zle%HFgHCpySnXR`GLENtp|x_i{eoqEUu(}r>H4Kw?ya>8SJ%&5l~(2epLO#CNe=yN zp~;9-EjU%ZRhz8;$tC)^J@cGhGXKdX!25HbT{8d4C20OK@7X2upIoBuxtj0nl0{A~ zDg2+kh(OR>RG?uVPx72VaRke;WHfg*?a9i8(*5WTqUp#^Bv&{h$(uoESXE^CTK;=d z9=4}_c`%9Qqq#z(baW)JWw|}<$WR z^v=P9*p(%|UDtLa@ycCMzBDj}uB=uAQq9{OC-fnG=PKBa2i6e3MFP0@8XK zSGC#H>7zc>8K^M=y8YO*%mi{@YwGD<>Y-D{!~k(ubB)mJ`@4xT}@YmIs!aYe!im#J53WJY%aV32gdv3JX1jMC;!=3I49H8VFz%akE4k!@p3j-%|3Qvbj@@z@(fhaOCo`jukM`1b);NSKW&x0@dXrDmnkjQbqQ0Dfoyp%GmfpS! z9h+1=C7>3~{x~76^QhuC2ZQr*fsBxCqkl~ap$i(spClf?N1z|YU)R9(6pxWG`lKmo&?DhoAl0OJ!v?R5A()YG@?`tiEtWXxl zMW6L_W{zB2eCw6!^iX%7?ewqk!80zK@On4rUR$pcsks-M9gBzAVc`BV-z|7BpVU!s zK$|Ggms>R?FgX(ms6AiS9iS+O!eU$SR5=!6rP+69Nq(%y4XBmI%pt)jP&YsNAYq?8 z9?!oI(Xs^(<_3hm`O#|=p6?dCt+2Z}BXMsK7HSOK5b6d1*=z2-i+F&I}0N}-yz92xhXTo*^1HfVKHW2vq_$9jGwyzThp@t_aOqcUhrNxFx zSm|<+4Ymm@RoVck$8v`OVbbNI5+-4#ODl-5qml61XsiOzc;DU%CkT@+y+>m||25D7 zY&%FQftHRMO>UKfqlKD;=~ zg`+W_UL~zGHZNwiR0&=*7M4|#CXKlfh(Tk1-Ehdhxd|j`r?G{)Vba*58`6_rG#0uI zp)_)AtNeVafuP2(b`aZPC7(qj-#bAVbh%&~>>7CyOl(`Ja)G zgb8WRwhXLB{d}V1mLJjSppR&J3{&QdWE#)n(VVnnE`}VMd#yN!k7wyD5ZIq=%>$A8 z6ImckkD`_b;*Vs3Fl#xr_&Qge1;SWz(ept3kt`4($Lx6^{zw)Gcs z)n|dg9z|;&h(D4A0@Y&613~IL=o4bdD~T;q)Cb6 zzQ#x}!m8^}T02gvJNvXEx8FzwWs#&xSmcx;Tr@8mOD1rT5R1&9-4Wd2RrQCqyD-{P zNIvncFNGXraP%r#D0xinrEeA8dBWkITHw4n}3`IDq| zAB8wUp2w4v(PR{saWuj!D0q1jG5eS5g-gHk>WVX#$tQ&A3v`Gu+Xgp5T|XylHwnS; z1Zr-@+6RODz~@I+SHVJDh^CJ{|24Udv&U9<_!Y$7o5 z|NUR+iyWCoZrov#(Ohvj>_roe+gh`v$kIga6n`J}M?+;ID=Iux?>Sm@#f@+PfCl{C z?+xH_Mw(2NZfiP`$J%=ZMUl*=|MMU$rP`m}UPqA!Y8g73I~q*Pr|4tydnBt*6JOJo ztPErTnQ8Z?V?a!%H~bimoA2F$)JsNlH-j!(m2N=IgAY5HUs7+X!&#pI)j)B#as#Qa z72DB1J=#k8w$&ZDwGorhvMvN2!HM6f66fZ^-$>{wZ5d1|% zWi|@_zyA$Cj^WEsxb;_*B%){0rxzmHLELc_Aq6r^&>~B-EJZOK8Kp!%%P=ejTq^Q3 zO-1_=Qlzph&k6*~aSXxHQJUnk1Sjw!El{G!h*63lvm{H>6v>bzNuv^UmgN|p#4tE9 z`YS>aVwR^kf#yk8pa@h3s^$oeVL6&(0SGB(X_4nhnx$A;B%uJ6rJ;cW&G5)Nh*A`n zC24^bSymtk5FwNZHz<}DScc#Uk&l)l6is9WmSsed;&^xxr35C+qYiSk)>xX!G8D~1 z2?lz?KnX6(F_Z{@p@#%2K_jptG=+fX0#bO?VTxcxKn=79*8{T#Q6L#W3{4PF4@YL9 zw>;EK0A$o!D8cX)!%!Tc09wlmS(2nkK}1_X7&`g@s0D1ZJTEeEmtkor!(>J1E=zG7 zbXts_h8UvLNU;TyHgPjRq|%9gC{m}3iG$DtuPT5u=nu)!0(1|cqQRtCcvk#~uz+fo zWobd+84}$^C?@OgXzqMCxsuyMr2|8uN(pb|=dNU_cP0VX|BWO@qEtAl zX`^@jK2-YZBZK=3oncFE7LG)u@EVifJ-KPtt(M|7nS=yI<5L>R*M>mS6eAhE?;why zf+T4HZM@7-$QJVSrquX##j& z;002vh675ZXZA6M-1tc~&kZKeVHN}gFl%WifB|-23<*Cg*4Ka*fq9sbrAzYwh z5Vat3c|u@GQN-n;Y8u)rav($nl7yl&jiCj5gOPAS2sBGk?x0lRGV?yL@v53q4BHe$ zHH0Vv#R(v?JzDku58*OPGoIolT8`*Xu?a&mB5)SS5?}@rF(XX@2lJvx!d;qR86Z~4N_fz5+GZUiY9>PMHoR;0)!F+=!0^U zT0#H;0Ne?x1V*ofn*yXm@sy_cX$l6EWkB(R83SfX6qR5^^oAw{pa273K*E8|A*cli zkpp%mfJ+hkLJ1x$3Ra|%p@1p@6%V!$SP4)D1R)5!EHn%el7MUofWd;Ogr@={a!8AT zm_cI?r3qvWK>-kpEC@YPgiaGI1|f(n1+NGMk7XW%4J-fvps^T1wTK}7K)|q^h-x7~ z#L*y(X;6$B5DNOnBN;BxT$H5Y6#;R8fmG-%BMP8Qk$ps=dY}x5cvj?jP^YLGGRx60 zHdw!6L4@i7c}{^91~MAeLuCnuLefp3fxDuptMS~v$r=i}cT>R zA+ZSp>ae z1~!KQ1xpf*DyNp<(6}L{WDzAYfN9_dkSAJ?0rj9?ff_-)l2~Y?X%&mahbRKy@VE@v zaU>cI;r}xC_R5kR$&%(1;2jP)64sODk>hzG{zZ_DuhJWd=Nx%Ve7Mgh>RO_Iq&1a%o3|PdKaRA> z(j)KXidZ~z#KAe9XXTscx1BKw82*%4tMP&+>$m&OM|g?Fp`2V-#JQ|HTRZ=LmU#N{ zwcV#^{AC<^vApBh&u{5uv)WOt<9KQh@g^2SKfcwUP0HRkMI-caO@d|SwydVXz>Z1gY(%Of>Ba(N^O9K2zL4u9#*6q5qZh#Tdc_4$pJQd zS6A>7;@3ywtrr|yu2BosSlYAR?J^>+$0G0=Y*D1dB@GlMUYmYToQbh<Zo||aXQDIh+Q6;K=;pSKjH%;E4pWG9M6$8#H$-4@|C6!iOAFx zF7<}via01D4o3)hoIw+AV(aAVjSE)%PNH(`nU!A?uOXIB9Q$#)YHL4{na5U-(qAD& zXUdL)?ji2zQ=({#h(q>X^Y_LRiclRJF^VIuh?|P@f>0GD|F4-CMsNc#(Xx+gMy!%} zc}kQbKsIu>c;Cuk;x;&1$BbPPU#^H5yCkZ%yW%5yR1PKJqJAk_5Y=|dS zgm=YL&gdV9>-1_?(2b}OA+54px2~WrSfqW6QV>Sxc#9kdhE@~ak+IK#z`LE$&!l4_VxQOz9g1ZWp(Pj zUJ6wjWz83XX?3u!kN> zduo$N5^+OmN@Sx@pi>ZbNRrRL?sZ*$?y2-M3oyS zIL{*wio+xx3&p`;2{&qxSa&slaV-Bh49=rpGqyI)pMG$}fuda!u@clb)?37{NLUMn znd_8@3F|^H`komNB_3;gQ-7ZQ1x=je#jlNX;sIaHQYKOjB_Bo4&0%{Gy5oiPyq9@W~rD`P81XNBP9#ikiMq*2J2PMMCEF*HYjM9bkF#_(~ z?PkxNM7eT^ADsqdqvNo$ISt}dqD~^!jaSREZ2;MEM8*CV)XnB#yG2?Me?ErKr8qDu z7j{vmdSMtvWJJf)$T4{)ouc zh_Ow_LnOr`tHc9b)xKpoapWiy+{6&qiSfB{P!XBRbQTmDT8-ylbO828@vO)0-#VFS z2q**1f}n89RPQh6whbsb9y71x8M(0IR`X_s|9}q084|H3mPgh8iC3ZCL}VcT!I8km zj=VMg&vLqdkSNHB}Q$CR&l>WmYuXGRiNtcaVjRSK^y_g$o45$7YJAIH&X@FlS|`rsS8!5_#IQ^oUDbCR2S4A9%I^!ZT^pz0%Mvmt|c4DE$CMh?a0ShGE zi{}@iI?uD(giXhjYTEV@qvI^!&P9IBY9X=&7iUg+q8cJ7$5uWrXX8YPU;Vq$N%fks+oD5M>RGr|z>5>xdZ@N#iML;>ZJv%f%cY7@I^% zOIN_;FnVH{M(j2+H^4n2etKgOQajz#5esA1ub;1`e*htoB1R~C_bg$DL?yx&`GFv$ z8SgrtUqo~xgT(VV1mjQx`J%K^QW$UUp16&CHo|h8V6ncJuV|nd*=A)a(+N2sQ5n$x z?wVKzq#Y5ai7>h%0>KL+#1)4^{ozfq#B@d6lam8)2o7w1jEdU(JvHMwNg$gh4zEsH z3yiBP3aCQt%ay08o=6-LaSTmeF^*8B?$jDwlLLCr_0|#V2kH3&)QJD%jTbSW(vn-9 zKMXzQT~LVt`tqp#9rFhuGPNTxk*=s<$TQN#ed?1Z9KManKGb}VclA8ZA!B(B;lv+I3Hm1Uh#d4k{-0kWbj-yCebe|yv0k}j?sm~qh^%$%i;Av@ygnlA=~1=C5||tbe3J`seGec2RiA!L9MZ8s zI(y4Ik9%hWE68%Ikqp$6e?R%T>yT1JY`@Sy`z8*h8KJ_tJ#>uDl8D-DtPAvTD1ksj zt%w_rMZ|}|^cchN3h8v63DHdO*U4{t_*zz3WX<1t1BA)gLObp&&Xb-IfRk!PdKzzW z3MY0+^>ep@|z+`6pV%qFINes<_QWSvUkAez2g! z7jL?l0$1q>0UmKcOt&uqYq|g36a~mo;zQ4E&__JtFo(U-DJ}V)2>fx7?svg95|TmP z8>c&4XTZ`S;%$K_?%u^>je;FAh>`vl@wL9`NF}+TQ3ED1Tte{lV^78>xJ-W{h)Gr(8s+gC)SV26ox z5LZ;Tah%)5AgMF(*e&fi+lUDJM1-XP*N$03S(pk!z!h3X@v46G2Ur^lS1}r}$vrMLgg+vjmT&QVC*S3jUfnO=9)OJEdf0b8H1&=biCLqQYCW zjGhEB@SE3{-00r?A9d=k-)16>#_0r<8Zt)Hx68qO22s4@R#}%=V z9uCV)Ufxs-z#|T)ErwpKO~`ZL*p52!pyQc9j$CEcS=srFD`JgB_&eFxEKBDD zTY)}$?&BzwC)tOiPKh9M=vzn7Qj|lH;M52O zag0Y{6sh-~`EEE;BYPJ#s3t6t7_6}ILZeQMRr16dinLBAlUn&p>o*G2p_A$PK&92l z|0FDQn%90i9YR37?vXG|^RtiDOWP!V&K$rC@lTuvDV2(o4vrtWm^n7Ig-r3g9Gl4a z8r77(BpxF{2{b~`aNK%?qWEp`df63mRPEhw{nHif}C+5B0$BvS+Q?o&9uj4D;-Vo zA2b4*^Y2|`80 z=7_gGGU8t1F5{J}Gh9?U(g}%giQJ##W*I`;ydRyT$7r3e&`_1qjtz9k=q23koR$(O$i9u88OH457MRSH!nbZR|xu z{da#2*?GMjHP9ju5 zV}N19*a_eSFB9xCpB~8r!T+XPBe~` zC|+O{jgPY=?mGL#qI-8T>v-ppB=Q+VmJ)$;h=ven$A&ZnrK7rmcWNxGING*)k;QE! zsAXVtI=13w<4Aix_5T9NicmxUb<%tLX{kyz{Cxe_FBE~1RK%&%%s80G8B+h;;-DcEaM4a2yCPAIhO_!FNR4~16*9B{~*`?qCXr<^t60U@x?IU zVzE<`_>7CqHnJbAN|D%4vBEj;D3{9Q6(&AzYLham6@-k6a)$9W@X66rok$v)PLzA;Oi4mp9F_2riKX4F!$Z(o=jx zC91rih!FAQBdgqBKV8)<|NrrC4UjK#OVw;-WMe z&Xx*4v03AaWf+|%W7ie&0aW{2nj5O&$U-CNM3u95(-m>TlJ1b@RT74{CT{e3#W1=i zG6&e64I&g*?8vgHG5tc~ib3NjLh+!?yY$XDv68v)FZ@pT_F#!dnwi|(e<6udmji>u z+I|}OX;VsHpyw;@o&3dvVqa@xiFp}2C{}+&FIL=7AMCHc{O^AT6v8BVXsvULG)q_p z5#3{t6B9Spie5VXL#P3fs{o|1IK%})ccSEe#-Grdij+4#Ye!`{SSTE4@%|!uQ4{C@ z7?g5PY?nrd<|2{jBt=!UeTunwvFsDUHV7$bR7Qg42SM7dJPK?l{s1I$zfvk5CP%>n z%BE=AigKG0Lae%EPQ>Pn_W@!Prx<;tjUww2VAk#xkt9VFh=qBeHSO_(h(6BB9lvWl zF~~~n_tG=^R7JF!X+S)LSW7VaDm~<=kv283NlnUo;uM6zvZ25&Ui}1nj&nZZk()#y zo;qrQ``XI#HL}eJjBz)Lm1r$S*W-maE~pVq$K**`7KB%;$#~R;-&ya`H z0ROK?QCWmze_gQh(`|(LJDOB6APo6b=QjpUB!YD0VQVLVFZfj&yNjmKpR2?SB!Aua z8r#X0wkjmJ3p9x1DMof*^w16kVN|1L$3k_D`;B!UF~w;sh;2j&nB-MixQLYzydpP= zQ`YU1h<5$6GiW!e3En~b-5QCV?Wd{^Z2UnX@sCUnx>hcNSVxpIO6L6nrznu{M@-I$ z-9BhKWllsFGfwqb!!YH9m&Fo5E0tKuR5ddoBgR@gNzT}43r1pU+;Zfg}|x$~mx^aS2`9+c<8{XKIGN9YIjtsu07*c$zmWdjmkDfm zY}e%LfyzT|5`DLt_Cg{SPbn5cO&Z*y=qO_J{cc8Itk3w~Gt@9pQxtJj9H~!I=?=@P zk>cgw$B&Ko*My9VYZu$%iaV2Q*TF3#qFrtcRex0{Sc}b!z1SxZ^3K;K{k2#rZ^`$N z&r*!|3NZ(JRL1vCRVN>n1eee){^9-rS;;?K?>TPTj+JlyImrDm|jhX9N*XJceM-a}P zB{KAZhO<{v$PN%l+1CMy`=J(t=Y+x{}>Ozn=_j6x=I z%={YK1eHvp)t4Q<)S^)rKn!zrXiPyh!#wgNNQ3**)T>y(db_5n(;OQQufg8}+5Mcm z=9BCWLz7hMD+%*)Xx$Pm3G?dxE4(J{-n`y&UfO+pX1r*3u9CbT$5+NqllL28c#Unr zMHgLa6}O))0HALJh+Qt_EbDNA)uNn5&ezT@D9u}|gnmnZOk5-0()Tmf74BQS-=j{d zsc#TdE-}>nxlcbL`E&6Ruj0!rJPJwy^p}MPzPXXad|f8rLnBJ(u$g@1d=WidRX_(+ zSt8c9>40&lecB#bR!n~NxzD~+5wJ1lzS6QzOCoX+S3#1n0j7(r_mwg@{X*?6tKi~` zz(o5;O4mPyl%#ZI5e0^6K3Md4?W7v?>hYi^99*c( zwU$(4`cLlrJg@y0rSi)g8@j2|lsRA7pTm#p_PG zf>PVxnDb;IH~tj%{6R)=IG;JvDEsf)HzpOhp7KCl))7& zVe-BK8Odi?tTr^V?kaIjESrZz&)q92xavpU#GOExh*)0KVu2A+CFdVX{b?L8ZdC<_ zZ2%%6jpyFtyjT_$J;cx`1qKZK<;G&Hc&TBWls}@Bn+hRWRx}Xh}e!+QzD%$@91C3PP7iuH!Jx z{&PIkS#+SQVcXdn&nNe%*ReYOC*5?i68R?heS|I)b|!d4NP_I`6sG`eM@|$+dCJd7pyu3o$n00=vQ>m0$Sx)R{qEY|*wdC!>&`+jWq1mhYKo?J@HxpE|V zbVB`5WRNjYN-RUsv6sl4;{A4ny7bV<4z^3gC64YEQ~mfjcRz@mh~GHUP$KHIx`cq6 z%t?DIB7b&rd<9a~*j};4wp%&KvLfhQ#V|-449t|JfELB-`xA9honapJV>a*};t$u$ z4^cnpK)ul!QDxK-x7oHgsF}VGoNzJi{WS;H3}N{4#mG0+BiIlIsyZ=SEf?U?lQmUk z%`i|Asrc!_2}O3-b7grRp&TI5cIxOPU=HLG62vv}Di0@EWiQDPB=ua@6+Kvp5Q2yC zmm_xE`lN;;$H(@L)Z$W>{(227^h{c?B4YlgYa$o|5hha)OuQ5kUYfc_O1VitlI;(C z50O^%07C3fVZ~qNLh)a}{9LwcF)HHUw;K72_V?fFhlLxSj|zDj7utWXLjJjy*?Q<{ z^2|pM{i#?|RbAINgzGP=YD=@-n@@H3zi6|q?f%vfwYejm_k?!B<-7T8`z{7u0&8O}@O6BE3(7Jo9UrMrat=_N5 z2JRJqQSaLVATsSCBGz9m0AwN%`F^B3)+?ro0AkD2*6T!2>#NKDvlGGZzg#;5#0}d5 z@W0p@*b<@JdS|_s2vAw6uwL!Yhqb3)Y<(BlM3rx%?dm zUp#)`z`B)0n8#nwy8aegZSkeAHASic=AuOJ7fpe-fjYskYibI3ec~=$T|%o4Dz7eq z76sVst8R$fOGe1QuIgX^4_5wf><=LS=LPBYR zO7CKiwfz!Q0L4x7HOb{$B4LsXVx^JGR!kXz3-xV~AisI@k!0I6!$13yZD9Tk@T^PO zVK@0m7GsCz8QdWsKjQr?m`=w#*}R{wrL*)cq7HR*QzpflJA@NonoO90L<2reCQLx0 zdop5q&1~mAk6-chp)48`{e_M^;w!08uNTFoLPb5b)5gSnD!8=ug6pbK<}okD+=x>y z{ZC|kk+P`PPBIaNYd}K3l6n<<=+tMC%r@y^=S>xp9yaYUVGi1&{H;%>q)9Q8U(+LU zm{@8N@mr==NmCPsF~zGC(=8ihx>Hl#HVyc?!{_th$oVV*lQ*_*5!--7wIU>4Uy19A&m4w44QH&gjGa@dDcrr zjE9(Vc@q)o&tkf_l8E@g#I)_se(8*;>Ed~sW(c2-?wqv;W<*Y5`lfH1R(a+(Z=Wb2 zcEjrcsv^HfaV`I9D!A%K>N_YO8$ z<+;q~B%9JmCD?vl!s;$JwwbWnd10rENGjSZ&XUWBS<+skQky4@zf7L37oB^_vow5W zQV|CYC$~8J<=+;_s7ZMgi%Z1RJ;u9>poll z>SD&J(pS>o6SOHW{k@AsGIpXVaOlq)*i54TAm7Qu$09S0 zK+MBO1`QwJylnnt0+*M~PmNi#7hp|5WLOr~r6vG8eP?E;6y?mf6=zvNMC4cq^2D?@ zf#S5-A1<{CU=6RL!wQFpu*nbji^9Pw3H%R~AO4L>BDEHm4*qH_Xd=>TN$8H49LHZa zFs<0w*u~g0FEt<6$@tZL5Y3e~r*Z_5{>4PC92v8}cuML|_DxZ){)DcQsyItnP`+9b zl@gYM0L-R&DTIm5Ahp`n!3^=^Eu6EM=3}~W#WeJOhM0^NyS}(P&0Zpw`+*M*NskoxQWJAPMT%DCQk(*BR6?xr8}K~OCg-iV=HWFy`e&KVlSO8Ab5J@rA`-7Ce`9sYJE?B zOntS!5Ppx2Vk?F%7Bx3cieZj?tPNHoypj{WYc_Sq5kAtS!`fv!C8^0t?J_imc#i!l zpkWfvWKLTFU3re#bWa`i^@MnJ)cfS2pIU50s+rlR78}kXguY9YM<`tKj`!>oT!_k~|%LcCS4qPq8C=|GY9 zo6-}@57x)A)AEDJMbLZi@%8gk6~O18u%0hVy!TtQU6%NhLj6B}Nv`?$NCcB>j#6#k z3|BwB95Wv;T|L$!R{k&P{c=V>q<8wpNu5jT{K$y(q0VC-hR4#S-j^vH%x^xqcEEvnw%n?>iw?D<4Smu@2ONhq^Y!Av>o56z_Tu3z zBDN~Ek)h99{J(}i8}l-4iGODb6fg8iHlnSC+$|Q=Yipr;VG1`wFeqBD*zvChML#z= zvQ-jDZF*t;ja8Bjm+Uc`?gf7}T-xSTrx(s&Oq*=h6E~9Z&R@-X((>m?CU5^c%OBeY zxyz?dN!uWdww2k)e5fDQ6xU@<=0ioWL(42052N{U%(RISys?u;T0dJ(zy1GT0|9p$ zys3WUx8So7!R&28M*0QH701RgLFplL+Jty>Q%J3-VqP0QDjNW-L$@DGKni-CFfZFU zuAncB!*1yyC#Zm?8R{;O#*2gg?VU(zq&jEi?#u?USN73(ts-)2CL*&aY8@PD$! z67}GuU^JyXD$|xY*7=BAMqEREQxq%hLrbf_$OlH&krCXONh1;w{`AW6;>FO)70jAP-sE5y+qT^vYr_%0UkAiE6ekLyNZTKhK(3JL zIs!X{;}@Ehbi)*FuEA?4^7O13!HA+IBRyl0gcrrU!TK*)%+bmj+G6T;-!R52YoXsAhQt=m7MzZq=QUA!WNQ}h%?k^ zCP?44W@r8pj{|nJH_sM*^EEbzD=1U|;bP%$w{CX@i~Tl>N%|6~EG09n_&qWyNF%Yh z0?fBS#b0t9;Co0VpL@hsMyhZcjc>~h8NtLF!0wY(ExU!YP1fve%mgIGJ;4&{63Ye)5)M zaiQmYJOhUtndB)zktW^!`U~$EpaWP+yvZu?po_5}s;@+2^W)AM52esA0kN-any*;) z)R65uQ|PH7Kxq%8W^{f{#tCAeibZerFQ)NZGe2rA} zd*gNDZF0?-PV7;bU;|nwxC~E?x{@1~3HO;lgO0FMJmJjnw7R}cv> zk&K8#ea_KDbP(ib^gLcM3Yx41tXh@5vR5|VhjE_UI-=HJ#^N|rduo@1#>n5s@BH*7+{2lyrHqT`DalMGDFm<3SY6r?Lh=d}a3hVER`1mHskyDfu z2%3|{o2!#HCNQ3vEAgO#}C4w>YX8>3_lVU zjtM{6qW%@7gsm&M+XzXYUQOIfK^#E?`DV>PmUyb{co6=S4xn7lO7SWWjzpubwCkv} z8)>%Oi7HADBMc7N3#+N8k)H>{__O6x&%MBH9_A4jt>PyNn&)-|Vhu!U0N9r1{Tc~M zY<#MU4UYun^~9T2t-<%i$r2|K-lf9(E9)GRX#5;VDY4;(RF=%v@UlK&-SZ>CW7~eF zDlK=)a5S0R@AB7RQ(wymLPK*A4+WK|+=H2d%83|-Qd%Yx+v1Rr-HI|fk`}qEWHCZ3 z3>pQguNG4-m8VGEV$1e;8*xEw4~!DFDZ@B8HZ{cIEfsp98`;ybd^MgDZm;K4g|pm< zrj-AVvYVsS;JD}{Ok|ZP_A0JbE-wDjk|RW1@h~T~;fmKZPlgJn2oSd;3$F*tQ5Ox) zDig|{eO<;0#hfg$R6b=X0TSl#Ye)0|)3A;s3z4u5TKJ!)(vUoqs^c!Zt~@sog;&i& zV?7=uWF4Hy^^U>JhRDu5{Man8XO1j#C{ruDG%oKR2O^=$pZF#$15sVxSx*8U3eoI9 z7-mRqR0U|%^MvEEsZwuJb8>E0>E)i!%qmtaY*q4>?1(C%2W67ae$&=~Uf-m~Ejl79 z4MzFz4eu^0*oZ`3r%FW)5{bvU&dG$(hATsC{H%^SIALQjyTH+n=0wyk&^xuih<~w@ zkO|uwoh#ybixolU+Oukw2p2h>X>0!KKWS1`+ zoLUiPP5j>U+&P-~Fi@**Rd71JASXvUk(mQyN&!;uWV1*Ra3Y}mQ2M7H78A){fdTK6 z-qT@f!Wc%WnXu63{T^~#&Q+4=weFfm-dW~#x+Kr;w6%7%v=k%>)c({woeIMlCYwF) zWI@D#KGP0}%NS8?((Y+!X?G=%X(wBiKw=)qh!oSovGsTuh-o@PEYcr1VicXUg3^GB z>HOK=T2ES;@Ji0I)hu`vQv<2c<%~y>-b5!pqVlx*Lig^jZH#8I!WA2DHcgDZ-636p zw>HP-&W^YG61G{DsF0Kee(OK`6 zV}uJN_>cRTz$$Tyr$@Sda2xj!2ZR#8BVUa18Wq5Dn5ZhArI4?^14kR{Q?*M`*Q)Y` z*`7KuO`?vxZYOdP>jxt7=ToRri$>Wd@K>0djK>5`k7|qbxQ3D^qJUM01^k1aKh>2s z`a=)tx=qC26F%$I0VueNv~HmHFJ=@K=*q}c#!?Zkv<`utjazkgam|A8c2Y^p6$j}3 zcB*x+G>?&>6jfRTa*1CoUZ8G7?!)}?<6lGiSW_aQ(+yyT5)U(K^rilu`fZGkCZS;R zb>E*h8})X}14G;&M3;BAkRuKq{Wr1GN?EW=NmZ>^da!cNK?+LcaW_>*fjW^0yJ-cV z)X`E&7F6u}6@qbgJ!~dRhl^4gPVzRAT|w04P!{N=`a1pzJZmhzRMXbjeuI2e{3v~~ z46(+w@DxEZ3SRyA80G=QvIC|UD_qcY4Gjvy}y@G=-jzOvCZ z+ZwP--bud*3a7R)9Ra9H$HTC?;e!dhC~-p^cMArpT_X$mXtAQGO7yGIxW$bh_i3*(AVy=f4Uy))v`VfM1R z2W^3k#$LJe1@wEA`pRmyYWfW@AdYkxX~^m=ehX(ADrV-*D)opZyJh-eDi7!mVwvX_ zD^==tCJklp93*NpP$1bCI#qcu&B^~)d8E?&ZX3iBUf&X>FW75Lj-S=lnG&||YHA4m zGR!=xn~RR!IFo>a-E#)nrhl0Sib^kXZhE5ExCY8Ft|-fCL-*0#X{2V_$0ThPiG&OK zGo(qUeFNIyEKs?MWYe4&KH_nHrd>jioe(*p5ywIhi~(8eB^S;xJn#?Sk_qqQ<0#xe@q|J1D-l1oPbp zd5{(kLaqLasZDAJa)Xj15e)oaP>eykr8^w~Z&an9*d#4q&G%kR~A?7tOfy>(FHBaC1#XO9wbI@_!j)(4rP67mu-l zpVnm5TpS>~hwmg|HinOs$Q@CK4W`no7c1!` zXn4&*^|1jtLo3T}sLpH(bO0j@FEio|d3c8)i0XHIdQCr29{~G8ir8v1K-R#=p1#i)!u-b99=cfkobrfP ze4FuHv8ozgnpLM|fRDoPhzr4>1&co{@g5pq5kM$#tHBk|O^4IY#KM*gq{ye=9LXR6 zPaY}+j{8-sK*;cT(;!N~9}G-w*)&n)W*ZKBXdCWYH+?41Q8gk;-%S1lz1KV4kn^yX_W?ZmXLu6gy#es+F4Xi5Ov zFNO50%f`{6OFJEO8HL{Z6w0OTVE$7M9{Q3G$iT}Rrtqdfz-vLN3L%7s z&QT`O7=S=Ks_13~;y*dD_b7kH(4zSTas~PKN`I+??-L`G#^u9dN18tCtX6P3Y#4e% zI5I{VGIg}TNljZa(@Uw7CSKW24uvHH(yaM-ztfbTPWLokEoRp82T)*$S^`<1>fOQd ze&{eHTuUSbOGi(jPr<_qE13P(kPUV-a;JJLMAO6pQ6JG1zib`S2o3JlE8V6)lGw5e z+^*=Es0RuKyqNNUEGkVW5F4D}oXAW8NcK97aJm%*gEV#%3rX!$+CTaeAKs8H*2fo_ zSP})~Ng|;eUJrRaBq$p+M_~p58his!0$ox;KdYM%To7wD0>E+Rp#m7;AWjnM5?iqMNbMdbYX7;;o$5UWr6$F+bJs!u@m!B zCGA2XlPcrtuHbvX!$)hh2Ok2o(At&IkmJd)AfpL460Z?NJMCgXv>DXFiI9Yit@<6w zXwGsJXv#3xI0L|DUOb>5M@fN<&sE$8iD(mJBd?V9%>Mh9HKZuT`#4OR;ls_TyF z0S`p^85t(A`fF8KNi>2p1rqESRf~f_R5_+v(uLy(8F`l5PJg%#i z6>%sf*Z`6aNh?KtMFpYeK9ex;J(~<*rxl@y6uZbx5}(#oHG^(4?*U}M-QsxGl{SX@ zv!E%lbx1tmw?9s&!ECTdx?REtZ0NfI_rotf;9jrRu`mb}N<(tdP~&VKg66dkrvw~B zEtwwz+nHw)yK8xdQh@}!WXOU<&4Mj#lT<{Rwxeqr;9X9D;F^aq6_4DSe^Yj%Q@EHC zr7r@PEq1n2#Eh!6XA7yT86rz)ayX%Gv|9Nrxhrz~;Sy@W!tGww*jMLg2zb5p0 zvaj{*;L7)48nBVq_)|zA=Dw3}TGyi9ms~=7;la5LC)^4;}Xf#fcR4+&=p&7S=0Q7xDV#~u@W_l++V{vc=ryM5a+QX zKqQi8u8X9&*7V86$qb*p0?+x_M($5aVqOhvR|S5TKnA^Hq}ypr`pEBY(uvd*`Cote zzob0?E6~oy$zQ`mu=K%YY&=HM{!l9ejx|NAW`T1J?h;29r&Qqac!#92)~U%jq%mkx z?&b0KWYDdpYT25lxLJA63Qhn07oZPfS37cz?!seX2pknTFk9sF2MBm9^OY78Z;^{S zp~rnqnXjM3d<6f&0HQD+;>JopCQgTLC363Ljcux)09ur$h+y*(xcAuj(@;R5BwN(% zQmD?V^MjM}HTZ$SG{~A(4z3j6w}Z#0kS@RBT<9cf{+%qoN&>=Z2JQ06x!?zR{|E4c zt6j=RCMvQsv|C(zmlyz3`NnI_#sb7!5p{)35_oE0qVI4U`9p$Fl=`;WaUC)TBpE8S zenkkF=sMhkjvaeecKC|SEs?7xD^A_;mI^fPv^BZpp}<|{rpIAGdjMx5>&N((Nc`hW ziE@t(2IUgdn;WjRu@}{AT;T5A!ub$2U{3py+Yz+qECKnRJ@6;L>|`%BT-BJNDoR_0 zuK@?x0a&{IC=NBz+v8i zkV+f&kjS~XsN5DiR~%Ym5m0Xo<-rypZFhpVNCXU5Wb8~4UIbriYp6~Va)A3bUIoWp zCh-CffOh%`354S9z41}(nw~m0ph2V@ z45NV5M7r$~j{R@mqqKi;0E}`r>7roGTa#NeIb>xq7NKcI`&J`kF#r3)ie|M#_Rn?~ zaNqcW!%_q#7vC~_=15>H)KH!`;rMOpAz>qShivp@?F_8Xz^t{I#qO31hFLdL;(IiK z8z;VOQ^>261o}~JCVZXa@mb9-KROi2$7Y@y0FU4uS0f~J0o((fD}}#a4-RP1?ozlH z@eP8utUV0Ja^$T$g!yrzaBz6PzIa?g8;Yq|;`J217?Q=FFILV`b9UCv2k)vy6l0S= z$&_UB(iQ4sJO@=Ew*69x$O<>(LVGWY8;In@bXigwfteCqTlNe-O?l}&W9Ah5W7loJFlXYJH z!~B|Pa4;1u-LNAb=@AoNxj*T%x-XbfsNRhN4;N0xq%6<$)yFmvrlAL4De)t>6f@Kg zsG`Xb#7vbhl(Y;D$4trZhQ<}E(QW zm|t-Vc);}`fFnnaaMm%x%cFCIUcxG-o4#63E6XlB>OVUvW%Z5Ti*k~n1m^ou6_LBgW|L1{Rlt>$>mINb|)w;iJW zH3+Sqm4gY!m(1iNNnqTUkRAdIWUqa>(^ zC=55BRPcbs9?Y2#=l1J0Ugbw|?DOCvf1#gERc*l^Tr(L@n@s-&)+VIw$z$TjtcSwet*(Zob98k;W4KMY9b6Zf2 z4i!XQ5U*80`$xL_oBJbI z=jW2os2}5vi>)=)Fy+T4ims!cb*gtCH7Cc(5+UXG(|Bl@q?GRY;N^4t`{fimm5@c51OejTmEGaD@K$5s8FHT1_(NWjisjUUq*Q1Q1rJF0%k z)wv+<*@pb-0e6a}}Wa7GHEY@O!wRv5^4H8Qv)EK zY>Q5Z7h%h>KBQS>YUi4;#hr5)jwDd5FXIZ0quT~Szp4fW5}7s4TU^_xyNSi%ux{C;%{N}>Bi()O4KC$u|HujmZ=?dTn z&?6D;DX4&xo)i^BO0fTkyV_rNusE^q6@pbE!uxH!mZ7KiLhzfovBysOE>SC;CsXn9cTLNm>lw?x%g z9opMRmejyW`!z2pc7nc^A3S3k+8@aP1~Z5llYJ%@Ch~At_xt3e6|flKc8Mg4Ju#@B zF0L#~odQ2(Cn5qC%`5>oUiFkv%;nG@e+}(x)!9YIk zs%)Er4HC}gV)45{3^E9>Sh%H_k1&x-GfQ8eg7MOG8*1`znNxOu8VUU{uZC&k8gpIs z=s8Kq2o-Aho+)#`8_2Z{m|gfb)Og3^8!cLk;Lj}^A{gkO0Xj2ikJK(qJank3h~yrT zDP}dxG~xwtuPD!j#2ach%s&;2OXHO=1hiO+PxuD9bWu!612J#+G($_~H0)S&6^k+g z+@iCANFI&>K1>&E0z6o*sQ1uZ#TFTX$09R5+ZY56Q_UQl><9quGO}%p;y@lHD|C1G zwWRTF$6a%(dxldj1f-+1@c8WkCdk#MI(SActstNJbf~;l4&vJ-H{XM9<3X+r#{nEh z1#}9#6kZuGbs0kx$9&)M;KP!Go+R#jTKdpV)QQ#J3?^Jcd?X`kkGk1kFkdcvR6GKs z+2F6uT)TME@XSW0;+{_z^(E)S#a$Q#!N6MFDm{{j`2;vorBrmv1M__U5V2NxWtb~W z(13@bfAp>=g;cRQw5fP9p62lKW18izZYMQP#pL1Dy{bFo+kDitn2yO=JCsq=#zn=EPL2N6-=)tH&RTj}?@7rn)xO)079lofY8FnAZ; zU%&r?U;=xQcC~EQsM3S1CT?!AzE5&}hGPSdU?#HiCFwcC6Fg6%CIwBd{p~BI~8#hQ;RnG%0Z1s)-3YZr=ph58o|u6WUeX4MMXM}X8N$G7qZYKNI8Gu zTbR(^v$M|DVAAtD4TL>Oa~~0t!Xpz1QTI_PibTb)X)qmKbrB5U`9BQTxz*6YoD0SK z<+yPt@6fck5zM-X(w2-wESPxK$F7fD18nAi)x`g7(r~UKp4HT7GLhU(1Yeq#fy?&t zGns1oKZ40*C5F^U8DoSqVGOu+5gKyHmvONzji>Z~-A!VQUdd}sw8Cp_!!nH<(Y-AA zGU#PyV%uwJ1`}4~F3jQz)V7Whn~p2(OoUB?ae^ zeAk!gHZ|5miZVJ&exaXrW7@F*B|(ut{NncDsn9H0}*TM%*8?Vp(%k^&G{1;ZQ*W zl*3qc0aT+%E*}_xtfctJL_4?wC?Ag^Sj1nG zCgihjH`EPpK=w&v&2c&&G>?3$B2*d}W!fU0vy@)XOc^1Lbl`CcQOH7Xglk?yxg8MUo{cg`% z3|GH7fm>n?hyS?_c;xyFF&OpE@#9XA0@e(l+K_~WCkv{d7VawVp-H{N*T^tM=j8}A zeV6hcKOpv)sD zR*LUZuOo)g?RPYgw0?M?Y2x-uXAbn?&y~y3x#hktpTq^8yk0#jwW!L#1&2glLN%T} z)RI`{AoSLpweQq1F@jk0wWsI~R%UFkC#C6eVrVKF+I^Eb?0U%#V|oWU=pj5p?*H)m zutb?g_}K=o`-?CyQZ@{rIVI#o#Q%UD(tKAQ|kOknlID zF805WP2i^$4QI_snu`f%;~l}0s-Fk0U#f9HtYZIm%b=Q*;Xj9_4p@hvnsQFwZ6M#dPD zElgnJp1<&Tf%kl!fYpTS-zy#sU1w?{m6Y3bfH@BY)s+MpJl{3f<(_k-dW8dw_OW`e z8ddmBz6ZJkkiRd6%^oCGy8g)~$_~`T@8CK{Vo<(CP_T(T*v;Ty!*%nVA8r(fhbASi`FvDUWUpkz*Ql* zs;G1Mjy1uE{5AefL@>N}-Qp<%kGEYJF#owzUi2XdKRKKkzhRfFN`GB?peLS-^80`J z7O*yrzsQ`4Yb1Rw=&D4-fUk4Np0-vBp;yP9D`U027YSdx^fB%f>RtQRJl8elq;`u| zQxl~?{@hNP9?kf`dTIEv+NL=@`}IBeDbDt)cBnV&zeuJY1~fKkqI}L)@1Mu_Cg3RN zI}F&JTaXlRppWttm-6-VrN)AsLeJ=vish+)2A7eBlv{m&{33Oh=V#iuT^xc<`^KXz z8QI2&p`CsQ_bKdkNj>-LX8W66xQukQi+M3`fG8- zb5gS~wO44q@W_3s3F7R~HhCX^d=EASq|MtZXMQr29sbFdLI^j9g=*srn^A08z1NgW zME-+9cCpj%B-u@33~E^tn-E&|=n%>1o3ixFozZ9-cgSJ^Vj16 zY}hJxxirKJK1ifR9i_WG2{pgn~Rfdd{1D zPB!v7tDk$Ab|QFN{=nw1WN<+zjR&U*tvXLIg^VB?hnYp_>Qiybp-@r7UV@&;ww{a` ztbUMm1`FOD0wukEqhP`z`qsMY0_{J1?Z}E~+jUgfZaa2cw<{S)LJhKQ(JWvrq!l#? zk__LgI^onzY}I);Yw-aSZ@H`Yf%yxBu(v@?VY#8Eot%6}w@5aXw+#*-qsvh5xz1c0 z)bxB4t!V&5N@m0qr1=G;zdWj?fBk$BXsKv4HXLm;kBO8lEJkY`(IsN3z-C1Q$^Z)@ z;gkms^Jx%;OV@LR)0bwmMahS;@NBXLyh#!U`2Y(vr=;gc*K~DHziLVwqlj%zih%gY z)myitIpsr|mIPm?0KWsZ#Z$tB${+fyACIDib^#Ymh8yHk!H^ocfD6p7<@6^si}tw$ zOFP>v048%P)pBQF8c1=II^*4@^cvtnux##~ zM-)7oLO{u|b?z%xXU$^`OcJV?L450BPLPYECz(ekYW#Qxky9i1I)7bEKVNQMl+3M0 zG?gwkvZ<8$CH`S7$?7x#>VZ6#xq|+4LMvSfnNTGL{XWB1mz)zH{}M1fyjz*yq09ne zPzS3p)9cG-n6O0ZwMVm|Nu{IgDY;z1HeN4M4-yJ4RIaBj^Ru7lwb{3;hNP6+y?+Ca z550{mMFvKBz@$kyAn$VpUAhj`Vj2_ueNwVCB%`z^wTP6D!7ayzcu0=L0CZx64;XEr zJYqZ+14H-MtqMEv`p!(Jn-44YRpXh;4=ylM7f8dLfCqKWMHKrKYX3W^O~yWqwdHJ) za(AekKVMHQwTLNLYi8IQNsE2>MWdv(!!q#0@sQ%=yI=_9Xkz+5)4E(7`tR!`ZBZZ! zPpe6OvevX7X|{k4xAfv8gs}VP&3OKh+tEvxR^yHW_1k$Vdc`j5wf9u1tjgtPE2gd) z+bOOYhI9n2d@P}1jgOQ5K+XN!#vx#b1RrB>>=MxfO93r?nizQ$qV~AyiozLFd6@s) z(=YRA=-7JY%4{ggX(lJw&h%i>HDA7_Y&0YTIqrz^PA8t5`z6;9HDlw?tl4d$0Oa$I zOW|fkVHNWz`RtqTro#;6rC6EXdn`EVLc=g}@AYY!r{CromvX_!>9 zwX~o3shzQYZZb-=hf?H8-ik&*T(0cap+;SGE(tPCynv)qt*UiQVVKTnF`?>-D zbXjZh<6?*k`eSH{V>%$7HRs9@a7zUDFEYK+qui;qhbd@G)yznT04Gg?mZ;J znk))rjKOObj>G)6w@t1*gWU8lDT`y%BbJ3O%Qi7 z8E#%L9j75?sdkT)2o$2w`R>$ax*%1%GYAZ-9u$DWVtiDUR(3EO zK7Ab})gh1W*I&0jvIRV8vL+GDffAJA02wi3SuC<` zY^38di)gCw(5M*&;M)8Pp8u>b;3!Lujk(0NN~C9980kC{;;ujj8?Ri23|-On@Vmz= z+^vH?)dst{btH>?47UGtdwFE=kajeyn`Y#zjF%bBCghs_YFyOI2aYM{ZSY{YLl<2s&M%N!)aK56@ceNj(($JrzET=QE}vGr)| z+dKQlXD#h+;&o@IuhD=B1h>#OQfT^DYriHz$wuj~^qrart6rZZ{ z1`gExAP7uP>=cb6?>}ZX!hc;WO)I%VgLLUXx8glTdRNj+OII)h_ccC=gPS!9f0j`{ zThpkZrO2%>UMAmzJs~!Hs<;_92=^FEq@mG(?kP+(jj;mNmSk)m`pHHAFIINqv9w&{ z^u?aG>6!(i^G;oPB-L0~107c|4h1KrS@l#XSkHltXP`*a`3@M*dUB94xy!*u(X@;1 zTYgBGG8h34rLWM4sV}-rs+}B?u4l4k*W4%F zFtf3MF&@2S&*sJ#WzrUF-6%GdKpZb>v@`sYWP*l0ebsC$W4ae7?nqZQVU8jmNuVw= zC*zGsp^j(X??+A*o>8m|-l^%#)j}n%dA!GW`s**g21`dvNrZYDX$3A~q6 zo~=n?6MG?=T2KBOM80-stX3`W_h!}YtAoA_(i__wHA;u3r611b1&jA==VEqDBG~ZetlYjkZ}%cq25%Zs>R1lx~DM}Jg?(yv_#zjq8P)*Rm_B{z%yu@<4( z)>Aw1Mk5bso0|FtKIhU^{rxKvWGrP96{%^K&&nakv3SnD-AG*#y9d42wOL+O_>{tz@U-n$QH_aJ=HOCIGX1^J;xZI zx(Jhu+>58S>{>7(I4qa^T1kbBlf`ASGGnK%IS$Vinbkul@eVUr`J2-d9#1i*<0;ac zo;}TP2I{?|{y?!S#$!zGg5@!QRsi~%eSEl6+Nx~mVkZ#|L4kVs4l@UoV#%M3r$&E`- zzo=Py&}5l{7fb0K7{S*Jh8xBn-!k~+@cu4u){QWh0{57l{Y)bv*6eNA=tJn@A^TIScF2H{aMJ>|;j!KV*Tv8r0erQ!V>bz6a<$%;!#OF#1 zx!G^-r-wce9njj|lc~Y}mz8|w9f@N|sdz5Fq(w{IABZh97?@IOKxm0jl<$W~K0X%V z8Wa`V^R-mtdm_`q%ykOZri8=mX6+5yuD)@Uiu1RIZ5^UU(6oM*~WsyGg9g8m|_JJlm*@;VbSH&isS&tgyK!%$)d%6#Kv~<^p0*Z`am=3nl{D z{d(@fi-$p0uTvBF5ByhqZ+0OHC&#!Z`d+|_qJI1FB=86HR-Vk%xo8=z2# z8LQl(-1xXIfp4(C7JHA{vc0772I}7tlwH7fI?^(S8h#14Y$4rhz!byW>z3!qjmZ5CyT5RoCK>23M9VA-i^;IRbeSH z_3bkoR?3F~RXWG4h{Ql3m+QF6M)8lE&1S0B8d`#Rt-(zy89KP9{Uf+$NS4`|QZoe& z^mC<=BsdhwQ^#LCh^pp;Lm9 z%e1DJDK2Hk5)5T5;P^`P!7S zqso2Q+A0vTflGxw*^Wx{u5NPdsg{K*B$kiMwH#bty^CduoAsJ)HW%*`0v(30CS$_vLK9YW~x&;);S zmK=D-SnrXbmlHn|D=1BVw-mSVa&NK*RY6(V!Qg_u18f2}aZ*&U?y>B#s0}sw5cmR} z`s1{`WHvK2t@atlpgEDd*qa(z&%1%SfZ1uJ`R?pbLTcNlx@qn`JZ}{p+syc;8LX-3 zZEz$>UIi~Lcb^BQEa)&u6JzOO%)vZ@g?i!2T^?B*=1P*w1|%1-lwstK<71>xT3o^I zqJI{jDvoQBzcH>vhHC|$jU(0Yb7sn2$g(u$K--v0y4b=+KKnlf;Ql9AI8Yr}!Vs{T z=89BS3*$$oh8|671`Vb)^nyXy2B3w$@Nkj&)C;mTr!kaJr)w^mb`Z4~S@jm0$8dy( zY9yxy{_fIw(C=qj=~AVLJ^!6CB&us?M5+gy>4I43jDmr3Wnvp$w>qIk99^JU1Jz`n z1Wz!-_HW?_Glwt!`ZI~0ag$gXTwfcmV5$}zHkFbT=oG!>ve>De8McW_piBn66gaXO z!V5mBYnYD=z0bpPKtQvoVxQ6{A>1=lO2Ms6H6rgMG2I8=VpSH8>xP5a$D~R!(~WBm zx>pVMj4j}A5lwqbaO(_}LAri7%|Zq+1p8|`N#&NX3v5rW>)2x;De3>0!_RSDcnIK* zZQx|fmU&Kv7Ii1?Q$pc?w$Lt%Dqa?HK6Bi8DsTz$y^8-W#)>#Mp7}sBY>EZ-xn_@5n&Pp#sE9+b+>s-d?PBEgjK2nwVuK zk!V(&97rmsC|_T61<=yxfaA`{n`p85%xIb}@FCIzC_zz#9iU=|8;KQNEbrG~dev^^ z@#=x-_fG8lKUhM6;3C(O)cwj@pP3pfooRT-AV=U@RTK&gf|zaY@g>`zLhCP<;t*}5 z(wMDy$C=&PG<%GLhrKbbWFDdZ{!}8;$$m`rq<3HMNS>_)%kqBZ2e!vP`<=j`?N^7` zrq^m9u3^Rz5iYH5j6v@2ot9XIbskP>i#GfuTt;Y`EMv^OYwaMQP zjI!ma5-do~7(naX@`eEm$T9I0+1mt&4-Z@AYJ}=%Pbc1BJuyFD z4I@{pxXIzEgViu2OR&ougQAaraJzhp(vS`MysapZD-sg?hMZ3^Esw&yHQ`$#F&uSr zax}7j55Oes6)A`C$*22h*V2{%CyT0yQ=R-Nv0FW{-RoYXXyV1XErS@pzb3g|Cl`lU zf5*$?I){i&jToUc2tywnzadMSPO&vZ$>Wd`28~Gg;K5}-5UQZ|x+@eflES!aix0kj zzSMsGNA0=)`Xx~~x*DDSk*AncvcAU7TdWs_bG)g60$sb3Qhvgk+0uq%_DF6DKEpuPs_4n;1EI zkHQSzrkP}BDlzr}>EWjnM#e1(Q}D=@(~wk&zs^#bXHAn_3S!DT=Ud$+W|~tU zZ@XNxB@hB7Lxry)FOIi|`M!4qI>;Oe>YoFY1eqa%%QmZrc9jd_uICETanl(bb0?RE z7dg8m_b%}%ex&uBCJ#T~&D8YvP)XL?ufet$2)5<4v!>w_)Zqz$8~nVCYGF8{fPn{G zQWbqmSqC9(U{7IJy#!l=nl?M3{K*O(ja7s!%}}W(It?W%OxLr|1lMS?680No`Fmic zYgCV`S-esvC3QTNZQ~*uMm4>Syx6u}Lw6L~Ex!je|Fskb1&AL~-)fd044`~RGv^f= zFVVeB=%98pE{*v^(wE>S%zdwf`}>0BZ}9N1K`vUWuFTjr0LS#8Gsn0@3o<9(3pqRvNDeCi!O z+SD3>mdHfUVOJL3X3de-34yaUUandq>E+s~T_ha~Ya!3S>6!xM`MKr*ie93Bd4Dpb zFlTgKR{OH&k2<&d@y7yFNv8v{%ZU+LCKF>%-V3$-HDn@!GOb&(Hx0h(eEVZ5+ScNZ?BElL2c+9m`v6NJ8 zaaFL}5c0pzt=YltJdxWqJ5B~-P^OJj*7a*A!uPLr{e=e5)h{*E{|*`e8M4;vyzl}Z zX?Nlm+ST>uJY66Kt`D=NXSD#8NgE^{a7mDY;)rtyUXEFRBzJnN##*&MU!7iv_w z&=~oVa|!`nu$G`jUFS7Uq+i)RJRA-XghQesHh|JVSB!`5#9&?yW_QOk6iZfFxC#|J zpjBN1RLmz+l3OQ@=hNGJT;Kh_xwWzqz9x|&zFT=;j!#R zS1`2i1>V@79sPMf9(Aafqsf#E;uzU0|8KYOe;ypDXvyo(Z2@5#7JCgv89s!<5{R?V z9B#j=w^de{vOAF)6Sj=l4e(6B}t%&p1P z4U!1s>7ftnLpaZD{{_G@fVy#Tc^L3()S`VVXEVPxqd4NX#d6nvY9hM z+{BalJcUa67`E^|N9uWyY2~V*w%0;H`0-Y!WnffEdh0R~e*dQf%UJ`5faVxIp5mEo z`;&qUO+nrQ?*8TXRQazPS6j;wiP4K5)GJeu)Qp3x&*=0xC3^B;1hfhXj4> znzVPi+-B6NtgYuPv$!H^NDLh?4>$i9{5xG zy;Flkx5Q@X2Fjv^%v?@X>BCn5T;$e`D`+(!TLnZi=O6!Rl$0xNZ!|ZE{4nm+`8e`% z4#|=#F4ll20IqxVtM&DbMhBvPAYP^V%I0DiAZ3lQb1>APA1Kd9tyipCZljC8FSM|5 z8>nADU(mn)=Sd?r^v~AB2O*H;undnUlZm`gkRC)%W%Nl%W4NqmY#} zN~4XOx(yo|mXGz|Ody0}sLQkIW+s)RUSoRQ*r&O-c?x3p@F~Fc!*1VBo+0hl zAd7O@Z;B;X{~h83%8tEO;T*vveEQ8DD=1pI0cd$e7xqGDG<{W zX`@_Xm46O0+)vI2#*c`50T|JpY?_}DS2!g|pbY$ILTJ(j4^D&sbD?C9QQtb_$%oJ@yvv1CaT(pHXtq zMA{qhI|O#2?d}@V+w>t-O`>cY|8zzF=bOc|*Jis$o;iE1GHhHtnm;U8!krZ;-X8vh zL=1CsHlD878ZB3RI!e)mGtT+e764r+H@Y!<2jurW8og%BAFpK0BhNioI#WnfUZRfl zRX|k#J&&C>ftZH0y=cc|SP~=WdWuxN2ZAb$ps&1vBU9I<4 zU{_&5Fm8oq_xCCR*Y;3CB3XSz(UWn3&L^hVpl^^8qmf!;e34c%`jmpmm2dCa4FhKu z1u?&eRihCcdtAi_KYv{(Gaf%JQ<$blKKZ_4KOVu?eFZtq`#l~g$l+x(>%#W> zvGf5qDr~U>}vftdD6~ljbK-yk3$u7uk*Nj#gvTeW3LOqG3fW?wnGZ1A(%xb^-=>N zrk7yFzy|Z?7>e~4NDKcq+Ly_t)XC9=+*_0xU21lo z@$;qhKmQT>cFybD`BwKx&Sfj~$1k=b9~h`wmCkEZdJQ9{ef=u#J(`hVd)< zn6jet2ToeMqP9`(BZoW^L(f3 z8i;_fcP@_f(;xf~3OMvu7*yK7+f8Cf#5O&ZV2*ade$$%EdhHbD$s#-&e2DPeO@78m z59Whlp{Jx8?3xDaRJGjYKKalC8>?pGj;4!xUnZ*h4DfB*9a0`LgMx?fY}tI025Jz5 zdYeR*pZ%2oJQ>OUNLpmq+aDoQg4`fK6JY+!dr~qopzeudy{(CW6j>lIrpbZwtNxM`=G@9qOJVeT zg~&qk{`QqdHfnBPsY_Qt`rh+XKr)}(a;5XsKJ4zFzn}m3)n9d~OjQv0T$&2?sytIl zlUL&(sq#6`ogA-`5>mKN7Ojn0B0w^$8o`QLv5k5)7(7 z`GYs7Q_*-^cS(6@n!!d3hkh+)Z!n{w(%D!Pz$qea$${;^{=zH|xn)mHx9*-US-*`< zIT#&&*Rv}VBSyER8sZ*3P}ID$Xkb;z#l6fl7t4Y4-%KT;b2adn43%ie>6WHxye<&8 z{>~OKm%3r_WB7zXVM^f{vPl*$cqF)D-9>B{@X3fWk z!cpa^>IXYHLRM7lE$WX&^ZWX~vZ4{URITUY+mA;GFJNngv-W2b7?@VXRBc#@T}6a< z4vd^QQ!I~@r89G(#*=eX=&If+vKm4`Wm8B6Uwe|D#DQNgzqR2nf&s@)^Oi@GC~y;o z1~0VdFW2CsEz||MfeRqo_(L2^xgWswTbfqs-z~+Bb$F@2-{QOpLb@?H9Os z!>hryUo$>P(07+v-4(wut|I*{>}OMiewVbFv-<|q0I-q}c*Q!IQf_Y%o6$%y$@1H9 zT&vud}wdO+vcnO$k5=jvc4kf)12^Kr>G@TIdopS=*7wFw>L@gu;(5n9Z? z10Fzf+4ED_wQNckxnmqrV-B0dY>+lHN2_L~9K^m6N$nTeWHRSbz{q15*94WusI*0> ztbDt_aI2hxROj|ZuQ>%g{v=^`%^KOCQI$R>t7faYl9m+zGuqF;1y}8l3Gj6zo>YX1 zN=q+W$L%%h$%7`Pc+%-{IlpQl!)511p&PF%qVw7zLb%4EoLPQvnF>#T*6QR=F=Yt{W5(;vH;JGH(yJ^gZrp8%hW=;010FD+qXEV26=YzAze1uGOu3t(T5i>JxGp0@?BjEVB~5fRt7eB z%G;tl9y}IZ4KyJ(Qg*Hodt=#AF%0A7EF@PbQS!Kc@F2t5Jr*Ji{E7|;q2@ciRkP!m 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 ckubernetes-cluster-logos_final \ No newline at end of file diff --git a/logos/kubernetes-cluster-logos_final-02.svg b/logos/kubernetes-cluster-logos_final-02.svg new file mode 100644 index 000000000000..2133449fe18f --- /dev/null +++ b/logos/kubernetes-cluster-logos_final-02.svg @@ -0,0 +1 @@ +kubernetes-cluster-logos_final \ No newline at end of file diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 000000000000..aabcce4ee024 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,24 @@ +# Netlify build instructions +[build] + command = "./hack/build-gitbook.sh" + publish = "docs/book/_book" + +# Standard Netlify redirects +[[redirects]] + from = "https://kubernetes-sigs-cluster-api.netlify.com/*" + to = "https://cluster-api.sigs.k8s.io/:splat" + status = 301 + force = true + +# HTTP-to-HTTPS rules +[[redirects]] + from = "http://go.cluster-api.sigs.k8s.io/*" + to = "https://go.cluster-api.sigs.k8s.io/:splat" + status = 301 + force = true + +[[redirects]] + from = "http://kubernetes-sigs-cluster-api.netlify.com/*" + to = "http://cluster-api.sigs.k8s.io/:splat" + status = 301 + force = true diff --git a/pkg/apis/cluster/v1alpha1/cluster_types.go b/pkg/apis/cluster/v1alpha1/cluster_types.go index 69bf422db18a..13ddbe1717e2 100644 --- a/pkg/apis/cluster/v1alpha1/cluster_types.go +++ b/pkg/apis/cluster/v1alpha1/cluster_types.go @@ -31,6 +31,7 @@ const ClusterFinalizer = "cluster.cluster.k8s.io" /// [Cluster] // Cluster is the Schema for the clusters API // +k8s:openapi-gen=true +// +kubebuilder:resource:shortName=cl // +kubebuilder:subresource:status type Cluster struct { metav1.TypeMeta `json:",inline"` diff --git a/pkg/apis/cluster/v1alpha1/machine_types.go b/pkg/apis/cluster/v1alpha1/machine_types.go index ac5623bad3d9..e6e978d8f895 100644 --- a/pkg/apis/cluster/v1alpha1/machine_types.go +++ b/pkg/apis/cluster/v1alpha1/machine_types.go @@ -37,6 +37,7 @@ const ( /// [Machine] // Machine is the Schema for the machines API // +k8s:openapi-gen=true +// +kubebuilder:resource:shortName=ma // +kubebuilder:subresource:status // +kubebuilder:printcolumn:name="ProviderID",type="string",JSONPath=".spec.providerID",description="Provider ID" // +kubebuilder:printcolumn:name="Phase",type="string",JSONPath=".status.phase",description="Machine status such as Terminating/Pending/Running/Failed etc" diff --git a/pkg/apis/cluster/v1alpha1/machineclass_types.go b/pkg/apis/cluster/v1alpha1/machineclass_types.go index 7844f6cfa463..1bc0028e0a23 100644 --- a/pkg/apis/cluster/v1alpha1/machineclass_types.go +++ b/pkg/apis/cluster/v1alpha1/machineclass_types.go @@ -30,6 +30,7 @@ import ( // across multiple Machines / MachineSets / MachineDeployments. // +k8s:openapi-gen=true // +resource:path=machineclasses +// +kubebuilder:resource:shortName=mc type MachineClass struct { metav1.TypeMeta `json:",inline"` // +optional diff --git a/pkg/apis/cluster/v1alpha1/machinedeployment_types.go b/pkg/apis/cluster/v1alpha1/machinedeployment_types.go index d685318ff8f4..743bdc2e0ef5 100644 --- a/pkg/apis/cluster/v1alpha1/machinedeployment_types.go +++ b/pkg/apis/cluster/v1alpha1/machinedeployment_types.go @@ -167,6 +167,7 @@ type MachineDeploymentStatus struct { /// [MachineDeployment] // MachineDeployment is the Schema for the machinedeployments API // +k8s:openapi-gen=true +// +kubebuilder:resource:shortName=md // +kubebuilder:subresource:status // +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.labelSelector type MachineDeployment struct { diff --git a/pkg/apis/cluster/v1alpha1/machineset_types.go b/pkg/apis/cluster/v1alpha1/machineset_types.go index 6f9077028036..55f8c13fb174 100644 --- a/pkg/apis/cluster/v1alpha1/machineset_types.go +++ b/pkg/apis/cluster/v1alpha1/machineset_types.go @@ -32,6 +32,7 @@ import ( /// [MachineSet] // MachineSet ensures that a specified number of machines replicas are running at any given time. // +k8s:openapi-gen=true +// +kubebuilder:resource:shortName=ms // +kubebuilder:subresource:status // +kubebuilder:subresource:scale:specpath=.spec.replicas,statuspath=.status.replicas,selectorpath=.status.labelSelector type MachineSet struct { diff --git a/pkg/controller/BUILD.bazel b/pkg/controller/BUILD.bazel index 8f075625a775..14c4a0c2bd3b 100644 --- a/pkg/controller/BUILD.bazel +++ b/pkg/controller/BUILD.bazel @@ -6,7 +6,7 @@ go_library( "add_machinedeployment.go", "add_machineset.go", "add_node.go", - "controller.go", + "noderef_controller.go", ], importpath = "sigs.k8s.io/cluster-api/pkg/controller", visibility = ["//visibility:public"], diff --git a/pkg/controller/cluster/BUILD.bazel b/pkg/controller/cluster/BUILD.bazel index 61c5fa9a2375..230a646ee575 100644 --- a/pkg/controller/cluster/BUILD.bazel +++ b/pkg/controller/cluster/BUILD.bazel @@ -4,7 +4,7 @@ go_library( name = "go_default_library", srcs = [ "actuator.go", - "controller.go", + "cluster_controller.go", "testactuator.go", ], importpath = "sigs.k8s.io/cluster-api/pkg/controller/cluster", @@ -28,8 +28,8 @@ go_library( go_test( name = "go_default_test", srcs = [ - "cluster_controller_suite_test.go", - "cluster_controller_test.go", + "cluster_reconciler_suite_test.go", + "cluster_reconciler_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/controller/cluster/controller.go b/pkg/controller/cluster/cluster_controller.go similarity index 100% rename from pkg/controller/cluster/controller.go rename to pkg/controller/cluster/cluster_controller.go diff --git a/pkg/controller/cluster/cluster_controller_suite_test.go b/pkg/controller/cluster/cluster_reconciler_suite_test.go similarity index 100% rename from pkg/controller/cluster/cluster_controller_suite_test.go rename to pkg/controller/cluster/cluster_reconciler_suite_test.go diff --git a/pkg/controller/cluster/cluster_controller_test.go b/pkg/controller/cluster/cluster_reconciler_test.go similarity index 100% rename from pkg/controller/cluster/cluster_controller_test.go rename to pkg/controller/cluster/cluster_reconciler_test.go diff --git a/pkg/controller/machine/BUILD.bazel b/pkg/controller/machine/BUILD.bazel index 604b374af819..814ee6908d98 100644 --- a/pkg/controller/machine/BUILD.bazel +++ b/pkg/controller/machine/BUILD.bazel @@ -4,7 +4,7 @@ go_library( name = "go_default_library", srcs = [ "actuator.go", - "controller.go", + "machine_controller.go", "testactuator.go", ], importpath = "sigs.k8s.io/cluster-api/pkg/controller/machine", @@ -30,9 +30,9 @@ go_library( go_test( name = "go_default_test", srcs = [ - "controller_test.go", - "machine_controller_suite_test.go", "machine_controller_test.go", + "machine_reconciler_suite_test.go", + "machine_reconciler_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/controller/machine/controller_test.go b/pkg/controller/machine/controller_test.go deleted file mode 100644 index 49cf6128ff3c..000000000000 --- a/pkg/controller/machine/controller_test.go +++ /dev/null @@ -1,193 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package machine - -import ( - "reflect" - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/controller-runtime/pkg/reconcile" -) - -var ( - _ reconcile.Reconciler = &ReconcileMachine{} -) - -func TestReconcileRequest(t *testing.T) { - machine1 := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "create", - Namespace: "default", - Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "testcluster", - }, - }, - } - machine2 := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "update", - Namespace: "default", - Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "testcluster", - }, - }, - } - time := metav1.Now() - machine3 := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "delete", - Namespace: "default", - Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, - DeletionTimestamp: &time, - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "testcluster", - }, - }, - } - clusterList := v1alpha1.ClusterList{ - TypeMeta: metav1.TypeMeta{ - Kind: "ClusterList", - }, - Items: []v1alpha1.Cluster{ - { - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "testcluster", - Namespace: "default", - }, - }, - { - TypeMeta: metav1.TypeMeta{ - Kind: "Cluster", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "rainbow", - Namespace: "foo", - }, - }, - }, - } - - type expected struct { - createCallCount int64 - existCallCount int64 - updateCallCount int64 - deleteCallCount int64 - result reconcile.Result - error bool - } - testCases := []struct { - request reconcile.Request - existsValue bool - expected expected - }{ - { - request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine1.Name, Namespace: machine1.Namespace}}, - expected: expected{ - createCallCount: 1, - existCallCount: 1, - updateCallCount: 0, - deleteCallCount: 0, - result: reconcile.Result{}, - error: false, - }, - }, - { - request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine2.Name, Namespace: machine2.Namespace}}, - existsValue: true, - expected: expected{ - createCallCount: 0, - existCallCount: 1, - updateCallCount: 1, - deleteCallCount: 0, - result: reconcile.Result{}, - error: false, - }, - }, - { - request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine3.Name, Namespace: machine3.Namespace}}, - existsValue: true, - expected: expected{ - createCallCount: 0, - existCallCount: 0, - updateCallCount: 0, - deleteCallCount: 1, - result: reconcile.Result{}, - error: false, - }, - }, - } - - for _, tc := range testCases { - act := newTestActuator() - act.ExistsValue = tc.existsValue - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachine{ - Client: fake.NewFakeClient(&clusterList, &machine1, &machine2, &machine3), - scheme: scheme.Scheme, - actuator: act, - } - - result, err := r.Reconcile(tc.request) - gotError := (err != nil) - if tc.expected.error != gotError { - var errorExpectation string - if !tc.expected.error { - errorExpectation = "no" - } - t.Errorf("Case: %s. Expected %s error, got: %v", tc.request.Name, errorExpectation, err) - } - - if !reflect.DeepEqual(result, tc.expected.result) { - t.Errorf("Case %s. Got: %v, expected %v", tc.request.Name, result, tc.expected.result) - } - - if act.CreateCallCount != tc.expected.createCallCount { - t.Errorf("Case %s. Got: %d createCallCount, expected %d", tc.request.Name, act.CreateCallCount, tc.expected.createCallCount) - } - - if act.UpdateCallCount != tc.expected.updateCallCount { - t.Errorf("Case %s. Got: %d updateCallCount, expected %d", tc.request.Name, act.UpdateCallCount, tc.expected.updateCallCount) - } - - if act.ExistsCallCount != tc.expected.existCallCount { - t.Errorf("Case %s. Got: %d existCallCount, expected %d", tc.request.Name, act.ExistsCallCount, tc.expected.existCallCount) - } - - if act.DeleteCallCount != tc.expected.deleteCallCount { - t.Errorf("Case %s. Got: %d deleteCallCount, expected %d", tc.request.Name, act.DeleteCallCount, tc.expected.deleteCallCount) - } - } -} diff --git a/pkg/controller/machine/controller.go b/pkg/controller/machine/machine_controller.go similarity index 99% rename from pkg/controller/machine/controller.go rename to pkg/controller/machine/machine_controller.go index d8fba73f8aaa..bfd4c4f39047 100644 --- a/pkg/controller/machine/controller.go +++ b/pkg/controller/machine/machine_controller.go @@ -151,7 +151,7 @@ func (r *ReconcileMachine) Reconcile(request reconcile.Request) (reconcile.Resul } // Since adding the finalizer updates the object return to avoid later update issues - return reconcile.Result{}, nil + return reconcile.Result{Requeue: true}, nil } } diff --git a/pkg/controller/machine/machine_controller_test.go b/pkg/controller/machine/machine_controller_test.go index 8d8b2f88e004..49cf6128ff3c 100644 --- a/pkg/controller/machine/machine_controller_test.go +++ b/pkg/controller/machine/machine_controller_test.go @@ -17,60 +17,177 @@ limitations under the License. package machine import ( + "reflect" "testing" - "time" - "golang.org/x/net/context" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" - clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" + "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/client/fake" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) -var c client.Client - -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} - -const timeout = time.Second * 5 +var ( + _ reconcile.Reconciler = &ReconcileMachine{} +) -func TestReconcile(t *testing.T) { - instance := &clusterv1alpha1.Machine{ - ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, - Spec: clusterv1alpha1.MachineSpec{ - Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, +func TestReconcileRequest(t *testing.T) { + machine1 := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "create", + Namespace: "default", + Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "testcluster", + }, }, } - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - if err != nil { - t.Fatalf("error creating new manager: %v", err) + machine2 := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "update", + Namespace: "default", + Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "testcluster", + }, + }, } - c = mgr.GetClient() - - a := newTestActuator() - recFn, requests := SetupTestReconcile(newReconciler(mgr, a)) - if err := add(mgr, recFn); err != nil { - t.Fatalf("error adding controller to manager: %v", err) + time := metav1.Now() + machine3 := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "delete", + Namespace: "default", + Finalizers: []string{v1alpha1.MachineFinalizer, metav1.FinalizerDeleteDependents}, + DeletionTimestamp: &time, + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "testcluster", + }, + }, + } + clusterList := v1alpha1.ClusterList{ + TypeMeta: metav1.TypeMeta{ + Kind: "ClusterList", + }, + Items: []v1alpha1.Cluster{ + { + TypeMeta: metav1.TypeMeta{ + Kind: "Cluster", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "testcluster", + Namespace: "default", + }, + }, + { + TypeMeta: metav1.TypeMeta{ + Kind: "Cluster", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "rainbow", + Namespace: "foo", + }, + }, + }, } - defer close(StartTestManager(mgr, t)) - // Create the Machine object and expect Reconcile and the actuator to be called - if err := c.Create(context.TODO(), instance); err != nil { - t.Fatalf("error creating instance: %v", err) + type expected struct { + createCallCount int64 + existCallCount int64 + updateCallCount int64 + deleteCallCount int64 + result reconcile.Result + error bool } - defer c.Delete(context.TODO(), instance) - select { - case recv := <-requests: - if recv != expectedRequest { - t.Error("received request does not match expected request") - } - case <-time.After(timeout): - t.Error("timed out waiting for request") + testCases := []struct { + request reconcile.Request + existsValue bool + expected expected + }{ + { + request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine1.Name, Namespace: machine1.Namespace}}, + expected: expected{ + createCallCount: 1, + existCallCount: 1, + updateCallCount: 0, + deleteCallCount: 0, + result: reconcile.Result{}, + error: false, + }, + }, + { + request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine2.Name, Namespace: machine2.Namespace}}, + existsValue: true, + expected: expected{ + createCallCount: 0, + existCallCount: 1, + updateCallCount: 1, + deleteCallCount: 0, + result: reconcile.Result{}, + error: false, + }, + }, + { + request: reconcile.Request{NamespacedName: types.NamespacedName{Name: machine3.Name, Namespace: machine3.Namespace}}, + existsValue: true, + expected: expected{ + createCallCount: 0, + existCallCount: 0, + updateCallCount: 0, + deleteCallCount: 1, + result: reconcile.Result{}, + error: false, + }, + }, } - // TODO: Verify that the actuator is called correctly on Create + for _, tc := range testCases { + act := newTestActuator() + act.ExistsValue = tc.existsValue + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachine{ + Client: fake.NewFakeClient(&clusterList, &machine1, &machine2, &machine3), + scheme: scheme.Scheme, + actuator: act, + } + + result, err := r.Reconcile(tc.request) + gotError := (err != nil) + if tc.expected.error != gotError { + var errorExpectation string + if !tc.expected.error { + errorExpectation = "no" + } + t.Errorf("Case: %s. Expected %s error, got: %v", tc.request.Name, errorExpectation, err) + } + + if !reflect.DeepEqual(result, tc.expected.result) { + t.Errorf("Case %s. Got: %v, expected %v", tc.request.Name, result, tc.expected.result) + } + + if act.CreateCallCount != tc.expected.createCallCount { + t.Errorf("Case %s. Got: %d createCallCount, expected %d", tc.request.Name, act.CreateCallCount, tc.expected.createCallCount) + } + + if act.UpdateCallCount != tc.expected.updateCallCount { + t.Errorf("Case %s. Got: %d updateCallCount, expected %d", tc.request.Name, act.UpdateCallCount, tc.expected.updateCallCount) + } + + if act.ExistsCallCount != tc.expected.existCallCount { + t.Errorf("Case %s. Got: %d existCallCount, expected %d", tc.request.Name, act.ExistsCallCount, tc.expected.existCallCount) + } + + if act.DeleteCallCount != tc.expected.deleteCallCount { + t.Errorf("Case %s. Got: %d deleteCallCount, expected %d", tc.request.Name, act.DeleteCallCount, tc.expected.deleteCallCount) + } + } } diff --git a/pkg/controller/machine/machine_controller_suite_test.go b/pkg/controller/machine/machine_reconciler_suite_test.go similarity index 100% rename from pkg/controller/machine/machine_controller_suite_test.go rename to pkg/controller/machine/machine_reconciler_suite_test.go diff --git a/pkg/controller/machine/machine_reconciler_test.go b/pkg/controller/machine/machine_reconciler_test.go new file mode 100644 index 000000000000..8d8b2f88e004 --- /dev/null +++ b/pkg/controller/machine/machine_reconciler_test.go @@ -0,0 +1,76 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package machine + +import ( + "testing" + "time" + + "golang.org/x/net/context" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +var c client.Client + +var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} + +const timeout = time.Second * 5 + +func TestReconcile(t *testing.T) { + instance := &clusterv1alpha1.Machine{ + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, + Spec: clusterv1alpha1.MachineSpec{ + Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, + }, + } + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + if err != nil { + t.Fatalf("error creating new manager: %v", err) + } + c = mgr.GetClient() + + a := newTestActuator() + recFn, requests := SetupTestReconcile(newReconciler(mgr, a)) + if err := add(mgr, recFn); err != nil { + t.Fatalf("error adding controller to manager: %v", err) + } + defer close(StartTestManager(mgr, t)) + + // Create the Machine object and expect Reconcile and the actuator to be called + if err := c.Create(context.TODO(), instance); err != nil { + t.Fatalf("error creating instance: %v", err) + } + defer c.Delete(context.TODO(), instance) + select { + case recv := <-requests: + if recv != expectedRequest { + t.Error("received request does not match expected request") + } + case <-time.After(timeout): + t.Error("timed out waiting for request") + } + + // TODO: Verify that the actuator is called correctly on Create +} diff --git a/pkg/controller/machinedeployment/BUILD.bazel b/pkg/controller/machinedeployment/BUILD.bazel index 44b7489926d8..4f2a0522a690 100644 --- a/pkg/controller/machinedeployment/BUILD.bazel +++ b/pkg/controller/machinedeployment/BUILD.bazel @@ -3,7 +3,7 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ - "controller.go", + "machinedeployment_controller.go", "rolling.go", "sync.go", ], @@ -23,6 +23,7 @@ go_library( "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/types:go_default_library", "//vendor/k8s.io/apimachinery/pkg/util/rand:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//vendor/k8s.io/client-go/tools/record:go_default_library", "//vendor/k8s.io/client-go/util/integer:go_default_library", "//vendor/k8s.io/client-go/util/retry:go_default_library", @@ -39,9 +40,9 @@ go_library( go_test( name = "go_default_test", srcs = [ - "controller_test.go", - "machinedeployment_controller_suite_test.go", "machinedeployment_controller_test.go", + "machinedeployment_reconciler_suite_test.go", + "machinedeployment_reconciler_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/controller/machinedeployment/controller_test.go b/pkg/controller/machinedeployment/controller_test.go deleted file mode 100644 index 87065adc3f24..000000000000 --- a/pkg/controller/machinedeployment/controller_test.go +++ /dev/null @@ -1,349 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package machinedeployment - -import ( - "reflect" - "testing" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" -) - -var ( - _ reconcile.Reconciler = &ReconcileMachineDeployment{} -) - -func TestMachineSetToDeployments(t *testing.T) { - machineDeployment := v1alpha1.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - }, - Spec: v1alpha1.MachineDeploymentSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar", - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - }, - } - - machineDeplopymentList := &v1alpha1.MachineDeploymentList{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineDeploymentList", - }, - Items: []v1alpha1.MachineDeployment{machineDeployment}, - } - - ms1 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withOwnerRef", - Namespace: "test", - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(&machineDeployment, controllerKind), - }, - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - } - ms2 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "noOwnerRefNoLabels", - Namespace: "test", - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - } - ms3 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar", - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - } - - testsCases := []struct { - machineSet v1alpha1.MachineSet - mapObject handler.MapObject - expected []reconcile.Request - }{ - { - machineSet: ms1, - mapObject: handler.MapObject{ - Meta: ms1.GetObjectMeta(), - Object: &ms1, - }, - expected: []reconcile.Request{}, - }, - { - machineSet: ms2, - mapObject: handler.MapObject{ - Meta: ms2.GetObjectMeta(), - Object: &ms2, - }, - expected: nil, - }, - { - machineSet: ms3, - mapObject: handler.MapObject{ - Meta: ms3.GetObjectMeta(), - Object: &ms3, - }, - expected: []reconcile.Request{ - {NamespacedName: client.ObjectKey{Namespace: "test", Name: "withMatchingLabels"}}, - }, - }, - } - - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachineDeployment{ - Client: fake.NewFakeClient(&ms1, &ms2, &ms3, machineDeplopymentList), - scheme: scheme.Scheme, - } - - for _, tc := range testsCases { - got := r.MachineSetToDeployments(tc.mapObject) - if !reflect.DeepEqual(got, tc.expected) { - t.Errorf("Case %s. Got: %v, expected: %v", tc.machineSet.Name, got, tc.expected) - } - } -} - -func TestGetMachineDeploymentsForMachineSet(t *testing.T) { - machineDeployment := v1alpha1.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withLabels", - Namespace: "test", - }, - Spec: v1alpha1.MachineDeploymentSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar", - }, - }, - }, - } - machineDeplopymentList := &v1alpha1.MachineDeploymentList{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineDeploymentList", - }, - Items: []v1alpha1.MachineDeployment{ - machineDeployment, - }, - } - ms1 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "NoMatchingLabels", - Namespace: "test", - }, - } - ms2 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar", - }, - }, - } - - testCases := []struct { - machineDeploymentList v1alpha1.MachineDeploymentList - machineSet v1alpha1.MachineSet - expected []*v1alpha1.MachineDeployment - }{ - { - machineDeploymentList: *machineDeplopymentList, - machineSet: ms1, - expected: nil, - }, - { - machineDeploymentList: *machineDeplopymentList, - machineSet: ms2, - expected: []*v1alpha1.MachineDeployment{&machineDeployment}, - }, - } - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachineDeployment{ - Client: fake.NewFakeClient(&ms1, &ms2, machineDeplopymentList), - scheme: scheme.Scheme, - } - - for _, tc := range testCases { - got := r.getMachineDeploymentsForMachineSet(&tc.machineSet) - if !reflect.DeepEqual(got, tc.expected) { - t.Errorf("Case %s. Got: %v, expected %v", tc.machineSet.Name, got, tc.expected) - } - } -} - -func TestGetMachineSetsForDeployment(t *testing.T) { - machineDeployment1 := v1alpha1.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingOwnerRefAndLabels", - Namespace: "test", - UID: "UID", - }, - Spec: v1alpha1.MachineDeploymentSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar", - }, - }, - }, - } - machineDeployment2 := v1alpha1.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withNoMatchingOwnerRef", - Namespace: "test", - UID: "unMatchingUID", - }, - Spec: v1alpha1.MachineDeploymentSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar2", - }, - }, - }, - } - - ms1 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withNoOwnerRefShouldBeAdopted2", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar2", - }, - }, - } - ms2 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withOwnerRefAndLabels", - Namespace: "test", - OwnerReferences: []metav1.OwnerReference{ - *metav1.NewControllerRef(&machineDeployment1, controllerKind), - }, - Labels: map[string]string{ - "foo": "bar", - }, - }, - } - ms3 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withNoOwnerRefShouldBeAdopted1", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar", - }, - }, - } - ms4 := v1alpha1.MachineSet{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSet", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withNoOwnerRefNoMatch", - Namespace: "test", - Labels: map[string]string{ - "foo": "nomatch", - }, - }, - } - machineSetList := &v1alpha1.MachineSetList{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSetList", - }, - Items: []v1alpha1.MachineSet{ - ms1, - ms2, - ms3, - ms4, - }, - } - - testCases := []struct { - machineDeployment v1alpha1.MachineDeployment - expected []*v1alpha1.MachineSet - }{ - { - machineDeployment: machineDeployment1, - expected: []*v1alpha1.MachineSet{&ms2, &ms3}, - }, - { - machineDeployment: machineDeployment2, - expected: []*v1alpha1.MachineSet{&ms1}, - }, - } - - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachineDeployment{ - Client: fake.NewFakeClient(machineSetList), - scheme: scheme.Scheme, - } - for _, tc := range testCases { - got, err := r.getMachineSetsForDeployment(&tc.machineDeployment) - if err != nil { - t.Errorf("Failed running getMachineSetsForDeployment: %v", err) - } - - if len(tc.expected) != len(got) { - t.Errorf("Case %s. Expected to get %d MachineSets but got %d", tc.machineDeployment.Name, len(tc.expected), len(got)) - } - - for idx, res := range got { - if res.Name != tc.expected[idx].Name || res.Namespace != tc.expected[idx].Namespace { - t.Errorf("Case %s. Expected %q found %q", tc.machineDeployment.Name, res.Name, tc.expected[idx].Name) - } - } - } -} diff --git a/pkg/controller/machinedeployment/controller.go b/pkg/controller/machinedeployment/machinedeployment_controller.go similarity index 87% rename from pkg/controller/machinedeployment/controller.go rename to pkg/controller/machinedeployment/machinedeployment_controller.go index 3fa7a4848abe..873c9cb800c4 100644 --- a/pkg/controller/machinedeployment/controller.go +++ b/pkg/controller/machinedeployment/machinedeployment_controller.go @@ -40,14 +40,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/source" ) +// controllerName is the name of this controller +const controllerName = "machinedeployment-controller" + var ( // controllerKind contains the schema.GroupVersionKind for this controller type. controllerKind = v1alpha1.SchemeGroupVersion.WithKind("MachineDeployment") ) -// controllerName is the name of this controller -const controllerName = "machinedeployment-controller" - // ReconcileMachineDeployment reconciles a MachineDeployment object. type ReconcileMachineDeployment struct { client.Client @@ -106,62 +106,9 @@ func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFu return nil } -func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.MachineDeployment) ([]*v1alpha1.MachineSet, error) { - // List all MachineSets to find those we own but that no longer match our selector. - machineSets := &v1alpha1.MachineSetList{} - listOptions := &client.ListOptions{Namespace: d.Namespace} - - if err := r.Client.List(context.Background(), listOptions, machineSets); err != nil { - return nil, err - } - - filteredMS := make([]*v1alpha1.MachineSet, 0, len(machineSets.Items)) - for idx := range machineSets.Items { - ms := &machineSets.Items[idx] - - selector, err := metav1.LabelSelectorAsSelector(&d.Spec.Selector) - if err != nil { - klog.Errorf("Skipping machineset %v, failed to get label selector from spec selector.", ms.Name) - continue - } - - // If a deployment with a nil or empty selector creeps in, it should match nothing, not everything. - if selector.Empty() { - klog.Warningf("Skipping machineset %v as the selector is empty.", ms.Name) - continue - } - - if !selector.Matches(labels.Set(ms.Labels)) { - klog.V(4).Infof("Skipping machineset %v, label mismatch.", ms.Name) - continue - } - - // Attempt to adopt machine if it meets previous conditions and it has no controller references. - if metav1.GetControllerOf(ms) == nil { - if err := r.adoptOrphan(d, ms); err != nil { - klog.Warningf("Failed to adopt MachineSet %q into MachineDeployment %q: %v", ms.Name, d.Name, err) - continue - } - } - - if !metav1.IsControlledBy(ms, d) { - continue - } - - filteredMS = append(filteredMS, ms) - } - - return filteredMS, nil -} - -func (r *ReconcileMachineDeployment) adoptOrphan(deployment *v1alpha1.MachineDeployment, machineSet *v1alpha1.MachineSet) error { - newRef := *metav1.NewControllerRef(deployment, controllerKind) - machineSet.OwnerReferences = append(machineSet.OwnerReferences, newRef) - return r.Client.Update(context.Background(), machineSet) -} - // Reconcile reads that state of the cluster for a MachineDeployment object and makes changes based on the state read -// and what is in the MachineDeployment.Spec +// and what is in the MachineDeployment.Spec. +// // +kubebuilder:rbac:groups=cluster.k8s.io,resources=machinedeployments;machinedeployments/status,verbs=get;list;watch;create;update;patch;delete func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (reconcile.Result, error) { // Fetch the MachineDeployment instance @@ -176,6 +123,13 @@ func (r *ReconcileMachineDeployment) Reconcile(request reconcile.Request) (recon // Error reading the object - requeue the request. return reconcile.Result{}, err } + + // Ignore deleted MachineDeployments, this can happen when foregroundDeletion + // is enabled + if d.DeletionTimestamp != nil { + return reconcile.Result{}, nil + } + result, err := r.reconcile(ctx, d) if err != nil { klog.Errorf("Failed to reconcile MachineDeployment %q: %v", request.NamespacedName, err) @@ -193,14 +147,14 @@ func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1. if d.Status.ObservedGeneration < d.Generation { d.Status.ObservedGeneration = d.Generation if err := r.Status().Update(context.Background(), d); err != nil { - klog.Warningf("Failed to update status for deployment %v. %v", d.Name, err) + klog.Warningf("Failed to update status for MachineDeployment %q: %v", d.Name, err) return reconcile.Result{}, err } } - return reconcile.Result{}, nil + return reconcile.Result{Requeue: true}, nil } - // Make sure that label selector can match template's labels. + // Make sure that label selector can match the template's labels. // TODO(vincepri): Move to a validation (admission) webhook when supported. selector, err := metav1.LabelSelectorAsSelector(&d.Spec.Selector) if err != nil { @@ -208,7 +162,7 @@ func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1. } if !selector.Matches(labels.Set(d.Spec.Template.Labels)) { - return reconcile.Result{}, errors.Errorf("failed validation on MachineDeployment %q label selector, cannot match any machines ", d.Name) + return reconcile.Result{}, errors.Errorf("failed validation on MachineDeployment %q label selector, cannot match Machine template labels", d.Name) } // Cluster might be nil as some providers might not require a cluster object @@ -243,7 +197,7 @@ func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1. } // Since adding the finalizer updates the object return to avoid later update issues - return reconcile.Result{}, nil + return reconcile.Result{Requeue: true}, nil } msList, err := r.getMachineSetsForDeployment(d) @@ -272,6 +226,7 @@ func (r *ReconcileMachineDeployment) reconcile(ctx context.Context, d *v1alpha1. return reconcile.Result{}, errors.Errorf("unexpected deployment strategy type: %s", d.Spec.Strategy.Type) } +// getCluster reuturns the Cluster associated with the MachineDeployment, if any. func (r *ReconcileMachineDeployment) getCluster(d *v1alpha1.MachineDeployment) (*v1alpha1.Cluster, error) { if d.Spec.Template.Labels[v1alpha1.MachineClusterLabelName] == "" { klog.Infof("Deployment %q in namespace %q doesn't specify %q label, assuming nil cluster", d.Name, d.Namespace, v1alpha1.MachineClusterLabelName) @@ -291,9 +246,65 @@ func (r *ReconcileMachineDeployment) getCluster(d *v1alpha1.MachineDeployment) ( return cluster, nil } +// getMachineSetsForDeployment returns a list of MachineSets associated with a MachineDeployment. +func (r *ReconcileMachineDeployment) getMachineSetsForDeployment(d *v1alpha1.MachineDeployment) ([]*v1alpha1.MachineSet, error) { + + // List all MachineSets to find those we own but that no longer match our selector. + machineSets := &v1alpha1.MachineSetList{} + listOptions := &client.ListOptions{Namespace: d.Namespace} + if err := r.Client.List(context.Background(), listOptions, machineSets); err != nil { + return nil, err + } + + filtered := make([]*v1alpha1.MachineSet, 0, len(machineSets.Items)) + for idx := range machineSets.Items { + ms := &machineSets.Items[idx] + + selector, err := metav1.LabelSelectorAsSelector(&d.Spec.Selector) + if err != nil { + klog.Errorf("Skipping MachineSet %q, failed to get label selector from spec selector: %v", ms.Name, err) + continue + } + + // If a MachineDeployment with a nil or empty selector creeps in, it should match nothing, not everything. + if selector.Empty() { + klog.Warningf("Skipping MachineSet %q as the selector is empty", ms.Name) + continue + } + + if !selector.Matches(labels.Set(ms.Labels)) { + klog.V(4).Infof("Skipping MachineSet %v, label mismatch", ms.Name) + continue + } + + // Attempt to adopt machine if it meets previous conditions and it has no controller references. + if metav1.GetControllerOf(ms) == nil { + if err := r.adoptOrphan(d, ms); err != nil { + klog.Warningf("Failed to adopt MachineSet %q into MachineDeployment %q: %v", ms.Name, d.Name, err) + continue + } + } + + if !metav1.IsControlledBy(ms, d) { + continue + } + + filtered = append(filtered, ms) + } + + return filtered, nil +} + +// adoptOrphan sets the MachineDeployment as a controller OwnerReference to the MachineSet. +func (r *ReconcileMachineDeployment) adoptOrphan(deployment *v1alpha1.MachineDeployment, machineSet *v1alpha1.MachineSet) error { + newRef := *metav1.NewControllerRef(deployment, controllerKind) + machineSet.OwnerReferences = append(machineSet.OwnerReferences, newRef) + return r.Client.Update(context.Background(), machineSet) +} + // getMachineMapForDeployment returns the Machines managed by a Deployment. // -// It returns a map from MachineSet UID to a list of Machines controlled by that MS, +// It returns a map from MachineSet UID to a list of Machines controlled by that MachineSet, // according to the Machine's ControllerRef. func (r *ReconcileMachineDeployment) getMachineMapForDeployment(d *v1alpha1.MachineDeployment, msList []*v1alpha1.MachineSet) (map[types.UID]*v1alpha1.MachineList, error) { // TODO(droot): double check if previous selector maps correctly to new one. @@ -336,11 +347,10 @@ func (r *ReconcileMachineDeployment) getMachineMapForDeployment(d *v1alpha1.Mach return machineMap, nil } -// getMachineDeploymentsForMachineSet returns a list of Deployments that potentially -// match a MachineSet. +// getMachineDeploymentsForMachineSet returns a list of MachineDeployments that could potentially match a MachineSet. func (r *ReconcileMachineDeployment) getMachineDeploymentsForMachineSet(ms *v1alpha1.MachineSet) []*v1alpha1.MachineDeployment { if len(ms.Labels) == 0 { - klog.Warningf("No machine deployments found for MachineSet %v because it has no labels", ms.Name) + klog.Warningf("No machine deployments found for MachineSet %q because it has no labels", ms.Name) return nil } @@ -369,13 +379,17 @@ func (r *ReconcileMachineDeployment) getMachineDeploymentsForMachineSet(ms *v1al return deployments } +// MachineSetTodeployments is a handler.ToRequestsFunc to be used to enqeue requests for reconciliation +// for MachineDeployments that might adopt an orphaned MachineSet. func (r *ReconcileMachineDeployment) MachineSetToDeployments(o handler.MapObject) []reconcile.Request { result := []reconcile.Request{} ms := &v1alpha1.MachineSet{} key := client.ObjectKey{Namespace: o.Meta.GetNamespace(), Name: o.Meta.GetName()} if err := r.Client.Get(context.Background(), key, ms); err != nil { - klog.Errorf("Unable to retrieve Machineset %v from store: %v", key, err) + if !apierrors.IsNotFound(err) { + klog.Errorf("Unable to retrieve MachineSet %q for possible MachineDeployment adoption: %v", key, err) + } return nil } diff --git a/pkg/controller/machinedeployment/machinedeployment_controller_test.go b/pkg/controller/machinedeployment/machinedeployment_controller_test.go index 156f9acfabf8..87065adc3f24 100644 --- a/pkg/controller/machinedeployment/machinedeployment_controller_test.go +++ b/pkg/controller/machinedeployment/machinedeployment_controller_test.go @@ -17,304 +17,333 @@ limitations under the License. package machinedeployment import ( - "strconv" + "reflect" "testing" - "time" - "golang.org/x/net/context" - apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - "k8s.io/apimachinery/pkg/util/intstr" - "sigs.k8s.io/cluster-api/pkg/apis/cluster/common" - clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) -var c client.Client +var ( + _ reconcile.Reconciler = &ReconcileMachineDeployment{} +) -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} +func TestMachineSetToDeployments(t *testing.T) { + machineDeployment := v1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + }, + Spec: v1alpha1.MachineDeploymentSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar", + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, + }, + } -const timeout = time.Second * 5 -const pollingInterval = 10 * time.Millisecond + machineDeplopymentList := &v1alpha1.MachineDeploymentList{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineDeploymentList", + }, + Items: []v1alpha1.MachineDeployment{machineDeployment}, + } -func TestReconcile(t *testing.T) { - labels := map[string]string{"foo": "bar"} - deployment := &clusterv1alpha1.MachineDeployment{ - ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, - Spec: clusterv1alpha1.MachineDeploymentSpec{ - MinReadySeconds: int32Ptr(0), - Replicas: int32Ptr(2), - RevisionHistoryLimit: int32Ptr(0), - Selector: metav1.LabelSelector{MatchLabels: labels}, - Strategy: &clusterv1alpha1.MachineDeploymentStrategy{ - Type: common.RollingUpdateMachineDeploymentStrategyType, - RollingUpdate: &clusterv1alpha1.MachineRollingUpdateDeployment{ - MaxUnavailable: intstrPtr(0), - MaxSurge: intstrPtr(1), - }, + ms1 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withOwnerRef", + Namespace: "test", + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(&machineDeployment, controllerKind), }, - Template: clusterv1alpha1.MachineTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: labels, - }, - Spec: clusterv1alpha1.MachineSpec{ - Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, - }, + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "test-cluster", }, }, } - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - if err != nil { - t.Errorf("error creating new manager: %v", err) + ms2 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "noOwnerRefNoLabels", + Namespace: "test", + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, + } + ms3 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar", + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, } - c = mgr.GetClient() - r := newReconciler(mgr) - recFn, requests, errors := SetupTestReconcile(r) - if err := add(mgr, recFn, r.MachineSetToDeployments); err != nil { - t.Errorf("error adding controller to manager: %v", err) + testsCases := []struct { + machineSet v1alpha1.MachineSet + mapObject handler.MapObject + expected []reconcile.Request + }{ + { + machineSet: ms1, + mapObject: handler.MapObject{ + Meta: ms1.GetObjectMeta(), + Object: &ms1, + }, + expected: []reconcile.Request{}, + }, + { + machineSet: ms2, + mapObject: handler.MapObject{ + Meta: ms2.GetObjectMeta(), + Object: &ms2, + }, + expected: nil, + }, + { + machineSet: ms3, + mapObject: handler.MapObject{ + Meta: ms3.GetObjectMeta(), + Object: &ms3, + }, + expected: []reconcile.Request{ + {NamespacedName: client.ObjectKey{Namespace: "test", Name: "withMatchingLabels"}}, + }, + }, } - defer close(StartTestManager(mgr, t)) - // Create the MachineDeployment object and expect Reconcile to be called. - if err := c.Create(context.TODO(), deployment); err != nil { - t.Errorf("error creating instance: %v", err) + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachineDeployment{ + Client: fake.NewFakeClient(&ms1, &ms2, &ms3, machineDeplopymentList), + scheme: scheme.Scheme, } - defer c.Delete(context.TODO(), deployment) - expectReconcile(t, requests, errors) - // Verify that the MachineSet was created. - machineSets := &clusterv1alpha1.MachineSetList{} - expectInt(t, 1, func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { - return -1 + for _, tc := range testsCases { + got := r.MachineSetToDeployments(tc.mapObject) + if !reflect.DeepEqual(got, tc.expected) { + t.Errorf("Case %s. Got: %v, expected: %v", tc.machineSet.Name, got, tc.expected) } - return len(machineSets.Items) - }) + } +} - ms := machineSets.Items[0] - if r := *ms.Spec.Replicas; r != 2 { - t.Errorf("replicas was %d not 2", r) +func TestGetMachineDeploymentsForMachineSet(t *testing.T) { + machineDeployment := v1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withLabels", + Namespace: "test", + }, + Spec: v1alpha1.MachineDeploymentSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar", + }, + }, + }, } - if k := ms.Spec.Template.Spec.Versions.Kubelet; k != "1.10.3" { - t.Errorf("kubelet was %q not '1.10.3'", k) + machineDeplopymentList := &v1alpha1.MachineDeploymentList{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineDeploymentList", + }, + Items: []v1alpha1.MachineDeployment{ + machineDeployment, + }, } - - // Delete a MachineSet and expect Reconcile to be called to replace it. - if err := c.Delete(context.TODO(), &ms); err != nil { - t.Errorf("error deleting machineset: %v", err) + ms1 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "NoMatchingLabels", + Namespace: "test", + }, + } + ms2 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar", + }, + }, } - expectReconcile(t, requests, errors) - expectInt(t, 1, func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { - return -1 - } - return len(machineSets.Items) - }) - // Scale a MachineDeployment and expect Reconcile to be called - if err := updateMachineDeployment(c, deployment, func(d *clusterv1alpha1.MachineDeployment) { d.Spec.Replicas = int32Ptr(5) }); err != nil { - t.Errorf("error scaling machinedeployment: %v", err) + testCases := []struct { + machineDeploymentList v1alpha1.MachineDeploymentList + machineSet v1alpha1.MachineSet + expected []*v1alpha1.MachineDeployment + }{ + { + machineDeploymentList: *machineDeplopymentList, + machineSet: ms1, + expected: nil, + }, + { + machineDeploymentList: *machineDeplopymentList, + machineSet: ms2, + expected: []*v1alpha1.MachineDeployment{&machineDeployment}, + }, } - if err := c.Update(context.TODO(), deployment); err != nil { - t.Errorf("error updating instance: %v", err) + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachineDeployment{ + Client: fake.NewFakeClient(&ms1, &ms2, machineDeplopymentList), + scheme: scheme.Scheme, } - expectReconcile(t, requests, errors) - expectInt(t, 5, func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { - return -1 - } - if len(machineSets.Items) != 1 { - return -1 + + for _, tc := range testCases { + got := r.getMachineDeploymentsForMachineSet(&tc.machineSet) + if !reflect.DeepEqual(got, tc.expected) { + t.Errorf("Case %s. Got: %v, expected %v", tc.machineSet.Name, got, tc.expected) } - return int(*machineSets.Items[0].Spec.Replicas) - }) + } +} - // Update a MachineDeployment, expect Reconcile to be called and a new MachineSet to appear - if err := updateMachineDeployment(c, deployment, func(d *clusterv1alpha1.MachineDeployment) { d.Spec.Template.Labels["updated"] = "true" }); err != nil { - t.Errorf("error scaling machinedeployment: %v", err) +func TestGetMachineSetsForDeployment(t *testing.T) { + machineDeployment1 := v1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingOwnerRefAndLabels", + Namespace: "test", + UID: "UID", + }, + Spec: v1alpha1.MachineDeploymentSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar", + }, + }, + }, } - if err := c.Update(context.TODO(), deployment); err != nil { - t.Errorf("error updating instance: %v", err) + machineDeployment2 := v1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withNoMatchingOwnerRef", + Namespace: "test", + UID: "unMatchingUID", + }, + Spec: v1alpha1.MachineDeploymentSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar2", + }, + }, + }, } - expectReconcile(t, requests, errors) - expectInt(t, 2, func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { - return -1 - } - return len(machineSets.Items) - }) - // Wait for the new MachineSet to get scaled up and set .Status.Replicas and .Status.AvailableReplicas - // at each step - var newMachineSet, oldMachineSet *clusterv1alpha1.MachineSet - resourceVersion0, err0 := strconv.Atoi(machineSets.Items[0].ResourceVersion) - resourceVersion1, err1 := strconv.Atoi(machineSets.Items[1].ResourceVersion) - if err0 != nil { - t.Fatalf("Unable to convert MS %q ResourceVersion to a number: %v", machineSets.Items[0].Name, err0) + ms1 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withNoOwnerRefShouldBeAdopted2", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar2", + }, + }, } - if err1 != nil { - t.Fatalf("Unable to convert MS %q ResourceVersion to a number: %v", machineSets.Items[1].Name, err1) + ms2 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withOwnerRefAndLabels", + Namespace: "test", + OwnerReferences: []metav1.OwnerReference{ + *metav1.NewControllerRef(&machineDeployment1, controllerKind), + }, + Labels: map[string]string{ + "foo": "bar", + }, + }, } - - if resourceVersion0 > resourceVersion1 { - newMachineSet = &machineSets.Items[0] - oldMachineSet = &machineSets.Items[1] - } else { - newMachineSet = &machineSets.Items[1] - oldMachineSet = &machineSets.Items[0] + ms3 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withNoOwnerRefShouldBeAdopted1", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar", + }, + }, } - - // Start off by setting .Status.Replicas and .Status.AvailableReplicas of the old MachineSet - oldMachineSet.Status.AvailableReplicas = *oldMachineSet.Spec.Replicas - oldMachineSet.Status.Replicas = *oldMachineSet.Spec.Replicas - if err := c.Status().Update(context.TODO(), oldMachineSet); err != nil { - t.Errorf("error updating machineset: %v", err) + ms4 := v1alpha1.MachineSet{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSet", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withNoOwnerRefNoMatch", + Namespace: "test", + Labels: map[string]string{ + "foo": "nomatch", + }, + }, } - expectReconcile(t, requests, errors) - - // Iterate over the scalesteps - step := 1 - for step < 5 { - // Wait for newMachineSet to be scaled up - expectTrue(t, func(ctx context.Context) bool { - if err = c.Get(ctx, types.NamespacedName{ - Namespace: newMachineSet.Namespace, Name: newMachineSet.Name}, newMachineSet); err != nil { - return false - } - - currentReplicas := int(*newMachineSet.Spec.Replicas) - step = currentReplicas - return currentReplicas >= step && currentReplicas < 6 - }) - - newMachineSet.Status.Replicas = *newMachineSet.Spec.Replicas - newMachineSet.Status.AvailableReplicas = *newMachineSet.Spec.Replicas - if err := c.Status().Update(context.TODO(), newMachineSet); err != nil { - t.Logf("error updating machineset: %v", err) - } - expectReconcile(t, requests, errors) - - // Wait for oldMachineSet to be scaled down - updateOldMachineSet := true - expectTrue(t, func(ctx context.Context) bool { - if err := c.Get(ctx, types.NamespacedName{Namespace: oldMachineSet.Namespace, Name: oldMachineSet.Name}, oldMachineSet); err != nil { - if apierrors.IsNotFound(err) { - updateOldMachineSet = false - return true - } - return false - } - - return int(*oldMachineSet.Spec.Replicas) <= 5-step - }) - - if updateOldMachineSet { - oldMachineSet.Status.Replicas = *oldMachineSet.Spec.Replicas - oldMachineSet.Status.AvailableReplicas = *oldMachineSet.Spec.Replicas - oldMachineSet.Status.ObservedGeneration = oldMachineSet.Generation - if err := c.Status().Update(context.TODO(), oldMachineSet); err != nil { - t.Logf("error updating machineset: %v", err) - } - expectReconcile(t, requests, errors) - } + machineSetList := &v1alpha1.MachineSetList{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSetList", + }, + Items: []v1alpha1.MachineSet{ + ms1, + ms2, + ms3, + ms4, + }, } - // Expect the old MachineSet to be removed - expectInt(t, 1, func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { - return -1 - } - return len(machineSets.Items) - }) -} - -func int32Ptr(i int32) *int32 { - return &i -} - -func intstrPtr(i int32) *intstr.IntOrString { - // FromInt takes an int that must not be greater than int32... - intstr := intstr.FromInt(int(i)) - return &intstr -} - -func expectReconcile(t *testing.T, requests chan reconcile.Request, errors chan error) { - t.Helper() - - ctx, cancel := context.WithTimeout(context.TODO(), timeout) - defer cancel() - -LOOP: - for range time.Tick(pollingInterval) { - select { - case recv := <-requests: - if recv == expectedRequest { - break LOOP - } - case <-ctx.Done(): - t.Fatalf("timed out waiting reconcile request") - } + testCases := []struct { + machineDeployment v1alpha1.MachineDeployment + expected []*v1alpha1.MachineSet + }{ + { + machineDeployment: machineDeployment1, + expected: []*v1alpha1.MachineSet{&ms2, &ms3}, + }, + { + machineDeployment: machineDeployment2, + expected: []*v1alpha1.MachineSet{&ms1}, + }, } - for range time.Tick(pollingInterval) { - select { - case err := <-errors: - if err == nil { - return - } - case <-ctx.Done(): - t.Fatalf("timed out waiting reconcile error") - } + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachineDeployment{ + Client: fake.NewFakeClient(machineSetList), + scheme: scheme.Scheme, } -} - -func expectInt(t *testing.T, expect int, fn func(context.Context) int) { - t.Helper() - - ctx, cancel := context.WithTimeout(context.TODO(), timeout) - defer cancel() - - for range time.Tick(pollingInterval) { - intCh := make(chan int) - go func() { intCh <- fn(ctx) }() - - select { - case n := <-intCh: - if n == expect { - return - } - case <-ctx.Done(): - t.Fatalf("timed out waiting for value: %d", expect) - return + for _, tc := range testCases { + got, err := r.getMachineSetsForDeployment(&tc.machineDeployment) + if err != nil { + t.Errorf("Failed running getMachineSetsForDeployment: %v", err) } - } -} -func expectTrue(t *testing.T, fn func(context.Context) bool) { - t.Helper() - - ctx, cancel := context.WithTimeout(context.TODO(), timeout) - defer cancel() - - for range time.Tick(pollingInterval) { - boolCh := make(chan bool) - go func() { boolCh <- fn(ctx) }() + if len(tc.expected) != len(got) { + t.Errorf("Case %s. Expected to get %d MachineSets but got %d", tc.machineDeployment.Name, len(tc.expected), len(got)) + } - select { - case n := <-boolCh: - if n { - return + for idx, res := range got { + if res.Name != tc.expected[idx].Name || res.Namespace != tc.expected[idx].Namespace { + t.Errorf("Case %s. Expected %q found %q", tc.machineDeployment.Name, res.Name, tc.expected[idx].Name) } - case <-ctx.Done(): - t.Fatal("timed out waiting for condition") - return } } } diff --git a/pkg/controller/machinedeployment/machinedeployment_controller_suite_test.go b/pkg/controller/machinedeployment/machinedeployment_reconciler_suite_test.go similarity index 100% rename from pkg/controller/machinedeployment/machinedeployment_controller_suite_test.go rename to pkg/controller/machinedeployment/machinedeployment_reconciler_suite_test.go diff --git a/pkg/controller/machinedeployment/machinedeployment_reconciler_test.go b/pkg/controller/machinedeployment/machinedeployment_reconciler_test.go new file mode 100644 index 000000000000..a573d258b3b6 --- /dev/null +++ b/pkg/controller/machinedeployment/machinedeployment_reconciler_test.go @@ -0,0 +1,323 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package machinedeployment + +import ( + "strconv" + "testing" + "time" + + "golang.org/x/net/context" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/util/intstr" + "sigs.k8s.io/cluster-api/pkg/apis/cluster/common" + clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +const ( + timeout = time.Second * 5 + pollingInterval = 10 * time.Millisecond +) + +var ( + c client.Client + expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} +) + +func TestReconcile(t *testing.T) { + labels := map[string]string{"foo": "bar"} + deployment := &clusterv1alpha1.MachineDeployment{ + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, + Spec: clusterv1alpha1.MachineDeploymentSpec{ + MinReadySeconds: int32Ptr(0), + Replicas: int32Ptr(2), + RevisionHistoryLimit: int32Ptr(0), + Selector: metav1.LabelSelector{MatchLabels: labels}, + Strategy: &clusterv1alpha1.MachineDeploymentStrategy{ + Type: common.RollingUpdateMachineDeploymentStrategyType, + RollingUpdate: &clusterv1alpha1.MachineRollingUpdateDeployment{ + MaxUnavailable: intstrPtr(0), + MaxSurge: intstrPtr(1), + }, + }, + Template: clusterv1alpha1.MachineTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: labels, + }, + Spec: clusterv1alpha1.MachineSpec{ + Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, + }, + }, + }, + } + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + if err != nil { + t.Errorf("error creating new manager: %v", err) + } + c = mgr.GetClient() + + r := newReconciler(mgr) + recFn, requests, errors := SetupTestReconcile(r) + if err := add(mgr, recFn, r.MachineSetToDeployments); err != nil { + t.Errorf("error adding controller to manager: %v", err) + } + defer close(StartTestManager(mgr, t)) + + // Create the MachineDeployment object and expect Reconcile to be called. + if err := c.Create(context.TODO(), deployment); err != nil { + t.Errorf("error creating instance: %v", err) + } + defer c.Delete(context.TODO(), deployment) + expectReconcile(t, requests, errors) + + // Verify that the MachineSet was created. + machineSets := &clusterv1alpha1.MachineSetList{} + expectInt(t, 1, func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { + return -1 + } + return len(machineSets.Items) + }) + + ms := machineSets.Items[0] + if r := *ms.Spec.Replicas; r != 2 { + t.Errorf("replicas was %d not 2", r) + } + if k := ms.Spec.Template.Spec.Versions.Kubelet; k != "1.10.3" { + t.Errorf("kubelet was %q not '1.10.3'", k) + } + + // Delete a MachineSet and expect Reconcile to be called to replace it. + if err := c.Delete(context.TODO(), &ms); err != nil { + t.Errorf("error deleting machineset: %v", err) + } + expectReconcile(t, requests, errors) + expectInt(t, 1, func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { + return -1 + } + return len(machineSets.Items) + }) + + // Scale a MachineDeployment and expect Reconcile to be called + if err := updateMachineDeployment(c, deployment, func(d *clusterv1alpha1.MachineDeployment) { d.Spec.Replicas = int32Ptr(5) }); err != nil { + t.Errorf("error scaling machinedeployment: %v", err) + } + if err := c.Update(context.TODO(), deployment); err != nil { + t.Errorf("error updating instance: %v", err) + } + expectReconcile(t, requests, errors) + expectInt(t, 5, func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { + return -1 + } + if len(machineSets.Items) != 1 { + return -1 + } + return int(*machineSets.Items[0].Spec.Replicas) + }) + + // Update a MachineDeployment, expect Reconcile to be called and a new MachineSet to appear + if err := updateMachineDeployment(c, deployment, func(d *clusterv1alpha1.MachineDeployment) { d.Spec.Template.Labels["updated"] = "true" }); err != nil { + t.Errorf("error scaling machinedeployment: %v", err) + } + if err := c.Update(context.TODO(), deployment); err != nil { + t.Errorf("error updating instance: %v", err) + } + expectReconcile(t, requests, errors) + expectInt(t, 2, func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { + return -1 + } + return len(machineSets.Items) + }) + + // Wait for the new MachineSet to get scaled up and set .Status.Replicas and .Status.AvailableReplicas + // at each step + var newMachineSet, oldMachineSet *clusterv1alpha1.MachineSet + resourceVersion0, err0 := strconv.Atoi(machineSets.Items[0].ResourceVersion) + resourceVersion1, err1 := strconv.Atoi(machineSets.Items[1].ResourceVersion) + if err0 != nil { + t.Fatalf("Unable to convert MS %q ResourceVersion to a number: %v", machineSets.Items[0].Name, err0) + } + if err1 != nil { + t.Fatalf("Unable to convert MS %q ResourceVersion to a number: %v", machineSets.Items[1].Name, err1) + } + + if resourceVersion0 > resourceVersion1 { + newMachineSet = &machineSets.Items[0] + oldMachineSet = &machineSets.Items[1] + } else { + newMachineSet = &machineSets.Items[1] + oldMachineSet = &machineSets.Items[0] + } + + // Start off by setting .Status.Replicas and .Status.AvailableReplicas of the old MachineSet + oldMachineSet.Status.AvailableReplicas = *oldMachineSet.Spec.Replicas + oldMachineSet.Status.Replicas = *oldMachineSet.Spec.Replicas + if err := c.Status().Update(context.TODO(), oldMachineSet); err != nil { + t.Errorf("error updating machineset: %v", err) + } + expectReconcile(t, requests, errors) + + // Iterate over the scalesteps + step := 1 + for step < 5 { + // Wait for newMachineSet to be scaled up + expectTrue(t, func(ctx context.Context) bool { + if err = c.Get(ctx, types.NamespacedName{ + Namespace: newMachineSet.Namespace, Name: newMachineSet.Name}, newMachineSet); err != nil { + return false + } + + currentReplicas := int(*newMachineSet.Spec.Replicas) + step = currentReplicas + return currentReplicas >= step && currentReplicas < 6 + }) + + newMachineSet.Status.Replicas = *newMachineSet.Spec.Replicas + newMachineSet.Status.AvailableReplicas = *newMachineSet.Spec.Replicas + if err := c.Status().Update(context.TODO(), newMachineSet); err != nil { + t.Logf("error updating machineset: %v", err) + } + expectReconcile(t, requests, errors) + + // Wait for oldMachineSet to be scaled down + updateOldMachineSet := true + expectTrue(t, func(ctx context.Context) bool { + if err := c.Get(ctx, types.NamespacedName{Namespace: oldMachineSet.Namespace, Name: oldMachineSet.Name}, oldMachineSet); err != nil { + if apierrors.IsNotFound(err) { + updateOldMachineSet = false + return true + } + return false + } + + return int(*oldMachineSet.Spec.Replicas) <= 5-step + }) + + if updateOldMachineSet { + oldMachineSet.Status.Replicas = *oldMachineSet.Spec.Replicas + oldMachineSet.Status.AvailableReplicas = *oldMachineSet.Spec.Replicas + oldMachineSet.Status.ObservedGeneration = oldMachineSet.Generation + if err := c.Status().Update(context.TODO(), oldMachineSet); err != nil { + t.Logf("error updating machineset: %v", err) + } + expectReconcile(t, requests, errors) + } + } + + // Expect the old MachineSet to be removed + expectInt(t, 1, func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machineSets); err != nil { + return -1 + } + return len(machineSets.Items) + }) +} + +func int32Ptr(i int32) *int32 { + return &i +} + +func intstrPtr(i int32) *intstr.IntOrString { + // FromInt takes an int that must not be greater than int32... + intstr := intstr.FromInt(int(i)) + return &intstr +} + +func expectReconcile(t *testing.T, requests chan reconcile.Request, errors chan error) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.TODO(), timeout) + defer cancel() + +LOOP: + for range time.Tick(pollingInterval) { + select { + case recv := <-requests: + if recv == expectedRequest { + break LOOP + } + case <-ctx.Done(): + t.Fatalf("timed out waiting reconcile request") + } + } + + for range time.Tick(pollingInterval) { + select { + case err := <-errors: + if err == nil { + return + } + case <-ctx.Done(): + t.Fatalf("timed out waiting reconcile error") + } + } +} + +func expectInt(t *testing.T, expect int, fn func(context.Context) int) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.TODO(), timeout) + defer cancel() + + for range time.Tick(pollingInterval) { + intCh := make(chan int) + go func() { intCh <- fn(ctx) }() + + select { + case n := <-intCh: + if n == expect { + return + } + case <-ctx.Done(): + t.Fatalf("timed out waiting for value: %d", expect) + return + } + } +} + +func expectTrue(t *testing.T, fn func(context.Context) bool) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.TODO(), timeout) + defer cancel() + + for range time.Tick(pollingInterval) { + boolCh := make(chan bool) + go func() { boolCh <- fn(ctx) }() + + select { + case n := <-boolCh: + if n { + return + } + case <-ctx.Done(): + t.Fatal("timed out waiting for condition") + return + } + } +} diff --git a/pkg/controller/machinedeployment/rolling.go b/pkg/controller/machinedeployment/rolling.go index c329f5fe0d1c..a12c13bf004c 100644 --- a/pkg/controller/machinedeployment/rolling.go +++ b/pkg/controller/machinedeployment/rolling.go @@ -182,6 +182,7 @@ func (r *ReconcileMachineDeployment) cleanupUnhealthyReplicas(oldMSs []*v1alpha1 // such that not-ready < ready, unscheduled < scheduled, and pending < running. This ensures that unhealthy replicas will // been deleted first and won't increase unavailability. totalScaledDown := int32(0) + for _, targetMS := range oldMSs { if targetMS.Spec.Replicas == nil { return nil, 0, errors.Errorf("spec replicas for machine set %v is nil, this is unexpected", targetMS.Name) diff --git a/pkg/controller/machinedeployment/sync.go b/pkg/controller/machinedeployment/sync.go index f3bd89f9f91d..e003eff84067 100644 --- a/pkg/controller/machinedeployment/sync.go +++ b/pkg/controller/machinedeployment/sync.go @@ -29,6 +29,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" apirand "k8s.io/apimachinery/pkg/util/rand" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/util/retry" "k8s.io/klog" clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" @@ -154,6 +155,11 @@ func (r *ReconcileMachineDeployment) getNewMachineSet(d *clusterv1alpha1.Machine }, } + // Add foregroundDeletion finalizer to MachineSet if the MachineDeployment has it + if sets.NewString(d.Finalizers...).Has(metav1.FinalizerDeleteDependents) { + newMS.Finalizers = []string{metav1.FinalizerDeleteDependents} + } + allMSs := append(oldMSs, &newMS) newReplicasCount, err := dutil.NewMSNewReplicas(d, allMSs, &newMS) if err != nil { @@ -492,17 +498,16 @@ func updateMachineDeployment(c client.Client, d *clusterv1alpha1.MachineDeployme if equality.Semantic.DeepEqual(dCopy, d) { return nil } - err := retry.RetryOnConflict(retry.DefaultBackoff, func() error { - //Get latest version from API + return retry.RetryOnConflict(retry.DefaultBackoff, func() error { + // Get latest version. if err := c.Get(context.Background(), types.NamespacedName{Namespace: d.Namespace, Name: d.Name}, d); err != nil { return err } - + // Apply defaults. clusterv1alpha1.PopulateDefaultsMachineDeployment(d) - // Apply modifications + // Apply modifications. modify(d) - // Update the machineDeployment + // Update the MachineDeployment. return c.Update(context.Background(), d) }) - return err } diff --git a/pkg/controller/machineset/BUILD.bazel b/pkg/controller/machineset/BUILD.bazel index dabadbad9600..3488d679f8e2 100644 --- a/pkg/controller/machineset/BUILD.bazel +++ b/pkg/controller/machineset/BUILD.bazel @@ -3,9 +3,9 @@ load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") go_library( name = "go_default_library", srcs = [ - "controller.go", "delete_policy.go", "machine.go", + "machineset_controller.go", "status.go", ], importpath = "sigs.k8s.io/cluster-api/pkg/controller/machineset", @@ -34,11 +34,11 @@ go_library( go_test( name = "go_default_test", srcs = [ - "controller_test.go", "delete_policy_test.go", "machine_test.go", - "machineset_controller_suite_test.go", "machineset_controller_test.go", + "machineset_reconciler_suite_test.go", + "machineset_reconciler_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/controller/machineset/controller_test.go b/pkg/controller/machineset/controller_test.go deleted file mode 100644 index 7247de1df2e0..000000000000 --- a/pkg/controller/machineset/controller_test.go +++ /dev/null @@ -1,264 +0,0 @@ -/* -Copyright 2018 The Kubernetes Authors. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package machineset - -import ( - "reflect" - "testing" - "time" - - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/client-go/kubernetes/scheme" - "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" - "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/client/fake" - "sigs.k8s.io/controller-runtime/pkg/handler" - "sigs.k8s.io/controller-runtime/pkg/reconcile" -) - -var _ reconcile.Reconciler = &ReconcileMachineSet{} - -func TestMachineSetToMachines(t *testing.T) { - machineSetList := &v1alpha1.MachineSetList{ - TypeMeta: metav1.TypeMeta{ - Kind: "MachineSetList", - }, - Items: []v1alpha1.MachineSet{ - { - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - }, - Spec: v1alpha1.MachineSetSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar", - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - }, - }, - }, - } - controller := true - m := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withOwnerRef", - Namespace: "test", - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - OwnerReferences: []metav1.OwnerReference{ - { - Name: "Owner", - Kind: "MachineSet", - Controller: &controller, - }, - }, - }, - } - m2 := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "noOwnerRefNoLabels", - Namespace: "test", - Labels: map[string]string{ - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - } - m3 := v1alpha1.Machine{ - TypeMeta: metav1.TypeMeta{ - Kind: "Machine", - }, - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar", - v1alpha1.MachineClusterLabelName: "test-cluster", - }, - }, - } - testsCases := []struct { - machine v1alpha1.Machine - mapObject handler.MapObject - expected []reconcile.Request - }{ - { - machine: m, - mapObject: handler.MapObject{ - Meta: m.GetObjectMeta(), - Object: &m, - }, - expected: []reconcile.Request{}, - }, - { - machine: m2, - mapObject: handler.MapObject{ - Meta: m2.GetObjectMeta(), - Object: &m2, - }, - expected: nil, - }, - { - machine: m3, - mapObject: handler.MapObject{ - Meta: m3.GetObjectMeta(), - Object: &m3, - }, - expected: []reconcile.Request{ - {NamespacedName: client.ObjectKey{Namespace: "test", Name: "withMatchingLabels"}}, - }, - }, - } - - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachineSet{ - Client: fake.NewFakeClient(&m, &m2, &m3, machineSetList), - scheme: scheme.Scheme, - } - - for _, tc := range testsCases { - got := r.MachineToMachineSets(tc.mapObject) - if !reflect.DeepEqual(got, tc.expected) { - t.Errorf("Case %s. Got: %v, expected: %v", tc.machine.Name, got, tc.expected) - } - } -} - -func TestShouldExcludeMachine(t *testing.T) { - controller := true - testCases := []struct { - machineSet v1alpha1.MachineSet - machine v1alpha1.Machine - expected bool - }{ - { - machineSet: v1alpha1.MachineSet{}, - machine: v1alpha1.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withNoMatchingOwnerRef", - Namespace: "test", - OwnerReferences: []metav1.OwnerReference{ - { - Name: "Owner", - Kind: "MachineSet", - Controller: &controller, - }, - }, - }, - }, - expected: true, - }, - { - machineSet: v1alpha1.MachineSet{ - Spec: v1alpha1.MachineSetSpec{ - Selector: metav1.LabelSelector{ - MatchLabels: map[string]string{ - "foo": "bar", - }, - }, - }, - }, - machine: v1alpha1.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withMatchingLabels", - Namespace: "test", - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - expected: false, - }, - { - machineSet: v1alpha1.MachineSet{}, - machine: v1alpha1.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Name: "withDeletionTimestamp", - Namespace: "test", - DeletionTimestamp: &metav1.Time{Time: time.Now()}, - Labels: map[string]string{ - "foo": "bar", - }, - }, - }, - expected: true, - }, - } - - for _, tc := range testCases { - got := shouldExcludeMachine(&tc.machineSet, &tc.machine) - if got != tc.expected { - t.Errorf("Case %s. Got: %v, expected: %v", tc.machine.Name, got, tc.expected) - } - } -} - -func TestAdoptOrphan(t *testing.T) { - m := v1alpha1.Machine{ - ObjectMeta: metav1.ObjectMeta{ - Name: "orphanMachine", - }, - } - ms := v1alpha1.MachineSet{ - ObjectMeta: metav1.ObjectMeta{ - Name: "adoptOrphanMachine", - }, - } - controller := true - blockOwnerDeletion := true - testCases := []struct { - machineSet v1alpha1.MachineSet - machine v1alpha1.Machine - expected []metav1.OwnerReference - }{ - { - machine: m, - machineSet: ms, - expected: []metav1.OwnerReference{ - { - APIVersion: v1alpha1.SchemeGroupVersion.String(), - Kind: "MachineSet", - Name: "adoptOrphanMachine", - UID: "", - Controller: &controller, - BlockOwnerDeletion: &blockOwnerDeletion, - }, - }, - }, - } - - v1alpha1.AddToScheme(scheme.Scheme) - r := &ReconcileMachineSet{ - Client: fake.NewFakeClient(&m), - scheme: scheme.Scheme, - } - for _, tc := range testCases { - r.adoptOrphan(&tc.machineSet, &tc.machine) - got := tc.machine.GetOwnerReferences() - if !reflect.DeepEqual(got, tc.expected) { - t.Errorf("Case %s. Got: %+v, expected: %+v", tc.machine.Name, got, tc.expected) - } - } -} diff --git a/pkg/controller/machineset/delete_policy.go b/pkg/controller/machineset/delete_policy.go index 91b79de0eb13..7515be688073 100644 --- a/pkg/controller/machineset/delete_policy.go +++ b/pkg/controller/machineset/delete_policy.go @@ -25,7 +25,10 @@ import ( "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" ) -type deletePriority float64 +type ( + deletePriority float64 + deletePriorityFunc func(machine *v1alpha1.Machine) deletePriority +) const ( @@ -41,8 +44,6 @@ const ( secondsPerTenDays float64 = 864000 ) -type deletePriorityFunc func(machine *v1alpha1.Machine) deletePriority - // maps the creation timestamp onto the 0-100 priority range func oldestDeletePriority(machine *v1alpha1.Machine) deletePriority { if machine.DeletionTimestamp != nil && !machine.DeletionTimestamp.IsZero() { diff --git a/pkg/controller/machineset/controller.go b/pkg/controller/machineset/machineset_controller.go similarity index 89% rename from pkg/controller/machineset/controller.go rename to pkg/controller/machineset/machineset_controller.go index 86d0c8cbb54a..01ccc5316518 100644 --- a/pkg/controller/machineset/controller.go +++ b/pkg/controller/machineset/machineset_controller.go @@ -41,7 +41,11 @@ import ( "sigs.k8s.io/controller-runtime/pkg/source" ) +// controllerName is the name of this controller +const controllerName = "machineset-controller" + var ( + // controllerKind contains the schema.GroupVersionKind for this controller type. controllerKind = clusterv1alpha1.SchemeGroupVersion.WithKind("MachineSet") // stateConfirmationTimeout is the amount of time allowed to wait for desired state. @@ -50,9 +54,6 @@ var ( // stateConfirmationInterval is the amount of time between polling for the desired state. // The polling is against a local memory cache. stateConfirmationInterval = 100 * time.Millisecond - - // controllerName is the name of this controller - controllerName = "machineset-controller" ) // Add creates a new MachineSet Controller and adds it to the Manager with default RBAC. @@ -84,7 +85,7 @@ func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFu return err } - // Map Machine changes to MachineSets using ControllerRef. + // Watch for changes to Machines and reconcile the owner MachineSet. err = c.Watch( &source.Kind{Type: &clusterv1alpha1.Machine{}}, &handler.EnqueueRequestForOwner{IsController: true, OwnerType: &clusterv1alpha1.MachineSet{}}, @@ -93,7 +94,9 @@ func add(mgr manager.Manager, r reconcile.Reconciler, mapFn handler.ToRequestsFu return err } - // Map Machine changes to MachineSets by machining labels. + // Watch for changes to Machines using a mapping function to MachineSets. + // This watcher is required for use cases like adoption. In case a Machine doesn't have + // a controller reference, it'll look for potential matching MachineSet to reconcile. return c.Watch( &source.Kind{Type: &clusterv1alpha1.Machine{}}, &handler.EnqueueRequestsFromMapFunc{ToRequests: mapFn}, @@ -107,36 +110,6 @@ type ReconcileMachineSet struct { recorder record.EventRecorder } -func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconcile.Request { - result := []reconcile.Request{} - m := &clusterv1alpha1.Machine{} - key := client.ObjectKey{Namespace: o.Meta.GetNamespace(), Name: o.Meta.GetName()} - err := r.Client.Get(context.Background(), key, m) - if err != nil { - klog.Errorf("Unable to retrieve Machine %v from store: %v", key, err) - return nil - } - - for _, ref := range m.ObjectMeta.OwnerReferences { - if ref.Controller != nil && *ref.Controller { - return result - } - } - - mss := r.getMachineSetsForMachine(m) - if len(mss) == 0 { - klog.V(4).Infof("Found no machine set for machine: %v", m.Name) - return nil - } - - for _, ms := range mss { - name := client.ObjectKey{Namespace: ms.Namespace, Name: ms.Name} - result = append(result, reconcile.Request{NamespacedName: name}) - } - - return result -} - // Reconcile reads that state of the cluster for a MachineSet object and makes changes based on the state read // and what is in the MachineSet.Spec // Automatically generate RBAC rules to allow the Controller to read and write Deployments @@ -148,7 +121,7 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re machineSet := &clusterv1alpha1.MachineSet{} if err := r.Get(ctx, request.NamespacedName, machineSet); err != nil { if apierrors.IsNotFound(err) { - // Object not found, return. Created objects are automatically garbage collected. + // Object not found, return. Created objects are automatically garbage collected. // For additional cleanup logic use finalizers. return reconcile.Result{}, nil } @@ -156,6 +129,12 @@ func (r *ReconcileMachineSet) Reconcile(request reconcile.Request) (reconcile.Re return reconcile.Result{}, err } + // Ignore deleted MachineSets, this can happen when foregroundDeletion + // is enabled + if machineSet.DeletionTimestamp != nil { + return reconcile.Result{}, nil + } + result, err := r.reconcile(ctx, machineSet) if err != nil { klog.Errorf("Failed to reconcile MachineSet %q: %v", request.NamespacedName, err) @@ -215,6 +194,11 @@ func (r *ReconcileMachineSet) reconcile(ctx context.Context, machineSet *cluster } // Since adding the finalizer updates the object return to avoid later update issues + return reconcile.Result{Requeue: true}, nil + } + + // Return early if the MachineSet is deleted. + if !machineSet.ObjectMeta.DeletionTimestamp.IsZero() { return reconcile.Result{}, nil } @@ -271,12 +255,13 @@ func (r *ReconcileMachineSet) reconcile(ctx context.Context, machineSet *cluster updatedMS.Status.ReadyReplicas == replicas && updatedMS.Status.AvailableReplicas != replicas { - return reconcile.Result{Requeue: true}, nil + return reconcile.Result{RequeueAfter: time.Duration(updatedMS.Spec.MinReadySeconds) * time.Second}, nil } return reconcile.Result{}, nil } +// getCluster reuturns the Cluster associated with the MachineSet, if any. func (r *ReconcileMachineSet) getCluster(ms *clusterv1alpha1.MachineSet) (*clusterv1alpha1.Cluster, error) { if ms.Spec.Template.Labels[clusterv1alpha1.MachineClusterLabelName] == "" { klog.Infof("MachineSet %q in namespace %q doesn't specify %q label, assuming nil cluster", ms.Name, ms.Namespace, clusterv1alpha1.MachineClusterLabelName) @@ -296,7 +281,7 @@ func (r *ReconcileMachineSet) getCluster(ms *clusterv1alpha1.MachineSet) (*clust return cluster, nil } -// syncReplicas essentially scales machine resources up and down. +// syncReplicas scales Machine resources up or down. func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machines []*clusterv1alpha1.Machine) error { if ms.Spec.Replicas == nil { return errors.Errorf("the Replicas field in Spec for machineset %v is nil, this should not be allowed", ms.Name) @@ -373,8 +358,8 @@ func (r *ReconcileMachineSet) syncReplicas(ms *clusterv1alpha1.MachineSet, machi return nil } -// createMachine creates a machine resource. -// the name of the newly created resource is going to be created by the API server, we set the generateName field +// createMachine creates a Machine resource. The name of the newly created resource is going +// to be created by the API server, we set the generateName field. func (r *ReconcileMachineSet) createMachine(machineSet *clusterv1alpha1.MachineSet) *clusterv1alpha1.Machine { gv := clusterv1alpha1.SchemeGroupVersion machine := &clusterv1alpha1.Machine{ @@ -388,7 +373,6 @@ func (r *ReconcileMachineSet) createMachine(machineSet *clusterv1alpha1.MachineS machine.ObjectMeta.GenerateName = fmt.Sprintf("%s-", machineSet.Name) machine.ObjectMeta.OwnerReferences = []metav1.OwnerReference{*metav1.NewControllerRef(machineSet, controllerKind)} machine.Namespace = machineSet.Namespace - return machine } @@ -411,6 +395,7 @@ func shouldExcludeMachine(machineSet *clusterv1alpha1.MachineSet, machine *clust return false } +// adoptOrphan sets the MachineSet as a controller OwnerReference to the Machine. func (r *ReconcileMachineSet) adoptOrphan(machineSet *clusterv1alpha1.MachineSet, machine *clusterv1alpha1.Machine) error { newRef := *metav1.NewControllerRef(machineSet, controllerKind) machine.OwnerReferences = append(machine.OwnerReferences, newRef) @@ -463,3 +448,39 @@ func (r *ReconcileMachineSet) waitForMachineDeletion(machineList []*clusterv1alp } return nil } + +// MachineToMachineSets is a handler.ToRequestsFunc to be used to enqeue requests for reconciliation +// for MachineSets that might adopt an orphaned Machine. +func (r *ReconcileMachineSet) MachineToMachineSets(o handler.MapObject) []reconcile.Request { + result := []reconcile.Request{} + + m := &clusterv1alpha1.Machine{} + key := client.ObjectKey{Namespace: o.Meta.GetNamespace(), Name: o.Meta.GetName()} + if err := r.Client.Get(context.Background(), key, m); err != nil { + if !apierrors.IsNotFound(err) { + klog.Errorf("Unable to retrieve Machine %q for possible MachineSet adoption: %v", key, err) + } + return nil + } + + // Check if the controller reference is already set and + // return an empty result when one is found. + for _, ref := range m.ObjectMeta.OwnerReferences { + if ref.Controller != nil && *ref.Controller { + return result + } + } + + mss := r.getMachineSetsForMachine(m) + if len(mss) == 0 { + klog.V(4).Infof("Found no MachineSet for Machine %q", m.Name) + return nil + } + + for _, ms := range mss { + name := client.ObjectKey{Namespace: ms.Namespace, Name: ms.Name} + result = append(result, reconcile.Request{NamespacedName: name}) + } + + return result +} diff --git a/pkg/controller/machineset/machineset_controller_test.go b/pkg/controller/machineset/machineset_controller_test.go index 153a51e9aa11..7247de1df2e0 100644 --- a/pkg/controller/machineset/machineset_controller_test.go +++ b/pkg/controller/machineset/machineset_controller_test.go @@ -17,126 +17,248 @@ limitations under the License. package machineset import ( + "reflect" "testing" "time" - "golang.org/x/net/context" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/types" - clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "k8s.io/client-go/kubernetes/scheme" + "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" "sigs.k8s.io/controller-runtime/pkg/client" - "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/client/fake" + "sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/reconcile" ) -var c client.Client +var _ reconcile.Reconciler = &ReconcileMachineSet{} -var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} - -const timeout = time.Second * 5 - -func TestReconcile(t *testing.T) { - replicas := int32(2) - instance := &clusterv1alpha1.MachineSet{ - ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, - Spec: clusterv1alpha1.MachineSetSpec{ - Replicas: &replicas, - Template: clusterv1alpha1.MachineTemplateSpec{ - Spec: clusterv1alpha1.MachineSpec{ - Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, +func TestMachineSetToMachines(t *testing.T) { + machineSetList := &v1alpha1.MachineSetList{ + TypeMeta: metav1.TypeMeta{ + Kind: "MachineSetList", + }, + Items: []v1alpha1.MachineSet{ + { + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + }, + Spec: v1alpha1.MachineSetSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar", + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, }, }, }, } - - // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a - // channel when it is finished. - mgr, err := manager.New(cfg, manager.Options{}) - if err != nil { - t.Errorf("error creating new manager: %v", err) + controller := true + m := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withOwnerRef", + Namespace: "test", + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + OwnerReferences: []metav1.OwnerReference{ + { + Name: "Owner", + Kind: "MachineSet", + Controller: &controller, + }, + }, + }, } - c = mgr.GetClient() - - r := newReconciler(mgr) - recFn, requests := SetupTestReconcile(r) - if err := add(mgr, recFn, r.MachineToMachineSets); err != nil { - t.Errorf("error adding controller to manager: %v", err) + m2 := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "noOwnerRefNoLabels", + Namespace: "test", + Labels: map[string]string{ + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, } - defer close(StartTestManager(mgr, t)) - - // Create the MachineSet object and expect Reconcile to be called and the Machines to be created. - if err := c.Create(context.TODO(), instance); err != nil { - t.Errorf("error creating instance: %v", err) + m3 := v1alpha1.Machine{ + TypeMeta: metav1.TypeMeta{ + Kind: "Machine", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar", + v1alpha1.MachineClusterLabelName: "test-cluster", + }, + }, } - defer c.Delete(context.TODO(), instance) - select { - case recv := <-requests: - if recv != expectedRequest { - t.Error("received request does not match expected request") - } - case <-time.After(timeout): - t.Error("timed out waiting for request") + testsCases := []struct { + machine v1alpha1.Machine + mapObject handler.MapObject + expected []reconcile.Request + }{ + { + machine: m, + mapObject: handler.MapObject{ + Meta: m.GetObjectMeta(), + Object: &m, + }, + expected: []reconcile.Request{}, + }, + { + machine: m2, + mapObject: handler.MapObject{ + Meta: m2.GetObjectMeta(), + Object: &m2, + }, + expected: nil, + }, + { + machine: m3, + mapObject: handler.MapObject{ + Meta: m3.GetObjectMeta(), + Object: &m3, + }, + expected: []reconcile.Request{ + {NamespacedName: client.ObjectKey{Namespace: "test", Name: "withMatchingLabels"}}, + }, + }, } - machines := &clusterv1alpha1.MachineList{} - - // TODO(joshuarubin) there seems to be a race here. If expectInt sleeps - // briefly, even 10ms, the number of replicas is 4 and not 2 as expected - expectInt(t, int(replicas), func(ctx context.Context) int { - if err := c.List(ctx, &client.ListOptions{}, machines); err != nil { - return -1 - } - return len(machines.Items) - }) + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachineSet{ + Client: fake.NewFakeClient(&m, &m2, &m3, machineSetList), + scheme: scheme.Scheme, + } - // Verify that each machine has the desired kubelet version. - for _, m := range machines.Items { - if k := m.Spec.Versions.Kubelet; k != "1.10.3" { - t.Errorf("kubelet was %q not '1.10.3'", k) + for _, tc := range testsCases { + got := r.MachineToMachineSets(tc.mapObject) + if !reflect.DeepEqual(got, tc.expected) { + t.Errorf("Case %s. Got: %v, expected: %v", tc.machine.Name, got, tc.expected) } } +} - // Delete a Machine and expect Reconcile to be called to replace it. - m := machines.Items[0] - if err := c.Delete(context.TODO(), &m); err != nil { - t.Errorf("error deleting machine: %v", err) +func TestShouldExcludeMachine(t *testing.T) { + controller := true + testCases := []struct { + machineSet v1alpha1.MachineSet + machine v1alpha1.Machine + expected bool + }{ + { + machineSet: v1alpha1.MachineSet{}, + machine: v1alpha1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withNoMatchingOwnerRef", + Namespace: "test", + OwnerReferences: []metav1.OwnerReference{ + { + Name: "Owner", + Kind: "MachineSet", + Controller: &controller, + }, + }, + }, + }, + expected: true, + }, + { + machineSet: v1alpha1.MachineSet{ + Spec: v1alpha1.MachineSetSpec{ + Selector: metav1.LabelSelector{ + MatchLabels: map[string]string{ + "foo": "bar", + }, + }, + }, + }, + machine: v1alpha1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withMatchingLabels", + Namespace: "test", + Labels: map[string]string{ + "foo": "bar", + }, + }, + }, + expected: false, + }, + { + machineSet: v1alpha1.MachineSet{}, + machine: v1alpha1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Name: "withDeletionTimestamp", + Namespace: "test", + DeletionTimestamp: &metav1.Time{Time: time.Now()}, + Labels: map[string]string{ + "foo": "bar", + }, + }, + }, + expected: true, + }, } - select { - case recv := <-requests: - if recv != expectedRequest { - t.Error("received request does not match expected request") + + for _, tc := range testCases { + got := shouldExcludeMachine(&tc.machineSet, &tc.machine) + if got != tc.expected { + t.Errorf("Case %s. Got: %v, expected: %v", tc.machine.Name, got, tc.expected) } - case <-time.After(timeout): - t.Error("timed out waiting for request") } - - // TODO (robertbailey): Figure out why the control loop isn't working as expected. - /* - g.Eventually(func() int { - if err := c.List(context.TODO(), &client.ListOptions{}, machines); err != nil { - return -1 - } - return len(machines.Items) - }, timeout).Should(gomega.BeEquivalentTo(replicas)) - */ } -func expectInt(t *testing.T, expect int, fn func(context.Context) int) { - t.Helper() - - ctx, cancel := context.WithTimeout(context.TODO(), timeout) - defer cancel() - - intCh := make(chan int) - - go func() { intCh <- fn(ctx) }() +func TestAdoptOrphan(t *testing.T) { + m := v1alpha1.Machine{ + ObjectMeta: metav1.ObjectMeta{ + Name: "orphanMachine", + }, + } + ms := v1alpha1.MachineSet{ + ObjectMeta: metav1.ObjectMeta{ + Name: "adoptOrphanMachine", + }, + } + controller := true + blockOwnerDeletion := true + testCases := []struct { + machineSet v1alpha1.MachineSet + machine v1alpha1.Machine + expected []metav1.OwnerReference + }{ + { + machine: m, + machineSet: ms, + expected: []metav1.OwnerReference{ + { + APIVersion: v1alpha1.SchemeGroupVersion.String(), + Kind: "MachineSet", + Name: "adoptOrphanMachine", + UID: "", + Controller: &controller, + BlockOwnerDeletion: &blockOwnerDeletion, + }, + }, + }, + } - select { - case n := <-intCh: - if n != expect { - t.Errorf("go unexpectef value %d, expected %d", n, expect) + v1alpha1.AddToScheme(scheme.Scheme) + r := &ReconcileMachineSet{ + Client: fake.NewFakeClient(&m), + scheme: scheme.Scheme, + } + for _, tc := range testCases { + r.adoptOrphan(&tc.machineSet, &tc.machine) + got := tc.machine.GetOwnerReferences() + if !reflect.DeepEqual(got, tc.expected) { + t.Errorf("Case %s. Got: %+v, expected: %+v", tc.machine.Name, got, tc.expected) } - case <-ctx.Done(): - t.Errorf("timed out waiting for value: %d", expect) } } diff --git a/pkg/controller/machineset/machineset_controller_suite_test.go b/pkg/controller/machineset/machineset_reconciler_suite_test.go similarity index 100% rename from pkg/controller/machineset/machineset_controller_suite_test.go rename to pkg/controller/machineset/machineset_reconciler_suite_test.go diff --git a/pkg/controller/machineset/machineset_reconciler_test.go b/pkg/controller/machineset/machineset_reconciler_test.go new file mode 100644 index 000000000000..153a51e9aa11 --- /dev/null +++ b/pkg/controller/machineset/machineset_reconciler_test.go @@ -0,0 +1,142 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package machineset + +import ( + "testing" + "time" + + "golang.org/x/net/context" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" + clusterv1alpha1 "sigs.k8s.io/cluster-api/pkg/apis/cluster/v1alpha1" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/manager" + "sigs.k8s.io/controller-runtime/pkg/reconcile" +) + +var c client.Client + +var expectedRequest = reconcile.Request{NamespacedName: types.NamespacedName{Name: "foo", Namespace: "default"}} + +const timeout = time.Second * 5 + +func TestReconcile(t *testing.T) { + replicas := int32(2) + instance := &clusterv1alpha1.MachineSet{ + ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, + Spec: clusterv1alpha1.MachineSetSpec{ + Replicas: &replicas, + Template: clusterv1alpha1.MachineTemplateSpec{ + Spec: clusterv1alpha1.MachineSpec{ + Versions: clusterv1alpha1.MachineVersionInfo{Kubelet: "1.10.3"}, + }, + }, + }, + } + + // Setup the Manager and Controller. Wrap the Controller Reconcile function so it writes each request to a + // channel when it is finished. + mgr, err := manager.New(cfg, manager.Options{}) + if err != nil { + t.Errorf("error creating new manager: %v", err) + } + c = mgr.GetClient() + + r := newReconciler(mgr) + recFn, requests := SetupTestReconcile(r) + if err := add(mgr, recFn, r.MachineToMachineSets); err != nil { + t.Errorf("error adding controller to manager: %v", err) + } + defer close(StartTestManager(mgr, t)) + + // Create the MachineSet object and expect Reconcile to be called and the Machines to be created. + if err := c.Create(context.TODO(), instance); err != nil { + t.Errorf("error creating instance: %v", err) + } + defer c.Delete(context.TODO(), instance) + select { + case recv := <-requests: + if recv != expectedRequest { + t.Error("received request does not match expected request") + } + case <-time.After(timeout): + t.Error("timed out waiting for request") + } + + machines := &clusterv1alpha1.MachineList{} + + // TODO(joshuarubin) there seems to be a race here. If expectInt sleeps + // briefly, even 10ms, the number of replicas is 4 and not 2 as expected + expectInt(t, int(replicas), func(ctx context.Context) int { + if err := c.List(ctx, &client.ListOptions{}, machines); err != nil { + return -1 + } + return len(machines.Items) + }) + + // Verify that each machine has the desired kubelet version. + for _, m := range machines.Items { + if k := m.Spec.Versions.Kubelet; k != "1.10.3" { + t.Errorf("kubelet was %q not '1.10.3'", k) + } + } + + // Delete a Machine and expect Reconcile to be called to replace it. + m := machines.Items[0] + if err := c.Delete(context.TODO(), &m); err != nil { + t.Errorf("error deleting machine: %v", err) + } + select { + case recv := <-requests: + if recv != expectedRequest { + t.Error("received request does not match expected request") + } + case <-time.After(timeout): + t.Error("timed out waiting for request") + } + + // TODO (robertbailey): Figure out why the control loop isn't working as expected. + /* + g.Eventually(func() int { + if err := c.List(context.TODO(), &client.ListOptions{}, machines); err != nil { + return -1 + } + return len(machines.Items) + }, timeout).Should(gomega.BeEquivalentTo(replicas)) + */ +} + +func expectInt(t *testing.T, expect int, fn func(context.Context) int) { + t.Helper() + + ctx, cancel := context.WithTimeout(context.TODO(), timeout) + defer cancel() + + intCh := make(chan int) + + go func() { intCh <- fn(ctx) }() + + select { + case n := <-intCh: + if n != expect { + t.Errorf("go unexpectef value %d, expected %d", n, expect) + } + case <-ctx.Done(): + t.Errorf("timed out waiting for value: %d", expect) + } +} diff --git a/pkg/controller/node/BUILD.bazel b/pkg/controller/node/BUILD.bazel index 0af213d294ef..5a855c4171ce 100644 --- a/pkg/controller/node/BUILD.bazel +++ b/pkg/controller/node/BUILD.bazel @@ -30,8 +30,8 @@ go_library( go_test( name = "go_default_test", srcs = [ - "node_controller_suite_test.go", - "node_controller_test.go", + "node_reconciler_suite_test.go", + "node_reconciler_test.go", ], embed = [":go_default_library"], deps = [ diff --git a/pkg/controller/node/node_controller_suite_test.go b/pkg/controller/node/node_reconciler_suite_test.go similarity index 100% rename from pkg/controller/node/node_controller_suite_test.go rename to pkg/controller/node/node_reconciler_suite_test.go diff --git a/pkg/controller/node/node_controller_test.go b/pkg/controller/node/node_reconciler_test.go similarity index 100% rename from pkg/controller/node/node_controller_test.go rename to pkg/controller/node/node_reconciler_test.go diff --git a/pkg/controller/controller.go b/pkg/controller/noderef_controller.go similarity index 100% rename from pkg/controller/controller.go rename to pkg/controller/noderef_controller.go diff --git a/pkg/provider/example/container/Dockerfile b/pkg/provider/example/container/Dockerfile index 3306494e19b8..1540993ba9f1 100644 --- a/pkg/provider/example/container/Dockerfile +++ b/pkg/provider/example/container/Dockerfile @@ -13,7 +13,7 @@ # limitations under the License. # Build the manager binary -FROM golang:1.11.5 as builder +FROM golang:1.12.5 as builder # Copy in the go src WORKDIR $GOPATH/src/sigs.k8s.io/cluster-api diff --git a/scripts/ci-integration.sh b/scripts/ci-integration.sh index 2222f2189b95..7d8f4dce5183 100755 --- a/scripts/ci-integration.sh +++ b/scripts/ci-integration.sh @@ -19,8 +19,8 @@ set -o nounset set -o pipefail MAKE="make" -KUSTOMIZE="kustomize" -KUBECTL="kubectl" +KIND_VERSION="0.2.1" +KUSTOMIZE_VERSION="2.0.3" KUBECTL_VERSION="v1.13.2" CRD_YAML="crd.yaml" BOOTSTRAP_CLUSTER_NAME="clusterapi-bootstrap" @@ -28,22 +28,31 @@ CONTROLLER_REPO="controller-ci" # use arbitrary repo name since we don't need to EXAMPLE_PROVIDER_REPO="example-provider-ci" INTEGRATION_TEST_DIR="./test/integration" +GOOS=$(go env GOOS) +GOARCH=$(go env GOARCH) + install_kustomize() { - go get sigs.k8s.io/kustomize + wget "https://github.com/kubernetes-sigs/kustomize/releases/download/v${KUSTOMIZE_VERSION}/kustomize_${KUSTOMIZE_VERSION}_${GOOS}_${GOARCH}" \ + --no-verbose -O /usr/local/bin/kustomize + chmod +x /usr/local/bin/kustomize +} + +install_kind() { + wget "https://github.com/kubernetes-sigs/kind/releases/download/${KIND_VERSION}/kind-${GOOS}-${GOARCH}" \ + --no-verbose -O /usr/local/bin/kind + chmod +x /usr/local/bin/kind } install_kubectl() { - wget https://storage.googleapis.com/kubernetes-release/release/"${KUBECTL_VERSION}"/bin/linux/amd64/kubectl \ + wget "https://storage.googleapis.com/kubernetes-release/release/${KUBECTL_VERSION}/bin/${GOOS}/${GOARCH}/kubectl" \ --no-verbose -O /usr/local/bin/kubectl chmod +x /usr/local/bin/kubectl } build_containers() { VERSION="$(git describe --exact-match 2> /dev/null || git describe --match="$(git rev-parse --short=8 HEAD)" --always --dirty --abbrev=8)" - CONTROLLER_IMG="${CONTROLLER_REPO}:${VERSION}" - EXAMPLE_PROVIDER_IMG="${EXAMPLE_PROVIDER_REPO}:${VERSION}" - export CONTROLLER_IMG="${CONTROLLER_IMG}" - export EXAMPLE_PROVIDER_IMG="${EXAMPLE_PROVIDER_IMG}" + export CONTROLLER_IMG="${CONTROLLER_REPO}:${VERSION}" + export EXAMPLE_PROVIDER_IMG="${EXAMPLE_PROVIDER_REPO}:${VERSION}" "${MAKE}" docker-build "${MAKE}" docker-build-ci @@ -51,13 +60,12 @@ build_containers() { prepare_crd_yaml() { CLUSTER_API_CONFIG_PATH="./config" - "${KUSTOMIZE}" build "${CLUSTER_API_CONFIG_PATH}/default/" > "${CRD_YAML}" + kustomize build "${CLUSTER_API_CONFIG_PATH}/default/" > "${CRD_YAML}" echo "---" >> "${CRD_YAML}" - "${KUSTOMIZE}" build "${CLUSTER_API_CONFIG_PATH}/ci/" >> "${CRD_YAML}" + kustomize build "${CLUSTER_API_CONFIG_PATH}/ci/" >> "${CRD_YAML}" } create_bootstrap() { - go get sigs.k8s.io/kind kind create cluster --name "${BOOTSTRAP_CLUSTER_NAME}" KUBECONFIG="$(kind get kubeconfig-path --name="${BOOTSTRAP_CLUSTER_NAME}")" export KUBECONFIG @@ -88,7 +96,7 @@ wait_pod_running() { } ensure_docker_in_docker() { - if [ -z "${PROW_JOB_ID}" ] ; then + if [ -z "${PROW_JOB_ID:-}" ] ; then # start docker service in setup other than Prow service docker start fi @@ -103,9 +111,10 @@ main() { prepare_crd_yaml install_kubectl + install_kind create_bootstrap - "${KUBECTL}" create -f "${CRD_YAML}" + kubectl create -f "${CRD_YAML}" set +e wait_pod_running "cluster-api-controller-manager-0" "cluster-api-system" diff --git a/vendor/github.com/google/uuid/node.go b/vendor/github.com/google/uuid/node.go index 3e4e90dc444c..d651a2b0619f 100644 --- a/vendor/github.com/google/uuid/node.go +++ b/vendor/github.com/google/uuid/node.go @@ -48,6 +48,7 @@ func setNodeInterface(name string) bool { // does not specify a specific interface generate a random Node ID // (section 4.1.6) if name == "" { + ifname = "random" randomBits(nodeID[:]) return true } diff --git a/vendor/github.com/onsi/ginkgo/.travis.yml b/vendor/github.com/onsi/ginkgo/.travis.yml index 3900878bd20c..72e8ccf0be98 100644 --- a/vendor/github.com/onsi/ginkgo/.travis.yml +++ b/vendor/github.com/onsi/ginkgo/.travis.yml @@ -1,11 +1,9 @@ language: go go: - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - 1.10.x - 1.11.x + - 1.12.x + - tip install: - go get -v -t ./... @@ -14,4 +12,4 @@ install: - go install github.com/onsi/ginkgo/ginkgo - export PATH=$PATH:$HOME/gopath/bin -script: $HOME/gopath/bin/ginkgo -r --randomizeAllSpecs --randomizeSuites --race --trace && go vet +script: $HOME/gopath/bin/ginkgo -r --randomizeAllSpecs --randomizeSuites --race --trace && go vet diff --git a/vendor/github.com/onsi/ginkgo/CHANGELOG.md b/vendor/github.com/onsi/ginkgo/CHANGELOG.md index d7d797017ab2..4920406aeb82 100644 --- a/vendor/github.com/onsi/ginkgo/CHANGELOG.md +++ b/vendor/github.com/onsi/ginkgo/CHANGELOG.md @@ -1,3 +1,14 @@ +## 1.8.0 + +### New Features +- allow config of the vet flag for `go test` (#562) [3cd45fa] +- Support projects using go modules [d56ee76] + +### Fixes and Minor Improvements +- chore(godoc): fixes typos in Measurement funcs [dbaca8e] +- Optimize focus to avoid allocations [f493786] +- Ensure generated test file names are underscored [505cc35] + ## 1.7.0 ### New Features diff --git a/vendor/github.com/onsi/ginkgo/config/config.go b/vendor/github.com/onsi/ginkgo/config/config.go index 5e509313c3c1..dab2a24708cb 100644 --- a/vendor/github.com/onsi/ginkgo/config/config.go +++ b/vendor/github.com/onsi/ginkgo/config/config.go @@ -20,7 +20,7 @@ import ( "fmt" ) -const VERSION = "1.7.0" +const VERSION = "1.8.0" type GinkgoConfigType struct { RandomSeed int64 diff --git a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go index 5aa96b4d9351..a6b96d88fdfd 100644 --- a/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go +++ b/vendor/github.com/onsi/ginkgo/ginkgo_dsl.go @@ -457,13 +457,13 @@ func FMeasure(text string, body interface{}, samples int) bool { return true } -//You can mark Maeasurements as pending using PMeasure +//You can mark Measurements as pending using PMeasure func PMeasure(text string, _ ...interface{}) bool { globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) return true } -//You can mark Maeasurements as pending using XMeasure +//You can mark Measurements as pending using XMeasure func XMeasure(text string, _ ...interface{}) bool { globalSuite.PushMeasureNode(text, func(b Benchmarker) {}, types.FlagTypePending, codelocation.New(1), 0) return true diff --git a/vendor/github.com/onsi/ginkgo/internal/spec/specs.go b/vendor/github.com/onsi/ginkgo/internal/spec/specs.go index 006185ab5d86..27c0d1d6cd0f 100644 --- a/vendor/github.com/onsi/ginkgo/internal/spec/specs.go +++ b/vendor/github.com/onsi/ginkgo/internal/spec/specs.go @@ -7,14 +7,21 @@ import ( ) type Specs struct { - specs []*Spec + specs []*Spec + names []string + hasProgrammaticFocus bool RegexScansFilePath bool } func NewSpecs(specs []*Spec) *Specs { + names := make([]string, len(specs)) + for i, spec := range specs { + names[i] = spec.ConcatenatedString() + } return &Specs{ specs: specs, + names: names, } } @@ -30,10 +37,13 @@ func (e *Specs) Shuffle(r *rand.Rand) { sort.Sort(e) permutation := r.Perm(len(e.specs)) shuffledSpecs := make([]*Spec, len(e.specs)) + names := make([]string, len(e.specs)) for i, j := range permutation { shuffledSpecs[i] = e.specs[j] + names[i] = e.names[j] } e.specs = shuffledSpecs + e.names = names } func (e *Specs) ApplyFocus(description string, focusString string, skipString string) { @@ -64,33 +74,43 @@ func (e *Specs) applyProgrammaticFocus() { // toMatch returns a byte[] to be used by regex matchers. When adding new behaviours to the matching function, // this is the place which we append to. -func (e *Specs) toMatch(description string, spec *Spec) []byte { +func (e *Specs) toMatch(description string, i int) []byte { + if i > len(e.names) { + return nil + } if e.RegexScansFilePath { return []byte( description + " " + - spec.ConcatenatedString() + " " + - spec.subject.CodeLocation().FileName) + e.names[i] + " " + + e.specs[i].subject.CodeLocation().FileName) } else { return []byte( description + " " + - spec.ConcatenatedString()) + e.names[i]) } } func (e *Specs) applyRegExpFocusAndSkip(description string, focusString string, skipString string) { - for _, spec := range e.specs { + var focusFilter *regexp.Regexp + if focusString != "" { + focusFilter = regexp.MustCompile(focusString) + } + var skipFilter *regexp.Regexp + if skipString != "" { + skipFilter = regexp.MustCompile(skipString) + } + + for i, spec := range e.specs { matchesFocus := true matchesSkip := false - toMatch := e.toMatch(description, spec) + toMatch := e.toMatch(description, i) - if focusString != "" { - focusFilter := regexp.MustCompile(focusString) + if focusFilter != nil { matchesFocus = focusFilter.Match([]byte(toMatch)) } - if skipString != "" { - skipFilter := regexp.MustCompile(skipString) + if skipFilter != nil { matchesSkip = skipFilter.Match([]byte(toMatch)) } @@ -115,9 +135,10 @@ func (e *Specs) Len() int { } func (e *Specs) Less(i, j int) bool { - return e.specs[i].ConcatenatedString() < e.specs[j].ConcatenatedString() + return e.names[i] < e.names[j] } func (e *Specs) Swap(i, j int) { + e.names[i], e.names[j] = e.names[j], e.names[i] e.specs[i], e.specs[j] = e.specs[j], e.specs[i] } diff --git a/vendor/github.com/onsi/gomega/.travis.yml b/vendor/github.com/onsi/gomega/.travis.yml index 4d71367f6fb6..2420a5d07091 100644 --- a/vendor/github.com/onsi/gomega/.travis.yml +++ b/vendor/github.com/onsi/gomega/.travis.yml @@ -1,12 +1,9 @@ language: go go: - - 1.6.x - - 1.7.x - - 1.8.x - - 1.9.x - 1.10.x - 1.11.x + - 1.12.x env: - GO111MODULE=on @@ -17,7 +14,4 @@ install: - go get github.com/onsi/ginkgo - go install github.com/onsi/ginkgo/ginkgo -script: | - $HOME/gopath/bin/ginkgo -p -r --randomizeAllSpecs --failOnPending --randomizeSuites --race && - go vet && - [ -z "`gofmt -l -e -s -w .`" ] +script: make test diff --git a/vendor/github.com/onsi/gomega/CHANGELOG.md b/vendor/github.com/onsi/gomega/CHANGELOG.md index 9153294f75fb..5d1eda83741e 100644 --- a/vendor/github.com/onsi/gomega/CHANGELOG.md +++ b/vendor/github.com/onsi/gomega/CHANGELOG.md @@ -1,3 +1,14 @@ +## 1.5.0 + +### Features + +- Added MatchKeys matchers [8b909fc] + +### Fixes and Minor Improvements + +- Add type aliases to remove stuttering [03b0461] +- Don't run session_test.go on windows (#324) [5533ce8] + ## 1.4.3 ### Fixes: diff --git a/vendor/github.com/onsi/gomega/Makefile b/vendor/github.com/onsi/gomega/Makefile new file mode 100644 index 000000000000..c92cd56e3adc --- /dev/null +++ b/vendor/github.com/onsi/gomega/Makefile @@ -0,0 +1,6 @@ +test: + [ -z "`gofmt -s -w -l -e .`" ] + go vet + ginkgo -p -r --randomizeAllSpecs --failOnPending --randomizeSuites --race + +.PHONY: test diff --git a/vendor/github.com/onsi/gomega/gomega_dsl.go b/vendor/github.com/onsi/gomega/gomega_dsl.go index 471f691a62a5..448d595da64b 100644 --- a/vendor/github.com/onsi/gomega/gomega_dsl.go +++ b/vendor/github.com/onsi/gomega/gomega_dsl.go @@ -24,7 +24,7 @@ import ( "github.com/onsi/gomega/types" ) -const GOMEGA_VERSION = "1.4.3" +const GOMEGA_VERSION = "1.5.0" const nilFailHandlerPanic = `You are trying to make an assertion, but Gomega's fail handler is nil. If you're using Ginkgo then you probably forgot to put your assertion in an It(). @@ -39,20 +39,14 @@ var defaultEventuallyPollingInterval = 10 * time.Millisecond var defaultConsistentlyDuration = 100 * time.Millisecond var defaultConsistentlyPollingInterval = 10 * time.Millisecond -//RegisterFailHandler connects Ginkgo to Gomega. When a matcher fails -//the fail handler passed into RegisterFailHandler is called. +// RegisterFailHandler connects Ginkgo to Gomega. When a matcher fails +// the fail handler passed into RegisterFailHandler is called. func RegisterFailHandler(handler types.GomegaFailHandler) { - if handler == nil { - globalFailWrapper = nil - return - } - - globalFailWrapper = &types.GomegaFailWrapper{ - Fail: handler, - TWithHelper: testingtsupport.EmptyTWithHelper{}, - } + RegisterFailHandlerWithT(testingtsupport.EmptyTWithHelper{}, handler) } +// RegisterFailHandlerWithT ensures that the given types.TWithHelper and fail handler +// are used globally. func RegisterFailHandlerWithT(t types.TWithHelper, handler types.GomegaFailHandler) { if handler == nil { globalFailWrapper = nil @@ -65,12 +59,12 @@ func RegisterFailHandlerWithT(t types.TWithHelper, handler types.GomegaFailHandl } } -//RegisterTestingT connects Gomega to Golang's XUnit style -//Testing.T tests. It is now deprecated and you should use NewGomegaWithT() instead. +// RegisterTestingT connects Gomega to Golang's XUnit style +// Testing.T tests. It is now deprecated and you should use NewWithT() instead. // -//Legacy Documentation: +// Legacy Documentation: // -//You'll need to call this at the top of each XUnit style test: +// You'll need to call this at the top of each XUnit style test: // // func TestFarmHasCow(t *testing.T) { // RegisterTestingT(t) @@ -83,7 +77,7 @@ func RegisterFailHandlerWithT(t types.TWithHelper, handler types.GomegaFailHandl // pass `t` down to the matcher itself). This means that you cannot run the XUnit style tests // in parallel as the global fail handler cannot point to more than one testing.T at a time. // -// NewGomegaWithT() does not have this limitation +// NewWithT() does not have this limitation // // (As an aside: Ginkgo gets around this limitation by running parallel tests in different *processes*). func RegisterTestingT(t types.GomegaTestingT) { @@ -95,15 +89,15 @@ func RegisterTestingT(t types.GomegaTestingT) { RegisterFailHandlerWithT(tWithHelper, testingtsupport.BuildTestingTGomegaFailWrapper(t).Fail) } -//InterceptGomegaHandlers runs a given callback and returns an array of -//failure messages generated by any Gomega assertions within the callback. +// InterceptGomegaFailures runs a given callback and returns an array of +// failure messages generated by any Gomega assertions within the callback. // -//This is accomplished by temporarily replacing the *global* fail handler -//with a fail handler that simply annotates failures. The original fail handler -//is reset when InterceptGomegaFailures returns. +// This is accomplished by temporarily replacing the *global* fail handler +// with a fail handler that simply annotates failures. The original fail handler +// is reset when InterceptGomegaFailures returns. // -//This is most useful when testing custom matchers, but can also be used to check -//on a value using a Gomega assertion without causing a test failure. +// This is most useful when testing custom matchers, but can also be used to check +// on a value using a Gomega assertion without causing a test failure. func InterceptGomegaFailures(f func()) []string { originalHandler := globalFailWrapper.Fail failures := []string{} @@ -115,108 +109,108 @@ func InterceptGomegaFailures(f func()) []string { return failures } -//Ω wraps an actual value allowing assertions to be made on it: +// Ω wraps an actual value allowing assertions to be made on it: // Ω("foo").Should(Equal("foo")) // -//If Ω is passed more than one argument it will pass the *first* argument to the matcher. -//All subsequent arguments will be required to be nil/zero. +// If Ω is passed more than one argument it will pass the *first* argument to the matcher. +// All subsequent arguments will be required to be nil/zero. // -//This is convenient if you want to make an assertion on a method/function that returns -//a value and an error - a common patter in Go. +// This is convenient if you want to make an assertion on a method/function that returns +// a value and an error - a common patter in Go. // -//For example, given a function with signature: -// func MyAmazingThing() (int, error) +// For example, given a function with signature: +// func MyAmazingThing() (int, error) // -//Then: +// Then: // Ω(MyAmazingThing()).Should(Equal(3)) -//Will succeed only if `MyAmazingThing()` returns `(3, nil)` +// Will succeed only if `MyAmazingThing()` returns `(3, nil)` // -//Ω and Expect are identical -func Ω(actual interface{}, extra ...interface{}) GomegaAssertion { +// Ω and Expect are identical +func Ω(actual interface{}, extra ...interface{}) Assertion { return ExpectWithOffset(0, actual, extra...) } -//Expect wraps an actual value allowing assertions to be made on it: +// Expect wraps an actual value allowing assertions to be made on it: // Expect("foo").To(Equal("foo")) // -//If Expect is passed more than one argument it will pass the *first* argument to the matcher. -//All subsequent arguments will be required to be nil/zero. +// If Expect is passed more than one argument it will pass the *first* argument to the matcher. +// All subsequent arguments will be required to be nil/zero. // -//This is convenient if you want to make an assertion on a method/function that returns -//a value and an error - a common patter in Go. +// This is convenient if you want to make an assertion on a method/function that returns +// a value and an error - a common patter in Go. // -//For example, given a function with signature: -// func MyAmazingThing() (int, error) +// For example, given a function with signature: +// func MyAmazingThing() (int, error) // -//Then: +// Then: // Expect(MyAmazingThing()).Should(Equal(3)) -//Will succeed only if `MyAmazingThing()` returns `(3, nil)` +// Will succeed only if `MyAmazingThing()` returns `(3, nil)` // -//Expect and Ω are identical -func Expect(actual interface{}, extra ...interface{}) GomegaAssertion { +// Expect and Ω are identical +func Expect(actual interface{}, extra ...interface{}) Assertion { return ExpectWithOffset(0, actual, extra...) } -//ExpectWithOffset wraps an actual value allowing assertions to be made on it: +// ExpectWithOffset wraps an actual value allowing assertions to be made on it: // ExpectWithOffset(1, "foo").To(Equal("foo")) // -//Unlike `Expect` and `Ω`, `ExpectWithOffset` takes an additional integer argument -//this is used to modify the call-stack offset when computing line numbers. +// Unlike `Expect` and `Ω`, `ExpectWithOffset` takes an additional integer argument +// this is used to modify the call-stack offset when computing line numbers. // -//This is most useful in helper functions that make assertions. If you want Gomega's -//error message to refer to the calling line in the test (as opposed to the line in the helper function) -//set the first argument of `ExpectWithOffset` appropriately. -func ExpectWithOffset(offset int, actual interface{}, extra ...interface{}) GomegaAssertion { +// This is most useful in helper functions that make assertions. If you want Gomega's +// error message to refer to the calling line in the test (as opposed to the line in the helper function) +// set the first argument of `ExpectWithOffset` appropriately. +func ExpectWithOffset(offset int, actual interface{}, extra ...interface{}) Assertion { if globalFailWrapper == nil { panic(nilFailHandlerPanic) } return assertion.New(actual, globalFailWrapper, offset, extra...) } -//Eventually wraps an actual value allowing assertions to be made on it. -//The assertion is tried periodically until it passes or a timeout occurs. +// Eventually wraps an actual value allowing assertions to be made on it. +// The assertion is tried periodically until it passes or a timeout occurs. // -//Both the timeout and polling interval are configurable as optional arguments: -//The first optional argument is the timeout -//The second optional argument is the polling interval +// Both the timeout and polling interval are configurable as optional arguments: +// The first optional argument is the timeout +// The second optional argument is the polling interval // -//Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the -//last case they are interpreted as seconds. +// Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the +// last case they are interpreted as seconds. // -//If Eventually is passed an actual that is a function taking no arguments and returning at least one value, -//then Eventually will call the function periodically and try the matcher against the function's first return value. +// If Eventually is passed an actual that is a function taking no arguments and returning at least one value, +// then Eventually will call the function periodically and try the matcher against the function's first return value. // -//Example: +// Example: // // Eventually(func() int { // return thingImPolling.Count() // }).Should(BeNumerically(">=", 17)) // -//Note that this example could be rewritten: +// Note that this example could be rewritten: // // Eventually(thingImPolling.Count).Should(BeNumerically(">=", 17)) // -//If the function returns more than one value, then Eventually will pass the first value to the matcher and -//assert that all other values are nil/zero. -//This allows you to pass Eventually a function that returns a value and an error - a common pattern in Go. +// If the function returns more than one value, then Eventually will pass the first value to the matcher and +// assert that all other values are nil/zero. +// This allows you to pass Eventually a function that returns a value and an error - a common pattern in Go. // -//For example, consider a method that returns a value and an error: +// For example, consider a method that returns a value and an error: // func FetchFromDB() (string, error) // -//Then +// Then // Eventually(FetchFromDB).Should(Equal("hasselhoff")) // -//Will pass only if the the returned error is nil and the returned string passes the matcher. +// Will pass only if the the returned error is nil and the returned string passes the matcher. // -//Eventually's default timeout is 1 second, and its default polling interval is 10ms -func Eventually(actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// Eventually's default timeout is 1 second, and its default polling interval is 10ms +func Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { return EventuallyWithOffset(0, actual, intervals...) } -//EventuallyWithOffset operates like Eventually but takes an additional -//initial argument to indicate an offset in the call stack. This is useful when building helper -//functions that contain matchers. To learn more, read about `ExpectWithOffset`. -func EventuallyWithOffset(offset int, actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// EventuallyWithOffset operates like Eventually but takes an additional +// initial argument to indicate an offset in the call stack. This is useful when building helper +// functions that contain matchers. To learn more, read about `ExpectWithOffset`. +func EventuallyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { if globalFailWrapper == nil { panic(nilFailHandlerPanic) } @@ -231,37 +225,37 @@ func EventuallyWithOffset(offset int, actual interface{}, intervals ...interface return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, globalFailWrapper, timeoutInterval, pollingInterval, offset) } -//Consistently wraps an actual value allowing assertions to be made on it. -//The assertion is tried periodically and is required to pass for a period of time. +// Consistently wraps an actual value allowing assertions to be made on it. +// The assertion is tried periodically and is required to pass for a period of time. // -//Both the total time and polling interval are configurable as optional arguments: -//The first optional argument is the duration that Consistently will run for -//The second optional argument is the polling interval +// Both the total time and polling interval are configurable as optional arguments: +// The first optional argument is the duration that Consistently will run for +// The second optional argument is the polling interval // -//Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the -//last case they are interpreted as seconds. +// Both intervals can either be specified as time.Duration, parsable duration strings or as floats/integers. In the +// last case they are interpreted as seconds. // -//If Consistently is passed an actual that is a function taking no arguments and returning at least one value, -//then Consistently will call the function periodically and try the matcher against the function's first return value. +// If Consistently is passed an actual that is a function taking no arguments and returning at least one value, +// then Consistently will call the function periodically and try the matcher against the function's first return value. // -//If the function returns more than one value, then Consistently will pass the first value to the matcher and -//assert that all other values are nil/zero. -//This allows you to pass Consistently a function that returns a value and an error - a common pattern in Go. +// If the function returns more than one value, then Consistently will pass the first value to the matcher and +// assert that all other values are nil/zero. +// This allows you to pass Consistently a function that returns a value and an error - a common pattern in Go. // -//Consistently is useful in cases where you want to assert that something *does not happen* over a period of tiem. -//For example, you want to assert that a goroutine does *not* send data down a channel. In this case, you could: +// Consistently is useful in cases where you want to assert that something *does not happen* over a period of tiem. +// For example, you want to assert that a goroutine does *not* send data down a channel. In this case, you could: // -// Consistently(channel).ShouldNot(Receive()) +// Consistently(channel).ShouldNot(Receive()) // -//Consistently's default duration is 100ms, and its default polling interval is 10ms -func Consistently(actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// Consistently's default duration is 100ms, and its default polling interval is 10ms +func Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { return ConsistentlyWithOffset(0, actual, intervals...) } -//ConsistentlyWithOffset operates like Consistnetly but takes an additional -//initial argument to indicate an offset in the call stack. This is useful when building helper -//functions that contain matchers. To learn more, read about `ExpectWithOffset`. -func ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// ConsistentlyWithOffset operates like Consistnetly but takes an additional +// initial argument to indicate an offset in the call stack. This is useful when building helper +// functions that contain matchers. To learn more, read about `ExpectWithOffset`. +func ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interface{}) AsyncAssertion { if globalFailWrapper == nil { panic(nilFailHandlerPanic) } @@ -276,59 +270,62 @@ func ConsistentlyWithOffset(offset int, actual interface{}, intervals ...interfa return asyncassertion.New(asyncassertion.AsyncAssertionTypeConsistently, actual, globalFailWrapper, timeoutInterval, pollingInterval, offset) } -//Set the default timeout duration for Eventually. Eventually will repeatedly poll your condition until it succeeds, or until this timeout elapses. +// SetDefaultEventuallyTimeout sets the default timeout duration for Eventually. Eventually will repeatedly poll your condition until it succeeds, or until this timeout elapses. func SetDefaultEventuallyTimeout(t time.Duration) { defaultEventuallyTimeout = t } -//Set the default polling interval for Eventually. +// SetDefaultEventuallyPollingInterval sets the default polling interval for Eventually. func SetDefaultEventuallyPollingInterval(t time.Duration) { defaultEventuallyPollingInterval = t } -//Set the default duration for Consistently. Consistently will verify that your condition is satsified for this long. +// SetDefaultConsistentlyDuration sets the default duration for Consistently. Consistently will verify that your condition is satsified for this long. func SetDefaultConsistentlyDuration(t time.Duration) { defaultConsistentlyDuration = t } -//Set the default polling interval for Consistently. +// SetDefaultConsistentlyPollingInterval sets the default polling interval for Consistently. func SetDefaultConsistentlyPollingInterval(t time.Duration) { defaultConsistentlyPollingInterval = t } -//GomegaAsyncAssertion is returned by Eventually and Consistently and polls the actual value passed into Eventually against -//the matcher passed to the Should and ShouldNot methods. +// AsyncAssertion is returned by Eventually and Consistently and polls the actual value passed into Eventually against +// the matcher passed to the Should and ShouldNot methods. // -//Both Should and ShouldNot take a variadic optionalDescription argument. This is passed on to -//fmt.Sprintf() and is used to annotate failure messages. This allows you to make your failure messages more -//descriptive +// Both Should and ShouldNot take a variadic optionalDescription argument. This is passed on to +// fmt.Sprintf() and is used to annotate failure messages. This allows you to make your failure messages more +// descriptive. // -//Both Should and ShouldNot return a boolean that is true if the assertion passed and false if it failed. +// Both Should and ShouldNot return a boolean that is true if the assertion passed and false if it failed. // -//Example: +// Example: // -// Eventually(myChannel).Should(Receive(), "Something should have come down the pipe.") -// Consistently(myChannel).ShouldNot(Receive(), "Nothing should have come down the pipe.") -type GomegaAsyncAssertion interface { +// Eventually(myChannel).Should(Receive(), "Something should have come down the pipe.") +// Consistently(myChannel).ShouldNot(Receive(), "Nothing should have come down the pipe.") +type AsyncAssertion interface { Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool } -//GomegaAssertion is returned by Ω and Expect and compares the actual value to the matcher -//passed to the Should/ShouldNot and To/ToNot/NotTo methods. +// GomegaAsyncAssertion is deprecated in favor of AsyncAssertion, which does not stutter. +type GomegaAsyncAssertion = AsyncAssertion + +// Assertion is returned by Ω and Expect and compares the actual value to the matcher +// passed to the Should/ShouldNot and To/ToNot/NotTo methods. // -//Typically Should/ShouldNot are used with Ω and To/ToNot/NotTo are used with Expect -//though this is not enforced. +// Typically Should/ShouldNot are used with Ω and To/ToNot/NotTo are used with Expect +// though this is not enforced. // -//All methods take a variadic optionalDescription argument. This is passed on to fmt.Sprintf() -//and is used to annotate failure messages. +// All methods take a variadic optionalDescription argument. This is passed on to fmt.Sprintf() +// and is used to annotate failure messages. // -//All methods return a bool that is true if hte assertion passed and false if it failed. +// All methods return a bool that is true if hte assertion passed and false if it failed. // -//Example: +// Example: // -// Ω(farm.HasCow()).Should(BeTrue(), "Farm %v should have a cow", farm) -type GomegaAssertion interface { +// Ω(farm.HasCow()).Should(BeTrue(), "Farm %v should have a cow", farm) +type Assertion interface { Should(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool ShouldNot(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool @@ -337,39 +334,50 @@ type GomegaAssertion interface { NotTo(matcher types.GomegaMatcher, optionalDescription ...interface{}) bool } -//OmegaMatcher is deprecated in favor of the better-named and better-organized types.GomegaMatcher but sticks around to support existing code that uses it +// GomegaAssertion is deprecated in favor of Assertion, which does not stutter. +type GomegaAssertion = Assertion + +// OmegaMatcher is deprecated in favor of the better-named and better-organized types.GomegaMatcher but sticks around to support existing code that uses it type OmegaMatcher types.GomegaMatcher -//GomegaWithT wraps a *testing.T and provides `Expect`, `Eventually`, and `Consistently` methods. This allows you to leverage -//Gomega's rich ecosystem of matchers in standard `testing` test suites. +// WithT wraps a *testing.T and provides `Expect`, `Eventually`, and `Consistently` methods. This allows you to leverage +// Gomega's rich ecosystem of matchers in standard `testing` test suites. // -//Use `NewGomegaWithT` to instantiate a `GomegaWithT` -type GomegaWithT struct { +// Use `NewWithT` to instantiate a `WithT` +type WithT struct { t types.GomegaTestingT } -//NewGomegaWithT takes a *testing.T and returngs a `GomegaWithT` allowing you to use `Expect`, `Eventually`, and `Consistently` along with -//Gomega's rich ecosystem of matchers in standard `testing` test suits. +// GomegaWithT is deprecated in favor of gomega.WithT, which does not stutter. +type GomegaWithT = WithT + +// NewWithT takes a *testing.T and returngs a `gomega.WithT` allowing you to use `Expect`, `Eventually`, and `Consistently` along with +// Gomega's rich ecosystem of matchers in standard `testing` test suits. // // func TestFarmHasCow(t *testing.T) { -// g := GomegaWithT(t) +// g := gomega.NewWithT(t) // // f := farm.New([]string{"Cow", "Horse"}) // g.Expect(f.HasCow()).To(BeTrue(), "Farm should have cow") // } -func NewGomegaWithT(t types.GomegaTestingT) *GomegaWithT { - return &GomegaWithT{ +func NewWithT(t types.GomegaTestingT) *WithT { + return &WithT{ t: t, } } -//See documentation for Expect -func (g *GomegaWithT) Expect(actual interface{}, extra ...interface{}) GomegaAssertion { +// NewGomegaWithT is deprecated in favor of gomega.NewWithT, which does not stutter. +func NewGomegaWithT(t types.GomegaTestingT) *GomegaWithT { + return NewWithT(t) +} + +// Expect is used to make assertions. See documentation for Expect. +func (g *WithT) Expect(actual interface{}, extra ...interface{}) Assertion { return assertion.New(actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), 0, extra...) } -//See documentation for Eventually -func (g *GomegaWithT) Eventually(actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// Eventually is used to make asynchronous assertions. See documentation for Eventually. +func (g *WithT) Eventually(actual interface{}, intervals ...interface{}) AsyncAssertion { timeoutInterval := defaultEventuallyTimeout pollingInterval := defaultEventuallyPollingInterval if len(intervals) > 0 { @@ -381,8 +389,8 @@ func (g *GomegaWithT) Eventually(actual interface{}, intervals ...interface{}) G return asyncassertion.New(asyncassertion.AsyncAssertionTypeEventually, actual, testingtsupport.BuildTestingTGomegaFailWrapper(g.t), timeoutInterval, pollingInterval, 0) } -//See documentation for Consistently -func (g *GomegaWithT) Consistently(actual interface{}, intervals ...interface{}) GomegaAsyncAssertion { +// Consistently is used to make asynchronous assertions. See documentation for Consistently. +func (g *WithT) Consistently(actual interface{}, intervals ...interface{}) AsyncAssertion { timeoutInterval := defaultConsistentlyDuration pollingInterval := defaultConsistentlyPollingInterval if len(intervals) > 0 { diff --git a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go b/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go index ebdd71786d87..bef00ae21de9 100644 --- a/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go @@ -29,5 +29,5 @@ func (matcher *HaveOccurredMatcher) FailureMessage(actual interface{}) (message } func (matcher *HaveOccurredMatcher) NegatedFailureMessage(actual interface{}) (message string) { - return fmt.Sprintf("Expected error:\n%s\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1), "not to have occurred") + return fmt.Sprintf("Unexpected error:\n%s\n%s\n%s", format.Object(actual, 1), format.IndentString(actual.(error).Error(), 1), "occurred") } diff --git a/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go b/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go index 3b412ce818a7..5c815f5af740 100644 --- a/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go +++ b/vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go @@ -70,7 +70,7 @@ func parseXmlContent(content string) (*xmlNode, error) { if err == io.EOF { break } - return nil, fmt.Errorf("failed to decode next token: %v", err) + return nil, fmt.Errorf("failed to decode next token: %v", err) // untested section } lastNodeIndex := len(allNodes) - 1 @@ -94,7 +94,7 @@ func parseXmlContent(content string) (*xmlNode, error) { case xml.CharData: lastNode.Content = append(lastNode.Content, tok.Copy()...) case xml.Comment: - lastNode.Comments = append(lastNode.Comments, tok.Copy()) + lastNode.Comments = append(lastNode.Comments, tok.Copy()) // untested section case xml.ProcInst: lastNode.ProcInsts = append(lastNode.ProcInsts, tok.Copy()) } diff --git a/vendor/k8s.io/klog/klog.go b/vendor/k8s.io/klog/klog.go index 887ea62dff75..b033996c0529 100644 --- a/vendor/k8s.io/klog/klog.go +++ b/vendor/k8s.io/klog/klog.go @@ -35,11 +35,11 @@ // Log output is buffered and written periodically using Flush. Programs // should call Flush before exiting to guarantee all log output is written. // -// By default, all log statements write to files in a temporary directory. +// By default, all log statements write to standard error. // This package provides several flags that modify this behavior. // As a result, flag.Parse must be called before any logging is done. // -// -logtostderr=false +// -logtostderr=true // Logs are written to standard error instead of to files. // -alsologtostderr=false // Logs are written to standard error as well as to files. @@ -404,21 +404,46 @@ func init() { go logging.flushDaemon() } -// InitFlags is for explicitly initializing the flags +var initDefaultsOnce sync.Once + +// InitFlags is for explicitly initializing the flags. func InitFlags(flagset *flag.FlagSet) { + + // Initialize defaults. + initDefaultsOnce.Do(func() { + logging.logDir = "" + logging.logFile = "" + logging.logFileMaxSizeMB = 1800 + // TODO: The default value of toStderr should be false. + // Ideally, toStderr can be deprecated. + // If --log-file is set, only log to the dedicated log-file. + // If --alsoToStderr is true, whether or not --log-file is set, we will + // log to stderr. + // Since kubernetes/kubernetes are currently using klog with + // default --toStderr to be true, we can't change this default value + // directly. + // As a compromise, when --log-file is set, the toStdErr is reset to + // be false. e.g. See function `IsSingleMode`. + logging.toStderr = true + logging.alsoToStderr = false + logging.skipHeaders = false + logging.skipLogHeaders = false + }) + if flagset == nil { flagset = flag.CommandLine } - flagset.StringVar(&logging.logDir, "log_dir", "", "If non-empty, write log files in this directory") - flagset.StringVar(&logging.logFile, "log_file", "", "If non-empty, use this log file") - flagset.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", 1800, + + flagset.StringVar(&logging.logDir, "log_dir", logging.logDir, "If non-empty, write log files in this directory") + flagset.StringVar(&logging.logFile, "log_file", logging.logFile, "If non-empty, use this log file") + flagset.Uint64Var(&logging.logFileMaxSizeMB, "log_file_max_size", logging.logFileMaxSizeMB, "Defines the maximum size a log file can grow to. Unit is megabytes. "+ "If the value is 0, the maximum file size is unlimited.") - flagset.BoolVar(&logging.toStderr, "logtostderr", true, "log to standard error instead of files") - flagset.BoolVar(&logging.alsoToStderr, "alsologtostderr", false, "log to standard error as well as files") + flagset.BoolVar(&logging.toStderr, "logtostderr", logging.toStderr, "log to standard error instead of files") + flagset.BoolVar(&logging.alsoToStderr, "alsologtostderr", logging.alsoToStderr, "log to standard error as well as files") flagset.Var(&logging.verbosity, "v", "number for the log level verbosity") - flagset.BoolVar(&logging.skipHeaders, "skip_headers", false, "If true, avoid header prefixes in the log messages") - flagset.BoolVar(&logging.skipLogHeaders, "skip_log_headers", false, "If true, avoid headers when openning log files") + flagset.BoolVar(&logging.skipHeaders, "skip_headers", logging.skipHeaders, "If true, avoid header prefixes in the log messages") + flagset.BoolVar(&logging.skipLogHeaders, "skip_log_headers", logging.skipLogHeaders, "If true, avoid headers when opening log files") flagset.Var(&logging.stderrThreshold, "stderrthreshold", "logs at or above this threshold go to stderr") flagset.Var(&logging.vmodule, "vmodule", "comma-separated list of pattern=N settings for file-filtered logging") flagset.Var(&logging.traceLocation, "log_backtrace_at", "when logging hits line file:N, emit a stack trace") @@ -452,6 +477,8 @@ type loggingT struct { mu sync.Mutex // file holds writer for each of the log types. file [numSeverity]flushSyncWriter + // file holds writer for the dedicated file when --log-file is set. + singleModeFile flushSyncWriter // pcs is used in V to avoid an allocation when computing the caller's PC. pcs [1]uintptr // vmap is a cache of the V Level for each V() call site, identified by PC. @@ -496,6 +523,16 @@ type buffer struct { var logging loggingT +func (l *loggingT) IsSingleMode() bool { + if l.logFile != "" { + // TODO: Remove the toStdErr reset when switching the logging.toStderr + // default value to be false. + l.toStderr = false + return true + } + return false +} + // setVState sets a consistent state for V logging. // l.mu is held. func (l *loggingT) setVState(verbosity Level, filter []modulePat, setFilter bool) { @@ -721,24 +758,40 @@ func (rb *redirectBuffer) Write(bytes []byte) (n int, err error) { // SetOutput sets the output destination for all severities func SetOutput(w io.Writer) { - for s := fatalLog; s >= infoLog; s-- { + // In single-mode, all severity logs are tracked in a single dedicated file. + if logging.IsSingleMode() { rb := &redirectBuffer{ w: w, } - logging.file[s] = rb + logging.singleModeFile = rb + } else { + for s := fatalLog; s >= infoLog; s-- { + rb := &redirectBuffer{ + w: w, + } + logging.file[s] = rb + } } } // SetOutputBySeverity sets the output destination for specific severity func SetOutputBySeverity(name string, w io.Writer) { - sev, ok := severityByName(name) - if !ok { - panic(fmt.Sprintf("SetOutputBySeverity(%q): unrecognized severity name", name)) - } - rb := &redirectBuffer{ - w: w, + // In single-mode, all severity logs are tracked in a single dedicated file. + // Guarantee this buffer exists whatever severity output is trying to be set. + if logging.IsSingleMode() { + if logging.singleModeFile == nil { + logging.singleModeFile = &redirectBuffer{w: w} + } + } else { + sev, ok := severityByName(name) + if !ok { + panic(fmt.Sprintf("SetOutputBySeverity(%q): unrecognized severity name", name)) + } + rb := &redirectBuffer{ + w: w, + } + logging.file[sev] = rb } - logging.file[sev] = rb } // output writes the data to the log files and releases the buffer. @@ -750,32 +803,7 @@ func (l *loggingT) output(s severity, buf *buffer, file string, line int, alsoTo } } data := buf.Bytes() - if l.toStderr { - os.Stderr.Write(data) - } else { - if alsoToStderr || l.alsoToStderr || s >= l.stderrThreshold.get() { - os.Stderr.Write(data) - } - if l.file[s] == nil { - if err := l.createFiles(s); err != nil { - os.Stderr.Write(data) // Make sure the message appears somewhere. - l.exit(err) - } - } - switch s { - case fatalLog: - l.file[fatalLog].Write(data) - fallthrough - case errorLog: - l.file[errorLog].Write(data) - fallthrough - case warningLog: - l.file[warningLog].Write(data) - fallthrough - case infoLog: - l.file[infoLog].Write(data) - } - } + l.writeLogData(s, data) if s == fatalLog { // If we got here via Exit rather than Fatal, print no stacks. if atomic.LoadUint32(&fatalNoStacks) > 0 { @@ -783,33 +811,65 @@ func (l *loggingT) output(s severity, buf *buffer, file string, line int, alsoTo timeoutFlush(10 * time.Second) os.Exit(1) } - // Dump all goroutine stacks before exiting. - // First, make sure we see the trace for the current goroutine on standard error. - // If -logtostderr has been specified, the loop below will do that anyway - // as the first stack in the full dump. - if !l.toStderr { - os.Stderr.Write(stacks(false)) - } - // Write the stack trace for all goroutines to the files. - trace := stacks(true) logExitFunc = func(error) {} // If we get a write error, we'll still exit below. - for log := fatalLog; log >= infoLog; log-- { - if f := l.file[log]; f != nil { // Can be nil if -logtostderr is set. - f.Write(trace) - } - } + l.writeLogData(fatalLog, stacks(true)) l.mu.Unlock() timeoutFlush(10 * time.Second) os.Exit(255) // C++ uses -1, which is silly because it's anded with 255 anyway. } l.putBuffer(buf) l.mu.Unlock() + // Note: The stats estimate logs for each severity level individually, + // even in the situation that log-file is specified and + // all severity-level logs are tracked only in the infoLog file. if stats := severityStats[s]; stats != nil { atomic.AddInt64(&stats.lines, 1) atomic.AddInt64(&stats.bytes, int64(len(data))) } } +// writeLogData writes |data| to the `s` and lower severity files. +// e.g. If Severity level is Error, the data will be written to all the Error, +// Warning, and Info log file. However, if --log_file flag is provided, klog +// no longer tracks logs separately due to their severity level, but rather +// only write to the singleModeFile which later on will be flushed to the +// dedicated log_file. +func (l *loggingT) writeLogData(s severity, data []byte) { + shouldAlsoToStderr := l.alsoToStderr && s >= l.stderrThreshold.get() + if l.IsSingleMode() { + if shouldAlsoToStderr { + os.Stderr.Write(data) + } + if l.singleModeFile == nil { + now := time.Now() + sb := &syncBuffer{ + logger: l, + maxbytes: CalculateMaxSize(), + } + if err := sb.rotateFile(now, true); err != nil { + l.exit(err) + } + l.singleModeFile = sb + } + l.singleModeFile.Write(data) + } else { + if l.toStderr || shouldAlsoToStderr { + os.Stderr.Write(data) + } + for currSeverity := s; currSeverity >= infoLog; currSeverity-- { + if l.file[currSeverity] == nil { + if err := l.createFiles(currSeverity); err != nil { + os.Stderr.Write(data) // Make sure the message appears somewhere. + l.exit(err) + } + } + if f := l.file[currSeverity]; f != nil { // Can be nil if -logtostderr is set. + f.Write(data) + } + } + } +} + // timeoutFlush calls Flush and returns when it completes or after timeout // elapses, whichever happens first. This is needed because the hooks invoked // by Flush may deadlock when glog.Fatal is called from a hook that holds @@ -987,13 +1047,21 @@ func (l *loggingT) lockAndFlushAll() { // flushAll flushes all the logs and attempts to "sync" their data to disk. // l.mu is held. func (l *loggingT) flushAll() { - // Flush from fatal down, in case there's trouble flushing. - for s := fatalLog; s >= infoLog; s-- { - file := l.file[s] + if l.IsSingleMode() { + file := l.singleModeFile if file != nil { file.Flush() // ignore error file.Sync() // ignore error } + } else { + // Flush from fatal down, in case there's trouble flushing. + for s := fatalLog; s >= infoLog; s-- { + file := l.file[s] + if file != nil { + file.Flush() // ignore error + file.Sync() // ignore error + } + } } } @@ -1079,9 +1147,9 @@ type Verbose bool // The returned value is a boolean of type Verbose, which implements Info, Infoln // and Infof. These methods will write to the Info log if called. // Thus, one may write either -// if glog.V(2) { glog.Info("log this") } +// if glog.V(2) { glog.Info("log this") } // or -// glog.V(2).Info("log this") +// glog.V(2).Info("log this") // The second form is shorter but the first is cheaper if logging is off because it does // not evaluate its arguments. // diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/BUILD.bazel b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/BUILD.bazel index 8f48cde740ad..4d055541137e 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/BUILD.bazel +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/BUILD.bazel @@ -27,5 +27,6 @@ go_library( "//vendor/k8s.io/client-go/tools/cache:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil:go_default_library", + "//vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil:go_default_library", ], ) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go index 62a16eb1ae08..a5bac803851a 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/cache/internal/cache_reader.go @@ -30,6 +30,7 @@ import ( "k8s.io/apimachinery/pkg/selection" "k8s.io/client-go/tools/cache" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" ) // CacheReader is a CacheReader @@ -115,33 +116,30 @@ func (c *CacheReader) List(_ context.Context, opts *client.ListOptions, out runt labelSel = opts.LabelSelector } - outItems, err := c.getListItems(objs, labelSel) + filteredItems, err := c.filterListItems(objs, labelSel) if err != nil { return err } - return apimeta.SetList(out, outItems) + + return apimeta.SetList(out, filteredItems) } -func (c *CacheReader) getListItems(objs []interface{}, labelSel labels.Selector) ([]runtime.Object, error) { - outItems := make([]runtime.Object, 0, len(objs)) +func (c *CacheReader) filterListItems(objs []interface{}, labelSel labels.Selector) ([]runtime.Object, error) { + runtimeObjs := make([]runtime.Object, 0, len(objs)) for _, item := range objs { obj, isObj := item.(runtime.Object) if !isObj { return nil, fmt.Errorf("cache contained %T, which is not an Object", obj) } - meta, err := apimeta.Accessor(obj) - if err != nil { - return nil, err - } - if labelSel != nil { - lbls := labels.Set(meta.GetLabels()) - if !labelSel.Matches(lbls) { - continue - } - } - outItems = append(outItems, obj.DeepCopyObject()) + runtimeObjs = append(runtimeObjs, obj) } - return outItems, nil + + filteredItems, err := objectutil.FilterWithLabels(runtimeObjs, labelSel) + if err != nil { + return nil, err + } + + return filteredItems, nil } // objectKeyToStorageKey converts an object key to store key. diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/BUILD.bazel b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/BUILD.bazel index e4b306350948..120265abbf21 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/BUILD.bazel +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/BUILD.bazel @@ -11,12 +11,14 @@ go_library( visibility = ["//visibility:public"], deps = [ "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime/schema:go_default_library", "//vendor/k8s.io/client-go/kubernetes/scheme:go_default_library", "//vendor/k8s.io/client-go/testing:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/client/apiutil:go_default_library", + "//vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil:go_default_library", "//vendor/sigs.k8s.io/controller-runtime/pkg/runtime/log:go_default_library", ], ) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go index 09055a5bac8a..1d730940ca3d 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/fake/client.go @@ -24,6 +24,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/client-go/kubernetes/scheme" @@ -31,6 +32,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/apiutil" + "sigs.k8s.io/controller-runtime/pkg/internal/objectutil" logf "sigs.k8s.io/controller-runtime/pkg/runtime/log" ) @@ -110,7 +112,30 @@ func (c *fakeClient) List(ctx context.Context, opts *client.ListOptions, list ru } decoder := scheme.Codecs.UniversalDecoder() _, _, err = decoder.Decode(j, nil, list) - return err + if err != nil { + return err + } + + if opts.LabelSelector != nil { + return filterListItems(list, opts.LabelSelector) + } + return nil +} + +func filterListItems(list runtime.Object, labSel labels.Selector) error { + objs, err := meta.ExtractList(list) + if err != nil { + return err + } + filteredObjs, err := objectutil.FilterWithLabels(objs, labSel) + if err != nil { + return err + } + err = meta.SetList(list, filteredObjs) + if err != nil { + return err + } + return nil } func (c *fakeClient) Create(ctx context.Context, obj runtime.Object) error { diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go b/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go index 26cb81d8ba35..51cef3006fa6 100644 --- a/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/client/typed_client.go @@ -104,7 +104,6 @@ func (c *typedClient) List(ctx context.Context, opts *ListOptions, obj runtime.O return r.Get(). NamespaceIfScoped(namespace, r.isNamespaced()). Resource(r.resource()). - Body(obj). VersionedParams(opts.AsListOptions(), c.paramCodec). Context(ctx). Do(). diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/BUILD.bazel b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/BUILD.bazel new file mode 100644 index 000000000000..81401fb7bec7 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/BUILD.bazel @@ -0,0 +1,14 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library") + +go_library( + name = "go_default_library", + srcs = ["filter.go"], + importmap = "sigs.k8s.io/cluster-api/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil", + importpath = "sigs.k8s.io/controller-runtime/pkg/internal/objectutil", + visibility = ["//vendor/sigs.k8s.io/controller-runtime/pkg:__subpackages__"], + deps = [ + "//vendor/k8s.io/apimachinery/pkg/api/meta:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/labels:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + ], +) diff --git a/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go new file mode 100644 index 000000000000..8513846e2c17 --- /dev/null +++ b/vendor/sigs.k8s.io/controller-runtime/pkg/internal/objectutil/filter.go @@ -0,0 +1,42 @@ +/* +Copyright 2018 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package objectutil + +import ( + apimeta "k8s.io/apimachinery/pkg/api/meta" + "k8s.io/apimachinery/pkg/labels" + "k8s.io/apimachinery/pkg/runtime" +) + +// FilterWithLabels returns a copy of the items in objs matching labelSel +func FilterWithLabels(objs []runtime.Object, labelSel labels.Selector) ([]runtime.Object, error) { + outItems := make([]runtime.Object, 0, len(objs)) + for _, obj := range objs { + meta, err := apimeta.Accessor(obj) + if err != nil { + return nil, err + } + if labelSel != nil { + lbls := labels.Set(meta.GetLabels()) + if !labelSel.Matches(lbls) { + continue + } + } + outItems = append(outItems, obj.DeepCopyObject()) + } + return outItems, nil +}